Наступил год пятилетнего Юбилея выхода серии статей Игоря по программированию на mql, на мой взгляд очень значимых и исключительно полезных: Как создать эксперт, не обладая навыками программирования Как создать эксперт, не обладая навыками программирования. Часть 2. Как создать эксперт, не обладая навыками программирования. Часть 3.
Я выше написал, что для каждого конкретно индикатора к единице добавляется такое количество баров, которое требуется для корректного расчета первичных данных. Если это константа, то она записывается напрямую (в приведенном примере это 1, а 1 + 1 выходит 2). Когда же на этапе написания кода неизвестен период расчета индикатора, то добавляется соответствующая переменная.
Сообщение: 2469
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация:
3
Отправлено: 21.12.16 11:59. Заголовок: Игорь, день добрый! ..
Игорь, день добрый! Возник вопрос по МТФ индикатору.
Попался вот такой индикатор http://dropmefiles.com/Otlzb - рисует mtf-конверты на графике цены. Поставил его посмотреть и увидел что он работает с ошибками: на истории нормально рисует линии старших ТФ, а потом на новых барах начинает их искажать. Сам подход создания конверта показался интересным, но не первый раз встречаю индикаторы которые так работают, в связи с чем, не обессудьте , есть три вопроса:
1. какие ошибки в данном индикаторе дают искажение линий старшего ТФ? 2. существует ли типовое (проверенное временем ) решение отображения старших ТФ на текущем ? 3. как перенести такого рода расчет из индикатора в советник? Чтобы получить правильные сигналы при пересечении ценой текущего ТФ линий конверта старшего ТФ.
Отрисовка конверта в советнике дело уже второе - это вполне возможно графическими объектами.
Но искажения снова проскакивают - индикатор не держит уровень рассчитанный на начало периода старшего ТФ и начинает вставлять перерасчет по барам текущего ТФ, а значит это опять не решение
1. какие ошибки в данном индикаторе дают искажение линий старшего ТФ?
Ошибок столько, что все и не перескажешь Основные заключаются в принципиально неверном подходе к построению мультипериодного индикатора.
1. Не учтено, что обновление котировок считается по текущему таймфрейму, а расчет и отображение данных происходит для старшего ТФ. 2. Использование инкрементного подхода к отрисовке индикатора (в основном цикле нужно использовать декремент). Это, чаще всего, приводит к появлению перерисовки данных индикатора, что и видим в итоге. 3. При отображении данных на младшем таймфрейме обновление данных старшего таймфрейма должно приводить к изменению данных на нескольких барах младшего ТФ, а не на одном, последнем.
Поэтому индикатор лучше попросту заново написать со всеми необходимыми проверками.
2. существует ли типовое (проверенное временем ) решение отображения старших ТФ на текущем ?
К сожалению, нет. Универсального рецепта не существует. Для каждой задачи требуется свое решение. Довольно много всего приходится учитывать при разработке мультипериодных версий. С удивлением замечаю, что многим программистам такая задача оказывается не по плечу.
Отправлено: 26.12.16 14:08. Заголовок: Genry пишет: как пе..
Genry пишет:
цитата:
как перенести такого рода расчет из индикатора в советник? Чтобы получить правильные сигналы при пересечении ценой текущего ТФ линий конверта старшего ТФ.
В советнике такой алгоритм будет реализовать намного проще, т. к. там не требуется отображение данных со старшего ТФ на младшем. То есть задача будет сведена к следующему: 1. Расчет данных за последние 3 бара заданного ТФ:
цитата:
for (int i = 0; i < 3; i++) { sup[ i ] = (((iHigh(NULL,TimeFrame,i)+iLow(NULL,TimeFrame,i)+iClose(NULL,TimeFrame,i))*2)/3)-iHigh(NULL,TimeFrame,i); res[ i ] = (((iHigh(NULL,TimeFrame,i)+iLow(NULL,TimeFrame,i)+iClose(NULL,TimeFrame,i))*2)/3)-iLow(NULL,TimeFrame,i);
}
2. Расчет трех текущих линий:
цитата:
up = iMAOnArray(res,0,3,0,MODE_EMA,0); md = iMA(NULL,TimeFrame,MAPeriod,ma_shift,ma_method,applied_price,0); dn = iMAOnArray(sup,0,3,0,MODE_EMA,0);
Это если нужен расчет для текущего бара, что приведет к изменению показаний при обновлении экстремумов бара старшего ТФ. Для сформированного бара добавим 1, где нужно:
цитата:
for (int i = 0; i < 3; i++) { sup[ i ] = (((iHigh(NULL,TimeFrame,i + 1)+iLow(NULL,TimeFrame,i + 1)+iClose(NULL,TimeFrame,i + 1))*2)/3)-iHigh(NULL,TimeFrame,i + 1); res[ i ] = (((iHigh(NULL,TimeFrame,i + 1)+iLow(NULL,TimeFrame,i + 1)+iClose(NULL,TimeFrame,i + 1))*2)/3)-iLow(NULL,TimeFrame,i + 1);
} up = iMAOnArray(res,0,3,0,MODE_EMA,0); md = iMA(NULL,TimeFrame,MAPeriod,ma_shift,ma_method,applied_price,1); dn = iMAOnArray(sup,0,3,0,MODE_EMA,0);
Основные заключаются в принципиально неверном подходе к построению мультипериодного индикатора... Довольно много всего приходится учитывать при разработке мультипериодных версий... В советнике такой алгоритм будет реализовать намного проще, т. к. там не требуется отображение данных со старшего ТФ на младшем...
Спасибо, Игорь! Буду разбираться. Мне понравилась сама идея такого конверта, хотелось бы увидеть его в правильной реализации.
цитата:
3. При отображении данных на младшем таймфрейме обновление данных старшего таймфрейма должно приводить к изменению данных на нескольких барах младшего ТФ, а не на одном, последнем.
Я так думаю, что для младшего ТФ должен отображаться конверт первого бара старшего ТФ. Т.е. мы например ставим индикатор на м5, а настроен он на Д1. У нас в течении дня должен отображаться конверт который посчитан по результатам вчерашнего дня на Д1. И с границами конверта для Д1 вчерашнего дня мы сравниваем сегодняшнее положение цены.
Такого результата я пока не получил. Вот последний мой вариант, настроен на Д1, но он перерисовывает последний день http://dropmefiles.com/jYQaU
Но, возможно, имеет смысл давать два конверта: предыдущий и последний бар старшего ТФ. Чтобы понять как лучше - надо это сначала правильно нарисовать
Отправлено: 27.12.16 19:32. Заголовок: Genry пишет: Я так ..
Genry пишет:
цитата:
Я так думаю, что для младшего ТФ должен отображаться конверт первого бара старшего ТФ. Т.е. мы например ставим индикатор на м5, а настроен он на Д1. У нас в течении дня должен отображаться конверт который посчитан по результатам вчерашнего дня на Д1. И с границами конверта для Д1 вчерашнего дня мы сравниваем сегодняшнее положение цены.
Соображение правильное. Но в коде нет даже близко такой идеи. Оттого и все проблемы, т. к. конверт текущего дня должен изменяться до тех пор, пока день не будет завершен.
Genry пишет:
цитата:
Такого результата я пока не получил. Вот последний мой вариант, настроен на Д1, но он перерисовывает последний день http://dropmefiles.com/jYQaU
Попробую чуть ближе к НГ все это обдумать, там, по идее не так уж много работы, на пару часов. Но сейчас этой пары катастрофически не хватает
Попробую чуть ближе к НГ все это обдумать, там, по идее не так уж много работы, на пару часов. Но сейчас этой пары катастрофически не хватает
Спасибо, Игорь! Главное решить задачу с полезным результатом, а сроки в таком деле - дело второе. Я думаю на текущем ТФ надо отображать (иметь такую возможность) показания первого и нулевого бара старшего ТФ. Это покажет тенденцию и можно будет сравнивать аж 3 пары показателей
Вчерашний день старшего ТФ я получил, но будет лучше оба бара старшего ТФ видеть на текущем дне - анализ будет полнее, т.к. видно развитие тенденции. При анализе текущего положения цены можно брать то значение что дает более широкий диапазон. Правда для этой цели можно использовать еще один ТФ, например: 1. торгуем м5 2. границы - вчерашний Д1 3. тенденции Н4.
Попробую чуть ближе к НГ все это обдумать, там, по идее не так уж много работы, на пару часов. Но сейчас этой пары катастрофически не хватает
Время нашлось совсем уж близко к НГ
Правильная, но не оптимально сделанная, версия здесь. Неоптимальность сразу видна при работе в тестере - достаточно медленно работает. Если надо будет, то можно существенно оптимизировать расчеты. Просто не стал пока заморачиваться с ними.
Если наложить оригинал и мою версию индикатора, то будут видны различия в показаниях на барах, начиная с баров прошлой недели. Это неправильное обращение к данным оригинального индикатора. В оригинале вообще нет привязки баров текущего ТФ к барам старшего ТФ.
Сообщение: 2482
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация:
3
Отправлено: 02.01.17 17:17. Заголовок: Выяснил что первонач..
Выяснил что первоначальная идея расчета принадлежит Лари Уильямсу: indicator of Larry Williams trading method. Here is formula for D1 Time frame indicator:
PROJECTED HIGH PROJECTED LOW FORMULA: [(High+Low+Close)/3]x2=A A-High=Project Low A-Low=Project High
PROJECTED HIGH PROJECTED LOW FORMULA: [(High+Low+Close)/3]x2=A
В обсуждаемом коде числа поменяны местами: сначала умножение на 2, а потом деление на 3. Хотя на результат такая замена никоим образом не влияет. Но за то сбивает с толку. Я никак не мог понять, в чем суть сложения параметров свечи с последующим умножением их на 2. А с приведенной формулировкой все становится на свои места.
Все даты в формате GMT
2 час. Хитов сегодня: 0
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет