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

Рейтинг 2087



РЕКОМЕНДУЮ



Нужен Эксперт – РСИ + КЕЛТНЕР.

Нужен Эксперт – РСИ + КЕЛТНЕР.

KELTNER_F1.mq4 (15 Kb)

Здравствуйте. Нужен такой робот.

1. Условие открытия Бай:
Когда РСИ пробивает уровень 25 снизу вверх с задержкой на свечу, идет сигнал роботу. Он ждёт, когда тренд Келтнера пойдет вверх, то есть, сменит цвет с красного на синий. Когда это происходит, тоже с задержкой на свечу, открывается ордер. На фото – 25.04. в 9:00.

На Селл – то же самое, но наоборот.



2. Ордер закрывается при срабатывании Стопа/Тейка/Трала или в момент открытия противоположного ордера. Именно в этот момент, а не когда РСИ дойдет до другой стороны.

3. Если после пробития РСИ уровня, этот же уровень затем пробивается еще раз, но тренд при этом не меняется, предыдущий сигнал отменяется. То есть, если РСИ пробивал один уровень несколько раз подряд, но тренд изменился только после последнего, то откроется один ордер, а не несколько.

Пример на фото:
29.04. в 19:00 (где стрелочка) РСИ пробивает линию 75, но тренд не меняется. Потом он её еще 5 раз пробивает, но тренд меняется только 03.05. в 18:00. В этот момент предыдущий Бай закрывается и открывается один (а не 5) Селл.

4. Если после открытия ордера, главное условие реализуется еще раз на той же стороне – то новый ордер тоже открывается. Например, РСИ пробил 25 + Кел сменился – Ордер-1 открылся. Потом, еще не получив противоположный сигнал, РСИ опять пробил 25 + Кел сменился – открывает Ордер-2. То есть, при исполнении главного условия, ордер всегда открывается, без ограничений по количеству в одну сторону.

5. Нужен лок на фрейм. Если я запускаю робот на одном фрейме, то он на нем остаётся, даже, если я временно меняю фрейм. После смены фрейма он ничего не делает, пока не вернется нужный. Это возможно реализовать?

6. Мартин, если не сложно.

7. Робот не должен сбиваться и обнуляться при сбоях связи и внесении изменений в настройки на ходу.

Настройки общие:

Фрейм.
Лот.
Мартин.
Стоп.
Тейк.
Трал.

Настройки РСИ:

Шифт РСИ.
Уровень РСИ.
Период РСИ.

Настройки KELTNER:

Шифт Келтнер.
MA_period.
ATR_period.
Length.
  • +1
  • Просмотров: 3110
  • 20 мая 2016, 18:16
  • mikeford
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
0
То что будет все точно как в ТЗ не гарантирую, если устроит после выходных займусь. Будет упрощенный вариант.
avatar

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

  • 20 мая 2016, 21:59
+
0
Хорошо. Главное, чтоб робот открывал-закрывал по условию.
avatar

  9  mikeford Автор Сообщений: 57

  • 21 мая 2016, 18:45
+
0
Пока сырой набросок. Получается при смене цвета советник смотрит было пересечение уровня, если было, тогда вход?




//+------------------------------------------------------------------+
//|                                                         Kelt.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

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double KLot       = 1;        // умножение лота
extern double MaxLot     = 5;        // максимальный лот
extern int StopLoss      = 2000;     // лось
extern int TakeProfit    = 3000;     // язь
extern int Slip          = 30;       // реквот
extern int Shift         = 1;        // на каком баре сигнал индикатора
extern int Magic         = 123;      // магик
extern string IndName    = "KELTNER_F1";
extern int MAPeriod      = 10;        // 
extern int ATRPeriod     = 15;        // 
extern int Length        = 8;         // 

extern int RSIPeriod     = 14;        // 
extern int RSILevel      = 30;        // 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=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==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);
     }

   r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,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()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   double kelt=iCustom(NULL,0,IndName,"current time frame",MAPeriod,0,0,ATRPeriod,0.628,false,Length,8,Shift);
   double rsi=iRSI(NULL,0,RSIPeriod,0,Shift);

   if(kelt>0 && rsi>RSILevel)
     {
      PutOrder(0,Ask);
     }

   if(kelt<0 && rsi<100-RSILevel)
     {
      PutOrder(1,Bid);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClosePos()
  {
   double kelt=iCustom(NULL,0,IndName,"current time frame",MAPeriod,0,0,ATRPeriod,0.628,false,Length,8,Shift);
   double rsi=iRSI(NULL,0,RSIPeriod,0,Shift);
//---
   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)
              {
               if(kelt<0 && rsi<100-RSILevel)
                 {
                  CloseAll(0);
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(kelt>0 && rsi>RSILevel)
                 {
                  CloseAll(1);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;

   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderProfit()<0)
        {
         lot=OrderLots()*KLot;
        }
     }
   if(lot>MaxLot)lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double kelt=iCustom(NULL,0,IndName,"current time frame",MAPeriod,0,0,ATRPeriod,0.628,false,Length,8,Shift);

   if(CountTrades()<1)
     {
      OpenPos();
     }
   else ClosePos();

   Comment("\n kelt: ",kelt);
  }
//+------------------------------------------------------------------+

avatar

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

  • 21 мая 2016, 20:03
+
0
Сейчас все очень близко к ТЗ: www.opentraders.ru/downloads/1184/

avatar

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

  • 22 мая 2016, 08:33
+
0
Спасибо, но он совершенно не по ТЗ работает. Он пропускает большую часть моментов, когда должен закрывать/открывать. Возможно, вы не так поняли ТЗ. Выше вы написали:

«Получается при смене цвета советник смотрит было пересечение уровня, если было, тогда вход?»

Наоборот. Сначала РСИ пробивает уровень – робот получает, по аналогии светофора, желтый сигнал и ждёт смены тренда. Ждёт столько, сколько понадобится, пока не сменится тренд. После смены тренда – зеленый сигнал и тогда закрывает/открывает.

Вот скрин с роботом в действии:



Селл он открыл правильно, но Бай перед ним не открыл (25.04. в 9-00, на первом фото). Потом он должен был закрыть этот Селл и открыть новый Бай в месте, где синяя стрелка. Потому что ранее РСИ пробил уровень (5.05. в 19-00), где крестик, а потом тренд сменился на Бай.
Я так понял дело в параметре «за сколько баров ищем пересечение». Когда я его увеличил, тогда ордер открылся. Но он не нужен. Когда именно ранее РСИ пересек уровень и сколько раз не важно, главное, чтоб он это в принципе сделал. Ордер открывается только после смены тренда.

Возможно, из-за этого Пункт 4 не реализуется. Вот пример:



Бай первый правильно открылся. Но в месте второй стрелки должен был открыться второй Бай, потому что условие «РСИ + смена тренда» выполнилось повторно. Но робот его не открыл.

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

  9  mikeford Автор Сообщений: 57

  • 22 мая 2016, 18:32
+
0
Селл он открыл правильно, но Бай перед ним не открыл (25.04. в 9-00, на первом фото). Потом он должен был закрыть этот Селл и открыть новый Бай в месте, где синяя стрелка. Потому что ранее РСИ пробил уровень (5.05. в 19-00), где крестик, а потом тренд сменился на Бай.


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

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

  • 22 мая 2016, 19:37
+
0
Добавил открытие на смене сигнала и множественное открытие позиций: www.opentraders.ru/downloads/1184/

avatar

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

  • 22 мая 2016, 20:09
+
0
Спасибо, сейчас уже ближе к истине.

Только он открывает новые ордера раньше, чем закрывает текущие. Из-за этого мартин не так работает. То есть, технически он работает правильно, но из-за порядка открытие-закрытие ордеров, он «перескакивает» через раз.

Можете сделать, чтобы сначала по таймингу закрывались все текущие ордера, а уже потом открывался новый.

Это не кипит, я могу подождать месяц. Но, если это не сложно, можете сделать, когда будет время?
avatar

  9  mikeford Автор Сообщений: 57

  • 24 мая 2016, 17:43
+
0
Это не кипит, я могу подождать месяц. Но, если это не сложно, можете сделать, когда будет время?


Все дело в том что мне здесь оплачивается определенный объем работы и он очень минимальный. Тратить на один заказ целый месяц мне не интересно. Покажите на скрине что неправильно и если можно быстро поправить, сделаю.
avatar

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

  • 25 мая 2016, 06:23
+
0
Вот пример:



Мартин включен. Бай закрылся в минусе -18.82, но на мгновение позже по времени, чем открылся следующий Селл (посмотрите очередность внизу в результатах). Поэтому Мартин его пропустил, а увеличил уже следующий после Селла ордер, который не надо было.

Просто надо, чтобы сначала закрывались текущие ордера в порядке их открытия, а уже потом открывался новый, а сейчас происходит наоборот.
avatar

  9  mikeford Автор Сообщений: 57

  • 25 мая 2016, 20:23
+
0
mikeford — а как у вас профит или убыток выводится на графике, что используете?
avatar

  16  cerber04 Сообщений: 409

  • 26 мая 2016, 00:24
+
0
Он не выводится на графике, я для примера вручную текст написал.
avatar

  9  mikeford Автор Сообщений: 57

  • 26 мая 2016, 18:06

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