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

Рейтинг 2146



РЕКОМЕНДУЮ



Советник

При включении советник ставит отложенный buy stop, который тянется за ценой до тех пор пока не станет рыночным. Как только buy stop сработал советник тут же выставляет sell stop, который тянется за ценой пока не станет рыночным. Далее снова ставится buy stop, который тянется за ценой пока не станет рыночным, затем снова sell stop, затем снова buy stop, снова sell stop и так далее… то есть поочередно.
  • +1
  • Просмотров: 3511
  • 11 декабря 2017, 21:03
  • pavel39638
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

Брокер для ваших роботов, 15 лет на рынке

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

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

  35  AM2 Сообщений: 16247 - Андрей

  • 11 декабря 2017, 21:52
+
0
Есть такой скрипт, который тянет стоп-ордер за ценой. Я его как то ждал падения цены и использовал как селл-стоп, так он настроил сетку из близко расположенных селл-ордеров, а цена потом ушла вверх.


Редактирован: 11 декабря 2017, 22:11
avatar

  12  sledopyt Сообщений: 151

  • 11 декабря 2017, 22:08
+
0
вот ближайший который нашел в базе www.opentraders.ru/downloads/1175
avatar

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

  • 11 декабря 2017, 22:10
+
0
Посмотрю сегодня
avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 12 декабря 2017, 17:17
+
0
avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 12 декабря 2017, 18:23
+
0
погонял в тестере, после срабатывания второго рыночного ордера почему-то выставляются одновременно два отложенных: buy stop и sell stop; так не должно быть, в работе должен находиться только один отложенный ордер, при этом рыночных ордеров может быть несколько. Если buy stop стал рыночным то выставляется sell stop, если sell stop стал рыночным то выставляется buy stop, исправте пожалуйста
avatar

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

  • 12 декабря 2017, 19:56
+
0
Посмотрите как работает этот вариант:


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

//--- Inputs
extern double Lots       = 0.1;      // лот
extern int StopLoss      = 2000;     // лось
extern int TakeProfit    = 3000;     // язь
extern int Delta         = 200;      // расстояние от цены
extern int Slip          = 30;       // реквот
extern int Type          = 0;        // 0-BuyStop 1-SellStop
extern int Magic         = 123;      // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   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,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModeOOP()
  {
   bool m;
   double delta=0,oop=0,sl=0,tp=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
           {
            if(OrderType()==4)
              {
               delta=NormalizeDouble(OrderOpenPrice()-Bid,Digits);
               if(delta>Delta*Point)
                 {
                  oop=NormalizeDouble(Bid+Delta*Point,Digits);
                  sl=NormalizeDouble(oop-StopLoss*Point,Digits);
                  tp=NormalizeDouble(oop+TakeProfit*Point,Digits);
                  m=OrderModify(OrderTicket(),oop,sl,tp,0,Blue);
                  return;
                 }
              }

            if(OrderType()==5)
              {
               delta=NormalizeDouble(Bid-OrderOpenPrice(),Digits);
               if(delta>Delta*Point)
                 {
                  oop=NormalizeDouble(Bid-Delta*Point,Digits);
                  sl=NormalizeDouble(oop+StopLoss*Point,Digits);
                  tp=NormalizeDouble(oop-TakeProfit*Point,Digits);
                  m=OrderModify(OrderTicket(),oop,sl,tp,0,Red);
                  return;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
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 || type==-1) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   ModeOOP();
   if(CountOrders()<1)
     {
      if(Type==0) PutOrder(4,Bid+Delta*Point);
      if(Type==1) PutOrder(5,Bid-Delta*Point);
     }

   if(CountOrders(0)>0 && CountOrders(5)<1 && CountOrders(4)<1) PutOrder(5,Bid-Delta*Point);
   if(CountOrders(1)>0 && CountOrders(4)<1 && CountOrders(5)<1) PutOrder(4,Bid+Delta*Point);
  }
//+------------------------------------------------------------------+

avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 12 декабря 2017, 20:27
+
0
теперь да, в работе один отложенный, но проблема в том что после срабатывания sell stop советник снова выставляет sell stop, так не должно быть, после sell stop должен выставляться buy stop
avatar

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

  • 12 декабря 2017, 20:48
+
0
Сейчас как?


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

//--- Inputs
extern double Lots       = 0.1;      // лот
extern int StopLoss      = 2000;     // лось
extern int TakeProfit    = 3000;     // язь
extern int Delta         = 200;      // расстояние от цены
extern int Slip          = 30;       // реквот
extern int Type          = 0;        // 0-BuyStop 1-SellStop
extern int Magic         = 123;      // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   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,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModeOOP()
  {
   bool m;
   double delta=0,oop=0,sl=0,tp=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
           {
            if(OrderType()==4)
              {
               delta=NormalizeDouble(OrderOpenPrice()-Bid,Digits);
               if(delta>Delta*Point)
                 {
                  oop=NormalizeDouble(Bid+Delta*Point,Digits);
                  sl=NormalizeDouble(oop-StopLoss*Point,Digits);
                  tp=NormalizeDouble(oop+TakeProfit*Point,Digits);
                  m=OrderModify(OrderTicket(),oop,sl,tp,0,Blue);
                  return;
                 }
              }

            if(OrderType()==5)
              {
               delta=NormalizeDouble(Bid-OrderOpenPrice(),Digits);
               if(delta>Delta*Point)
                 {
                  oop=NormalizeDouble(Bid-Delta*Point,Digits);
                  sl=NormalizeDouble(oop+StopLoss*Point,Digits);
                  tp=NormalizeDouble(oop-TakeProfit*Point,Digits);
                  m=OrderModify(OrderTicket(),oop,sl,tp,0,Red);
                  return;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Тип последней сделки                                             |
//+------------------------------------------------------------------+
int LastOrderType()
  {
   int type=8;
   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()<2)
           {
            type=OrderType();//sell  
           }
        }
     }
   return(type);
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
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 || type==-1) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   ModeOOP();
   if(CountOrders()<1)
     {
      if(Type==0) PutOrder(4,Bid+Delta*Point);
      if(Type==1) PutOrder(5,Bid-Delta*Point);
     }

   if(LastOrderType()==0 && CountOrders(5)<1) PutOrder(5,Bid-Delta*Point);
   if(LastOrderType()==1 && CountOrders(4)<1) PutOrder(4,Bid+Delta*Point);
   
   Comment(LastOrderType());
  }
//+------------------------------------------------------------------+

avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 12 декабря 2017, 20:59
+
0
все работает, премного благодарствую
avatar

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

  • 12 декабря 2017, 21:14
+
0
По-моему не хватает трейлинга прибыли
avatar

  12  sledopyt Сообщений: 151

  • 15 декабря 2017, 14:52

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