Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5 - страница 116

 
Vladimir Karputov:
Можно ли добавить в поиск по MQL5 папкам (поиск из редактора MetaEditor) дополнительный столбец: ++ Дата последнего изменения

или ++ Дата создания?


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

Действительно, было бы удобно.

 

Билд 1972. Запускаю скрипт:

//+------------------------------------------------------------------+
//|                                                      Refresh.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ChartSetSymbolPeriod(0,_Symbol,_Period);
   ChartRedraw();
  }
//+------------------------------------------------------------------+

Получаю:


С кастомными графиками такого не происходит, но при этом ожидаемый тик в индикаторы не приходит.

Это только у меня такое?

 
Maxim Dmitrievsky:

Похоже, что никто больше кастомными символами не пользуется, потому что как с этим работать:

до кнопки "refresh (обновить чарт)"

После:

Разработчики не могут "воспроизвести"

Смогли воспроизвести. Исправляем.
 
Anatoli Kazharski:
Спасибо. Осталось разобраться, почему так получается.

Это должно помочь.

 
fxsaber:

Это должно помочь.

Проблема осталась.

В рамках одного теста с одними параметрами, да, результаты стали идентичны.

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

 
Anatoli Kazharski:

Проблема осталась.

В рамках одного теста с одними параметрами, да, результаты стали идентичны.

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

Результат выполнения такой

2017.01.01 00:00:00   void CZigZagModule::CopyExtremums(const int), Line = 93: ArrayResize(m_zz_low, total) = 1, PrevSize = 0, NewSize = 1
2017.01.01 00:00:00   void CZigZagModule::CopyExtremums(const int), Line = 94: ArrayResize(m_zz_high, total) = 1, PrevSize = 0, NewSize = 1
2017.01.01 00:00:00   void CZigZagModule::CopyExtremums(const int), Line = 95: ArrayResize(m_zz_low_bar, total) = 1, PrevSize = 0, NewSize = 1
2017.01.01 00:00:00   void CZigZagModule::CopyExtremums(const int), Line = 96: ArrayResize(m_zz_high_bar, total) = 1, PrevSize = 0, NewSize = 1
2017.01.01 00:00:00   void CZigZagModule::CopyExtremums(const int), Line = 97: ArrayResize(m_zz_low_time, total) = 1, PrevSize = 0, NewSize = 1
2017.01.01 00:00:00   void CZigZagModule::CopyExtremums(const int), Line = 98: ArrayResize(m_zz_high_time, total) = 1, PrevSize = 0, NewSize = 1
2017.01.01 00:00:00   void CZigZagModule::CopyExtremums(const int), Line = 93: ArrayResize(m_zz_low, total) = 3, PrevSize = 1, NewSize = 3
2017.01.01 00:00:00   void CZigZagModule::CopyExtremums(const int), Line = 94: ArrayResize(m_zz_high, total) = 3, PrevSize = 1, NewSize = 3
2017.01.01 00:00:00   void CZigZagModule::CopyExtremums(const int), Line = 95: ArrayResize(m_zz_low_bar, total) = 3, PrevSize = 1, NewSize = 3
2017.01.01 00:00:00   void CZigZagModule::CopyExtremums(const int), Line = 96: ArrayResize(m_zz_high_bar, total) = 3, PrevSize = 1, NewSize = 3
2017.01.01 00:00:00   void CZigZagModule::CopyExtremums(const int), Line = 97: ArrayResize(m_zz_low_time, total) = 3, PrevSize = 1, NewSize = 3
2017.01.01 00:00:00   void CZigZagModule::CopyExtremums(const int), Line = 98: ArrayResize(m_zz_high_time, total) = 3, PrevSize = 1, NewSize = 3

Если первая возможная причина была исправлена, то выделенная - нет. Ищем по коду, где вызывается CZigZagModule::CopyExtremums и находим такую строку

m_zz_current.CopyExtremums(CopyExtremum);

Получается, что идет увеличение размера массива, но добавленные элементы не инициализированы.

 
fxsaber:

Результат выполнения такой

Если первая возможная причина была исправлена, то выделенная - нет. Ищем по коду, где вызывается CZigZagModule::CopyExtremums и находим такую строку

Получается, что идет увеличение размера массива, но добавленные элементы не инициализированы.

Дело в том, что проверка условий на открытие сделок не пропустит, если исходные данные индикатора не получены - CStrategy::GetIndicatorData().

Затем, если они получены, получаем финальные данные:

m_zz_current.GetZigZagData(m_h_zz,m_l_zz,m_t_zz);

А в методе CZigZagModule::GetZigZagData() в самом начале осуществляется инициализация массивов - CZigZagModule::ZeroZigZagData(), размер которых (1 элемент) был установлен сначала в конструкторе класса CZigZagModule (там, где была первая причина), а затем в CZigZagModule::CopyExtremums() во время инициализации программы - CStrategy::OnInitEvent(), (количество элементов равно входному параметру CopyExtremum). В ваших результатах это NewSize = 3.

Вот исходя из всего этого, как понять, почему получаются такие результаты?

 
fxsaber:
По прежнему невозможно прервать отладку без плохих последствий

Пофиксили будет в следующем билде.

 

Прошу прощения за офф топ, можно ли как то сменить тип продукта в маркете с эксперата на утилиту.

Возникла проблема в том что Утилита проходит проверку а ее демо версия оформлена как эксперт проверку не проходит.

Программы абсолютно одинаковые, в демо версии просто нет части кода...

 
Anatoli Kazharski:

Вот исходя из всего этого, как понять, почему получаются такие результаты?

Пока могу только сказать, что раз Ваш индикатор выдает следующее

2017.01.01 00:00:00   void ZeroIndicatorBuffers(), Line = 123: ArrayInitialize(zz_H_buffer, 0) = 0, ArraySize(Array) = 0
2017.01.01 00:00:00   void ZeroIndicatorBuffers(), Line = 124: ArrayInitialize(zz_L_buffer, 0) = 0, ArraySize(Array) = 0
2017.01.01 00:00:00   void ZeroIndicatorBuffers(), Line = 125: ArrayInitialize(low_ask_buffer, 0) = 0, ArraySize(Array) = 0
2017.01.01 00:00:00   void ZeroIndicatorBuffers(), Line = 126: ArrayInitialize(high_bid_buffer, 0) = 0, ArraySize(Array) = 0
2017.01.01 00:00:00   void ZeroIndicatorBuffers(), Line = 127: ArrayInitialize(total_zz_h_buffer, 0) = 0, ArraySize(Array) = 0
2017.01.01 00:00:00   void ZeroIndicatorBuffers(), Line = 128: ArrayInitialize(total_zz_l_buffer, 0) = 0, ArraySize(Array) = 0

то можете не делать инициализацию в OnInit, т.к. индикаторные буферы там нулевого размера.


ЗЫ Такой код не заполняет все индикаторные буферы

//+------------------------------------------------------------------+
//| Заполняет индикаторные буферы ZZ                                 |
//+------------------------------------------------------------------+
void FillIndicatorBuffers(const int i,const datetime &time[])
  {
   if(time[i]<first_date)
      return;
//--- Если направление ZZ вверх
   if(direction_zz>0)
     {
      //--- Если новый максимум
      if(high_bid_buffer[i]>=max_high_bid)
        {
         zz_H_buffer[last_zz_max] =0;
         last_zz_max              =i;
         max_high_bid             =high_bid_buffer[i];
         zz_H_buffer[i]           =high_bid_buffer[i];
         total_zz_h_buffer[i]     =high_bid_buffer[i];
        }
      //--- Если направление изменилось (вниз)
      else
        {
         if(low_ask_buffer[i]<max_high_bid && 
            fabs(low_ask_buffer[i]-zz_H_buffer[last_zz_max])>MinImpulseSize*_Point)
           {
            last_zz_min          =i;
            direction_zz         =-1;
            min_low_ask          =low_ask_buffer[i];
            zz_L_buffer[i]       =low_ask_buffer[i];
            total_zz_l_buffer[i] =low_ask_buffer[i];
           }
        }
     }
//--- Если направление ZZ вниз
   else
     {
      //--- Если новый минимум
      if(low_ask_buffer[i]<=min_low_ask)
        {
         zz_L_buffer[last_zz_min] =0;
         last_zz_min              =i;
         min_low_ask              =low_ask_buffer[i];
         zz_L_buffer[i]           =low_ask_buffer[i];
         total_zz_l_buffer[i]     =low_ask_buffer[i];
        }
      //--- Если направление изменилось (вверх)
      else
        {
         if(high_bid_buffer[i]>min_low_ask && 
            fabs(high_bid_buffer[i]-zz_L_buffer[last_zz_min])>MinImpulseSize*_Point)
           {
            last_zz_max          =i;
            direction_zz         =1;
            max_high_bid         =high_bid_buffer[i];
            zz_H_buffer[i]       =high_bid_buffer[i];
            total_zz_h_buffer[i] =high_bid_buffer[i];
           }
        }
     }
  }

Отсюда в индикаторных буферах случайные значения.

Причина обращения: