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

 
-Aleks-:

Получаю ошибки - что не так? В MQL4 работает...


'{' - too many initializers TZ_Sky_and_Ground_V_04.mq5 2484 6

 

Надо ставить arrFibo[18] - мол 18 элементов.
 
Vladimir Karputov:

Справку iMA смотрели?

Шаг первый: в "шапке" объявляем переменную для хранения хендла индикатора iMA:

Шаг второй: в OnInit() создаём хендл индикатора.

И результат (перекрестие на скриншоте установлено на бар #1):

 

Ещё такой вопрос, если у меня индикатор в цикле перебирается, то мне надо так же ставить double MA[1]; или больший размер массива лучше сразу запросить/получить? Я просто вообще не понимаю, зачем эти сложности нужны - в чем там преимущество по сравнению с MQL4.
 
-Aleks-:

 

Ещё такой вопрос, если у меня индикатор в цикле перебирается, то мне надо так же ставить double MA[1]; или больший размер массива лучше сразу запросить/получить? Я просто вообще не понимаю, зачем эти сложности нужны - в чем там преимущество по сравнению с MQL4.


Мой пример с функцией iMAGet - это пример заточенный для получения с индикатора одного значения за один раз. Если нужно получить с индикатора сразу несколько значения подряд - Вам нужно использовать CopyBuffer с параметрами "от" и "до" и сохранением результата в массив. 


Добавлено: позже будет пример ...


Обещанный пример.

Входные параметры:

  • get values into an array - если значение "true" - значит используем получение значения индикатора в массив, если "false" - значит получаем по одному значению за раз
  • count -> only if "get values into an array"==true - количество баров копируемых в массив
  • start position -> only if "get values into an array"==true - номер начального элемента (бара) начиная с которого будет копировать в масив

Работа с массивом и индикатором Moving Avegarege в советнике:

Работа с массивом и индикатором Moving Avegarege в советнике

Обратите внимание, на массив arr_ma и значения элементов с индексом #0 и с индексом #8.

ds

Файлы:
iMAGet.mq5  12 kb
 
Vladimir Karputov:


Мой пример с функцией iMAGet - это пример заточенный для получения с индикатора одного значения за один раз. Если нужно получить с индикатора сразу несколько значения подряд - Вам нужно использовать CopyBuffer с параметрами "от" и "до" и сохранением результата в массив. 

Добавлено: позже будет пример ...

Обещанный пример.

Входные параметры:

  • get values into an array - если значение "true" - значит используем получение значения индикатора в массив, если "false" - значит получаем по одному значению за раз
  • count -> only if "get values into an array"==true - количество баров копируемых в массив
  • start position -> only if "get values into an array"==true - номер начального элемента (бара) начиная с которого будет копировать в масив

Работа с массивом и индикатором Moving Avegarege в советнике:

Обратите внимание, на массив arr_ma и значения элементов с индексом #0 и с индексом #8.

ds

 

Спасибо за пример!

Для меня очень важным является понять, есть ли преимущество при запрашивании одного значения индикатора и копированием десятка значений индикатора - может были какие исследования на этот счет?

То, что тайм серия получилась перевернутой - это не есть хорошо - я привык к стандарту нумерации баров 0123 , а тут получается в обратном порядке 1230.

Если я не знаю, какое количество баров мне будет нужно при переборе (к примеру ищем точку пересечения МА и бара), то надо запрашивать максимально возможное число? Это как то влияет на производительность?

 
-Aleks-:

 

Спасибо за пример!

Для меня очень важным является понять, есть ли преимущество при запрашивании одного значения индикатора и копированием десятка значений индикатора - может были какие исследования на этот счет?

...


А кто нам мешает самим такое исследование провести :) ?

...

То, что тайм серия получилась перевернутой - это не есть хорошо - я привык к стандарту нумерации баров 0123 , а тут получается в обратном порядке 1230.

...

Нужно всё го лишь после получения массива (после обращения к iMAGetArray) выполнить ArraySetAsSeries('наш массив',true).
...

Если я не знаю, какое количество баров мне будет нужно при переборе (к примеру ищем точку пересечения МА и бара), то надо запрашивать максимально возможное число? Это как то влияет на производительность?


В таких случаях лучше делать несколько запросов. Например первый запрос - 50 элементов, если нужно - второй запрос (снова 50 элементов) ...
 
Vladimir Karputov:

А кто нам мешает самим такое исследование провести :) ?


Мне мешает моя безграмотность в MQL5 - могу ввести всех в заблуждение из-за ошибки в коде, а вот Ваш профессионализм внушал бы большее доверие к подобным исследованиям!

Vladimir Karputov:


Нужно всё го лишь после получения массива (после обращения к iMAGetArray) выполнить ArraySetAsSeries('наш массив',true).

Т.е. сделать это в функции сразу?


Vladimir Karputov:


В таких случаях лучше делать несколько запросов. Например первый запрос - 50 элементов, если нужно - второй запрос (снова 50 элементов) ...
Брр... т.е. вкладывать цикл в цикл? А почему 50, а не 100? Всё ж таки исследования на эту тему необходимы, а то может смысл в получении информации больше чем об одном баре отсутствует...
 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL4 MT4 MetaTrader 4".
 
-Aleks-:

...

Т.е. сделать это в функции сразу?

...


Переворачивать массив лучше в:

Vladimir Karputov:

Нужно всё го лишь после получения массива (после обращения к iMAGetArray) выполнить ArraySetAsSeries('наш массив',true).

-Aleks-:

...

Брр... т.е. вкладывать цикл в цикл? А почему 50, а не 100? Всё ж таки исследования на эту тему необходимы, а то может смысл в получении информации больше чем об одном баре отсутствует...

Никаких вложенных циклов - будет всего один цикл обхода всех значений: вся обработка идёт последовательно - поиск результата в отдельной функции (в ней запрашиваем какое-то определённое значение - например 50 значений). Если результат не найдем - делаем новый запрос. 

 

Работа с индикаторами в MQL5 после MQL4 ужасна! Меня реально тошнит.

Я не понимаю, почему нельзя всё скомпоновать в одну функцию, в том числе хэндл, а не размазывать вызов индикатора по всему коду!?

А если настройки индикатора меняет функция, в которой находиться индикатор - то вообще не понимаю как быть!?!? Мне что, все варианты индикаторов надо инициировать?


вот пример на MQL4 - как это сделать на MQL5 ?


int BarPeresek_iMAf(int PeriodMA)
  {
   int TFT=0;
   int shiftMAT=0;
   int typeMAT=0;
   int priceMAT=0;
   int BarPeresek=0;
   if(Bars(Symbol(),0)>PeriodMA)
     {
      for(int X=1;X<1000; X++)
        {
         double MAT=NormalizeDouble(iMA(Symbol(),TFT,PeriodMA,shiftMAT,typeMAT,priceMAT,X),Digits());
         if((Low(X)>MAT && High(X)>MAT) || 
            (Low(X)<MAT && High(X)<MAT))BarPeresek++;
         else {BarPeresek++; break;}
        }

     }
   return BarPeresek;
  }
Торговые советники и собственные индикаторы - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Торговые советники и собственные индикаторы - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Среди программ для автоматического трейдинга можно выделить две большие категории: торговые роботы и индикаторы. Первые предназначены для...
 

Подскажите, как убрать маркеры после закрытия позиции, чтобы они не отображались?

И есть-ли возможность их убрать программно?

Спасибо!

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