以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  公式模型编写问题提交  (http://222.73.7.161/bbs/list.asp?boardid=4)
----  [求助]帮忙看看程序是否正确  (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=171257)

--  作者:llcly
--  发布时间:2019/7/24 10:54:14
--  [求助]帮忙看看程序是否正确
需求:在TRIX(6,10)金叉内,每次DMA(6,10,6)金叉时,开多。
         每次DMA死叉时,如果有盈利,平仓,否则等TRIX死叉时平仓。
程序:
VARIABLE: FLAG1=0;

//DMA(S,P,M)二线
DDD:=(MA(CLOSE,S)-MA(CLOSE,P));
AMA:=MA(DDD,M);

//TRIX(N1,M1)线
TR3:= EMA(EMA(EMA(CLOSE,N1),N1),N1);
TRIX3 : (TR3-REF(TR3,1))/REF(TR3,1)*100,LINETHICK0;
TRML3 :  MA(TRIX3,M1),LINETHICK0;

DMA金叉 := CROSS(DDD,AMA);
DMA死叉 := CROSS(AMA,DDD);

TRIX3金叉 := CROSS(TRIX3,TRML3);
TRIX3死叉 := CROSS(TRML3,TRIX3);

IF TRIX3金叉=1 THEN
FLAG1 :=1;
IF TRIX3死叉=1 THEN
FLAG1 :=0;
IF FLAG1=1 THEN
BEGIN
IF DMA金叉=1 THEN
  BEGIN
开多1:BUY(HOLDING=0,NUM,MARKET);
    FLAG1:=0;
        END;
END;
IF DMA死叉=1 THEN
BEGIN
    IF NUMPROFIT(1)>0 THEN
       
        平多1: SELL(HOLDING>0,NUM,MARKET);
        
ELSE
BEGIN
   IF TRIX3死叉=1 THEN
      
           平多2: SELL(HOLDING>0,NUM,MARKET);
          
     END;
END;            

--  作者:wenarm
--  发布时间:2019/7/24 13:24:05
--  

不对的几点地方如下:

1,TRIX3金叉 := CROSS(TRIX3,TRML3);

CROSS返回的是交叉时的状态(某根k上是1,不能代码一个范围),所以在交叉之后,TRIX3>TRML3的情况下,TRIX3金叉 := CROSS(TRIX3,TRML3);返回值一样是0.

2.您说的盈利指的应该是持仓的浮动盈亏,不是平仓盈亏,所以NUMPROFIT(1)是不合理的,他只能返回上次平仓时的结果。

注:下面修改中使用OPENPROFIT函数,并且规定了大于0。

3.根据第一点,所以不需要使用全局变量进行标记。

 

代码修改如下:

//DMA(S,P,M)二线
DDD:=(MA(CLOSE,S)-MA(CLOSE,P));
AMA:=MA(DDD,M);

//TRIX(N1,M1)线
TR3:= EMA(EMA(EMA(CLOSE,N1),N1),N1);
TRIX3 : (TR3-REF(TR3,1))/REF(TR3,1)*100,LINETHICK0;
TRML3 :  MA(TRIX3,M1),LINETHICK0;


DMA金叉 := CROSS(DDD,AMA);
DMA死叉 := CROSS(AMA,DDD);


TRIX3金叉 := TRIX3>TRML3;
TRIX3死叉 := TRML3>TRIX3;

 

 

if TRIX3金叉=1 and DMA金叉=1 then begin
 开多1:BUY(HOLDING=0,NUM,MARKET);
end


if DMA死叉=1 and ( OPENPROFIT>0 or TRIX3死叉=1 ) then begin
 平多1: SELL(HOLDING>0,NUM,MARKET);
end


--  作者:llcly
--  发布时间:2019/7/25 9:18:28
--  
非常感谢