TradingView策略开发:如何通过输入字段设置可变Savepoint并触发自动平仓?
问题描述
需要在TradingView策略中实现5个可变百分比止损止盈点(Savepoint),规则如下:
- 自定义信号触发开仓后,设置5个百分比形式的Savepoint(如1%、2%等)
- 价格达到入场价+对应百分比利润时,激活该Savepoint
- 若价格回落至「已激活的最高Savepoint - 0.1%」时,自动平仓
交易示例(ETH/USDT)
Investement: 100$ Initial Crypto Price: 1000 Selling Crypto Price: 1020 Investment Fee: 0% Exit Fee: 0,1% Savepoint1: 0,7% Savepoint2: 1,3% Savepoint3: 2,2% Savepoint4: 3,1% Savepoint5: 4%
当当前利润为1.9%时,已激活的最高Savepoint是Savepoint2(1.3%),触发平仓的价格对应利润为1.2%(即SP2-0.1%)。
现有代码片段
// Savepoints SP1 = input.float(title="Savepoint 1", defval=0.6, minval=0, maxval=100) SP2 = input.float(title="Savepoint 2", defval=1.2, minval=0, maxval=100) var entryPrice = close if tradeSignal strategy.entry("Enter Long", strategy.long) entryPrice := close if close >= entryPrice + (entryPrice * SP1) if close <= entryPrice + (entryPrice * (SP2 - 0.1)) strategy.exit(id="SP2", from_entry = "Enter Long", limit = entryPrice*(1+(SP2-0.1)/100)) if close <= entryPrice + (entryPrice * (SP1 - 0.1)) strategy.exit(id="SP1", from_entry = "Enter Long", limit = entryPrice*(1+(SP1-0.1)/100))
实现方案
核心思路是跟踪已激活的最高Savepoint,当价格回落至该Savepoint减0.1%时触发平仓。具体实现步骤如下:
- 定义5个可配置的百分比Savepoint输入
- 用变量存储入场价和已激活的最高Savepoint,开仓时重置状态
- 实时检查价格突破情况,更新已激活的最高Savepoint
- 判断价格是否回落至目标平仓价,触发平仓操作
完整实现代码
@version=5 strategy("Savepoint Trailing Exit", overlay=true, default_qty_type=strategy.cash, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1) // 1. 定义5个可配置的Savepoint(百分比) SP1 = input.float(title="Savepoint 1 (%)", defval=0.7, minval=0, maxval=100, step=0.1) SP2 = input.float(title="Savepoint 2 (%)", defval=1.3, minval=0, maxval=100, step=0.1) SP3 = input.float(title="Savepoint 3 (%)", defval=2.2, minval=0, maxval=100, step=0.1) SP4 = input.float(title="Savepoint 4 (%)", defval=3.1, minval=0, maxval=100, step=0.1) SP5 = input.float(title="Savepoint 5 (%)", defval=4.0, minval=0, maxval=100, step=0.1) // 2. 状态变量:存储入场价、已激活的最高Savepoint百分比 var float entry_price = na var float activated_sp = 0.0 // 自定义开仓信号示例(可替换为你的实际信号) trade_signal = ta.crossover(ta.sma(close, 50), ta.sma(close, 200)) // 3. 开仓逻辑:重置入场价和激活状态 if (trade_signal) strategy.entry("Enter Long", strategy.long) entry_price := close activated_sp := 0.0 // 开仓时清空之前的激活记录 // 4. 实时更新已激活的最高Savepoint if (strategy.position_size > 0) // 仅持仓时执行检查 // 从最高到最低顺序判断,确保activated_sp始终记录已触发的最高利润点 if (close >= entry_price * (1 + SP5/100)) activated_sp := SP5 else if (close >= entry_price * (1 + SP4/100)) activated_sp := SP4 else if (close >= entry_price * (1 + SP3/100)) activated_sp := SP3 else if (close >= entry_price * (1 + SP2/100)) activated_sp := SP2 else if (close >= entry_price * (1 + SP1/100)) activated_sp := SP1 // 5. 平仓逻辑:价格回落至已激活SP-0.1%时触发 exit_price = entry_price * (1 + (activated_sp - 0.1)/100) if (strategy.position_size > 0 and activated_sp > 0 and close <= exit_price) strategy.close("Enter Long", comment="SP Trailing Exit") // 可选:图表标记平仓价和已激活的Savepoint plot(strategy.position_size > 0 ? exit_price : na, color=color.red, style=plot.style_linebr, title="Exit Level") plot(strategy.position_size > 0 ? entry_price*(1+activated_sp/100) : na, color=color.green, style=plot.style_linebr, title="Activated SP")
代码说明
- 状态重置:每次开仓时重置
activated_sp为0,避免历史持仓状态干扰 - 激活逻辑:从最高Savepoint开始检查,确保
activated_sp始终记录当前已触发的最高利润点 - 平仓触发:仅在持仓、已激活过Savepoint,且价格跌破「激活SP-0.1%」时执行平仓
- 可视化标记:可选的绘图代码能在图表上直观展示当前的止损和平仓位置
内容的提问来源于stack exchange,提问作者slake
相关产品推荐
相关产品推荐

