Индикатор повреждается - страница 5

 
Rosh:

Что вы имеете в виду под повреждениями? Я только что прикрепил ваш индикатор на EURUSD M1 и не вижу никаких значений.


32-битный клиентский терминал MetaTrader 4 показывает ту же картину. Вы уверены, что предоставленный индикатор работает?
 
Rosh:

32-битный клиентский терминал MetaTrader 4 обуяла та же картина. Вы уверены, что предоставленный индикатор работает?
Похоже, что вы скачали оригинальную версию кода примера (timestamped 2011.10.11 18:06). Он ничего не рисует в течение 25 минут. В init() он устанавливает drawTime в TimeCurrent() и запускает любой код в start() только один раз (drawTime + 1500 < TimeCurrent()).

Вторая версия, датированная 2011.10.12 06:37, выглядит так, как будто она должна начать рисовать немедленно.

Но, в любом случае, проблемы, очевидно, не начинаются в течение нескольких часов.
 
jjc:
Похоже, что вы загрузили оригинальную версию кода примера (временная метка 2011.10.11 18:06). Это не рисует ничего в течение 25 минут.
Хорошо, я подожду
 

32-битный клиентский терминал MetaTrader 4 показывает ту же картину. Вы уверены, что предоставленный индикатор работает?

- Да. Я запускаю тот же индикатор на 32-битной машине, также со вчерашнего вечера, примерно 18 часов. Проблема не возникает.

Если вы хотите найти еще одну возможную ошибку MT4, что произойдет, если вы используете Low[i] и High[i], а не iLow() и iHigh()?

- В моем реальном коде используются iHighest / iHigh / iLowest / iLow и т.д.. Использовал High/Low в коде примера, чтобы уменьшить сложность

 
RaptorUK:
У меня есть идея ... но я должен выйти сейчас, я добавил индикатор на новый график, будет проверить мою идею, когда я вернусь и опубликовать результаты.

Хорошо, только что вернулся, график выглядел нормально с тех пор, как я впервые загрузил индикатор... затем я попробовал свою идею.... Я переместил график вправо, чтобы загрузить новые данные... и вот оно... .

Это то, что я предложил в этой теме 2011.10.07 19:08

 
RaptorUK:

Хорошо, только что вернулся, график выглядел нормально с тех пор, как я впервые загрузил индикатор... затем я попробовал свою идею... Я переместил график вправо, чтобы загрузить новые данные... и вот оно... .

Итак, вы предполагаете, что история баров по какой-то причине меняется и заполняется обратно, а индикатор страдает, потому что он рисует только вперед и не следует обычному поведению индикатора, пересчитывая данные на основе таких вещей, как IndicatorCounted()?
 
jjc:
Итак, вы предполагаете, что история баров по какой-то причине меняется и заполняется обратно, а индикатор страдает, потому что он рисует только вперед и не следует обычному поведению индикатора - пересчету на основе таких вещей, как IndicatorCounted()?
Я не смотрел недавний код. Но да, что-то вроде того, что вы написали.
 
RaptorUK:
Я не просматривал недавний код. . но да, что-то вроде того, что вы написали.

Итак, вкратце, то, что мы имеем, выглядит следующим образом:

* Обычный индикатор использует IndicatorCounted(), чтобы определить, какие значения баров являются "грязными" и должны быть (повторно) рассчитаны.

* Когда вы добавляете дополнительные бары в историю путем прокрутки назад, IndicatorCounted() обнуляется. Поэтому в этот момент обычный индикатор пересчитает все свои исторические значения.

* Приведенный здесь индикатор этого не делает. По сути, он игнорирует IndicatorCounted() и рисует только на основе форварда.

* По какой-то причине Win64-машина AnkaSoftware периодически пополняется старыми данными, а Win32-машина - нет. Вероятно, в данном контексте операционная система просто совпадает.

* Немного нехорошо, что MT4 не корректирует буферы индикатора в свете новых баров, которые были добавлены, и вместо этого полагается на то, что код индикатора пересчитает все старые значения, потому что IndicatorCounted() сбрасывается. (Однако это вполне оправданно, поскольку добавление старых значений баров ко многим индикаторам потенциально влияет на последующие вычисления. Например, EMA изменится, хотя и на незначительную величину, если добавить дополнительный бар в начале истории.)

 
jjc:

* Это немного нехорошо, что MT4 не корректирует буферы индикатора в свете новых баров, которые были добавлены, и вместо этого полагается на то, что код индикатора пересчитает все старые значения, потому что IndicatorCounted() сбрасывается.

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

Допустим, индикатор работает некоторое время, но затем происходит отключение от брокера, которое длится несколько баров. При повторном подключении MT4 получит тик и начнет рисовать значения индикатора для последнего бара. Отдельно, асинхронно и более медленно, он получит исторические данные для пропущенных баров, которые имели место во время отключения. Они вставляются в середину истории баров, и поэтому любому нормальному индикатору необходимо перерисовывать старые значения, начиная как минимум с начала периода отключения. На практике понятно, что MT4 использует подход "перерисовать все". Единственный спорный момент - должен ли MT4 автоматически менять значения буфера на EMPTY_VALUE, если они потенциально недействительны.
 

Эта проблема касается ТОЛЬКО индикаторов?

как насчет других, скажем High[], Low[], или iHigh, iLow, iLowest, iBarshift, etc, etc...., это то, что я предпочитаю знать и быть ясным.