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

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

   Добрый день дорогие читатели! Сегодня мы напишем довольно интересный эксперт. Его алгоритм основан на времени, точнее на торговых сессиях.


   Алгоритм
   Не представившийся читатель прислал мне следующие рисунки, и попросил по ним, на свое усмотрение написать эксперт.


Алгоритм


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


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


   Время входа в часах по GMT, доступна для регулирования (во внешней переменной).


   Т.к. конкретной цели у нас нет, за цель мы получим банальный трейлингстопом. Т.к. будем просто поджимать стоплосс под уже достигнутый профит.


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


   Заключение
   При тестировании на истории картина получается довольно неплохая. Но есть несколько но. Во-первых 40 сделок на 1 год и 3 месяца, конечно же маловато тем более, что фильтров никаких мы не применяли. И во-вторых за эти год и 3 месяца истории мы имеем сильный восходящий тренд, поэтому целесообразней учитывать только короткие позиции.


   /*[[
   Name := Sessiy
   Author := forextimes.ru
   Link := www.Fxtest.ru
   Lots := 1.00
   Stop Loss := 0
   Take Profit := 1000
   Trailing Stop := 30
   ]]*/


   Define: USAhour(13); //время за которое мы принимаем начало американской сессии, т.е начинаем торговать
   var:cnt(0),i(0),MaxH(0),MinL(0),op(0),MaxHi(0),MinLi(0);


   if hour=USAhour and TotalTrades=0 then { //если время американской сессии наступило и открытых позиций нет но начинаем.


   op=o[USAhour]; //так определяем цену открытия дня, т.е цену открытия в 0 по GMT
   MaxH=h[1]; //изначально за максимальную цену дня принимаем максимальную цену прошлого бара
   MinL=l[1]; //изначально за минимальную цену дня принимаем минимальную цену прошлого бара


   for i=USAhour DownTo 1 { //в цикле производим поиск реальных минимальных и максимальных цен периода
   if h[i]>MaxH then {MaxH=h[i]; MaxHi=i;}; // в переменную MaxH кладем максимальную цену, в MaxHi ее индекс
   if l[i]<MinL then {MinL=l[i]; MinLi=i;}; // в переменную MinL кладем минимальную цену, в MinLi ее индекс


   };


   if op>MinL and MinLi<(USAhour-1) and MinLi>(USAhour-6) and hour<19 and bid<MinL then
   {SetOrder(op_sell,lots,bid,3,MaxH+5*point,ask-takeprofit*point,red); exit;};


   if op<MaxH and MaxH<(USAhour-1) and MaxHi>(USAhour-6) and hour<19 and ask>MaxH then
   {SetOrder(op_buy,lots,ask,3,MinL,bid+takeprofit*point,blue); exit;};


   // выше производим проверку условий на вход, о условиях мы подробней говорили выше


   };


   for cnt=1 to TotalTrades
   begin
   /* это длинная позиция? */
   If Ord(cnt,VAL_TYPE)=OP_BUY then /* длинная позиция */
   {
   /* есть ли профит у этой сделки больше чем уровень трейлинг стопа? Проверяем Bid, так как позиция BUY */
   If (Bid-Ord(cnt,VAL_OPENPRICE))>(TrailingStop*Point) then
   {
   /*позиция имеет прибыль больше чем значение трейлинг стопа, можно ли поставить стоп лучше чем он был ранее? */
   If Ord(cnt,VAL_STOPLOSS)<(Bid-TrailingStop*Point) then
   {
   /* меняем стоплосс на уровень Bid-Trailing Stop */
   ModifyOrder(Ord(cnt,VAL_TICKET),Ord(cnt,VAL_OPENPRICE),
   Bid-TrailingStop*Point,Ord(cnt,VAL_TAKEPROFIT),Red);
   Exit;
   };
   };
   };
   /* это короткая позиция? */
   If Ord(cnt,VAL_TYPE)=OP_SELL then
   {
   /* есть ли профит у этой сделки больше чем уровень трейлинг стопа? Проверяем Ask, так как позиция SELL */
   If (Ord(cnt,VAL_OPENPRICE)-Ask)>(TrailingStop*Point) then
   {
   /* позиция имеет прибыль больше чем значение трейлинг стопа, можно ли поставить стоп лучше чем он был ранее? */
   If Ord(cnt,VAL_STOPLOSS)>(Ask+TrailingStop*Point) or Ord(cnt,VAL_STOPLOSS)=0 then
   {
   /* меняем стоплосс на уровень Ask+Trailing Stop */
   ModifyOrder(Ord(cnt,VAL_TICKET),Ord(cnt,VAL_OPENPRICE),
   Ask+TrailingStop*Point,Ord(cnt,VAL_TAKEPROFIT),Red);
   Exit;
   };
   };
   };
   end;


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