等级: 免费版
- 注册:
- 2022-1-15
- 曾用名:
|
楼主 |
发表于 2024-12-18 10:07
|
显示全部楼层
查到原因了,是every(,barpos-enterBar)函数造成的.以前从来没注意到这个问题,但是在小周期,大样本测试的时候差距非常明显
VARIABLE:enterBar=0;
M:=26;
N10:=2;
MID : MA(c,M),LINETHICK2;
MAS:MA(MID,4),LINEDOT;
istd:STD(c,M),NODRAW;
UPPER1: MID + N10*istd;
LOWER1: MID - N10*istd;
dk:=cross(c,LOWER1);
if dk and holding=0 then
begin
buy(1,2,MARKETR);
enterbar:=barpos;
END
/////////////////写法一:耗时5分53秒
dp1:=cross(lower1,c);
cond1:=every(mid<mas,barpos-enterBar);
cond2:=every(mid<ref(mid,1),barpos-enterBar);
cond3:=every(mas<ref(mas,1),barpos-enterBar);
cond4:=every(mid<ref(mid,2),barpos-enterBar);
dp2:=(cond1 or cond2 or cond3 or cond4 ) and barpos-enterBar>10;
if holding>0 and (dp1 or dp2) then
begin
sell(1,2,marketr);
END
/////////////////写法二:耗时1分35秒
dp1:=cross(lower1,c);
cond1:=every(mid<mas,barpos-enterBar+1);
cond2:=every(mid<ref(mid,1),barpos-enterBar+1);
cond3:=every(mas<ref(mas,1),barpos-enterBar+1);
cond4:=every(mid<ref(mid,2),barpos-enterBar+1);
dp2:=(cond1 or cond2 or cond3 or cond4 ) and barpos-enterBar>10;
if holding>0 and (dp1 or dp2) then
begin
sell(1,2,marketr);
END
/////////////////写法三:耗时5分51秒,说明pel语言不具备短路求值的功能
dp1:=cross(lower1,c);
dp2:=barpos-enterBar>10 and (every(mid<mas,barpos-enterBar) or every(mid<ref(mid,1),barpos-enterBar) or every(mas<ref(mas,1),barpos-enterBar) or every(mid<ref(mid,2),barpos-enterBar));
if holding>0 and (dp1 or dp2) then
begin
sell(1,2,marketr);
END
/////////////////写法四:耗时1分33秒.说明exist函数不存在这个问题
dp1:=cross(lower1,c);
cond1:=not(exist(mid>mas,barpos-enterBar));
cond2:=not(exist(mid>ref(mid,1),barpos-enterBar));
cond3:=not(exist(mas>ref(mas,1),barpos-enterBar));
cond4:=not(exist(mid>ref(mid,2),barpos-enterBar));
dp2:=(cond1 or cond2 or cond3 or cond4 ) and barpos-enterBar>10;
if holding>0 and (dp1 or dp2) then
begin
sell(1,2,marketr);
END |
|