以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (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
--  
确认下:
1.你这里的开仓条件其实应该是 ma5>ma60 and 条件A  对吧?因为如果用cross的判断,cross成立本身就只在第一次ma5>ma60时满足。//是的,ma5>ma60和条件A开仓,
2.在死叉之前 能且只能开仓一次。即使死叉之前平仓了也只开仓一次?//是的,在死叉之前平仓了,但又符合ma5》ma60和条件A,也不开仓了


--  作者: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
--  
那做空时呢?你上面写的是做多的情况,