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

Рейтинг 2072



РЕКОМЕНДУЮ



советник

1. При включении советник ставит сетку отложенных ордеров, в настройках: buy stop=true, buy limit=true, sell stop=true, sell limit=true.
2. При закрытии рыночного по тейкпрофиту ставится противоположный рыночный ордер с увеличенным лотом. Если какой-либо ордер достигает максимального лота, который задается в настройках, то после закрытия ордера с максимальным лотом по тейкпрофиту, противоположный ордер по этому конкретному ордеру больше не выставляется.
3. Все рыночные и отложенные ордера закрываются по эквити, то есть при увеличении средств на счету. Например на счету 100 долларов, при увеличении средств до 110 долларов советник закроет все ордера и начнет торговать заново. В следующий раз закроет ордера когда средства достигнут 120 долларов, далее 130, 140 и так далее.
  • 0
  • Просмотров: 2608
  • 20 мая 2018, 18:00
  • pavel39638
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
0
завтра буду смотреть
avatar

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

  • 20 мая 2018, 19:04
+
0
я сделал набросок. он выставляет нужные ордера, кроет по профиту в валюте, а дальше непонятно, нужно все максимально подробно на скринах с пояснениями.


//+------------------------------------------------------------------+
//|                                                      Grider6.mq4 |
//|                                              Copyright 2018, AM2 |
//|                                      http://www.forexsyatems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, AM2"
#property link      "http://www.forexsyatems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double  Lots        = 0.1;      // объем первого ордера
extern double  MaxLot      = 10;       // максимальный лот 
extern double  KLot        = 2;        // умножение лота ордеров сетки
extern double  Loss        = 4500;     // лось в рублях
extern double  Profit      = 50;       // язь в рублях
extern int     StopLoss    = 0;        // стоплосс
extern int     TakeProfit  = 0;        // тейкпрофит
extern int     Step        = 100;      // шаг ордеров
extern int     Count       = 5;        // количество ордеров
extern int     Slip        = 3;        // проскальзывание
extern int     Magic       = 123;      // магик

extern bool    BuyLimit    = 1;        // BuyLimit
extern bool    SellLimit   = 1;        // SellLimit
extern bool    BuyStop     = 0;        // BuyStop
extern bool    SellStop    = 0;        // SellStop
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

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

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,double lot)
  {
   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);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(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 || type==-1) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу ордера                               |
//+------------------------------------------------------------------+
double AllProfit(int ot=-1)
  {
   double pr=0;
   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))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }

            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
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);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder(int type=-1)
  {
   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()==type || type==-1) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountOrders(0)<1 && CountOrders(1)<1)
     {
      if(CountOrders(2)<1 && BuyLimit)  for(int i=1;i<=Count;i++) PutOrder(2,Bid-Step*Point*i,Lots);//buylimit
      if(CountOrders(3)<1 && SellLimit) for(int i=1;i<=Count;i++) PutOrder(3,Bid+Step*Point*i,Lots);//selllimit
      if(CountOrders(4)<1 && BuyStop)   for(int i=1;i<=Count;i++) PutOrder(4,Bid+Step*Point*i,Lots);//buystop
      if(CountOrders(5)<1 && SellStop)  for(int i=1;i<=Count;i++) PutOrder(5,Bid-Step*Point*i,Lots);//sellstop
     }

   if((Profit>0 && AllProfit()>Profit) || (Loss>0 && AllProfit()<-Loss))
     {
      CloseAll();
      DelOrder();
     }

   Comment("\n All Profit: ",AllProfit());
  }
//+------------------------------------------------------------------+

avatar

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

  • 21 мая 2018, 20:34
+
0
Вариант под флетовые участочки:



//+------------------------------------------------------------------+
//|                                                      Grider6.mq4 |
//|                                              Copyright 2018, AM2 |
//|                                      http://www.forexsyatems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, AM2"
#property link      "http://www.forexsyatems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double  Lots        = 0.1;      // объем первого ордера
extern double  MaxLot      = 10;       // максимальный лот 
extern double  KLot        = 2;        // умножение лота ордеров сетки
extern double  Loss        = 4500;     // лось в рублях
extern double  Profit      = 50;       // язь в рублях
extern int     StopLoss    = 0;        // стоплосс
extern int     TakeProfit  = 0;        // тейкпрофит
extern int     Step        = 100;      // шаг ордеров
extern int     Count       = 5;        // количество ордеров
extern int     Slip        = 3;        // проскальзывание
extern int     Exp         = 30;       // истечение
extern int     Magic       = 123;      // магик

extern bool    BuyLimit    = 1;        // BuyLimit
extern bool    SellLimit   = 1;        // SellLimit
extern bool    BuyStop     = 0;        // BuyStop
extern bool    SellStop    = 0;        // SellStop
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

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

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,double lot)
  {
   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,TimeCurrent()+Exp*3600,clr);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(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 || type==-1) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу ордера                               |
//+------------------------------------------------------------------+
double AllProfit(int ot=-1)
  {
   double pr=0;
   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))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }

            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
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);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder(int type=-1)
  {
   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()==type || type==-1) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Результат последней сделки                                       |
//+------------------------------------------------------------------+
int LastDealResult()
  {
   int result=0;
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderProfit()>0)
           {
            result=1;//tp  
           }
         if(OrderProfit()<0)
           {
            result=2;//sl  
           }
        }
     }
   return(result);
  }
//+------------------------------------------------------------------+
//| Тип последней сделки                                             |
//+------------------------------------------------------------------+
int LastDealType()
  {
   int type=8;
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()<2)
           {
            type=OrderType();//sell  
           }
        }
     }
   return(type);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountOrders(0)<1 && CountOrders(1)<1)
     {
      if(CountOrders(2)<1 && BuyLimit)  for(int i=1;i<=Count;i++) PutOrder(2,Bid-Step*Point*i,Lots);//buylimit
      if(CountOrders(3)<1 && SellLimit) for(int i=1;i<=Count;i++) PutOrder(3,Bid+Step*Point*i,Lots);//selllimit
      if(CountOrders(4)<1 && BuyStop)   for(int i=1;i<=Count;i++) PutOrder(4,Bid+Step*Point*i,Lots);//buystop
      if(CountOrders(5)<1 && SellStop)  for(int i=1;i<=Count;i++) PutOrder(5,Bid-Step*Point*i,Lots);//sellstop
     }

   if(LastDealResult()==1 && LastDealType()==0 && CountOrders(1)<1) PutOrder(1,Bid,Lots*2);
   if(LastDealResult()==1 && LastDealType()==1 && CountOrders(0)<1) PutOrder(0,Ask,Lots*2);
   
   if((Profit>0 && AllProfit()>Profit) || (Loss>0 && AllProfit()<-Loss))
     {
      CloseAll();
      DelOrder();
     }

   Comment("\n All Profit: ",AllProfit());
  }
//+------------------------------------------------------------------+
avatar

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

  • 21 мая 2018, 21:19
+
0
второй вариант это то что я и хотел, только увеличение лота по каждому конкретному ордеру должно происходить после каждого тейкпрофита, закрывается buy 0.01 ставится sell 0.02, закрывается sell 0.02 ставится buy 0.04, далее sell 0.08, buy 0.16, sell 0.32 и так далее
avatar

  6  pavel39638 Автор Сообщений: 69

  • 21 мая 2018, 22:32
+
0
это добавлю вечером
avatar

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

  • 22 мая 2018, 07:26
+
+1
увеличивает лот: www.opentraders.ru/downloads/1908/

avatar

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

  • 22 мая 2018, 18:21
+
0
из всей сетки ордеров увеличивает почему-то только один ордер, остальные тупо закрываются по профиту
avatar

  6  pavel39638 Автор Сообщений: 69

  • 27 мая 2018, 17:02
+
0
из всей сетки ордеров увеличивает почему-то только один ордер, остальные тупо закрываются по профиту


о чем речь? покажите на скрине
avatar

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

  • 27 мая 2018, 21:58

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