Погружаемся в особенности индикаторов MetaTrader 5 - страница 4

 
MetaDriver:

Мне нужно было узнавать внутри OnCalculate() хендл того индикатора, который подаётся на вход текущего индикатора. 

// Кстати, мне это и сейчас нужно. Эта возможность многие мои решения сделала бы намного более элегантными.

.. хотелось бы набрасывать свой СКОМПИЛИРОВАННЫЙ индикатор, на ЛЮБОЙ другой. Прямо в терминале. 

Слава искренне расстраивался и продолжал приводить предыдущий пример...

После пятого круга взаимных объяснений я просто психанул, нахамил Славе и перестал туда писать...  :(

// А жаль  всё же, что сервис "индикатор от индикатора" до сих пор остаётся на довольно примитивном уровне.

// Идея могла бы быть колоссально развита достаточно скромными усилиями Метаквотов.  

Разработчики! Может вернёмся к теме?  Уверяю, ОНО ТОГО СТОИТ! Можно сотворить такие удобства, которых ну точно ни в одном терминале нету.

 Применить к : Данные предыдущего индикатора | Данные первого индикатора на вкладке Параметры своего СКОМПИЛИРОВАННОГО индикатора прямо в терминале разве не позволяют избавиться от ЖЕСТКОЙ связи, которая показана в коде?

https://www.mql5.com/ru/docs/img/previousindicatorsdata.png 

Уже давно так делаю и никаких проблем не возникало. Чисто теоретическая проблема - это когда индикатор, поверх которого набрасываем свой, не является ни первым, ни последним в окне. Решается она тоже просто - зная заранее эту особенность, соблюдаем правильную последовательность при добавлении индикаторов.

Более того - этот способ избавляет от головной боли от использования и дороговизны вызова CopyBuffer(),  дает синхронизированный массив значений "дочернего" индикатора по ссылке. Все очень красиво, дешево и сердито ))

Может проблема глубже и я не понял о чем речь - handle дочернего индикатора нужен был для CopyBuffer ? 

 

 
Есть вопрос. Возможно в индикаторе с дробными числами проводить операции отношения (например если цена открытия менше цены закрытия бара то...). И как это можно реализовать в индикаторе в виде кода? 
Документация по MQL5: Основы языка / Операции и выражения / Операции отношения
Документация по MQL5: Основы языка / Операции и выражения / Операции отношения
  • www.mql5.com
Основы языка / Операции и выражения / Операции отношения - Документация по MQL5
 
ksp_76:
Есть вопрос. Возможно в индикаторе с дробными числами проводить операции отношения (например если цена открытия менше цены закрытия бара то...). И как это можно реализовать в индикаторе в виде кода? 

Простейшая реализация может выглядеть так:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int i=rates_total-1; //выбираем последний бар; можно выбрать любой бар из имеющихся
   if(open[i]<close[i])
     {
      ...
     }
   ...
   return(rates_total);
  }
 
Yedelkin:

Простейшая реализация может выглядеть так:

Спасибо! А то возникла безумная идея. Только в програмировании понимаю только азы (совсем немного). Теперь хотя бы знаю что возможно, будем идти дальше...
 
ksp_76:
Спасибо! А то возникла безумная идея. Только в програмировании понимаю только азы (совсем немного). Теперь хотя бы знаю что возможно, будем идти дальше...

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

 

Возник вот такой вопрос:

Эксперт запускает два пользовательских индикатора. При этом 1-ый индикатор рассчитывает значения своих индикаторных буферов, а 2-ой -  предназначен только для отображения значений некоторых из этих  буферов (буферов 1-ого индикатора) в отдельном окне общего графика. Допустимо ли в ходе работы эксперта передавать хендл 1-ого индикатора в качестве единственного input-параметра 2-ого индикатора? Т.е сначала получить в эксперте хендл первого индикатора

int handle_1=iCustom(NULL,0,"1-ый индикатор", ...) //многоточие - список входных параметров 1-ого индикатора

 , а затем тут же в эксперте передать этот хендл в качестве единственного input-параметра 2-ого индикатора? Например:

int handle_2=iCustom(NULL,0,"2-ой индикатор",handle_1) //индикатор "2-ой индикатор" имеет только один входной парметр типа int 

Запретов в документации не нашёл, компилятор не ругается, но при запуске эксперта и прикреплении им индикаторов на график - 2-ой индикатор возвращает ошибку 4807 (ошибочный хендл индикатора). При этом входной параметр (handle_1) является положительным int-числом, а ошибка генерируется при работе функции BarsCalculated(handle_1). ..Хоть при запуске эксперта рынок был закрыт, но 1-ый индикатор рассчитался полностью.

..Или же вместо передачи хендла 1-ого индикатора по указанной выше схеме разрешается только заново вызывать во 2-ом индикаторе функцию iCustom(NULL,0,"1-ый индикатор", ...) и работать с помощью исключительно того хендла, который будет получен внутри 2-ого индикатора?

 
Yedelkin:

..Или же вместо передачи хендла 1-ого индикатора по указанной выше схеме разрешается только заново вызывать во 2-ом индикаторе функцию iCustom(NULL,0,"1-ый индикатор", ...) и работать с помощью исключительно того хендла, который будет получен внутри 2-ого индикатора?

Насколько я помню (и если правильно понял), хендлы локальны внутри программы.

Т.е. нельзя передавать хендл, и дергать индикатор за него.

 

Но даже если вызвать индикатор №1 из индикатора №2 сразу после советника, он должен рассчитаться всего один раз, так что ни каких потерь по скорости не будет.

Могу ошибаться. 

 
komposter: Насколько я помню (и если правильно понял), хендлы локальны внутри программы.

Т.е. нельзя передавать хендл, и дергать индикатор за него.

 Ну вот смотрите пример кода: https://www.mql5.com/ru/forum/821/page3#comment_39967  Там, правда, используется хендл не пользовательского индикатора, а технического.

komposter: Но даже если вызвать индикатор №1 из индикатора №2 сразу после советника, он должен рассчитаться всего один раз, так что ни каких потерь по скорости не будет.

 А потом что будет? Увеличится счетчик ссылок на единственную копию индикатора № 1, которая и будет вести расчёты?  А память, занятая второй копией индикатора №1, освободится?

Вопрос возник потому, что в индикаторе № 1 у меня используются классы, и чёрт меня дёрнул выводить на печать сигналы о запуске конструкторов этих классов. Когда смотрел логи, обнаружил, что конструкторы классов индикатора №1 запускаются дважды, из под обоих индикаторов, несмотря на одинаковые входные параметры, указываемые для iCustom(). Вот и ищу способы избавиться от лишних запусков второй копии индикатора №1. Тему индикаторов прорабатывал с год назад - всё забыл :/

Погружаемся в особенности индикаторов MetaTrader 5
Погружаемся в особенности индикаторов MetaTrader 5
  • www.mql5.com
Погружаемся в особенности индикаторов MetaTrader 5.
 
Yedelkin:

А потом что будет? Увеличится счетчик ссылок на единственную копию индикатора № 1, которая и будет вести расчёты?  А память, занятая второй копией индикатора №1, освободится?

Вопрос возник потому, что в индикаторе № 1 у меня используются классы, и чёрт меня дёрнул выводить на печать сигналы о запуске конструкторов этих классов. Когда смотрел логи, обнаружил, что конструкторы классов индикатора №1 запускаются дважды, из под обоих индикаторов, несмотря на одинаковые входные параметры, указываемые для iCustom(). Вот и ищу способы избавиться от лишних запусков второй копии индикатора №1. Тему индикаторов прорабатывал с год назад - всё забыл :/

Недавно решал сходную проблему. Возможно, как-то поможет мое решение https://www.mql5.com/ru/forum/7556#comment_307317

OnInit индикатора запускается только один раз.

OnDeinit  запускается только после удаления всех хэндлов этого индикатора из других.

Позволяет ли mql5 написать индикатор, рисующий графики в разных окнах или получать доступ к буферам индикаторов в других окнах?
Позволяет ли mql5 написать индикатор, рисующий графики в разных окнах или получать доступ к буферам индикаторов в других окнах?
  • www.mql5.com
Позволяет ли mql5 написать индикатор, рисующий графики в разных окнах или получать доступ к буферам индикаторов в других окнах?
 
alxm:

Недавно решал сходную проблему. Возможно, как-то поможет мое решение https://www.mql5.com/ru/forum/7556#comment_307317

Вместо передачи готового хендла искать этот хендл из индикатора № 2?
Причина обращения: