Свой критерий оптимизации конечно громко сказано. По большому счету можно просто делать дополнительный фильтр и выбирать более оптимальные занчения. Для этого достаточно в deinit() добавить небольшой код int deinit() {
string filename="HMA_stat_"+Symbol()+"_"+Period()+".csv";
bool fex=CheckFile(filename); // Проверка существования файла-отчета
int handle=FileOpen(filename,FILE_READ|FILE_WRITE|FILE_CSV);
if (fex) // Если файла-отчета нет, то формируем шапку
FileWrite(handle,"CountTM","HourStart","HourStop","Паттерн","OP","profit","count","profitplus","countplus","profitminus","countminus","StopL oss_TM","StopLoss_Id","TakeProfit_TM","TakeProfit_Id");
for (int Magic=MagicMin;Magic<=MagicMax;Magic++) {
double profit=0;
double profitplus=0;
double profitminus=0;
int count=0;
int countplus=0;
int countminus=0;
for (int j=0;j<OrdersHistoryTotal();j++) {
if (!OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)) continue;
if (OrderMagicNumber()!=Magic) continue;
profit+=OrderProfit();
count++;
if (OrderProfit()>0) {
profitplus+=OrderProfit();
countplus++;
} else {
profitminus-=OrderProfit();
countminus++;
}
}
if (profitplus>profitminus && countplus>countminus) {
FileSeek(handle, 0, SEEK_END);
FileWrite(handle,CountTM,HourStart,HourStop,Magic,reversi,profit,count,profitplus,countplus,profitminus,countminus,StopLoss_TM,StopLoss_Id,T akeProfit_TM,TakeProfit_Id);
}
}
FileClose(handle);
return(0);
}
Это как вариант, в данном случае паттерны формируют уникальный магик. И мы получаем отчет по каждому магику отдельной строкой в отчете.
Но что попадет в отчет зависит только от этой строки
if (profitplus>profitminus && countplus>countminus)
Я взял случай когда прибыль больше убытков и количество прибыльных операций больше количества убыточных.