Вопрос по индикаторам

 

Здравствуйте, подскажите, как получить значение индикатора, если параметры индикатора рассчётные?

Тоесть в примерах экспертов, хэндл получают в oninit (), но к этому моменту ещё нет рассчётных параметров индикатора.

А когда есть параметры, уже нельзя получить свежий хэндл... 

 
Mihail:

Здравствуйте, подскажите, как получить значение индикатора, если параметры индикатора рассчётные?

Тоесть в примерах экспертов, хэндл получают в oninit (), но к этому моменту ещё нет рассчётных параметров индикатора.

А когда есть параметры, уже нельзя получить свежий хэндл... 

 Хендл нужен только для обращения к данным индикатора. индикатор создается один раз и все время работает в своем потоке пока не будет закрыт терминал или советник либо  выгружен специальной функцией. По этому достаточно индикатор создать в функции oninit () и в последствии обращаться к его данным через хэндл для этого существует ряд функций Доступ к таймсериям и индикаторам. Также прочтите эту статью 20 торговых сигналов на MQL5 если вы ее еще не читали, в ней я рассказывал как получить правильно данные от индикаторов
 
Mihail:

Здравствуйте, подскажите, как получить значение индикатора, если параметры индикатора рассчётные?

Тоесть в примерах экспертов, хэндл получают в oninit (), но к этому моменту ещё нет рассчётных параметров индикатора.

А когда есть параметры, уже нельзя получить свежий хэндл... 

Обычно хендлы получают в блоке инициализации, дальше идет только копирование данных из буфера (при помощи CopyBuffer)
 

Спасибо за ответы.

Читать значения индикаторов я научился, тут не проблем. Сложность в другом:

Мне нужно получать значения индикаторов,  с РАССЧЁТНЫМИ входными параметрами.

Например не Ма с периодом 30, а МА с N-ным периодом, где N-ный период рассчитывается по формуле.

 

В mql4 это было легче лёгкого, а тут - неужели индикатор включать в код эксперта... ? 

 
Mihail:

Спасибо за ответы.

Читать значения индикаторов я научился, тут не проблем. Сложность в другом:

Мне нужно получать значения индикаторов,  с РАССЧЁТНЫМИ входными параметрами.

Например не Ма с периодом 30, а МА с N-ным периодом, где N-ный период рассчитывается по формуле.

 

В mql4 это было легче лёгкого, а тут - неужели индикатор включать в код эксперта... ? 

ну тогда ответ прост, для каждого нового параметра необходимо создавать индикатор, если индикатор с такими параметрами уже был создан то новая копия индикатора не создается а просто возвращаеться указатель уже на существующую копию
 
sergey1294:
 ... для каждого нового параметра необходимо создавать индикатор ....

Так это я и хочу узнать! 

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

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

Не говоря уже о расходе памяти.. 

 
Mihail:

Так это я и хочу узнать! 

Можно ли создать индикатор в процессе работы эксперта, вне функции инит.

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

Не говоря уже о памяти.. 

создавать индикаторы можно в любом месте программы
 

Сергей, привидите пожалуйста пример создания индикатора в функции OnTick()

И если есть такая возможность, то также его удаления. 

 
Mihail:

Сергей, привидите пожалуйста пример создания индикатора в функции OnTick()

И если есть такая возможность, то также его удаления. 

В ОнТике создавать индикатор не очень выгодно и правильно. Это я бы даже сказал с определенной точки зоения является форменным самоубийством. По большому счету индикатор не успеет рассчитаться и принести желаемый итог (по крайней мере в большинстве случаев).

С этой точки зрения гораздо удобней использовать таймер с заранее известным и достаточно большим периодом выполнения. При этом можно в самом таймере и создавать и уничтожать индюки.

PS

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


 
Mihail:

Сергей, привидите пожалуйста пример создания индикатора в функции OnTick()

И если есть такая возможность, то также его удаления. 

Я не знаю всех подробностей вашей идеи, по этому правильно пример привести не смогу.
 
Interesting:

В ОнТике создавать индикатор не очень выгодно и правильно. Это я бы даже сказал с определенной точки зоения является форменным самоубийством. По большому счету индикатор не успеет рассчитаться и принести желаемый итог (по крайней мере в большинстве случаев).

С этой точки зрения гораздо удобней использовать таймер с заранее известным и достаточно большим периодом выполнения. При этом можно в самом таймере и создавать и уничтожать индюки.

PS

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

 

Вот интересно, все, всё время твердят про онИнит, и совершенно не хотят слышать что НЕТ ТАМ ПАРАМЕТРОВ ещё... ПАРАМЕТРЫ мы получаем в онТик...

 

Короче хотелось бы услышать ответ от разработчиков с конкретным примером, как нужно делать, если ПАРАМЕТРЫ индикаторов мы получаем ТОЛЬКО в онТик. Т. е. несколько разных индикаторов, и каждый индикатор расчитывается несколько(или много) раз с РАЗНЫМИ параметрами. В МТ4 все летало, и было одинаково и в тестере и в терминале. Здесь в терминале вроде работает(хотя говорят что может не работать), а в тестере что бы работало нужно уже исхищряться всячески...

Вот для примера как я сделал, но так две функции получается, для получения всего лишь значения индикатора...

if(ХендлAlligator(ТФФильтраОткрытияпоМА3,ПериодФильтраОткрытияМедленнМА3,ПериодФильтраОткрытияБыстраяМА3,ПериодФилОткрСамаяБыстраяМА3,МетодУсредненияМА3,ТипЦеныМА3,2)==true)
   {
   Челюсти=Alligator(0,i);
   Зубы=Alligator(1,i);
   Губы=Alligator(2,i);
   }

//+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//Функция создания и проверки хендла Alligator   0 - GATORJAW_LINE(челюсти - медленнвя МА), 1 - GATORTEETH_LINE(зубы - средняя МА), 2 - GATORLIPS_LINE(губы - быстрая МА).  MQL5 |
//+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
bool ХендлAlligator(ENUM_TIMEFRAMES период,int периодчелюсти,int периодзубы,int периодгубы,ENUM_MA_METHOD методусреднения,ENUM_APPLIED_PRICE типцены,int бар)
  {
   Alligator=iAlligator(СИМВОЛ,период,периодчелюсти,0,периодзубы,0,периодгубы,0,методусреднения,типцены);
   for(int i=0;i<100;i=i+1)
     {
      if(BarsCalculated(Alligator)>бар)
         return(true);
      Sleep(50);
     }
   return(false);
  }

//+------------------------------------------------------------------+
//Функция Alligator                                       MQL5       |
//+------------------------------------------------------------------+
double Alligator(int буфер,int бар)
  {
   double ЗначениеAlligator[1];
   CopyBuffer(Alligator,буфер,бар,1,ЗначениеAlligator);
   return(ЗначениеAlligator[0]);
  }

 

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