Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Telegram!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Ansichten:
947
Rating:
(27)
Veröffentlicht:
2017.03.20 09:06
Aktualisiert:
2018.02.22 13:43
Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance

Das Beispiel für die Berechnung der Umfang des Lotes mit der fixierten Ebene der Marge. Das heißt, wenn es 10% eingegeben wird, wird die Position geöffnet, deren Umfang der Marge 10% von der freien Marge beträgt.

Eingangsparameter:

  • StopLoss (in pips) — die Ebene StopLoss
  • % risk — der Umfang der Marge für die Position, die in Prozenten von der freien Marge ist

Für das Simulieren des Handels wurde ein solcher Umlauf organisiert:

   static long count=-21;
   if(count%980==0) // we pass 980 tics
     {
      //--- getting lot size for open long position (CMoneyFixedMargin)

Die Anfangswert count=-21 wird außerordentlich für "die Erwärmung" des Strategietesters gegeben. Weiter wird der Rest von der Teilung der Variable count auf die Zahl 980 berechnet (eine ganz zufällige Zahl). Mit anderen Worten, alle 980 Ticks wird der Eintritt in den Umlauf der Berechnung des Lotes unter Berücksichtigung der Risiken auf das Geschäft durchgeführt.

Der Umlauf der Berechnung des Lotes je nach dem Risiko auf das Geschäft (die Berechnung für die Position Buy):

Der erste Schritt

      //--- getting lot size for open long position (CMoneyFixedMargin)
      double sl=0.0;
      double check_open_long_lot=0.0;
      //--- variant #1: StopLoss=0.0
      sl=0.0;
      check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
      Print("sl=0.0",
            ", CheckOpenLong: ",DoubleToString(check_open_long_lot,2),
            ", Balance: ",    DoubleToString(m_account.Balance(),2),
            ", Equity: ",     DoubleToString(m_account.Equity(),2),
            ", FreeMargin: "DoubleToString(m_account.FreeMargin(),2));
      //--- variant #2: StopLoss!=0.0
      sl=m_symbol.Bid()-ExtStopLoss;
      check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
      Print("sl=",DoubleToString(sl,m_symbol.Digits()),
            ", CheckOpenLong: ",DoubleToString(check_open_long_lot,2),
            ", Balance: ",    DoubleToString(m_account.Balance(),2),
            ", Equity: ",     DoubleToString(m_account.Equity(),2),
            ", FreeMargin: "DoubleToString(m_account.FreeMargin(),2));
      if(check_open_long_lot==0.0)
         return;

In der Variable check_open_long_lot mit Hilfe der Methode CheckOpenLong der Klasse CMoneyFixedMargin bekommen wir den berechneten Umfang des Lotes für die Position Buy unter Berücksichtigung StopLoss:

      double check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),m_symbol.Bid()-ExtStopLoss);

Im Journal der Experten werden solche Parameter gedruckt: StopLoss, der berechnete Umfang des Lotes je nach dem Risiko auf das Geschäft, die Bilanz der Handelsrechnung zum Zeitpunkt der Berechnung, der Umfang der eigenen Mittel am Konto zum Zeitpunkt der Berechnung, der Umfang der reservierten Pfandmittel zum Zeitpunkt der Berechnung. 

Wenn die Berechnung den Wert "0.0" zurückgegeben hat - verlassen wir es:

      if(check_open_long_lot==0.0)
         return;

Der Schritt №2

In der Variable chek_volime_lot mit Hilfe der Methode CheckVolume der Klasse CTrade bekommen wir dden berechneten Umfang des Lotes für die Position Buy, für die wir genug Mittel haben. Hier übergeben wir die folgenden Parameter: m_symbol.Name() — der Name des Symbols, check_open_long_lot — der Umfang der Position, die wir eröffnen wollen ( wir haben diesen Parameter schon früher berechnet): 

      //--- check volume before OrderSend to avoid "not enough money" error (CTrade)
      double chek_volime_lot=m_trade.CheckVolume(m_symbol.Name(),check_open_long_lot,m_symbol.Ask(),ORDER_TYPE_BUY);

Der Schritt №3

Wenn die Methode CheckVolume nicht "0.0" zurückgegeben hat, überprüfen wir die Bedingung: reichen uns die Mittel für die Eröffnung der Position des berechneten Lotes unter Berücksichtigung des Risikos aus.

      if(chek_volime_lot!=0.0)
         if(chek_volime_lot>=check_open_long_lot)
            m_trade.Buy(chek_volime_lot,NULL,m_symbol.Ask(),m_symbol.Bid()-ExtStopLoss,m_symbol.Bid()+ExtStopLoss);
      else
         Print("CMoneyFixedRisk lot = ",DoubleToString(check_open_long_lot,2),
               ", CTrade lot = ",DoubleToString(chek_volime_lot,2));

Wenn die Mittel ausreichend sind, so öffnen wir die Positionen, wenn nicht — dann werden in die Journal der Experten der berechnete Umfang des Lotes unter Berücksichtigung des Risikos auf das Geschäft (DoubleToString(check_open_long_lot,2)) und der Umfang des Lotes gedruckt, für den wir ausreichend Mittel haben (DoubleToString(chek_volime_lot,2)).

Das Beispiel der Eröffnung der Position Buy, beim 10% das Risiko von der freien Marge:

Money Fixed Margin open.png

Was dabei im Journal veröffentlicht wurde:

Money Fixed Margin (EURUSD,M1)  2016.11.28 00:03:24   sl=0.0, CheckOpenLong: 0.28, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Money Fixed Margin (EURUSD,M1)  2016.11.28 00:03:24   sl=1.05792, CheckOpenLong: 0.28, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Trade   2016.11.28 00:03:31   instant buy 0.28 EURUSD at 1.06076 sl: 1.05792 tp: 1.06292 (1.06042 / 1.06076 / 1.06042)
Trades  2016.11.28 00:03:31   deal #2 buy 0.28 EURUSD at 1.06076 done (based on order #2)
Trade   2016.11.28 00:03:31   deal performed [#2 buy 0.28 EURUSD at 1.06076]
Trade   2016.11.28 00:03:31   order performed buy 0.28 at 1.06076 [#2 buy 0.28 EURUSD at 1.06076]
Money Fixed Margin (EURUSD,M1)  2016.11.28 00:03:31   CTrade::OrderSend: instant buy 0.28 EURUSD at 1.06076 sl: 1.05792 tp: 1.06292 [done at 1.06076]

Bitte beachten Sie, dass bei der Berechnung des Lotes je nach dem Risiko auf die freien Marge, hat StopLoss keinen Sinn.

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/17282

Lucky Lucky

Der Ticks-EA. Der arbeitet auf dem Vergleich der Differenz zwischen dem Preis des vorhergehenden Ticks und des laufenden Preis.

SimpleTrade SimpleTrade

Der Vergleich der Preise der Eröffnung der Null- und dritten Bar.

RSI EA RSI EA

RSI EA - das Handeln nach der Ebenen Überkauf/Überverkauf nach dem Indikator iRSI (Relative Strength Index, RSI).

MA Reverse MA Reverse

Das Handeln nach Moving Average. Die Überprüfung, ob Mittel ausreichend sind.