Расчёт максимального лота

 

чё-то запутался с расчётом :-)

если например хочу открыть BUY со StopLoss=100пунктов и на максимум что позволяет депо. И при всём этом чтобы в худшем случае ордер закрылся по честному стоп-лосу, а не был прибит брокером "за недостатком средств".

как в таком случае рассчитывается объём ? как учитываются всякие MARGIN_REQUIRED, MARGIN_MAINTAINANCE

 
Maxim Kuznetsov:

чё-то запутался с расчётом :-)

если например хочу открыть BUY со StopLoss=100пунктов и на максимум что позволяет депо. И при всём этом чтобы в худшем случае ордер закрылся по честному стоп-лосу, а не был прибит брокером "за недостатком средств".

как в таком случае рассчитывается объём ? как учитываются всякие MARGIN_REQUIRED, MARGIN_MAINTAINANCE

Ищите по запросу: Расчёт лота по Вильямсу

 
Vitaly Muzichenko:

Ищите по запросу: Расчёт лота по Вильямсу

нельзя более точно направить ? а то поиск по сайту ведёт в словоблудные статьи и быстро попадает в рекурсию
 
Maxim Kuznetsov:
нельзя более точно направить ? а то поиск по сайту ведёт в словоблудные статьи и быстро попадает в рекурсию

Вот с этого думаю вырежете нужное, где-то есть готовая, но очень жарко искать, извините

//+------------------------------------------------------------------+
//| Расчет лота по риску для StopLoss                                |
//+------------------------------------------------------------------+
string sLot(double Percent=1, double Stoploss=500, int txt=0)
 {
 double TickValue   =MarketInfo(_symbol,MODE_TICKVALUE),
        TickSize    =MarketInfo(_symbol,MODE_TICKSIZE),
        ContractSize=SymbolInfoDouble(_symbol,SYMBOL_TRADE_CONTRACT_SIZE),
        Min_Lot     =MarketInfo(_symbol,MODE_MINLOT),
        Max_Lot     =MarketInfo(_symbol,MODE_MAXLOT),
        Step        =MarketInfo(_symbol,MODE_LOTSTEP),
        Free        =AccountFreeMargin(),
        Lots_New=0;

 int   CalcMode     =(int)MarketInfo(_symbol,MODE_MARGINCALCMODE);

  if (Percent > 100)
   {
    Percent = 100;
   }

  if (Percent == 0)
   {
    Lots_New = Min_Lot;
   } else {
    // Lots_New = MathFloor((((Free*Percent/100)/Stoploss)/TickValue)/Step)*Step;
    // Lots_New = MathFloor((((Free*Percent/100)/Stoploss)/((TickSize*TickValue)*ContractSize))/Step)*Step;
    if(CalcMode==0)
     {
      Lots_New = MathFloor((((Free*Percent/100)/Stoploss)/TickValue)/Step)*Step;
     }
    if(CalcMode==1||CalcMode==2||CalcMode==3)
     {
      Lots_New = MathFloor(((((Free*Percent)/100)/Stoploss)/((TickSize*TickValue)*ContractSize/TickValue))/Step)*Step;
     }
    if(CalcMode==4)
     {
      Lots_New = MathFloor((((Free*Percent/100)/Stoploss)/TickValue)/Step)*Step;  
     }
   }

   if (Lots_New > Max_Lot)
     {
        Lots_New = Max_Lot;
     }

   if (Lots_New > cLot(100))
     {
        Lots_New =cLot(100);
     }

   if (Lots_New < cLot(100) && Lots_New < Min_Lot)
    {
     if (txt==1)
      {
       return(Lang?"Превышен лимит":"limit Exceeded");
      } else {
       return(Lang?"Не хватает свободных средств":"There is a lack of available funds");
      }
    }
   return(DoubleToStr(Lots_New,2));
 }
//+------------------------------------------------------------------+
//| Расчет лота по риску                                             |
//+------------------------------------------------------------------+
double cLot(double Percent=0)
 {
 double Free=AccountFreeMargin(),
        One_Lot=MarketInfo(_symbol,MODE_MARGINREQUIRED),
        Min_Lot=MarketInfo(_symbol,MODE_MINLOT),
        cStep=MarketInfo(_symbol,MODE_LOTSTEP),
        Lots_New=0;

  if (Percent > 100)
   {
    Percent = 100;
   }

  if (Percent == 0)
   {
    Lots_New = 0;
     return(0);
   } else {
    Lots_New = MathFloor(Free*Percent/100/One_Lot/cStep)*cStep;
   }

   if (Lots_New < Min_Lot)
     {
        Lots_New = Min_Lot;
     }

   if (Lots_New*One_Lot > Free)
    {
     return(NormalizeDouble(0,2));
    }
   return(NormalizeDouble(Lots_New,2));
 }


Применять функцию sLot

 
Maxim Kuznetsov:

чё-то запутался с расчётом :-)

если например хочу открыть BUY со StopLoss=100пунктов и на максимум что позволяет депо. И при всём этом чтобы в худшем случае ордер закрылся по честному стоп-лосу, а не был прибит брокером "за недостатком средств".

как в таком случае рассчитывается объём ? как учитываются всякие MARGIN_REQUIRED, MARGIN_MAINTAINANCE

По логике и здравому смыслу лот должен быть в процентах от текущей эквити. Все остальное от лукавого.)

 
Maxim Kuznetsov:

чё-то запутался с расчётом :-)

если например хочу открыть BUY со StopLoss=100пунктов и на максимум что позволяет депо. И при всём этом чтобы в худшем случае ордер закрылся по честному стоп-лосу, а не был прибит брокером "за недостатком средств".

как в таком случае рассчитывается объём ? как учитываются всякие MARGIN_REQUIRED, MARGIN_MAINTAINANCE


узнаем текущий стопаут, от него получаем макс убыток (чтобы "не был прибит брокером"), зная эту сумму и дистанцию (100 пунктов), вычисляем необходимый (для слива) объем ордера...