三、策略
3.1有关平仓反手的模型
[PEL] 复制代码
input:man(26,2,200);
ma1:=ma(close,man);
ccm:=cross(close,ma1);
cmc:=cross(ma1,close);
//顺序必须主要需要根据仓位先平后开的原则
//平空开多
if ccm then
begin
sellshort(holding<0 and ccm,0);
buy(holding<=0,1);
end
//平多开空
if cmc then
begin
sell(holding>0 and cmc,0);
buyshort(holding>=0,1);
end
如果是传统的ENTERLONG交易信号,同样需要先平后开的原则
[PEL] 复制代码
EXITLONG: cross(A2,AO) OR B2>0;
EXITSHORT: CROSS(AO,A2) OR B2>0;
ENTERLONG: cross(AO,A2) AND B1=1;
ENTERSHORT: CROSS(A2,AO) AND B1=1;
如果用户帐户资金不足或者希望顺序成交,可以使用ORDERQUEUE指令
[PEL] 复制代码
EXITLONG: cross(A2,AO) OR B2>0,ORDERQUEUE;
EXITSHORT: CROSS(AO,A2) OR B2>0,ORDERQUEUE;
ENTERLONG: cross(AO,A2) AND B1=1,ORDERQUEUE;
ENTERSHORT: CROSS(A2,AO) AND B1=1,ORDERQUEUE;
ORDERQUEUE指令适合所有交易指令,包括BUY,TBUY等
3.2 为什么我的交易系统有信号了但是没有委托或者成交,我们以图表交易为重点介绍,对于初学用户,总结原因一般有如下几点:
1、用户需确认在出现交易信号之后金字塔是否有发出委托指令,用户可以在交易记录中查询到,如果有委托但未成交主要有两点,对于模拟交易,如果使用综合交易平台系统,由于目前并不完善,会经常造成即便市价下单也无法及时成交的情况。对于实盘交易,用户需要在报单策略上多仔细考虑尽量的发出对价单来保证其成交。
2、如果有信号没有委托发出,请确认是否是下列几点造成
1)金字塔会在打开一个品种的图表后自动补充历史数据,确认是否是因为自动补数据造成的在交易时没有信号出现,但是补数据后历史上出现交易信号,但是用户通过查询历史成交记录觉得对不上了。
2)如果用户使用模拟交易,目前模拟交易得稳定性没有实盘交易好,所以如果盘中中断,那么会导致出现后错过时机。
3)使用固定轮循模式执行指标交易,由于最后一个K线没有最终形成,信号出现后下单,但是信号又消失,造成历史信号与持仓不吻合,这时建议大家使用K线走完模式,保证信号稳定。
4) 对于BUY,TBUY等高级的策略交易系统,切记要先平后开的下单原则。
5) 对于无法发出平仓指令的情况,一般情况是因为开仓指令的委托单,没有及时成交,由于平仓信号发出时没有仓位,金字塔无法仓可平,等信号错过后,开仓单才成交,造成了看起来漏掉了一个平仓信号。
6) 因为平仓反手不对称造成,最常见的是发出平仓信号后没有及时成交,但是反手单却提前成交了,造成了锁仓,导致金字塔判断仓位方向不确定会导致平仓单信号漏掉,对于反手情况,初学用户请尽量使用市价委托,并使用ORDERQUEUE指定顺序成交,否则就建议初学者尽量使用对价报单,尽量避免不成交的几率出现,否则初学用户就应该初期只使用单向交易,等日后能够熟练应用金字塔的追单功能后再使用挂单性质的反手交易手法。
7) 如果使用固定时间间隔,间隔时间设置过大,造成信号在周期的末尾时出现,但正好在扫描的时间间隔之内,造成了出现信号金字塔没有及时的得知,对于此情况建议用户将间隔时间设为1秒
8) 如果用秒线或者分笔周期,请务必选择“高频”选项,避免行情快速变化时由于固定轮循最小1秒间隔带来的信号漏单。
9) 如果使用了ORDERQUEUE顺序下单指令,那么应该尽量的让其一次性成交,必要时请使用市价委托,因为一旦队列下单不成交撤单后,再次委托会将委托追单排到最后,导致后面的比如反手指令无法正确得到执行,造成信号漏单。
10) 后台自动交易不要将THOLDING写在交易语句里比如TBUY(bk and THOLDING=0,1,MKT),详细解释请看问题3.4
11) 图表交易里使用了后台自动交易的函数THOLDING2或者THOLDING或者使用了DYNAINFO等常数函数,由于图表交易不会在产生信号时立即发单,等再次检测时由于之前的发单成交THOLDING已经发生变化导致刚才出现的信号因为THOLDING的信号消失,所以产生了信号漏掉。
12) 推荐用户仔细看看金字塔的调试技巧文章
https://www.weistock.com/bbs/for ... =136&extra=page%3D1
尤其是需要打开下单日志,这样便于在出现问题时,及时的查到问题的原因。
13) 用户要确认自己的策略中没有使用跨周期数据引用或者BACKSET,REFX等未来函数,有些这些未来数据,或造成信号的反复消失及过往的K线突然出现信号,导致用户看起来错过的那跟K线没有下单
14) 是否在模型中使用了小周期引用大周期的情况,同样属于未来数据的使用,会导致信号消失
3.3 为什么我的图表上的交易信号会出现白色箭头
这种情况一般是因为用户在图表交易上使用了挂单指令或者STOP指令,委托的价格超过了本次K线上的最高最低价格,导致金字塔认为该笔委托属于无效委托导致。金字塔在执行程序化交易测评时,只会根据K线的委托的价位判断是否在高低价格之间做为测评是否属于委托成交的依据,因此挂单止损止赢的交易策略用户是不应该直接使用这种方式的,通常这种方式用在后台程序化交易中,因为后台不需要担负测评任务,更适合做此类的精细化控制。
图表的出问题的代码范例:
[PEL] 复制代码
if holding>0 then Sell(true,1,limitr, AVGENTERPRICE+10); // 超过入场价10点就止盈
if holding>0 then Sell(true,1,stopr, AVGENTERPRICE-5); //跌破入场价5个点就止损
这种写法在图表程序化中是会出现白色箭头的,也是没有办法进行有效历史评测的,我们应该改成下面的写法:
[PEL] 复制代码
if holding>0 then Sell(c>=AVGENTERPRICE+10,1,limitr,c ); // 超过入场价10点就止盈
if holding>0 then Sell(c<AVGENTERPRICE-5,1,limitr,c); //跌破入场价5个点就止损
通过平仓的条件语句,判断最新的K线价格超过了我们开仓的均价止赢止损点后,直接发出委托信号
3.4 有关后台自动交易THOLDING的使用
初学者在使用后台自动交易时,通常认为将函数前简单加T就可以,但实际不行的,比如:
[PEL] 复制代码
tSELL(bp and THOLDING>0,0,LMT,C);
tSELLSHORT(sp and THOLDING<0,0,LMT,C);
tBUY(bk and THOLDING=0,1,LMT,C);
tBUYSHORT(sk and THOLDING=0, 1,LMT,C);
在图表交易系统上加 t 改过来的代码
THOLDING与图表HOLDING最大的不同在于,THOLDING是与你真实持仓一致的函数,只有当我们的委托下单成交后才会有所变化,而HOLDING是虚拟持仓,BUY执行过后立即变化。
由于我们前面的代码在执行了平仓操作后,THOLDING不会马上变成0,故会导致TBUY的THOLDING=0条件不被成立,导致没有反手信号。
正确的反手写法
[PEL] 复制代码
if bp > 0 and THOLDING>0 then
begin
tSELL(1,0,MKT),ORDERQUEUE;
tBUYSHORT(1, 1,MKT),ORDERQUEUE;
end
if sp > 0 and THOLDING<0 then
begin
tSELLSHORT(1,0,MKT),ORDERQUEUE;
tBUY(1,1,MKT),ORDERQUEUE;//tbuy第一个1表示条件永远成立,后一个1表示开仓手数
end
这段代码的关键是ORDERQUEUE。有了它之后,指令流就变成了阻塞式的了。所有报单放入队列中,按次序委托下单,成交一个委托下一个。
如果资金充足,不会出现因为未平仓而开不了仓的情况,可把ORDERQUEUE去掉,指令就会顺序提交,不需等待返回结果。
[PEL] 复制代码
if sp > 0 and THOLDING<0 then
begin
tSELLSHORT(1,0,MKT),ORDERQUEUE;
tBUY(1,1,MKT),ORDERQUEUE;//tbuy第一个1表示条件永远成立,后一个1表示开仓手数
end
tbuy第一个1是有用意的,表示当有持仓,且满足平仓和开空条件时,连续执行两个交易操作,一气呵成。而不是先判断平仓条件是否满足进行平仓,再判断开空条件进行开空。
请注意上述代码使用了市价委托,如在CTP接口上模拟交易,上期所品种不支持市价委托,请注意一定不要在上期所品种下进行交易。
THOLING与THODING2的不同:THOLING会返回我们当前的可用持仓,发出平仓指令之后,即便没有成交,持仓也会被扣掉,故如果用THOLING做为开仓条件,会有前次平仓没有成交而马上开仓带来的资金不足情况,如果用户需要知道当前自己的实际持仓,那么请用THODING2,他不会因为你的挂单未成交而导致的实际持仓被扣情况。
3.5对于后台程式化交易指定品种下单时填写报单价格的注意事项
例如如下代码:
[PEL] 复制代码
if TBUYHOLDINGEX('1000','dqc09' , 1)>0 and TSELLHOLDINGEX( '1000','dqm09', 1)>0 then begin
tsell(1,1,lmt,c-2*mindiff,0,'1000','dqc09');
tsellshort(1,1,lmt,c+2*mindiff,0,'1000','dqm09');
end
这是一段套利的代码,应该注意2点;
1、代码中自己指定下单品种后,预警监控则就不可再次把这两个品种都添加进来,因为后台交易是轮询模式的,会将列进去的品种都监控执行一遍,如上的代码如果添加了两个品种进入预警监控后,会导致重复的开平仓。解决方法是这两个品种只添加任意一只即可。
2、代码中指定的开仓价是c+2*mindiff,这样犯了致命错误,因为C是当前监控品种的最新价报价,但是下单时确是指定的另外一个品种,解决办法是使用DYNAINFO2函数,使用指定品种买卖盘价格报单。
3.6非主力合约移仓换月(开盘x分钟/秒后)--后台程序化
系统自带的移仓换月,会在开盘的一瞬间发出,可能会引起较大波动,本例可以实现连续合约换月当天,开盘x分钟后再进行移仓换月。具体示例请参考以下链接:
https://www.weistock.com/bbs/forum.php?mod=viewthread&tid=8737&page=1&extra=#pid45697
3.7