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 ); }The calculation of the lot on the % of the deposit for a given distance of pips. i.e. "to drain 20% of the deposit in 10 pips = you need ?lot" is the function of this question and counts
This one is much better, there is no leverage calculation here. I like very much the calculation of the lot for the % of the deposit for a given distance of pips. i.e. "to drain 20% of the deposit in 10 pips = you need ?lot" this function asks and calculates
In my opinion, leverage should be present in lot calculations.
1) If the leverage is not taken into account, it means that the TS is not capable of generating large profits.
2) If the deposit is already big enough, the leverage is reduced (in my brokerage company automatically), so the error "Wrong volume" appears.
It's a leverage, it's not a rubber one.
P.S. this is my IMHO
> No leverage calculation
In my opinion, leverage should be included in the lot calculation.
1) If the leverage is not included, it means that the TS is not capable of generating large profits.
2) If the deposit is already big enough, DT decreases the leverage (in my brokerage company automatically), so there will be an error "Wrong volume".
P.S. it's my IMHO
Instead of leverage, look at the cost of a tick. If you have 1k1 leverage - a tick is not expensive (say there is 1 cent), if 1k 500 - expensive (5 quid). I.e. the system works well with any leverage, here is another way of calculation, it seems to me more optimal and correct.
your brokerage company will automatically switch to different leverage for you.
... you still have to use the shoulder ...
lot = AccountEquity()*0.01*Risk / MarketInfo(Symbol(), MODE_MARGINREQUIRED);
Roger was very helpful on this matter, for which he deserves special thanks to!!!!
I've reworked it slightly, so that the account currency can be determined by myself
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); }
Are there no other account currencies? ;-)
And the risks are not taken into account? This option also counts only on the deposit load, and what will be the risks (in % of the deposit) at drawdown - is ignored. As if when you open, you always guess the direction from the first moment and to the last.
useless function, with errors besides...
if(Lot < MinLots) Lot = MinLots;
what is this? not enough money still open ?
if we have 100 quid, 100 leverage and 100% risk, i.e. we open wide, what do we get ?
if(StringSubstr(Symbol(),0,3)=="USD") Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
lot = 100 * 100 * 100 / 100 / 100 = 100
I have not mixed up anything ? for 100 quid it is unlikely that a lot of 100 can open on a pair ...
If we have 100 quid, 100 leverage and 100% risk, i.e. we open full, what do we get?
lot = 100 * 100 * 100 / 100 / 100 = 100
i did not confuse anything ? for 100 quid it is unlikely that a lot of 100 can open on a pair ...
Of course, mixed up, the real one is 100*100*100/100/100000=0.1
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hi all,
Roger, one of the programmers, recently opened my eyes to the fact, that I've written my function of calculating lots by %.
my function is as follows:
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));
}
I should use leverage and current price,
I tried to check it with Expert Advisors, but they all had the same function,
where is the truth?
I would like to ask you for the correct function to calculate the lot in %!