之前参考了论坛里面“有关在交易策略中图表和后台策略编写相互混用的说明”的帖子,写了一个策略,实测有问题,请大拿帮忙看下。
按照帖子的方法,首先用后台来获取实时持仓,并设为序列模式,这个在子函数MYHOUTAIFUN中
MYHOLDING:TBUYHOLDING(1);
然后主函数的交易代码如下:
KD1:=CROSS(CLOSE,开多点位);//开多平空条件
KK1:=CROSS(开空点位,CLOSE);//开空平多条件
MYHOLDING:= #MYHOUTAIFUN.MYHOLDING#; //实际持仓
IF KD1 then BEGIN
//多空双向交易
if barpos = datacount-1 then BEGIN //这里是假设用户用的走完K线交易模式,保证是倒数第2根K线有信号
IF MYHOLDING<0 THEN BEGIN //如果有空仓,先平后开
平空1:SELLSHORT(1,交易手数1,THISCLOSE); //平空信号
KK_HOLDING1:=0;
开多1:BUY(1,交易手数1,THISCLOSE); //开多信号
KD_HOLDING1:=1;
END
IF MYHOLDING=0 THEN BEGIN //如果没有空仓,直接开
开多2:BUY(1,交易手数1,THISCLOSE); //开多信号
KD_HOLDING1:=1;
END
end
else BEGIN
IF KK_HOLDING1=1 THEN BEGIN
平空:SELLSHORT(1,交易手数1,THISCLOSE); //平空信号
KK_HOLDING1:=0;
END
IF KD_HOLDING1=0 THEN BEGIN
开多:BUY(1,交易手数1,THISCLOSE); //开多信号
KD_HOLDING1:=1;
END
end
END
IF KK1 then BEGIN
//多空双向交易
if barpos = datacount-1 then BEGIN //这里是假设用户用的走完K线交易模式,保证是倒数第2根K线有信号
IF MYHOLDING>0 THEN BEGIN //如果有多仓,先平后开
平多1:SELL(1,交易手数1,THISCLOSE); //平多信号
KD_HOLDING1:=0;
开空1:BUYSHORT(1,交易手数1,THISCLOSE); //开空信号
KK_HOLDING1:=1;
END
IF MYHOLDING=0 THEN BEGIN //如果没有多仓,直接开
开空2:BUYSHORT(1,交易手数1,THISCLOSE); //开空信号
KK_HOLDING1:=1;
END
end
else BEGIN
IF KD_HOLDING1=1 THEN BEGIN
平多:SELL(1,交易手数1,THISCLOSE); //平多信号
KD_HOLDING1:=0;
END
IF KK_HOLDING1=0 THEN BEGIN
开空:BUYSHORT(1,交易手数1,THISCLOSE); //开空信号
KK_HOLDING1:=1;
END
end
END
按照“有关在交易策略中图表和后台策略编写相互混用的说明”中说的,在倒数第二根k线用实际持仓做平仓开仓条件,之前的历史信号用variable KK_HOLDING1和KD_HOLDING1来判断。
我实盘交易的结果是:我本来有多头持仓,出现空头信号KK1 时,没有发平仓指令,但是却发了开空仓的指令。请问是什么原因呢?
1.看下交易日志。交易日志里面有详细记录的,看当时怎么触发的。我估计当时你的虚拟持仓当时应该是0持仓的,所以估计是发不出平仓指令。
2.“MYHOLDING:= #MYHOUTAIFUN.MYHOLDING#;”
指标引用现在很少用这种方式了,一般用STKINDI函数。你可以把MYHOLDING这个值输出在图表上看下对不对。
1. 交易日志里面有发开仓指令,但是没有平仓指令。这里有个问题,是不是平仓必须要虚拟持仓不为0才行呢?如果是这样的话,用后台的实际持仓其实没法控制平仓的。而我又不能设置虚拟持仓(好像必须要有虚拟开仓的动作才有虚拟持仓),那岂不是没有办法用实际持仓来控制平仓了?
2.MYHOLDING肯定是对的,因为开仓的交易指令执行了。
这个是没办法做的,总不能随便写个下单语句来保证虚拟持仓不为0吧。我看了下代码,触发的应该是开多2吧?barpos = datacount-1 这个条件的触发的时候,MYHOLDING的值应该是0 。因为那个持仓量只在最新K上有正确数值的,历史上都是0。你看下日志里记录的是触发了哪一行代码。日志里有记录下单是那个语句触发的。
之前没有记录交易日志。
我有点糊涂了,MYHOLDING:TBUYHOLDING(1)不是我的帐户实际持仓吗?
我的理解是实际持仓确实查到是>0的,但是虚拟持仓HOLDING是0,所以虽然满足了条件平空1和开多1,但是只有开多1执行了,是这样吗?
和虚拟持仓无关,我建议你在自己的关键部分加入debugfile调试。用于跟踪当时各项条件状态。
http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=49428
调试使用方法、
版主,我估计找到问题了,我的策略运行标的是商品指数,不是月份合约,而是在交易的时候映射到具体的合约的,是不是在这种情况下TBUYHOLDING(1)是查的是指数的持仓,当然是没有的啦,所以为0,也就不会触发平仓。如果是的话,我想请问一下:
1. TBUYHOLDING(1)是不是返回运行的图表对应的品种的持仓?如果我的图表交易品种是指数,比如焦炭指数,是不是返回持仓会为0?如果我的图表交易品种是主力,比如焦炭主力,是不是会返回对应主力月份的持仓呢?
2. 再和版主确认一下,如果图表持仓holding为0,但是我用其他的条件比如上面说的TBUYHOLDING(1)判断后发出了sell或sellshort,图表会执行这个sell和sellshort吗?也就是想知道图表平仓会不会无论如何都受到图表持仓的限制?这个问题一直没搞清楚,麻烦你帮忙确认一下。多谢!
1.是的,指数对应的返回值会是0 这个很容易测试到的。 交易的是主力返回的是对应主力月份的持仓。
2.图表的平仓信号一定会受到图表持仓的影响的。