Ошибки, баги, вопросы - страница 2932
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ошибка в описании:
Структура торговой транзакции (MqlTradeTransaction)
Данное поле называется: time_type
Пытаюсь предоставить пользователю возможность выбирать как таймфреймы, так и их количество из списка меню настроечного окна индикатора:
и хочу, чтобы выбранные им периоды попадали прямиком в PArray. Но из вышеприведённого примера получается, что я присваиваю массиву предзаданные в программе значения, а не то, что вводит пользователь. К тому же компилятор выдаёт варнинги:
При попытке заменить последнюю строку на:
компилятор вообще выдаёт ошибку:
Кроме того, NO_PERIOD=0 означает PERIOD_CURRENT, а мне это не нужно, мне нужно что-то типа false или EMPTY_VALUE, но они вообще не подходят.
Как починить?
Почти починил.
Расскажите, какие методы борьбы существуют для отлова и исправления ошибки "array out of range"?
ArrayResize() делаете перед записью элемента массива, считаете и вбиваете туда количество элементов которые должны быть в массиве, либо использовать динамический массив который сам толстеет. У вас просто выход за пределы массивы, например указано размер 100 элементов, но так как первый элемент №0 некоторые путаются, если записывать цифры подряд то влезет 0-99. Я не профессиональный программист если что(но умею), первое что в голову пришло, это работает)))
ArrayResize() делаете перед записью элемента массива, считаете и вбиваете туда количество элементов которые должны быть в массиве, либо использовать динамический массив который сам толстеет.
Вообще-то, он у меня и так динамический. Из справки: "Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала." Но не является индикаторным буфером, так что придётся руками думать и головой действовать...
Вообще-то, он у меня и так динамический. Из справки: "Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала." Но не является индикаторным буфером, так что придётся руками думать и головой действовать...
Проблема отлова таких ошибок решается только путем использования "прослоек", таких как свой класс-массив, перехватывающий адресацию.
При запуске советника когда алготрейдинг отключен и последующее включение алготрейдинга:
Согласно коду ошибки запрет на торговлю остаётся, хотя свойство TERMINAL_TRADE_ALLOWED равняется true
Результат должен быть таким:
Очевидно, всегда должен ArraySize(Arr)=1. Это в случае успешного копирования. Но в каких случаях копирование бара может не произойти? Ведь когда вылезает ошибка "array out of range", терминал указывает на Arr[0].
Отловил-таки ошибку, цитата из справки:
4401
Запрашиваемая история не найдена
Принтовал в Журнал — получил:
Что теперь с ней делать, куда идти? У меня ли кривые руки или?.. Я ведь копирую всего один бар с 0-го по 1-й. Как его (истории) может не быть? Тем более, что ошибка вылезает далеко не всегда. Или предварительно надо как-то принудительно проверять и подгружать историю?