Korrekte Berechnung der Partie aus dem Prozentsatz der Kaution

 

Hallo zusammen,

Roger, einer der Programmierer, hat mir kürzlich die Augen geöffnet, dass ich meine Funktion zur Berechnung von Losen in % geschrieben habe.


meine Funktion ist die folgende:


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



Ich sollte die Hebelwirkung und den aktuellen Preis verwenden,


Ich habe versucht, es mit Expert Advisors zu überprüfen, aber sie hatten alle die gleiche Funktion,


Wo liegt die Wahrheit?


Ich möchte Sie um die richtige Funktion für die Berechnung des Loses in % bitten!

 
In der Regel besteht das Problem darin, dass die Höhe der Einlage und die Höhe des Risikos pro Position verwechselt werden. Es ist ratsam, beides zu prüfen. Was im obigen Code zählt, ist die Last oder vielmehr die auf der Last basierende Losgröße.
 
Das hier ist viel besser, es gibt keine Schulterberechnung, es ist eine andere Art, es zu tun. Mir gefällt das sehr gut.

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 );
}
Die Berechnung des Lots auf den % der Einlage für einen bestimmten Abstand von Pips. d.h. "um 20% der Einlage in 10 Pips = Sie brauchen ?lot" ist die Funktion dieser Frage und zählt
 
wenay:
Das hier ist viel besser, denn hier gibt es keine Hebelwirkung. Ich mag sehr die Berechnung des Lots für den Prozentsatz der Einlage für einen gegebenen Abstand von Pips. z.B. "um 20% der Einlage in 10 Pips abzuziehen = Sie brauchen ?Lot" fragt diese Funktion und berechnet

Meiner Meinung nach sollte die Hebelwirkung bei der Berechnung der Partien berücksichtigt werden.

1) Wenn die Hebelwirkung nicht berücksichtigt wird, bedeutet dies, dass der TS nicht in der Lage ist, große Gewinne zu erzielen.

2) Wenn die Einlage bereits groß genug ist, wird die Hebelwirkung reduziert (bei meiner Brokerfirma automatisch), so dass der Fehler "Falsches Volumen" erscheint.

Es ist ein Druckmittel, kein Gummi.

P.S.: Dies ist mein IMHO

 
rensbit:

> Keine Berechnung der Hebelwirkung

Meiner Meinung nach sollte die Hebelwirkung in die Losberechnung einbezogen werden.

1) Wenn keine Hebelwirkung vorhanden ist, bedeutet dies, dass der TS nicht in der Lage ist, einen großen Gewinn zu erzielen.

2) Wenn die Einlage bereits groß genug ist, verringert DT die Hebelwirkung (bei meiner Brokerfirma automatisch), so dass ein Fehler "Falsches Volumen" erscheint.


P.S. Es ist meine IMHO


Betrachten Sie statt der Hebelwirkung die Kosten für einen Tick. Bei einer Hebelwirkung von 1k1 ist ein Tick nicht teuer (sagen wir 1 Cent), bei 1k 500 ist er teuer (5 Pfund). D.h. das System funktioniert gut mit jeder Hebelwirkung, hier ist eine andere Art der Berechnung, die mir optimaler und richtiger erscheint.

Ihr Maklerunternehmen wird automatisch auf eine andere Hebelwirkung für Sie umstellen.

 
Vladon:
... müssen Sie immer noch die Schulter benutzen ...
Wenn Risiko als Prozentsatz eingestellt ist, dann:
lot = AccountEquity()*0.01*Risk / MarketInfo(Symbol(), MODE_MARGINREQUIRED);
 

Roger war in dieser Angelegenheit sehr hilfreich, wofür ihm ein besonderer Dank gebührt: !!!!


Ich habe es leicht überarbeitet, so dass die Kontowährung von mir selbst bestimmt werden kann


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

Gibt es keine anderen Kontowährungen? ;-)

Und die Risiken werden nicht berücksichtigt? Auch bei dieser Option wird nur die Höhe der Einlage berücksichtigt und das Risiko (in % der Einlage) bei der Auszahlung ignoriert. Als ob man beim Öffnen der Tür die Richtung vom ersten bis zum letzten Moment erraten würde.

 

nutzlose Funktion, außerdem mit Fehlern...

if(Lot < MinLots) Lot = MinLots;

Was ist das? Nicht genug Geld noch offen?

Wenn wir 100 Pfund, einen Hebel von 100 und ein 100%iges Risiko haben, d.h. wir öffnen weit, was bekommen wir?

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

Partie = 100 * 100 * 100 / 100 / 100 = 100

Ich habe nichts verwechselt ? für 100 Pfund ist es unwahrscheinlich, dass viele 100 auf ein Paar öffnen können ...

 
keekkenen:

Wenn wir 100 Pfund, einen Hebel von 100 und ein Risiko von 100 % haben, d. h. wir eröffnen voll, was bekommen wir dann?

Partie = 100 * 100 * 100 / 100 / 100 = 100

ich habe nichts verwechselt? für 100 Pfund ist es unwahrscheinlich, dass viele 100 auf ein Paar öffnen können ...



Natürlich ist die echte Zahl 100*100*100/100/100000=0,1, wenn man sie verwechselt.
 
Ah, Entschuldigung, das war ich, als ich Gold betrachtete... also kein Handel mit Gold jetzt nach Ihrer Formel?