strategy.close()触发警报但未平仓的技术问题咨询
交易策略平仓异常排查
我编写了一个交易策略,设置的警报消息已出现在警报列表中,但对应仓位并未在交易列表中平仓。前三个仓位均正常平仓,唯独position #4平仓失败,理论上该仓位应该被平仓。
相关代码
平仓执行代码
strategy.close("position #" + str.tostring(pyramidClosed), alert_message="TRADE" + alertMessage)
其中pyramidClosed是递增变量,用于按时间顺序平仓。
警报消息生成代码
alertMessage := "#5 - Decrease buying position" + " " + "(+)Diff.: " + str.tostring(diff) + "% " + "Sold " + str.tostring(TradeBaseSize) + " " + syminfo.basecurrency + " for " + str.tostring(TradeCurrencySize) + " " + syminfo.currency + " " + "Last: " + str.tostring(last_price) + " " + "Actual: " + str.tostring(actual_price) + " " + "Time5: " + str.tostring(timediff) + " " + "DCA: " + str.tostring(DCA) + " " + "Pos.: " + "position #" + str.tostring(pyramidClosed) + " " + " "
可能的问题原因
- 仓位名称不匹配:确认触发平仓时
pyramidClosed的实际值是否为4。如果变量递增逻辑出错,生成的position #4可能和开仓时的仓位名称不一致,导致strategy.close无法定位目标仓位。可以在代码中添加日志输出,对比开仓与平仓的仓位名称。 - 平仓条件未触发:
strategy.close的执行可能依赖隐含的市场条件(如当前K线的价格范围、时间戳),即使警报触发,若这些条件不满足,指令会被跳过。建议添加调试代码,输出触发时的pyramidClosed值、当前仓位数量及价格信息。 - 策略风险设置限制:检查策略的金字塔规则(
strategy.risk.allow_entry_in),若设置了禁止反向开仓或限制平仓次数,可能导致部分平仓指令失效。同时确认账户是否有足够资金完成平仓,或策略是否开启了"仅平仓"模式。 - 变量时序错误:
pyramidClosed的递增时机可能晚于strategy.close的执行,导致实际平仓的是上一个仓位(如position #3),而目标仓位#4未被处理。可以用var声明计数器变量,确保递增逻辑在平仓指令执行前完成。 - 实盘与回测差异:警报触发仅代表逻辑条件满足,但实盘执行可能因网络延迟、交易所API限制、滑点设置差异等导致失败。对比回测与实盘的交易日志,确认平仓指令是否在实盘中被正确发送。
内容的提问来源于Stack Exchange,提问作者Czár Iván
相关产品推荐
相关产品推荐

