如何从MQL脚本中获取策略测试器设置的优化周期?
获取MT4/MT5策略测试器「使用数据」的优化周期
我来帮你解决这个问题——你碰到的情况其实很多MT4/MT5开发者都会踩坑:直接用Time[0]拿测试周期,结果拿到的是实际有数据的K线时间,而非你在UI里设置的原始范围。
为什么你的初始代码不行?
先看你的代码:
datetime dtFrom; datetime dtTo; void OnInit(){ dtFrom = Time[0]; //from date } double OnTester(){ dtTo = Time[0]; // to date }
Time[0]返回的是当前环境下最新有数据的K线时间,策略测试器会自动跳过节假日、周末这类无报价的时段,要是测试预算不足导致提前终止,也会拿不到设置的结束时间。这就是为什么你设置2005/01/01-2005/01/29,实际拿到的是2005/01/09-2005/01/28——前几天没报价,29号是周六休市,这些时段根本没有K线,Time[0]自然读不到。
正确获取UI设置的原始周期的方法
要直接拿到策略测试器「使用数据」里设置的起止时间,用MT4/MT5内置的StrategyGetInteger()函数读取系统参数就行,完全不受无数据时段或预算的影响:
datetime dtTestFrom; datetime dtTestTo; void OnInit() { // 读取测试器设置的起始日期 dtTestFrom = (datetime)StrategyGetInteger(STRATEGY_TEST_START_DATE); // 读取测试器设置的结束日期 dtTestTo = (datetime)StrategyGetInteger(STRATEGY_TEST_END_DATE); Print("测试器设置的起始时间: ", TimeToString(dtTestFrom)); Print("测试器设置的结束时间: ", TimeToString(dtTestTo)); }
如果你需要实际参与测试的有效周期
要是你想知道测试真正用到了哪些有数据的时段,可以用CopyTime()遍历所有测试用的K线,取首尾时间:
datetime actualFrom, actualTo; void OnInit() { datetime times[]; int copied = CopyTime(_Symbol, _Period, 0, Bars, times); if(copied > 0) { actualFrom = times[copied - 1]; // 最早的有效K线时间 actualTo = times[0]; // 最新的有效K线时间 Print("实际测试的起始时间: ", TimeToString(actualFrom)); Print("实际测试的结束时间: ", TimeToString(actualTo)); } }
内容的提问来源于stack exchange,提问作者whitebear




