Pine Script策略中Entry、TP、SL设置与图表显示错位问题求助
Pine Script 限价入场、止损止盈错位问题解决
问题根源
1. 价格自动对齐最小变动单位(Tick Size)
你定义的固定价格(如1.065)会被Pine Script自动调整到当前品种的最小价格变动单位(即tick size)对应的有效价格。比如外汇品种常见的tick size是0.00001,系统会把输入的价格四舍五入到最近的有效tick值,这就是日志输出数值有微小差异的原因。
2. strategy.exit参数使用错误
strategy.exit的profit参数不是设置绝对止盈价格,而是设置相对于入场价的盈利点数(点数基于品种的tick size)。你直接传入绝对价格(如1.061),系统会把它当成盈利点数计算,导致止盈位置完全错位。而stop参数是支持传入绝对止损价格的,这是最容易混淆的点。
修正方案
方案1:用limit参数设置绝对止盈价格
把strategy.exit的profit换成limit,直接传入绝对止盈价格,就能和你绘制的标记对应:
// 定义价格 float shortStopLoss = 1.065 float shortEntry = 1.064 float shortTakeProfit = 1.061 // 绘制价格线 plot(shortStopLoss, "Stop", color.red, 2, plot.style_linebr) plot(shortEntry, "Entry 1", color.white, 2, plot.style_linebr) plot(shortTakeProfit, "Limit 1", color.green, 2, plot.style_linebr) // 下单逻辑:修正strategy.exit的参数 strategy.entry("Enter short LH", strategy.short, limit = shortEntry, qty = 1) // 使用limit设置绝对止盈价,stop设置绝对止损价 strategy.exit("Exit Short LH", from_entry = "Enter short LH", stop = shortStopLoss, limit = shortTakeProfit)
方案2:计算盈利点数(可选)
如果坚持要用profit参数,需要计算止盈价与入场价的点数差(基于品种的tick size):
float tickSize = syminfo.mintick // 计算空单的盈利点数:入场价 - 止盈价,除以tick size float profitPoints = (shortEntry - shortTakeProfit) / tickSize strategy.exit("Exit Short LH", from_entry = "Enter short LH", stop = shortStopLoss, profit = profitPoints)
手动对齐价格到Tick(可选)
如果需要强制让定义的价格严格对齐tick size,可以用math.round()处理:
float tickSize = syminfo.mintick float shortStopLoss = math.round(1.065 / tickSize) * tickSize float shortEntry = math.round(1.064 / tickSize) * tickSize float shortTakeProfit = math.round(1.061 / tickSize) * tickSize
验证方法
修改代码后,查看策略日志中的订单价格,应该和你绘制的标记价格一致(或对齐到最近的有效tick),图表上的入场、止损、止盈位置也会正确对应。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

