Отправлено: 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! Это хороший вариант. Главное что все данные будут доступны в советнике
Все даты в формате GMT
2 час. Хитов сегодня: 0
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет