You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法将止损移至盈亏平衡点:多仓位场景下的技术问题咨询

多空共存策略中盈亏平衡止损触发条件的记录方案

问题说明

当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:35:01