如何获取入场价前一根K线高低点用于止损止盈设置
基于入场前一根K线高低点设置止损止盈的实现方法
核心逻辑:在入场信号触发的判断逻辑块内,直接取信号触发时点往前偏移1个周期的已收盘K线,读取其最高价、最低价字段即可,不要使用未走完的实时K线数据避免数值漂移。
关键规则
- 多空方向匹配:做多时止损设在前根K线最低点下方(可根据品种点差加少量缓冲避免被毛刺扫损),止盈可按预设盈亏比计算对应点位;做空时止损设在前根K线最高点上方。
- 严格对齐信号时点:取值时点必须和入场条件判定时点完全一致,禁止在开仓成交后再回头取K线数据,避免引入未来函数导致回测结果失真。
- 偏移量适配触发逻辑:如果你的策略设置为「等当根K线收盘后才确认信号开仓」,此时需要往前偏移2个周期取值——因为信号确认时,触发信号的那根K线已经成为索引为1的已收盘K线,它的前一根K线索引为2,不要硬套偏移量1导致取错K线。
常用交易开发框架代码示例
TradingView Pine Script
// 做多示例 long_signal = ta.crossover(ta.ema(close,12), ta.ema(close,26)) if long_signal prev_high = ta.high[1] prev_low = ta.low[1] entry = close sl = prev_low - syminfo.mintick * 2 // 加2个最小变动单位做缓冲 tp = entry + (entry - sl) * 2 // 1:2盈亏比 strategy.entry("long", strategy.long) strategy.exit("long_exit", "long", stop=sl, limit=tp) // 做空示例 short_signal = ta.crossunder(ta.ema(close,12), ta.ema(close,26)) if short_signal prev_high = ta.high[1] prev_low = ta.low[1] entry = close sl = prev_high + syminfo.mintick * 2 tp = entry - (sl - entry) * 2 strategy.entry("short", strategy.short) strategy.exit("short_exit", "short", stop=sl, limit=tp)
Pine Script中[n]是K线索引,[0]为当前K线,[1]为紧邻的前一根已收盘K线,直接读取high/low字段即可拿到对应高低价。
Python Backtrader
class SLTPStrategy(bt.Strategy): params = (('fast', 12), ('slow', 26), ('rr', 2)) def __init__(self): self.fast_ema = bt.indicators.EMA(self.data.close, period=self.p.fast) self.slow_ema = bt.indicators.EMA(self.data.close, period=self.p.slow) self.cross = bt.indicators.CrossOver(self.fast_ema, self.slow_ema) def next(self): if not self.position: # 做多信号 if self.cross[0] == 1: # 索引-1对应前一根已收盘K线 prev_low = self.data.low[-1] entry = self.data.close[0] sl = prev_low - 0.0002 // 针对外汇品种加2点缓冲 tp = entry + (entry - sl) * self.p.rr self.buy(slprice=sl, price=tp) // 做空信号 elif self.cross[0] == -1: prev_high = self.data.high[-1] entry = self.data.close[0] sl = prev_high + 0.0002 tp = entry - (sl - entry) * self.p.rr self.sell(slprice=sl, price=tp)
Backtrader中[0]为当前处理的K线,[-1]为前一根已收盘K线,直接访问data.high/data.low对应索引即可取值。
MQL5 (MT5)
void OnTick() { if (PositionsTotal() == 0) { // 金叉做多、死叉做空信号判断可根据自身策略替换 bool long_signal = /* 自定义做多判断逻辑 */; bool short_signal = /* 自定义做空判断逻辑 */; if (long_signal) { // K线索引0为当前未走完K线,1为前一根已收盘K线 double prev_low = iLow(_Symbol, _Period, 1); double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); double sl = prev_low - 10 * _Point; double tp = ask + (ask - sl) * 2; OrderSend(_Symbol, ORDER_TYPE_BUY, 0.1, ask, 10, sl, tp, "long", 0, 0, clrNONE); } if (short_signal) { double prev_high = iHigh(_Symbol, _Period, 1); double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); double sl = prev_high + 10 * _Point; double tp = bid - (sl - bid) * 2; OrderSend(_Symbol, ORDER_TYPE_SELL, 0.1, bid, 10, sl, tp, "short", 0, 0, clrNONE); } } }
MQL系列语言中调用iHigh/iLow函数时,传入索引1即可拿到前一根已收盘K线的高低价。
踩坑提醒:如果回测时发现止损止盈点位和你预期的K线位置对不上,先打印信号触发时点的K线时间、偏移后的K线时间做比对,90%的问题都是偏移量和信号触发逻辑不匹配导致的。
内容的提问来源于stack exchange,提问作者zhenwei tong
相关产品推荐
相关产品推荐

