Вопросы от "чайника" - страница 52

 

А его надо куда то девать? ... не знаю просто..

ну вообщем на ЕМА летает,а через iCustom в 10раз дольше обсчет идет.. 

 

Так делать ни в коем случае нельзя:

void OnTick()
  {
   //--- безусловно создаем индикатор
   ma_handle = iMA(_Symbol,0, MA,0, MODE_EMA, PRICE_CLOSE);
  }

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

Кроме того, налицо утечка хендлов.

 
Karlson:

А его надо куда то девать? ... не знаю просто..

ну вообщем на ЕМА летает,а через iCustom в 10раз дольше обсчет идет.. 

Куда девать кучу устаревших хендлов-индикаторов? Не знаю.. Я так не работал.  Их с каждым тиком становится всё больше и больше.

Если бы мне пришлось реализовывать подобную стратегию, я бы отказался от вызова готового пользовательского индикатора через iCustom(), а вместо этого тело индикатора поместил бы в OnTick() эксперта. И расчёты данных велись бы самим экспертом.

 ..Проблема возникнет, если индикатор - в .ex5 формате и нет его кода. 

 

Вот, вспомнил: "Для освобождения  памяти компьютера от неиспользуемого больше индикатора служит функция IndicatorRelease(), которой передается хэндл этого индикатора" (использую при деинициализации эксперта).

Но всё равно: на каждом тике новый хендл - это тяжко. 

 

По поводу накопления хэндлов вопрос проинспектирую..

Так и планирую, поместить индюк в эксперта.Спасибо.

 
Karlson:

По поводу накопления хэндлов вопрос проинспектирую..

Так и планирую, поместить индюк в эксперта.Спасибо.

Можно оставить индикатор как есть, а его копию создавать в таймере или по событию.
 
Interesting:
Можно оставить индикатор как есть, а его копию создавать в таймере или по событию.
 

Какая разница, где создавать копию индикатора: в OnTick(), OnTimer() или в OnChartEvent()? В любом случае при каждом особытивании будут создаваться "копии индикатора", усугубляя и без того огромную кучу.

Или я не понял Вашу логику. 

 
Yedelkin:

Какая разница, где создавать копию индикатора: в OnTick(), OnTimer() или в OnChartEvent()? В любом случае при каждом особытивании будут создаваться "копии индикатора", усугубляя и без того огромную кучу.

Или я не понял Вашу логику. 

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

Но если в ходе работы параметры индикаторы необходимо автоматически менять то придется это делать максимально эффективно.

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

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

PS

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

 

Такая идея на рассмотрение..Пересчет новой машки можно делать раз в день или неделю для меня..Устанавливаю таймер:

bool  EventSetTimer(
   int  seconds      // количество секунд
   );

 Правда смущает количество секунд в дне или неделе...))) А можно и на новом дневном баре..

Далее в функции OnTimer() ,первым делом удаляю предыдущий индюк с помощью IndicatorRelease().Потом создаю новую машку с измененным периодом.

void OnTimer() 
{

IndicatorRelease( ma_handle );

ma_handle=iMA(Symbol(),0,newMA,0,MA_EMA,PRICE_CLOSE);

}

 Как то так в общих чертах..

 
Renat:

Так делать ни в коем случае нельзя:

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

Кроме того, налицо утечка хендлов.

На заре MQL5 много копий об это было сломано, вы обрезали важную часть разработок для автоторговли, как результат народ глушит ваш супероптимизированный OnCalculate() пустышкой, а расчёты помещает в события. Выходит слегка тормознуто но всё же быстрее чем по каждому динамичному параметру создавать собственный хендл.

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