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

Рейтинг 2086



РЕКОМЕНДУЮ



РОБОТ – ПРОБОЙНИК УТРЕННЕГО ФЛЕТА "MorningFlet".

Здравствуйте. Нужен робот по индикатору «MorningFlet_V3»:

MorningFlat_V3.mq4 (7 Kb)

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

i-anyrange.mq4 (3 Kb)
FLET-DT_V11.mq4 (19 Kb)

Суть:
Робот ставит стоповые ордера снаружи канала с ТП и СЛ на таргетах.

Алгоритм:

1. Ордера ставятся на расстоянии от канала (Otstup в аналоге).

2. По умолчанию, Тейки ставит на таргет-линиях (синяя и желтая), а Стопы – на противоположных линиях канала. По умолчанию – это если в настройках 0. То есть, если ТП и СЛ = 0, то это не реально их нет, а они ставятся на линиях. Или можно тру/фалс. Если указываю конкретную цифру – то это будет расстояние от ордера. Трал не обязательно.

3. Учитываем спред в дельте. Если Дельта 30, а спред 20, то Бай Стоп идёт на 50п от канала. Насчёт таргетов Тейков и Стопов я не знаю, насколько спред там имеет значение. Если не сложно – сделайте опцию «учитывать спред в таргетах/стопах». Но спред дельты всегда считается.

4. Время удаления ордеров – 23:50. Неактивированный ордер удаляется всегда, а рыночный – тру/фалс.

5. Если указано неудаление активного ордера, и он не закрылся до следующего дня – он остаётся висеть пока не закроется. Но робот всё равно ставит новые на следующий день. (Аналог этого не делает).

6. Мин и Макс дельты канала. Если канал меньше 200п и больше 400п – ордера не ставятся.

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

Настройки:

Лот.
Мартин.
StartHour = 0.
StartMinute = 30.
EndHour = 9.
EndMinute = 30.
Таргет левел.
Дельта Ордеров от канала.
Тейк / Стоп.
Время удаления ордера – 23:50.
Удаление рыночного ордера – да/нет.
Мин. канал открытия – 200.
Макс. канал открытия – 400.
  • 0
  • Просмотров: 3098
  • 3 мая 2017, 21:21
  • mikeford
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
0
Править чужой код я не возьмусь, с нуля могу посмотреть, но не раньше следующей недели.
avatar

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

  • 3 мая 2017, 21:25
+
0
Править не надо, мне лучше новый. Я просто для ознакомления прикрепил.
avatar

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

  • 3 мая 2017, 21:30
+
0
Из буферов индикатора монинг флет значения линий не вытащишь. Могу сделать расчет в самом советнике и таргет по формуле какую укажете.
avatar

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

  • 8 мая 2017, 08:37
+
0
Более 4-х часов ушло на то чтобы перенести расчеты в советник и написать торговлю от границ канала. Далее в новом топике или к платному.




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

//--- Inputs
extern double Lots        = 0.1;      // лот
extern double KLot        = 2;        // умножение лота
extern double MaxLot      = 5;        // максимальный лот

extern double TargetLevel = 200;      // таргет уровень

extern int StopLoss       = 300;      // лось
extern int TakeProfit     = 600;      // язь
extern int Delta          = 50;       // расстояние от границы канала

extern int StartHour      = 10;       // час начала торговли
extern int StartMin       = 30;       // минута начала торговли
extern int EndHour        = 22;       // час окончания торговли
extern int EndMin         = 30;       // минута окончания торговли

extern int StartH         = 0;        // час начала канала
extern int StartM         = 30;       // минута начала канала
extern int EndH           = 9;        // час окончания канала
extern int EndM           = 30;       // минута окончания канала

extern int Slip           = 30;       // реквот
extern int Magic          = 123;      // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.04.2009                                                     |
//|  Описание : Возвращает флаг разрешения торговли по времени.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    hb - часы времени начала торговли                                       |
//|    mb - минуты времени начала торговли                                     |
//|    he - часы времени окончания торговли                                    |
//|    me - минуты времени окончания торговли                                  |
//+----------------------------------------------------------------------------+
bool isTradeTimeInt(int hb=0,int mb=0,int he=0,int me=0)
  {
   datetime db, de;           // Время начала и окончания работы
   int      hc;               // Часы текущего времени торгового сервера

   db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)hb+":"+(string)mb);
   de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+(string)he+":"+(string)me);
   hc=TimeHour(TimeCurrent());

   if(db>=de)
     {
      if(hc>=he) de+=24*60*60; else db-=24*60*60;
     }

   if(TimeCurrent()>=db && TimeCurrent()<=de) return(True);
   else return(False);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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()
  {
   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()==OP_BUY)
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==OP_SELL)
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int type=-1)
  {
   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 || (OrderType()>=0 && type==-1)) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutTrendLine(string name,datetime time1,double price1,datetime time2,double price2,color clr)
  {
   ObjectDelete(0,name);
   ObjectCreate(0,name,OBJ_TREND,0,time1,price1,time2,price2);
//--- установим цвет линии 
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии 
   ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
//--- установим толщину линии 
   ObjectSetInteger(0,name,OBJPROP_WIDTH,2);
//--- включим (true) или отключим (false) режим продолжения отображения линии вправо 
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,false);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int StartBar=iBarShift(NULL,0,StringToTime((string)StartH+":00"+(string)StartM+":00"));
   int EndBar=iBarShift(NULL,0,StringToTime((string)EndH+":00"+(string)EndM+":00"));

   double up = High[iHighest(NULL,0,MODE_HIGH,StartBar-EndBar,EndBar)];
   double dn = Low[iLowest(NULL,0,MODE_LOW,StartBar-EndBar,EndBar)];

   double TargetUP=(up-dn)*(TargetLevel-100)/100+up;         // Верхняя цель
   double TargetDN=dn-(up-dn)*(TargetLevel-100)/100;         // Нижняя цель

   PutTrendLine("UP",Time[StartBar],up,Time[EndBar],up,Red);
   PutTrendLine("DN",Time[StartBar],dn,Time[EndBar],dn,Blue);

   PutTrendLine("tUP",Time[1],TargetUP,Time[EndBar],TargetUP,Yellow);
   PutTrendLine("tDN",Time[1],TargetDN,Time[EndBar],TargetDN,Green);

   if(CountTrades()<1 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin))
     {
      if(CountOrders(4)<1 && Bid<up) PutOrder(4,up+Delta*Point);
      if(CountOrders(5)<1 && Bid>dn) PutOrder(5,dn-Delta*Point);
     }

   Comment("\n up: ",up,
           "\n dn: ",dn,
           "\n start: ",StartBar,
           "\n end: ",EndBar);
  }
//+------------------------------------------------------------------+


Редактирован: 8 мая 2017, 12:19
avatar

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

  • 8 мая 2017, 10:31
+
0
Не думал, что он такой сложный.
Только эта версия работает совершенно не по нужному алгоритму.

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

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

3. Стопы и тейки не ставятся на линиях, а это очень важно.

4. Нет Мин и Макс дельт канала, они тоже нужны.

5. Мартин странно работает. Увеличивает объем не на следующий, а в текущий день и заменяет ордер.

Спасибо конечно, но по этому варианту торговать невозможно.

А вы пробовали взять уровни с индюка «I–arnage»? Тот робот, что я прикрепил работает по нему, значит, по ходу с него их можно вытянуть. Я могу перезалить, если что.

А таргет условие можно дописать отдельно, оно очень простое. Таргет линии – это процент от ширины канала. В МорнингФлет 200 означает 100% Бай + 100% Селл. Но можно просто сделать общий как 100%. Допустим, диапазон 500п, при левел 100% таргеты ставятся на 500п от канала. При 150% – 750п, и т.п.
avatar

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

  • 9 мая 2017, 00:42
+
0
Здесь делаю только то что можно быстро сделать, а ваш заказ уже явно не быстро.
avatar

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

  • 9 мая 2017, 07:43
+
0
Добавил: www.opentraders.ru/downloads/1578/



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

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

3. Стопы и тейки не ставятся на линиях, а это очень важно.

4. Нет Мин и Макс дельт канала, они тоже нужны.

5. Мартин странно работает. Увеличивает объем не на следующий, а в текущий день и заменяет ордер.



Редактирован: 9 мая 2017, 12:28
avatar

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

  • 9 мая 2017, 11:58
+
0
Спасибо, этот вариант работает как надо.
avatar

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

  • 10 мая 2017, 23:33

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