Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 361

 
ijonhson:

Вопрос в другом , за один тик просчитывать код индикатора 900 раз (3 таймфрейма по 300 баров к примеру), или 3 раза, понятно что с icustom меньше возни, закинул в цикл и делов, как вариант видел с помощью dll передается адрес массива значений индикатора, в советник,но не хочется тягать за собой индикатор в комплекте


  Снова ошибка в постановке задачи.. Зачем вам 900 баров в советнике ? Корректно поставленная задача требует 2-3 бара считать из индикатора..  Если уж вам так нужны данные в индикаторе, 900 штук, то в самом индикаторе с ними и работайте, зачем их в советник тащить? Правильно поставленная задача это 50% успеха

 
Nikolay Ivanov:

  Снова ошибка в постановке задачи.. Зачем вам 900 баров в советнике ? Корректно поставленная задача требует 2-3 бара считать из индикатора..  Если уж вам так нужны данные в индикаторе, 900 штук, то в самом индикаторе с ними и работайте, зачем их в советник тащить? Правильно поставленная задача это 50% успеха


МНЕ необходимо сравнивать минимальные и максимальные пики индикатора на 3 таймфреймах к примеру 5мин 15мин и 30мин,для определения трендов, угадать пики у меня не получится,то-есть придется перебрать поочереди всю историю. 300 баров истории я взял для примера.

Все равно с помощью icustom слишком ресурсозатратно.

 
ijonhson:

МНЕ необходимо сравнивать минимальные и максимальные пики индикатора на 3 таймфреймах к примеру 5мин 15мин и 30мин,для определения трендов, угадать пики у меня не получится,то-есть придется перебрать поочереди всю историю. 300 баров истории я взял для примера.

Все равно с помощью icustom слишком ресурсозатратно.


Вопрос остается открытым в ontick функция IndicatorCounted() при первом просчете выдает -1 чем ее заменить в эксперте?

 
ijonhson:

"Ничем её менять не надо"- то-есть с onTick в эксперте она работает также корректно как и с onCalculate в индикаторе?

Нет, я имел ввиду что она там совсем не нужна.

 
Alexey Viktorov:

Нет, я имел ввиду что она там совсем не нужна.


Накопал   https://www.mql5.com/ru/articles/1456, буду разбираться, но думал ест попроще вариант

Перенос кода индикатора в код эксперта. Строение индикатора.
Перенос кода индикатора в код эксперта. Строение индикатора.
  • 2007.02.16
  • Nikolay Kositsin
  • www.mql5.com
Прежде чем приступить к основной теме статьи, мне следовало бы вкратце коснуться общего строения индикатора под углом зрения программиста, которого этот индикатор интересует, как будущая часть кода эксперта: Вполне естественно, что у реального индикатора может быть другое количество отображаемых индикаторных значений, другое количество...
 
ijonhson:

Вопрос остается открытым в ontick функция IndicatorCounted() при первом просчете выдает -1 чем ее заменить в эксперте?

Вам не нужно просматривать вершины на каждом тике, они не меняются.

В советнике проверяйте в цикле на открытии бара, и как только вершина найдена - выход с цикла.

   int count=Bars(Symbol,Period);
   for(int i=0; i<count; i++) {
     // ищем и запоминаем в переменную, если нашли break;
   }
 
ijonhson:  Вопрос остается открытым в ontick функция IndicatorCounted() при первом просчете выдает -1 чем ее заменить в эксперте?

Функция IndicatorCounted() применялась ранее в индикаторах с функцией start(). В новых индикаторах с функцией OnCalculate() вместо нее используется второй параметр prev_calculated. Специально изучал их и установил, что они отличаются на 1. Разница мала, и они показывают, сколько баров уже рассчитано. Если 0 (или -1), значит все бары нужно рассчитывать. Это бывает при запуске индикатора, когда он должен отрисовать всю линию и сохранить результат в буферных массивах. На следующих тиках нужно пересчитывать лишь данные последнего бара. Следовательно, то, что делается при нулевом (или -1) значении, нужно поместить в OnInit() советника. Остальное - совсем мало - в OnTick()

 
YarTrade:

Спасибо. Отработаю. В учебнике про тип лонг, почему-то ничего не читал.

Нужно поставить курсор на long  int  или  short  (или любое другое слово языка) и нажать F1.

 
ijonhson:

Спасибо огромное, но насколько я понял из описания функции,она выполняет полностью код индикатора для получения одного значения, в указанном мною месте, то есть для получения всех вершин мне необходимо будет просчитать код индикатора n-ое количество раз(перебрать поочереди все бары),а мне необходимо сравнивать порядок вершин этого индикатора на нескольких таймфреймах.

И к тому-же потом вручную искать вершины

Совершенно не верно! Все бары индикатора при вызове из советника с помощью iCustom() пересчитываются только один раз! Все следующие вызовы индикатора работают с уже посчитанными результатами, пересчитываются исключительно не посчитанные бары до предыдущего вызова. К примеру, вызывается индикатор периода М15 с графика Н1 на каждом новом баре, получается что от вызова до вызова индикатор не пересчитывается 4 15-ти мнутных бара. Так вот только эти 4 бара и будет пересчитаны.

Даже если в цикле перебирать последовательность баров от 0 до xxx то индикатор будет пересчитан только 1 раз при первом вызове. Все следующие вызовы никакого пересчёта не будут делать.

 
ijonhson:

Накопал   https://www.mql5.com/ru/articles/1456, буду разбираться, но думал ест попроще вариант

Это плохой пример. Ему уже ДЕСЯТЬ лет!!! Язык уже изменился к лучшему.