Andrju81
Андрей

 
Уровень 18

  Торгую в компаниях:


Группа "Стол заказов MQL"

Рейтинг 2088



РЕКОМЕНДУЮ



Написать советник по индикатору Forex Goiler...

Здравствуйте, Андрей!

Просьба написать советник для МТ4 по индикатору Forex Goiler с фильтром на направление сделок.

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

Каждый день, в 00.00 по серверному времени Метатрейдера, Гойлер дает сигнал на покупку или продажу, а также точки взятия прибыли и установки стоп-лоссов. Выглядит это так:


Стратегия

На открытии новой дневной свечи получаем точку входа (Entry_1 — белая линия). Если салатовая линия выше белой, значит сигнал на покупку, если ниже — на продажу. В качестве фильтра будем использовать MACD_color со стандартными параметрами. Если гистограмма MACD_color за прошлый день зеленая, значит только покупки, если красная — только продажи.
Открываем позицию на белой линии (Entry_1), ставим стоп-лосс на уровне красной линии (SL), тейк-профит на уровне салатовой линии (TP1). Сразу устанавливаем отложенный ордер на уровне оранжевой линии (Entry_2) в том же направлении, что и предыдущий (к примеру у нас была покупка, то откроем Buy Limit) с установленными тейк-профит на уровне цены открытия первого ордера и стоп-лосс на уровне красной линии (SL).
Если цена идет в сторону нашей позиции и срабатывает тейк-профит, удаляем отложенный ордер и ждем нового сигнала.
Если цена двигается против нашей позиции и срабатывает отложенный ордер, то переносим тейк-профит первого ордера на уровень цены его открытия, т.е. в ноль. Стоп-лосс обоих ордеров по-прежнему расположен на уровне красной линии (SL). Уровень TP2 использовать в советнике не будем.
Если открытый ордер не закрывается до начала следующего дня и не сработал отложенный ордер, то при поступлении сигнала в туже сторону корректируем тейк-профит и стоп-лосс согласно новым данным, модифицируем отложенный ордер (цена открытия, SL). Если открыты два ордера, то изменяем только стоп-лосс.
Если открытый ордер не закрывается до начала следующего дня и не сработал отложенный ордер, и поступил обратный сигнал — удаляем отложенный ордер и открываем новые позиции по направлению сигнала. Если были открыты оба ордера, то ничего не меняем, просто открываем новые позиции по направлению сигнала. Или можно закрыть открытые ордера или ордер при поступлении обратного сигнала.

Мани-менеджмент

Для определения рабочего лота можно использовать три варианта:
1) От величины стоп-лосса, т.е. сколько процентов от баланса мы готовы потерять в одной сделке, если она закроется по стоп-лоссу. (по-умолчанию)
2) Прогрессивный лот. Описание в топике.
3) Процент от баланса.

Входные параметры советника должны быть следующие:

1) Возможность запретить советнику торговать в Понедельник и Пятницу (по отдельности).
2) Мани-менеджмент
3) Идентификатор ордера (советника), по простому — Magic.
4) Перевод ордера в безубыток. (вкл/выкл)
5) Возможность выбора при поступлении обратного сигнала — закрывать открытые сделки или оставлять.

Собственно и сами индикаторы - Goiler.rar (135 Kb)
  • 0
  • Просмотров: 3352
  • 26 января 2016, 00:40
  • Andrju81
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
5 в 1
Следующая запись в группе  
Виртуальный трал
24 января 2016
26 января 2016

Комментарии (14)

+
0
Возьмусь только если будет свободное время.
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 26 января 2016, 06:17
+
0
O.K. *friends* 
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 26 января 2016, 12:16
+
0
но визуально на истории индикатор показывает довольно не плохие результаты


На истории такие индикаторы показывают хорошие результаты, потому что они подстраиваются по историю.
avatar

  14  beton2011 Сообщений: 895

  • 26 января 2016, 06:57
+
0
Другие может и подстраиваются (перерисовываются), но этот индикатор берет для расчетов только цену открытия дневной свечи, белая линия (Entry_1) всегда находится на уровне открытия дня.
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 26 января 2016, 12:54
+
0
Андрей, небольшая поправка к стратегии:
Если открытый ордер не закрывается до начала следующего дня и не сработал отложенный ордер, то при поступлении сигнала в туже сторону корректируем только тейк-профит согласно новым данным если он не ниже цены открытия самого ордера, если ниже, то просто переводим ордер в безубыток, модифицируем отложенный ордер (цена открытия, SL) по новым данным. Если открыты два ордера, то ничего не меняем или перемещаем тейк-профит обоих ордеров в безубыток плюс несколько пунктов.
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 26 января 2016, 16:03
+
0
Андрей, может посмотрите мой заказ?!.. Не хотелось бы разводить дубликаты топика, так как этот не попадает под условия заказа, а именно более одного заказа в январе месяце.
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 1 февраля 2016, 17:26
+
0
Андрей, может посмотрите мой заказ?!.. Не хотелось бы разводить дубликаты топика, так как этот не попадает под условия заказа, а именно более одного заказа в январе месяце.


Я сейчас смотрю. А почему сами не пишете, у вас ведь нормально получается?
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 1 февраля 2016, 19:08
+
0
В том то и дело, что недостаточно опыта.
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 1 февраля 2016, 19:50
+
0
Если восстановите из декомпила алгоритм расчета уровней, тогда я продолжу :D 

Вот я немного начал:


      ld_0 = ld_100 / li_188;                                                 //iOpen(Symbol(), PERIOD_D1, 0);
      ld_8 = (ld_196 - ld_164 / 2.0) * (ld_196 - ld_164 / 2.0) / li_188;      //(MathSqrt(iOpen(Symbol(), PERIOD_D1, 0))-...
      ld_16 = (ld_196 + ld_164 / 2.0) * (ld_196 + ld_164 / 2.0) / li_188;
      ld_24 = (ld_196 + ld_164) * (ld_196 + ld_164) / li_188;
      ld_32 = (ld_196 - ld_164) * (ld_196 - ld_164) / li_188;
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 1 февраля 2016, 19:34
+
0
Как-то так:

   int li_188 = 100; //JPY
   int digs  = Digits;
   if (StringFind(Symbol(), "JPY", 0) == -1) li_188 = 10000; //кроме пар с JPY

double OpenPrice = iOpen(Symbol(),PERIOD_D1,0) * li_188;
   // алгоритм расчета уровней
   double Mod=(180* MathSqrt(OpenPrice) - 225.0)/360;
   double dir=(((180* MathSqrt(OpenPrice) - 225.0)/360)-Mod)*360;
   string strdir = "Unknown: " + dir;
   if (dir >= 0.0 && dir <= 90.0 || dir >= 180.0 && dir <= 270.0) strdir="Long";
   if (dir > 90.0 && dir < 180.0 || dir > 270.0 && dir <= 360.0) strdir="Short";

   double ld_124 = 0, ld_132 = 0, ld_148 = 0, ld_156 = 0, ld_164 = 0;
   // Ширина сетки
   if (dir >= 90.0) {
      ld_124 = NormalizeDouble(dir / 90.0, 0);
      ld_148 = dir / ld_124;
      ld_164 = ld_148 / 180.0;
   } else {
      ld_132 = NormalizeDouble(90 / dir, 0);
      ld_156 = dir * ld_132;
      ld_164 = ld_156 / 180.0;
   }
   
   double Entry_1;
   double Entry_2;
   double TP1;
   double TP2;
   double SL;
   double ld_196 = MathSqrt(OpenPrice);
   
   if (strdir=="Long")
   {
      Entry_1 = NormalizeDouble(OpenPrice / li_188,digs); //White
      Entry_2 = NormalizeDouble((ld_196 - ld_164 / 2.0) * (ld_196 - ld_164 / 2.0) / li_188,digs); //Orange
      TP1 = NormalizeDouble((ld_196 + ld_164 / 2.0) * (ld_196 + ld_164 / 2.0) / li_188,digs); //Lime
      TP2 = NormalizeDouble((ld_196 + ld_164) * (ld_196 + ld_164) / li_188,digs); //Green
      SL = NormalizeDouble((ld_196 - ld_164) * (ld_196 - ld_164) / li_188,digs); //Red
   }
   
   if (strdir=="Short")
   {
      Entry_1 = NormalizeDouble(OpenPrice / li_188,digs); //White
      Entry_2 = NormalizeDouble((ld_196 + ld_164 / 2.0) * (ld_196 + ld_164 / 2.0) / li_188,digs); //Orange
      TP1 = NormalizeDouble((ld_196 - ld_164 / 2.0) * (ld_196 - ld_164 / 2.0) / li_188,digs); //Lime
      TP2 = NormalizeDouble((ld_196 - ld_164) * (ld_196 - ld_164) / li_188,digs); //Green
      SL = NormalizeDouble((ld_196 + ld_164) * (ld_196 + ld_164) / li_188,digs); //Red
   }
    

<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; 
Редактирован: 1 февраля 2016, 21:10
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 1 февраля 2016, 20:49
+
0
а если по человечески без лд? :)  я люблю все упрощать. если грубо то от открытия дня ставим на расстоянии 500 и 1000 туда сюда линии. и вы думаете что из этого выйдет что то путное?
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 1 февраля 2016, 21:58
+
0
Этот индикатор основан на принципах анализа по Ганну. Это не грааль, но сигналы весьма и весьма точны. Я так понимаю и формулы для расчета уровней взяты по такому принципу. Использовать данный индикатор как торговую стратегию без фильтрации сигналов конечно неразумно, но я писал выше, что визуально в тестере с фильтром MACD, получаются довольно не плохие результаты на паре EURUSD, собственно именно для этой пары его и писали.
avatar

  18  Andrju81 Автор Сообщений: 245 - Андрей

  • 1 февраля 2016, 23:05
+
0
Я сейчас попробую набросать максимально упрощенный вариант.
avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 2 февраля 2016, 08:42
+
0
В том то и дело, что недостаточно опыта.


Конечно, нагородили в ТЗ такую тучу условий и модификаций!

В максимально упрощенном варианте есть:

1. Установка рыночного и лимитного ордера по условию.
2. Установка стопа ордеров на один уровень.
3. Удаление отлоги при тейке первого ордера.
4. Мод первого ордера при срабатывании отлоги.


//+------------------------------------------------------------------+
//|                                                       Goiler.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

extern double Lots         = 0.1;
extern int    StopLoss     = 0;
extern int    TakeProfit   = 0;
extern int    Expiration   = 20;
extern int    Step         = 500;
extern int    Slip         = 30;
extern int    Magic        = 111;

datetime t=0;
double OpenPrice=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;
   datetime ex=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)   sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
      if(type==1 && StopLoss>0) sl=NormalizeDouble(price+StopLoss*2*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)   sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
      if(type==0 && StopLoss>0) sl=NormalizeDouble(price-StopLoss*2*Point,Digits);
     }

   if(type==2 || type==3) ex=TimeCurrent()+Expiration*3600;

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,ex,clr);
   return;
  }
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==2 || OrderType()==3) del=OrderDelete(OrderTicket());
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Mode()
  {
   bool m;

   if(OrderSelect(OrdersTotal()-2,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY)
           {
            if(OrderTakeProfit()!=OrderOpenPrice()) m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderOpenPrice(),0,Yellow);
            return;
           }

         if(OrderType()==OP_SELL)
           {
            if(OrderTakeProfit()!=OrderOpenPrice()) m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderOpenPrice(),0,Yellow);
            return;
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<1 && t!=Time[0])
     {
      //--- sell
      if(Close[1]<Open[1])
        {
         OpenPrice=Bid;
         PutOrder(1,Bid);
         if(CountOrders(3)<1) PutOrder(3,Bid+Step*Point);
        }

      //--- buy 
      if(Close[1]>Open[1])
        {
         OpenPrice=Ask;
         PutOrder(0,Ask);
         if(CountOrders(2)<1) PutOrder(2,Ask-Step*Point);
        }
      t=Time[0];
     }

// сработал тейк удаляем отлогу
   if(Bid>OpenPrice+TakeProfit*Point || Ask<OpenPrice-TakeProfit*Point) DelOrder();
   
// мод стопа первого ордера
   if(CountTrades()>1) Mode();

   Comment("\n");
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15882 - Андрей

  • 2 февраля 2016, 10:03

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари