Отладка mql5 программ в MetaEditor4.

 

Отладку mql4 в MetaEditor4 решилась довольно просто и изящно путем добавления перед OnCalculate (OnTick) следующего кода:

//--->Необходимо для корректной отладки под Win7
class CFix { } ExtFix;
//--->

Перевел индикатор на mql5, но работаю с ним в MetaEditor4. Собственно нужно, чтобы он под MetaTrader4 запускался. А отладчик с mql5 кодом не работает. Используемая фишка не помогает. Кто-нибудь знает способы помимо трассировки в файл?
 

Немного разобрался в теме. Поэтому извиняюсь за некорректно заданный вопрос. И в связи с этим, уточню:

В МТ4 build 670 входит MetaEditor 5 build 966. А В МТ5 build 975 входит MetaEditor 5 build 975.

На mql4 предложили скопировать MetaEditor из МТ4 скопировать в папку установки МТ5. Буду пробовать. Но мне важно, чтобы скомпилированый индикатор работал под МТ4.

 
Rubick:

Немного разобрался в теме. Поэтому извиняюсь за некорректно заданный вопрос. И в связи с этим, уточню:

В МТ4 build 670 входит MetaEditor 5 build 966. А В МТ5 build 975 входит MetaEditor 5 build 975.

На mql4 предложили скопировать MetaEditor из МТ4 скопировать в папку установки МТ5. Буду пробовать. Но мне важно, чтобы скомпилированый индикатор работал под МТ4.

Да, вы можете всегда использовать более новый MetaEditor для обоих платформ.

MetaEditor также содержит встроенный компилятор.

 
Renat:

Да, вы можете всегда использовать более новый MetaEditor для обоих платформ.

MetaEditor также содержит встроенный компилятор.

Чувствую мне надо насколько раскрыть свою проблему, поэтому приведу часть кода, а именно функцию OnCalculate:

int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime &time[],     // Time
                 const double &open[],       // Open
                 const double &high[],       // High
                 const double &low[],        // Low
                 const double &close[],      // Close
                 const long &tick_volume[],  // Tick Volume
                 const long &volume[],       // Real Volume
                 const int &spread[]         // Spread
                 ){
   //--- Объявление переменных
   int UpT=0,DownT=0;
   ResetLastError();//сбрасываем сообщения об ошибках
   if (N1>0) {
      //--- Верхние ТД точки для N1
      Filling_Up_TDPoints_Array(N1,TDHighPoints_N1);
      //--- Нижние ТД точки для N1
      Filling_Low_TDpoints_Array(N1,TDLowPoints_N1);
      //--- Trend Lines Level 1
      UpT=Filling_Up_Trends_Array(N1,TDLowPoints_N1,Lvl1UpTrend);
      PlotIndexSetInteger(6,PLOT_DRAW_BEGIN,UpT);
      DownT=Filling_Down_Trends_Array(N1,TDHighPoints_N1,Lvl1DownTrend);
      PlotIndexSetInteger(7,PLOT_DRAW_BEGIN,DownT);
   }   
   if (N2>0) {
      //--- Верхние ТД точки для N2
      Filling_Up_TDPoints_Array(N2,TDHighPoints_N2);
      //--- Нижние ТД точки для N2
      Filling_Low_TDpoints_Array(N2,TDLowPoints_N2);
      //--- Trend Lines Level 2
      UpT=Filling_Up_Trends_Array(N2,TDLowPoints_N2,Lvl2UpTrend);
      PlotIndexSetInteger(8,PLOT_DRAW_BEGIN,UpT);
      DownT=Filling_Down_Trends_Array(N2,TDHighPoints_N2,Lvl2DownTrend);
      PlotIndexSetInteger(9,PLOT_DRAW_BEGIN,DownT);

   }  
   if (N3>0) {
      //--- Верхние ТД точки для N3
      Filling_Up_TDPoints_Array(N3,TDHighPoints_N3);
      //--- Нижние ТД точки для N3
      Filling_Low_TDpoints_Array(N3,TDLowPoints_N3);
      //--- TD Trend Lines Level 3
      UpT=Filling_Up_Trends_Array(N3,TDLowPoints_N3,Lvl3UpTrend);
      PlotIndexSetInteger(10,PLOT_DRAW_BEGIN,UpT);
      DownT=Filling_Down_Trends_Array(N3,TDHighPoints_N3,Lvl3DownTrend);
      PlotIndexSetInteger(11,PLOT_DRAW_BEGIN,DownT);
   }
   return(rates_total);
}


При запуске алгоритма на отладку с точкой останова у строчки:  UpT=Filling_Up_Trends_Array(N1,TDLowPoints_N1,Lvl1UpTrend);

я получаю график с заполненными всеми тремя парами массивов для верхних и нижних точек Демарка. Массивы точек он заполнил все три пары!, но точка останова то стоит после заполнения первых двух массивов! И она не сработала!

Точка останова срабатывает только на объявлении переменных. В любом месте ниже - нет.

Хорошо. Жму F11 от того места где срабатывает. Меня перекидывают в функцию, вызова которой из OnCalculate вообще не происходит!
 
Rubick:
К сожалению здесь нет телепатов. Для моделирования Вашей проблемы нужен весь код. Иначе (это из опыта) ветка превратится во флуд и проблема никак не будет решена.
 
barabashkakvn:
К сожалению здесь нет телепатов. Для моделирования Вашей проблемы нужен весь код. Иначе (это из опыта) ветка превратится во флуд и проблема никак не будет решена.
Файлы:
_Trends.mq5  22 kb
 
Rubick:
//+------------------------------------------------------------------+
//| Заполнение массива точек для Up-трендов                          |
//+------------------------------------------------------------------+
int Filling_Up_Trends_Array(int N,double &TDLowPointsArray[],double &UpTrend[])

Ошибка выход за диапазон массива. Ошибка видна при отладке. 

Также очень тяжёлые перерасчеты на каждом тике

 
barabashkakvn:

Ошибка выход за диапазон массива.

Так вроде стоит строгая проверка для компилятора, почему же он тогда в журнале не написал?
 
barabashkakvn:

Также очень тяжёлые перерасчеты на каждом тике. 

Это согласен. Вижу что оптимизировать надо, но как пока не придумал.
 
barabashkakvn:

Ошибка видна при отладке. 

А можно подробней, как Вы это увидели. У меня во время отладки ни один стоп не срабатывает! А прогонять всю программу сначала, так там тоже чудеса. Я уже писал, что отладчик начинает скакать по процедурам, вызова которых не происходило.
 
Rubick:
А можно подробней, как Вы это увидели. У меня во время отладки ни один стоп не срабатывает! А прогонять всю программу сначала, так там тоже чудеса. Я уже писал, что отладчик начинает скакать по процедурам, вызова которых не происходило.

Сначала расставил точки останова:

Рис.1. Расстановка точек останова 

Рис.1. Расстановка точек останова