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

Рейтинг 2088



РЕКОМЕНДУЮ



Советник без использования индикаторов.

Здравствуйте! Наконец добрался до компа и можно попросить воплотить свою идею в жизнь.За это время понял, что она не нова.Был топик с подобным алгоритмом zakaz.opentraders.ru/24177.html, но там была основа(ренко).У меня же только математика.
Само ТЗ.
1.В момент запуска советника открывается ордер в заданном направлении, заданным лотом и с заданным СЛ.
2.На заданном расстоянии «х» от открытия первого ордера выставляется заданное количество стоповых ордеров в обе стороны с шагом «х» с первоначальным СЛ.
3.После открытия очередного ордера на месте закрытого по СЛ выставляется такой же стоповый, как и был раньше, а так же добавляется попутный стоповый ордер на расстоянии «х»*«заданное количество ордеров» при условии, что на этом месте ещё нет ордера.
4.Трал.Б\у, шаг б\у, цена в плюс, шаг трала — всё задается.Позаимствовал отсюда zakaz.opentraders.ru/24181.html#comment103379.
5.Закрытие по прибыли или проценту от баланса в момент открытия первого ордера в цикле для ордеров данного советника.
6.При закрытии удаляются все ордера данного советника, только после выполнения данного условия начинается новый цикл открытия ордеров.
7.В заданное время (раз в сутки) удаляются стоповые ордера, которые стоят на расстоянии «х»*«заданное количество ордеров+1» и более от цены.
8.Если есть возможность воплотить, то после заданного количества сработавших СЛ остановить работу советника с удалением всех ордеров на заданное время.Если такой возможности нет, то при заданной просадке в процентах от баланса на начало цикла удаляем все ордера данного советника и останавливаем его работу на заданное время.После прохождения заданного времени советник вновь начинает работу.
Ну вот вроде и все пожелания.Заранее благодарен.
Что непонятно, спрашивайте, постараюсь пояснить.
  • +2
  • Просмотров: 4418
  • 5 мая 2015, 00:12
  • kitajac
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
0
Могу начать делать по частям. Пока делаю 1-е два пункта.
avatar

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

  • 5 мая 2015, 08:02
+
0
Спасибо за оперативность.Можно и по частям.Главное в финале всё собрать воедино.
avatar

  11  kitajac Автор Сообщений: 293

  • 5 мая 2015, 08:10
+
0
3.После открытия очередного ордера на месте закрытого по СЛ выставляется такой же стоповый, как и был раньше, а так же добавляется попутный стоповый ордер на расстоянии «х»*«заданное количество ордеров» при условии, что на этом месте ещё нет ордера.


Пункт 3 поясните пожалуйста на скринах наглядно
avatar

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

  • 5 мая 2015, 11:37
+
0

Вроде наглядно и разборчиво.Что не так — спрашивайте.Вечером смогу ответить.
avatar

  11  kitajac Автор Сообщений: 293

  • 5 мая 2015, 12:19
+
0
Первые 2 пункта реализованы: www.opentraders.ru/downloads/708/

avatar

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

  • 5 мая 2015, 09:26
+
0
Вот с такими настройками

открылся только один ордер

а должно было быть семь.
Заданное количество ордеров устанавливаются сразу в каждую сторону.
Вот что выдает:

в журнале ошибок нет.
avatar

  11  kitajac Автор Сообщений: 293

  • 5 мая 2015, 23:52
+
0
Изменил время истечения ордера — выставил отложки.Вопросы:1.почему расстояние до первого ордера составляется из суммы расстояния до ордера и шагом ордера?(вообще то по моей задумке это была одна переменная(см. ТЗ), но может кому понравится в таком варианте) 2.Зачем время истечения ордера? 3.В отложках нет СЛ.
avatar

  11  kitajac Автор Сообщений: 293

  • 6 мая 2015, 01:05
+
0
Советник сложный, основы нет, пишу с нуля, работы много, выкладываю промежуточные варианты.



Обновил: www.opentraders.ru/downloads/708/
avatar

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

  • 6 мая 2015, 08:58
+
0
П.3 реализован следующим образом: если открылась еще поза или позиций стало меньше(SL,TP), то удаляем старые ордера и ставим новые, т.о. около цены постоянно держится по 3 отложки с каждой стороны:


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

#define MAGIC  20110406

extern int    StopLoss    = 300; //Стоплосс ордера
extern int    TakeProfit  = 3000;//Тейкпрофит ордера 
extern int    Slip        = 50;  //Проскальзывание
extern int    Pos         = 0;   //0-buy 1-sell
extern int    Distance    = 200; //Расстояние от цены для установки ордера
extern int    Step        = 200; //Шаг установки ордеров
extern int    Count       = 3;   //Количество устанавливаемых ордеров
extern double Lots        = 0.1; //Лот
/*
1. Кучка ордеров таскается за ценой
2. Если открывается новый ордер удаляем все ордера и ставим на расстоянии от цены заново.
3. Запоминаем количество открытых позиций 
4. Если количество открытых позиций больше запомненного то п.2
5. Ордер сработал, поза открылась, перед тем как запомним новое количество поз, нужно удалить старые ордера и установить новые.
*/
int pos=0; //количество поз
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   Comment("");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int BuyPos=0,SellPos=0,b=0,s=0,res=0,i;

   for(i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC) continue;
         if(OrderType()==OP_BUY) BuyPos++;
         if(OrderType()==OP_SELL) SellPos++;
         if(OrderType()==OP_BUYSTOP) b++;
         if(OrderType()==OP_SELLSTOP) s++;
        }
     }

   if((BuyPos+SellPos)>pos || (BuyPos+SellPos)<pos)//если открылась еще поза или позиций стало меньше(SL,TP), то удаляем старые ордера и ставим новые
     {
      DelOrder();
      
      if((BuyPos>0 || SellPos>0) && b<1)
         for(i=0;i<=Count-1;i++)
           {
              {
               double price=fND(Ask+(Distance*Point+i*Step*Point));
               res=OrderSend(Symbol(),OP_BUYSTOP,Lots,price,3,price-StopLoss*Point,price+TakeProfit*Point,"",MAGIC,0,Blue);
              }
           }
      //--------------------------------------------------------------------    
      if((BuyPos>0 || SellPos>0) && s<1)
         for(i=0;i<=Count-1;i++)
           {
              {
               double price=fND(Bid-(Distance*Point+i*Step*Point));
               res=OrderSend(Symbol(),OP_SELLSTOP,Lots,price,3,price+StopLoss*Point,price-TakeProfit*Point,"",MAGIC,0,Red);
              }
           }
      //--------------------------------------------------------------------       
     }

   Comment(
           "\n  Открыто позиций ",pos,
           "\n  Buy позиций ",BuyPos,
           "\n  Sell позиций ",SellPos);
//--------------------------------------------------------------------      
   if(Pos==0 && OrdersTotal()<1)
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MAGIC,0,Blue);
     }
//--------------------------------------------------------------------      
   if(Pos==1 && OrdersTotal()<1)
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",MAGIC,0,Red);
     }
//--------------------------------------------------------------------    
   if((BuyPos>0 || SellPos>0) && b<1)
      for(i=0;i<=Count-1;i++)
        {
           {
            double price=fND(Ask+(Distance*Point+i*Step*Point));
            res=OrderSend(Symbol(),OP_BUYSTOP,Lots,price,3,price-StopLoss*Point,price+TakeProfit*Point,"",MAGIC,0,Blue);
           }
        }
//--------------------------------------------------------------------    
   if((BuyPos>0 || SellPos>0) && s<1)
      for(i=0;i<=Count-1;i++)
        {
           {
            double price=fND(Bid-(Distance*Point+i*Step*Point));
            res=OrderSend(Symbol(),OP_SELLSTOP,Lots,price,3,price+StopLoss*Point,price-TakeProfit*Point,"",MAGIC,0,Red);
           }
        }
//--------------------------------------------------------------------     
   pos=BuyPos+SellPos;
   return 0;
  }
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
  {
   if(n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }
//+------------------------------------------------------------------+
void DelOrder()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      bool del;
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
        {
         if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
            if(OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket());
            if(OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+   

avatar

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

  • 6 мая 2015, 11:48
+
0
Не совсем смог разобраться.При несоответствии количества ордеров происходит их удаление и выставление сетки по-новой.Что происходит с уже открытыми ордерами? При сильном движении цены сов будет успевать выставлять отложки? Подумаю ещё над альтернативным алгоритмом данного блока.
avatar

  11  kitajac Автор Сообщений: 293

  • 6 мая 2015, 14:11
+
0
Такой вариант проще реализуется. Открытые ордера остаются. Удалить и выставить отложки можно достаточно быстро. Я еще попробую реализовать ваш вариант.
avatar

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

  • 6 мая 2015, 14:41
+
0
Новая ситуация.После удаления вручную всех ордеров сов не открывает ордера, даже после перезапуска.
avatar

  11  kitajac Автор Сообщений: 293

  • 7 мая 2015, 09:41
+
0
Если на счете есть любой ордер не откроет. Попробуйте вот этот код:


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

#define MAGIC  20110406

extern int    StopLoss    = 300; //Стоплосс ордера
extern int    TakeProfit  = 3000;//Тейкпрофит ордера 
extern int    Slip        = 50;  //Проскальзывание
extern int    Pos         = 0;   //0-buy 1-sell
extern int    Distance    = 200; //Расстояние от цены для установки ордера
extern int    Step        = 200; //Шаг установки ордеров
extern int    Count       = 3;   //Количество устанавливаемых ордеров
extern double Lots        = 0.1; //Лот

int pos=0; //количество поз
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   Comment("");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int BuyPos=0,SellPos=0,b=0,s=0,res=0,i;

   for(i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC) continue;
         if(OrderType()==OP_BUY) BuyPos++;
         if(OrderType()==OP_SELL) SellPos++;
         if(OrderType()==OP_BUYSTOP) b++;
         if(OrderType()==OP_SELLSTOP) s++;
        }
     }

   if((BuyPos+SellPos)>pos || (BuyPos+SellPos)<pos)//если открылась еще поза или позиций стало меньше(SL,TP), то удаляем старые ордера и ставим новые
     {
      DelOrder();
      
      if((BuyPos>0 || SellPos>0) && b<1)
         for(i=0;i<=Count-1;i++)
           {
              {
               double price=fND(Ask+(Distance*Point+i*Step*Point));
               res=OrderSend(Symbol(),OP_BUYSTOP,Lots,price,3,price-StopLoss*Point,price+TakeProfit*Point,"",MAGIC,0,Blue);
              }
           }
      //--------------------------------------------------------------------    
      if((BuyPos>0 || SellPos>0) && s<1)
         for(i=0;i<=Count-1;i++)
           {
              {
               double price=fND(Bid-(Distance*Point+i*Step*Point));
               res=OrderSend(Symbol(),OP_SELLSTOP,Lots,price,3,price+StopLoss*Point,price-TakeProfit*Point,"",MAGIC,0,Red);
              }
           }
      //--------------------------------------------------------------------       
     }

   Comment(
           "\n  Открыто позиций ",pos,
           "\n  Buy позиций ",BuyPos,
           "\n  Sell позиций ",SellPos);
//--------------------------------------------------------------------      
   if(Pos==0 && pos<1)
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MAGIC,0,Blue);
     }
//--------------------------------------------------------------------      
   if(Pos==1 && pos<1)
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",MAGIC,0,Red);
     }
//--------------------------------------------------------------------    
   if((BuyPos>0 || SellPos>0) && b<1)
      for(i=0;i<=Count-1;i++)
        {
           {
            double price=fND(Ask+(Distance*Point+i*Step*Point));
            res=OrderSend(Symbol(),OP_BUYSTOP,Lots,price,3,price-StopLoss*Point,price+TakeProfit*Point,"",MAGIC,0,Blue);
           }
        }
//--------------------------------------------------------------------    
   if((BuyPos>0 || SellPos>0) && s<1)
      for(i=0;i<=Count-1;i++)
        {
           {
            double price=fND(Bid-(Distance*Point+i*Step*Point));
            res=OrderSend(Symbol(),OP_SELLSTOP,Lots,price,3,price+StopLoss*Point,price-TakeProfit*Point,"",MAGIC,0,Red);
           }
        }
//--------------------------------------------------------------------     
   pos=BuyPos+SellPos;
   return 0;
  }
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
  {
   if(n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }
//+------------------------------------------------------------------+
void DelOrder()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      bool del;
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
        {
         if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
            if(OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket());
            if(OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+   

avatar

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

  • 7 мая 2015, 11:55
+
0
Вроде раза с третьего заработало.Открыл первоначальный ордер и выставил отложки.Другие ордера были на счету.
avatar

  11  kitajac Автор Сообщений: 293

  • 8 мая 2015, 09:42
+
0
Доброго времени суток! Сильно далеко отложили моё ТЗ?
Посмотрите, подойдет ли данный фрагмент для 5 пункта ТЗ?
int i;
    double profit;
    profit=0;
      for(i=0;OrderTotal()>i;i++)  {
        if(OrderMagicNumber()==MagicNumber)  {
        profit=profit+OrderProfit()+OrderCommission()+OrderSwap();  }
        }
    if(Profit>0 && ((NameClose == PercentEquity && profit>=balance*Profit/100) 
                 || (NameClose == ValueProfit   && profit>=Profit))) {
      deleteAllPos (); 
      balance = AccountBalance();

Может что надо подправить?
avatar

  11  kitajac Автор Сообщений: 293

  • 12 мая 2015, 21:46
+
0
Продолжаем делать то что есть или п.3. дорабатываем? По остальным пунктам есть функции готовые.
avatar

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

  • 12 мая 2015, 21:59
+
0
То что есть сегодня сработало некорректно.Первоначально было открыто как положено ордеров.Потом при закрытии ордеров селл по сл(выставил вручную) открылись новые селл стоп, а старые бай стоп не удалились и новых не появилось.По-поводу п.3 подскажу завтра(уже сегодня).
Хотелось бы всё-таки узнать мнение по поводу нижеприведенного отрезка.Вверху неполный вариант.
int i;
    double profit;
    profit=0;
      for(i=0;OrdersTotal()>i;i++)  {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))  {
        if(OrderMagicNumber()==MagicNumber)  {
        profit=profit+OrderProfit()+OrderCommission()+OrderSwap();  }
          }
        }
    if(Profit>0 && ((NameClose == PercentEquity && profit>=balance*Profit/100) 
                 || (NameClose == ValueProfit   && profit>=Profit))) {
      deleteAllPos (); 
      for(i=0;OrdersTotal()>0;i++)  {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))  {
        if(OrderMagicNumber(i)==MagicNumber)  {
        OrderDelete(i);  }        // или вновь отправляем в deleteAllPos //
         }
        }
      balance = AccountBalance(); 

Укажите на ошибки и будет ли вообще такой вариант работать?
avatar

  11  kitajac Автор Сообщений: 293

  • 13 мая 2015, 02:38
+
0
советник не учитывает ордера открытые вручную. насчет вашего варианта у меня есть свой.
avatar

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

  • 13 мая 2015, 07:25
+
0
Наконец-то добрался до компа.То что сов не учитывает другие ордера это так задумано.Насчет п.3 можно попробовать реализовать следущее: постоянно подсчитываем количество отложек, если уменьшилось количество бай — значит выставляем в шаге селлстоп и добавляем байстоп как в ТЗ и наоборот.
avatar

  11  kitajac Автор Сообщений: 293

  • 18 мая 2015, 23:39
+
0
Доброго времени суток! Можно ли добавить ваши готовые функции по другим пунктам ТЗ, про которые вы упоминали выше, в сова, а дальше будем смотреть, что доработать.
avatar

  11  kitajac Автор Сообщений: 293

  • 25 мая 2015, 17:50
+
0
Завтра буду добавлять.
avatar

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

  • 25 мая 2015, 21:03
+
+1
Добавил 4,5,6,7 :)  www.opentraders.ru/downloads/708/

avatar

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

  • 26 мая 2015, 16:29
+
0
Спасибо.Буду пробовать.
avatar

  11  kitajac Автор Сообщений: 293

  • 26 мая 2015, 23:56
+
0
При прогоне на тестере замечено следующее:


цикл первоначального открытия и выставления ордеров выполняется не один раз.
avatar

  11  kitajac Автор Сообщений: 293

  • 27 мая 2015, 22:27
+
0
Сейчас выставляется только один раз. И такая логика: при срабатывании ордера все удаляются и выставляются заново. Т.о. около цены всегда есть указанное количество отложек.

www.opentraders.ru/downloads/708/

avatar

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

  • 29 мая 2015, 15:26

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