Новая версия платформы MetaTrader 5 build 2560: Улучшения во встроенной системе обучения - страница 22

 
freelancerAntonyan:

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

надо еще проверить не сливает ли эта чудесная программа личные данные куда-нибудь

 
Carl Schreiber:

Es gibt ja zwei Optionen: Есть два варианта:

  1. https://www.mql5.com/ru/articles/4150  Управляемая оптимизация: метод отжига
  2. https://www.mql5.com/ru/articles/55  Генетические алгоритмы - это просто!

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


Также хотелось бы, чтобы выбор "лучших" наборов параметров не основывался только на одном критерии, а добавлялся в пул лучших для дальнейшей оптимизации помимо собственной формулы (обычно в OnTester()), например, самой большой прибыли и самой высокой "ожидаемой прибыли" (=Profit/Trades) - почему бы и нет?

На самом деле вариантов может быть еще много. Вот еще один до кучи - Particle Swarm Optimization. Я его как раз сейчас пытаюсь распараллелить.

MQL's OOP notes: Particle Swarm Speeds Up Expert Adviser Optimization On The Fly
MQL's OOP notes: Particle Swarm Speeds Up Expert Adviser Optimization On The Fly
  • 2016.11.21
  • www.mql5.com
In 2 previous chapters we have studied a library for on the fly optimization of expert advisers (part1, part2). One of drawbacks of the library is its slow method of optimization, because it's nothing else than straightforward iteration over all possible combinations of parameters' values. It would be great to speed up the process somehow. The...
 
Carl Schreiber:


But: "OnTesterPass() is TesterPass event handler that is generated automatically when receiving a frame during an Expert Advisor optimization in the strategy tester.”
But this is already too late, the invalid parameter combination has already been calculated and included in the genetic optimization count - by the way, probably the same happens with already calculated combinations, which were not calculated, but included in the count. Otherwise I would probably not get 1408 runs (from the progress line), of which 116 were aborted by OnInit(), and 127 runs in the result table. That makes 1165 runs counted but not performed.

My question, is there a function, or an event-handle, that can be called before a frame is sent to calculation (into the cloud), to validate it and move the frame pointer if necessary?


Но..: "OnTesterPass() - это обработчик события TesterPass, который генерируется автоматически при получении фрейма при оптимизации эксперта в тестере стратегий".
Но уже поздно, неправильная комбинация параметров уже вычислена и включена в счет генетической оптимизации - кстати, наверное, то же самое происходит с уже вычисленными комбинациями, которые не были вычислены, а включены в счет. Иначе я бы, наверное, не получил 1408 запусков (из строки прогресса), из которых 116 были прерваны функцией OnInit(), и 127 запусков в таблице результатов. То есть 1165 прогонов было подсчитано, но не выполнено.

Мой вопрос, есть ли функция или дескриптор событий, который можно вызвать до отправки кадра на вычисление (в облако), чтобы проверить его и при необходимости переместить указатель кадра?

Вы сами можете определить качество параметров. Это делается в функции OnTester  Если параметры неподходящие, то отправьте плохое значение критерия. И тогда этот набор будет исключен в генетической оптимизации

//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
//---  проверим параметры
if(ParametersIsInvalid())
   return (-10000);  // поставьте нужное значение
 
 
//--- значение пользовательского критерия оптимизации (чем больше, тем лучше)
   double ret=0.0;
//--- получим результаты трейдов в массив 
   double array[];
   double trades_volume;
   GetTradeResultsToArray(array,trades_volume);
   int trades=ArraySize(array);
//--- если трейдов меньше 10, то тестирование не дало положительных результатов
   if(trades<10)
      return (0);
//--- средний результат на трейд
   double average_pl=0;
   for(int i=0;i<ArraySize(array);i++)
      average_pl+=array[i];
   average_pl/=trades;
//--- выведем сообщение для режима одиночного тестирования
   if(MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_OPTIMIZATION))
      PrintFormat("%s: Трейдов=%d, Средняя прибыль=%.2f",__FUNCTION__,trades,average_pl);
//--- посчитаем коэффициенты линейной регрессии для графика прибыли
   double a,b,std_error;
   double chart[];
   if(!CalculateLinearRegression(array,chart,a,b))
      return (0);
//--- вычислим ошибку отклонения графика от линии регрессии
   if(!CalculateStdError(chart,a,b,std_error))
      return (0);
//--- вычислим отношение трендовой прибыли к среднеквадратичному отклонению
   ret=(std_error == 0.0) ? a*trades : a*trades/std_error;
//--- вернем значение пользовательского критерия оптимизации
   return(ret);
  }
Документация по MQL5: Обработка событий / OnTester
Документация по MQL5: Обработка событий / OnTester
  • www.mql5.com
//|                                              OnTester_Sample.mq5 | //|                        Copyright 2018, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Проверка условий на открытие позиции                             |...
 
OnTester() - не моя проблема.

Каждая процедура оптимизации должна иметь критерии завершения. Я думаю, что тестер использует
   (а) количество проходов; и
   b) отсутствие улучшения значения оценки - например, вычисленное в OnTerster().

Пример: Я торгую системой МА, в которой я покупаю, когда быстрая МА пересекает медленную МА вверх и наоборот. Теперь для оптимизации я установил диапазон медленного MA на m10-H2 и диапазон быстрого MA на m5-H1. Так что при автоматической комбинации тестером скорость будет медленнее медленной, что не имеет смысла для торговой системы и OnInit() при такой комбинации не возвращает INIT_SUCCEEDED, а, например, INIT_PARAMETERS_INCORRECT.

OnInit() теперь единственная функция, которая, если не возвращает INIT_SUCCEEDED, предотвращает выполнение оптимизации. Тем не менее, оптимизация оценивает их как действительные прогоны. Это можно увидеть по счетчику в строке процесса и по строке в таблице результатов. В зависимости от числа это означает, что критерий завершения контр-оптимизации достигается слишком рано и, вероятно, также препятствует формированию и тестированию дальнейших комбинаций. Вот как я объясняю эти числа оптимизации:
    - Количество возможных комбинаций: 48906,
    - Количество запланированных тестером прогонов: 1408,
    - двойные вычисления: 1165,
     -отвергнуто функцией OnInit() с INIT_PARAMETERS_INCORRECT: 116,
    - в то время как таблица результатов имеет только 127 действительных результатов
      (из 48906 возможных).
С таким результатом, как я могу быть уверен, что генетическая оптимизация действительно определила оптимум?

С введением фреймов я надеялся, что пользователь получит доступ перед отправкой одной или группы настроек параметров для вычисления, чтобы удалить ту или иную комбинацию параметров в этот момент, чтобы ни оптимизатор не выполнял оптимизацию, ни оптимизатор не предполагал нормальный запуск и не увеличивал счетчик, что, очевидно, и происходит, когда тестер запускает OnInit с нежелательной комбинацией параметров - вот в чем моя проблема.
 
2020.08.03 07:28:37.373 Terminal        MetaTrader 5 x64 build 2564 started for MetaQuotes Software Corp.
2020.08.03 07:28:37.374 Terminal        Windows 10 build 19041, Intel Core i7-9750H  @ 2.60GHz, 25 / 31 Gb memory, 1687 / 1861 Gb disk, IE 11, UAC, GMT+2
2020.08.03 07:28:37.374 Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

Простой индикатор. Внутри цикла пытаюсь получить значение из буфера 'time'. В итоге получаю ошибку 'Expression could not be evaluated'. То есть 'time[i]' в отладке сейчас нельзя получить. При этом, если ввести переменную 'temp' и ей присвоить значение 'time[i]' - то в отладке можно увидеть значение 'temp'

Код индикатора:

//+------------------------------------------------------------------+
//|                                                            1.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;
   for(int i=limit; i<rates_total; i++)
     {
      if(prev_calculated!=0)
        {
         datetime temp=time[i];
         Comment(time[i]);
         int d=0;
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Файлы:
1.mq5  2 kb
 

b2564. Оптимизатор продолжает работать, когда уже все посчитано.

Нажатие на кнопку Стоп вызвало минутное зависание и затем ничего не изменилось: время продолжает тикать, кнопка Стоп - гореть.


Повторные нажатия на Стоп выдают такую реакцию.


Ситуация с Агентами.


opt-файл создался.

 
Vladimir Karputov:

Простой индикатор. Внутри цикла пытаюсь получить значение из буфера 'time'. В итоге получаю ошибку 'Expression could not be evaluated'. То есть 'time[i]' в отладке сейчас нельзя получить. При этом, если ввести переменную 'temp' и ей присвоить значение 'time[i]' - то в отладке можно увидеть значение 'temp'

Код индикатора:

https://www.mql5.com/ru/forum/347385/page16#comment_17621478

Новая версия платформы MetaTrader 5 build 2560: Улучшения во встроенной системе обучения
Новая версия платформы MetaTrader 5 build 2560: Улучшения во встроенной системе обучения
  • 2020.07.31
  • www.mql5.com
В пятницу 24 июля 2020 года будет выпущена обновленная версия платформы MetaTrader 5...
 

Warum wird die Optimierung in der Cloud (NICHT LOKAL) beendet mit:
Почему оптимизация в облаке (НЕ МЕСТНО) заканчивается:
"PD    0    09:48:13.661    Tester    Cloud servers switched off"?

Gestern konnte ich diesen EA mit den drei Symbolen "USDJPY,USDCAD,AUDUSD" komplett in der Cloud optimieren (davor mit nur zwei "EURUSD, GBPUSD" ohne Probleme).
TestZeitraum ist immer 2007.01.01 - 2020.06.27.
Вчера мне удалось полностью оптимизировать этого советника с тремя символами "USDJPY,USDCAD,AUDUSD" в облаке (до этого только с двумя "EURUSD,GBPUSD" без проблем).
Испытательный срок всегда 2007.01.01 - 2020.06.27.

JJ    0    16:09:34.535    Tester    Best result 31202172.30999568 produced at generation 7. Next generation 24
OO    0    16:09:34.535    Tester    Best result 31202172.30999568 produced at generation 7. Next generation 25
IS    0    16:09:34.545    Tester    Best result 31202172.30999568 produced at generation 7. Next generation 26
JG    0    16:09:34.545    Tester    genetic calculation is over
RN    0    16:09:34.545    Tester    result cache used 4402 times
OJ    0    16:09:34.545    Tester    genetic optimization finished on pass 5152 (of 185136)
JP    0    16:09:35.100    Statistics    optimization done in 2 hours 42 minutes 32 seconds
EQ    0    16:09:35.100    Statistics    shortest pass 0:01:10.406, longest pass 0:10:27.756, average pass 0:03:43.935
KH    0    16:09:35.100    Statistics    local 155 tasks (20%), remote 0 tasks (0%), cloud 606 tasks (79%)

1) Heute habe ich zur gestern optimierten Makro-Strategie nur eine Mikro-Strategie aktiviert, die bereits angelegt war - also keine neue Programmierung.
2) In OnInit() gibt es nur eine Schleife:
1) Сегодня, в дополнение к оптимизированной вчера макро-стратегии, я активировал только уже созданную микро-стратегию - никакого нового программирования.
2) В OnInit() есть только один цикл:

int OnInit() {

   string aSym[];
   int iSym = NoSym = StringSplit(SymTrd,',',aSym); // <= input string SymTrd = "USDJPY,USDCAD,AUDUSD"
   ArrayResize(arrCDrift,iSym);
   while (iSym-->0) {
      if ( !(bool)SymbolInfoInteger(aSym[iSym],SYMBOL_SELECT) ) {
         Alert("Symbol ",aSym[iSym]," (is skipped) could not be selected in the MarketWatch: ",err(_LastError));
         arrCDrift[iSym] = NULL;
         continue;
      }
      arrCDrift[iSym] = new CDrift( aSym[iSym], (double)SymbolInfoDouble(aSym[iSym],SYMBOL_POINT), (int)SymbolInfoInteger(aSym[iSym],SYMBOL_DIGITS) );
   }
}


In dem Konstruktor CDrift(..) gibt es keine Schleife, es werden lediglich die Parameter gesetzt, zugewiesen und vorbereitet.
Dennoch wird heute die Optimierung in der Cloud abgebrochen:
В конструкторе CDrift(...) нет цикла, только устанавливаются, назначаются и подготавливаются параметры.
Тем не менее, сегодня оптимизация в облаке отменяется:

...
GJ    2    09:47:53.390    MQL5 Cloud Europe 2    genetic pass (0, 218) tested with error "endless loop detected in OnInit function, expert rejected by MQL5 Cloud Network" in 0:10:05.244 (PR 201)
PQ    2    09:48:12.812    MQL5 Cloud Europe 2    genetic pass (0, 232) tested with error "endless loop detected in OnInit function, expert rejected by MQL5 Cloud Network" in 0:10:00.878 (PR 193)
GH    2    09:48:12.967    MQL5 Cloud Europe 2    genetic pass (0, 250) tested with error "endless loop detected in OnInit function, expert rejected by MQL5 Cloud Network" in 0:10:00.436 (PR 195)
NG    2    09:48:13.009    MQL5 Cloud Europe 2    genetic pass (0, 216) tested with error "endless loop detected in OnInit function, expert rejected by MQL5 Cloud Network" in 0:10:01.786 (PR 193)
PN    2    09:48:13.661    MQL5 Cloud Europe 2    genetic pass (0, 238) tested with error "endless loop detected in OnInit function, expert rejected by MQL5 Cloud Network" in 0:10:00.943 (PR 191)
DI    2    09:48:13.661    Tester    rejected tasks limit reached, cloud servers using stopped
PD    0    09:48:13.661    Tester    Cloud servers switched off
NG    2    09:48:18.169    MQL5 Cloud Europe 2    genetic pass (0, 230) tested with error "endless loop detected in OnInit function, expert rejected by MQL5 Cloud Network" in 0:10:06.439 (PR 191)
HN    2    09:48:18.215    MQL5 Cloud Europe 2    genetic pass (0, 248) tested with error "endless loop detected in OnInit function, expert rejected by MQL5 Cloud Network" in 0:10:05.886 (PR 191)
RE    2    09:49:21.409    MQL5 Cloud Europe 2    genetic pass (0, 253) tested with error "endless loop detected in OnInit function, expert rejected by MQL5 Cloud Network" in 0:10:01.682 (PR 203)
NL    2    09:50:50.704    MQL5 Cloud Europe 2    genetic pass (0, 133) tested with error "endless loop detected in OnInit function, expert rejected by MQL5 Cloud Network" in 0:10:00.390 (PR 207)
IK    2    09:50:50.787    MQL5 Cloud Europe 2    genetic pass (0, 231) tested with error "endless loop detected in OnInit function, expert rejected by MQL5 Cloud Network" in 0:10:00.363 (PR 198)
FR    0    09:55:21.346    Tester    result cache used 0 times
MD    0    09:55:21.347    Tester    genetic optimization finished on pass 200 (of 146914480944)
OQ    0    09:55:21.347    Statistics    optimization done in 17 minutes 40 seconds
OD    0    09:55:21.347    Statistics    shortest pass 0:00:44.422, longest pass 0:12:03.945, average pass 0:05:12.974
FD    0    09:55:21.347    Statistics    local 16 tasks (8%), remote 0 tasks (0%), cloud 184 tasks (102%)
JL    0    09:55:21.347    MQL5 Cloud Europe 2    13 hours and 30 minutes of cloud time spent on successful calculation of 163 tasks, 257 cloud agents used
OD    0    09:55:21.349    Tester    179 new records saved to cache file 'tester\cache\DriftEA.GBPUSD.M1.20070101.20200627.11.E75BAD6EF7A384C5A1BC985A4A16FE48.opt'
RI    0    09:55:21.350    Core 01    connection closed
...
Warum auf einmal wird die Optimierung abgebrochen, wegen "endless loop" obwohl 163 tasks in der Cloud berechnet wurden und dieser Fehler lokal überhaupt nie aufgetreten ist?
Почему оптимизация внезапно прерывается из-за "бесконечного цикла", хотя в облаке было вычислено 163 задачи, а локально эта ошибка никогда не возникала?
 
Vladimir Karputov:

Простой индикатор. Внутри цикла пытаюсь получить значение из буфера 'time'. В итоге получаю ошибку 'Expression could not be evaluated'. То есть 'time[i]' в отладке сейчас нельзя получить. При этом, если ввести переменную 'temp' и ей присвоить значение 'time[i]' - то в отладке можно увидеть значение 'temp'

Код индикатора:

Спасибо за сообщение.

Исправлено.

 

Билд 2360, Открытие ФОРТС, неттинг

Перестала работать функция

//+------------------------------------------------------------------+
//| Expert Get position price function                               |
//+------------------------------------------------------------------+
double GetPositionPrice(const string aSymbol)
{
  double price_in = 0;
  double volume_in = 0;
  if(PositionSelect(aSymbol))
  {
    ulong pos_id = ulong(PositionGetInteger(POSITION_IDENTIFIER));
    if(pos_id > 0)
    {
      if(HistorySelectByPosition(pos_id))
      {
        int deals = HistoryDealsTotal();
        for(int i = 0; i < deals; i++)
        {
          ulong deal_ticket = HistoryDealGetTicket(i);
          ulong order_ticket = ulong(HistoryDealGetInteger(deal_ticket, DEAL_ORDER));
          if(order_ticket > 0)
          {
            ENUM_DEAL_ENTRY deal_entry = ENUM_DEAL_ENTRY(HistoryDealGetInteger(deal_ticket, DEAL_ENTRY));
            if(deal_entry == DEAL_ENTRY_IN)
            {
              double price = HistoryDealGetDouble(deal_ticket, DEAL_PRICE);
              double volume = HistoryDealGetDouble(deal_ticket, DEAL_VOLUME);
              price_in += price * volume;
              volume_in += volume;  
            }
          }
        }
        if(volume_in > 0)
        {
          //int digits=int(SymbolInfoInteger(aSymbol, SYMBOL_DIGITS ));
          return(NormalizeDouble(price_in/volume_in, Digits()));
        }  
      }
      else
      {
        Print(__FUNCTION__, ": Невозможно получить историю позиции по символу ", aSymbol);
      }
    }
    else
    {
      Print(__FUNCTION__, ": Невозможно определить идентификатор позиции по символу ", aSymbol);
    }
  }
  return(0);
}

Эксперт был откомпилирован в Билд 2360

5 лет отработала нормально!