Calcolo corretto del lotto dalla % del deposito

 

Ciao a tutti,

Roger, uno dei programmatori, mi ha recentemente aperto gli occhi sul fatto che ho scritto la mia funzione di calcolo dei lotti per %.


la mia funzione è la seguente:


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));
}



Dovrei usare la leva e il prezzo attuale,


Ho provato a controllare con gli Expert Advisors, ma hanno tutti la stessa funzione,


dov'è la verità?


Vorrei chiedervi la funzione corretta per calcolare il lotto in %!

 
Di solito il problema è che c'è confusione tra il carico del deposito e la quantità di rischio per posizione. È consigliabile controllare entrambi. Ciò che conta nel codice di cui sopra è il carico, o piuttosto la dimensione del lotto basata sul carico.
 
Questo è molto meglio, non c'è il calcolo della spalla, è un modo diverso di farlo. Mi piace molto.

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 );
}
Il calcolo del lotto sulla % del deposito per una data distanza di pips. cioè "per drenare il 20% del deposito in 10 pips = avete bisogno di ?lot" funzione questa domanda e conta
 
wenay:
Questo è molto meglio, non c'è nessun calcolo della leva qui. Mi piace molto il calcolo del lotto per la % del deposito per una data distanza di pips. cioè "per drenare il 20% del deposito in 10 pips = avete bisogno di ?lot" questa funzione chiede e calcola

Secondo me, la leva dovrebbe essere presente nei calcoli dei lotti.

1) Se la leva non viene presa in considerazione, significa che il TS non è in grado di generare grandi profitti.

2) Se il deposito è già abbastanza grande, la leva viene ridotta (nella mia società di brokeraggio automaticamente), quindi appare l'errore "Wrong volume".

È una leva, non è di gomma.

P.S. questo è il mio IMHO

 
rensbit:

> Nessun calcolo della leva finanziaria

Secondo me, la leva dovrebbe essere inclusa nel calcolo del lotto.

1) Se la leva non è inclusa, significa che il TS non è in grado di generare grandi profitti.

2) Se il deposito è già abbastanza grande, DT diminuisce la leva (nella mia società di brokeraggio automaticamente), quindi ci sarà un errore "Volume sbagliato".


P.S. è il mio IMHO


Invece della leva, guardate il costo di un tick. Se hai 1k1 di leva - un tick non è costoso (diciamo che c'è 1 centesimo), se 1k 500 - costoso (5 sterline). Cioè il sistema funziona bene con qualsiasi leva, ecco un altro modo di calcolo, mi sembra più ottimale e corretto.

la vostra società di intermediazione passerà automaticamente a una leva diversa per voi.

 
Vladon:
... devi ancora usare la spalla ...
Se il rischio è impostato come percentuale, allora:
lot = AccountEquity()*0.01*Risk / MarketInfo(Symbol(), MODE_MARGINREQUIRED);
 

Roger è stato molto utile su questo argomento, per cui merita un ringraziamento speciale a!!!!


L'ho ridisegnato leggermente, in modo che la valuta del conto possa essere determinata da me


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);
}
 

Non ci sono altre valute di conto? ;-)

E i rischi non sono presi in considerazione? Anche questa opzione conta solo sul carico del deposito, e quello che sarà il rischio (in % del deposito) al prelievo - viene ignorato. Come se quando si apre, si indovinasse sempre la direzione dal primo momento e fino all'ultimo.

 

funzione inutile, con errori inoltre...

if(Lot < MinLots) Lot = MinLots;

Cos'è questo? Non ci sono abbastanza soldi ancora aperti?

Se abbiamo 100 sterline, 100 di leva e 100% di rischio, cioè apriamo bene, cosa otteniamo?

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

lotto = 100 * 100 * 100 / 100 / 100 = 100

Non ho mischiato nulla ? per 100 sterline è improbabile che un sacco di 100 possa aprire su una coppia ...

 
keekkenen:

Se abbiamo 100 sterline, 100 di leva e il 100% di rischio, cioè apriamo pieno, cosa otteniamo?

lotto = 100 * 100 * 100 / 100 / 100 = 100

Non ho confuso nulla? per 100 sterline è improbabile che un sacco di 100 può aprire su una coppia ...



Naturalmente, confuso, quello reale è 100*100*100/100/100000=0,1
 
ah, scusa, ero io che guardavo l'oro... quindi niente trading in oro ora usando la tua formula?