d9e5a92d

Александр Шулешко - Основные идеи механической торговой системы следования за внутридневным трендом

Основное достоинство механических торговых систем (экспертов, советников) — делать только то, что в них заложил трейдер. Советник (Expert Advisor) лишен таких недостатков, как жадность и страх, кроме того, в случае работы внутри дня, избавляет от необходимости часами сидеть за терминалом, ожидая возможности войти в рынок или закрыть позицию. Только строгое следование той или иной торговой системе, по мнению авторов многих публикаций, посвященных торговле финансовыми активами, позволяет достичь положительного результата — сохранить и увеличить депозит.

В рамках данной статьи я опишу торговую стратегию и приведу практически полностью свой советник Slicer (по крайней мере, все ключевые процедуры), занявший 5-е место в конкурсе BroCo «CyberTrade» в апреле 2009 с результатом +23% к начальному депозиту за месяц.

Наше дело

— торговать не часто, наше дело

— торговать прибыльно

П ервый вопрос, который необходимо решить при разработке эксперта — чем торговать и на каком таймфрей-ме. Свою стратегию я рассчитывал под достаточно консервативную внутридневную торговлю, исходя из соображения «trend is your friend», т.е. торговать только в направлении уже сформировавшегося внутридневного тренда. Почему внутридневная? Долгосрочная торговля требует достаточно большого депозита, способного «пережить» просадки, вызванные новостным фоном. Торговля intraday позволяет работать, имея в своем распоряжении небольшой депозит. Выбор пал на пару GBPUSD, тайм-фрейм — H1.

Следует отметить, что советник не рассчитан на частую торговлю, поскольку длинные внутридневные тренды бывают довольно редко. Как писал в своих статьях В. Боришполец, автор нескольких известных торговых систем, «наше дело — торговать не часто, наше дело — торговать прибыльно».

За основу правил открытия и закрытия позиции я взял торговую систему, предложенную в книге «Computer Analysis of the futures market» авторов Charles LeBeau и David W. Lucas.

В советнике использовались следующие инструменты технического анализа:

• две скользящие средние (быстрая и медленная);

• индикаторы ADX, DI+, DI-;

• параболический SAR.

Принцип входа в рынок: при открытии нового часового бара определять пересечение быстрой и медленной скользящих средних (СС). Если оно произошло на предыдущем баре, то:

— открыть длинную позицию, если быстрая СС пересекла снизу медленную СС, DI+ индикатора ADX больше, чем DI-, сам ADX растет и больше оптимизируемой величины vADX;

— открывать короткую позицию, если быстрая СС пересекла сверху медленную СС, DI+ индикатора ADX меньше чем DI-, сам ADX растет и больше оптимизируемой величины vADX.

В любой момент времени не должно быть больше одной открытой позиции. Приведу соответствующий код на mql4:

extern int sma_opt = 3; // период быстрой скользящей средней

extern int lma_opt = 9; // период медленной скользящей средней

extern int adx_opt = 10; //период расчета ADX

extern int vADX = 30; // минимальное значение ADX для открытия int MagicNumber = 5555;

void CheckForOpen()

{

if (Positions(3,MagicNumber)>0)

return;



double Lots = 1;

double sMA = iMA(Symbol(),PERIOD

8,8-

H1,sma_opt,0,MODE_SMA,PRICE

CLOSE,1);

double sMA_p = iMA(Symbol(),PERIOD H1,sma_opt,0,MODE_SMA,PRICE CLOSE,2);

double lMA = iMA(Symbol(),PERIOD

В любой момент времени не должно быть больше одной открытой позиции

Все просто: если есть тренд (о чем нам свидетельствует ADX>ADXp), и есть сигнал от пересечения СС — входим в рынок

H1,lma_opt,0,MODE_SMA,PRICE_

CLOSE,1);

double lMA_p = iMA(SymbolO,PERIOD_ H1,lma_opt,0,MODE_SMA,PRICE_ CLOSE,2);

double ADX = iADX(Symbol(),PERIOD_ H1,adx_opt,PRICE_CLOSE,MODE_ MAIN,1);

double ADX_p =

iADX(Symbol(),PERIOD_H1,adx_ opt,PRICE_CLOSE,MODE_MAIN,2);

double DIp = iADX(Symbol(),PERIOD_ H1,adx_opt,PRICE_CLOSE,MODE_ PLUSDI,1);

double DIm = iADX(Symbol(),PERIOD_ H1,adx_opt,PRICE_CLOSE,MODE_ MINUSDI,1);

if (sMA > lMA && sMA_p<lMA_p && ADX>vADX && DIp>DIm && ADX>ADX_p)

{

OrderSend(Symbol(),OP_ BUY, Lots, Ask, 0,0,0,»order_ buy»,MagicNumber,0,Green); return;

}

if (sMA > lMA && sMA_p<lMA_p && ADX>vADX && DIp>DIm && ADX>ADX_p)

{

OrderSend(Symbol(),OP_ SELL, Lots, Bid, 0,0,0,»order_ sell»,MagicNumber,0,Red); return;

}

}

Все просто: если есть тренд (о чем нам свидетельствует ADX>ADXp), и есть сигнал от пересечения СС — входим в рынок. В данном примере лот фиксирован — 1.0 (Lots=1), в конкурсе же я использовал лот величиной 10% от депозита. Процедура его расчета достаточно тривиальна, и в рамках данной статьи не приводится.

Функция Positions возвращает количество открытых позиций заданного типа (0 — длинные, 1 — короткие, 3 — длинные + короткие) и необходима для контроля уже открытых позиций, чтобы избежать повторного входа в рынок и, соответственно, снизить риски:

int Positions(int d, int mn) //Возвращает количество открытых { //позиций

int buys=0,sells=0,positions;

//----

for(int i=0;i<OrdersTotal();i++)

{

if(OrderSelect(i,SELECT_BY_ POS,MODE_TRADES)==false) break; if(OrderSymbol0==Symbol())

{

if(OrderMagicNumber() == mn || mn == 0)

{

if(OrderType()==OP_BUY) buys++; if(OrderType()==OP_SELL) sells++;

}

}

}

switch (d)

{

case 0 : positions = buys; break; case 1 : positions = sells; break; case 3 : positions = buys +sells; break;

}

return(positions);

}

На следующем этапе рассмотрим принцип закрытия открытых позиций. Оптимальным решением для работы по тренду Charles LeBeau и David W. Lucas рекомендовали использовать Parabolic SAR. В контексте советника Slicer, данная рекомендация была реализована следующим образом:

— если была открыта длинная позиция, и при формировании нового часового бара SAR > Close[1], то позиция закрывается;

— если была открыта короткая позиция, и при формировании нового часового бара SAR < Close[1], то позиция закрывается.

Ниже приведена реализация этого алгоритма на mql4:

void CheckForClose()

!

double SAR = iSAR(Symbol(),PERIOD_ H1,0.02,0.2,1);

for(int i=0;i<OrdersTotal();i++)

{

if(OrderSelect(i,SELECT_BY_ POS,MODE_TRADES)==false) break; if(OrderSymbol()==Symbol())

{

if(OrderMagicNumber() ==

MagicNumber)

{

if(OrderType()==OP_BUY)

Стоит отметить, что авторы исходной стратегии весьма скептически относятся к оптимизации, считая это «подгонкой под кривую»

{

if (SAR>Close[1]) OrderClose(OrderTic ketO,OrderLotsO,Bid,3,Blue);

}

if(OrderType()==OP_SELL)

{

if (SAR<Close[1]) OrderClose(OrderTic ketO,OrderLots(),Ask,3,Blue);

!

!

!

}

}

Итак, как же работает советник в целом? При каждом новом полученном тике проверяется открытие нового часового бара. Если определен новый час, то первым делом контролируем необходимость закрытия открытых позиций. Далее проверяем условия входа в рынок:

datetime prevtime; int start()

{

if(prevtime == Time[0]) return(0);

prevtime = Time[0];

CheckForClose();

CheckForOpen();

return(0);

}

Вот я и привел практически весь советник, за исключением стандартных процедур init() и deinit(), которые использовались без изменений.

Оптимизация параметров sma_opt, lma_opt, adx_opt и vADX проводилась следующим образом. На выборке данных за весь 2008 год определялось множество параметров, при которых был максимальный баланс, и количество сделок превышало 40. Затем, несколько оптимальных наборов параметров проходили тестирование на данных за 2009 год:

Очевидно, что использование данной стратегии будет приводить и к убыточным сделкам. Однако, даже универсальный набор параметров, рекомендуемый авторами исходной стратегии (sma_ opt=3, lma_opt=9, adx_opt=10, vADX=30) дает хорошие результаты (январь-май 2009 года):

Стоит отметить, что авторы исходной стратегии весьма скептически относятся к оптимизации, считая это «подгонкой под кривую».

Конечно, представленный Вашему вниманию советник предельно прост: его исходный текст занимает менее 3Кб. В качестве его возможных улучшений, вероятно, можно предложить использовать ордера Stop Loss; тот или иной Trailing Stop; попробовать исключить контроль DI+ и DI— (либо пересечение СС). Тем не менее, идея торговли по тренду в очередной раз подтвердила свою доходность и перспективность в контексте разработки на ее базе торговых систем, а конечная реализация той или иной торговой системы (советника) — дело вкуса трейдера.





Содержание раздела