本帖最后由 技术009 于 2023-9-4 14:48 编辑
想了下 应该也有处理办法,就是你在循环中累计需要平仓的手数 。循环结束时候按照这个手数平仓,这样就算 你历史开仓有多个同时满足止盈或者止损 实际交易时候也会 成功执行,不会被系统过滤掉信号。
测试代码:
[PEL] 复制代码 variable:enterprices[10000]:=0;//每次开仓价格
variable:i:=0; //独立开仓次数
variable:j:=1;//未平仓位起始序号
variable:q:=1;
input:zs(1);
kd:mod(todaybar,3)=0;
if kd then begin
开多:buy(kd,1,thisclose);
i:=i+1; //记录独立的开仓次数
enterprices[i]:=enterprice; //记录每次开仓价格
end
record:=0; //是否已经记录未平仓位起始序号
if holding>0 && enterbars>0 then begin
zs_n:0;
zy_n:0;
for k=j to i do begin //从未平仓位起始序号开始循环
if enterprices[k]=0 then
begin
continue;
end
pd1:c <enterprices[k]-15*mindiff; //低于第k次开仓价格1%平仓
pd2:c >enterprices[k]+20*mindiff; //高于第k次开仓价格1%平仓
if not(pd1 || pd2) && record=0 then //如果当前价格不满足k次开仓的平仓价格,则记录未平仓位序号
begin
q:=j; //记录未平仓位序号
record:=1;
continue;
end
if pd1 then
begin
zs_n:=zs_n+1;
enterprices[k]:=0;
end
if pd2 then
begin
zy_n:=zy_n+1;
enterprices[k]:=0;
end
end
止损:sell(zs_n>0,zs_n,thisclose); //平多信号
止盈:sell(zy_n>0,zy_n,thisclose); //平多信号
record:=0;//重置下
j:=q;
end
在螺纹上测试的效果,感觉没啥大问题。
上面这个思路得话,后台图表都有效,也不需要考虑循环内相同语句信号被过滤问题了,因为满足条件的次数折算成平仓手数了 只需要2个在循环外的语句去执行就行了。 |