中文
4. 函数参考
4.1 回调函数
.._main_trailmove_tick

启动时机取决于K线分时周期信息的设置。参数是要处理的商品代码。

需要设置以下的conf文件。
mst_symbol.xml (货币代码信息):target="1"
mst_rate.xml (K线分时周期信息):target="1" 并且 isimpl="1"
tst_implparam.xml (执行计划):isimpl="1"

开仓部位的浮动盈亏发生变动时被调用。

tradeid:仓位ID
trailmove:调整移动止损/限价的方法名

市场数据发生变动时被调用。参数是要处理的商品代码。

需要设置以下的conf文件。
货币代码信息(mst_symbol.xml):target="1"
4.2 内置对象
.._CDate_CFile_Log_ParamsPriceBarTagTrade

生成处理日期和时间的_CDate实例。

[语法]

  • _CDate()
  • _CDate(time)
  • _CDate(dateString)
// 如果省略参数将设置现在的日期和时间。
var date = new _CDate();

// 参数time指定从1970-01-01 00:00(UTC)开始的秒数。
var date = new _CDate(946652399);

// 参数dateString指定表示日期的字符串。
var date = new _CDate("2019");
var date = new _CDate("2019/5/31");
var date = new _CDate("2019-5-31 17:50:10");

[属性]

  • time
  • year
  • month
  • day
  • hour
  • min
  • sec
  • week
// 设置或获取从1970-01-01 00:00(UTC)开始的秒数。
date.time = 946652399;
_Print(date.time);

// 得到本地时间的年、月、日、时、分、秒、周。全部是只读属性。
// 星期是从0(星期日)到6(星期六)的值,月是从1(1月)~12(12月)的值。
_Print("%d-%d-%d %d:%d:%d [%d]", date.year, date.month, date.day, date.hour, date.min, date.sec, date.week);

[方法]

  • addTime(time)
  • addinTime(time)
  • getTime(timeKind)
  • setTime(time, timeKind)
  • toString()
  • toString(calKind)
  • toString(calKind, format)
// 返回"100"和date对象的秒数的和。
_Print(date.addTime(100));

// 将"100"加到date对象的秒数上。
date.addinTime(100);

// 在timeKind中指定'UTC'(世界标准时间)或'LOCAL'(本地时间),设置或获取从1970-01-01 00:00开始的秒数 
_Print(date.getTime('UTC'));
_Print(date.getTime('LOCAL'));
date.setTime(946652399, 'UTC');
date.setTime(946652399, 'LOCAL');

// 在calKind中指定'UTC'(世界标准时间)或'LOCAL'(当地时间),在format中指定格式字符串,返回表示日期和时间的字符串。关于format的详细请参考C语言函数strftime的格式说明。
_Print(date.toString());
_Print(date.toString('UTC'));
_Print(date.toString('LOCAL'));
_Print(date.toString('UTC', '%Y-%m-%d %H:%I:%S'));
_Print(date.toString('LOCAL', '%Y-%m-%d %H:%I:%S'));

生成处理文件输入输出的_CFile实例

[语法]

  • _CFile(filename)
// 指定文件名或路径。
var file = new _CFile("m5.csv");

[方法]

  • open()
  • open(mode)
  • close()
  • read()
  • readline()
  • write(string)
// 读入文件内容
file.open();
var content = file.read();
file.close();

// 依次读入文件每行内容
file.open();
while (line = file.readline()) {
  _Print(line);
}
file.close();

// 写入文件
file.open('w');
file.write('Hello!');
file.close();

// 以追加方式写入文件
file.open('a');
file.write('Hello!');
file.close();

日志输出的静态类

[属性]

  • level
// 设置或得到4种输出级别("error", "warn", "info", "debug")。
_Log.level = "error";
_Print(_Log.level);

[方法]

  • error(message)
  • warn(message)
  • info(message)
  • debug(message)
// 以"info"级别输出日志。
_Log.info("open position.");

[键,值]作为字符串处理的Map对象。

"curPath"和"iniFile"作为系统保留键分别被设置当前路径和ini文件名。
// 以'a'和'b'为键设置值。除非更新,否则一直保持。
_Params['a'] = 123.01;
_Params.b = '456';
_Print("%s %d %f %s %s\n", _Params.a, _Params.a, _Params.a, _Params['b']);

↓↓↓ 输出以下结果。 ↓↓↓
123.01 123 123.010000 456

历史数据对象 (只读)

[属性]

  • symbol
  • startdate
  • period
  • askClose
  • askHigh
  • askLow
  • askOpen
  • bidClose
  • bidHigh
  • bidLow
  • bidOpen
// 获取历史数据对象以引用属性。
var pb = _GetPriceBarByPos("EUR/USD", "m5", 0);
_Print("%s %d %s %f", pb.symbol, pb.startdate, pb.period, pb.askClose);

标签对象

[属性]

  • name
  • value
// 引用标签名称和标签值。
var implparam = _GetImplParam("EUR/USD");
_Print("Tag Name:%s, Tag Value:%s", implparam.name, implparam.value);

[方法]

  • hasAttr(key)
  • getAttr(key)
  • setAttr(key, value)
  • getTag(name, value)
  • getTagByNames(name1, ...)
  • getTagByAttr(name, key, value)
// 确认标签是否具有相应属性。
Print(implparam.hasAttr("name") ? "OK" : "NG");

// 从标签中获取相应属性的值。
Print(implparam.getAttr("name"));

// 设置标签属性。
implparam.setAttr("name", "order_open");

// 从当前标签的标签树中查找与指定名称和值一致的子标签。
var tag = implparam.getTag("method", "");

// 从当前标签的标签树中查找与指定名称序列匹配的子标签。
var tag = implparam.getTagByNames("method", "property");

// 从当前标签的标签树中查找与指定名称、属性(键、值)匹配的子标签。
var tag = implparam.getTagByAttr("property", "periods", "m5");

仓位对象 (只读)

[属性]

  • id
  • symbol
  • isbuy
  • amount
  • open
  • close
  • opentime
  • closetime
  • stop
  • limit
  • pl
  • openOrderID
  • closeOrderID
  • stopOrderID
  • limitOrderID
  • reserve
// 获取开仓单对象以引用属性。
var trade = _GetTrade("70043871");
_Print("%s %s %f %f", trade.symbol, trade.isbuy ? "buy" : "sell", trade.amount, trade.open);
4.3 内置函数
.._ChangeStopLoss_ChangeTakeProfit_CloseAllTrade
_CloseTradeById_CloseTradesBySymbol_GetBarCount_GetClosedTradeListBySymbol
_GetImplParam_GetLaterPriceBarFromLocal_GetMarketCloseTime_GetMethod
_GetMethods_GetOffer_GetPointSize_GetPriceArray
_GetPriceBarFromLocal_GetSpread_GetStdTime_GetTimeByPeriod
_GetTrade_GetTradeListBySymbol_GetTradeMethodName_GetTradeMethodPeriod
_GetTrailMoveTsName_LoadImplPlan_Mkdir_Num2Str
_OpenMarketOrder_OutPriceBar_Print_SetTradeMethodName
_SetTradeMethodPeriod_SetTrailMoveTsName_SetTsContext_SetTsContextTrail
_TA_TfClassify_WriteFile_WritePng

设置开仓单的止损。

// 指定仓位ID设置止损。
var ret = _ChangeStopLoss("70043871", 118.9);
_Print(ret == 0 ? "succeeded" : "failed");

设置开仓单的限价。

// 指定仓位ID设置限价。
var ret = _ChangeTakeProfit("70043871", 120.5);
_Print(ret == 0 ? "succeeded" : "failed");

平仓所有的仓位。

var count = _CloseAllTrade();
_Print("%d positions were closed.", count);

平仓指定的仓位。

不支持部分平仓,请指定该仓位所有的交易数量。
// 指定仓位IDと交易数量,平掉此仓位。
var ret = _CloseTradeById("70043871", 1000);
_Print(ret == 0 ? "succeeded" : "failed");

平仓指定的仓位。

// 指定商品和订单类型('B':买, 'S':卖),平掉此仓位。
var ret = _CloseTradesBySymbol("EUR/USD", 'S');
_Print(ret == 0 ? "succeeded" : "failed");

得到历史数据的数量。

// 指定商品和周期(m5, m15, m30, H1, H4, D1)得到历史数据的数量。
var count = _GetBarCount("EUR/USD", "m5");
_Print("The number of historical data [%s %s] is %d.", "EUR/USD", "m5", count);

得到已平仓位的列表。

// 指定商品得到已平仓位的列表。
var lst = _GetClosedTradeListBySymbol("EUR/USD");
for (var i = 0; i < lst.length; i++) {
  _Print("%s: %f", lst[i].id, lst[i].amount);
}

得到执行计划对象。

// 指定商品得到执行计划对象。
var implparam = _GetImplParam("EUR/USD");
if (implparam !== undefined) {
  _Print("Name of implparam is %s.", implparam.getAttr("name"));
}

从本地取得历史数据。

// 指定商品和周期,从本地获取100个2018/5/1 8:00以后的历史数据。
var pbList = _GetLaterPriceBarFromLocal("EUR/USD", "m5", "2018/5/1 8:00:00", 100);
_Print("%d historical data were returned.", plList.length);

得到市场关闭时间(从1970-01-01 00:00:00(UTC)开始的秒数)。

// 市场关闭前1小时平掉所有仓位。
var dtNow = _CDate();
if (dtNow.time >= _GetMarketCloseTime(dtNow.time) - 3600) {
  _CloseAllTrade();
}

得到方法对象。

// 指定商品和方法名,得到方法属性。
var loadMethod = _GetMethod("EUR/USD", "LoadContext");
if (loadMethod !== undefined) {
  _Print("Vaule of property[orderstop_from_wday] is %s.",
        loadMethod.getAttr("orderstop_from_wday"));
}

得到方法对象列表。

// 指定商品取得所有定义的方法对象。
var orderMethodList = _GetMethods("EUR/USD");
if (orderMethodList !== undefined) {
  _Print("%d methods were defined.", orderMethodList.length);
}

得到汇率信息。

// 得到买入价。
var ask = _GetOffer("EUR/USD", "Ask");

// 得到卖出价。
var bid = _GetOffer("EUR/USD", "Bid");

// 得到最高买入价。
var high = _GetOffer("EUR/USD", "High");

// 得到最低卖出价。
var low = _GetOffer("EUR/USD", "Low");

得到点大小。

// 得到EUR/USD的点大小(0.0001)。
var pointsize = _GetPointSize("EUR/USD");
_Print("PointSize of %s is %f.", "EUR/USD", pointsize);

得到价格列表。

// 指定商品和周期,得到买开盘价的列表。
var askopen = _GetPriceArray("EUR/USD", "m5", "AskOpen");

// 也可以指定商品和周期,先从本地获取历史数据,再从得到的历史数据列表中取得买开盘价的列表。
var pbList = _GetLaterPriceBarFromLocal("EUR/USD", "m5", "2018/5/1 8:00:00", 100);
var askopen = _GetPriceArray(pbList, "AskOpen");

// 指定商品和周期,得到买收购价的列表。
var askclose = _GetPriceArray("EUR/USD", "m5", "AskClose");

// 指定商品和周期,得到买最高价的列表。
var askhigh = _GetPriceArray("EUR/USD", "m5", "AskHigh");

// 指定商品和周期,得到买最低价的列表。
var asklow = _GetPriceArray("EUR/USD", "m5", "AskLow");

// 指定商品和周期,得到卖开盘价的列表。
var bidopen = _GetPriceArray("EUR/USD", "m5", "BidOpen");

// 指定商品和周期,得到卖收购价的列表。
var bidclose = _GetPriceArray("EUR/USD", "m5", "BidClose");

// 指定商品和周期,得到卖最高价的列表。
var bidhigh = _GetPriceArray("EUR/USD", "m5", "BidHigh");

// 指定商品和周期,得到卖最低价的列表。
var bidlow = _GetPriceArray("EUR/USD", "m5", "BidLow");

从本地获取历史数据。

// 指定商品和周期,从本地获取100个2018/5/1 8:00以前的历史数据。
var pbList = _GetPriceBarFromLocal("EUR/USD", "m5", "2018/5/1 8:00:00", 100);
_Print("%d historical data were returned.", plList.length);

得到点差。

// 得到EUR/USD的点差。
var spread = _GetSpread("EUR/USD");
_Print("Spread of %s is %f.", "EUR/USD", spread);

得到标准时间(从1970-01-01 00:00:00(UTC)开始的秒数)。

得到周期的秒数。

// 得到m5的秒数。
var seconds = _GetTimeByPeriod("m5");
_Print("Seconds of %s is %d.", "m5", seconds);

得到已开仓位对象。

// 指定仓位ID得到已开仓位对象。
var trade = _GetTrade("70043871");
_Print("%s %s %f %f", trade.symbol, trade.isbuy ? "buy" : "sell", trade.amount, trade.open);

得到已开仓位列表。

// 指定商品得到已开仓位列表。
var lst = _GetTradeListBySymbol("EUR/USD");
for (var i = 0; i < lst.length; i++) {
  _Print("%s: %f", lst[i].id, lst[i].amount);
}

得到开仓方法名。

// 指定订单ID得到开仓方法名。
var name = _GetTradeMethodName("50043871");
_Print("Name of TradeMethod is %s.", name);

得到开仓方法周期。

// 指定订单ID得到开仓方法周期。
var period = _GetTradeMethodPeriod("50043871");
_Print("Period of TradeMethod is %s.", period);

得到移动止损方法名。

// 指定订单ID得到移动止损方法名。
var name = _GetTrailMoveTsName("50043871");
_Print("Name of TrailMove is %s.", name);

从数据库加载执行计划。

[ImplPlan1, ..., ImplPlanN]最多可以指定20个。
// 根据指定的参数名加载执行计划,然后联结商品代码来获取参数值。
_LoadImplPlan("ImplKbn", "Amount", "OpenMethod1", "OpenMethod2", "OpenMethod3");
_Print("ImplKbn:%s, Amount:%s, OpenMethod1:%s, OpenMethod2:%s, OpenMethod3:%s", 
  _Params["EUR/USD" + "ImplKbn"], _Params["EUR/USD" + "Amount"],
  _Params["EUR/USD" + "OpenMethod1"], _Params["EUR/USD" + "OpenMethod2"],
  _Params["EUR/USD" + "OpenMethod3"]);

创建一个目录。

// 用相对路径创建目录。
var out_dir = "dat/USD-JPY";
var ret = _Mkdir(out_dir);
if (ret == -1) {
  _Print("Directory [%s] creation failed.\n", out_dir);
}
else if (ret == 0) {
  _Print("Directory [%s] creation succeeded.\n", out_dir);
}
else if (ret == 1) {
  _Print("Directory [%s] already exists.\n", out_dir);
}

将数字转换为字符串。

// 将数字转换为字符串。
var num = 12.54
_Print("%f => %s\n", num, _Num2Str(num));

// 将数字数组转换为字符串数组。
var num_ary = [12.54, 78.66, 43];
var str_ary = _Num2Str(num_ary);
for (var i = 0; i < num_ary.length; i++) {
  _Print("%f => %s\n", num_ary[i], str_ary(i));
}

以市价建立仓位。

// 指定买进,交易数量,止损和限价,以市价建立仓位。
var orderId = _OpenMarketOrder("EUR/USD", "B", 1000, 1.1168, 1.1390);
_Print("Market order [%s] is opened.", orderId);

将历史数据输出到标准输出。

// 指定商品和周期,将历史数据输出到标准输出。
_OutPriceBar("EUR/USD", "m5");

根据格式字符串输出到标准输出。

// 分别输出十进制数值、十六进制数和八进制数值。
_Print("%d %x %o", 123, 123, 123);
// 分别以浮点、指数的形式输出。
_Print("%f %e", 0.0123, 0.0123);
// 以字符串形式输出。
_Print("%s\n", "Close a position.");

设置开仓方法名。

// 指定订单ID设置开仓方法名。
_SetTradeMethodName("50043871", "MacdCross");

设置开仓方法周期。

// 指定订单ID设置开仓方法周期。
_SetTradeMethodPeriod("50043871", "m5");

设置移动止损方法名。

// 指定订单ID设置移动止损方法名。
_SetTrailMoveTsName("50043871", "trailmove_eqdiff?40:1:20:10");

设置开仓上下文信息。[C1-CN]最多可以指定40个。

// 指定订单ID设置开仓上下文信息。
var title = "INDEX_1,SCORE_1,INDEX_2,SCORE_2,INDEX_3,SCORE_3";
var pred = [2, 0.992, 0, 0.005, 1, 0.003];
_SetTsContext("50043871", 'S', "", title, pred);

设置开仓上下文移动止损信息。

// 指定订单ID设置开仓上下文移动止损信息。
_SetTsContextTrail("50043871", 'S', "m5", "MacdCross", "", "", "trailmove_eqdiff?40:1:20:10");

生成技术指标。

// 指定商品和周期生成SMA技术指标。
var sma = _TA("SMA", "EUR/USD", "m5", "AskClose", 200);
_Print("The number of SMA is %d.", sma.real.length);

// 也可以指定商品和周期,先从本地获取历史数据,然后再从得到的历史数据列表中生成技术指标。
var pbList = _GetLaterPriceBarFromLocal("EUR/USD", "m5", "2018/5/1 8:00:00", 360);
var sma = _TA("SMA", pbList, "AskClose", 200);

// 指定商品和周期生成MINUS_DM技术指标。
var minus_dm = _TA("MINUS_DM", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of MINUS_DM is %d.", minus_dm.real.length);

// 指定商品和周期生成MINUS_DI技术指标。
var minus_di = _TA("MINUS_DI", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of MINUS_DI is %d.", minus_di.real.length);

// 指定商品和周期生成PLUS_DM技术指标。
var plus_dm = _TA("PLUS_DM", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of PLUS_DM is %d.", plus_dm.real.length);

// 指定商品和周期生成PLUS_DI技术指标。
var plus_di = _TA("PLUS_DI", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of PLUS_DI is %d.", plus_di.real.length);

// 指定商品和周期生成DX技术指标。
var dx = _TA("DX", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of DX is %d.", dx.real.length);

// 指定商品和周期生成ADX技术指标。
var adx = _TA("ADX", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of ADX is %d.", adx.real.length);

// 指定商品和周期生成ADXR技术指标。
var adxr = _TA("ADXR", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of ADXR is %d.", adxr.real.length);

// 指定商品和周期生成EMA技术指标。
var ema = _TA("EMA", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of EMA is %d.", ema.real.length);

// 指定商品和周期生成WMA技术指标。
var wma = _TA("WMA", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of WMA is %d.", wma.real.length);

// 指定商品和周期生成MACD技术指标。
var macd = _TA("MACD", "EUR/USD", "m5", "AskClose", 12, 26, 9);
_Print("The number of MACD is %d %d %d.", macd.macd.length, macd.signal.length, macd.hist.length);

// 指定商品和周期生成RSI技术指标。
var rsi = _TA("RSI", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of RSI is %d.", rsi.real.length);

// 指定商品和周期生成CMO技术指标。
var cmo = _TA("CMO", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of CMO is %d.", cmo.real.length);

// 指定商品和周期生成SAR技术指标。
var sar = _TA("SAR", "EUR/USD", "m5", "AskClose", 0.02, 0.2);
_Print("The number of SAR is %d.", sar.real.length);

// 指定商品和周期生成STOCH技术指标。
// 选项值: [Ask, Bid]  [TA_MAType_SMA, TA_MAType_EMA, TA_MAType_WMA]
var stoch = _TA("STOCH", "EUR/USD", "m5", "Ask", 73, 19, "TA_MAType_EMA", 19, "TA_MAType_EMA");
_Print("The number of STOCH is %d %d.", macd.slowk.length, macd.slowd.length);

// 指定商品和周期生成BBAND技术指标。
var bband = _TA("BBAND", "EUR/USD", "m5", "AskClose", 14, 2.0, 2.0, "TA_MAType_EMA");
_Print("The number of BBAND is %d.", bband.upperband.length, bband.middleband.length, bband.lowerband.length);

// 指定商品和周期生成MIN技术指标。
var min = _TA("MIN", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of MIN is %d.", min.real.length);

// 指定商品和周期生成MAX技术指标。
var max = _TA("MAX", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of MAX is %d.", max.real.length);

// 指定商品和周期生成MOM技术指标。
var mom = _TA("MOM", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of MOM is %d.", mom.real.length);

// 指定商品和周期生成ROC技术指标。
var roc = _TA("ROC", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of ROC is %d.", roc.real.length);

// 指定商品和周期生成ROCP技术指标。
var rocp = _TA("ROCP", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of ROCP is %d.", rocp.real.length);

// 指定商品和周期生成ROCR技术指标。
var rocr = _TA("ROCR", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of ROCR is %d.", rocr.real.length);

// 指定商品和周期生成APO技术指标。
var apo = _TA("APO", "EUR/USD", "m5", "AskClose", 12, 26, "TA_MAType_EMA");
_Print("The number of APO is %d.", apo.real.length);

// 指定商品和周期生成PPO技术指标。
var ppo = _TA("PPO", "EUR/USD", "m5", "AskClose", 12, 26, "TA_MAType_EMA");
_Print("The number of PPO is %d.", ppo.real.length);

// 指定商品和周期生成STDDEV技术指标。
var stddev = _TA("STDDEV", "EUR/USD", "m5", "AskClose", 14, 1.5);
_Print("The number of STDDEV is %d.", stddev.real.length);

// 指定商品和周期生成ATR技术指标。
var atr = _TA("ATR", "EUR/USD", "m5", "AskClose", 14);
_Print("The number of ATR is %d.", atr.real.length);

根据训练好的交易模型来推论买卖信号。

// 把由技术指标生成的二维阵列bitmap传递给CNN模型,推论买卖信号。
var pred = _TfClassify("MacdCrossCNN", bitmap, 224, 224, 1, 3);
if (pred) {
  for (var i = 0; i < pred.length; i+=2) {
    _Print("index:%d score:%f\n", pred[i], pred[i+1]);
  }
}

将字符串输出到文件。文件将保存在./tmp目录中。

// 将字符串保存到以新建模式打开的文件中。
_WriteFile("servertime", "2019/5/28 14:05:10", "1");

// 将字符串保存到以追加模式打开的文件中。
_WriteFile("servertime", "2019/5/28 14:05:10", "2");

以PNG格式创建图像文件。

// 创建单色图像。
var image_height = 224;
var image_width = 224;
var canvas = [];
for(var i = 0; i < image_height; i++){
  canvas[i] = [];
  for(var j = 0; j < image_width; j++){
    canvas[i][j] = 0;
  }
}
var bitmap = Array.prototype.concat.apply([], canvas);
_WritePng('test.png', bitmap, image_height, image_width, 1);