TradingView 1分钟策略警报触发却未显示在交易列表的原因咨询
核心原因分析
1. 警报与策略订单的触发逻辑脱节
你的警报直接基于buy_signal/sell_signal的交叉条件设置,但策略里的订单执行还额外加入了buy_signal_1_alert_triggered状态判断——警报只检查信号是否满足,不关心策略内部的状态变量,因此会出现信号触发警报,但因状态变量限制,策略未生成订单的情况。
2. 时间过滤逻辑未生效
你定义了testPeriod()函数用于限制回测时间,但代码里没有在订单执行的条件中加入这个判断。如果警报在testPeriodStart之前或testPeriodStop之后触发,策略不会生成订单,但警报依然会触发。
3. 订单填充与计算设置的影响
策略初始化时设置了calc_on_order_fills=false,这个参数会让策略在订单填充时不重新计算。如果实盘中因滑点、流动性不足导致订单未填充,交易不会出现在列表,但警报已经因信号触发。
4. 状态变量的异常卡顿
buy_signal_1_alert_triggered变量仅在卖出信号触发时重置,如果遇到策略重启、信号异常等情况,变量可能卡在true或false状态,导致后续订单无法生成,但警报仍会触发。
可控制的设置与修复方案
1. 让警报条件与策略订单条件完全一致
不要直接用buy_signal作为警报触发条件,而是把策略里订单执行的完整条件作为警报条件,比如:
// 买入警报条件 buy_signal and not buy_signal[1] and not buy_signal_1_alert_triggered and testPeriod() // 卖出警报条件 sell_signal and not sell_signal[1] and buy_signal_1_alert_triggered and testPeriod()
这样只有当策略真正会生成订单时,警报才会触发。
2. 修复策略的时间过滤逻辑
在订单执行的if语句中加入testPeriod()判断,确保只有在指定时间范围内才生成订单:
if buy_signal and not buy_signal[1] and not buy_signal_1_alert_triggered and testPeriod() strategy.close("sell") strategy.entry('Buy', strategy.long) buy_signal_1_alert_triggered := true else if sell_signal and not sell_signal[1] and buy_signal_1_alert_triggered and testPeriod() strategy.close("Buy") strategy.entry('sell', strategy.short) buy_signal_1_alert_triggered := false
3. 优化状态变量的重置逻辑
添加每日自动重置状态变量的逻辑,避免异常卡顿:
// 每日开盘时重置状态变量 if ta.change(time("D")) buy_signal_1_alert_triggered := false
4. 绑定警报与策略订单(推荐)
放弃手动设置警报,改用策略内置的strategy.alert()函数,只有当订单生成时才触发警报。比如在strategy.entry后添加:
if buy_signal and not buy_signal[1] and not buy_signal_1_alert_triggered and testPeriod() strategy.close("sell") strategy.entry('Buy', strategy.long) buy_signal_1_alert_triggered := true strategy.alert("买入订单已生成", alert.freq_once_per_bar_close) // 绑定警报
5. 调整订单填充相关设置
- 将
calc_on_order_fills改为true,让策略在订单填充后重新计算,确保交易状态同步。 - 实盘时设置合理的滑点值(当前
slippage=0,建议根据交易品种调整),避免因滑点导致订单未填充。
代码中的其他潜在问题修正
当前代码中每次Bar都会重新设置strategy.exit,可能导致止盈止损被重复覆盖,建议只在开仓时设置一次:
// 开仓时设置止盈止损,而非每次Bar都设置 if buy_signal and not buy_signal[1] and not buy_signal_1_alert_triggered and testPeriod() strategy.close("sell") strategy.entry('Buy', strategy.long) buy_signal_1_alert_triggered := true strategy.exit('Stop Loss',from_entry='Buy', limit=tp1_y[0]) // 移到开仓逻辑内 if sell_signal and not sell_signal[1] and buy_signal_1_alert_triggered and testPeriod() strategy.close("Buy") strategy.entry('sell', strategy.short) buy_signal_1_alert_triggered := false strategy.exit('Stop Loss',from_entry='sell', limit=tp1_y[0]) // 移到开仓逻辑内
内容的提问来源于stack exchange,提问作者user1047873

