能否将strategy.risk.max_intraday_filled_orders()函数写入IF语句控制单日交易次数
问题解决方法
问题根源
strategy.risk.max_intraday_filled_orders() 仅对策略的实际成交订单生效,不会限制你自定义编写的alert()函数执行,所以只要validLong条件满足,哪怕策略已经触发了当日开仓上限不再下单,警报还是会正常触发。
你不需要把风险控制函数硬塞到IF判断里,只要新增一个当日交易计数逻辑,同时限制开仓和警报的触发条件即可,修改方案如下:
修改步骤
- 新增换日判断和当日交易计数变量,每日开盘自动重置计数
- 在原有开仓条件
validLong中增加当日交易次数限制 - 触发开仓时同步更新计数,保证当日不会重复触发
修改后完整代码
//@version=4 strategy("Test" , shorttitle="Test - V2", overlay=true, initial_capital =100000, default_qty_value = 8000, pyramiding =0, default_qty_type = strategy.fixed, currency=currency.USD) //Settings pc_prefix = input(title="Symbol Prefix", defval="", type=input.string, group="Settings") //Generate Alert String symbol = pc_prefix + syminfo.ticker pc_entry_alert(direction, sl, tp) => direction + "," + symbol + "," + "sl=" +tostring(sl) + ",tp=" + tostring(tp) // Get user input pipStop = input(title="Pip Stop Amount", defval = 10.0, type=input.float, step=1, group ="PIP Values") pipTP2 = input(title="Pip Take Profit 2", defval = 20.0, type=input.float, step=1, group="PIP Values") // 新增配置:每日最大交易次数 max_daily_trade = input(title="每日最大交易次数", defval=1, minval=1) // 新增:判断是否为新交易日 is_new_day = change(time("D")) != na // 新增:记录当日已触发交易次数 var int daily_trade_count = 0 // 每日开盘重置计数 if is_new_day daily_trade_count := 0 //Strategy maximum number of intraday trades strategy.risk.max_intraday_filled_orders(max_daily_trade) //Getting Previous Session High/Low rp_function(_symbol, _res, _src) => security(_symbol, _res, _src[barstate.isrealtime ? 1:0]) dHigh = rp_function(syminfo.ticker, "D", high[1]) dLow = rp_function(syminfo.ticker, "D", low[1]) plot(dHigh, color=color.blue) plot(dLow, color=color.orange) //Defining the Trade goLongCondition1 = close> dHigh // Entry Condition for setup 新增当日交易次数限制 validLong = strategy.position_size == 0 and goLongCondition1 and daily_trade_count < max_daily_trade // Calculate our stop distance & size for the current bar longStopPrice = close - pipStop longStopDistance = close - longStopPrice longTargetPrice2 = close + pipTP2 longEntryPrice = validLong? close:na // Save trade stop & target & position size if a valid setup is detected var tradeLongStopPrice = 0.0 var tradeLongTargetPrice2 = 0.0 var tradeLongEntryPrice = 0.0 // Detect valid long setups & trigger alert if validLong tradeLongStopPrice := longStopPrice tradeLongTargetPrice2 := longTargetPrice2 tradeLongEntryPrice := longEntryPrice // 新增:当日交易计数+1,避免当天重复触发 daily_trade_count := daily_trade_count + 1 //Alerts if validLong alert_string = pc_entry_alert("buy",tradeLongStopPrice, tradeLongTargetPrice2) // 可根据需求修改警报频率:freq_once_per_bar_close为每根K线收盘仅触发1次,避免盘中反复触发 alert(alert_string, alert.freq_once_per_bar_close) strategy.entry(id="Long", long=strategy.long) // Exit trades whenever our stop or target is hit strategy.exit(id="LTP1", from_entry="Long", limit=tradeLongTargetPrice2, stop=tradeLongStopPrice, when=strategy.position_size > 0, qty_percent = 100)
额外说明
- 如果你需要当日平仓后还可再次开仓,只需要在平仓逻辑中新增
daily_trade_count := daily_trade_count - 1即可 - 代码中已将警报频率修改为每根K线收盘仅触发1次,避免盘中价格波动反复触发同个信号的警报,你可以根据自己的需求改回
alert.freq_all
内容的提问来源于stack exchange,提问作者dmikes
相关产品推荐
相关产品推荐

