Форум » Статьи MQLabs » Новый ZigZag » Ответить

Новый ZigZag

hoz: Появился вопрос касательно статьи. Я пишу класс для работы с зиг-загами. Решил для теста воспользоваться индикатором из данной статьи NeoZigZag_Close. В итоге, почему-то он периодически возвращает не как обычно бывает 0 или "не ноль" т.е. значение, а вот такое значение: 2147483647.0. С чем это связано? Мне теперь приходится проверять не только на "не пустое значение", но и не "не 2147483647.0, что не есть логично. Вот что пишет в журнале у меня возвращаемое значение данного индикатора: 2015.07.13 22:07:06 2015.06.01 00:10 ZZBaseVariant EURUSD,M15: ZZ.GetZZExtremumPrice(9) = 2147483647.0 2015.07.13 22:07:06 2015.06.01 00:10 ZZBaseVariant EURUSD,M15: ZZ.GetZZExtremumTime(9) = 2015.05.29 21:30:00 2015.07.13 22:07:06 2015.06.01 00:10 ZZBaseVariant EURUSD,M15: ZZ.GetZZExtremumPrice(10) = 2147483647.0 2015.07.13 22:07:06 2015.06.01 00:10 ZZBaseVariant EURUSD,M15: ZZ.GetZZExtremumTime(10) = 2015.05.29 21:15:00 2015.07.13 22:07:06 2015.06.01 00:10 ZZBaseVariant EURUSD,M15: ZZ.GetZZExtremumPrice(11) = 2147483647.0 2015.07.13 22:07:06 2015.06.01 00:10 ZZBaseVariant EURUSD,M15: ZZ.GetZZExtremumTime(11) = 2015.05.29 21:00:00 2015.07.13 22:07:06 2015.06.01 00:10 ZZBaseVariant EURUSD,M15: ZZ.GetZZExtremumPrice(12) = 2147483647.0 2015.07.13 22:07:06 2015.06.01 00:10 ZZBaseVariant EURUSD,M15: ZZ.GetZZExtremumTime(12) = 2015.05.29 20:45:00 2015.07.13 22:07:06 2015.06.01 00:10 ZZBaseVariant EURUSD,M15: ZZ.GetZZExtremumPrice(13) = 1.09936 2015.07.13 22:07:06 2015.06.01 00:10 ZZBaseVariant EURUSD,M15: ZZ.GetZZExtremumTime(13) = 2015.05.29 20:30:00 2015.07.13 22:07:06 2015.06.01 00:10 ZZBaseVariant EURUSD,M15: ZZ.GetZZExtremumPrice(14) = 2147483647.0 2015.07.13 22:07:06 2015.06.01 00:10 ZZBaseVariant EURUSD,M15: ZZ.GetZZExtremumTime(14) = 2015.05.29 20:15:00

Ответов - 17, стр: 1 2 All

Scriptong: hoz пишет: В итоге, почему-то он периодически возвращает не как обычно бывает 0 или "не ноль" т.е. значение, а вот такое значение: 2147483647.0. С чем это связано? Если Вы читаете содержимое первого буфера индикатора (индекс 0), то все верно: индикатор указывает на отсутствие экстремума именно значением EMPTY_VALUE (2147483647). В МТ4 индикаторные буфера по умолчанию инициализируются именно значением EMPTY_VALUE. Чтобы изменить умолчательное значение, используемое в качестве пустого, на другое, используют функцию SetIndexEmptyValue(). В стандартном ZigZag именно так и поступили, указав в качестве пустого значения 0.0. К слову, в МТ5 по умолчанию буферы индикатора инициализируются нулем, а не EMPTY_VALUE, что дает много головной боли при переводе индикаторов с MQL4 на MQL5 и обратно.

hoz: Игорь, здравствуйте. Замечен странный момент. Пользуюсь Вашими зиг-загами уже не один месяц, но сегодня вот что увидел в терминале: Что это может такое быть? Глюк терминала что-ли?

Scriptong: hoz пишет: Игорь, здравствуйте. Замечен странный момент. Пользуюсь Вашими зиг-загами уже не один месяц, но сегодня вот что увидел в терминале: Доброго времени суток. Укажите, пожалуйста, о каком именно из зиг-загов идет речь.


hoz: Scriptong пишет: Укажите, пожалуйста, о каком именно из зиг-загов идет речь. Добрый ночи) Вот об этом, разумеется... Индикатор NeoZigZag_Close из статьи Новый ZigZag.

Scriptong: hoz пишет: Добрый ночи) Вот об этом, разумеется... Индикатор NeoZigZag_Close из статьи Новый ZigZag. У меня все ОК.

hoz: В том-то и дело, что уже не первый месяц им пользуюсь. Тока вот на днях такая фигня началась. А до этого сколько терминалов не ставлю, постоянно при старте терминала исчезают все панели инструментов. Приходится нажимать вид - панель инструментов и выбирать каждую, чтоб появилась. То ли какая-то несовместимость новых билдов недоделанных, то ли что-то ещё. Кроме МТ4 больше, ни с чем граблей не обнаружено в системе...

Sergey: hoz пишет: Тока вот на днях такая фигня началась. Если это тебя успокоит, у меня на одном из терминалов такая же фигня. Три терминала установлены на одном компе, а глючит только один с прошлого воскресенья. Вчера переустановил, все устаканилось по умолчанию.

hoz: Так это всё понятно. Но я уже переустанавливал его. Хватает на некоторое время, и начинается снова...

Scriptong: Давайте попробуем путем вспоминания подробностей установить причину. Итак, какой билд терминала используется, на какой ОС, какой брокер, какой тип счета, как была получена история котировок.

hoz: Scriptong пишет: Давайте попробуем путем вспоминания подробностей установить причину. Итак, какой билд терминала используется, на какой ОС, какой брокер, какой тип счета, как была получена история котировок. ОС Win 7 x64. Брокеры Alpari и Oanda. На демке сваливается даже всё. История котировок подкачивается по F2 изначально, а потом сама подкачивается, т.к. запускаю ежедневно.

Balbesik: hoz пишет: ОС Win 7 x64. Брокеры Alpari и Oanda. На демке сваливается даже всё. История котировок подкачивается по F2 изначально, а потом сама подкачивается, т.к. запускаю ежедневно. Хорошая контора, очень консервативная и все подряд билды (этих уе...в, что бы мы им "вылизывали") не ставит. Была у меня подобная картинка на ЗигЗаге Nena - смотри программную ошибку.

Scriptong: hoz пишет: ОС Win 7 x64. Брокеры Alpari и Oanda. На демке сваливается даже всё. История котировок подкачивается по F2 изначально, а потом сама подкачивается, т.к. запускаю ежедневно. У меня, кстати, все те же самые исходные данные (ОС и компания). Запустил только что индикатор, ничего в нем не переделывая: Снова все ОК. Скорее всего, в Вашем терминале какая-то проблема с историей котировок. Попробуйте использовать мою версию истории.

hoz: Игорь, возник попутный вопрос по Вашему индикатору. Как реализовать момент, чтоб следующий экстремум зиг-зага рисовался только тогда, когда между нулевым баром и предыдущим экстремумом было расстояние, например, 5 баров? Т.е. если меньше, то не рисуем? Я что-то пытался, но на выходе не то что-то получается.

hoz: На данный момент у меня вот такой вариант получился. Если от туда убрать принты, то становится видно что я делал. Принтовал спецом, чтоб отследить что происходит. Тем не менее, наблюдаю, что разница между 0-вым баром и баром с индексом равным индексу бара последнего экстремума не является адекватной. Причину понять не смог...

Scriptong: hoz пишет: На данный момент у меня вот такой вариант получился. В этом варианте слишком много ошибок, чтобы можно было обоснованно продолжать разбор проблемы. Так, сразу бросается в глаза, что объявлен массив, который, видимо, должен использоваться в качестве буфера индикатора - ZZTimeBuf. Но, во-первых, этот массив не может быть буфером, т. к. он объявлен как статический. А, во-вторых, этот массив так и не стал буфером, т. к. не привязан ни к одному из трех предполагаемых буферов (в IndicatorBuffers указано 3). Ну а в принципе указанная задача может быть решена без ввода дополнительного буфера. Примерный алгоритм таков: 1. Запоминаем дату/время последнего экстремума ZZ. 2. На каждом новом баре определяем, какой индекс бара соответствует сохраненной дате/времени. 3. Сравниваем полученный индекс с заданной величиной (через сколько баров можно регистрировать экстремум) и, если можно регистрировать экстремум по стандартному критерию, то регистрируем новый экстремум ZZ.

hoz: Scriptong пишет: В этом варианте слишком много ошибок, чтобы можно было обоснованно продолжать разбор проблемы. Так, сразу бросается в глаза, что объявлен массив, который, видимо, должен использоваться в качестве буфера индикатора - ZZTimeBuf. Но, во-первых, этот массив не может быть буфером, т. к. он объявлен как статический. Как это не может. Ведь, у Вас же тоже буфер экстремумом является статическим т.к. объявлен на глобальном уровне. Тем не менее, он является буфером. Scriptong пишет: А, во-вторых, этот массив так и не стал буфером, т. к. не привязан ни к одному из трех предполагаемых буферов (в IndicatorBuffers указано 3). Вообще-то, изначально я и реализовал это как буфер, но... оказалось, что метаквоты и тут сделали всё для "удобства" разработки. Оказалось, что буфер не может быть типом datetme, т.к. такой перегрузки и SetIndexBuffer() нет! Пришлось как-то реализовывать посредством обычного массива. Размер я не решил какой ему присвоить, поэтому сделал 10000 для теста. А как иначе? Создавать динамический массив? Я не разу так неделал.. Стоит оно того? Scriptong пишет: Ну а в принципе указанная задача может быть решена без ввода дополнительного буфера. Примерный алгоритм таков: 1. Запоминаем дату/время последнего экстремума ZZ. 2. На каждом новом баре определяем, какой индекс бара соответствует сохраненной дате/времени. 3. Сравниваем полученный индекс с заданной величиной (через сколько баров можно регистрировать экстремум) и, если можно регистрировать экстремум по стандартному критерию, то регистрируем новый экстремум ZZ. Я думал над этим. Но хочется более универсального способа. И на то есть причины. Ведь есть вариант получения интересующего нас экстремума, как относительно времени и удалённости о 0-го бара, так и по направлению движения цены по какому-то признаку. Таким образом, гораздо нагляднее иметь цепочку значений раскинутых по времени.

Scriptong: hoz пишет: Вообще-то, изначально я и реализовал это как буфер, но... оказалось, что метаквоты и тут сделали всё для "удобства" разработки. Оказалось, что буфер не может быть типом datetme, т.к. такой перегрузки и SetIndexBuffer() нет! Пришлось как-то реализовывать посредством обычного массива. Размер я не решил какой ему присвоить, поэтому сделал 10000 для теста. А как иначе? Создавать динамический массив? Я не разу так неделал.. Стоит оно того? Тип datetime вполне умещается в тип double. Поэтому можно смело объявить массив с типом double, а данные в нем хранить такие, как требуется, хоть int, хоть datetime. hoz пишет: Я думал над этим. Но хочется более универсального способа. И на то есть причины. Ведь есть вариант получения интересующего нас экстремума, как относительно времени и удалённости о 0-го бара, так и по направлению движения цены по какому-то признаку. Таким образом, гораздо нагляднее иметь цепочку значений раскинутых по времени. На мой взгляд, овчинка выделки не стоит, т. е. гнаться в данном случае за универсальностью не нужно. Ведь время возникновения любого из экстремумов можно определить, просто перебрав значения буфера экстремумов. Это, конечно, немного дольше, но не настолько критично, чтобы выделять для этих целей индикаторный буфер. Ведь это память компьютера, которой и без того мало.



полная версия страницы