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

 
FMIC:


Как уже объяснялось в предыдущем сообщении, вы не можете просто использовать буфер High и Low для получения точек ZigZag, поскольку они также включают в себя перекрашенные точки (голубые и розовые точки на моем). На стандартном ZigZag это тоже так, но вы просто не видите их. Поэтому мой индикатор показывает их, чтобы вы могли лучше понять его.

Вы должны сравнить буферы High и Low с первым буфером, который содержит ОБА Low и Highs, чтобы отфильтровать ТОЛЬКО точки ZigZag.

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

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


Привет FMIC,

Спасибо за ваше объяснение и помощь. Мне пока не удалось получить высокие и низкие значения. Проблема в том, что он перерисовывается (нормально), а я не могу найти исторический максимум и минимум. Я также использую режим 0 и режим 1 или режим 0 и режим 2 в оригинальном индикаторе зигзаг, но все результаты уже имеют оба значения. То есть нет ни одной линии со значениями zh (режим 1) или zl (режим 2), но нет zz (режим 0). Поэтому мне не удалось использовать этот метод.

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

Пожалуйста, найдите мой код во вложении (версия 5). Любая помощь будет очень признательна.

Файлы:
 

Я провел еще несколько тестов, а также выполнил визуальный тест. Я даже установил индекс iCustom на 100 тиков назад, чтобы избежать перерисовки, но она происходит. Проблема в том, что при любом вызове индикатора зигзаг он смотрит на фактические данные; 100 тиков до, 10 тиков до или 1000 тиков до не имеет никакого влияния на него. Поэтому лучше использовать индекс равный 1.

Насколько я понимаю, мне нужно выполнить еще один цикл, проверяющий массивы и корректирующий максимумы и минимумы путем исключения данных; например, если есть два последовательных максимума, то исключается самый низкий, а для минимумов делается наоборот. Моя первоначальная идея - снова вернуться назад, скажем, на 100 дней в массиве и проверить, есть ли последовательные максимумы. Я еще не пришел к выводу об алгоритме.

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

 
aed71:

Я провел еще несколько тестов, а также выполнил визуальный тест. Я даже установил индекс iCustom на 100 тиков назад, чтобы избежать перерисовки, но она происходит. Проблема в том, что при любом вызове индикатора зигзаг он смотрит на фактические данные; 100 тиков до, 10 тиков до или 1000 тиков до не имеет никакого влияния на него. Поэтому лучше использовать индекс равный 1.

Насколько я понимаю, мне нужно выполнить еще один цикл, проверяющий массивы и корректирующий максимумы и минимумы путем исключения данных; например, если есть два последовательных максимума, то исключается самый низкий, а для минимумов делается наоборот. Моя первоначальная идея - снова вернуться назад, скажем, на 100 дней в массиве и проверить, есть ли последовательные максимумы. Я еще не пришел к выводу об алгоритме.

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


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

Я только что вернулся с работы и пора ложиться спать. Я посмотрю на ваш код более подробно утром и предоставлю вам правильное решение.

Однако, в качестве краткого замечания, вам не нужно смотреть назад на 1000 или 100 баров, достаточно, чтобы обдумать параметры"глубина" и "обратный шаг".

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

Завтра я предоставлю вам более полное объяснение.

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

 

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

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

Принцип, лежащий в основе кода, таков:

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

То же самое относится и к низкой части. Я приложил некоторые пояснения к коду.

По крайней мере, у меня больше нет одновременных максимумов и минимумов :-)

Теперь мне нужно найти ошибку, которая удаляет исходные точки максимума/минимума.

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

Еще раз спасибо за помощь.

Файлы:
 

Доброе утро, "aed71",

Я еще не смотрел ваш последний файл, но вот мой скрипт (не индикатор, не советник) для просмотра определенного периода времени и вывода максимумов и минимумов ZigZag в CSV файл.

Просто прикрепите скрипт к графику, и он запустится в считанные секунды. Затем просто просмотрите CSV-файл, который генерируется в папке "MQL4\Files". Я включил пример запуска на дневном графике EURUSD за 2013 год.

Поскольку это скрипт, вам не нужно беспокоиться о перерисовке.

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

PS! Я просмотрю ваш последний файл и дам вам свои комментарии.

EDIT: Я просмотрел ваш последний код, и он повсюду. Просто взгляните на мой код и увидите, что тестирование на максимумы и минимумы намного проще. Нет необходимости во всей этой путанице в вашем коде. Вот выдержка (полный код в ZIP-файле):

if( dblZigZagPoint > 0 )  // Test if a ZigZag Point is found
{
   intZZCount++;  // Increment ZigZag Counter

   // Test if it is a High, Low or Unknown
   string strZZType = strZZUnknown;
   if( dblZigZagHigh > 0 ) strZZType = strZZHigh;
   else if( dblZigZagLow > 0 ) strZZType = strZZLow;
               
   // Output the ZigZag Point Data to CSV File
   FileWrite( intCSVFileHandle, intZZCount, strZZType, DoubleToString( dblZigZagPoint, intDigits ), Time[ intBarShift ] );
}
Файлы:
 
FMIC:

Доброе утро, "aed71",

Я еще не смотрел ваш последний файл, но вот мой скрипт (не индикатор, не советник) для просмотра определенного периода времени и вывода максимумов и минимумов ZigZag в CSV файл.

Просто прикрепите скрипт к графику, и он запустится в считанные секунды. Затем просто просмотрите CSV-файл, который генерируется в папке "MQL4\Files". Я включил пример запуска на дневном графике EURUSD за 2013 год.

Поскольку это скрипт, вам не нужно беспокоиться о перерисовке.

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

PS! Я просмотрю ваш последний файл и дам вам свои комментарии.

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

Нет необходимости во всей этой путанице в вашем коде.


Отличная работа, работает гладко, должно быть включено в код base..... Спасибо.

У меня есть два вопроса, если вы не возражаете:

1-) Мои данные, которые я загрузил и вижу на графике, показывали 4 цифры, но на выходе скрипта были 5 цифр. Как это возможно? Я имею в виду 5 цифр без нуля в конце.

Count,Type,Price,DateTime

1,H,1.34962,2013.11.04 00:30:00

2,L,1.34861,2013.11.04 02:15:00

3,H,1.35015,2013.11.04 03:00:00

4,L,1.34417,2013.11.04 05:15:00

5,H,1.35127,2013.11.04 11:15:00

6,L,1.34910,2013.11.04 15:45:00

7,H,1.35236,2013.11.04 18:15:00

8,L,1.35045,2013.11.04 19:45:00

9,H,1.35203,2013.11.04 22:45:00

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

Еще раз спасибо за помощь :-)


 
aed71:


Отличная работа, работает гладко, должно быть включено в код base.... Спасибо.

У меня есть два вопроса, если вы не возражаете:

1-) Мои данные, которые я загрузил и вижу на графике, показывали 4 цифры, но на выходе скрипта было 5 цифр. Как это возможно? Я имею в виду 5 цифр без нуля в конце.

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

Еще раз спасибо за помощь :-)

  1. Если у вас 5-ти значный брокер, то и данные будут иметь 5 цифр. Проблема многих индикаторов в том, что они не используют функцию "IndicatorDigits()", поэтому в итоге отображают только стандартное количество цифр, независимо от того, что предоставляет брокер. Если вы посмотрите на мой код ZigZagZug, то увидите, что я явно задал это, чтобы исправить проблему, что MetaQuotes не удалось сделать в своем собственном коде:

    // Set Number of Digits (Precision)
       IndicatorDigits( Digits );

  2. Что касается использования кода в эксперте, то это действительно зависит от многих вещей, таких как стратегия и то, как перерисовка повлияет на нее. На некоторые стратегии перерисовки не влияют, другие очень чувствительны к ним. Я не смогу дать много советов для "неизвестной" стратегии. В этом случае вам придется уточнить ее. Но помните, что вам не нужно смотреть на 1000 баров назад. Если вы узнаете, как работает ZigZag, как он использует высокие и низкие прорывы и как он ищет назад, иногда вам нужно смотреть назад только на расстояние (Глубина + Шаг назад) баров - в зависимости от стратегии это может быть немного больше или даже меньше, но никогда не 1000 или 100, которые вы используете.

 

Спасибо за информацию о цифрах. Это головная боль для меня, мне нужно прочитать и понять все детали...

Позвольте мне подробнее рассказать о том, чего я пытаюсь достичь. У меня есть довольно прибыльный эксперт (в настоящее время), которого я тестировал в течение последних 10 лет. Однако эксперт ведет себя не совсем хорошо в каждом условии, не очень плохо, но не перспективно в некоторые годы/месяцы. У него есть некоторые предварительно оптимизированные переменные, которые влияют на его прибыльность. Я хочу найти корреляцию между прошлой историей и сегодняшним днем, чтобы самооптимизировать переменные.

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

Вот такая стратегия. Я работал над многими другими темами для анализа исторических данных, включая Фурье, циклы Хартса, Гертцеля, MESA и т.д., но я пришел к выводу, что использование метода, который работает над существующими данными, будет намного лучше.

Так что мне не нужен анализ хай-лоу в реальном времени, в 15M наборе данных я готов потерять данные за полдня (почти 45 тиков). Скорее всего, я буду смотреть на последние 5 дней, и 4,5 дня изменения, я думаю, достаточно, чтобы найти новые оптимизированные значения.

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

 
aed71:

Спасибо за информацию о цифрах. Это головная боль для меня, мне нужно прочитать и понять все детали...

Позвольте мне подробнее рассказать о том, чего я пытаюсь достичь. У меня есть довольно прибыльный эксперт (в настоящее время), которого я тестировал в течение последних 10 лет. Однако эксперт ведет себя не совсем хорошо в каждом условии, не очень плохо, но не перспективно в некоторые годы/месяцы. У него есть некоторые предварительно оптимизированные переменные, которые влияют на его прибыльность. Я хочу найти корреляцию между прошлой историей и сегодняшним днем, чтобы самооптимизировать переменные.

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

Вот такая стратегия. Я работал над многими другими темами для анализа исторических данных, включая Фурье, циклы Хартса, Гертцеля, MESA и т.д., но я пришел к выводу, что использование метода, который работает над существующими данными, будет намного лучше.

Поэтому мне не нужен анализ хай-лоу в реальном времени, в наборе данных 15M я готов потерять данные за полдня (почти 45 тиков). Скорее всего, я буду смотреть на последние 5 дней, и 4,5 дня изменения, я думаю, достаточно, чтобы найти новые оптимизированные значения.

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


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

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

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

 

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

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

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