TradingView Pine Editor EMA交叉策略设置止盈止损运行报错求助
Pine Script EMA交叉策略报错修复方案
存在的错误点
- 版本声明语法错误:首行
/@version=4不符合Pine Script语法要求,正确写法为//@version=4 - 空仓判断逻辑错误:做空出场、空仓止盈止损线绘制的判断条件错误使用了多头持仓判定
strategy.position_size > 0,空仓时持仓值为负数,应改为strategy.position_size < 0 - 引用未定义变量:空仓出场逻辑中使用了不存在的变量
STP1_Ratio,仅定义了通用的仓位平出比例变量TP1_Ratio,直接复用即可 - 订单ID重复冲突:多空出场订单都使用
TP1、TP2作为ID,会触发系统报错,需区分多头和空头的订单ID - 冗余代码:单独定义的空单止盈止损变量
STP1、STP2、SSL属于冗余代码,原止盈止损计算逻辑已经根据持仓方向自动适配正负值,无需单独定义空单价格变量 - 小笔误:快速均线绘图的标题拼写错误
Fase MA,应为Fast MA
修正后可运行完整代码
//@version=4 strategy(title="EMA交叉多空两档止盈策略", overlay=true, pyramiding=1) // 参数设置 FastPeriod = input(title="快EMA周期", type=input.integer, defval=50, minval=1, group="均线参数") SlowPeriod = input(title="慢EMA周期", type=input.integer, defval=200, minval=1, group="均线参数") TP1Perc = input(title="第一档止盈比例(%)", type=input.float, minval=0.0, step=0.1, defval=2, group="止盈止损参数") TP2Perc = input(title="第二档止盈比例(%)", type=input.float, minval=0.0, step=0.1, defval=3, group="止盈止损参数") SLPerc = input(title="止损比例(%)", type=input.float, minval=0.0, step=0.1, defval=1.25, group="止盈止损参数") TP1_Ratio = input(title="第一档止盈平出仓位比例(%)", type=input.float, defval=50, step=1, group="止盈止损参数", tooltip="例:50代表触发第一档止盈时平掉50%仓位")/100 // 计算均线 fastEMA = ema(close, FastPeriod) slowEMA = ema(close, SlowPeriod) // 交易信号 enterLong = crossover(fastEMA, slowEMA) enterShort = crossunder(fastEMA, slowEMA) // 绘制均线 plot(series=fastEMA, color=color.green, title="快EMA") plot(series=slowEMA, color=color.red, title="慢EMA") // 百分比转价格计算函数 percentAsPoints(pcnt) => strategy.position_size != 0 ? round(pcnt / 100.0 * strategy.position_avg_price / syminfo.mintick) : float(na) current_position_size = abs(strategy.position_size) initial_position_size = abs(valuewhen(strategy.position_size[1] == 0.0, strategy.position_size, 0)) // 止盈止损价格自动适配多空方向 TP1 = strategy.position_avg_price + percentAsPoints(TP1Perc) * syminfo.mintick * strategy.position_size / abs(strategy.position_size) TP2 = strategy.position_avg_price + percentAsPoints(TP2Perc) * syminfo.mintick * strategy.position_size / abs(strategy.position_size) SL = strategy.position_avg_price - percentAsPoints(SLPerc) * syminfo.mintick * strategy.position_size / abs(strategy.position_size) // 多头入场与出场 if (enterLong) strategy.entry(id="多单入场", long=true) if strategy.position_size > 0 strategy.exit("多单TP1", from_entry="多单入场", qty = initial_position_size * TP1_Ratio, limit = TP1, stop = SL) strategy.exit("多单TP2", from_entry="多单入场", limit = TP2, stop = SL) // 绘制多头止盈止损线 plot(series=(strategy.position_size > 0) ? TP1 : na, color=color.green, style=plot.style_circles, linewidth=1, title="多头第一档止盈") plot(series=(strategy.position_size > 0) ? TP2 : na, color=color.green, style=plot.style_circles, linewidth=1, title="多头第二档止盈") plot(series=(strategy.position_size > 0) ? SL : na, color=color.red, style=plot.style_circles, linewidth=1, title="多头止损") // 空头入场与出场 if (enterShort) strategy.entry(id="空单入场", long=false) if strategy.position_size < 0 strategy.exit("空单TP1", from_entry="空单入场", qty = initial_position_size * TP1_Ratio, limit = TP1, stop = SL) strategy.exit("空单TP2", from_entry="空单入场", limit = TP2, stop = SL) // 绘制空头止盈止损线 plot(series=(strategy.position_size < 0) ? TP1 : na, color=color.green, style=plot.style_circles, linewidth=1, title="空头第一档止盈") plot(series=(strategy.position_size < 0) ? TP2 : na, color=color.green, style=plot.style_circles, linewidth=1, title="空头第二档止盈") plot(series=(strategy.position_size < 0) ? SL : na, color=color.red, style=plot.style_circles, linewidth=1, title="空头止损")
内容的提问来源于stack exchange,提问作者Jake Tee
相关产品推荐
相关产品推荐

