Benötige Moneymanagement LOT size Formel basierend auf SL und Account Risk! - Seite 3

 

OK Leute! Dieser Code wurde von mir geschrieben und ist das, was ich in meinen eigenen EAs verwende. Er ist ziemlich komplex, weil er neben dem Risiko% und StopLoss auch das Margin-Risiko% berücksichtigt und die Lot-Größe basierend auf Minimum, Maximum und Step Size korrigiert. Außerdem wird immer der Mindestwert des aktuellen Kontostands und des Eigenkapitals verwendet, anstatt nur einen der beiden Werte zu verwenden. Ich halte dies für sicherer.

Bitte beachten Sie jedoch, dass sie den Spread nicht in die Berechnung einbezieht, da ich diesen bei der Berechnung des zu verwendenden StopLoss separat berechne. Die untenstehende Funktion verwendet also eine relative StopLoss-Größe. In meinen EA's wird das Argument dblStopLossPips vorher in Abhängigkeit von verschiedenen Faktoren wie der Strategie, dem Spread, der ATR, etc. berechnet; der endgültige Wert, der an die Funktion dblLotsRisk() weitergegeben wird, ist also bereits ein endgültiger Wert, um die zu verwendende Lotgröße zu berechnen.

// Function to Determine Tick Point Value in Account Currency

        double dblTickValue( string strSymbol )
        {
                return( MarketInfo( strSymbol, MODE_TICKVALUE ) );
        }
        

// Function to Determine Pip Point Value in Account Currency

        double dblPipValue( string strSymbol )
        {
                double dblCalcPipValue = dblTickValue( strSymbol );
                switch ( MarketInfo( strSymbol, MODE_DIGITS ) )
                {
                        case 3:
                        case 5:
                                dblCalcPipValue *= 10;
                                break;
                }
                
                return( dblCalcPipValue );
        }
        

// Calculate Lot Size based on Maximum Risk & Margin

        double dblLotsRisk( string strSymbol, double dblStopLossPips,
                double dblRiskMaxPercent, double dblMarginMaxPercent,
                double dblLotsMin, double dblLotsMax, double dblLotsStep )
        {
                double
                        dblValueAccount = MathMin( AccountEquity(), AccountBalance() )
                ,       dblValueRisk    = dblValueAccount * dblRiskMaxPercent / 100.0
                ,       dblValueMargin  = AccountFreeMargin() * dblMarginMaxPercent / 100.0
                ,       dblLossOrder    = dblStopLossPips * dblPipValue( strSymbol )
                ,       dblMarginOrder  = MarketInfo( strSymbol, MODE_MARGINREQUIRED )
                ,       dblCalcLotMin
                                = MathMax( dblLotsMin, MarketInfo( strSymbol, MODE_MINLOT ) )
                ,       dblCalcLotMax
                                = MathMin( dblLotsMax, MarketInfo( strSymbol, MODE_MAXLOT ) )
                ,       dblModeLotStep  = MarketInfo( strSymbol, MODE_LOTSTEP )
                ,       dblCalcLotStep  = MathCeil( dblLotsStep / dblModeLotStep ) * dblModeLotStep
                ,       dblCalcLotLoss
                                = MathFloor( dblValueRisk / dblLossOrder / dblCalcLotStep ) * dblCalcLotStep
                ,       dblCalcLotMargin
                                = MathFloor( dblValueMargin / dblMarginOrder / dblCalcLotStep ) * dblCalcLotStep
                ,       dblCalcLot = MathMin( dblCalcLotLoss, dblCalcLotMargin )
                ;
                
                if ( dblCalcLot < dblCalcLotMin ) dblCalcLot = dblCalcLotMin;
                if ( dblCalcLot > dblCalcLotMax ) dblCalcLot = dblCalcLotMax;

                return ( dblCalcLot );
        }
 
GumRai:

Das bereitet mir Kopfschmerzen, wenn ich nur versuche, die Klammern zu entziffern!

Um ehrlich zu sein, habe ich absolut keine Ahnung, was Sie hier zu erreichen versuchen.

Ich kann nicht sehen, wie MODE_STOPLEVEL oder SPREAD relevant sind, sicherlich sollten Sie Ihre Berechnungen auf den Stop-Loss-Abstand vom aktuellen Preis basieren?

Es sollte keinen Unterschied machen, was die Kontowährung ist, die Berechnung sollte die gleiche sein, weil TICKVALUE in der Kontowährung ist.

Bitte beachten Sie, dass durch das Einfügen Ihrer Code-Zeile in 2 Zeilen der Beitrag nicht so breit ist und somit leichter zu lesen ist, ohne nach rechts und links scrollen zu müssen :)

Ich habe vor ein paar Seiten ein Bild gepostet, in dem ich meine Formel zur Berechnung des Lots veranschaulicht habe, aber der Pipwert oder Tickwert oder was auch immer kommt immer durcheinander, Quote->Basiswährung und andere Dinge, die verwirrend sind, aber bis jetzt hat meine Formel gute Arbeit geleistet, obwohl ich mir nicht sicher bin, dass sie korrekt ist.

Der SPREAD mag irrelevant sein, aber das Stoplevel ist notwendig. Ich setze den SL so nah wie möglich an den Order-Openprice, der das Stoplevel ist, aber aufgrund von Schwankungen und Spikes muss ich ihn manchmal manuell anpassen, deshalb habe ich eine STOPSLIP-Variable gesetzt, mit der ich den SL an die Volatilität oder was auch immer anpassen kann.

FMIC:

OK Leute! Dieser Code wurde von mir geschrieben und ich verwende ihn in meinen eigenen EAs. Er ist ziemlich komplex, weil er neben dem Risk% und StopLoss auch den Margin Risk% berücksichtigt und die Lot Size auf Basis von Minimum, Maximum und Step Size korrigiert. Außerdem wird immer der Mindestwert des aktuellen Kontostands und des Eigenkapitals verwendet, anstatt nur einen der beiden Werte zu verwenden. Ich denke, das ist sicherer.

Bitte beachten Sie jedoch, dass sie den Spread nicht in die Berechnung einbezieht, da ich diesen bei der Berechnung des zu verwendenden StopLoss separat berechne. Die untenstehende Funktion verwendet also eine relative StopLoss-Größe. In meinen EA's wird das Argument dblStopLossPips vorher in Abhängigkeit von verschiedenen Faktoren wie Strategie, Spread, ATR, etc. berechnet; der endgültige Wert, der an die Funktion dblLotsRisk() weitergegeben wird, ist also bereits ein endgültiger Wert, um die zu verwendende Lotgröße zu berechnen.

Danke, ich werde es testen und Ihnen mein Feedback mitteilen!

Obwohl ich nicht verstehe, warum Sie so viele Variablen dort setzen, kann der gesamte Code in 1 Zeile angepasst werden :)

 
Proximus:

Ich habe vor ein paar Seiten ein Bild gepostet, in dem ich meine Formel zur Berechnung des Lots veranschaulicht habe, aber der Pipwert oder Tickwert oder was auch immer kommt immer durcheinander, Quote->Basiswährung und andere Dinge, die verwirrend sind, aber bisher hat meine Formel gute Arbeit geleistet, obwohl ich nicht sicher bin, dass sie korrekt ist.

Der SPREAD mag irrelevant sein, aber das Stoplevel ist notwendig. Ich setze den SL so nah wie möglich an den Orderopenprice, der das Stoplevel ist, aber aufgrund von Schwankungen und Spikes muss ich ihn manchmal manuell anpassen, deshalb habe ich eine STOPSLIP-Variable eingebaut, mit der ich den SL an die Volatilität oder was auch immer anpassen kann.

Danke, ich werde es testen und mein Feedback mitteilen!

Obwohl ich nicht verstehe, warum Sie so viele Variablen dort einfügen, der gesamte Code kann in 1 Zeile untergebracht werden :)


Ja, der Code könnte in einer Zeile untergebracht werden, aber glauben Sie mir, das ist NIEMALS eine gute Art zu programmieren, es sei denn, Sie versuchen, jeden letzten CPU-Zyklus aus Ihrem Code herauszuquetschen, um der Schnellste auf dem Planeten zu sein.

Deshalb beschwerte sich "GumRai" darüber, dass er Kopfschmerzen bekam, als er versuchte, den anderen Code zu entziffern. Es war einfach nicht sehr lesbar oder leicht zu verstehen, und das macht es sehr schwierig zu debuggen.

Mein Weg mag ausführlicher sein, aber er ist einfacher zu debuggen und zu warten sowie lesbarer und für andere wie Sie leichter zu verstehen.

Aber es steht Ihnen frei, alles in einer Zeile zusammenzufassen. Aber beschweren Sie sich nicht, wenn Sie damit nicht die gleichen Ergebnisse erzielen. Ich werde es Ihnen überlassen, DAS zu debuggen.

 

Sorry für die Wiedereröffnung dieses Threads, aber es ist wichtig, etwas zu bestätigen, so ist dies die Funktion, die ich kam mit (ich stelle es öffentlich können Sie mir später danken):

double LOTUNITSTORISK()
{
double LOTS=((AccountBalance()*RISKPERCENT/100) / (  MarketInfo(Symbol(), MODE_TICKVALUE)*MarketInfo(Symbol(), MODE_TICKSIZE)*STOPSIZE     ));
return LOTS;
}


Diese Funktion soll die Lot-Einheiten basierend auf dem Kontorisiko zurückgeben, und über ein EUR-Konto berechnet werden, da der EUR immer die Basiswährung ist.

Lot-Einheit bedeutet = die tatsächliche Geldgröße einer Position, also für ein 100 € Konto mit 1% Risiko sollte es 1€ zurückgeben, was basierend auf dem STOPLOSS z.B. ein 100 Pipetten Stoploss 1000 Lot-Einheiten sein sollte ( 0.01 LOT IN MT4 EQUIVALENT)

Es ist entscheidend, dass die Kontowährung EURO ist, nichts anderes.

Sobald wir LOTUNITTORISK() aufrufen, müssen wir die Ergebnisse durch 100.000 teilen, um die tatsächliche Lotgröße im MT4-Format zu erhalten (1000 Geldeinheiten 0,01 LOT in MT4)

RISKPERCENT =ist ein int und kann 1,2,3,4 das Risiko % sein, das wir riskieren

STOPSIZE = ist ein int und ist die Anzahl der Pipetten (Pips/10 bei 5-stelligen Brokern), die unsere Stoploss-Größe ist, also zum Beispiel 60 Pipetten SL ist ein 6 Pip SL

Ich möchte wissen, ob die Funktion die LOT UNITS richtig berechnet, bitte testen Sie es und wenn Sie einen Fehler finden, bitte helfen Sie mir :)

Tausend Dank!

 
Proximus:
MarketInfo(Symbol(), MODE_TICKVALUE)* MarketInfo(Symbol(), MODE_TICKSIZE)*STOPSIZE

Risk  = lotsize * StopSize * TickValue /  TickSize
         1      *  0.0100  *  $10.00   / 0.0001
$1000 = one lot * 100 pips *  $10.00   / pip
  1. Sie platzieren den Stopp dort, wo er sein muss - wo der Grund für den Handel nicht mehr gültig ist. Wenn Sie z.B. an einer Unterstützung handeln, fällt der Stop unter die Unterstützung.
  2. Kontostand * Prozent = RISIKO = (OrderOpenPrice - OrderStopLoss)*DIR * OrderLots * DeltaPerlot (Hinweis: OOP-OSL beinhaltet den SPREAD)
  3. Verwenden Sie NICHT TickValue selbst - DeltaPerlot
  4. Sie müssen auch FreeMargin überprüfen, um StopOut zu vermeiden
 
WHRoeder:
  1. Sie platzieren den Stopp dort, wo er sein muss - wo der Grund für den Handel nicht mehr gültig ist. Wenn Sie z. B. mit einer Unterstützung handeln, wird der Stopp unter die Unterstützung gesetzt.
  2. Kontostand * Prozent = RISIKO = (OrderOpenPrice - OrderStopLoss)*DIR * OrderLots * DeltaPerlot (Hinweis: OOP-OSL beinhaltet den SPREAD)
  3. Verwenden Sie NICHT TickValue selbst - DeltaPerlot
  4. Sie müssen auch FreeMargin überprüfen, um Stop-Outs zu vermeiden.

1) Die Funktion gibt nur die LOT SIZE in Geld Einheit nicht MT4 Einheit nichts anderes, wenn ich die Aufträge dann bzw. die STOPSIZE es wird addiert /abgezogen von Bid im Falle von BUY und Ask im Falle von sell.it ist genau wie MT4 behandelt die TP und SL.

BUY eröffnet bei ASK, geschlossen bei BID

SELL eröffnet zum BID, geschlossen zum ASK

2) Ich kann OrderOpenprice man nicht verwenden, weil kein Auftrag geöffnet wird, bevor diese Funktion berechnet wird.Spreads nicht eingeschlossen, Spreads werden behandelt, wenn ich die STOPSIZE hinzufügen/subtrahieren, nachdem der Auftrag geöffnet ist.

Aber vorher müssen wir die Losgröße bestimmen, das ist logisch.

3) Ich verstehe das nicht.

4) Offensichtlich, aber ich betone nochmals, dass die Orderplatzierungsfunktion danach ausgeführt wird und wenig mit dieser Funktion zu tun hat.Der einzige Zweck dieser Funktion ist es, die Losgröße zu bestimmen, sonst nichts.


TickValue /  TickSize

Falsch, wenn ich sie teile, dann erhalte ich die falsche Zahl, vielleicht für USD-Konten sollte so getan werden, aber es ist ein EUR-Konto.Sie müssen multipliziert werden.

 
Proximus:

BUY eröffnet zu ASK, geschlossen zu BID SELL eröffnet zu BID, geschlossen zu ASK

2) Ich kann OrderOpenprice nicht verwenden

3) Ich verstehe das nicht.

4) t, wenn ich sie teile, dann erhalte ich die falsche Zahl, vielleicht für USD-Konten sollte so getan werden, aber es ist ein EUR-Konto.Sie müssen multipliziert werden.

  1. Der Ask ist der OrderOpenPrice für einen Kauf.
  2. Der Bid ist der OrderOpenPrice für einen Verkauf. Warum können Sie ihn nicht verwenden, Sie müssen ihn doch kennen, um ihn an OrderSend zu übergeben?
  3. Sie MÜSSEN tickvalue/ticksize verwenden. Tickvalue allein ist bedeutungslos.
  4. Sie MÜSSEN dividieren, um die korrekten Einheiten zu erhalten (Change in price) * (tickValue) /(change in price) gibt Ihnen einen Wert. 10 $ pro Pip = 1 $ pro Punkt = Wert/Änderung. Denken Sie daran, dass das Ergebnis in der Kontowährung angegeben ist. Wenn Sie es also durch Ihr Risiko teilen, erhalten Sie eine reine Zahl, und die Einheiten heben sich wieder auf: $risk(BAL%)/$risk(SL). Wenn Sie ein Vielfaches davon brauchen, machen Sie etwas falsch oder die Werte des Brokers sind durcheinander.
 
WHRoeder:
Proximus:

BUY eröffnet bei ASK, geschlossen bei BID SELL eröffnet bei BID, geschlossen bei ASK

2) Ich kann OrderOpenprice nicht verwenden

3) Ich verstehe das nicht.

4) t, wenn ich sie teile, erhalte ich die falsche Zahl, vielleicht für USD-Konten sollte so getan werden, aber es ist ein EUR-Konto.Sie müssen multipliziert werden.

  1. Der Ask ist der OrderOpenPrice für einen Kauf.
  2. Der Bid ist der OrderOpenPrice für einen Verkauf. Warum können Sie ihn nicht verwenden, Sie müssen ihn doch kennen, um ihn an OrderSend zu übergeben?
  3. Sie MÜSSEN tickvalue/ticksize verwenden. Tickvalue allein ist bedeutungslos.
  4. Sie MÜSSEN dividieren, um die korrekten Einheiten zu erhalten (Change in price) * (tickValue) /(change in price) gibt Ihnen einen Wert. $10 pro Pip = $1 pro Punkt = Wert/Änderung. Denken Sie daran, dass das Ergebnis in der Kontowährung angegeben ist. Wenn Sie es also durch Ihr Risiko teilen, erhalten Sie eine reine Zahl, und die Einheiten heben sich wieder auf: $risk(BAL%)/$risk(SL). Wenn Sie ein Vielfaches davon brauchen, machen Sie etwas falsch oder die Werte des Brokers sind durcheinander.


1,2 Das weiß ich, aber ich verstehe, dass das von einer anderen Funktion gehandhabt wird, die nichts mit dieser Funktion zu tun hat

3) Wie ich verstehe, ist der Tickvalue der Wert von 1 Pip in der Basiswährung, so dass je nach dem, welches Paar ich verwende, entweder geteilt oder mit ihm multipliziert werden muss.Im Falle eines EUR-Kontos scheint es, dass wir multiplizieren und nicht teilen müssen.

Hier ist ein Bild, das es besser veranschaulicht:


Auf dem EUR/USD für ein 3% Risiko Handel müssen wir 1798 Einheiten, gerundet 0,02 LOTS in MT4 Einheiten öffnen, um das zu erreichen.

Die STOPLOSS-Größe wird durch eine andere Funktion bestimmt.

Es scheint richtig zu sein, da ich es getestet habe, aber ich bin mir nicht sicher, ob die Formel wirklich genau ist, das ist es, was ich hier versuche zu bestimmen, also bitte helfen Sie mir dabei.

 

Auch ich habe versucht, diese Losgrößenberechnung auf der Grundlage von SL, Kontorisiko UND Margin Call Level herauszufinden, insbesondere wenn das Margin Call Level nicht 100 %, sondern z. B. 120 % beträgt. Die beste Antwort, die ich gefunden habe, ist das, was WHRoeder hier in seinem whrea.mq4 Code geteilt hat. Der whrea.mq4 Code brauchte einige Korrekturen, aber WHRoeder hat diese Korrekturen bereits hier in seiner Antwort auf RaptorUKs Kommentar gegeben. Die vollständige Antwort auf die Berechnung der Losgröße ist also da, aber es ist etwas Aufwand erforderlich, um zu verstehen, was WHRoeder mitgeteilt hat.

Ich habe den Code angehängt, den ich aus WHRoeders whrea.mq4 extrahiert und modifiziert habe, damit er mit dem neuesten MT4-Build kompiliert werden kann, um die Losgröße für einen Long-Trade zu berechnen, bei dem das Margin Call Level mehr als 100% beträgt.

Ich bin mir jedoch nicht sicher, ob die Multiplikation mit dem MarginCallLevel % korrekt ist, um das Margin Call Level % zu berücksichtigen und einen Margin Call zu vermeiden. Wenn das MarginCallLevel 100 % beträgt, wären beide Codezeilen korrekt, aber wenn das MarginCallLevel 120 % beträgt, wäre dann die Multiplikation mit dem MarginCallLevel % ein korrekter Margin Call-Test? Wenn nicht, wie ist dies dann richtig zu machen? WHRoeder, können Sie mir hier helfen? William, ich habe mein Bestes versucht.

Hier ist der Code aus dem Abschnitt Margin Test für einen Long-Handel:

extern double MarginCallLevel = 120; //As a percentage

double MarginCallLevel1 = MarginCallLevel * 0.01; 

        double  AFMC    = AccountFreeMarginCheck(Symbol(), OP_BUY, tradesize),
                        eRisk   = equityatrisk + atrisknew;

        //Test for margin
        //Note: Not sure if multiplying by the MarginCallLevel % here is correct to 
        //take the Margin Call Level % into account for avoiding a margin call.
        //If the MarginCallLevel is 100% then both lines of code would be correct
        //but if the MarginCallLevel is 120% would multiplying by the MarginCallLevel %
        //be a correct Margin Call test? If not, then what is the correct way to do this?

        //if (AFMC*0.99 <= eRisk){
        if (AFMC*0.99 <= eRisk*MarginCallLevel1){
            tradesize *= 0.95;    // Must still round to lotStep.
            continue;   }   // Prevent margin call if new trade goes against us.
Dateien:
 

... in diesem Teil des Codes ist ein Problem mit neuen Kompilierung (Fehler ---> 'MarketInfo' - illegale switch Ausdruckstyp) vielleicht war es alles OK, bis das Update auf MT4 build 600+ ... aber seitdem funktioniert es nicht mehr.

// Function to Determine Pip Point Value in Account Currency

        double dblPipValue( string strSymbol )
        {
                double dblCalcPipValue = dblTickValue( strSymbol );
                switch ( MarketInfo( strSymbol, MODE_DIGITS ) )
                {
                        case 3:
                        case 5:
                                dblCalcPipValue *= 10;
                                break;
                }
                
                return( dblCalcPipValue );
        }
        

Könnten Sie also bitte eine neuere Version posten ... wenn Sie natürlich noch da sind.


Grund der Beschwerde: