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

 
Maksym Mudrakov:

Ошибка может быть в количестве цифр после запятой:


Ошибка не в этом, на истории данные не рассчитываются, а с момента создания символа все корректно рассчитывается, подозреваю неправильно работает функция расчета на истории, т.е. это баг.
 
Добрый день, господа.

У меня такая проблема: я только начала в МТ5 допирать, переношу свои индикаторы из МТ4 и столкнулась с проблемами. Мне нужно использовать iMA в одну строчку и получать значение одного конкретного индекса. Видела на форуме сообщения и использование функции iMAGet (как и аналогичные iATRGet и тд). Как я вижу, функции уже не работают, тогда такой вопрос: как изящно получить одно единственное значение iMA? Я используя вышеупомянутые функции пыталась сделать так:

NormalizeDouble(iMAGet(iMA(Symbol(), timeframe, signal_period, 0, MODE_LWMA, PRICE_LOW), shift), Digits())

Знаю, без проверки плохо, но мне приходится портировать старый МТ4 код, по другому не придумала как сделать это попроще (у меня десяток машек, и все работают на разных таймфреймах). Инициализировать машки в oninit не могу, так как код имеет трехступенчатую вложенность, и у меня не получится вызвать нужную машку без геморроя. Поэтому, короче говоря, моя цель превратить

Это :

NormalizeDouble(iMA(Symbol(), timeframe, signal_period, 0, MODE_LWMA, PRICE_LOW, shift), Digits())

в то, что работает на MT5 без резких телодвижений.

 
Olga Miakhovich:
Добрый день, господа.

У меня такая проблема: я только начала в МТ5 допирать, переношу свои индикаторы из МТ4 и столкнулась с проблемами. Мне нужно использовать iMA в одну строчку и получать значение одного конкретного индекса. Видела на форуме сообщения и использование функции iMAGet (как и аналогичные iATRGet и тд). Как я вижу, функции уже не работают, тогда такой вопрос: как изящно получить одно единственное значение iMA? Я используя вышеупомянутые функции пыталась сделать так:


Знаю, без проверки плохо, но мне приходится портировать старый МТ4 код, по другому не придумала как сделать это попроще (у меня десяток машек, и все работают на разных таймфреймах). Инициализировать машки в oninit не могу, так как код имеет трехступенчатую вложенность, и у меня не получится вызвать нужную машку без геморроя. Поэтому, короче говоря, моя цель превратить

Это :

в то, что работает на MT5 без резких телодвижений.

Посмотрите примеры в кодобазе, например этот: https://www.mql5.com/ru/code/27161

По факту: Создаёте в ОнИнит() хендл индикатора

handle_iMA_High=iMA(Symbol(),Period(),Inp_MA_ma_period,Inp_MA_ma_shift,
                       Inp_MA_ma_method,PRICE_HIGH);
//--- if the handle is not created
   if(handle_iMA_High==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iMA indicator (\"Price High\") for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }

Ну а потом копируете в буфер нужный элемент(ы) и с ним работаете

if(CopyBuffer(ind_handle,0,-shift,amount,values)<0)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());

https://www.mql5.com/ru/docs/series/copybuffer

 
Vitaly Muzichenko:

Посмотрите примеры в кодобазе, например этот: https://www.mql5.com/ru/code/27161

По факту: Создаёте в ОнИнит() хендл индикатора

Ну а потом копируете в буфер нужный элемент(ы) и с ним работаете

https://www.mql5.com/ru/docs/series/copybuffer

Как я уже писала, мне не подходит инициализация в OnInit. У меня работа со всеми таймфреймами одновременно, мне придется инициализировать все машки на каждом ТФ, а потом в коде где я использую какое-то значение, делать что-то вроде этого:

if(timeframe = PERIOD_M5)
        CopyBuffer(handle_ma_m5, ...)
if(timeframe = PERIOD_M15)
        CopyBuffer(handle_ma_m15, ...)
...

И так при каждом вызове каждой машки. Код превратится просто в запутанный понос. 

И при этом каждый новый бар нужно будет это как-то обновлять?

Есть ли функция вроде CopyBuffer, только копирующая не массив, а одно значение по нужному индексу?

 
Olga Miakhovich:

Как я уже писала, мне не подходит инициализация в OnInit. У меня работа со всеми таймфреймами одновременно, мне придется инициализировать все машки на каждом ТФ, а потом в коде где я использую какое-то значение, делать что-то вроде этого:

И так при каждом вызове каждой машки. Код превратится просто в запутанный понос. 

И при этом каждый новый бар нужно будет это как-то обновлять?

Есть ли функция вроде CopyBuffer, только копирующая не массив, а одно значение по нужному индексу?

Сделайте массив хендлов в OnInit() и с ними работайте.

CopyBuffer(...) вынесите в функцию для удобства использования, туда подавайте с массива хендл индикаторов и нужный индекс, а функция вернёт цену

 
Vitaly Muzichenko:

Сделайте массив хендлов в OnInit() и с ними работайте.

CopyBuffer(...) вынесите в функцию для удобства использования, туда подавайте с массива хендл индикаторов и нужный индекс, а функция вернёт цену

капец как неудобно, однако)

 
Olga Miakhovich:

капец как неудобно, однако)

Скорее, не привычно )))

 
Vitaly Muzichenko:

Сделайте массив хендлов в OnInit() и с ними работайте.

CopyBuffer(...) вынесите в функцию для удобства использования, туда подавайте с массива хендл индикаторов и нужный индекс, а функция вернёт цену

Еще проблема CopyBuffer в том, что он обязательно требует наличие индикаторного буфера под себя. У меня под сотню индикаторов в сумме, и используются в расчетах чтобы получить один единственный индикатор. Мне нужно создавать сотню буферов чтобы хранить эти значения?

 
Olga Miakhovich:

Еще проблема CopyBuffer в том, что он обязательно требует наличие индикаторного буфера под себя. У меня под сотню индикаторов в сумме, и используются в расчетах чтобы получить один единственный индикатор. Мне нужно создавать сотню буферов чтобы хранить эти значения?

Ищите примеры кодов в КодоБазе у scriptor - Там всё есть.
А вообще-то МАшку можно рассчитать для любого бара.
 
укажите на пост где есть пример чтобы можно было решить такую задачу: есть индикатор№1 на чарте с с десятком графических буферов(не машки и прочая лабутень) и надо чтобы подвальный индикатор№2 брал несколько буферов от индикатора№1 и показывал их в виде гиксограмм (да не важно как) уже в подвале. Зараннее благодарю.  Для МТ5.
Причина обращения: