Мультивалютное тестирование в MT5: обход ограничений тестера

Мультивалютное тестирование в MT5: обход ограничений тестера MQL4 / MQL5 (MetaTrader)
Пошаговое руководство по обходу ограничений тестера стратегий MT5 для портфельного бэктестинга. Исходный код мультивалютного советника на MQL5.
Суть: Для обхода ограничения тестера MT5, который оптимизирует советники только по одному выбранному инструменту, применяется архитектура единого мультивалютного агента. Мы программно подписываемся на нужные активы через SymbolSelect, принудительно синхронизируем их исторические данные в OnInit с помощью CopyTime и обрабатываем весь портфель в едином цикле внутри OnTick на базовом графике.

Исходный код

Ниже представлен шаблон профессионального мультивалютного советника, который решает проблему синхронизации истории и позволяет проводить полноценное портфельное тестирование на любых таймфреймах.

//+------------------------------------------------------------------+
//|                                            PortfolioTester.mq5   |
//|                                  Copyright 2024, Quant Developer |
//+------------------------------------------------------------------+
#property copyright "Quant Developer"
#property version   "1.00"

input string InputSymbols = "EURUSD,GBPUSD,USDJPY,AUDUSD";
input int WarmUpBars = 500;

string Symbols[];
int TotalSymbols = 0;

int OnInit()
{
    ushort u_sep = StringGetCharacter(",", 0);
    TotalSymbols = StringSplit(InputSymbols, u_sep, Symbols);
    
    for(int i = 0; i < TotalSymbols; i++)
    {
        StringTrimLeft(Symbols[i]);
        StringTrimRight(Symbols[i]);
        
        if(!SymbolSelect(Symbols[i], true))
        {
            Print("Ошибка активации символа: ", Symbols[i]);
            return INIT_FAILED;
        }
        
        datetime times[];
        int attempts = 0;
        int copied = -1;
        
        while(copied < WarmUpBars && attempts < 10)
        {
            copied = CopyTime(Symbols[i], PERIOD_H1, 0, WarmUpBars, times);
            if(copied < WarmUpBars)
            {
                Sleep(100);
                attempts++;
            }
        }
        
        if(copied < WarmUpBars)
        {
            Print("Ошибка синхронизации истории для ", Symbols[i]);
            return INIT_FAILED;
        }
    }
    return INIT_SUCCEEDED;
}

void OnTick()
{
    for(int i = 0; i < TotalSymbols; i++)
    {
        string symbol = Symbols[i];
        datetime last_bar_time[];
        if(CopyTime(symbol, PERIOD_H1, 0, 1, last_bar_time) > 0)
        {
            // Логика стратегии для каждого символа портфеля
        }
    }
}

Разбор параметров

  • InputSymbols: Строка с перечислением торговых инструментов через запятую, которые будут включены в портфель для тестирования.
  • WarmUpBars: Количество исторических баров, необходимых для корректного расчета индикаторов при старте тестирования. Предотвращает рассинхронизацию данных.

Как запустить

Для запуска портфельного тестирования скомпилируйте код в MetaEditor. В тестере стратегий MT5 выберите любой базовый символ (например, EURUSD) и таймфрейм. Входной параметр InputSymbols должен содержать список торгуемых пар. Тестер автоматически подгрузит историю по всем указанным инструментам, а единый цикл в OnTick обеспечит синхронное исполнение торговой логики по всему портфелю.

Оцените статью
FinFluct