You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从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

火山引擎 最新活动