无法将止损移至盈亏平衡点:多仓位场景下的技术问题咨询
多空共存策略中盈亏平衡止损触发条件的记录方案
问题说明
当entry_condition满足时开多单,需要程序记录将止损移至入场点(盈亏平衡点)的触发条件。尝试在if块内用var定义变量存储参数,但外部代码无法识别;添加或移除var修饰符结果一致。由于策略支持多空仓位共存,strategy.position_size无法直接适用,需要修复方案或替代方法。
原测试代码:
if entry_condition var BEcondition = low - 1 * (high - low) var BE = low var BEbar = "Short1" + str.tostring(bar_index) if close == BEcondition strategy.exit("Short BE", BEbar, stop = BE)
修复方案
问题核心在于var定义的是全局变量,多仓位开仓时会被新值覆盖,且无法区分不同仓位的信息。改用数组存储每个仓位的独立参数,结合订单ID关联对应仓位,就能解决多空共存下的跟踪问题。
修改后的代码示例
// 初始化三个数组,分别存储每个仓位的盈亏平衡触发条件、止损价、订单ID var array<float> beConditions = array.new_float() var array<float> beLevels = array.new_float() var array<string> beOrderIds = array.new_string() if entry_condition // 执行开多单,获取当前订单的唯一ID longOrderId = strategy.entry("Long Position", strategy.long) // 计算当前仓位的盈亏平衡触发条件和止损价 currentBEcondition = low - 1 * (high - low) currentBE = low // 将当前仓位的信息存入数组 array.push(beConditions, currentBEcondition) array.push(beLevels, currentBE) array.push(beOrderIds, str.tostring(longOrderId)) // 遍历数组,逐个检查每个仓位的触发条件 for i = 0 to array.size(beConditions) - 1 if close == array.get(beConditions, i) // 对符合条件的仓位执行止损移动操作 strategy.exit("BE Stop Move", array.get(beOrderIds, i), stop = array.get(beLevels, i)) // 触发后移除该仓位的信息,避免重复检查 array.remove(beConditions, i) array.remove(beLevels, i) array.remove(beOrderIds, i) break // 移除元素后索引会变化,跳出循环避免报错
方案说明
- 数组可以动态存储多个仓位的参数,每个开仓动作都会新增一组独立数据,不会互相覆盖。
- 使用
strategy.entry返回的订单ID来关联对应仓位,确保多空共存时能精准操作目标仓位,避开strategy.position_size无法区分多空的局限性。 - 触发止损移动后从数组中移除对应元素,防止后续循环重复触发同一仓位的操作。
内容的提问来源于stack exchange,提问作者0BLaKo
相关产品推荐
相关产品推荐

