Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Pavel Trofimov
1731
Pavel Trofimov  

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

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

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

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

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

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

MetaQuotes
Админ
25206
Renat Fatkhullin  
Rubick:

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

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

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

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

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

Pavel Trofimov
1731
Pavel Trofimov  
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 вообще не происходит!
Vladimir Karputov
Модератор
55819
Vladimir Karputov  
Rubick:
К сожалению здесь нет телепатов. Для моделирования Вашей проблемы нужен весь код. Иначе (это из опыта) ветка превратится во флуд и проблема никак не будет решена.
Pavel Trofimov
1731
Pavel Trofimov  
barabashkakvn:
К сожалению здесь нет телепатов. Для моделирования Вашей проблемы нужен весь код. Иначе (это из опыта) ветка превратится во флуд и проблема никак не будет решена.
Файлы:
_Trends.mq5 22 kb
Vladimir Karputov
Модератор
55819
Vladimir Karputov  
Rubick:
//+------------------------------------------------------------------+
//| Заполнение массива точек для Up-трендов                          |
//+------------------------------------------------------------------+
int Filling_Up_Trends_Array(int N,double &TDLowPointsArray[],double &UpTrend[])

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

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

Pavel Trofimov
1731
Pavel Trofimov  
barabashkakvn:

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

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

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

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

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

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

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

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

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

 

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий