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

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

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


   Здравствуйте дорогие читатели. Сегодня мы напишем, эксперт по алгоритму, который прислал мне Aleksei Prokofew. Вот цитаты из его писем.


   “Наилучший инструмент для торговли по валютной паре EUR/USD в течение дня – торговая система Oscillator + CCI. Позиции в этой системе открываются при пересечении осциллятором нулевой линии (для 4-часовых и часовых графиков). Сигналом на закрытие позиции служит обратное пересечение осциллятором отметки 100 (длинные позиции) или отметки -100 (короткие позиции).


   Хотел бы увидеть в рассмотрении этот эксперт на страницах журнала…”


   Я спросил, о каком осцилляторе идет речь.


   “Ответ на вопрос:


   RSI, при пересечении средней линии – открытие. Закрытие соответственно значения 70 и 30…”


   Ну что же, попробуем все это формализовать.


   Алгоритм


   Я думаю, имеет смысл написать несколько экспертов. Первый эксперт будет работать только на CCI. Вход в лонг будет осуществлять после пересечения нулевой линии снизу вверх. Выход по пересечению сверху вниз значения 100.


   Вход в шорт будет осуществляться после пересечения нулевой линии сверху вниз. Выход пересечению снизу вверх значения -100.


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


   Во втором эксперте мы добавим RSI. Я думаю открывать и закрывать позиции по пересечению RSI 70 и 30 особого смысла нет, да и из письма не понятно как увязать два индикатора. Поэтому предлагаю RSI сделать фильтром и разрешать входить в рынок от сигналов CCI при “правильных” значениях RSI. Т.е. при входе в лонг RSI должно быть как минимум меньше 50, при входе в шорт как минимум больше 50. Пределы <правильных> значений выложим во внешние переменные.


   Заключение


   Первый эксперт (без фильтра RSI), при тестировании на исторических данных EUR/USD Н4 показал неудовлетворительные результаты. Поэтому для торговли однозначно не пригоден. Второй эксперт на тех же исторических данных показал лучшие результаты, за 3 года +261 пункт, на 15 сделок, 221 пункт максимального дродауна. Правда при более “мягких” значениях уровней RSI количество сделок увеличивается, но результат оказывается не удовлетворительным.


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


   /*[[
   Name := CCI
   Author := forextimes.ru
   Link := www.forextimes.ru  
   Lots := 1.00
   Stop Loss := 100
   Take Profit := 200
   Trailing Stop := 0
   ]]*/
   Defines: per(14);
   var: cnt(0),cci1(0),cci2(0);
   if CurTime-LastTradeTime<8*3600 then exit; // ограничение на количество частоту открытия сделок (для Н4 2 бара)


   cci1=icci(per,1); //значение cci
   cci2=icci(per,2);


   if TotalTrades=0 then {
   If FreeMargin<1000 then Exit;


   if cci2<0 and cci1>0 and cci1<100 then { SetOrder(op_buy,lots,ask,3,bidstoploss*
point,bid+takeprofit*point,blue); exit;};
   if cci2>0 and cci1<0 and cci1>-100 then {
   SetOrder(op_sell,lots,bid,3,ask+stoploss*point,ask-takeprofit*point,red);
   exit;};


   };


   //условия на вход, введены дополнительное условия cci1<100, cci1>-100, для того, что бы условие на открытие не совпало с условием закрытия
  
   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 cci2>100 and cci1<100 then


   if cci2>100 and cci2>cci1 then // условие на закрытие
   {


   CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);
  
   Exit;
   };


   };


   If OrderValue(cnt,VAL_TYPE)=OP_SELL then // открыт шорт
   {


   //if cci2<-100 and cci1>-100 then


   if cci2<-100 and cci2<cci1 then // условие на закрытие
   {
   CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),ask,3,Violet);


   Exit;
   };


   };


   };
   };};


   Второй эксперт, с дополнительным условием RSI.


   /*[[
   Name := CCI2
   Author := forextimes.ru
   Link := www.forextimes.ru
   Lots := 1.00
   Stop Loss := 100
   Take Profit := 200
   Trailing Stop := 0
   ]]*/
   Defines: perCCI(14), perRSI(14),RSIUp(60),RSIDown(40); //периоды CCI, RSI, уровни RSI
   var: cnt(0),cci1(0),cci2(0),rsi1(0);


   if CurTime-LastTradeTime<8*3600 then exit;


   cci1=icci(perCCI,1);
   cci2=icci(perCCI,2);
   rsi1=irsi(perRSI,1);


   if TotalTrades=0 then {
   If FreeMargin<1000 then Exit;


   if cci2<0 and cci1>0 and cci1<100 and rsi1<RSIDown then {
   SetOrder(op_buy,lots,ask,3,bid-stoploss*point,bid+takeprofit*point,blue);
   exit;};
   if cci2>0 and cci1<0 and cci1>-100 and rsi1>RSIUp then {
   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 cci2>100 and cci1<100 then


   //if cci2>100 and cci2>cci1 then
   {


   CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet);
  
   Exit;
   };


   };


   If OrderValue(cnt,VAL_TYPE)=OP_SELL then
   {


   if cci2<-100 and cci1>-100 then


   //if cci2<-100 and cci2<cci1 then
   {


   CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),ask,3,Violet);


   Exit;
   };


   };


   };
   };};


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