Форум » Статьи MQLabs » Разворотные ступени рынка » Ответить

Разворотные ступени рынка

Scriptong: Часть 1. Разворотные ступени рынка - это изменение направления движения дневной тенденции рынка, строящейся по разворотным уровням (Pivot). В индикаторе FiboPivotAV_Steps уровни Pivot строятся на основании нескольких последних дней, а не на основании одного дня, как это происходит в классической версии расчета Pivot. Часть 2. Вторая версия индикатора FiboPivotAV_Steps включает исправление ошибок определения разворотных уровней, новый алгоритм поиска уровней поддержки и сопротивления, визуализацию каналов линейной регресии. Статья завершается разработкой простенького эксперта, открывающего ордера при смене дневной тенденции.

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

Evgeny: Привет всем. Когда то посетила идея создания такого индикатора. Это было еше до объемов. Решил посмотреть как он работает сейчас. Главным преимуществом и неоспоримым преимуществом это индикатора - была его самодостаточноть и простота для принятия решений в ручной торговли, ориентированной на среднесрок. По данному индикатору можно торговать не добавляя ничего. Нужно только соблюдать простейшие правила риск-менеджмента, покупать в "дешевой" зоне по ап тренду (нижняя половина канала) и продавать в "дорогой" зоне по даун тренду (верхняя половина канала). Вот и вся суть. Стопы кстати в среднесрочной торговле здесь получаются больше (по 400-600 пипсов), но это и должно быть так. Это для среднесрока даже плюс - стоп выбивает если тенденция поменялась, а не потому что произошли какие-то случайные кратковременные всплески (новости и т.д.) Вот скрин по одной акции. http://shot.qip.ru/00zEfM-6BtVUoinO/

Step: Подскажите как получить данные с линий Регресии в индикаторе FiboPivotAV_Steps?

Scriptong: Step пишет: Подскажите как получить данные с линий Регресии в индикаторе 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 - == Окончание блока ============================================================= }


Scriptong: Для интереса проверил, как чувствует себя стратегия на форвард-периоде. В принципе пока держится. Для трех пар взяты те параметры, которые выведены в статье. Евро Франк Фунт Ради справедливости отмечу, что это тест с 2009-го года. То есть полученная прибыль в годовом выражении достаточно мала. Более того, во всех случаях фактор восстановления меньше единицы (максимальная просадка больше чистой прибыли).

Эдуард: *PRIVAT*

Genry: Игорь, день добрый! В статье В ожидании тренда в индикаторе PChannel_Percent Вами была реализована полезная идея: Пробитие одной из границ канала может рассматриваться как начало тренда. Для исключения случаев явных ложных пробитий, когда цена нарушает уровень всего на несколько пунктов, а затем возвращается назад, стоит создать сигнальную зону, отстоящую, например, на 10% выше (ниже) от границы канала. В итоге получим модифицированный индикатор - PChannel_Percent. В отличие от исходного индикатора PChannel, канал, показывающий границы экстремумов, отображается пунктирной линией. Сплошной линией показываются границы сигнальной зоны, пробитие которых и будет являться сигналом открытия позиций. Правда напрашиваются 4 зоны - по 2 (и выше и ниже) для каждой из границ канала. Помимо ложного пробоя на пару пипсов, может быть такой-же недобой - когда формируются двойные вершины или донышки перед разворотом. И тогда логика простая: если зона пробита и идет повторное пробитие в обратную сторону без касания границы канала и, например, моментум в зоне перекупленности-перепроданности, то можно прогнозировать разворот и войти рыночным ордером со стопом по границе. (На скрине ниже параметры DTosc не подбирались - кинул на график просто для примера) Вы может добавить подобное свойство индикатору FiboPivotAV_Steps_v2.mq4 ? К сожалению, из-за графических свойств канала регрессии просто добавить пару буферов и построить параллельный канал как в PChannel не получается Правда подсказки выше я использовал и в советнике каналы нашел: double fiboPivot = iCustom(NULL, 0, "FiboPivotAV_Steps_v2", 0, 1); double rightValue, leftValue; for (int ii = ObjectsTotal()-1; ii >= 0; ii--) if (StringSubstr(ObjectName(ii), 0, 15) == "FPAVS_IND_CHAN_") { datetime leftTime = ObjectGet(ObjectName(ii), OBJPROP_TIME1); datetime rightTime = ObjectGet(ObjectName(ii), OBJPROP_TIME2); rightValue = GetLinearRegressionValues(iBarShift(NULL, 0, rightTime), iBarShift(NULL, 0, leftTime), leftValue); // Print(ii," ",rightTime, " ", rightValue, " ", leftTime, " ", leftValue); } Но более удобно и универсально будет реализовать эти зоны в индикаторе. Наибольший интерес представляет удобство работы с границами канала. ----------------------------------------------------------------------------------------- PS. Для думающих в этом же направлении: также интересные подходы по теме были озвучены в цикле статей Динамика линейной регрессии.

Scriptong: Genry пишет: Правда подсказки выше я использовал и в советнике каналы нашел: double fiboPivot = iCustom(NULL, 0, "FiboPivotAV_Steps_v2", 0, 1); double rightValue, leftValue; for (int ii = ObjectsTotal()-1; ii >= 0; ii--) if (StringSubstr(ObjectName(ii), 0, 15) == "FPAVS_IND_CHAN_") { datetime leftTime = ObjectGet(ObjectName(ii), OBJPROP_TIME1); datetime rightTime = ObjectGet(ObjectName(ii), OBJPROP_TIME2); rightValue = GetLinearRegressionValues(iBarShift(NULL, 0, rightTime), iBarShift(NULL, 0, leftTime), leftValue); // Print(ii," ",rightTime, " ", rightValue, " ", leftTime, " ", leftValue); } Это достаточно странный способ получения координат. Зачем получать времена баров путем поиска объектов? Ведь в индикаторе все делается наоборот: по номерам баров строится канал. То есть то, что Вы получаете от объекта, известно еще до его построения: ShowRegressionChannel(extBarTime, Time[finishIndex], clr, RAY_IS); extBarTime и Time[finishIndex] - вот то, что Вы искали. Ну а далее все равно не так уж все и просто. Каналы регрессии в индикаторе показаны в виде цельных графических объектов, т. е. это не три параллельные линии, а единый объект "Канал регрессии". Вывести в этих же координатах другой объект со смещением не выйдет, т. к. получим те же самые результаты. Выход - показывать линии отдельно в виде "Трендовых линий". А это, в свою очередь, предполагает проведение отдельного расчета координат линий исходного канала регрессии, а затем - вычисление отступов, чтобы провести к ним параллельные линии. К сожалению, стандартный объект линейной регрессии в МТ4 реализован с небольшой ошибкой: верхняя и нижняя линия не совпадают с теми расчетами, которые предлагаются в описании к этому инструменту, хотя центральная линия вычисляется правильно (описано здесь). В итоге приходим к тому, что параллельно использовать стандартный канал регрессии и собственные построения нельзя - будут большие расхождения. Значит, потребуется перевести все объекты линейной регрессии на трендовые линии, что в три раза увеличивает количество графических объектов и, соответственно, раздувает код строк этак на 200 или даже больше.

Genry: Scriptong пишет: Это достаточно странный способ получения координат. Зачем получать времена баров путем поиска объектов? Ведь в индикаторе все делается наоборот: по номерам баров строится канал. Игорь, это я в советнике нашел канал построенный индикатором и потом пытался посчитать дельту. Scriptong пишет: Ну а далее все равно не так уж все и просто. Каналы регрессии в индикаторе показаны в виде цельных графических объектов, т. е. это не три параллельные линии, а единый объект "Канал регрессии". Вывести в этих же координатах другой объект со смещением не выйдет, т. к. получим те же самые результаты. Да, так и есть. Я обрел это познание и решил написать пост о дополнении индикатора Scriptong пишет: К сожалению, стандартный объект линейной регрессии в МТ4 реализован с небольшой ошибкой: верхняя и нижняя линия не совпадают с теми расчетами, которые предлагаются в описании к этому инструменту, хотя центральная линия вычисляется правильно (описано здесь). О, прочел. Странно, яндексом и гуглом искал информацию по регрессии, а на этот пост не попадал. Scriptong пишет: В итоге приходим к тому, что параллельно использовать стандартный канал регрессии и собственные построения нельзя - будут большие расхождения. Мда, а вот это печальная информация. Я то надеялся повторить построенный канал, добавить дельты и засунуть все это в шесть буферов + 2 используются - как раз думал в 8 уложиться, а оказалось - .

Genry: Нашел индикатор Канала LR Автор: dimicr который строится поверх CLR FiboPivotAV_Steps_v2 Scriptong пишет: Значит, потребуется перевести все объекты линейной регрессии на трендовые линии, что в три раза увеличивает количество графических объектов и, соответственно, раздувает код строк этак на 200 или даже больше. Игорь, этот вариант сократит объем дополнений? А то хорошо получается: буферные линии поверх до 0 бара, а дальше - прогноз, графические типа Луч.

Scriptong: Немного подумал. Пришел к выводу, что достаточно лишь изменить код функции ShowRegressionChannel. В итоге получилось то, что нужно. Правда, делал на скорую руку, возможны различные ошибки. О красоте кода вообще говорить не приходится.

Genry: Scriptong пишет: Немного подумал. Пришел к выводу, что достаточно лишь изменить код функции ShowRegressionChannel. В итоге получилось то, что нужно. Scriptong пишет: Правда, делал на скорую руку, возможны различные ошибки. О красоте кода вообще говорить не приходится. Да нам не шашечки, а ехать! Спасибо, Игорь! Буду смотреть.

Genry: Посмотрел на истории EurUSD m15, все работает - пока ошибок не увидел. Еще раз спасибо, надеюсь доработка будет полезна не только мне.

Genry: Игорь, день добрый! В течении дня ставил индикатор на разные графики. Сделал отдельными значения внутреннего и внешнего отклонения от границы канала, пока правда не знаю имеет ли смысл их разделять - хочу посмотреть статистику по пробоям и недобоям. Остается вопрос удобства. Для ручной торговли все отлично видно и разницы особой нет - графический объект или буфер. Если обращаться к индикатору из советника, то с буфером работать удобнее - вызвал индикатор из Вашего темплейта и дело в шляпе. Для графического объекта получение значения любой из 6 линий канала дело не настолько очевидное. Вопрос такой - может имеет смысл сделать границы канала буферами? Или есть возможность сделать работу с ними столь же удобной и просто я ее не знаю?

Scriptong: Genry пишет: Для графического объекта получение значения любой из 6 линий канала дело не настолько очевидное. В принципе, можно и из советника обращаться к графическим объектам. Но в таком случае пропадает режим быстрого тестирования и оптимизации - в них графические объекты не отображаются. Genry пишет: Вопрос такой - может имеет смысл сделать границы канала буферами? На мой взгляд, это достаточно муторная работа. Для каждой линии нужно завести свой буфер (7 буферов для восходящего, 7 - для нисходящего каналов), а потом следить за обновлением данных. Да и использовать данные такого буфера нужно будет перебором баров в цикле. Тоже не очень удобно. Делается проще. От индикатора берутся только данные о направлении тренда (откуда произошел перегиб Pivot - g_pivotDirChange). Затем дублируются функции поиска максимума/минимума, а далее берется функция ShowRegressionChannel вообще без изменений. Из этих функций при желании можно выбросить всю графическую шелуху (чтобы советник не отображал то же, что и индикатор). Хотя в идеале лучше просто перенести весь расчет данных индикатора в советник. Получится автономная программа. Причем код расчета данных для советника будет намного короче того кода, который работает в индикаторе.

Genry: Scriptong пишет: Делается проще. От индикатора берутся только данные о направлении тренда (откуда произошел перегиб Pivot - g_pivotDirChange). Затем дублируются функции поиска максимума/минимума, а далее берется функция ShowRegressionChannel вообще без изменений. Из этих функций при желании можно выбросить всю графическую шелуху (чтобы советник не отображал то же, что и индикатор). Хотя в идеале лучше просто перенести весь расчет данных индикатора в советник. Получится автономная программа. Причем код расчета данных для советника будет намного короче того кода, который работает в индикаторе. O! Это хороший вариант. Главное что все данные будут доступны в советнике

Scriptong: Genry пишет: O! Это хороший вариант. Главное что все данные будут доступны в советнике Это самый лучший вариант. Но для его реализации придется много думать - перенос кода индикатора в советник не всегда легкое дело.

Genry: Scriptong пишет: Это самый лучший вариант. Но для его реализации придется много думать - перенос кода индикатора в советник не всегда легкое дело. В данном случае код оказался вполне портабельным. Я взял за основу советник FiboPivotSteps_Expert.mq4 и вставил в него код индикатора, убрал совпадающие функции и процедуру связывания буферов и ... новый симбиоз заработал!!! Игорь, еще раз скажу дифирамб Вашему стили программирования: модульность просто изумительная. Просто Лего - все стыкуется идеально! Расчет каналов индикатором и советником не везде совпадет, но по крайней мере все заработало сразу! Вот код полученного полуфабриката : FiboPivotStepsChannelV3_EA_v0.mq4 Функцию Signal не изменял.

Scriptong: Genry пишет: Вот код полученного полуфабриката Направление мысли верное. А вот реализация непродумана (поставьте в начале этой версии #property strict и гляньте, сколько ошибок). Так, если уж перенесены индикаторные буфера в советник, то нужно позаботиться о том, чтобы поддерживать их. Автоматически такое происходит только в индикаторе. В итоге полученный советник оперирует массивами g_pivot и g_pivotDirChange нулевой длины. Зачем нужны такие массивы? Также в советнике нельзя использовать функцию IndicatorCounted. Поэтому функция расчета нового бара будет отличаться от той, которая использована в индикаторе. В итоге получим такую версию. Для работы с границами каналов теперь достаточно использовать подсчет цены по уравнению прямой: kKoef * barIndex + bKoef Коэффициенты К и B для каждой из прямой уже есть. Для текущего бара (индекс 0) вообще ничего считать не нужно, т. к. произведение коэффициента К и индекса бара вырождается в ноль. Значит, цена линии на текущем баре указана в коэффициенте B (bKoefUp, bKoefUpDn, bKoefUpUp, bKoefDn, bKoefDnUp, bKoefDnDn).

Genry: Scriptong пишет: Направление мысли верное. А вот реализация непродумана (поставьте в начале этой версии #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). Скачал. Спасибо, Игорь, буду разбираться. Теперь можно понять насколько работают области по границам канала.

basy: здравствуйте Genry как скачать индикатор FiboPivotStepsChannelV3_EA_v0.mq4

Scriptong: basy пишет: здравствуйте Genry как скачать индикатор FiboPivotStepsChannelV3_EA_v0.mq4 С файлообменника он уже давно удален, там ограничение на хранение 7 (14) дней. У меня же на компьютере остался: Версия Genry - здесь. Моя правка эксперта - здесь.

Genry: Игорь, день добрый! Есть предложение еще несколько расширить функционал построения канала: при построении определить угол наклона канала. Полученное значение угла индикатор может вписывать, например в идентификатор линии канала: ________сейчас так: FPAVS_IND_CHAN_UP1409331600 будет, например, так: FPAVS_IND_CHAN_UP_-ххх_1409331600, или предоставить возможность считывать эти данные другим способом. ---------------------- Что имеется в этом направлении: Linear_Sinus_FT - автор Aleksandr MA Angle МА_Color - автор Ale002 (там-же Envelopes.TL_m.mq4 )

Scriptong: Genry пишет: определить угол наклона канала Вот здесь попрошу подробнее - что за угол? Думаю, Вы в курсе знаменитой проблемы определения углов на свечных графиках (угол изменяется при смене масштаба и, тем более, таймфрейма)?

Genry: Scriptong пишет: Вот здесь попрошу подробнее - что за угол? Думаю, Вы в курсе знаменитой проблемы определения углов на свечных графиках (угол изменяется при смене масштаба и, тем более, таймфрейма)? Да, есть такая проблема и пару раз мы с Вами выходили на ее обсуждение. Я имел ввиду вот этот угол и уровень - 1 и 2 на скрине:

Scriptong: Genry пишет: Я имел ввиду вот этот угол и уровень - 1 и 2 на скрине: Так это именно то, о чем я и говорю - угол определить однозначно невозможно, он будет разный при разных масштабах. Выходом является принятие некоторого алгоритма установления истинного угла, не зависящего от масштаба. Например, рассчитать этот угол на основании приведения графика к некоторой системе координат (по абсциссе - индексы баров, по ординате - цена). Относительно этой системы координат рассчитать нужный угол. Но это значение очень часто не будет совпадать с видимой величиной угла, хотя и будет коррелировать в пределах одного масштаба.

Balbesik: Scriptong пишет: не зависящего от масштаба. Например, рассчитать этот угол на основании приведения графика к некоторой системе координат (по абсциссе - индексы баров, по ординате - цена). ООО! Начинаем доходить, что ну не хотят коровы со свиньями скрещиваться, как не изгаляйся (давайте синтезируем свинокорову). А ты мне рендж, рендж... P.S. Да, с одной стороны волатильность, а с другой время. Еще не известно, что проще. Вот, кстати, один из ответов.



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