变量一直是我头疼的问题,写了个移动止损的例子,请高手看看错在哪里,谢谢!
我的想法是,开多后,每一次调整后的再次金叉,当根K线的开盘价即为止损价。
input:ma5(5,1,10,1);
input:ma15(15,1,30,1);
input:ma40(40,1,60,1);
variable:KD=0;
variable:KK=0;
//设置变量
IF HOLDING>0 AND CROSS(MA5,MA15) THEN KD:=OPEN;
KKD:KD;
IF HOLDING<0 AND CROSS(MA15,MA5) THEN KK:=OPEN;
KKK:KK;
//固定平仓规则
IF HOLDING>0 AND CROSS(MA(C,30),MA(C,10)) THEN SELL(1,0,MARKET);
IF HOLDING<0 AND CROSS(MA(C,10),MA(C,30)) THEN SELLSHORT(1,0,MARKET);
//移动平仓规则
IF HOLDING>0 AND CLOSE<=KD THEN
BEGIN
SELL(1,0,MARKET);
KD:=0;
END
IF HOLDING<0 AND CLOSE>=KK THEN
BEGIN
SELLSHORT(1,0,MARKET);
KK:=0;
END
//开仓规则
IF HOLDING=0 AND MA5>MA40 AND MA40>REF(MA40,1) THEN BUY(1,1,MARKET);
IF HOLDING=0 AND MA40<MA5 AND MA40<REF(MA40,1) THEN BUYSHORT(1,1,MARKET);
IF TIME=151500 THEN
BEGIN
KD=0;
KK=0;
END
在开仓规则那里添加上
kd:=open;
kk:=open;
注意多空仓不要搞反了
{
variable:hl=0,aa=0;
if cond and holding>0 and aa=0 then begin
aa:=1;
end
//记录开仓
if h>hl and aa>0 then begin
h:=hl;
end
//记录开仓后的最高价
if hl-h<5*mindiff and aa>0 then begin
sell(1,1,market);
aa:=0;
hl:=0;
end
//最高价回落5个点移动止损离场并把变量初始化,表示移动止损完成。
}
基础移动止损代码,楼主可以看看。
开仓时记录变量,这个我会,可能这个很好判别。
我不是在开仓的时候记录变量,写的时候总是有冲突,虽然在图表上止损价格都能划线出来,但执行不了,会不会要用第二个变量辅助?
修改了下
ma5:=MA(C,5);
ma15:=MA(C,15);
ma40:=MA(C,40);
variable:KD=0;
variable:KK=0;
//设置变量
IF HOLDING>0 AND CROSS(MA5,MA15) THEN KD:=OPEN;
KKD:KD;
IF HOLDING<0 AND CROSS(MA15,MA5) THEN KK:=OPEN;
KKK:KK;
//固定平仓规则
IF HOLDING>0 AND CROSS(MA(C,40),MA(C,15)) THEN SELL(1,0,MARKET);
IF HOLDING<0 AND CROSS(MA(C,15),MA(C,40)) THEN SELLSHORT(1,0,MARKET);
//移动平仓规则
IF HOLDING>0 AND CLOSE<=KD THEN
BEGIN
SELL(1,0,MARKET);
KD:=0;
END
IF HOLDING<0 AND CLOSE>=KK THEN
BEGIN
SELLSHORT(1,0,MARKET);
KD:=0;
END
//开仓规则
IF HOLDING=0 AND MA5>MA40 AND MA40>REF(MA40,1) THEN
BEGIN
BUY(1,1,MARKET);
END
IF HOLDING=0 AND MA40<MA5 AND MA40<REF(MA40,1) THEN
BEGIN
BUYSHORT(1,1,MARKET);
END
IF TIME=151500 THEN
BEGIN
KD=0;
KK=0;
END
移动止损---开多后的每次回调后的均线再次金叉,则记录当根K线的开盘价,此开盘价就是新的止赢价格 。
IF HOLDING>0 AND CROSS(MA5,MA15) THEN KD:=OPEN;
KKD:KD;
IF HOLDING<0 AND CROSS(MA15,MA5) THEN KK:=OPEN;
KKK:KK;
固定平仓规则----------正常的出场条件
IF HOLDING>0 AND CROSS(MA(C,40),MA(C,15)) THEN SELL(1,0,MARKET);
IF HOLDING<0 AND CROSS(MA(C,15),MA(C,40)) THEN SELLSHORT(1,0,MARKET);