欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件公式模型编写问题提交 → 总是不平空就开多,图表上都正常,另外不能在信号消失后恢复持仓,怎么回事?

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有6975人关注过本帖平板打印复制链接

主题:总是不平空就开多,图表上都正常,另外不能在信号消失后恢复持仓,怎么回事?

帅哥哟,离线,有人找我吗?
MMM
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:71 积分:415 威望:0 精华:0 注册:2011/12/8 20:22:33
  发帖心情 Post By:2012/3/12 16:04:08    Post IP:125.33.95.159[只看该作者]

下午测试中出现一次信号消失后的自动仓位恢复,操作成功,但只出现在委托和成交记录中,不会在图表程式化交易的记录中显示(如果可以显示自动恢复持仓记录和前面的盘中开仓相对应就更好了)。

 

不好意思火哥,我在代码中没有说清楚。这段代码前没有什么特别的了,就是一些交易条件的判断逻辑,我觉得不重要。

至于您说的kpos没有意义,可能是关键。我的逻辑是(基于我对逐K线模式刷新机制的理解,不一定正确):设置一个kpos的全局变量,在每次刷新时都先初始化成0,最新的一次刷新中,逐K线模式会从第一根K线到当前这根K线每一根K线执行一遍程序。这样kpos的值是从1变到最后这根的(最后这根产生的头1秒还没有轮询时,kpos记录的就是上一根K线的位置,一旦第1秒轮询完成,kpos就被置成最新的barpos,也就是刚产生这根K线的位置),因此在遍历过去K线时,比如从第10根遍历到第11根开始执行程序时,kpos是10,而barpos是11,所以会执行barpos>kpos的if结构,从而产生的多空信号是始终存在的,而且和新K线第1秒轮询时要求的信号判断和操作也是一致的。在K线中的操作逻辑是:由于过了新K线的第一个1秒轮询后barpos=kpos,if结构就不再被执行,只有在InTermBuy(盘中交易条件)为真时执行第二段if结构中的操作指令,这段if结构既可以反映过去K线满足InTermBuy条件时的状态也可以满足即时操作。只有一种情况即信号消失的情况在所有K线上是不会被反映的,但这也能够维持虚拟持仓holding的正确状态。

 

再修改以下代码的说明如下:

variable:kpos=0;(或用globalvariable声明)//不再使用islastbar

...

long:=K线走完需要开多的条件;

short:=k线走完需要开空的条件;

InTermBuy:=K线中需要开多的条件;//动态变化,可能消失

EndKSell:=InTermBuy and 主动恢复持仓的条件;//在InTermBuy成立并需要主动恢复持仓时有用,在K线中产生操作但InTermBuy不成立而信号消失时没有作用。持仓的恢复只能通过勾选软件的自动恢复功能来实现。

....

lastlong:=ref(long,1);

lastshort:=ref(short,1) or ref(InTermBuy,1) and ref(EndKSell,1);


if barpos>kpos then begin //实现历史K线交易信号并实现新K线刚产生第1秒轮询时的下单操作

 sellshort(lastlong and holding<0, 1, limitr, o);
 sell(lastshort and holding>0, 1, limitr, o);
 buyshort(lastshort and holding=0, 1, limitr, o);
 buy(lastlong and holding=0, 1, limitr, o);

 kpos:=barpos;
 inkbuy:=0;    //原打算记录是否产生过K线中的操作,一旦自动恢复仓位的功能不好用时使用,现在可以忽略。
end

if InTermBuy then begin //K线中满足条件即交易,之后至新K线产生之前的最后1秒扫描可能有两种结果,1是InTermBuy继续成立(信号保持),但收盘价决定需要主动恢复仓位,这时会改变lastshort的状态并通过在新K线产生的第一秒实现主动恢复仓位的操作;2是InTermBuy不成立了(信号消失),这时K线的虚拟仓位状态和实际相反,需通过勾选的自动回复持仓功能进行恢复。

 sellshort(holding<0, 1, limitr, PriceInK);
 buy(holding=0, 1, limitr, PriceInK);
 inkbuy:=1;//现在没用了
end

 

 


 回到顶部
总数 13 1 2 下一页