Индикатор PSaR Time
Анализ PSaR показывает, что когда движение является столь же длительным, как самое длительное движение в непосредственном прошлом, это движение имеет значительную вероятность успеха, пока не сформируется столь же длительное движение в противоположном направлении.
Мы попытаемся заработать на этом наблюдении при помощи нового индикатора “PSaR Time Indicator” (PTI), который позволяет рассчитать процентное соотношение длины текущего цикла PSaR (то есть продолжительности последнего тренда, идентифицированного PSaR) к продолжительности длины самого длинного цикла за последние 50 периодов. Значение 100 демонстрирует, что текущий цикл самый продолжительный за последние 50 дней, значение 75 демонстрирует, что текущий цикл составляет 75% длительности самого длинного цикла за последние 50 дней и так далее. Индикатор рисует особые линии для циклов восходящего и нисходящего трендов, т.е. мы будем сравнивать циклы только одной направленности, как это видно на рисунке 1.
Рисунок. 1. Примеры сигналов. Стратегия всегда удерживает позицию в направлении значимых формирующихся трендов, выход осуществляется, когда линия РТI в противоположного тренда пересекает уровень 70.
Стратегия.
Система, которую мы намереваемся протестировать, торгует на сигналах PSaR в зависимости от длины цикла, которая идентифицируется PTI. Стратегия открывает длинную позицию, когда РТI для восходящего тренда превышает 70% и закрываем позицию, когда РТI для нисходящего тренда превышает 70. Для открытия коротких позиций – разворачиваем правила.
Также как при работе с оригинальной системой PSaR мы постоянно находимся на рынке. Однако, поскольку мы инкорпорировали в систему фактор длины цикла, то многие небольшие ценовые колебания просто игнорируются, это позволяем нам избежать сделок с двойными убытками – главного фактор риска при торговле по классической системе PSaR.
Размер позиции корректируется к волатильности при помощи среднего истинного диапазона ATR с периодом 14..
Размер позиции = 0.01* (баланс депозита)/(размер контракта * 14-дневный ATR).
Например, предположим, что наш баланс депозита составляет 100.000 долларов, размер контракта 100.000 долларов, 14-дневный ATR 0.0123.
Тогда размер сделки будет:
(0.01*100,000 / (100,000*0.0123)) = 0.81 или $81,000.
На рисунке 1 мы видим несколько примеров за 2009 год для пары евро/американский доллар. Стратегия всегда держит открытой позицию в направлении значимого тренда, который находится в стадии развития, когда линия РТI для противоположного тренда превышает уровень 70, сделка разворачивается. Система основана на базовом допущении для стратегии работы по PSaR: мы всегда должны следовать последнему тренду и всегда быть на рынке, – однако она демонстрирует более робастный подход к идентификации надежных трендовых сигналов.
Тестирование системы.
Мы тестировали стратегию на дневных данных для следующих пар: британский фунт/американский доллар (GBP/USD), австралийский доллар/американский доллар (AUD/USD) и евро/американский доллар (EUR/USD). Тестовый период: с 1 января 2000 года до 1 июня 2011 года. В Таблице 1 приведен итог тестирования системы и данные по торговым затратам на каждую пару. В целом результаты указывают на то, что стратегия лучше работает с валютными парами, которые формируют относительно стабильные тренды (EUR/USD и AUD/USD); хуже результаты для пар, которые склонны к не-направленной волатильности, таких как GBP/USD. В свете скорректиорованной на риск прибыли результаты портфеля смотрятся лучше.средней составной годовой прибыли к максимальной просадки 0.46 – лучше, чем аналогичный показатель для любой из валютных пар по отдельности.
Кривая системы сглажена и направлена вверх для последних пяти лет теста, хотя в течение первых четырех лет прибыль аккумулировалась медленно (рисунок 2).
Рисунок 2. Кривая депозита. После того, как в течение первых четырех лет система очень медленно генерировала прибыль, она развернулась вверх.
Несмотря на то, что наша система в теории должна схватывать тренды, рисунок 3 показывает, что 2008 год – год мощных трендов на рынке, вызванных финансовым кризисом хотя и дал хорошую прибыль, но не такую значительную как в другие годы (10.08%). Большинство систем следования тренду (особенно те, которые основаны на техниках пробоя) дали очень хорошие результаты в 2008 году. В нашем случае очень сильные направленные движения не очень хороши для системы PRI, так как в нее встроен фильтр продолжительности цикла, соответственно требуется время для переключения направления, что часто ведет к значительным убыткам во время очень волатильных периодов. В таких случаях очень часто мы несем большой убыток, прежде чем система переключается в направлении нового тренда. Хотя для пяти лет тестового периода прибыль была отрицательной, убытки были небольшими по сравнению с прибылью, полученной в другие годы. Самый неудачный убыточный год дал нам убыток 13.87%, тогда как самый удачный прибыльный год принес нам 74.35% прибыли. Система PTI может быть очень хорошей дополнительной системой для других систем следования тренду, так как лучшие годы для этой системы (2005-2006) были худшими для многих других систем следования тренду.
Рисунок 3. Использование PTI помогает фильтровать убыточные сделки, однако это приводит к тому, что стратегия медленно реагирует на изменения на рынке, когда сильные тренды формируются быстро. Это и произошло в 2008 году, который был не очень удачным для торговли по нашей системе.
Успешно ли было использование фильтра для сокращения убытков, которые мы несем при торговле по PSaR во время боковых периодов на рынке? На рисунке 4 мы видим, как система вела себя во время бокового периода, когда PSaR постоянно давал сигналы то о восходящем, то о нисходящем тренде. В течение этого периода без фильтра мы открыли бы более 20 позиций, тогда как с фильтром их было всего 4.
Рисунок 4. Успешная фильтрация. В течение этой боковой рыночной фазы, благодаря фильтру, количество сигналов сократилось с 20 до 4.
Во время боковых периодов относительная длина циклов небольшая, что с неизбежностью ведет к сокращению количества открываемых позиций. На рисунке мы видим, что по итогам рассматриваемого периода результат был нейтральным, так как позиции открывались и закрывалась около опорного уровня (около центра диапазона).
Стратегия также неплохо работа при ситуациях, когда боковые фазы формировалась во время длительных, долгосрочных трендов (рисунок 5). Обведенные оранжевыми кругами позиции убыточные, зелеными – прибыльные.
Рисунок 5. Консолидации и тренды. Система приносит прибыль и в трендовых, и в консолидационных фазах.
Хотя в этом случае стратегия дала нам две убыточных сделки, она принесла нам общую прибыль как во время трендовых, так и консолидационных фаз движения, успешно оценивая направление рынка, благодаря фильтру PSaR.
Вывод. Использование индикатора PTI позволило сократить убытки в боковых фазах и улучшить работу системы на основе параболика. При тестировании мы не прибегали к оптимизации, что является многообещающим для робастности системы. В дальнейшем систему можно модифицировать, введя отдельные параметры длины цикла для входов и выходов и отобрав оптимальный портфель валют для работы по системе.
Таблица 1. Итоги тестирования системы. . Параметры теста сверху вниз: Средняя годовая прибыль, Максимальная просадка, Соотношение средней годовой прибыли к максимальной просадке, Соотношение прибыли к риску, % прибыльных сделок, Фактор прибыли, Количество сделок, Ulcer Index, Средний риск на сделку, Спред в пипсах.
Код.
#property copyright "Copyright © 2010, Asirikuy.com, Daniel Fernandez"
#property link "http://www.asirikuy.com/"
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 Aqua
//---- input parameters
extern int ComparisonPeriod=50;
extern double pSAR_Max = 0.2;
extern double pSAR_Accel = 0.02;
extern bool showSeparate = True;
extern bool showTotal = False;
//---- buffers
double TimeBufferUp[];
double TimeBufferDown[];
double TimeBufferTotal[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- 1 additional buffer used for counting.
IndicatorBuffers(3);
//---- indicator line
SetIndexStyle(0,DRAW_LINE, STYLE_SOLID, 3);
SetIndexBuffer(0,TimeBufferUp);
SetIndexStyle(1,DRAW_LINE, STYLE_SOLID, 3);
SetIndexBuffer(1,TimeBufferDown);
SetIndexStyle(2,DRAW_LINE, STYLE_SOLID, 3);
SetIndexBuffer(2,TimeBufferTotal);
//---- name for DataWindow and indicator subwindow label
short_name="TimeTime("+ComparisonPeriod+")";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
//----
SetIndexDrawBegin(0,ComparisonPeriod);
SetIndexDrawBegin(1,ComparisonPeriod);
SetIndexDrawBegin(2,ComparisonPeriod);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Average True Range |
//+------------------------------------------------------------------+
int start()
{
double psar, maxdiff, mindiff , diff;
int i, j;
i = Bars-100;
while ( i >= 0)
{
int uplength = 0;
int downlength = 0;
int maxuplength = 0;
int maxdownlength = 0;
int maxtotallength = 0;
int currentlength = 0;
int k = 0;
while (currentlength == 0)
{
psar = iSAR(NULL,0, pSAR_Accel, pSAR_Max, i+k);
if (psar >= Open[i+k])
{
uplength += 1;
if (downlength > 0)
currentlength = downlength;
}
if (psar < Open[i+k])
{
downlength += 1;
if (uplength > 0)
currentlength = uplength;
}
k++;
}
uplength = 0;
downlength = 0;
for ( j = 0; j < ComparisonPeriod; j++)
{
psar = iSAR(NULL,0, pSAR_Accel, pSAR_Max, i+j);
if (psar >= Open[i+j])
{
uplength += 1;
downlength = 0;
}
if (psar < Open[i+j])
{
uplength = 0;
downlength += 1;
}
if (uplength > maxuplength)
maxuplength = uplength;
if (downlength > maxdownlength)
maxdownlength = downlength;
maxtotallength = MathMax(maxdownlength, maxuplength);
}
psar = iSAR(NULL,0, pSAR_Accel, pSAR_Max, i);
diff = Open[i] - psar;
if ( showSeparate )
{
if ( diff > 0 && maxuplength > 0)
TimeBufferUp[i] = currentlength * 100 / maxdownlength;
else
TimeBufferUp[i] = 0;
if ( diff < 0 && maxdownlength > 0)
TimeBufferDown[i] = currentlength * 100 / maxuplength;
else
TimeBufferDown[i] = 0;
}
if ( showTotal )
TimeBufferTotal[i] = currentlength * 100 / maxtotallength;
if (diff == 0 )
{
if (maxuplength == 0)
TimeBufferUp[i] = 0;
if (maxdownlength == 0)
TimeBufferDown[i] = 0;
}
i--;
}
//----
return(0);
}
//+------------------------------------------------------------------+
© DANIEL FERNANDEZ, CURRENCY TRADER, №9-2011