Новая версия платформы MetaTrader 5 build 2190 - страница 44

 
Igor Zakharov:

поясните, что не так делаю - оптимизация полная, медленная, не генетика. всего 10 496 проходов. После 1024 останавливается. нажимаю старт - ещё 1024 и остановка. старт - опять идёт проходы, судя по всему, новые, т.к. вижу строчки с меньшей просадкой и большей прибылью, т.е. это продолжение, а не повтор.

есть подозрение, что идёт генетика, хотя в меню выбрано "медленная". причиной может быть то, что я этот пункт из меню выбрал после одиночного прохода, а не через кнопку на первой страничке.

проходы с нумерацией появляются после очередного перезапуска

добавлено: после очередной остановки, перезашёл через главный экран - опять 1024 и стоп


проверил на простом советнике:

//--- input parameters
input int      CNT=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
   return(CNT * CNT);
  }

режим "Полная оптимизация", CNT от 0 до 1'000'000, прошли все проходы:

и тоже самое но в режиме "Расчет математики":



ЗЫ сделал проверку, потому что мне не нужно что бы полный перебор параметров "где то остановился".

ЗЗЫ Билд 2230

 
Andrey Khatimlianskii:

.

Это понятно, я и написал, что можно вместо INIT_PARAMETERS_INCORRECT возвращать custom=0 (из OnTester, естественно).

Я хочу понять, что правильнее для генетики. При условии, что избыток INIT_PARAMETERS_INCORRECT  не валит генетику. Ведь избыток фейковых "плохих" результатов (0 или -99999) тоже не помогает найти направление для улучшения отбора.

 
Edgar Akhmadeev:

Это понятно, я и написал, что можно вместо INIT_PARAMETERS_INCORRECT возвращать custom=0 (из OnTester, естественно).

Я хочу понять, что правильнее для генетики. При условии, что избыток INIT_PARAMETERS_INCORRECT  не валит генетику. Ведь избыток фейковых "плохих" результатов (0 или -99999) тоже не помогает найти направление для улучшения отбора.

генетике нужно дать понять, что некорректные параметры дают самый плохой результат, можно выдавать в  OnTester "-DBL_MAX" (делая проверку в OnTick и return если параметры некорректны), но лучше всё же хотя бы приблизительно прикинуть какое максимально худшее значение может быть из самых возможных и выдавать его вместо  "-DBL_MAX", так как чрезвычайная удаленность значения критерия от валидных тоже вредит генетике (чем ближе значения критерия по значению между соседними параметрами тем лучше, плавности исследуемой поверхности в любом случае добиться не получится, однако получится избавится от явных разрывов и дыр в поверхности)

Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Константы числовых типов
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Константы числовых типов
  • www.mql5.com
Каждый простой числовой тип предназначен для определенного круга задач и позволяет оптимизировать работу mql5-программы при правильном применении. Для лучшей читаемости кода и...
 
Edgar Akhmadeev:

Это понятно, я и написал, что можно вместо INIT_PARAMETERS_INCORRECT возвращать custom=0 (из OnTester, естественно).

Я хочу понять, что правильнее для генетики. При условии, что избыток INIT_PARAMETERS_INCORRECT  не валит генетику. Ведь избыток фейковых "плохих" результатов (0 или -99999) тоже не помогает найти направление для улучшения отбора.

Ну так по ссылке как раз рассуждения на тему "что лучше". INIT_PARAMETERS_INCORRECT хуже.

 
   crash -->  0000000008C04558 48B9901C070C0000  mov        rcx, 0xc071c90
                               0000
              0000000008C04562 49FF9608130000    call       qword near [r14+0x1308]  ; #10545 (terminal64.exe)
              0000000008C04569 488D542454        lea        rdx, [rsp+0x54]
              0000000008C0456E 48B9901C070C0000  mov        rcx, 0xc071c90
                               0000
              0000000008C04578 49FF9608130000    call       qword near [r14+0x1308]  ; #10545 (terminal64.exe)
              0000000008C0457F 488D542448        lea        rdx, [rsp+0x48]
              0000000008C04584 48B9901C070C0000  mov        rcx, 0xc071c90
                               0000

00: 0x0000000008C04558
01: 0x01D5A57D74044DE6
02: 0x00000000147ADFB0
03: 0x0000000000000001
 
Renat Fatkhullin:

Генетика останавливается, если затухает оптимизируемая функция:

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


Покажите свою пользователькую функцию оптимизации, пожалуйста.

input ENUM_STATISTICS  Ret =STAT_EQUITY_DD_RELATIVE; // OnTester returns

double OnTester()
{
 if(!MQLInfoInteger(MQL_OPTIMIZATION))
 {
 HistorySelect(0,TimeCurrent());
 double max_lot=0;
 for(int i=HistoryDealsTotal()-1;i>=0;i--)
  {
   ulong tc=HistoryDealGetTicket(i);
   if(tc>0 && HistoryDealGetInteger(tc,DEAL_ENTRY)==DEAL_ENTRY_OUT)
   max_lot=MathMax(max_lot,HistoryDealGetDouble(tc,DEAL_VOLUME));
  }

 Print("SL: ",DoubleToString(minSL,0)," .. ",DoubleToString(maxSL,0));
 Print("TP: ",DoubleToString(minTP,0)," .. ",DoubleToString(maxTP,0));
 Print("Ratio: ",DoubleToString(minRatio,2)," .. ",DoubleToString(maxRatio,2));
 Print("Loss in a row: ",DoubleToString(TesterStatistics(STAT_MAX_CONLOSS_TRADES),0));
 Print("Max.Lot: ",DoubleToString(max_lot,2));
 }
 
 MqlDateTime t;
 TimeToStruct(TimeCurrent(),t);
 double ret=t.year*10000+t.mon*100+t.day+MathMin(0.999999999,(MaxEquity-AccountInfoDouble(ACCOUNT_EQUITY))/InitialAcc);
 return(stopped?-ret:-TesterStatistics(Ret));
}
int OnInit()
  {
   if(MQLInfoInteger(MQL_OPTIMIZATION) && !Opposit_Close && !Opposit_Reopen)
    {
     Alert("Stopped to reduce number of passes!");
     stopped=true;
     return(INIT_PARAMETERS_INCORRECT);
    }

   if(MQLInfoInteger(MQL_OPTIMIZATION) && Period_local>=Period_tr)
    {
     Alert("Stopped because of wrong periods!");
     stopped=true;
     return(INIT_PARAMETERS_INCORRECT);
    }

   return(INIT_SUCCEEDED);
  }

Два момента: просадка в процентах бесполезная вещь при анализе результатов, нужна просадка в абсолютных величинах. Только ради этого я добавил OnTester(). Если я не включу оптимизацию по кастомному символу, то её не будет видно в таблице результатов. Т.е. это просто очередной костыль к мелкому недостатку оптимизатора. (отдельный пост был и его поддержали несколько пользователей). причина простая: запустили советник со стартовым балансом 100$, видим просадку 0,01%... можно использовать его на мелком счёте? А то что в момент когда был 0,01% счет уже был 10000000. В обратную сторону искажение тоже неприятно. Если бы просадка была % по отношению к начальному балансу - в цифре была бы аналитическая ценность, а так она просто занимает полезное место на экране.

Второй момент - я не включал генетику! Я хотел все проходы, вместе с "бесполезными", именно этот пункт выбрал. В итоге остановил т.к. ночь настала.

Edgar Akhmadeev:

О насильном переключении в режим генетики есть сообщение в логах

Сообщения нет, оно сразу, с первого прохода стартует как генетика.

 

2232. обновился. теперь есть сообщение

2019.11.28 10:15:06.829 Tester genetic mode turned on due to 439040000 passes, to use complete algorithm decrease amount of optimized parameters

Исправлено:

сделал много проб и ошибок, на 80% разобрался в причинах и следствиях




 
Alain Verleyen:

Build 2190 и 2226. В тестере стратегий есть небольшая ошибка при попытке получить свойство SYMBOL_BASIS.

Существует также та же ошибка для SYMBOL_BANK.

На живом графике все нормально.

Спасибо. Исправили

 

Как такое может быть?

В отладчике идентификатор позиции равен НУЛЮ, но выбрать сделки по этому идентификатору, пожалуйста...


Конфигурация системы

2019.11.28 16:38:54.517 Terminal        update D:\MetaTrader 5\Hadge MT5\MQL5 folder started
2019.11.28 16:38:54.707 Terminal        update D:\MetaTrader 5\Hadge MT5\MQL5 folder finished
2019.11.28 16:38:54.937 Terminal        MetaTrader 5 x64 build 2232 started (MetaQuotes Software Corp.)
2019.11.28 16:38:54.947 Terminal        Windows 7 Service Pack 1 (build 7601) x64, IE 11, AMD FX-4170 Quad-Core Processor , Memory: 10021 / 12255 Mb, Disk: 70 / 465 Gb, GMT+3
 
Alexey Viktorov:

Как такое может быть?

В отладчике идентификатор позиции равен НУЛЮ, но выбрать сделки по этому идентификатору, пожалуйста...


Конфигурация системы

Добавьте пожалуйста вывод posID через Print

Какое значение распечатается ?