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