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

 
Ivan Butko #:


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

Хорошо. Как будет время, проверю как оптимизируется, отпишусь.

 
Ivan Butko #:



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

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

 
Stanislav Korotky #:

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

Секунду


UPD

вот шапка

int ZigZag;

double ZigzagBuffer[];

вот инициализация

ZigZag = iCustom(Symbol(), Period(), "ZZVolatility");  
  
ArraySetAsSeries(ZigzagBuffer, true);


и онтик:

вызов зигзага и заполнение последними экстремумами

     int i_2 = 0;
    
    double z_arr[];    
    
    ArrayResize(z_arr, ArraySize(inputs));
    
    CopyBuffer(ZigZag, 0, 0, 1000, ZigZagBuffer); 
    
    for (int i = 0; i < 1000; i++)
      {
        if (ZigZagBuffer[i] != PLOT_EMPTY_VALUE && ZigZagBuffer[i] != 0.0)
          {
            z_arr[i_2] = ZigZagBuffer[i];   // Print(i)  ;
            i_2++;
          }
         
        if (i_2 == ArraySize(inputs)) break;
      }

    x_min = z_arr[ArrayMinimum(z_arr)]; 
    x_max = z_arr[ArrayMaximum(z_arr)]; 



   for (int i = 0; i < ArraySize(inputs); i++)
     {
       inputs[i] = (z_arr[i] - x_min) / (x_max - x_min) * 2 - 1;
     }


вот MLP-движок 3 на 3


// ------------------------------------------------------------ MLP ------------------------------------------------------------

    i = 0;
    l1_o[i] = CalculateNeuron(inputs, l1_n1_w, "l1_o[" + (i) + "]");    i++;               //      Print("l1_o[" + (i - 1) + "]" + l1_o[i-1]);
    l1_o[i] = CalculateNeuron(inputs, l1_n2_w, "l1_o[" + (i) + "]");    i++;               //      Print("l1_o[" + (i - 1) + "]" + l1_o[i-1]);
    l1_o[i] = CalculateNeuron(inputs, l1_n3_w, "l1_o[" + (i) + "]");    i++;               //      Print("l1_o[" + (i - 1) + "]" + l1_o[i-1]);
    
    i = 0;
    l2_o[i] = CalculateNeuron(l1_o, l2_n1_w, "l2_o[" + (i) + "]");    i++;               //      Print("l2_o[" + (i - 1) + "]" + l2_o[i-1]);
    l2_o[i] = CalculateNeuron(l1_o, l2_n2_w, "l2_o[" + (i) + "]");    i++;               //      Print("l2_o[" + (i - 1) + "]" + l2_o[i-1]);
    l2_o[i] = CalculateNeuron(l1_o, l2_n3_w, "l2_o[" + (i) + "]");    i++;               //      Print("l2_o[" + (i - 1) + "]" + l2_o[i-1]);



    int mode =       0      ;
    
    
    
    if (mode == 0)        out = CalculateNeuron(l2_o, out_w, "out");               //    Print("out  " + out);      

    if (mode == 1)        Softmax(l2_o, OUT);                                  //    Print("OUT[0]" + OUT[0] + "OUT[1]" + OUT[1] + "OUT[2]" + OUT[2]);


и открытие позиции


if (PositionSelect(_Symbol))
      {
        long type  = PositionGetInteger(POSITION_TYPE);
        bool close = false;

        if (type == POSITION_TYPE_BUY)  
          {
            if (mode == 0)       if (  out < B_C) close = true;
            if (mode == 1)      if (  OUT[1] >  Open || OUT[2] >  Open) close = true;
          }
          
        if (type == POSITION_TYPE_SELL)  
          {
            if (mode == 0)       if (   out > S_C  ) close = true;
             if (mode == 1)           if (  OUT[0] >  Open || OUT[2] >  Open) close = true;
          }
          
        if (close)      trade.PositionClose(_Symbol);
      }



    // ------------------ ОТКРЫТИЕ ПОЗИЦИЙ ------------------
        
    
    if (PositionsTotal() == 0)
      {
        
        double tp = 0, sl = 0;        
        
         if (mode == 0)
           {  
               if (  out >  B                )    
                    {     
                      if (TP > 0) tp    = NormalizeDouble(bid + TP * P, _Digits);  
                      if (SL > 0) sl    = NormalizeDouble(ask - SL * P, _Digits); 
                   
                      trade.Buy  (0.01, NULL, 0.0, sl, tp, ""); 
                    }
                     
                if (  out <  S            )    
                    {                  
                     if (TP > 0) tp    = NormalizeDouble(ask - TP * P, _Digits);  
                      if (SL > 0) sl    = NormalizeDouble(bid + SL * P, _Digits); 
                  
                      trade.Sell (0.01, NULL, 0.0, sl, tp, "");
                    }
            }
      
    
          if (mode == 1)
            {   
              if (   OUT[0] >  Open      )    
                {     
                   //   if (TP > 0) tp    = NormalizeDouble(bid + TP * P, _Digits);  
                   //   if (SL > 0) sl    = NormalizeDouble(ask - SL * P, _Digits); 
                   
                      trade.Buy  (0.01, NULL, 0.0, sl, tp, ""); 
                 
                    }
                     
              if (   OUT[1] >  Open    )    
                {            
                  //   if (TP > 0) tp    = NormalizeDouble(ask - TP * P, _Digits);  
                  //    if (SL > 0) sl    = NormalizeDouble(bid + SL * P, _Digits); 
                  
                      trade.Sell (0.01, NULL, 0.0, sl, tp, "");  
                 }
            }
      }     



Ничего особенного, накидал простой код. Если его запустить - оптимизатор ломается


 

 
Ivan Butko #:

Секунду


UPD

Если его запустить - оптимизатор ломается

Ну это больше похоже на паззл, чем на готовый пример.

Как именно "оптимизатор ломается"? Разные значения при проходах? - уже обсуждали: с 99.99% вероятностью есть упущения в исходнике.

 
Stanislav Korotky #:

Ну это больше похоже на паззл, чем на готовый пример.

Как именно "оптимизатор ломается"? Разные значения при проходах? - уже обсуждали: с 99.99% вероятностью есть упущения в исходнике.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 4410: улучшения в работе

Ivan Butko, 2024.09.30 15:45


Столько раз обновлялся этот терминал, а всё чехарда сохраняется

Берёшь вызываешь любой модифицированный зигзаг, либо фракталы, включаешь оптимизацию, она начинает за здравие, а заканчивает за упокой

Показатели стремятся к бесконечнсти, для примера на графике выше - фактор восстановления. 

Естественно, при прогоне такого сета никакой соответсвующей картину баланса не будет, результат каждого сета - рандомный баланс: нажимаешь несколько раз на кнопку "Старт", он несколько раз показывает разный график баланса одного и того де сета. 


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



Проверял на ТЕКУЩЕМ терминале с этого сайта, затем на АЛьпари, затем на Альфа-форексном, затем на ICMarkets, на всех терминлах одинакого ломается!


 
Ivan Butko #:

Уже ответил по этому поводу: "с 99.99% вероятностью есть упущения в исходнике." Что-то не инициализируется, нет проверок на возврат ошибок функциями и т.д. Поищите на форуме - есть длинные обсуждения и откровения.

 
Stanislav Korotky #:

Нашел такое решение:

Так кэш данных начинает сбрасываться на диск, но сама по себе функция FileFlush не работает как ожидается.

Оказывается, я уже наступал на эти грабли с нефункционирующей FileFlush:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Stanislav Korotky, 2020.04.24 13:56

Как я сообщал выше (в тексте, который вами же отквочен), конкретно в моем тест-кейсе все наоборот -- читает индикатор, пишет эксперт. Но насколько я понял, тип программы не важен. Проблема архитектурная.

Указанная реализация файлов в MQL5 -- это баг. Закрывать и открывать файл -- рабочий обходной маневр, но так не должно быть для чтения разделяемого файла.

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

PS. В качестве quick&dirty исправления такое предложение: в ответ на вызов FileFlush у файла открытого на чтение - обновлять его буфер.

Так они и остались.

 
Stanislav Korotky #:

Оказывается, я уже наступал на эти грабли с нефункционирующей FileFlush:

Так они и остались.

Добавьте флаг  FILE_SHARE_WRITE.

 
AntonR85 #:

Добавьте флаг  FILE_SHARE_WRITE.

Почитайте обсуждение в 2020 году - не дают эти флаги нужно эффекта - буфер скидывается в программе, пишущей файл, но изменения не подхватываются в читающей программе - она продолжает видеть файл в состоянии на момент получения хендла. Ответ MQ - нужно закрывать и снова открывать файл, чтобы прочитать изменения.

 
Stanislav Korotky #:

Почитайте обсуждение в 2020 году - не дают эти флаги нужно эффекта - буфер скидывается в программе, пишущей файл, но изменения не подхватываются в читающей программе - она продолжает видеть файл в состоянии на момент получения хендла. Ответ MQ - нужно закрывать и снова открывать файл, чтобы прочитать изменения.

По сути этот флаг должен быть обязателен, но он не решает проблему. Так как ошибка в чтений файла, не обновляются длина файла, хотя если писать в одном советнике, а в другом смещать указатель на новые данные, так чтоб он не выходил за длину(какая она должна быть по сути), вполне работает(да, и из сторонней программы все работает штатно(и длина и значения обновляются как надо)). Ответ MQ  конечно как минимум странный.