如何实现仅向上递增的5%步长Trailing Stop?
解决追踪止损仅向上移动的问题
核心问题分析
当前代码的止损会随价格回落降低,原因是没有保留历史最高止损值,每次直接基于当前价格计算止损,导致价格回调时止损同步下降。要实现止损仅向上移动,关键是用变量记录并保留历史最高止损价,仅在新计算的止损价更高时更新。
具体修改方案
以下是针对你需求的代码调整,优先实现首次递增+止损只升不降:
// 定义全局变量存储当前生效的最高止损(var关键字确保变量不随K线重置) var float highestActiveStop = na // 开仓时初始化初始止损(示例为入场价的95%,可根据你的策略调整) if (strategy.position_size != 0 and strategy.position_size[1] == 0) highestActiveStop := strategy.entry_price * 0.95 // 1. 首次递增条件:价格较入场价上涨5% firstTrailTrigger = close >= strategy.entry_price * 1.05 // 首次递增后的止损价(示例设置为入场价,即保本止损,可按需修改) firstTrailStop = strategy.entry_price // 2. 常规追踪止损计算:当前价格下浮5%的止损价 regularTrailStop = close * 0.95 // 确定当前候选止损:优先触发首次递增,之后用常规追踪止损 currentCandidateStop = firstTrailTrigger ? firstTrailStop : regularTrailStop // 核心逻辑:仅保留更高的止损价,确保止损不会向下移动 highestActiveStop := math.max(highestActiveStop, currentCandidateStop) // 使用更新后的最高止损执行平仓 strategy.exit("Trailing Exit", stop=highestActiveStop)
关键修改说明
var变量:highestActiveStop用var声明,只会在脚本启动时初始化一次,后续K线不会重置,用来持久化记录历史最高止损。math.max()限制:每次计算候选止损后,只取候选值和历史最高值的较大者,彻底避免止损随价格回落降低。- 首次递增优先级:单独判断价格是否达到入场价的105%,优先触发首次止损上调,满足你“优先实现首次递增”的需求。
自定义调整建议
- 你可以修改初始止损的比例(比如把
strategy.entry_price * 0.95改成你需要的初始止损幅度)。 - 首次递增后的止损价也可调整,比如设置为
strategy.entry_price * 1.05 * 0.95(即价格上涨5%后,止损设在当前价格的95%)。 - 常规追踪的5%幅度可通过修改
close * 0.95中的0.95来调整(比如0.9对应10%追踪幅度)。
内容的提问来源于stack exchange,提问作者Tom humphries
相关产品推荐
相关产品推荐

