Что делать, если среда разработки неадекватит?

 
Переношу свой индикатор на мт5. Написал и проверил некоторые функции, которые отсутствуют в мт5. Всё скомпилировалось. Теперь думаю всё будет в порядке. Закидываю индикатор на график и.. происходит ругать на строку, в которой вообще кода нет (там комментарии). Как вообще ошибку искать? Ведь среда разработки должна помогать, а не тыкать наобум в любую строку..
 
hoz:
Переношу свой индикатор на мт5. Написал и проверил некоторые функции, которые отсутствуют в мт5. Всё скомпилировалось. Теперь думаю всё будет в порядке. Закидываю индикатор на график и.. происходит ругать на строку, в которой вообще кода нет (там комментарии). Как вообще ошибку искать? Ведь среда разработки должна помогать, а не тыкать наобум в любую строку..

Или код в студию или к телепатам на сеанс.

 
Vladimir Karputov:

Или код в студию или к телепатам на сеанс.

Прилагаю код индикатора и библиотеку, которую написал для работы с таймсериями рыночных данных

Файлы:
 
hoz:

Прилагаю код индикатора и библиотеку, которую написал для работы с таймсериями рыночных данных

Так как Вы делаете вызов функций из библиотеки - при компиляции невозможно проверить ошибки (нужно делать включаемый файл mqh).

Вероятно ошибка здесь:

// 7.1 Возвращает значение времени открытия бара торгового инструмента активного окна, находящегося на shift баров от 0-го бара в историю. =========================================
datetime getBarOpenTime(int shift,                                       // Индекс бара, время открытия которого требуется определить
                        ENUM_TIMEFRAMES tf = PERIOD_CURRENT) export 
  {    // ТФ, на котором будет происходить поиск открытия баров функцией CopyTime()
   datetime barOpenTime[];
   CopyTime(_Symbol,tf,shift,1,barOpenTime);
   return barOpenTime[0];
  }

CopyTime вызывается в воздух, без проверки результата.

 
Vladimir Karputov:

Так как Вы делаете вызов функций из библиотеки - при компиляции невозможно проверить ошибки (нужно делать включаемый файл mqh).

Вероятно ошибка здесь:

CopyTime вызывается в воздух, без проверки результата.

Уже проверил:

// 7.1 Возвращает значение времени открытия бара торгового инструмента активного окна, находящегося на shift баров от 0-го бара в историю. =========================================
datetime getBarOpenTime(int shift,                                       // Индекс бара, время открытия которого требуется определить
                        ENUM_TIMEFRAMES tf = PERIOD_CURRENT) export {    // ТФ, на котором будет происходить поиск открытия баров функцией CopyTime()
  datetime barOpenTime[];
  if (CopyTime(_Symbol, tf, shift, 1, barOpenTime) == -1)
    return -1;
  return barOpenTime[0];
}

// 7.2 Возвращает значение времени открытия бара заданного торгового инструмента, находящегося на shift баров от 0-го бара в историю. ==============================================
datetime getBarOpenTime(int shift,                                       // Индекс бара, время открытия которого требуется определить
                        string tradingInstrument,                        // Торговый инструмент, на котором будет произведён поиск
                        ENUM_TIMEFRAMES tf = PERIOD_CURRENT) export {    // ТФ, на котором будет происходить поиск открытия баров функцией CopyTime()
  datetime barOpenTime[];
  if (CopyTime(tradingInstrument, tf, shift, 1, barOpenTime) == -1)
    return -1;
  return barOpenTime[0];
}

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

А как раньше было реализовано в мкл4 так что не было таких касяков? Ведь, по сути, там и ошибки то быть не может. Я копирую 1 время открытие и его же возвращаю. По сути, написан код как и раньше. Но работает не так.

Я так понимаю буедт лишним делать какие-либо проверки в самом индикаторе. Как-то ведь раньше получалось значение времени открытия в самой iTime(). Неужели сейчас это без проблем не возможно вообще сделать? Это такие удобства в mql5 что-ли, что для получения элемента таймсерии нужно страницы проверок понаписывать? Ведь было же это нормально вполне..

Файлы:
 
hoz:

Уже проверил:

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

А как раньше было реализовано в мкл4 так что не было таких касяков? Ведь, по сути, там и ошибки то быть не может. Я копирую 1 время открытие и его же возвращаю. По сути, написан код как и раньше. Но работает не так.

Я так понимаю буедт лишним делать какие-либо проверки в самом индикаторе. Как-то ведь раньше получалось значение времени открытия в самой iTime(). Неужели сейчас это без проблем не возможно вообще сделать? Это такие удобства в mql5 что-ли, что для получения элемента таймсерии нужно страницы проверок понаписывать? Ведь было же это нормально вполне..

Всегда было так - что нужно проверять возвращаемое из функции значение. Загляните в справку по МТ4 и поглядите что возвращают функции в случае ошибок.

Другое дело, что многие горе-программеры просто никогда не проверяли возврат из функции на ошибки, и теперь считают, что стало хуже... А ведь никакой разницы и нет. Кто раньше писал корректный код с проверками результата, тот и сейчас продолжает это делать. А вот кто раньше писал чудо-поделки, тому сейчас конечно хуже - его заставили проверять на ошибки. А как хорошо было раньше "на авось" всё делать ... :)

 
Artyom Trishkin:

Всегда было так - что нужно проверять возвращаемое из функции значение. Загляните в справку по МТ4 и поглядите что возвращают функции в случае ошибок.

Другое дело, что многие горе-программеры просто никогда не проверяли возврат из функции на ошибки, и теперь считают, что стало хуже... А ведь никакой разницы и нет. Кто раньше писал корректный код с проверками результата, тот и сейчас продолжает это делать. А вот кто раньше писал чудо-поделки, тому сейчас конечно хуже - его заставили проверять на ошибки. А как хорошо было раньше "на авось" всё делать ... :)

Так я же последний раз проверил всё. Что не так?

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

 
hoz:

Так я же последний раз проверил всё. Что не так?

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

datetime iTime(string symb,ENUM_TIMEFRAMES tf,int index) {
datetime Arr[1];
  return((CopyTime(symb,tf,index,1,Arr)==1)?Arr[0]:WRONG_VALUE);
 }
//-------------------------------------------------------------------------------------------------------
double iOpen(string symb,ENUM_TIMEFRAMES tf,int index) {
double Arr[1];
  return((CopyOpen(symb,tf,index,1,Arr)==1)?Arr[0]:WRONG_VALUE);
 }
//-------------------------------------------------------------------------------------------------------
double iClose(string symb,ENUM_TIMEFRAMES tf,int index) {
double Arr[1];
  return((CopyClose(symb,tf,index,1,Arr)==1)?Arr[0]:WRONG_VALUE);
 }
//-------------------------------------------------------------------------------------------------------
double iLow(string symb,ENUM_TIMEFRAMES tf,int index) {
double Arr[1];
  return((CopyLow(symb,tf,index,1,Arr)==1)?Arr[0]:WRONG_VALUE);
 }
//-------------------------------------------------------------------------------------------------------
double iHigh(string symb,ENUM_TIMEFRAMES tf,int index) {
double Arr[1];
  return((CopyHigh(symb,tf,index,1,Arr)==1)?Arr[0]:WRONG_VALUE);
 }
 

Vitaly Muzichenko, по сути, у меня тоже самое написано, разве что без тернатрного оператора. Хотя, другие функции я с тернарным оператором писал в этой же библиотеке. Странно, что я проверял втестовом эксперте, всё получается верно.

В справке написано, что рекомендуется передавать в CopyTime динамический массив. Вы размер задали, что бы сэкономить ресурсы я так понял. Согласен. Я тоже так сделаю. Разумно.

Всё-равно, кстати, индикатор не рисует ничего ((

 

Я обнаружил вот что:


 
hoz:

Я обнаружил вот что:

Явно задаете нулевые значения буферам и обнуляете их при первом запуске?

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