以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://222.73.7.161/bbs/index.asp) -- 公式模型编写问题提交 (http://222.73.7.161/bbs/list.asp?boardid=4) ---- 如何在条件A下限制开仓次数? (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=174006) |
|
-- 作者:nescol0928 -- 发布时间:2020/1/16 1:02:31 -- 如何在条件A下限制开仓次数? 如何在条件下限制开仓次数? 例如:if cross(ma5,ma60) and 条件A, 开多仓一次,平仓后,只要Ma5没有再次下穿Ma60,那就不再开仓。也就是说在ma5上穿ma60和ma5下穿ma60之间,只开仓一次。
|
|
-- 作者:wenarm -- 发布时间:2020/1/16 8:22:37 -- cross(ma5,ma60) 这个条件就已经限制了。他表示的是ma5上穿ma60那一刻时的状态。上穿和下穿都是交替出现的。当然你如果想逻辑更严谨表述加上限制也无所谓。 除非你用ma5>ma60这种表述方式,他代表 “ma5上穿ma60到ma5下穿ma60k线区间。这种情况下才可能需要限制。 限制次数也很简单,直接用holding就行。holding三种状态如下: 空头持仓: holding<0 多头持仓: holding>0 无持仓: holding=0
如果cross(ma5,ma60) and 条件A,是开仓条件可以直接 if cross(ma5,ma60) and 条件A and holding=0
如果是平仓反手操作 if cross(ma5,ma60) and 条件A then begin sellshort(holding<0,1,MARKET); buy(holding=0,1,MARKET); end
|
|
-- 作者:nescol0928 -- 发布时间:2020/1/16 9:37:16 -- 我表述错误,应该是从cross(ma5,ma60)后的ma5》ma60,到Ma5《ma60之间,只能开仓一次! |
|
-- 作者:FireScript -- 发布时间:2020/1/16 10:20:53 -- 确认下: 1.你这里的开仓条件其实应该是 ma5>ma60 and 条件A 对吧?因为如果用cross的判断,cross成立本身就只在第一次ma5>ma60时满足。 2.在死叉之前 能且只能开仓一次。即使死叉之前平仓了也只开仓一次? |
|
-- 作者:nescol0928 -- 发布时间:2020/1/16 10:56:35 --
|
|
-- 作者:FireScript -- 发布时间:2020/1/16 11:14:53 -- 这样做: ma5:ma(c,5);
ma60:ma(c,60); 条件A:C>O+5*MINDIFF; cd:ma5>ma60 and 条件A; cd1:BARSLAST(cross(ma5,ma60));//从0开始 所以下面count统计时候加1 cd2:count(cd,cd1+1)=1 and cd;//当前满足开仓条件且是金叉以来的第一次 |
|
-- 作者:nescol0928 -- 发布时间:2020/1/16 12:53:08 -- n1:=barslast(cross(c,mac))+1; n2:=barslast(cross(mac,c))+1; ee:=barslast(type(1)=2)<=15 or barslast(type(1)=4)<=15; cc:=type(1)=2 and c>mac and 条件A and ee=0 ; dd:=type(1)=4 and c<mac and 条件B and ee=0 ; if cc and all(c>mac,6)=1 and count(cc,n1)=1 then begin
buy(1,oq,market);
end if dd and all(c<mac,6)=1 and count(dd,n2)=1 then begin
buyshort(1,oq,market);
end 可是它不会开仓,是不是哪里写错了?
|
|
-- 作者:FireScript -- 发布时间:2020/1/16 13:29:33 -- 你用到了type这类函数。这里函数参与第一次开仓时候都会有点问题。因为前面肯定是没有开平之类的。count(cc,n1)=1 这个条件就有问题了。所以如果是其他不依赖开平信号的条件可以,但是刚好你这里用了 就不行。 |
|
-- 作者:FireScript -- 发布时间:2020/1/16 14:10:56 -- 考虑下用全局变量处理吧。 VARIABLE:mark1:=0; mac:ma(c,5);ee:=barslast(type(1)=2)<=15 or barslast(type(1)=4)<=15; cc:=(type(1)=2 or TYPE(1)=0) and c>mac and ee=0; if cc and all(c>mac,6)=1 and mark1=0 then begin buy(1,1,market); mark1:=1; end if c<mac then mark1:=0;//c<mac的时候重置下这个变量 接触对开仓的限制 |
|
-- 作者:nescol0928 -- 发布时间:2020/1/16 20:40:23 -- 那做空时呢?你上面写的是做多的情况, |