将带嵌套条件运算符的Pine Script语句改写为MQL5可读if-else代码求助
dlong取值逻辑判断
你的判断是对的,这段Pine Script里确实遵循 0代表false,大于0代表true 的逻辑规则。不过注意dlong本质是多头持仓周期计数器,不是纯布尔值:等于1代表首次触发多头开仓信号,大于1代表多头持仓已延续的周期数,等于0代表无多头持仓。
Pine代码转高可读性if/else结构(兼容MQL5)
原代码是嵌套三元运算符,我们先拆解逻辑再改写:
原逻辑执行顺序:
- 取上一根K线的dlong值,
nz(dlong[1])处理空值,无历史值时返回0- 如果上周期dlong大于0(持有多头):
- 触发多头平仓信号
elong==1时,dlong设为0- 未触发平仓则dlong在上周期基础上加1,计数持仓周期
- 如果上周期dlong不大于0(无多头持仓):
- 触发多头开仓信号
long==true时,dlong设为1- 未触发开仓则dlong保持0
通用易读版伪代码
// 初始化默认值 dlong = 0; // 取上一周期dlong值,空值默认返回0 prev_dlong = nz(dlong[1], 0); if (prev_dlong > 0) { // 已持有多头的分支逻辑 if (elong == 1) { dlong = 0; } else { dlong = prev_dlong + 1; } } else { // 未持有多头的分支逻辑 if (long == true) { dlong = 1; } else { dlong = 0; } }
MQL5适配版本
MQL5没有原生nz函数,需要自行处理首根K线的空值问题,假设dlong已定义为全局序列变量:
int dlong = 0; int prev_dlong = 0; // 处理上一周期dlong空值:非首根K线取偏移1的值,首根K线默认0 if(prev_calculated > 0) { prev_dlong = dlong[1]; } if(prev_dlong > 0) { if(elong == 1) { dlong = 0; } else { dlong = prev_dlong + 1; } } else { if(long) { dlong = 1; } else { dlong = 0; } }
内容的提问来源于stack exchange,提问作者ip4utrader
相关产品推荐
相关产品推荐

