calc_on_every_tick=false与更高时间框架警报触发时机问询
策略警报触发时机问题解答
用户策略代码
strategy(title="Support BOT ALERTS ALL EXCHANGES ", overlay=true , format=format.price, pyramiding = 0, initial_capital = 500, calc_on_every_tick = false, calc_on_order_fills = true, process_orders_on_close = false, default_qty_type = strategy.cash, default_qty_value = 500, commission_type = strategy.commission.percent, commission_value = 0.1, max_labels_count = 500, use_bar_magnifier = true) BuySignal_tf1 = (buy settings) and barstate.isconfirmed f_Buy_TF2() => [buys settings2] BuySignaltf2 = request.security(syminfo.tickerid, '60', f_buy_TF2(), barmerge.gaps_off, barmerge.lookahead_on) if BuySignal_tf1 and BuySignaltf2 and strategy.position_size==0 strategy.entry("Long", strategy.long )
用户问题
启用calc_on_every_tick=false后,若策略引用更高时间框架,警报是否仅在引用的更高时间框架K线收盘时触发?还是该参数仅作用于警报设置的当前时间框架?
回测表现正常,但我不希望警报仅在最高引用时间框架(如4小时)K线收盘时触发,故提前咨询相关建议。
解答
calc_on_every_tick=false的作用范围
这个参数仅作用于当前图表的时间框架(也就是你设置的1分钟图),它控制策略在当前时间框架的单根K线内是否逐tick计算。关闭后,策略只会在当前时间框架的K线收盘时执行一次计算逻辑。跨时间框架信号与警报触发时机
你通过request.security调用的60分钟信号,因为设置了barmerge.lookahead_on,会在1分钟K线运行期间就获取到60分钟框架的最新状态。而calc_on_every_tick=false会让策略只在1分钟K线收盘时检查所有触发条件(包括跨时间框架的信号),所以警报会在1分钟K线收盘时触发,而非等待更高时间框架的K线收盘。
不过需要注意:如果你的f_Buy_TF2()逻辑依赖60分钟K线的收盘状态(比如加入了barstate.isconfirmed),那只有当60分钟K线收盘后,该信号才会更新,此时后续的1分钟K线收盘时才会触发警报。如果跨时间框架信号不需要等待更高时间框架K线收盘,那只要1分钟K线收盘时所有条件满足,就会触发警报。
- 针对需求的建议
- 如果你不想让警报局限于更高时间框架收盘时触发,当前的设置是可行的——因为策略仍会在1分钟K线收盘时检查条件,只要跨时间框架信号提前满足(取决于你的信号逻辑),就会触发警报。
- 若需要更及时的警报,可以考虑开启
calc_on_every_tick=true,但会增加计算量(1分钟图下影响不大)。同时要注意barstate.isconfirmed的使用,避免在未收盘的K线上误触发信号。
内容的提问来源于stack exchange,提问作者Juz
相关产品推荐
相关产品推荐

