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

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

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


   Здравствуйте дорогие читатели. О пересечения средних, говорилось уже очень много, разработан индикатор, работающий на этом принципе (MACD). Но все же хоть эксперт и прост, он мне показался довольно интересным. При некоторых параметрах доходность довольно высокая. И помимо всего он реверсивного типа, открытие новой позиции, это и закрытие прошлой (противоположно направленной). Не буду забегать вперед. Итак, все по прядку.


   15.1. Алгоритм
   Эксперт определяет точку входа с помощью двух скользящих средних, пусть будут ЕМА, разных периодов усреднения. Быстрая средняя и медленная (т.е. быстрая с меньшим периодом, медленная соответственно с большим). В тренде такая система будет торговать достаточно здорово, но вот во флэте все может быть довольно печально. Для улучшения этого момента в эксперт вводится дополнительное условие, мало того что должно произойти пересечение, но еще и после него МА должны разойтись на N пунктов (эта величина, как и периоды средних, будет во внешней переменной). Т.е. серия не глубоких пересечений, вверх вниз, вверх вниз во флэте будут просто игнорироваться. Другими словами пересечение должно иметь “запас”. Эксперт находится все время в рынке. Как только происходит пересечение, МА поменяют свое взаимное положение, происходит закрытие текущей и открытие противоположной позиции. Стопы специально выставляются недостижимыми для того, что бы открытие новой позиции происходило только по факту пересечения, после тестирования и выбора нужных параметров можно расставить и нормальные стопы. Вход осуществляется по открытию следующего бара.


   Заключение
   В данном эксперте параметры играют важную роль. Параметры которые стоят сейчас по умолчанию очень не плохо показывают себя на часовом фунте. Довольно интересны параметры, евра, М5 fast 2 slow 4 Npips 10. Конечно, эти параметры могут быть переподогнанными, будет интересно, если что-нибудь из читателей проверит эту систему на более длинной истории (может по частям).


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


   /*[[
   Name := 2MA
   Author := Fxtest.ru
   Link := forextimes.ru
   Lots := 1.00
   Stop Loss := 5000
   Take Profit := 5000
   Trailing Stop := 0
   ]]*/


   defines: fast(6),slow(9),Npips(7); // внешние переменные, периоды МА и
   // Npips-количество пунктов запаса
   var: cnt(0),fb(0),fs(0),fup(0),fdown(0),fast2(0),fast1(0),slow2(0),slow1(0);


   if CurTime-LastTradeTime<10 then exit; // на самом деле, закрыть старую позицию
   // и сразу открыть новую мы не может из-за ограничений на таймаут, поэтому
   // мы выдерживаем его


   If FreeMargin<1000 then Exit; // выход при нехватке свободной маржи
   if fb=1 then { fb=0; SetOrder(op_buy, lots, ask, 3, bid-stoploss*point, bid+takeprofit*point, green); exit;};
   if fs=1 then { fs=0; SetOrder(op_sell,lots,bid,3,ask+stoploss*point,ask-takeprofit*point,red); exit;};



   // fb и fs флаги, они нужны что бы выдержать таймаут и открыть соответствующие позиции


   fast2=iMA(FAST,MODE_EMA,2) ; // позапрошлое значение быстрой средней
   fast1=iMA(FAST,MODE_EMA,1); // прошлое значение быстрой средней
   slow2=iMA(SLOW,MODE_EMA,2); // позапрошлое значение медленной средней
   slow1=iMA(SLOW,MODE_EMA,1); // прошлое значение медленной средней
  
   if TotalTrades<1 then { // если нет окрытых позиций то…


   if fup=1 and (fast1-slow1)>Npips*point then
   { fup=0; SetOrder(op_buy,lots,ask,3,bid-stoploss*point,bid+takeprofit*point,green);
exit;}; // открытие самой первой позиции если она длинная
   if fdown=1 and (slow1-fast1)>Npips*point then
   { fdown=0; SetOrder(op_sell,lots,bid,3,ask+stoploss*point,ask-takeprofit*point,red);
exit;}; // открытие самой первой позиции если она короткая


   If fast2<slow2 and fast1>slow1 then { fup=1; fdown=0; exit;};
   if fast2>slow2 and fast1<slow1 then { fdown=1; fup=0; exit;};
  
   };


   if TotalTrades>0 then // после открытия первой позиции далее эксперт будет все время искать возможность “переворота”
   {
   for cnt=1 to TotalTrades
   {
   if OrderValue(cnt,VAL_TYPE)<=OP_SELL and // buy или sell
   OrderValue(cnt,VAL_SYMBOL)=Symbol then // инструмент совпадает
   {
   If OrderValue(cnt,VAL_TYPE)=OP_BUY then // если buy…
   {
   if (slow1-fast1)>Npips*point then // условие переворота
   {
   CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),Bid,3,Violet); //закртыие
fs=1; // флаг на открытие противоположной позиции
   Exit;
   };


   };


   If OrderValue(cnt,VAL_TYPE)=OP_SELL then // если sell
   {


   if (fast1-slow1)>Npips*point then // условие переворота
   {
   CloseOrder(OrderValue(cnt,VAL_TICKET),OrderValue(cnt,VAL_LOTS),ask,3,Violet); //закртыие
fb=1; // флаг на открытие противоположной позиции
   Exit;
   };


   };
   };
   };};


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