Ещё раз: ох уж эта функция IndicatorCounted()! Попила кровушки! Будьте бдительны! Индикаторы врут!

 

В общем история началась с типового ЗигЗага. Появлялись у него периодически "горбы" и несовпадение с ценовыми экстремумами. Можно было списать на глюки алгоритма.

Но позже стало это проявляться и на других алгоритмах ЗигЗага:


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

А вообще, что эта за функция и с чем её едят?

В штатном режиме IndicatorCounted() всегда на 1 единицу меньше Bars на тике старого бара и на 2 меньше на первом полученном тике нового бара.


Так вот! Анализ показывает, что на пришедшем тике для нашей ситуации IndicatorCounted()=10, Bars=11 могут быть изменены цены (любые - и Close и Open и т.д.) для уже просчитанных баров - 4, 5 и даже 10! Вот к примеру лог, сгенерированный индикатором:

GetTickCount;Bars;IndicatorCounted;Nom;Open;High;Low;Close;Volume
195079749;66175;66173;1;1.29427;1.29429;1.29416;1.29423;33
195079749;66175;66173;8;;1.29433;;;43

Его трактовка такова: был когда то бар с индексом 1 и перечисленными ценами. И через некоторое время он уже стал баром номер 8 (естественный процесс при открытых торгах по инструменту)))))), с другой ценой High бара и при этом это произошло в обход функции IndicatorCounted()!!!

Такие ситуации не частое явление. Некоторые индикаторы (МА к примеру) будут просто содержать чуть не корректные данные (до полного пересчета). Но для некоторых индикаторов эти ситуации становятся смертельными (как например для ЗигЗага с верхнего скрина)!!!

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

 
Примечание: в основном это касается конечно же периода М1 ....
 
Алекс. Эта тема уже неоднократно обсуждалась. Что вы хотите услышать? Вопрос в чем?
 
AlexSTAL:

"Будьте бдительны! Индикаторы врут!"


Вот так новость !

Что же теперь делать ?



 
Svinozavr:
Алекс. Эта тема уже неоднократно обсуждалась. Что вы хотите услышать? Вопрос в чем?

Да собственно ни в чём...

Хотелось бы конечно, что бы разработчики подправили данную ситуацию, но МТ5 поставил жирный крест на МТ4...

 
AlexSTAL:

Да собственно ни в чём...

Хотелось бы конечно, что бы разработчики подправили данную ситуацию, но МТ5 поставил жирный крест на МТ4...

Ясно. "Люди. Я любил вас. Будьте бдительны." // Ю.Фучек
 
Svinozavr:
Ясно. "Люди. Я любил вас. Будьте бдительны." // Ю.Фучек


Админ
1402
Renat 2011.01.12 17:09 2011.01.12 17:09:23 #

Спасибо, будем проверять.

Мы как раз на следующей неделе готовимся выпустить накопительное обновление для МТ4. Постараемся разобраться.
 

На MQL5 забанен, поэтому пишу здесь насчет "накопительного обновления для MT4".

Цитата отсюда:

Renat:

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

Точнее сказать, что TickValue при конвертации в целевую валюту зависит от того, убыточна она или нет. То есть, если мы получили убыток в 1 пипс, то нам надо его выкупить по цене Ask, а если прибыль в 1 пипс, то продать по цене Bid. Оценочная функция MODE_TICKVALUE использует только один вариант.

Сегодня после проверок нашли проблему в конвертации кроссов в валюту депозита - спасибо за расследование. В МетаТрейдер 5 такой проблемы нет.

Мы исправим ошибку в крупном обновлении платформы MetaTrader 4 в феврале (нужно многое сделать синхронно).

Мне очень стыдно, извините.

Запустил представленный там проверочный скрипт на текущем билде MT4. Ничего не изменилось:

  1. MODE_TICKVALUE считается неправильно.
  2. Утверждения разработчиков, что параметр TickValue является оценочным по прежнему не соответствует действительности. Именно по этому параметру MT4 до сих пор считает прибыль. А это значит из п.1., что до сих пор MT4 считает прибыль неправильно.
  3. При перестановке входных параметров в функции OrderCloseBy меняется прибыль:
OrderCloseBy(Ticket1, Ticket2); // Если поменять местами тикеты, прибыль будет иной - ошибка!

MT5 не проверял. Замечу, что в тестере MT5 параметр для расчета прибыли TickValue зафиксирован. Т.е. результаты MT5-тестера носят оценочный характер не только из-за эмуляции тиковой истории, но и из-за неправильного расчета TickValue.

Например, если вы прогоняете советник на EURGBP в MT5 тестере, то для корректного расчета прибыли вам нужно иметь также данные по GBPUSD, чтобы конвертить GBP-прибыль в USD (валюта депозита). Этого, к сожалению, нет.

В альтернативном тестере по тикам такого не происходит. Т.е. если вы хотите тестировать EURGBP, то обязательно подцепится и GBPUSD.

P.S. Если кого-то волнуют данные казусы, скопируйте на MQL5-форум.

 
hrenfx:

На MQL5 забанен, поэтому пишу здесь насчет "накопительного обновления для MT4".


Проверьте, я не вижу, чтобы ник hrenfx был забанен на MQL5.
 
granit77:
Проверьте, я не вижу, чтобы ник hrenfx был забанен на MQL5.
Там тоньше настраиваются права, нежели здесь: у меня нет права там отвечать публично, в ЛС и в сервисдеск. Остальное - не пробовал.
 
hrenfx:
Там тоньше настраиваются права, нежели здесь: у меня нет права там отвечать публично, в ЛС и в сервисдеск. Остальное - не пробовал.
а какие варианты остались?
Причина обращения: