Ошибки, баги, вопросы - страница 2931

 
x572intraday:

даёт результат 16388. Как проделать обратную процедуру: подставить значение 16388 и в результате получить строку с названием периода PERIOD_H4? Есть ли встроенная функция или надо писать свой конвертер? Если нет встроенной, как примерно могла бы выглядеть кастомная функция? Возможно, придётся писать что-то типа соответствия "ключ — значение"?

Print(EnumToString((ENUM_TIMEFRAMES)16388));
 
fxsaber
Print(EnumToString((ENUM_TIMEFRAMES)16388));

 Оказывается, есть. Это радует. Благодарю!

 

 Пытаюсь предоставить пользователю возможность выбирать как таймфреймы, так и их количество из списка меню настроечного окна индикатора:

enum PERIOD
  {
   NO_PERIOD=0,      // NOT USED
   P1=PERIOD_H1,     // H1 
   P2=PERIOD_H2,     // H2 
   P3=PERIOD_H4,     // H4 
  };

input PERIOD TIMEFRAME_1=P1;
input PERIOD TIMEFRAME_2=P2;
input PERIOD TIMEFRAME_3=P3;

ENUM_TIMEFRAMES PArray[3]={P1,P2,P3};

и хочу, чтобы выбранные им периоды попадали прямиком в PArray. Но из вышеприведённого примера получается, что я присваиваю массиву предзаданные в программе значения, а не то, что вводит пользователь. К тому же компилятор выдаёт варнинги:

implicit conversion from 'enum PERIOD' to 'enum ENUM_TIMEFRAMES'        test.mq5        23      28
   'ENUM_TIMEFRAMES::PERIOD_H1' will be used instead of 'PERIOD::P1'    test.mq5        23      28
implicit conversion from 'enum PERIOD' to 'enum ENUM_TIMEFRAMES'        test.mq5        23      31
   'ENUM_TIMEFRAMES::PERIOD_H2' will be used instead of 'PERIOD::P2'    test.mq5        23      31
implicit conversion from 'enum PERIOD' to 'enum ENUM_TIMEFRAMES'        test.mq5        23      34
   'ENUM_TIMEFRAMES::PERIOD_H4' will be used instead of 'PERIOD::P3'    test.mq5        23      34

 При попытке заменить последнюю строку на:

ENUM_TIMEFRAMES PArray[3]={TIMEFRAME_1,TIMEFRAME_2,TIMEFRAME_3};

компилятор вообще выдаёт ошибку:

'TIMEFRAME_1' - constant expression required    test.mq5        23      28
'TIMEFRAME_2' - constant expression required    test.mq5        23      40
'TIMEFRAME_3' - constant expression required    test.mq5        23      52

 Кроме того, NO_PERIOD=0 означает PERIOD_CURRENT, а мне это не нужно, мне нужно что-то типа false или EMPTY_VALUE, но они вообще не подходят.

 Как починить?

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Периоды графиков - Константы графиков - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Ошибка в описании:

Ошибка

Данное поле называется: time_type

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
  • www.mql5.com
Структура торговой транзакции - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
x572intraday:

 Пытаюсь предоставить пользователю возможность выбирать как таймфреймы, так и их количество из списка меню настроечного окна индикатора:

и хочу, чтобы выбранные им периоды попадали прямиком в PArray. Но из вышеприведённого примера получается, что я присваиваю массиву предзаданные в программе значения, а не то, что вводит пользователь. К тому же компилятор выдаёт варнинги:

 При попытке заменить последнюю строку на:

компилятор вообще выдаёт ошибку:

 Кроме того, NO_PERIOD=0 означает PERIOD_CURRENT, а мне это не нужно, мне нужно что-то типа false или EMPTY_VALUE, но они вообще не подходят.

 Как починить?

  Почти починил.

 
Не держатся настройки символа в тестере, время торговых сессий урезается в четверг и пятницу, из за этого постоянно ошибка market closed, позиции не открываются, оптимизация невозможна, робот работает неправильно, у других брокеров  все нормально, но нужен именно этот, что делать? Буквально недавно такого не было. Раньше эти настройки держались и самовольно не менялись, что это? Кто знает что делать? Регистрировал новый счет, чистил терминал от временных файлов, пробовал на другом терминале, не помогает. видео проблемы https://radikal.ru/video/1HA3UfUNVZt
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
  • www.mql5.com
SymbolInfoSessionQuote - Получение рыночной информации - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
 Расскажите, какие методы борьбы существуют для отлова и исправления ошибки "array out of range"? Во-первых, вывести Print'ом элемент массива, вышедшего за пределы памяти, не получается, так как ошибка лезет вперёд него и до печати дело не доходит. Во-вторых, эта ошибка вылезает не систематически, а как ей вздумается: один раз вылезла и индикатор не отработал (но висит на графике в списке индикаторов), а в последующие разы её уже нет, причём без перекомпиляции индикатора, не говоря уже о его правке.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Переменные - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
x572intraday:
 Расскажите, какие методы борьбы существуют для отлова и исправления ошибки "array out of range"? 

ArrayResize() делаете перед записью элемента массива, считаете и вбиваете туда количество элементов которые должны быть в массиве, либо использовать динамический массив который сам толстеет. У вас просто выход за пределы массивы, например указано размер 100 элементов, но так как первый элемент №0 некоторые путаются, если записывать цифры подряд то влезет 0-99. Я не профессиональный программист если что(но умею), первое что в голову пришло, это работает))) 

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Объект динамического массива - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
freelancerAntonyan:

ArrayResize() делаете перед записью элемента массива, считаете и вбиваете туда количество элементов которые должны быть в массиве, либо использовать динамический массив который сам толстеет.

 Вообще-то, он у меня и так динамический. Из справки: "Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала." Но не является индикаторным буфером, так что придётся руками думать и головой действовать...

 
x572intraday:

 Вообще-то, он у меня и так динамический. Из справки: "Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала." Но не является индикаторным буфером, так что придётся руками думать и головой действовать...

Проблема отлова таких ошибок решается только путем использования "прослоек", таких как свой класс-массив, перехватывающий адресацию.

MQL's OOP notes: rubber arrays, safe numbers, exceptions handling and other tricks: part 1
MQL's OOP notes: rubber arrays, safe numbers, exceptions handling and other tricks: part 1
  • 2016.11.08
  • www.mql5.com
Today we're starting a patchy subject, which will combine many different things. This is why I decided to split it into parts. Out final goal is exception handling, but before we can address it, we