Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1173

 

MQL5 iBarShift

Согласно документации mql5 функция iBarShift возвращает значение типа int.

int #

Целый тип int имеет размер 4 байта (32 бита). Минимальное значение -2 147 483 648, максимальное значение 2 147 483 647.


У меня iBarShift никак не хочет выдавать значение больше 99999

Рисую на графике трендовую линию, следующий скрипт получает время начала линии и выводит порядковый номер бара этого времени.

При смещении линии назад по истории в какой-то момент выводимое значение останавливается на 99999, а если  

bool                exact=false      // режим

   поменять на true то выводит -1, при том, что GetLastError = 0

void OnStart()
  {
int total = ObjectsTotal(0, 0, -1);  // Общее кол-во объектов на: /текущий график/главное окно/все типы объектов
datetime time0 = 0; // Время соответствующее началу трендовой линии
string objname = ""; // Имя объекта (трендовой линии)
int shift = 0; // Номер бара, соответствующего времени начала трендовой линии time0

for(int i = total - 1; i >= 0; i--)
     {
     objname = (string)ObjectName(0, i, 0, OBJ_TREND);
     time0 = ObjectGetInteger(0, objname, OBJPROP_TIME, 0);
     shift = iBarShift(NULL, PERIOD_M1, time0, false);
     Comment("shift: ", shift, " Error: ", GetLastError());
     Sleep(2000);
     }
  }

Что не так?

Пробовал разные графики разных брокеров, время с линии снимается верно, если PERIOD_M1 поменять на М5, например, то для достижения 99999 надо двигать еще дальше по истории

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Целый тип char занимает в памяти 1 байт (8 бит) и позволяет выразить в двоичной системе счисления 2^8 значений=256. Тип char может содержать как положительные, так и отрицательные значения. Диапазон изменения значений составляет от -128 до 127. uchar # Целый тип uchar также занимает в памяти 1 байт, как и тип char, но в отличие от него, uchar...
Файлы:
sc1.mq5  3 kb
 
Sunriser:

MQL5 iBarShift

Согласно документации mql5 функция iBarShift возвращает значение типа int.

int #

Целый тип int имеет размер 4 байта (32 бита). Минимальное значение -2 147 483 648, максимальное значение 2 147 483 647.


У меня iBarShift никак не хочет выдавать значение больше 99999

Рисую на графике трендовую линию, следующий скрипт получает время начала линии и выводит порядковый номер бара этого времени.

При смещении линии назад по истории в какой-то момент выводимое значение останавливается на 99999, а если  

bool                exact=false      // режим

   поменять на true то выводит -1, при том, что GetLastError = 0

Что не так?

Пробовал разные графики разных брокеров, время с линии снимается верно, если PERIOD_M1 поменять на М5, например, то для достижения 99999 надо двигать еще дальше по истории

Первым делом проверьте в настройках терминала максимальное количество баров.

 
Uladzimir Izerski:

Первым делом проверьте в настройках терминала максимальное количество баров.

Спасибо!

Стояло 10000, поменял на unlimited - заработало.

Однако не очевидная вещь..

 

Подскажите по созданию хендлов

Есть вот такая штука

int OnInit()
  {
//-создадим хэндл индикатора
      handle=iAO(name,period);
//-если не удалось создать хэндл
   if(handle==INVALID_HANDLE)
     {
      ...
      return(INIT_FAILED);
     }

Вопрос: От каких параметров назначается номер(цифры) хендла?
             Может ли он после перезагрузки терминала быть другим?
             Может ли он после переинициализации графика быть другим?
             В каких случаях он может изменится?

 
Vitaly Muzichenko:

Подскажите по созданию хендлов

Есть вот такая штука

Вопрос: От каких параметров назначается номер(цифры) хендла?
             Может ли он после перезагрузки терминала быть другим?
             Может ли он после переинициализации графика быть другим?
             В каких случаях он может изменится?

Если индикатор один, он всегда имеет хендл 10. Каждый следующий равен предыдущий+1 и всё зависит от последовательности создания хендлов. Измениться может только в случае если один из предыдущих получил ошибку.

 
Alexey Viktorov:

Если индикатор один, он всегда имеет хендл 10. Каждый следующий равен предыдущий+1 и всё зависит от последовательности создания хендлов. Измениться может только в случае если один из предыдущих получил ошибку.

Ясно, примерно понятно. Спасибо!

 
Vitaly Muzichenko:

Подскажите по созданию хендлов

Есть вот такая штука

Вопрос: От каких параметров назначается номер(цифры) хендла?
             Может ли он после перезагрузки терминала быть другим?
             Может ли он после переинициализации графика быть другим?
             В каких случаях он может изменится?

Нашёл ответы

Сравниваем скорость самокэширующихся индикаторов
Сравниваем скорость самокэширующихся индикаторов
  • www.mql5.com
Предположим, что нам вдруг наскучил классический MQL5-доступ к индикаторам и захотелось сравнить скорость доступа в сравнении с альтернативными вариантами. Например, сравним его с доступом к индикаторам в стиле MQL4 без кэширования и с кэшированием. Идеи с доступом в MQL4-стиле были взяты из статьи LifeHack для трейдера: готовим фастфуд из...
 
Куда возможно вставить файл, чтобы он был виден, через наследование, всем файлам в стандартной библиотеке?
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.
 

Подскажите, пожалуйста, как правильно передать в функцию многомерный массив.

Если просто указать в заголовке MyFun( &Mas[][] ), то на обращение к элементу массива Mas[j][k] в теле функции компилятор выдаёт ошибку.. А как?

С одномерными вроде бы проблем нет.

 
User_mt5:

Подскажите, пожалуйста, как правильно передать в функцию многомерный массив.

Если просто указать в заголовке MyFun( &Mas[][] ), то на обращение к элементу массива Mas[j][k] в теле функции компилятор выдаёт ошибку.. А как?

С одномерными вроде бы проблем нет.

Второе и следующие измерения массива не могут быть динамическими. Следовательно как объявлен массив, к примеру int Mas[][7]; так и принимать его надо MyFun(int &Mas[][7])