Calcul correct du lot à partir du % de la caution

 

Bonjour à tous,

Roger, l'un des programmeurs, m'a récemment ouvert les yeux sur le fait que j'avais écrit ma fonction de calcul des lots par %.


ma fonction est la suivante :


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



Je devrais utiliser l'effet de levier et le prix actuel,


J'ai essayé de le vérifier avec des conseillers experts, mais ils avaient tous la même fonction,


où est la vérité ?


Je voudrais vous demander la fonction correcte pour calculer le lot en % !

 
En général, le problème est qu'il y a confusion entre la charge du dépôt et le montant du risque par position. Il est conseillé de vérifier les deux. Ce qui compte dans le code ci-dessus, c'est la charge, ou plutôt la taille du lot en fonction de la charge.
 
Celui-ci est bien meilleur, il n'y a pas de calcul d'épaule, c'est une façon différente de faire. Je l'aime beaucoup.

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 );
}
Le calcul du lot sur le % du dépôt pour une distance donnée de pips, c'est-à-dire "pour drainer 20% du dépôt en 10 pips = il faut ?lot" est la fonction de cette question et compte
 
wenay:
Celui-ci est bien meilleur, il n'y a pas de calcul de l'effet de levier ici. J'aime beaucoup le calcul du lot pour le % du dépôt pour une distance donnée de pips. i.e. "pour drainer 20% du dépôt en 10 pips = il faut ?lot" cette fonction demande et calcule

À mon avis, l'effet de levier devrait être présent dans les calculs de lots.

1) Si l'effet de levier n'est pas pris en compte, cela signifie que le TS n'est pas capable de générer de gros profits.

2) Si le dépôt est déjà assez important, l'effet de levier est réduit (automatiquement dans ma société de courtage), et l'erreur "Wrong volume" apparaît.

C'est un levier, ce n'est pas un levier en caoutchouc.

P.S. Ceci est mon IMHO

 
rensbit:

> Pas de calcul de l'effet de levier

À mon avis, l'effet de levier devrait être inclus dans le calcul du lot.

1) Si l'effet de levier n'est pas inclus, cela signifie que le TS n'est pas capable de générer de gros profits.

2) Si le dépôt est déjà assez important, DT diminue l'effet de levier (dans ma société de courtage automatiquement), il y a donc une erreur "Wrong volume".


P.S. C'est mon IMHO.


Au lieu de l'effet de levier, regardez le coût d'un tick. Si vous avez un effet de levier de 1k1 - un tick n'est pas cher (disons qu'il y a 1 cent), si 1k 500 - cher (5 quid). C'est-à-dire que le système fonctionne bien avec n'importe quel effet de levier, voici une autre façon de calculer, elle me semble plus optimale et correcte.

votre société de courtage passera automatiquement à un autre effet de levier pour vous.

 
Vladon:
... vous devez toujours utiliser l'épaule ...
Si le risque est défini comme un pourcentage, alors :
lot = AccountEquity()*0.01*Risk / MarketInfo(Symbol(), MODE_MARGINREQUIRED);
 

Roger a été très utile sur ce point, et il mérite des remerciements particuliers à ! !!!.


Je l'ai légèrement remanié, afin que la devise du compte puisse être déterminée par moi-mê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);
}
 

N'y a-t-il pas d'autres monnaies de compte ? ;-)

Et les risques ne sont pas pris en compte ? Cette option ne tient également compte que de la charge du dépôt, et ce que seront les risques (en % du dépôt) au moment du retrait - est ignoré. Comme si en ouvrant, on devinait toujours la direction dès le premier instant et jusqu'au dernier.

 

fonction inutile, avec des erreurs en plus...

if(Lot < MinLots) Lot = MinLots;

Qu'est-ce que c'est ? Pas assez d'argent, toujours ouvert ?

Si nous avons 100 livres, un effet de levier de 100 et un risque de 100 %, c'est-à-dire si nous ouvrons grand, qu'obtenons-nous ?

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

lot = 100 * 100 * 100 / 100 / 100 = 100

Je n'ai rien mélangé ? pour 100 livres, il est peu probable que beaucoup de 100 puissent ouvrir sur une paire ...

 
keekkenen:

Si nous disposons de 100 livres, d'un effet de levier de 100 et d'un risque de 100 %, c'est-à-dire si nous ouvrons à fond, qu'obtenons-nous ?

lot = 100 * 100 * 100 / 100 / 100 = 100

je n'ai rien confondu ? pour 100 livres, il est peu probable qu'un lot de 100 puisse ouvrir sur une paire ...



Bien sûr, mélangé, le vrai est 100*100*100/100/100000=0.1.
 
ah désolé, c'était moi qui regardait l'or... donc pas de trading sur l'or avec votre formule maintenant ?