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

 
Yurixx:

Что за проблема с двумерным массивом, подскажите, плз.

Простейший код тестового скрипта:

Выдает сразу две ошибки:

1. "[" - invalid index value, с указанием на двумерный массив ARR в определении процедуры testproc.

2. "ARtst" - parameter conversion not allowed, с указанием на массив ARtst в обращении к процедуре testproc.

С одномерным массивом никаких проблем.

Полностью в коде не разбирался, но тут должно быть так:

void testproc(int ii, double& sum, double& ARR[][6])
 
Alexey Viktorov:

Полностью в коде не разбирался, но тут должно быть так:

Точно ! Спасибо большое.

Еще до конце на освоился с отличиями МТ5 от МТ4. )))

 
Yurixx:

Точно ! Спасибо большое.

Еще до конце на освоился с отличиями МТ5 от МТ4. )))

В mql5 работа с массивами нисколько не отличается от mql4.

 
Alexey Viktorov:

В mql5 работа с массивами нисколько не отличается от mql4.

Как вижу отличается.

В МТ4 в объявлении многомерных массивов в процедурах не требовалось указания размерности в явном виде ни в одном из измерений.

 

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 и всё зависит от последовательности создания хендлов. Измениться может только в случае если один из предыдущих получил ошибку.

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