AM2
Андрей

 
Уровень 35

  Торгую в компаниях:


Группа "Программирование на MQL"

Рейтинг 280



Манименеджмент. Лот от риска на стоп.

Ранее мне встречались подобные формулы расчета лота, но мне захотелось во всем разобраться самостоятельно. Итак приступим.

Дано:

1. Депо 10000$.
2. Риск 2% от депо.
3. Стоп 1500 пунктов.

Найти: Лот?

Сначала определим какой убыток в долларах получим при риске 2% от депо:

Убыток = Депо * Риск.

10000 * 2% = 10000 * 2: 100 = 200 даляров :) 

Стоп в далярах также равен:

Убыток = Стоп * Лот.

Отсюда лот равен убыток делить на стоп.

Лот = Депо * Риск: Стоп.

А теперь в цифирях:

0.13 = 10000 * 2: 100: 1500

А вот так все это выглядит на мкл:

lot=NormalizeDouble((AccountEquity()*Risk/100)/StopLoss,Round);


Чтобы наглядно продемонстрировать правильность этой формулы напишем советник, который будет открывать позицию с указанным риском от стопа и выводить на экран значение лота от депо в настройках. Т.о. наш советник одновременно рассчитывает лот для ордера на счете на котором установлен и показывает на экране лот для депо введенного в настройках независимо от размера депо счета.


extern double Lots       = 0.1;      // лот
extern double Risk       = 2;        // риск
extern double Depo       = 1000;     // депо
extern int StopLoss      = 2000;     // лось
extern int TakeProfit    = 3000;     // язь
extern int BuySell       = 0;        // 1-Buy 2-Sell
extern int Round         = 2;        // округление 
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик




Рис.1. На экране рассчитан лот по параметрам в настройках.

И целиком код советника:


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

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double Risk       = 2;        // риск
extern double Depo       = 1000;     // депо
extern int StopLoss      = 2000;     // лось
extern int TakeProfit    = 3000;     // язь
extern int BuySell       = 0;        // 1-Buy 2-Sell
extern int Round         = 2;        // округление 
extern int Slip          = 30;       // реквот
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);
     }

   if(AccountFreeMarginCheck(Symbol(),type,Lot())<=0)
     {
      Print("Недостаточно средств для открытия позиции объемом: ",Lot());
      return;
     }

   r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   double maxl=MarketInfo(NULL,MODE_MAXLOT);
   double minl=MarketInfo(NULL,MODE_MINLOT);

   if(Lots==0)
     {
      lot=NormalizeDouble((AccountEquity()*Risk/100)/StopLoss,Round);
     }

   if(lot<minl) lot=minl;
   if(lot>maxl) lot=maxl;

   return(lot);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(OrdersTotal()<1)
     {
      if(BuySell==1) PutOrder(0,Ask);
      if(BuySell==2) PutOrder(1,Bid);
     }

   Comment("\n Lot: ",NormalizeDouble((Depo*Risk/100)/StopLoss,Round));
  }
//+------------------------------------------------------------------+



Скачать: www.opentraders.ru/downloads/1269/
  • +4
  • Просмотров: 10744
  • 26 июля 2016, 12:56
  • AM2
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

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

+
0
Вот эти два места мне один раз помогли:
www.mql5.com/en/forum/68910
www.mql5.com/ru/forum/92360
avatar

  27  Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 26 июля 2016, 13:01
+
0
Что-куда нужно вписать в код, чтобы вместо стоп-лосса выставлялся локирующий стоп-ордер равный лотности сумме открытых ордеров, и с них снимались все ТП и СЛ, «консервируя» лок при этом?
avatar

  11  preasto Сообщений: 445

  • 28 января 2017, 12:57
+
0
Подскажите как сделать проверку средств для МТ5
if(AccountFreeMarginCheck(Symbol(),type,Lot())<=0)
     {
      Print("Недостаточно средств для открытия позиции объемом: ",Lot());
      return;
     }
avatar

  12  vypchela Сообщений: 112

  • 17 декабря 2021, 05:49
+
0
Спасибо, сделал сам!
avatar

  12  vypchela Сообщений: 112

  • 19 декабря 2021, 05:54
+
0
Если в комент выводите lot, то зачем? Правильно, для проверки.
Не лишним было попутно выводить (для проверки) и значение свободной маржи.
Редактирован: 18 апреля 2022, 15:31
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 18 апреля 2022, 15:31

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