以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  公式模型编写问题提交  (http://222.73.7.161/bbs/list.asp?boardid=4)
----  图表交易调用后台策略出问题  (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=159932)

--  作者:skypixel
--  发布时间:2017/11/28 12:03:37
--  图表交易调用后台策略出问题

之前参考了论坛里面“有关在交易策略中图表和后台策略编写相互混用的说明”的帖子,写了一个策略,实测有问题,请大拿帮忙看下。

 

按照帖子的方法,首先用后台来获取实时持仓,并设为序列模式,这个在子函数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 时,没有发平仓指令,但是却发了开空仓的指令。请问是什么原因呢?

 


--  作者:FireScript
--  发布时间:2017/11/28 13:29:01
--  

1.看下交易日志。交易日志里面有详细记录的,看当时怎么触发的。我估计当时你的虚拟持仓当时应该是0持仓的,所以估计是发不出平仓指令。

2.“MYHOLDING:= #MYHOUTAIFUN.MYHOLDING#;

   指标引用现在很少用这种方式了,一般用STKINDI函数。你可以把MYHOLDING这个值输出在图表上看下对不对。


--  作者:skypixel
--  发布时间:2017/11/28 14:45:32
--  

1. 交易日志里面有发开仓指令,但是没有平仓指令。这里有个问题,是不是平仓必须要虚拟持仓不为0才行呢?如果是这样的话,用后台的实际持仓其实没法控制平仓的。而我又不能设置虚拟持仓(好像必须要有虚拟开仓的动作才有虚拟持仓),那岂不是没有办法用实际持仓来控制平仓了?

2.MYHOLDING肯定是对的,因为开仓的交易指令执行了。


--  作者:FireScript
--  发布时间:2017/11/28 14:55:10
--  
虚拟持仓要有持仓才能发平仓信号的。你只能获取当前最新实际持仓情况,但是你还要控制图表上平仓信号需要当前虚拟持仓不能为0才行。
--  作者:skypixel
--  发布时间:2017/11/28 15:04:00
--  
“但是你还要控制图表上平仓信号需要当前虚拟持仓不能为0才行”,这个怎样才能做到?我用当前持仓就是为了避免图表不能实际反映实际持仓的情况。有什么好办法吗?
--  作者:FireScript
--  发布时间:2017/11/28 15:27:55
--  
以下是引用skypixel在2017/11/28 15:04:00的发言:
“但是你还要控制图表上平仓信号需要当前虚拟持仓不能为0才行”,这个怎样才能做到?我用当前持仓就是为了避免图表不能实际反映实际持仓的情况。有什么好办法吗?

这个是没办法做的,总不能随便写个下单语句来保证虚拟持仓不为0吧。我看了下代码,触发的应该是开多2吧?barpos = datacount-1 这个条件的触发的时候,MYHOLDING的值应该是0 。因为那个持仓量只在最新K上有正确数值的,历史上都是0。你看下日志里记录的是触发了哪一行代码。日志里有记录下单是那个语句触发的。

 


--  作者:skypixel
--  发布时间:2017/11/28 17:37:32
--  

之前没有记录交易日志。

我有点糊涂了,MYHOLDING:TBUYHOLDING(1)不是我的帐户实际持仓吗?

我的理解是实际持仓确实查到是>0的,但是虚拟持仓HOLDING是0,所以虽然满足了条件平空1和开多1,但是只有开多1执行了,是这样吗?


--  作者:wenarm
--  发布时间:2017/11/29 8:58:45
--  

和虚拟持仓无关,我建议你在自己的关键部分加入debugfile调试。用于跟踪当时各项条件状态。

http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=49428

调试使用方法、


--  作者:skypixel
--  发布时间:2017/12/7 12:08:06
--  

版主,我估计找到问题了,我的策略运行标的是商品指数,不是月份合约,而是在交易的时候映射到具体的合约的,是不是在这种情况下TBUYHOLDING(1)是查的是指数的持仓,当然是没有的啦,所以为0,也就不会触发平仓。如果是的话,我想请问一下:

1. TBUYHOLDING(1)是不是返回运行的图表对应的品种的持仓?如果我的图表交易品种是指数,比如焦炭指数,是不是返回持仓会为0?如果我的图表交易品种是主力,比如焦炭主力,是不是会返回对应主力月份的持仓呢?

2. 再和版主确认一下,如果图表持仓holding为0,但是我用其他的条件比如上面说的TBUYHOLDING(1)判断后发出了sell或sellshort,图表会执行这个sell和sellshort吗?也就是想知道图表平仓会不会无论如何都受到图表持仓的限制?这个问题一直没搞清楚,麻烦你帮忙确认一下。多谢!


--  作者:FireScript
--  发布时间:2017/12/7 14:45:48
--  

1.是的,指数对应的返回值会是0 这个很容易测试到的。 交易的是主力返回的是对应主力月份的持仓。

2.图表的平仓信号一定会受到图表持仓的影响的。