Правильный расчет лота от % депо

 

Всем привет,

Недавно один из программистов - Roger открыл мне глаза на то, что я неправильно написал функцию расчета лотов от %.


моя функция следующая:


double GetSizeLot() //Функция возвращает значение лотов,
{ //если включен ММ то значение лотов,
double lots,MD,RM,MinLots,LotSize; int lotsdigit; //вычисляется путем:Свободные средства*Risk
LotSize = MarketInfo(Symbol(), MODE_LOTSIZE); //поделить на стоимость одного лота
MD = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); //А также вычисляет колличество знаков
if(MD==0.01) lotsdigit=2; //присваивает значения максимума лотов
if(MD==0.1) lotsdigit=1;
if(MM>1) {lots=NormalizeDouble((AccountFreeMargin()*MM/LotSize),lotsdigit);Lot=lots;}
else lots=Lot;
MinLots=NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT),2);
if(lots < MinLots) lots = MinLots;
if(lots > MaxLot) lots = MaxLot;
return(NormalizeDouble(lots,2));
}



но тут он мне и говорит, что так мол и так, надо еще плечо использовать и текущую цену,


ну дай я думаю проверю как у профи, и у ВСЕХ! абсолютно, перепроверил 1000 экспертов, у всех такая же функция,


где правда?


подскажите правильную функцию расчета лота от %

 
Обычно проблема в том, что существует путаница между загрузкой депозита и размером риска на позицию. Проверять желательно и то, и другое. То, что считается в приведенном коде - загрузка, точнее размер лота исходя из загрузки.
 
Эта гарздо лучше, сдесь нет рассчета плеча тут другой способ решения. Мне очень понравился

double LotSize( int type, double LotRisk, int SL  )
{   //    int znakov_lot=0;
        double  lot_min         = MarketInfo( Symbol(), MODE_MINLOT  ); 
        double  lot_max         = MarketInfo( Symbol(), MODE_MAXLOT  ); 
        double  lot_step        = MarketInfo( Symbol(), MODE_LOTSTEP ); 
        double  lotcost         = MarketInfo( Symbol(), MODE_TICKVALUE );       
                
        double  lot             = 0.0;
        double  dollarsPerPip   = 0.0;
        
        lot = AccountBalance()*LotRisk/100.0;
        dollarsPerPip = lot/SL;
     //   if (lot_min<2) {znakov_lot=0;  if (lot_min<0.2) {znakov_lot=1;  if (lot_min<0.02) {znakov_lot=3;  if (lot_min<0.002) {znakov_lot=4; }}}}      
        lot = NormalizeDouble( dollarsPerPip/lotcost, 2 );      
        
        lot = NormalizeDouble( lot / lot_step, 0 ) * lot_step;
        
        if ( lot < lot_min ) lot = lot_min;
        if ( lot > lot_max ) lot = lot_max;
        
        if ( AccountFreeMarginCheck( Symbol(), type, lot ) < 10 || GetLastError() == 134 ) 
        { 
                Alert ( "Impossible to open position with lot = ", DoubleToStr( lot, 2 ), ". Not enough money." );
                return(-1);
        }

        return( lot );
}
Расчет лота от % депо на данное растояние пп.   т.е. "чтобы слить 20% депо за 10пп = надо ?лота"  функция это вопрос и считает
 
wenay:
Эта гарздо лучше, сдесь нет рассчета плеча тут другой способ решения. Мне очень понравился Расчет лота от % депо на данное растояние пп. т.е. "чтобы слить 20% депо за 10пп = надо ?лота" функция это вопрос и считает

На мой взгляд, плечо должно присутствовать в расчетах лота.

1) Если не учитывать плечо, это обозначает что ТС не способна дать большую прибыль

2) Если депо уже достаточно большое, дц уменьшает плечо (в моём дц автоматически), поэтому появиться ошибка "Неправильный объем".

Оно - это плечо, не резиновое же.

P.S. это моё ИМХО

 
rensbit:

> нет рассчета плеча

На мой взгляд, плечо должно присутствовать в расчетах лота.

1) Если не учитывать плечо, это обозначает что ТС не способна дать большую прибыль

2) Если депо уже достаточно большое, дц уменьшает плечо (в моём дц автоматически), поэтому появиться ошибка "Неправильный объем".


P.S. это моё ИМХО


  присмотрись вместа плеча использую расчет стоимости тика. Если у тебя плечо 1к1 - то тик стоит не дорого (допустим там 1 цент), если 1к 500 то дорого (5 баксов). Т.е. система четка работает при любом плече, тут другой способ расчета, как мне кажется более оптимальный и правельный

как раз для вашего ДЦ потходит, т.к. система автоматически перейдет на другое плечо 

 
Vladon:
... надо еще плечо использовать ...
Если Risk задан в процентах, то:
lot = AccountEquity()*0.01*Risk / MarketInfo(Symbol(), MODE_MARGINREQUIRED);
 

Очень помог Roger в данном вопросе, за что ему отдельный респект!!!!


я ее немного переделал, чтобы валюту счета сам определял


int Percent=10;
string Valdepo=AccountCurrency();

int start()
{
double Lot,MinLots,MaxLots;
int lotdig;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01)lotdig=2; else lotdig=1;
if(Valdepo=="USD")
   {
   if(StringSubstr(Symbol(),0,3)=="USD")Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
   else if(StringSubstr(Symbol(),3,3)=="USD")Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/Ask/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
   else 
      {
      double pr=MarketInfo(StringSubstr(Symbol(),0,3)+"USD",MODE_ASK);
      if(pr!=0)Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/pr/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      else Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      }
   }
if(Valdepo=="EUR")
   {
   if(StringSubstr(Symbol(),0,3)=="EUR")Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
   else
      {
      pr=MarketInfo("EUR"+StringSubstr(Symbol(),0,3),MODE_BID);
      if(pr!=0)Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()*pr/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      else Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      }
   }
MinLots=MarketInfo(Symbol(),MODE_MINLOT);
MaxLots=MarketInfo(Symbol(),MODE_MAXLOT);
if(Lot < MinLots) Lot = MinLots;
if(Lot > MaxLots) Lot = MaxLots;
return(0);
}
 

А других валют счетов не бывает что-ли? ;-)

И риски все-таки побоку? Этот вариант ведь тоже считает только от загрузки депо, а какие будут риски (в % от депо) при просадках - игнорируется. Можно подумать, когда Вы открываетесь, то всегда угадываете с направлением с первого момента и до последнего.

 

бесполезная функция, с ошибками кроме того..

if(Lot < MinLots) Lot = MinLots;

это что? денег не хватает все равно открываемся ?

если у нас 100 баксов, плечо 100 и 100% риска, т.е. открываемся по полной, то что получаем ?

if(StringSubstr(Symbol(),0,3)=="USD")
Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);

лот = 100 * 100 * 100 / 100 / 100 = 100

я ничего не перепутал ? на 100 баксов вряд ли лотом 100 можно открыться по какой-либо паре..

 
keekkenen:

если у нас 100 баксов, плечо 100 и 100% риска, т.е. открываемся по полной, то что получаем ?

лот = 100 * 100 * 100 / 100 / 100 = 100

я ничего не перепутал ? на 100 баксов вряд ли лотом 100 можно открыться по какой-либо паре..



Конечно, перепутал, по настоящему будет так - 100*100*100/100/100000=0.1
 
ах, извините, это я на золоте смотрел.. так что же по золоту теперь не торговать по вашей формуле ?
Причина обращения: