EA仅每日01:10开仓,回测时出现随机开仓问题求助
问题分析与解决方案
你的EA在回测中乱开仓的核心问题出在时间变量的定义位置和回测环境下的时间函数选择,具体问题和修复方案如下:
核心问题1:currentTime 变量未实时更新
你把 datetime currentTime = TimeCurrent(); 写在了 OnTick() 函数外面,这意味着这个变量只会在EA初始化时赋值一次,后续每次触发OnTick时,它不会重新获取当前时间。在回测中,时间是逐步推进的,但这个变量一直停留在EA启动时的初始值,导致时间判断逻辑完全失效,出现随机开仓的情况。
核心问题2:回测环境下误用 TimeCurrent()
TimeCurrent() 是获取当前的电脑系统时间,在实盘/模拟盘的Forward Test中是实时时间,但在Strategy Tester回测时,它会模拟“实时流逝”的时间,和K线的时间(Time[0])并不完全同步,容易导致时间判断偏差。回测中应该用当前K线的时间 Time[0] 来做时间校验。
额外问题:未限制同一时间仅执行一次
即使修复了上面两个问题,同一分钟内OnTick可能会被触发多次,导致重复开仓。需要增加一个标记变量,确保每天的1:10只执行一次开仓逻辑。
修复后的代码示例
// 全局变量:标记当天是否已执行过开仓 bool hasTradedToday = false; datetime tradeTime = D'01:10:00'; void OnTick(){ // 回测中用当前K线时间,实盘也兼容 datetime currentTime = Time[0]; // 先判断日期是否变化,重置标记 if(DayOfYear(currentTime) != DayOfYear(Time[1])){ hasTradedToday = false; } // 时间校验 + 当天未交易的判断 if(TimeHour(currentTime) == TimeHour(tradeTime) && TimeMinute(currentTime) == TimeMinute(tradeTime) && !hasTradedToday){ // 执行你的开仓策略 // strategy // 标记当天已交易,避免重复执行 hasTradedToday = true; } }
补充说明
- 用
Time[0]替代TimeCurrent():回测时,Time[0]是当前正在处理的K线的时间,更贴合回测的时间推进逻辑,避免时间不同步的问题。 - 日期判断重置标记:确保每天的1:10只会执行一次开仓逻辑,不会因为K线周期或OnTick触发次数导致重复操作。
- 变量位置调整:把当前时间的获取放在
OnTick()内部,每次触发时都重新获取最新时间,保证判断逻辑的准确性。
内容的提问来源于stack exchange,提问作者mohaddese abbasi
相关产品推荐
相关产品推荐

