даёт результат 16388. Как проделать обратную процедуру: подставить значение 16388 и в результате получить строку с названием периода PERIOD_H4? Есть ли встроенная функция или надо писать свой конвертер? Если нет встроенной, как примерно могла бы выглядеть кастомная функция? Возможно, придётся писать что-то типа соответствия "ключ — значение"?
Пытаюсь предоставить пользователю возможность выбирать как таймфреймы, так и их количество из списка меню настроечного окна индикатора:
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 'enumENUM_TIMEFRAMES' test.mq5 2328
'ENUM_TIMEFRAMES::PERIOD_H1' will be used instead of 'PERIOD::P1' test.mq5 2328
implicit conversion from 'enum PERIOD' to 'enumENUM_TIMEFRAMES' test.mq5 2331
'ENUM_TIMEFRAMES::PERIOD_H2' will be used instead of 'PERIOD::P2' test.mq5 2331
implicit conversion from 'enum PERIOD' to 'enumENUM_TIMEFRAMES' test.mq5 2334
'ENUM_TIMEFRAMES::PERIOD_H4' will be used instead of 'PERIOD::P3' test.mq5 2334
Структура торговой транзакции - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Пытаюсь предоставить пользователю возможность выбирать как таймфреймы, так и их количество из списка меню настроечного окна индикатора:
и хочу, чтобы выбранные им периоды попадали прямиком в PArray. Но из вышеприведённого примера получается, что я присваиваю массиву предзаданные в программе значения, а не то, что вводит пользователь. К тому же компилятор выдаёт варнинги:
При попытке заменить последнюю строку на:
компилятор вообще выдаёт ошибку:
Кроме того, NO_PERIOD=0 означает PERIOD_CURRENT, а мне это не нужно, мне нужно что-то типа false или EMPTY_VALUE, но они вообще не подходят.
Не держатся настройки символа в тестере, время торговых сессий урезается в четверг и пятницу, из за этого постоянно ошибка market closed, позиции не открываются, оптимизация невозможна, робот работает неправильно, у других брокеров все нормально, но нужен именно этот, что делать? Буквально недавно такого не было. Раньше эти настройки держались и самовольно не менялись, что это? Кто знает что делать? Регистрировал новый счет, чистил терминал от временных файлов, пробовал на другом терминале, не помогает. видео проблемы https://radikal.ru/video/1HA3UfUNVZt
Расскажите, какие методы борьбы существуют для отлова и исправления ошибки "array out of range"? Во-первых, вывести Print'ом элемент массива, вышедшего за пределы памяти, не получается, так как ошибка лезет вперёд него и до печати дело не доходит. Во-вторых, эта ошибка вылезает не систематически, а как ей вздумается: один раз вылезла и индикатор не отработал (но висит на графике в списке индикаторов), а в последующие разы её уже нет, причём без перекомпиляции индикатора, не говоря уже о его правке.
x572intraday: Расскажите, какие методы борьбы существуют для отлова и исправления ошибки "array out of range"?
ArrayResize() делаете перед записью элемента массива, считаете и вбиваете туда количество элементов которые должны быть в массиве, либо использовать динамический массив который сам толстеет. У вас просто выход за пределы массивы, например указано размер 100 элементов, но так как первый элемент №0 некоторые путаются, если записывать цифры подряд то влезет 0-99. Я не профессиональный программист если что(но умею), первое что в голову пришло, это работает)))
Объект динамического массива - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
ArrayResize() делаете перед записью элемента массива, считаете и вбиваете туда количество элементов которые должны быть в массиве, либо использовать динамический массив который сам толстеет.
Вообще-то, он у меня и так динамический. Из справки: "Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала." Но не является индикаторным буфером, так что придётся руками думать и головой действовать...
Вообще-то, он у меня и так динамический. Из справки: "Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала." Но не является индикаторным буфером, так что придётся руками думать и головой действовать...
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
даёт результат 16388. Как проделать обратную процедуру: подставить значение 16388 и в результате получить строку с названием периода PERIOD_H4? Есть ли встроенная функция или надо писать свой конвертер? Если нет встроенной, как примерно могла бы выглядеть кастомная функция? Возможно, придётся писать что-то типа соответствия "ключ — значение"?
Оказывается, есть. Это радует. Благодарю!
Пытаюсь предоставить пользователю возможность выбирать как таймфреймы, так и их количество из списка меню настроечного окна индикатора:
и хочу, чтобы выбранные им периоды попадали прямиком в PArray. Но из вышеприведённого примера получается, что я присваиваю массиву предзаданные в программе значения, а не то, что вводит пользователь. К тому же компилятор выдаёт варнинги:
При попытке заменить последнюю строку на:
компилятор вообще выдаёт ошибку:
Кроме того, NO_PERIOD=0 означает PERIOD_CURRENT, а мне это не нужно, мне нужно что-то типа false или EMPTY_VALUE, но они вообще не подходят.
Как починить?
Ошибка в описании:
Структура торговой транзакции (MqlTradeTransaction)
Данное поле называется: time_type
Пытаюсь предоставить пользователю возможность выбирать как таймфреймы, так и их количество из списка меню настроечного окна индикатора:
и хочу, чтобы выбранные им периоды попадали прямиком в PArray. Но из вышеприведённого примера получается, что я присваиваю массиву предзаданные в программе значения, а не то, что вводит пользователь. К тому же компилятор выдаёт варнинги:
При попытке заменить последнюю строку на:
компилятор вообще выдаёт ошибку:
Кроме того, NO_PERIOD=0 означает PERIOD_CURRENT, а мне это не нужно, мне нужно что-то типа false или EMPTY_VALUE, но они вообще не подходят.
Как починить?
Почти починил.
Расскажите, какие методы борьбы существуют для отлова и исправления ошибки "array out of range"?
ArrayResize() делаете перед записью элемента массива, считаете и вбиваете туда количество элементов которые должны быть в массиве, либо использовать динамический массив который сам толстеет. У вас просто выход за пределы массивы, например указано размер 100 элементов, но так как первый элемент №0 некоторые путаются, если записывать цифры подряд то влезет 0-99. Я не профессиональный программист если что(но умею), первое что в голову пришло, это работает)))
ArrayResize() делаете перед записью элемента массива, считаете и вбиваете туда количество элементов которые должны быть в массиве, либо использовать динамический массив который сам толстеет.
Вообще-то, он у меня и так динамический. Из справки: "Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала." Но не является индикаторным буфером, так что придётся руками думать и головой действовать...
Вообще-то, он у меня и так динамический. Из справки: "Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала." Но не является индикаторным буфером, так что придётся руками думать и головой действовать...
Проблема отлова таких ошибок решается только путем использования "прослоек", таких как свой класс-массив, перехватывающий адресацию.