Pine Script技术问询:如何遍历5个订单ID找到未开仓的多单ID?
在Pine Script中筛选未关联持仓的独立订单ID
你需要基于同一个多单开仓条件,从5个独立的strategy.order订单ID里找出未被strategy.opentrades.entry_id()关联到当前持仓的ID——因为每个订单需要独立平仓逻辑,无法使用金字塔加仓功能。
你当前把持仓订单ID拼接成字符串的方式不利于后续判断,换成数组存储会更高效、易维护,以下是具体实现方案:
实现步骤
- 用数组存储当前持仓的订单ID,方便快速判断某个ID是否已在持仓中
- 定义所有可用的目标订单ID列表
- 遍历可用ID,找到第一个未在持仓数组中的ID,用于触发新的开仓指令
完整代码示例
//@version=5 strategy("独立订单开仓筛选", overlay=true, initial_capital=10000, default_qty_type=strategy.cash, default_qty_value=2000, pyramiding=0) // 定义所有可用的5个订单ID var string[] availableOrderIds = array.new_string(5, "order_1", "order_2", "order_3", "order_4", "order_5") // 多单开仓条件(替换成你的实际条件) longCondition = ta.crossover(ta.sma(close, 5), ta.sma(close, 20)) // 存储当前持仓的订单ID数组 var string[] openTradeOrderIds = array.new_string() if barstate.islast // 清空数组并重新填充当前持仓的订单ID array.clear(openTradeOrderIds) for idx = 0 to strategy.opentrades - 1 array.push(openTradeOrderIds, strategy.opentrades.entry_id(idx)) // 筛选未持仓的订单ID string freeOrderId = na for id in availableOrderIds if not array.includes(openTradeOrderIds, id) freeOrderId = id break // 找到第一个可用ID就停止遍历 // 触发开仓:当满足条件且有可用ID时 if longCondition and not na(freeOrderId) strategy.entry(freeOrderId, strategy.long) // 示例独立平仓逻辑(每个ID对应自己的平仓条件,此处用固定止损示例) for id in availableOrderIds if strategy.opentrades > 0 for idx = 0 to strategy.opentrades - 1 if strategy.opentrades.entry_id(idx) == id strategy.exit(id + "_exit", id, stop=strategy.opentrades.entry_price(idx) * 0.95)
代码解释
- 可用订单ID数组:
availableOrderIds预定义了5个独立的订单ID,可根据需求修改命名规则 - 持仓ID数组维护:每次最后K线时,清空并重新收集当前所有持仓的订单ID,确保数据实时准确
- 筛选逻辑:遍历可用ID,用
array.includes()判断是否已在持仓中,找到第一个未被使用的ID就停止遍历,避免无效循环 - 独立平仓:遍历每个订单ID,针对该ID对应的持仓设置独立平仓规则(示例用了固定止损,可替换为你需要的平仓条件)
内容的提问来源于stack exchange,提问作者MENTORJJ
相关产品推荐
相关产品推荐

