如何在条件下限制开仓次数?
例如:if cross(ma5,ma60) and 条件A, 开多仓一次,平仓后,只要Ma5没有再次下穿Ma60,那就不再开仓。也就是说在ma5上穿ma60和ma5下穿ma60之间,只开仓一次。
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
我表述错误,应该是从cross(ma5,ma60)后的ma5》ma60,到Ma5《ma60之间,只能开仓一次!
确认下:
1.你这里的开仓条件其实应该是 ma5>ma60 and 条件A 对吧?因为如果用cross的判断,cross成立本身就只在第一次ma5>ma60时满足。
2.在死叉之前 能且只能开仓一次。即使死叉之前平仓了也只开仓一次?
这样做:
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;//当前满足开仓条件且是金叉以来的第一次
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
可是它不会开仓,是不是哪里写错了?
你用到了type这类函数。这里函数参与第一次开仓时候都会有点问题。因为前面肯定是没有开平之类的。count(cc,n1)=1 这个条件就有问题了。所以如果是其他不依赖开平信号的条件可以,但是刚好你这里用了 就不行。
考虑下用全局变量处理吧。
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的时候重置下这个变量 接触对开仓的限制