Отправлено: 03.03.13 20:22. Заголовок: Разворотные ступени рынка
Часть 1. Разворотные ступени рынка - это изменение направления движения дневной тенденции рынка, строящейся по разворотным уровням (Pivot). В индикаторе FiboPivotAV_Steps уровни Pivot строятся на основании нескольких последних дней, а не на основании одного дня, как это происходит в классической версии расчета Pivot.
Часть 2. Вторая версия индикатора FiboPivotAV_Steps включает исправление ошибок определения разворотных уровней, новый алгоритм поиска уровней поддержки и сопротивления, визуализацию каналов линейной регресии. Статья завершается разработкой простенького эксперта, открывающего ордера при смене дневной тенденции.
Отправлено: 21.10.14 08:54. Заголовок: Привет всем. Когда т..
Привет всем. Когда то посетила идея создания такого индикатора. Это было еше до объемов. Решил посмотреть как он работает сейчас. Главным преимуществом и неоспоримым преимуществом это индикатора - была его самодостаточноть и простота для принятия решений в ручной торговли, ориентированной на среднесрок. По данному индикатору можно торговать не добавляя ничего. Нужно только соблюдать простейшие правила риск-менеджмента, покупать в "дешевой" зоне по ап тренду (нижняя половина канала) и продавать в "дорогой" зоне по даун тренду (верхняя половина канала). Вот и вся суть. Стопы кстати в среднесрочной торговле здесь получаются больше (по 400-600 пипсов), но это и должно быть так. Это для среднесрока даже плюс - стоп выбивает если тенденция поменялась, а не потому что произошли какие-то случайные кратковременные всплески (новости и т.д.)
Подскажите как получить данные с линий Регресии в индикаторе FiboPivotAV_Steps?
К сожалению, прямого метода нет, т. к. канал - графический объект. Данные можно получить только косвенным путем. Для этого нужно найти на графике объекты, имя которых начинается символами FPAVS_IND_CHAN_. После этих символов следует дата/время левой по графику точки линии:
цитата:
for (int i = ObjectsTotal()-1; i >= 0; i--) if (StringSubstr(ObjectName(i), 0, 15) == "FPAVS_IND_CHAN_") { datetime leftTime = ObjectGet(ObjectName(i), OBJPROP_TIME1); datetime rightTime = ObjectGet(ObjectName(i), OBJPROP_TIME2); }
Но в итоге Вы получите только точки временнЫх границ канала, а не их цены. Цены канала регрессии так получить нельзя. Для этого нужно будет воспользоваться функцией (переведя время в индексы баров), которая неоднократно применялась в проекте MQLabs:
цитата:
double GetLinearRegressionValues(int rightBar, int leftBar, double &leftValue) { // - 1 - == Инициализация переменных ==================================================== int n = leftBar - rightBar + 1; // Количество баров для расчета if (n <= 0) // Если количество баров не является.. return(0); // ..натуральным числом, то это ошибка double sumy = 0, // Сумма значений функции sumx = 0.0, // Сумма аргументов функции sumxy = 0.0, // Сумма произведения аргументов и.. // ..значений sumx2 = 0.0; // Сумма квадратов аргументов функции // - 1 - == Окончание блока =============================================================
// - 2 - == Нахождение необходимых сумм ================================================= for (int i = rightBar; i <= leftBar; i++) // Справа налево по графику { sumy += Close; // Суммируем значения функции sumxy += Close*i; // Сумма произведений аргументов и.. // ..значений функции sumx += i; // Сумма аргументов sumx2 += i*i; // Сумма квадратов аргументов } // - 2 - == Окончание блока =============================================================
// - 3 - == Вычисление коэффициентов К и В ============================================== double denominator = sumx2*n - sumx*sumx; // Знаменатель для нахождения коэф. К if (denominator == 0.0) // Знаменатель не может быть равен.. return(0); // ..нулю double kKoef = (sumxy*n - sumx*sumy)/denominator;// Нахождение значения коэффициента K double bKoef = (1.0/n)*(sumy - kKoef*sumx); // Коэффициент B // - 3 - == Окончание блока =============================================================
// - 4 - == Расчет значений линии на крайних барах ====================================== leftValue = kKoef*leftBar + bKoef; // Значение линии на левом баре return(kKoef*rightBar + bKoef); // Значение линии на правом баре // - 4 - == Окончание блока ============================================================= }
Отправлено: 21.10.14 10:37. Заголовок: Для интереса провери..
Для интереса проверил, как чувствует себя стратегия на форвард-периоде. В принципе пока держится. Для трех пар взяты те параметры, которые выведены в статье.
Евро
Франк
Фунт
Ради справедливости отмечу, что это тест с 2009-го года. То есть полученная прибыль в годовом выражении достаточно мала. Более того, во всех случаях фактор восстановления меньше единицы (максимальная просадка больше чистой прибыли).
Сообщение: 980
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация:
2
Отправлено: 08.12.14 10:20. Заголовок: Игорь, день добрый! ..
Игорь, день добрый!
В статье В ожидании тренда в индикаторе PChannel_Percent Вами была реализована полезная идея:
цитата:
Пробитие одной из границ канала может рассматриваться как начало тренда. Для исключения случаев явных ложных пробитий, когда цена нарушает уровень всего на несколько пунктов, а затем возвращается назад, стоит создать сигнальную зону, отстоящую, например, на 10% выше (ниже) от границы канала. В итоге получим модифицированный индикатор - PChannel_Percent. В отличие от исходного индикатора PChannel, канал, показывающий границы экстремумов, отображается пунктирной линией. Сплошной линией показываются границы сигнальной зоны, пробитие которых и будет являться сигналом открытия позиций.
Правда напрашиваются 4 зоны - по 2 (и выше и ниже) для каждой из границ канала. Помимо ложного пробоя на пару пипсов, может быть такой-же недобой - когда формируются двойные вершины или донышки перед разворотом. И тогда логика простая: если зона пробита и идет повторное пробитие в обратную сторону без касания границы канала и, например, моментум в зоне перекупленности-перепроданности, то можно прогнозировать разворот и войти рыночным ордером со стопом по границе.
(На скрине ниже параметры DTosc не подбирались - кинул на график просто для примера)
Вы может добавить подобное свойство индикатору FiboPivotAV_Steps_v2.mq4 ?
К сожалению, из-за графических свойств канала регрессии просто добавить пару буферов и построить параллельный канал как в PChannel не получается Правда подсказки выше я использовал и в советнике каналы нашел:
Но более удобно и универсально будет реализовать эти зоны в индикаторе. Наибольший интерес представляет удобство работы с границами канала.
----------------------------------------------------------------------------------------- PS. Для думающих в этом же направлении: также интересные подходы по теме были озвучены в цикле статей Динамика линейной регрессии.
Это достаточно странный способ получения координат. Зачем получать времена баров путем поиска объектов? Ведь в индикаторе все делается наоборот: по номерам баров строится канал. То есть то, что Вы получаете от объекта, известно еще до его построения:
extBarTime и Time[finishIndex] - вот то, что Вы искали.
Ну а далее все равно не так уж все и просто. Каналы регрессии в индикаторе показаны в виде цельных графических объектов, т. е. это не три параллельные линии, а единый объект "Канал регрессии". Вывести в этих же координатах другой объект со смещением не выйдет, т. к. получим те же самые результаты. Выход - показывать линии отдельно в виде "Трендовых линий". А это, в свою очередь, предполагает проведение отдельного расчета координат линий исходного канала регрессии, а затем - вычисление отступов, чтобы провести к ним параллельные линии.
К сожалению, стандартный объект линейной регрессии в МТ4 реализован с небольшой ошибкой: верхняя и нижняя линия не совпадают с теми расчетами, которые предлагаются в описании к этому инструменту, хотя центральная линия вычисляется правильно (описано здесь). В итоге приходим к тому, что параллельно использовать стандартный канал регрессии и собственные построения нельзя - будут большие расхождения. Значит, потребуется перевести все объекты линейной регрессии на трендовые линии, что в три раза увеличивает количество графических объектов и, соответственно, раздувает код строк этак на 200 или даже больше.
Это достаточно странный способ получения координат. Зачем получать времена баров путем поиска объектов? Ведь в индикаторе все делается наоборот: по номерам баров строится канал.
Игорь, это я в советнике нашел канал построенный индикатором и потом пытался посчитать дельту. Scriptong пишет:
цитата:
Ну а далее все равно не так уж все и просто. Каналы регрессии в индикаторе показаны в виде цельных графических объектов, т. е. это не три параллельные линии, а единый объект "Канал регрессии". Вывести в этих же координатах другой объект со смещением не выйдет, т. к. получим те же самые результаты.
Да, так и есть. Я обрел это познание и решил написать пост о дополнении индикатора
Scriptong пишет:
цитата:
К сожалению, стандартный объект линейной регрессии в МТ4 реализован с небольшой ошибкой: верхняя и нижняя линия не совпадают с теми расчетами, которые предлагаются в описании к этому инструменту, хотя центральная линия вычисляется правильно (описано здесь).
О, прочел. Странно, яндексом и гуглом искал информацию по регрессии, а на этот пост не попадал.
Scriptong пишет:
цитата:
В итоге приходим к тому, что параллельно использовать стандартный канал регрессии и собственные построения нельзя - будут большие расхождения.
Мда, а вот это печальная информация. Я то надеялся повторить построенный канал, добавить дельты и засунуть все это в шесть буферов + 2 используются - как раз думал в 8 уложиться, а оказалось - .
Значит, потребуется перевести все объекты линейной регрессии на трендовые линии, что в три раза увеличивает количество графических объектов и, соответственно, раздувает код строк этак на 200 или даже больше.
Игорь, этот вариант сократит объем дополнений? А то хорошо получается: буферные линии поверх до 0 бара, а дальше - прогноз, графические типа Луч.
Отправлено: 08.12.14 22:38. Заголовок: Немного подумал. При..
Немного подумал. Пришел к выводу, что достаточно лишь изменить код функции ShowRegressionChannel. В итоге получилось то, что нужно. Правда, делал на скорую руку, возможны различные ошибки. О красоте кода вообще говорить не приходится.
Сообщение: 985
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация:
2
Отправлено: 09.12.14 16:52. Заголовок: Игорь, день добрый! ..
Игорь, день добрый!
В течении дня ставил индикатор на разные графики. Сделал отдельными значения внутреннего и внешнего отклонения от границы канала, пока правда не знаю имеет ли смысл их разделять - хочу посмотреть статистику по пробоям и недобоям.
Остается вопрос удобства. Для ручной торговли все отлично видно и разницы особой нет - графический объект или буфер. Если обращаться к индикатору из советника, то с буфером работать удобнее - вызвал индикатор из Вашего темплейта и дело в шляпе. Для графического объекта получение значения любой из 6 линий канала дело не настолько очевидное.
Вопрос такой - может имеет смысл сделать границы канала буферами? Или есть возможность сделать работу с ними столь же удобной и просто я ее не знаю?
Отправлено: 09.12.14 18:53. Заголовок: Genry пишет: Для гр..
Genry пишет:
цитата:
Для графического объекта получение значения любой из 6 линий канала дело не настолько очевидное.
В принципе, можно и из советника обращаться к графическим объектам. Но в таком случае пропадает режим быстрого тестирования и оптимизации - в них графические объекты не отображаются.
Genry пишет:
цитата:
Вопрос такой - может имеет смысл сделать границы канала буферами?
На мой взгляд, это достаточно муторная работа. Для каждой линии нужно завести свой буфер (7 буферов для восходящего, 7 - для нисходящего каналов), а потом следить за обновлением данных. Да и использовать данные такого буфера нужно будет перебором баров в цикле. Тоже не очень удобно.
Делается проще. От индикатора берутся только данные о направлении тренда (откуда произошел перегиб Pivot - g_pivotDirChange). Затем дублируются функции поиска максимума/минимума, а далее берется функция ShowRegressionChannel вообще без изменений. Из этих функций при желании можно выбросить всю графическую шелуху (чтобы советник не отображал то же, что и индикатор). Хотя в идеале лучше просто перенести весь расчет данных индикатора в советник. Получится автономная программа. Причем код расчета данных для советника будет намного короче того кода, который работает в индикаторе.
Делается проще. От индикатора берутся только данные о направлении тренда (откуда произошел перегиб Pivot - g_pivotDirChange). Затем дублируются функции поиска максимума/минимума, а далее берется функция ShowRegressionChannel вообще без изменений. Из этих функций при желании можно выбросить всю графическую шелуху (чтобы советник не отображал то же, что и индикатор). Хотя в идеале лучше просто перенести весь расчет данных индикатора в советник. Получится автономная программа. Причем код расчета данных для советника будет намного короче того кода, который работает в индикаторе.
O! Это хороший вариант. Главное что все данные будут доступны в советнике
Это самый лучший вариант. Но для его реализации придется много думать - перенос кода индикатора в советник не всегда легкое дело.
В данном случае код оказался вполне портабельным. Я взял за основу советник FiboPivotSteps_Expert.mq4 и вставил в него код индикатора, убрал совпадающие функции и процедуру связывания буферов и ... новый симбиоз заработал!!!
Игорь, еще раз скажу дифирамб Вашему стили программирования: модульность просто изумительная. Просто Лего - все стыкуется идеально! Расчет каналов индикатором и советником не везде совпадет, но по крайней мере все заработало сразу!
Отправлено: 11.12.14 15:22. Заголовок: Genry пишет: Вот ко..
Genry пишет:
цитата:
Вот код полученного полуфабриката
Направление мысли верное. А вот реализация непродумана (поставьте в начале этой версии #property strict и гляньте, сколько ошибок). Так, если уж перенесены индикаторные буфера в советник, то нужно позаботиться о том, чтобы поддерживать их. Автоматически такое происходит только в индикаторе. В итоге полученный советник оперирует массивами g_pivot и g_pivotDirChange нулевой длины. Зачем нужны такие массивы? Также в советнике нельзя использовать функцию IndicatorCounted. Поэтому функция расчета нового бара будет отличаться от той, которая использована в индикаторе.
В итоге получим такую версию. Для работы с границами каналов теперь достаточно использовать подсчет цены по уравнению прямой:
цитата:
kKoef * barIndex + bKoef
Коэффициенты К и B для каждой из прямой уже есть. Для текущего бара (индекс 0) вообще ничего считать не нужно, т. к. произведение коэффициента К и индекса бара вырождается в ноль. Значит, цена линии на текущем баре указана в коэффициенте B (bKoefUp, bKoefUpDn, bKoefUpUp, bKoefDn, bKoefDnUp, bKoefDnDn).
Направление мысли верное. А вот реализация непродумана (поставьте в начале этой версии #property strict и гляньте, сколько ошибок).
Мдаа "10 error(s), 11 warning(s) 11 12"
Полезная деректива #property strict - лишает некоторых иллюзий. Спасибо, Игорь, я ей не пользовался, теперь возьму на заметку!
А в остальном - я же только перенес, ошибок вроде нет, что-то уже рисует... "в зобу от радости дыханье сперло!" (Крылов) Вот сразу и поделился результатом Оно и понятно - только слил вместе два больших кода и сразу получил программный проект на 52К работающих сорцов
Scriptong пишет:
цитата:
В итоге получим такую версию. Для работы с границами каналов теперь достаточно использовать подсчет цены по уравнению прямой: цитата:kKoef * barIndex + bKoef Коэффициенты К и B для каждой из прямой уже есть. Для текущего бара (индекс 0) вообще ничего считать не нужно, т. к. произведение коэффициента К и индекса бара вырождается в ноль. Значит, цена линии на текущем баре указана в коэффициенте B (bKoefUp, bKoefUpDn, bKoefUpUp, bKoefDn, bKoefDnUp, bKoefDnDn).
Скачал. Спасибо, Игорь, буду разбираться. Теперь можно понять насколько работают области по границам канала.
Сообщение: 1186
Зарегистрирован: 04.03.13
Откуда: Москва
Репутация:
2
Отправлено: 10.01.15 12:31. Заголовок: Игорь, день добрый! ..
Игорь, день добрый!
Есть предложение еще несколько расширить функционал построения канала: при построении определить угол наклона канала. Полученное значение угла индикатор может вписывать, например в идентификатор линии канала:
________сейчас так: FPAVS_IND_CHAN_UP1409331600
будет, например, так: FPAVS_IND_CHAN_UP_-ххх_1409331600,
или предоставить возможность считывать эти данные другим способом. ---------------------- Что имеется в этом направлении: Linear_Sinus_FT - автор Aleksandr
Вот здесь попрошу подробнее - что за угол? Думаю, Вы в курсе знаменитой проблемы определения углов на свечных графиках (угол изменяется при смене масштаба и, тем более, таймфрейма)?
Вот здесь попрошу подробнее - что за угол? Думаю, Вы в курсе знаменитой проблемы определения углов на свечных графиках (угол изменяется при смене масштаба и, тем более, таймфрейма)?
Да, есть такая проблема и пару раз мы с Вами выходили на ее обсуждение. Я имел ввиду вот этот угол и уровень - 1 и 2 на скрине:
Отправлено: 12.01.15 20:14. Заголовок: Genry пишет: Я имел..
Genry пишет:
цитата:
Я имел ввиду вот этот угол и уровень - 1 и 2 на скрине:
Так это именно то, о чем я и говорю - угол определить однозначно невозможно, он будет разный при разных масштабах. Выходом является принятие некоторого алгоритма установления истинного угла, не зависящего от масштаба. Например, рассчитать этот угол на основании приведения графика к некоторой системе координат (по абсциссе - индексы баров, по ординате - цена). Относительно этой системы координат рассчитать нужный угол. Но это значение очень часто не будет совпадать с видимой величиной угла, хотя и будет коррелировать в пределах одного масштаба.
не зависящего от масштаба. Например, рассчитать этот угол на основании приведения графика к некоторой системе координат (по абсциссе - индексы баров, по ординате - цена).
ООО!
Начинаем доходить, что ну не хотят коровы со свиньями скрещиваться, как не изгаляйся (давайте синтезируем свинокорову). А ты мне рендж, рендж...
P.S. Да, с одной стороны волатильность, а с другой время. Еще не известно, что проще. Вот, кстати, один из ответов.
Все даты в формате GMT
2 час. Хитов сегодня: 0
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет