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

 

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

Ошибка

Данное поле называется: 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
 

При запуске советника когда алготрейдинг отключен и последующее включение алготрейдинга:

Согласно коду ошибки запрет на торговлю остаётся, хотя свойство TERMINAL_TRADE_ALLOWED равняется true

#include <Greshnik\\ErrorDescription.mqh>
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
     {
      return;
     }
   MqlTradeRequest tr;
   MqlTradeResult r;
   ResetLastError();
   if(!OrderSend(tr,r))
     {
      int err=GetLastError();
      Print(err,"  ",cLng::CodeDescription(err));
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
2020.12.30 15:25:38.629 Experts automated trading is enabled
2020.12.30 15:25:39.159 Test1 (EURUSD,M1)       4752  Торговля для эксперта запрещена
2020.12.30 15:25:40.297 Test1 (EURUSD,M1)       4752  Торговля для эксперта запрещена
2020.12.30 15:25:40.397 Test1 (EURUSD,M1)       4752  Торговля для эксперта запрещена
2020.12.30 15:25:40.499 Test1 (EURUSD,M1)       4752  Торговля для эксперта запрещена
2020.12.30 15:25:40.725 Test1 (EURUSD,M1)       4752  Торговля для эксперта запрещена
2020.12.30 15:25:42.781 Test1 (EURUSD,M1)       4752  Торговля для эксперта запрещена
2020.12.30 15:25:43.129 Test1 (EURUSD,M1)       4752  Торговля для эксперта запрещена
2020.12.30 15:25:43.758 Experts automated trading is disabled

Результат должен быть таким:

2020.12.30 15:29:58.406 Experts automated trading is enabled
2020.12.30 15:30:02.247 Test1 (EURUSD,M1)       4756  Не удалось отправить торговый запрос
2020.12.30 15:30:02.368 Test1 (EURUSD,M1)       4756  Не удалось отправить торговый запрос
2020.12.30 15:30:02.486 Test1 (EURUSD,M1)       4756  Не удалось отправить торговый запрос
2020.12.30 15:30:04.320 Experts automated trading is disabled
 
 
CopyTime(_Symbol,tf,0,1,Arr);
 Очевидно, всегда должен ArraySize(Arr)=1. Это в случае успешного копирования. Но в каких случаях копирование бара может не произойти? Ведь когда вылезает ошибка "array out of range", терминал указывает на Arr[0].
 
x572intraday:
   Очевидно, всегда должен ArraySize(Arr)=1. Это в случае успешного копирования. Но в каких случаях копирование бара может не произойти? Ведь когда вылезает ошибка "array out of range", терминал указывает на Arr[0].

 Отловил-таки ошибку, цитата из справки:

4401

Запрашиваемая история не найдена

Принтовал в Журнал — получил:

2020.12.31 14:45:20.474 test (EURUSD,H2)        ArraySize(Arr)=0; copied=-1; TF=PERIOD_H2
2020.12.31 14:45:20.474 test (EURUSD,H2)        Error Code = 4401

 Что теперь с ней делать, куда идти? У меня ли кривые руки или?.. Я ведь копирую всего один бар с 0-го по 1-й. Как его (истории) может не быть? Тем более, что ошибка вылезает далеко не всегда. Или предварительно надо как-то принудительно проверять и подгружать историю?

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