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

Рейтинг 2089



РЕКОМЕНДУЮ



Мультивалютный сеть стопордеров

Поздравляю всех с наступающим праздником — Днем Победы!
Желаю всем здоровья, мира и добра!

Прошу написать советника по следующему алгоритму:
1.Советник торгует одновременно на двух парах (условно ведущая=евро и ведомая=фунт).
2.В назначенное время советник выставляет стоповые ордера BuyStop и SellStop на ведущей паре(евро).
Расстояние установки ордеров от текущих рыночных цен настраиваемое.
3.Если при открытии нового бара ни один ордер не сработал, то советник их модифицирует (тралит ордера).
Передвинет, чтобы они снова оказались на нужном расстоянии от рынка.
4.При срабатывании одного из ордеров (например BuyStop) другой удаляется (в данном случае SellStop ).
5.Одновременно при открытии Buy позиции на ведущей паре(евро) выставляется сеть из BuyStop ордеров.
Вместе с выставлением сети ордеров на ведущей паре(евро) открывается позиция по ведомой паре(фунт) и выставляется
сеть ордеров противоположенного направления.В данном примере по фунту позиция Sell и сеть SellStop ордеров.
6.Позиции ведуще и ведомой пар закрываются либо по суммарному стопу/тейку советника, либо в установленное время.
В идеале получаем пирамиду позиций по одной из пар и одну минусовую позицию по другой паре.
Настройки советника

extern string Symbol1        = "EURUSD";
extern string Symbol2        = "GBPUSD";
extern bool   TimeClose      = false //Закрытие всех позиций и удаление всех ордеров по времени
extern int    StartHour      = 0;    // час начала торговли
extern int    StartMin       = 30;   // минута начала торговли
extern int    EndHour        = 23;   // час окончания торговли
extern int    EndMin         = 30;   // минута окончания торговли
extern int    Count          = 6;    // число стоп ордеров каждой пары
extern int    Step1          = 100;  //Расстояние от цены для установки ордера
extern int    Orders         = 3;    //Количество устанавливаемых ордеров
extern int    Step2          = 100;  //Шаг между ордерами
extern double Lot            = 0.01; //Лот
extern double PROFIT         = 20;   // Профит в валюте депозита
extern int    Slip           = 30;   // реквот
extern int    Magic          = 0;    // магик
:
  • +1
  • Просмотров: 1944
  • 8 мая 2021, 21:26
  • ssg
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Селекционный советник для МТ4
Следующая запись в группе  
Советник на пробой 3-х сессий
07 мая 2021
09 мая 2021

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

+
0
Не дописал в настройках:
<code>extern double LOSS         = 20;   // Убыток в валюте депозита</code>

Редактирован: 8 мая 2021, 21:43
avatar

  16  ssg Автор Сообщений: 817

  • 8 мая 2021, 21:33
+
0
многовато для бесплатного
avatar

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

  • 8 мая 2021, 23:06
+
0
Можно упростить на шаг.
Выставлять на ведущей паре сразу всю сеть стоповых ордеров BuyStop и SellStop.
Трал ордеров у Вас есть в Grider7.mq4 zakaz.opentraders.ru/45525.html или Гридер20 zakaz.opentraders.ru/52563.html.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void GridTrailing(int type,int step)
  {
/*
  1. находим ближайший к цене ордер
  2. смотрим его смещение
  3. запоминаеи на сколько он сместился
  4. перемещаем остальные ордера
  */
   bool mod;
   double 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()==2 && type==2) || (OrderType()==5 && type==5))
              {
               oop=NormalizeDouble(OrderOpenPrice()+step*Point,Digits);
               if(OrderType()==2 && StopLoss>0) {sl=NormalizeDouble(oop-StopLoss*Point,Digits);}
               if(OrderType()==5 && StopLoss>0) {sl=NormalizeDouble(oop+StopLoss*Point,Digits);}
               if(OrderType()==2 && TakeProfit>0) {tp=NormalizeDouble(oop+TakeProfit*Point,Digits);}
               if(OrderType()==5 && TakeProfit>0) {tp=NormalizeDouble(oop-TakeProfit*Point,Digits);}

               mod=OrderModify(OrderTicket(),oop,sl,tp,OrderExpiration(),Lime);
              }

            if((OrderType()==3 && type==3) || (OrderType()==4 && type==4))
              {
               oop=NormalizeDouble(OrderOpenPrice()-step*Point,Digits);
               if(OrderType()==3 && StopLoss>0) {sl=NormalizeDouble(oop+StopLoss*Point,Digits);}
               if(OrderType()==4 && StopLoss>0) {sl=NormalizeDouble(oop-StopLoss*Point,Digits);}
               if(OrderType()==3 && TakeProfit>0) {tp=NormalizeDouble(oop-TakeProfit*Point,Digits);}
               if(OrderType()==4 && TakeProfit>0) {tp=NormalizeDouble(oop+TakeProfit*Point,Digits);}

               mod=OrderModify(OrderTicket(),oop,sl,tp,OrderExpiration(),Lime);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
После
открытия позиции или
Buy или Sell противоположенные ордера удаляются.
Функция удаления ордеров или Ваша:
<code>//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder(string symb,int type=-1)
  {
   bool del;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==symb && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type || type==-1) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+</code>


или
<code>
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Удаление ордеров. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    op - операция                   (    -1      - любая позиция)           |
//|    mn - MagicNumber                (    -1      - любой магик)             |
//+----------------------------------------------------------------------------+
void DeleteOrders(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), ot;

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot==OP_BUYLIMIT || ot==OP_BUYSTOP || ot==OP_SELLLIMIT || ot==OP_SELLSTOP) {
        if (OrderSymbol()==sy && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            OrderDelete(OrderTicket(), clrRed);
          }
        }
      }
    }
  }
}
//+------------------------------------------------------------------+</code>

Редактирован: 9 мая 2021, 07:39
avatar

  16  ssg Автор Сообщений: 817

  • 9 мая 2021, 07:36
+
0
Андрей, добрый день.
Ну что, возьмётесь за мой заказ.
avatar

  16  ssg Автор Сообщений: 817

  • 10 мая 2021, 13:12
+
0
мультивалютный гридер это не ко мне.
avatar

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

  • 10 мая 2021, 14:16
+
0
Понятно.Значит подумаю над новой другой стратегией.
avatar

  16  ssg Автор Сообщений: 817

  • 10 мая 2021, 14:22
+
0
собрал моно версию советника: www.opentraders.ru/downloads/3011/



чуть позже можно заняться и мультом
avatar

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

  • 13 мая 2021, 12:37
+
0
Андрей, добрый день.Спасибо, что Вы взялись за мой заказ.Буду ждать полноценную версию.
Посмотрел код советника и заметил отклонения от ТЗ.
1.Ордера должны удалятся не при образовании нового бара, а при открытии позиции на покупку или на продажу.
1.1.Желательно при образовании нового бара и при отсутствии любой из позиции
тралить стоповые ордера в сторону цены.
2.При открытии позиции на покупку — удаляются только селлстоп ордера.
3.При открытии позиции на продажу — удаляются только байстоп ордера.
4.Закрытие всех позиций и удаление всех ордеров происходит при достижении
профита по советнику в валюте депозита.
avatar

  16  ssg Автор Сообщений: 817

  • 13 мая 2021, 16:18
+
0
Спасибо, что Вы взялись за мой заказ


я не взялся, просто набросал то что можно было быстро сделать.

1.Ордера должны удалятся не при образовании нового бара, а при открытии позиции на покупку или на продажу.
1.1.Желательно при образовании нового бара и при отсутствии любой из позиции
тралить стоповые ордера в сторону цены.


таким образом я упростил трал всех ордеров

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

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

  • 13 мая 2021, 16:34
+
0
Советник нужно назвать «Смерть депозиту»
avatar

  10  Skyrider60 Сообщений: 93

  • 13 мая 2021, 18:01
+
0
Вы о стратегии или о советнике?
Желательно с аргументами, по взрослому.
avatar

  16  ssg Автор Сообщений: 817

  • 13 мая 2021, 19:43
+
0
Что советник, это робот, какие к нему могут быть претензии, а вот стратегия конечно жесть.
avatar

  10  Skyrider60 Сообщений: 93

  • 14 мая 2021, 20:36
+
0
Так от стратегии там ничего не осталось.В том виде что есть конечно «жесть».Тем более что это «моно».А если например так организовать главную функцию:
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int r=0;
   double pr=0;

 //  if(t!=Time[0])
 //    {
 //     DelOrder();
 //     t=Time[0];
 //    }
     
//-------------------------------------------------
 //---------- блок подсчёта ордеров
int limitbuy=0;
int limitsell=0;
int stopbuy=0;
int stopsell=0;
int buy=0;
int sell=0;
int i;
   for( i=OrdersTotal()-1;i>=0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0) buy++;
            if(OrderType()==1) sell++;
            if(OrderType()==2) limitbuy++;
            if(OrderType()==3) limitsell++;  
            if(OrderType()==4) stopbuy++;
            if(OrderType()==5) stopsell++;            
           }
        }
     }
//------------------------------------------------
ModifyOrders();
if(buy!=0)DelOrderS();
if(sell!=0)DelOrderB();    
//------------------------------------------------
   if(CountTrades(0)<1 && CountTrades(1)<1 && TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()))
     {
      if(CountOrders(4)<1)
        {
         for(int i=1; i<=Count; i++)
           {
            pr=NormalizeDouble(Bid+Delta*i*_Point,_Digits);
            r=OrderSend(NULL,4,Lots,pr,Slip,0,0,"",Magic,0,Blue);
           }
        }
      if(CountOrders(5)<1)
        {
         for(int i=1; i<=Count; i++)
           {
            pr=NormalizeDouble(Bid-Delta*i*_Point,_Digits);
            r=OrderSend(NULL,5,Lots,pr,Slip,0,0,"",Magic,0,Red);
           }
        }
     }
//---------------------------------------------------------
      if(AllProfit()>Profit && Profit>0){
      CloseAll();
      DelOrderS();
      DelOrderB();
      }
  }
//+------------------------------------------------------------------+

И это лишь один из вариантов.
avatar

  16  ssg Автор Сообщений: 817

  • 14 мая 2021, 21:23

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