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

Рейтинг 1315



РЕКОМЕНДУЮ



Частичное локирование позиций

Приветствую, просьба сделать советник, который будет выполнять только одну функцию — это частичное(неполное) локирование открытых позиций.
Параметр только один: % от открытых позиций.

Идея такова:
Допустим в советнике указан параметр процент частичного локирования: 30%. Ставим советник на график и он всё время будет мониторить ситуацию.
К примеру мы открыли ордер buy лотом 0,10, наш советник сразу же откроет sell лотом 0,03, так как процент локирования указан 30%.
Другая ситуция: если у нас открыт buy лотом 0,10, а sell лотом 0,05, то советник соотвтестченно ничего не делает. В этой ситуации, где buy 0,10, а sell 0,05, потом мы откроем еще один ордер sell лотом 0,40, то вся сумма sell лотов у нас уже будет равна 0,45, соотвествеено советник откроет ордер buy лотом 0,05, чтобы общая сумма buy была 0,15 (30% от лота sell 0,45)

В общем основная задача, чтобы сумма лотов buy была не меньше 30% от всей суммы лотов sell и наоборот. Советник должен всегда поддерживать минимальный % от противоположных ордеров.
  • 0
  • Просмотров: 809
  • 23 апреля 2018, 22:17
  • anathem
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
0
Если кто возьмётся, то, как вы смотрите на то, чтобы была возможность включить выключить советник?)
avatar

  7  sorusm Сообщений: 111

  • 24 апреля 2018, 08:32
+
0
на новостях думаешь торговать?
avatar

  8  axe44 Сообщений: 374 - Алек

  • 24 апреля 2018, 10:21
+
+1
посмотрю сегодня.
avatar

  27  AM2 Сообщений: 8028 - Андрей

  • 24 апреля 2018, 17:00
+
0
*hi* 
avatar

  5  anathem Автор Сообщений: 99

  • 24 апреля 2018, 17:16
+
+1
Советник должен всегда поддерживать минимальный % от противоположных ордеров.


пока реализовано только однократное выставление лока




//+------------------------------------------------------------------+
//|                                                         Lock.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

extern double BLot       = 0.1;      // бай лот
extern double SLot       = 0.05;     // селл лот
extern double Pro        = 30;       // процент
extern int Slip          = 30;       // реквот
extern int Magic         = 111;      // магик 
extern int LMagic        = 222;      // магик лока
//+------------------------------------------------------------------+
//| 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 mn)
  {
   int r=0;
   color clr=Green;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   r=OrderSend(NULL,type,lot,NormalizeDouble(price,Digits),Slip,0,0,"",mn,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(int mn)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==mn)
           {
            if(OrderType()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lots(int type)
  {
   double lot=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) lot+=OrderLots();
           }
        }
     }
   return(lot);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades(Magic)<1)
     {
      PutOrder(0,Ask,BLot,Magic);
      PutOrder(1,Bid,SLot,Magic);
     }

   if(CountTrades(LMagic)<1)
     {
      if(Lots(1)/Lots(0)*100<Pro && Lots(0)>Lots(1)) PutOrder(1,Ask,Lots(0)*Pro*0.01-Lots(1),LMagic); 
      if(Lots(0)/Lots(1)*100<Pro && Lots(1)>Lots(0)) PutOrder(1,Bid,Lots(1)*Pro*0.01-Lots(0),LMagic);
     }
     
   Comment("\n Buy Lots: ",Lots(0),
           "\n Sell Lots: ",Lots(1));
  }
//+------------------------------------------------------------------+

avatar

  27  AM2 Сообщений: 8028 - Андрей

  • 24 апреля 2018, 19:50
+
0
Спасибо, а полный функционал Вы будете доделывать?
avatar

  5  anathem Автор Сообщений: 99

  • 24 апреля 2018, 19:56
+
+1
этот вариант попробуйте на постоянном поддержании:


//+------------------------------------------------------------------+
//|                                                         Lock.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

extern double BLot       = 0.1;      // бай лот
extern double SLot       = 0.05;     // селл лот
extern double Pro        = 30;       // процент
extern int Slip          = 30;       // реквот
extern int Magic         = 111;      // магик 
extern int LMagic        = 222;      // магик лока
//+------------------------------------------------------------------+
//| 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 mn)
  {
   int r=0;
   color clr=Green;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   r=OrderSend(NULL,type,lot,NormalizeDouble(price,Digits),Slip,0,0,"",mn,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(int mn)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==mn)
           {
            if(OrderType()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lots(int type)
  {
   double lot=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==type) lot+=OrderLots();
           }
        }
     }
   return(lot);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades(Magic)<1)
     {
      PutOrder(0,Ask,BLot,Magic);
      PutOrder(1,Bid,SLot,Magic);
     }

   if(Lots(1)/Lots(0)*100<Pro && Lots(0)>Lots(1)) PutOrder(1,Ask,Lots(0)*Pro*0.01-Lots(1),LMagic);
   if(Lots(0)/Lots(1)*100<Pro && Lots(1)>Lots(0)) PutOrder(1,Bid,Lots(1)*Pro*0.01-Lots(0),LMagic);

   Comment("\n Buy Lots: ",Lots(0),
           "\n Sell Lots: ",Lots(1));
  }
//+------------------------------------------------------------------+

avatar

  27  AM2 Сообщений: 8028 - Андрей

  • 24 апреля 2018, 19:55
+
0
В одну секунду добавили сообщения) Проверю, спасибо.
avatar

  5  anathem Автор Сообщений: 99

  • 24 апреля 2018, 19:56
+
0
Поставил на пустой счёт, открываю руками лот бай 0,10, селл 0,03 после этого не открывается, с 30% параметром. В журнале ошибок нет(
avatar

  5  anathem Автор Сообщений: 99

  • 24 апреля 2018, 20:24
+
+1
Поставил на пустой счёт, открываю руками лот бай 0,10, селл 0,03 после этого не открывается, с 30% параметром. В журнале ошибок нет


конечно не открывается, потому что уже есть лок селл 30%.

открыл руками бай 0.1, селл 0.01 — затем кинул советник, открыл оставшиеся до 30%, т.е. селл 0.02

avatar

  27  AM2 Сообщений: 8028 - Андрей

  • 24 апреля 2018, 20:44
+
0

Кинул советник после того, как открыл buy 0,10. Он только открыл 0,01 бай и селл, как указанно в настройках. Может дело в magic? не могу понять =\
avatar

  5  anathem Автор Сообщений: 99

  • 24 апреля 2018, 21:06
+
0
А можете скинуть готовым файлом? Может у меня с компилятором беда.
avatar

  5  anathem Автор Сообщений: 99

  • 24 апреля 2018, 21:49
+
0
avatar

  27  AM2 Сообщений: 8028 - Андрей

  • 25 апреля 2018, 17:43
+
0
Точно так же не работает, 0.20 лот на бай стоит и тишина. Остальные советники работают на этом же счету.
Есть ошибка в терминале 2018.04.25 18:22:32.797 Lock EURUSD,H1: zero divide in 'Lock.mq4' (104,15)
Это что такое?
Редактирован: 25 апреля 2018, 18:23
avatar

  5  anathem Автор Сообщений: 99

  • 25 апреля 2018, 18:21
+
0
Открыл вручную бай 0.2, сов залочил селл 0.06

avatar

  27  AM2 Сообщений: 8028 - Андрей

  • 25 апреля 2018, 18:28
+
0
А настройки покажите, пожалуйста. Мне кажется он не видит мои ордера в ручную, пишет, что делить не на что.
avatar

  5  anathem Автор Сообщений: 99

  • 25 апреля 2018, 18:29
+
0
Поправленная версия работает. Спасибо.
avatar

  5  anathem Автор Сообщений: 99

  • 9 мая 2018, 23:30

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