Форум » Статьи 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! Это хороший вариант. Главное что все данные будут доступны в советнике



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