MQL4 - automated forex trading   /  

Форум

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

К списку тем  | 1 2 Авторизуйтесь или зарегистрируйтесь, чтобы создать новую тему

avatar
1323
Vladon 28.06.2010 23: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 экспертов, у всех такая же функция,


где правда?


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

Организуйте багтрекинг и техсаппорт для своей компании

В TeamWox имеются все для того чтобы организовать багтрекинг. Интегрировав модуль Сервисдеск с веб-сайтом, Вы сможете получать заявки своих клиентов напрямую в TeamWox. Более того, вся переписка с клиентами автоматически распознается и попадает в архив, где ее без труда можно найти в будущем.


avatar
550
marketeer 29.06.2010 14:14 
Обычно проблема в том, что существует путаница между загрузкой депозита и размером риска на позицию. Проверять желательно и то, и другое. То, что считается в приведенном коде - загрузка, точнее размер лота исходя из загрузки.

avatar
533
wenay 29.06.2010 14: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пп = надо ?лота"  функция это вопрос и считает 

avatar
598
rensbit 29.06.2010 15:03 
wenay:
Эта гарздо лучше, сдесь нет рассчета плеча тут другой способ решения. Мне очень понравился Расчет лота от % депо на данное растояние пп. т.е. "чтобы слить 20% депо за 10пп = надо ?лота" функция это вопрос и считает

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

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

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

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

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


avatar
533
wenay 29.06.2010 15:05 
rensbit:

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

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

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

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


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


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

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


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


avatar
1323
Vladon 29.06.2010 19: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);
}

avatar
550
marketeer 29.06.2010 23:08 

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

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


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



avatar
2240
Roger 30.06.2010 00:02 
keekkenen:

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

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

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



Конечно, перепутал, по настоящему будет так - 100*100*100/100/100000=0.1

avatar
801
keekkenen 30.06.2010 00:07 
ах, извините, это я на золоте смотрел.. так что же по золоту теперь не торговать по вашей формуле ?
К списку тем   | 1 2  

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