Проблема с индикатором ZigZag - страница 4

 
aed71:

Хорошо, спасибо FMIC.

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

Ваши первоначальные запросы в этой теме были следующими:

  1. Как правильно получить доступ к данным индикатора ZigZag с помощью функции "iCustom"?
  2. Как собрать и обработать точки максимума и минимума ZigZag для статистического анализа?

Мой скрипт предоставил вам пример кода и знания для ответа на оба этих вопроса, так что теперь вы можете применить эти знания в других целях, например, в советнике, который вы хотите разработать. Все, что вам нужно сделать, это использовать мой код для использования iCustom() и тестирования точек ZigZag High и Low и применить его в коде вашего советника.

Однако другой вопрос, который вы упомянули позже, о том, как использовать данные ZigZag в советнике для оптимизации стратегии, которая уже функционирует в другом советнике, не был выдвинут или описан достаточно подробно здесь, в этой теме. Поэтому, по сути, я не могу дать совет или помочь вам, поскольку не знаю, что именно вам нужно.

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

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

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

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

 

Здравствуйте,

Мне удалось исправить свой код. Была ошибка в логике циклов, теперь все работает нормально, насколько я тестировал.

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

В основном он находит реальные точки максимума и минимума в индикаторе зигзаг. Его можно использовать для поиска низких и высоких точек в исторических данных, а также для анализа периода и амплитуды.

Он не работает в режиме реального времени! Он возвращается к последним высоким и низким значениям, поэтому в зависимости от длины последнего тренда он может вернуться назад и скорректировать значения. Не используйте его до быстрого тестирования в тестере стратегий.

FMIC, спасибо за ваши усилия и помощь.

Файлы:
 

Здравствуйте, aed71,

В вашем коде все еще есть несколько логических ошибок.

  1. Ваш так называемый "тиковый цикл", на самом деле является "условием нового бара", так как вы проверяете "Time[0]" на изменение времени, чтобы обнаружить новый бар. Я предлагаю изменить комментарий, чтобы не искажать код.
  2. Вы присваиваете значения массиву перед тестированием условий, а затем тестируете определенные переменные несколько раз без необходимости стирать их снова. Это только замедлит ваш код, а также затруднит следование логике.
  3. Ваш способ поиска точек перерисовки неверен и совсем не надежен. Вам следует изучить, как работает ZigZag, чтобы правильно находить точки перерисовки. Прочитайте его код или код ZigZagZug (что вам проще), чтобы понять его логику.
  4. Вы храните в массиве нулевые значения без необходимости. Зачем продолжать увеличивать счетчик и добавлять в массив, даже если нет доступной точки ZigZag. Вы просто тратите ценные ресурсы (оперативную память и циклы процессора) без необходимости. Это замедлит выполнение вашего кода. Лучше использовать динамически растущие массивы вместо статических, потому что вы не можете заранее гарантировать определенный размер.
  5. Для последующего анализа данных, например, периодов волн или частот, вам также потребуется отслеживать индекс Time и/или индекс Bar Shift.

С наилучшими пожеланиями,
FMIC

 
FMIC:

Здравствуйте, aed71,

В вашем коде все еще есть несколько логических ошибок.

  1. Ваш так называемый "тиковый цикл", на самом деле является "условием нового бара", так как вы проверяете "Time[0]" на изменение времени, чтобы обнаружить новый бар. Я предлагаю изменить комментарий, чтобы не искажать код.
  2. Вы присваиваете значения массиву перед тестированием условий, а затем тестируете определенные переменные несколько раз без необходимости стирать их снова. Это только замедлит ваш код, а также затруднит следование логике.
  3. Ваш способ поиска точек перерисовки неверен и совсем не надежен. Вам следует изучить, как работает ZigZag, чтобы правильно находить точки перерисовки. Прочитайте его код или код ZigZagZug (что вам проще), чтобы понять его логику.
  4. Вы храните в массиве нулевые значения без необходимости. Зачем продолжать увеличивать счетчик и добавлять в массив, даже если нет доступной точки ZigZag. Вы просто тратите ценные ресурсы (оперативную память и циклы процессора) без необходимости. Это замедлит выполнение вашего кода. Лучше использовать динамически растущие массивы вместо статических, поскольку вы не можете заранее гарантировать определенный размер.
  5. Для последующего анализа данных, например, периодов волн или частот, вам также потребуется отслеживать индекс Time и/или индекс Bar Shift.

С наилучшими пожеланиями,
FMIC

Еще раз спасибо за ваши комментарии;

Я не очень хороший программист, поэтому сам код может быть не идеальным :-) Однако позвольте мне попытаться объяснить мою логику;

1-) Часть комментария может быть изменена на "каждый новый бар"...

2-) 4-) 5-) Логика использования больших массивов заключается в том, что после этого при новом процессе я буду считать бары с нулевым значением между максимумами или между максимумом и минимумом, чтобы найти период, амплитуду и т.д.. Поэтому мне нужно инициализировать массив перед его использованием, и мне не нужно иметь дело с индексом времени и т.д. Просто больше буфера, что не является большой проблемой для моего проекта в настоящее время.

3-) Я проследил зигзаг и зигзагзуг несколько раз. В зигзаге, хотя у вас есть реальные максимумы и минимумы в конце, если вы поместите эти значения в массив, вы увидите, что есть промежуточные минимумы или максимумы. Вы не можете избежать их, независимо от того, используете ли вы комбинацию mode0 и mode1/mode2. Всегда есть промежуточные минимумы и максимумы. В zigzagzug вы можете четко видеть эти точки. Кроме того, я вижу, что есть случаи, когда mode0 равен нулю, но mode1 или mode2 больше нуля, что является неправильными точками. Поэтому я решил добавить дополнительный код, чтобы избежать этих точек.

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

Вы тестировали его? Разве он не дает правильные точки. Когда вы говорите, что он не надежен или некорректен, я предполагаю, что ваши тесты не удались, так ли это?

Спасибо.

 
aed71:

Еще раз спасибо за ваши комментарии;

Я не очень хороший программист, поэтому сам код может быть не идеальным :-) Однако позвольте мне попытаться объяснить мою логику;

1-) Часть комментария может быть изменена на "каждый новый бар"...

2-) 4-) 5-) Логика использования больших массивов заключается в том, что после этого при новом процессе я буду считать бары с нулевым значением между максимумами или между максимумом и минимумом, чтобы найти период, амплитуду и т.д.. Поэтому мне нужно инициализировать массив перед его использованием, и мне не нужно иметь дело с индексом времени и т.д. Просто больше буфера, что не является большой проблемой для моего проекта в настоящее время.

3-) Я проследил зигзаг и зигзагзуг несколько раз. В зигзаге, хотя у вас есть реальные максимумы и минимумы в конце, если вы поместите эти значения в массив, вы увидите, что есть промежуточные минимумы или максимумы. Вы не можете избежать их, независимо от того, используете ли вы комбинацию mode0 и mode1/mode2. Всегда есть промежуточные минимумы и максимумы. В zigzagzug вы можете четко видеть эти точки. Кроме того, я вижу, что есть случаи, когда mode0 равен нулю, но mode1 или mode2 больше нуля, что является неправильными точками. Поэтому я решил добавить дополнительный код, чтобы избежать этих точек.

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

Вы тестировали его? Разве он не дает правильные точки. Когда вы говорите, что он не надежен или некорректен, я предполагаю, что ваши тесты не удались, так ли это?

Спасибо.


Вы упускаете суть! Предоставленный мной код показывает, как правильно определять точки High/Low ZigZag; но вы предпочитаете игнорировать его и делать это по-своему, что делает код более сложным для понимания и медленным, а также использует больше ресурсов, чем необходимо. Почему?
 
Fernando Carreiro #:

Вы неправильно используете ZigZag в своем примере iCustom. Стандартный зигзаг от MetQuotes имеет ТРИ (не два) буфера (режимы или индекс линии в iCustom)

  1. Режим = 0: Удерживает как высокие, так и низкие точки зигзага.
  2. Режим = 1: высокие точки, но не обязательно только точки ZigZag (так как он также удерживает точки перерисовки).
  3. Режим = 2: Низкие точки, но не обязательно только точки ZigZag (так как он также удерживает точки перерисовки).

Вам нужно будет сравнить первый буфер (Mode 0) с двумя другими буферами, чтобы решить, является ли он точкой High Point или Low Point (например, если значения буферов 1 и 3 одинаковы, то это точка Low ZigZag, а если значения буферов 1 и 2 одинаковы, то это точка High Point).

Также, чтобы лучше понять, как работает ЗигЗаг и как он перерисовывается, я предлагаю поиграть с моим индикатором ZigZagZug. Однако в своем коде используйте ЗигЗаг от MetaQuotes, так как он быстрее. Моя версия выполняет больше обработки из-за дополнительных функций и поэтому работает медленнее.

PS! Если буфер 1 (Mode = 0) имеет значение 0.0, а другие буферы имеют ненулевые значения, то это старые точки перерисовки, а НЕ точки ZigZag.

В вашем коде вы используете буфер Mode 0 как Low, а буфер Mode 1 как High. Это совершенно неверно.

вы не поверите, как мне это помогло, спасибо большое.