Учимся писать эксперты для MetaTrader. Урок №15 Учимся писать эксперты для MetaTrader. Урок №15
|

Учимся писать эксперты для MetaTrader. Урок №15

Обучение MQL II. Урок 15


   Здравствуйте дорогие читатели. Сегодня мы проверим действенность одной классической торговой системы. Те кто читал классические книги по ТА, думаю, знают такое правило. В тренде нужно торговать по направлению трендовых индикаторов (например, скользящих средних), а во флете с помощь осцилляторов.


   15.1 Алгоритм
  
   На самом деле только определение тренда уже более чем серьезный вопрос. Тренд будем определять с помощь индикатора ADX, я думаю Вы не будете против, т.к. это именно трендследящий индикатор. Если ADX растет, и стал самым большим за последние N значений, то позиция будет открываться в направлении скользящей средней. Если тренда нет, т.е. ADX имеет низкие значения, то смотрим на значение осциллятора. Если осциллятор в экстремальной зоне, то открываем соответствующую позицию (на отскок от зоны). В качестве осциллятора будем использовать индикатор Stochastic, потом его можно будет заменить или добавить еще один.


   Закрытие позиции будет осуществляться как по стоп ордерам, так и по условию. Условие это, исчезновение тренда, для позиций открытых в тренде и достижение противоположной экстремальной зоны Stochastic, для позиций открытых во флете. Во внешние переменные мы выложим периоды ADX, Stochastic и средней; зоны Stochastic для открытия позиции.


   15.2 Эксперт
  
   /*[[
   Name := Trend-flet
   Link := fxtest.ru
   Lots := 1.00
   Stop Loss := 0
   Take Profit := 0
   Trailing Stop := 0
   ]]*/


   defines: PerMA(21), PerADX(14), StochK(5), StochD(3), Stochslow(3), UpZone(75), DownZone(25),
WindowADX(35), ADXmax(20), ADXmin(15), MApips(4);
   var: Stoch1(0),Stoch2(0),ADX1(0),ADX2(0),Ma1(0),Ma3(0),cnt(0),f(0),tr(0);


   /*
   PerMA-период МА
   PerADX-период ADX
   StochK,StochD,Stochslow-периоды стохастика
   UpZone(75),DownZone(25)-экстремальные зоны стохастика
   WindowADX(35)-окно сравнения ADX
   ADXmax-значение ADX от которого считается, что это тренд
   ADXmin- знгачение ADX от которого считается что это флет
   MApips- наклон МА
   */
   if curtime-LastTradeTime<5*3600 then exit; // ограничение по времени
   Ma1=ima(PerMa,mode_sma,1); //МА
   Ma3=ima(PerMa,mode_sma,3);


   Stoch1=iSTO(StochK,StochD,Stochslow,MODE_SMA,MODE_MAIN,1);// Стохастик
   Stoch2=iSTO(StochK,StochD,Stochslow,MODE_SMA,MODE_MAIN,2);


   ADX1=iADX(PerADX,MODE_MAIN,1); //ADX
   ADX2=iADX(PerADX,MODE_MAIN,2);


   if TotalTrades=0 then tr=0; //tr определяет тренд, если она равна 1 то сделка открыта как трендовая 2 флетовая, 0-сделки нет


   if TotalTrades<1 then {
   f=0; //флаг ADX


   for cnt=1 to WindowADX { if ADX1<iADX(PerADX,MODE_MAIN,cnt) then f=1;};// определение пробоя ADX вверх
   // WindowADX- определяет окно пробоя


   if f=0 and ADX1>ADXmax then { //если ADX больше


   if ma1-ma3>MApips*point then { tr=1; SetOrder(op_buy, lots, ask, 3, bid-stoploss*point, bid+takeprofit*point, green); exit;};
   if ma1-ma3<-MApips*point then{tr=1; SetOrder(op_sell, lots, bid, 3, ask+stoploss*point, ask-takeprofit*point, red); exit;};
   // трендовые сделки
   };


   if ADX1<ADXmin then {


   if Stoch1<DownZone and Stoch1>Stoch2 then {tr=2; SetOrder(op_buy, lots, ask, 3, bidstoploss*point, bid+takeprofit*point, green); exit;};
   if Stoch1>UpZone and Stoch1>Stoch2 then {tr=2; SetOrder(op_sell, lots, bid, 3, ask+stoploss*point, ask-takeprofit*point, red);
exit;};


   //флетовые сделки


   };
   };
  
   if TotalTrades>0 then
   {
   for cnt=1 to TotalTrades
   {
   if OrderValue(cnt,VAL_TYPE)<=OP_SELL and OrderValue(cnt,VAL_SYMBOL)=Symbol then
   {
   If OrderValue(cnt,VAL_TYPE)=OP_BUY then
   {
   if (adx1<adx2 and tr=1) or (tr=2 and Stoch1>UpZone) then
   //условия на закрытие трендовой и флетовой лонговой сделки
   {
   CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);


   Exit;
   };


   };


   If OrderValue(cnt,VAL_TYPE)=OP_SELL then
   {


   if (adx1<adx2 and tr=1) or (tr=2 and Stoch1<DownZone) then
   {
   CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),ask,3,Violet);
   //условия на закрытие трендовой и флетовой шортовой сделки
   Exit;
   };


   };


   };
   };};


   15.3 Заключение


   Возможно, многие скажут, что алгоритм не очень универсален и то, что он однозначно убыточен, но этот эксперт и не претендует на роль рабочего эксперта. С методической стороны, эксперт не такой уж и простой и я уверен, что читатели, желающие в совершенстве изучить язык, обязательно в нем что-то подчеркнут.


   Как обычно буду ждать Ваших писем, если вопросов будет много или будут особенно интересные, отвечу на них в следующем выпуске.


Компания <Fxtest>
Халхальян Артур
техническая поддержка трейдеров
artur@fxtest.ru