咨询MQL5每根K线仅允许交易1次的功能实现方法
MQL5 单K线仅允许交易1次的功能实现
你原有代码存在以下几个核心问题:
- 逻辑运算符优先级错误:
&&优先级高于||,原判断条件实际等价于(posT == 多单) || (posT是空单 && 不是新K线),多单场景下无论是不是新K线都会标记为已交易,逻辑完全错误- 仅通过持仓判断是否已交易存在漏洞:如果本K线内开单后立即平仓,持仓消失后会被判定为未交易,导致重复开单
- 依赖的原生
NewBar()函数仅在K线生成瞬间返回true,无法支撑全K线周期的交易限制判断
实现思路
- 用静态变量存储上一次发生交易的K线开盘时间、上一根K线的开盘时间,实现全周期的新K线判断
- 新K线生成时重置交易权限,一旦本K线发生过交易,后续整个K线周期都禁止再次交易
- 兼容当前图表任意周期的判断需求
完整实现代码
首先是全周期可用的新K线判断函数,任意时刻调用都能正确返回是否进入新K线:
bool IsNewBar() { static datetime last_bar_time = 0; datetime current_bar_time = iTime(_Symbol, _Period, 0); if(current_bar_time != last_bar_time) { last_bar_time = current_bar_time; return true; } return false; }
其次是交易权限判断和交易标记函数:
// 存储上一次交易的K线时间 static datetime last_trade_bar_time = 0; // 判断当前是否允许交易 bool TradeAllowed() { // 新K线生成时重置交易权限 if(IsNewBar()) { last_trade_bar_time = 0; } datetime current_bar_time = iTime(_Symbol, _Period, 0); // 当前K线未发生过交易则返回允许 return current_bar_time != last_trade_bar_time; } // 开单成功后调用,标记当前K线已完成交易 void MarkTradeDone() { last_trade_bar_time = iTime(_Symbol, _Period, 0); }
使用方法
- 每次执行开单逻辑前,先调用
TradeAllowed(),返回true才执行后续开单操作 - 开单请求成交确认后,调用
MarkTradeDone()标记本K线已交易,后续本K线周期内TradeAllowed()都会返回false - 如需支持多品种多周期交易,可将静态变量改为对应品种+周期的数组存储即可
内容的提问来源于stack exchange,提问作者Youg
相关产品推荐
相关产品推荐

