1. 模型关键字
(1)Data:定义数据区
A.使用部分函数时需要在Data区定义合约,从而指定合约,Data区可定义多个合约,支持写入合约代码、文华码,期货合约支持使用中文名;
B.在函数前使用data0.的形式来调用,其中data0为合约名称,需要使用双引号标注;
C.若模型中Data区只定义了一个合约,则函数可以不使用data0.的形式来调用,默认定义的唯一合约;若模型中Data区定义了多个合约,则必须使用data0.的形式来调用;
D.订单流策略,必须定义Data数据区;
E.算法下单组件,可以不定义Data数据区,默认取图表中的合约。
编写示例:定义数据区并对指定合约下单
Data data0:"m2501"; -------------------//定义数据区,指定合约为豆粕2501 Begin data0.A_SendOrder(Enum_Buy,Enum_Entry,2,data0.Price("open")); End -----------------------//开多单
(2)Setting:定义环境设置
A.定义环境设置,用于实现多样化的策略;
B.与Params、Vars结构并列,写入结构任意位置都可生效,不受模型从上至下计算的限制;
C.限制:同一环境设置函数只能写入一次;
D.关键字下需写入【计算控制函数】分类下的函数,如:AddTimes、Review_Data...
注:仅用于趋势策略模型,不支持在订单流策略和算法下单组件中使用;
编写示例:
Setting Review_Data:Tick;-----------------------//指定用逐笔数据计算
(3)ImPort:设置跨合约跨周期引用关键字
A.在ImPort字段下写入#Call、#ImPort、#Call_Plus、#Call_Other函数,设置跨合约、跨周期、跨合约跨周期、跨指标引用;
B.与Params、Vars结构并列,写入结构任意位置都可生效,不受模型从上至下计算的限制;
注:仅用于趋势策略模型,不支持在订单流策略和算法下单组件中使用;
编写示例:跨周期引用变量
ImPort #ImPort[Day,1,AA] AS Var1-----------------------//引用日线上的趋势条件 #ImPort[Hour,2,AA] AS Var2-----------------------//引用小时周期上的趋势条件
(4)Params:定义参数
A.一个模型只能有一个Params关键字,放在模型开始部分,在定义变量之前;
B.参数类型:数值型(不能使用序列变量);
C.参数必须指定默认值;
D.参数不可以使用赋值符号=赋值;
注:仅用于趋势策略模型,不支持在订单流策略和算法下单组件中使用;
编写示例:参数定义并赋默认值
Params Numeric N(5); -----------------------//定义参数N,默认值为5 Begin Ma(Close,N); -----------------------//表示5周期均线 End
(5)Vars:定义变量
A.一个模型只能有一个Vars关键字,放在模型开始部分,在定义参数之后,主程序开始之前;
B.变量类型:数值型、字符串型;
C.变量可不指定默认值,默认值为0(数值型)或空串(字符串型);
D.变量可以在主程序使用赋值符号=进行赋值;
编写示例:变量定义与赋值
Vars Numeric N1; -----------------------//定义变量N1 Numeric N2; -----------------------//定义变量N2 String N3; -----------------------//定义变量N3 NumericArray N4; -----------------------//定义变量N4 Begin N1=3000; -----------------------//整型赋值 N2=88.888; -----------------------//浮点型赋值 N3="股指期货"; ---------------------//字符串型赋值 N4[0] = 1; -----------------------//数组型赋值 N4[1] = 2; -----------------------//数组型赋值 N4[2] = 3; -----------------------//数组型赋值 End 更多变量使用介绍请参考”5、其他“中的变量使用示例。
(6)主程序
A.格式为:
Begin ... End
C.主程序中模型语句从上至下、从左至右进行计算;
影响:
例:信号记录函数BKVOL
公式中写在开仓指令前,返回0;
公式中写在开仓指令后返回开仓手数。
b.多根K线计算的指标,例:
If (IsUp)
{
If(Close<Ma(Close,5))
{
AA=1;
}
}
需要单独定义在条件外确保每根K线上都会计算,即应该编写为:
MA5=Ma(Close,5);
if(IsUp)
{
If(Close<MA5)
{
AA=1;
}
}
2. 信号指令&委托函数
T+0指令:
BK(买开)、SK(卖开)、SP(卖平)、BP(买平)、BPK(买平开)、SPK(卖平开)
T+1指令:
买入(Buy)、卖出(Sell)
注:
A.股票交易支持T+0指令和T+1指令,支持以上8种信号指令;
B.套利交易仅支持买开(BK)、卖平(SP)、卖开(SK)、买平(BP);
C.参数规则:BK(N,Price); N为建仓手数,不可缺省,Price为委托价格可以缺省。;
b.Price可以为具体数值,也可以为变量;参数缺省时,按照账户->程序化参数->默认下单价格进行委托;
c.Price超出K线的有效范围,回测时将会取最接近的有效价格为成交价;
d.信号指令只在图表上显示信号标识,不能下单委托;
默认按一开一平信号过滤模型规则出信号;
开平仓手数不同,为加减仓模型;
Setting字段下写入AddTimes为连续建仓模型。
(2)发送委托单(支持订单流策略和算法下单组件)
A_SendOrder(BuyOrSell,EntryOrExit,Lot,Price,”AccountID”) 针对当前公式应用的交易帐户、合约发送委托单)
注:
A.该函数不支持趋势策略使用;
B.订单流策略中支持回测,算法下单组件不支持回测;
3. 函数
编写示例:
Vars Numeric Ma12; Numeric SValue; Begin Ma12=Ma(Close,12);//计算12周期均价 SValue=Summation(Close,12);//计算12周期以来的收盘价的和 PlotNumeric("Ma12",Ma12); PlotNumeric("SValue",SValue); End
(1)系统函数
在策略开发平台中显示蓝色字体,如上面例子中的:Ma(求移动平均);
策略开发平台→插入→插入函数,可以查看详细的函数分类及函数说明。
(2)自定义函数
模型编写平台中显示红色字体,如上面例子中的Summation
A.自定义函数结构
Params 参数定义语句; Vars 变量定义语句; Begin 脚本正文; End
B.自定义函数的调用
用法:返回值
a.无参数
此类函数在编写自定义时没有定义参数的部分,所以在调用时也不需写入参数,直接写函数名即可。下面以AvgPrice为例,求当前周期的平均价格。
Vars Numeric AvgValue; Begin AvgValue=AvgPrice(); PlotNumeric("AvgValue",AvgValue); End
b.有参数
此类函数在编写自定义时定义了参数个数和类型,需要根据定义时候的参数列表和顺序,输入相应的参数,以Summation为例,计算指定周期内的数值和。
Vars Numeric SValue; Begin SValue=Summation(Close,12);//计算12周期以来的收盘价的和 PlotNumeric("SValue",SValue); End c.数组类 Vars NumericArray arr[10];//建立一个数组,长度为10 Numeric i; Numeric SValue; Begin For i=0 To 9 { arr[i]=Open[i];//依次存放0-9开盘价 } SValue=SummationArray(arr); PlotNumeric("SValue",SValue); End
4. 运算控制语句
(1)条件语句
A.If语句
If语句是一个条件语句,当条件(Condition)满足后执行公式语句。
If (Condition)
{
公式语句;
}
注:
当If体中的语句多于一条时,要用{}括起来;只有一条时,可括可不括。
B.If-Else语句
对条件(Condition)进行判断,如果条件满足执行If后的公式语句1,否则执行Else后的公式语句2。
If (Condition)
{
公式语句1;
}
Else
{
公式语句2;
}
注:
在嵌套结构中会有多个If与多个Else关键字,每一个Else都应有对应的If相配对。
原则:Else与其前面最近的还未配对的If相配对。
C.If-Else-If
当条件Condition1满足时,公式语句1将会被执行,当条件Condition1不满足时,将会继续判断条件Condition2,当满足条件Condition2时,公式语句2将会被执行。
If (Condition1)
{
公式语句1;
}
Else If(Condition2)
{
公式语句2;
}
(2)循环语句
A.For循环
For循环一般用于次数一定的循环思路。
a.For语句为循环语句,重复执行某项操作,直至循环结束。
b.循环变量为在之前已经定义的一个数值型变量.
c.For To循环(从小到大)
For To循环的执行是循环变量从初始值到结束值,按照步长为 1 依次递增,重复执行循环体中的公式语句,初始值必须小于或等于结束值;
For 循环变量 = 初始值 To 结束值
{
公式语句;
}
d.For DownTo循环(从大到小)
For DownTo语句中循环变量从初始值每次递减 1直到等于结束值,重复执行循环体中的公式语句,初始值必须大于或等于结束值。
For 循环变量 = 初始值 DownTo 结束值
{
公式语句;
}
注:
循环数组时,数组的下标不要超过总数量。
B.While循环
While循环不像For循环那样有次数结束语句,适用于次数未知的循环思路。
While语句在条件(Condition)为真的时候重复执行某一项操作,直至条件(Condition)为假时循环结束。
While (Condition)
{
公式语句;
}
C.Break语句
Break语句用于结束循环,跳出循环体,执行循环之后的代码。
循环在每次执行后,都将判断Condition的值,当Condition为True时,则执行Break语句,跳出整个循环,执行公式语句2;
While (True) { 公式语句1; If (Condition) Break; } 公式语句2;
D.Continue语句
Continue语句用于结束此次循环,进行下一次循环。
循环在每次执行后,都将判断Condition2的值,当Condition2为True时,则执行Continue语句,跳过公式语句2,判断Condition1进入下一次循环,否则继续执行公式语句2。
While(Condition1) { 公式语句1; If (Condition2) Continue; 公式语句2; }
E.Return语句
Return的作用是从当前位置返回,不再执行Return后面的代码。
循环在每次执行后,都将判断Condition的值,当Condition为True时,则执行Return语句,Return之后的代码都不再执行。
While (True) { 公式语句1; If (Condition) Return 公式语句2; }
5、其他
(1)变量使用示例
A.临时变量(Numeric,String,NumericArray,StringArray)
对临时变量的计算和赋值当次计算生效,如果不做赋值临时变量直接取变量的初始值。
具体在模型应用中,用k线数据回测那么当次计算指的是对某一根k线数据的计算过程,临时变量的赋值只对这一根k线数据的计算过程中生效;逐笔回测和盘中运行,当次计算指的是对某一笔数据的计算过程,临时变量只对一笔数据的计算过程生效。
例:如果当根K线为阳线则yang为1,如果当根K线为阴线则yin为1
Vars
Numeric yang;
Numeric yin;
Begin
IF (Open < Close)
{
yang = 1;
}
IF (Open > Close)
{
yin = 1;
}
End
B.序列变量(NumericSeries)
对一段k线数据回测,一根一根逐次计算过程中,如果当根K线计算对变量有赋值就取这个赋值结果,如果当根K线没有对变量进行赋值则取上一根k线的数值。
序列变量,意义在于一段k线数据的每一根k线都有对应一个数据存储,序列变量本质上是一组数值或字符串。序列变量和WT8、金字塔等软件的全局变量概念是一致的。
序列变量通常用于统计一段历史K线中满足某一条件的次数
例:统计截止当前历史K线中阳线的数量
Vars
NumericSeries UpNum;
Begin
If(Close > Open)
{
UpNum = UpNum+1;
}
PlotNumeric("阳线的数量",UpNum);
End
C.广域变量(Global_Numeric、Global_String、Global_NumericArray、Global_StringArray)
广域变量和C语言的内部变量的概念是一致的,在一个公式的多次计算过程中,广域变量的计算是延续,这次计算是在上一次的结果基础上进行。
广域变量和临时变量的区别,在于一个公式的多次计算的整个过程中永久有效。
广域变量和序列变量的区别,在于广域变量和一根一根的k线没有对应关系,通常用于算法下单或逐笔数据统计。
例:在订单流策略中通过广域变量控制信号处理标识,控制满足条件时只下单一次
Data
data0:"cu2411";
Vars
Global_Numeric BKID;//买开委托
Global_Numeric BKFLG;//买开标志
Begin
If(BKFLG == 0)//如果没有买开委托
{
BKID = data0.A_SendOrder(Enum_Buy,Enum_Entry,1,data0.Price("New"));//发出买开委托
BKFLG = 1;//已发出买开委托
}
If(BKFLG == 1 && F_OrderStatus(BKID) == Enum_Declared)//如果买开委托的状态是委托成功
{
data0.F_DeleteOrder(F_OrderContractNo(BKID));//撤掉买开委托挂单
BKFLG = 2;//已发出撤掉买开委托挂单
}
End
(2)枚举值的用法
A.作为函数的参数
例:
A_SendOrder(Enum_Sell,Enum_Exit,data0.F_BuyRemainPosition(),data0.Price("bid1"));//对当前公式应用的交易账户对应合约发出卖平仓委托,以买一价平公式应用交易账户当前多头可用持仓。
B.与函数返回值做比对进行判断
例:
If (F_OpenOrderEntryOrExit(0) == Enum_Entry)//条件语句,最后一笔未成交委托单是开仓,进行下面操作。