Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Используй MQL5 Cloud Network. Это безопасно!
Vladislav Andruschenko
91475
Vladislav Andruschenko 2010.06.28 21:42 

Всем привет,

Недавно один из программистов - 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 экспертов, у всех такая же функция,


где правда?


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

Stanislav Korotky
17857
Stanislav Korotky 2010.06.29 12:14  
Обычно проблема в том, что существует путаница между загрузкой депозита и размером риска на позицию. Проверять желательно и то, и другое. То, что считается в приведенном коде - загрузка, точнее размер лота исходя из загрузки.
Alexandr Andreev
2951
Alexandr Andreev 2010.06.29 12:53  
Эта гарздо лучше, сдесь нет рассчета плеча тут другой способ решения. Мне очень понравился

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пп = надо ?лота"  функция это вопрос и считает
Валентин
871
Валентин 2010.06.29 13:03  
wenay:
Эта гарздо лучше, сдесь нет рассчета плеча тут другой способ решения. Мне очень понравился Расчет лота от % депо на данное растояние пп. т.е. "чтобы слить 20% депо за 10пп = надо ?лота" функция это вопрос и считает

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

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

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

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

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

Alexandr Andreev
2951
Alexandr Andreev 2010.06.29 13:05  
rensbit:

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

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

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

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


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


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

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

Игорь
157
Игорь 2010.06.29 15:59  
Vladon:
... надо еще плечо использовать ...
Если Risk задан в процентах, то:
lot = AccountEquity()*0.01*Risk / MarketInfo(Symbol(), MODE_MARGINREQUIRED);
Vladislav Andruschenko
91475
Vladislav Andruschenko 2010.06.29 17:05  

Очень помог 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);
}
Stanislav Korotky
17857
Stanislav Korotky 2010.06.29 21:08  

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

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

keekkenen
1135
keekkenen 2010.06.29 21:27  

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

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 можно открыться по какой-либо паре..

Alexander
2441
Alexander 2010.06.29 22:02  
keekkenen:

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

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

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



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