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

 
pronych:

Как вызвать принудительное обновление индикаторы изнутри, т.е. событие OnCalculate?

Так, если не пофиксили (ниже проблемы, которые могут возникнуть).

Или по таймеру (как то так).

 
Silent:

Так, если не пофиксили (ниже проблемы, которые могут возникнуть).

Или по таймеру (как то так).

Понятно. )) Просить штатный функционал пробовали?

 
pronych:

Понятно. )) Просить штатный функционал пробовали?

Я нет, вообще да (МетаДраайвер вроде писал в СД), и на форуме несколько раз вопрос поднимался.

Ответ от разработчиков, если был, не знаю.

PS может пригодится

Разработка мультивалютного индикатора волатильности на MQL5

Разработка мультивалютного индикатора для анализа расхождения цен

Вроде должны были тут опубликовать, не нашел.

В первом, если ошибка вылезет

40-ая строка CCanvas           canvas;  ошибка

unresolved static variable 'CCanvas::m_default_colors'

добавить

uint CCanvas::m_default_colors[9]={0};

обсуждалось давно не проверял, что где поисправляли.

Разработка мультивалютного индикатора волатильности на MQL5
Разработка мультивалютного индикатора волатильности на MQL5
  • tol64.blogspot.com
В этой статье рассмотрим разработку мультивалютного индикатора волатильности. Начинающий разработчик на MQL5 может столкнуться с некоторыми сложностями при разработке мультивалютных индикаторов, но после прочтения этой статьи всё станет намного проще. Основные вопросы при разработке мультивалютного индикатора относятся к синхронизации данных...
 

Ну давайте попробуем позвать Метадрайвера. Может он прольет свет, что ответили разрабы. Володья!...

Володя (песня измученного ангольского народа)
Володя (песня измученного ангольского народа)
  • my.mail.ru
Песня посвящена ангольскому революционеру одному из командиров MPLA, убитому в 1975 году (в Луанде в честь него названа одна из улиц). Валодя – это было его боевое прозвище. После 75го года песня про Валодю была очень популярна в Анголе. Где только я ни слышал это имя, Незабываемое для сынов Анголы. Володя, Володя, Володя, славный защитник ангольского народа! Володя, Володя, Володя, противник империалиста, Который собирается установить режим...
 
pronych:

Ну давайте попробуем позвать Метадрайвера. Может он прольет свет, что ответили разрабы. Володья!...

Я не совсем понял вопрос.  Просить штатный вызывальщик тика - не просил. Вроде Silent наоборот собирался..., короче мы друг на друга понадеялись.

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

Я тогда переделал свой кнопочный перезагрузчик чарта, заслал в сервисдеск новую версию.  Заодно в комментах спросил, расчитывать ли на то что фишка продолжит работу... Ну они промолчали...  А меня это устроило...  Так я из этого бага фичу сделал.

;)

--

Ну, строго говоря, это не баг вообще-то.  Терминал не падает, даже не особо тормозит, просто обновляет данные на чарте.  Я вроде понимаю, что там у них происходит.  Типа: запрос за пределы существующих данных -> попытка терминала подгрузить данные, с последующим обновлением чарта.  Простенько и эффективно.  Зачем менять, если пострадавших нет?

//  Насчёт "перерасчёта индикатора изнутри", вообще не понял проблему.  Как бэ постановка вопроса непонятная.  Внутри индикатор сам себе хозяин-барин, чего хочет, то и пересчитывает. А вот если по внешнему сигналу - тогда другое дело. Тогда крутимся..

 

Блин, может и не надо.)) 

Не совсем понятно как влияет prev_calculated конкретно на отрисовку индикатора.

В моем случае, попытка обновления происходит и по OnCalculate() и по таймеру. Мульти-инструмент.

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

Хотя в Init() ArrayInitialize(Buffer ,...) присутствует.

 Может у меня косяк где-то. Происходит это довольно редко, трудно отловить.

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

Кстати, в справке написано ;)

Все необходимые расчеты пользовательских индикаторов необходимо размещать в предопределенной функции OnCalculate().

PS. Про "фишку" понял.

PSPS/ Складывается ощущение, что в приведенном случае, для советника надежней использовать расчет значений без использования индикатора. И отдельно индикатор для визуализации. 

Но тогда два раза одно и то же считать придется.

 
MetaDriver:

Я не совсем понял вопрос.  Просить штатный вызывальщик тика - не просил. Вроде Silent наоборот собирался..., короче мы друг на друга понадеялись.

...

Я вот про это

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

MetaDriver, 2013.08.03 17:55

"

Может.  Только луче б вообще без изменений таймфрейма.  По хорошему для индикаторов нужна тупо генерация тика.

Для мои целей это не всегда пригодно, а общем случае множество "проблем выходного дня" бы сняло.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

MetaDriver, 2013.08.03 18:02

Согласен.

Ещё б пригодилась "команда" програмного насильственного обнуления всех prev_calculated для выбpaннoгo cимвoлa. С последующей генерацией тика хорошо бы комбинировалось.



 

 Во время визуального тестирования, в момент когда в советнике происходит переинициализация индикатора, в тестере на графике продолжает считаться и отображаться индикатор и со старыми настройками (по сути каждый раз при переинициализации добавляется еще одна "паралельная линия"  ). Пробовал каждый раз перед получением нового хэндла делать IndicatorRelease - не помогает.

Вод код получение новых хэндлов -

void f_indicator_reinit()
 { 
    
   IndicatorRelease(firstHandle);
   IndicatorRelease(secondHandle);
   IndicatorRelease(thirdHandle);
   IndicatorRelease(fourthHandle);  

   bughelper=bughelper+1;
   
   firstHandle=iCustom(NULL,0,"indicatorname.ex5",12+bughelper,ind_s,HotPink,HotPink,10,MODE_SMA,PRICE_CLOSE,1);
   secondHandle=iCustom(NULL,0,"indicatorname.ex5",12+bughelper,ind_s,White,White,10,MODE_SMA,PRICE_CLOSE,2);   
   thirdHandle=iCustom(NULL,0,"indicatorname.ex5",12+bughelper,ind_s,Red,Red,10,MODE_SMA,PRICE_CLOSE,3);   
   fourthHandle=iCustom(NULL,0,"indicatorname.ex5",12+bughelper,ind_s,Gold,Gold,10,MODE_SMA,PRICE_CLOSE,4); 
 }  

 переменную bughelper ввел потому что без смены входных параметров индикатор не пересчитывался вообще.

 
Silent:

Я вот про это

Ну про это я ответил.  У меня проблема перерасчёта решена запросом данных за пределами TERMINAL_MAX_BAR. 

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

На самом деле я не сталкивался со случаями, когда нужно обновлять чарт "на атомате".  Меня моя кнопка полностью удовлетворяет.  // см. ссылку выше.

С генерацией тика (без обновления чарта) проблема не решена, но я и не решал особо - её в большинстве случаев можно избежать многими способами (в основном при помощи таймера).

 
IndicatorRelease(firstHandle);
Функция возвращает ошибку 4014 - 

ERR_FUNCTION_NOT_ALLOWED

4014

Системная функция не разрешена для вызова

Подскажите пожалуйста какие могут быть причины невыполнения   IndicatorRelease() ???

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