Pine Script开发:构建关联特定入场条件的出场条件
实现带特定入场条件关联的出场逻辑
需求说明
- 常规出场:满足
ExitCondition1时,直接执行strategy.close(无附加条件) - 条件型出场:仅当满足
ExitCondition2且当前持仓是由指定入场条件触发 时,才执行strategy.close
已尝试的方案及问题
- 变量标记法:初始化变量为0,触发目标入场条件时设为1,出场时判断
exitcondition2 and var == 1,其他场景重置变量。但变量重置时机容易出错,导致标记不准确。 - 入场ID识别法:尝试用
strategy.opentrades.entry_id关联入场条件,但逻辑处理混乱,未成功实现多入场ID的对应出场判断。
原始尝试代码
entryPrice = strategy.opentrades.entry_price(strategy.opentrades - 1) RoundMacNorm = math.round(MacNorm * 100) / 100 RoundTrigger = math.round(Trigger * 100) / 100 RoundMacNormPrev = math.round(MacNorm[1] * 100) / 100 RoundTriggerPrev = math.round(Trigger[1] * 100) / 100 lastOrderID = strategy.opentrades.entry_id(strategy.opentrades - 1) entryid = false goLongCondition1 = (RoundMacNorm < -1.00) and (RoundTrigger < -1.00) goLongCondition2 = (RoundMacNormPrev == -1.00) and (RoundMacNorm == -1.00) goLongCondition3 = ((RoundTriggerPrev == 1.00) and (RoundTrigger > 1.00)) // 补全缺失的括号 goLongCondition4 = ((RoundMacNormPrev < 0.1) and (RoundMacNorm == 1.00)) ExitLongCondition1 = (RoundMacNorm == 1.00) and (RoundTrigger == 1.00) ExitLongCondition2 = (RoundMacNormPrev == 1.00) and (RoundMacNorm < 1.00) goShortCondition1 = (RoundMacNorm == 1.00) and (RoundTrigger == 1.00) goShortCondition2 = (RoundMacNorm[1] == 1.00) and (RoundMacNorm < 1.00) if inTradeWindow and (goLongCondition1 or goLongCondition2) strategy.entry("long", strategy.long) entryid := false if inTradeWindow and (goLongCondition3 or goLongCondition4) strategy.entry("long", strategy.long) entryid:= true if inTradeWindow and goShortCondition1 and entryid == false strategy.entry("short", strategy.short) entryid := false if inTradeWindow and goShortCondition2 and entryid == true strategy.entry("short", strategy.short) entryid := false if inTradeWindow and (ExitLongCondition1 or ExitLongCondition2) strategy.close("long", comment='Exit') entryid := false
修正方案
核心思路
给不同入场条件分配唯一的entry_id,出场时通过strategy.opentrades.entry_id获取当前持仓的入场标识,精准匹配对应的出场条件,避免手动维护标记变量的误差。
修正后代码
// 计算rounded值 RoundMacNorm = math.round(MacNorm * 100) / 100 RoundTrigger = math.round(Trigger * 100) / 100 RoundMacNormPrev = math.round(MacNorm[1] * 100) / 100 RoundTriggerPrev = math.round(Trigger[1] * 100) / 100 // 定义入场条件 goLongCondition1 = (RoundMacNorm < -1.00) and (RoundTrigger < -1.00) goLongCondition2 = (RoundMacNormPrev == -1.00) and (RoundMacNorm == -1.00) goLongCondition3 = (RoundTriggerPrev == 1.00) and (RoundTrigger > 1.00) goLongCondition4 = (RoundMacNormPrev < 0.1) and (RoundMacNorm == 1.00) // 定义出场条件 ExitLongCondition1 = (RoundMacNorm == 1.00) and (RoundTrigger == 1.00) ExitLongCondition2 = (RoundMacNormPrev == 1.00) and (RoundMacNorm < 1.00) goShortCondition1 = (RoundMacNorm == 1.00) and (RoundTrigger == 1.00) goShortCondition2 = (RoundMacNorm[1] == 1.00) and (RoundMacNorm < 1.00) // 入场逻辑:为不同条件分配唯一entry id if inTradeWindow and (goLongCondition1 or goLongCondition2) strategy.entry("long_cond1", strategy.long, id="entry_non_target") // 非目标入场条件 if inTradeWindow and (goLongCondition3 or goLongCondition4) strategy.entry("long_cond2", strategy.long, id="entry_target") // 目标入场条件(对应需求中的EntryCondition5) if inTradeWindow and goShortCondition1 strategy.entry("short_cond1", strategy.short, id="entry_non_target") if inTradeWindow and goShortCondition2 strategy.entry("short_cond2", strategy.short, id="entry_target") // 出场逻辑 if inTradeWindow // 常规出场:无条件关闭对应方向所有持仓 if ExitLongCondition1 strategy.close("long_cond1", comment='Exit_Regular') strategy.close("long_cond2", comment='Exit_Regular') // 条件型出场:仅关闭由目标入场条件触发的持仓 if ExitLongCondition2 // 遍历所有持仓,匹配目标入场ID for i = 0 to strategy.opentrades - 1 currentEntryID = strategy.opentrades.entry_id(i) if currentEntryID == "entry_target" and strategy.opentrades.size(i) > 0 strategy.close(strategy.opentrades.entry_id(i), comment='Exit_Conditional')
关键说明
- 入场ID标记:在
strategy.entry中通过id参数为不同入场条件设置唯一标识,确保每笔持仓都能追溯到对应的入场触发条件。 - 出场逻辑匹配:
- 常规出场直接关闭对应方向的所有持仓;
- 条件型出场通过遍历当前所有持仓,检查每笔持仓的
entry_id是否为目标标识,仅关闭符合条件的持仓。
- 可靠性提升:依赖平台内置的
strategy.opentrades系列函数获取持仓信息,避免手动维护标记变量带来的逻辑误差。
内容的提问来源于stack exchange,提问作者Koby Liberman
相关产品推荐
相关产品推荐

