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 обеспечит синхронное исполнение торговой логики по всему портфелю.




