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


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

   

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


  共有7274人关注过本帖树形打印复制链接

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

帅哥哟,离线,有人找我吗?
MMM
  11楼 | 信息 | 搜索 | 邮箱 | 主页 | 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

 

 


 回到顶部
帅哥哟,离线,有人找我吗?
阿火
  12楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 原leevolvo
等级:版主 帖子:2160 积分:10563 威望:0 精华:11 注册:2010/11/3 11:21:19
  发帖心情 Post By:2012/3/13 12:57:40    Post IP:120.42.45.130[只看该作者]

我知道你是不想公开策略。很简单啊。你可以把lastlong加个类似的条件,这样别人才能帮你。

long:=K线走完需要开多的条件;  何谓“K线走完需要开多的条件”?想必只有你自己知道

类似long:=c>o; 还是类似 long:=ref(c>o,1)?

 

还有,你把kpos有关的都删了,效果跟你上面是一摸一样的。所以kpos没意义

 


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


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

谢谢提醒。只是要假设的几个条件使其逻辑关系与真实对应,我觉得比搞清楚现在编程中出现的问题还困难,因为这些条件并不与C的变化一直成正相关,所以很难估计其逻辑特点,尤其是K线中成交条件,只能假设在K线中的某个位置。

 

刚尝试逐K线模式下采用固定时间轮询的,没有什么经验,用kpos可以让程序操作逻辑清晰先。如果去掉kpos我理解会出现下面情况:在lastshort成立的情况下新K线的第1秒轮询会平多开空,而新K线中平空开多的条件成立后也会交易,但此后K线走完之前的轮询中lastshort还会再次交易,这样随着信号反复可能会出现不期望的频繁交易。


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