Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Twitter!
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:
1237
Rating:
(23)
Veröffentlicht:
2017.03.20 08:43
Aktualisiert:
2018.02.15 17:30
MQL5 Freelance 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 je nach dem Risiko auf das Geschäft.

Erneut: am 28 Dezember 2016 -> Version 1.001

Was sich verändert hat:

Es wurden zwei Varianten der Anzeige (des Ausdruckens) des berechneten Lotes hinzugefügt. Die Variante 1 — beim Hinweis StopLoss, welcher gleich Null ist.

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

und  die Variante 2 — siehe. im Listing des Kodes unten:

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

Auch wird nun das Ergebnis der Handelsoperation geprüft:

            if(m_trade.Buy(chek_volime_lot,NULL,m_symbol.Ask(),m_symbol.Bid()-ExtStopLoss,m_symbol.Bid()+ExtStopLoss))
              {
               if(m_trade.ResultDeal()==0)
                  count--;

              }
            else
               count--;

Die erste Überprüfung: wenn das Arbeitsende der Methode Buy  "true" zurückgegeben hat, aber dabei der Wert, der von der Methode  ResultDeal()  zurückgegeben ist, "0" zurückgegeben hat(das passiert manchmal, zum Beispiel bei Requote) — den Zähler "count" verringern wir um 1.

Die zweite Überprüfung: wenn das Arbeitsende der Methode Buy  "false" zurückgegeben hat — den Zähler "count" verringern wir um 1.

Wofür muss man den Zähler "count" um 1 verringern? Um wieder auf 980 Ticks nicht zu warten, und, um zu versuchen, sofort im folgenden Tick zu kommen.

Wie funktioniert das: 

Es wird der Risikoanteil (der Parameter % risk) und StopLoss angegeben (der Parameter StopLoss (in pips)). So werden die Parameter des möglichen Verlustes des Depositums bestimmt.

Die Eingangsparameter Money Fixed Risk 

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 (CMoneyFixedRisk)

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). Das heißt 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 (CMoneyFixedRisk)
      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 CMoneyFixedRisk 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 (und 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 (für die Überprüfung im Tester wählen Sie EURUSD, M1, die Periode der Prüfung von 2016.11.28, das Depositum $3000 aus):

Money Fixed Risk.png 

Es wurde die Position Buy (das Ausdrucken aus der Journal des Testers) geöffnet — der berechnete Umfang des Lotes unter Berücksichtigung des Risikos auf das Geschäft hat 2.23. beträgt

Money Fixed Risk (EURUSD,M1)    2016.11.28 00:03:24   sl=0.0 CheckOpenLong: 0.01, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Money Fixed Risk (EURUSD,M1)    2016.11.28 00:03:24   sl=1.05942 CheckOpenLong: 2.23, Balance: 3000.00, Equity: 3000.00, FreeMargin: 3000.00
Trade   2016.11.28 00:03:32   instant buy 2.23 EURUSD at 1.06076 sl: 1.05942 tp: 1.06142 (1.06042 / 1.06076 / 1.06042)
Trades  2016.11.28 00:03:32   deal #2 buy 2.23 EURUSD at 1.06076 done (based on order #2)
Trade   2016.11.28 00:03:32   deal performed [#2 buy 2.23 EURUSD at 1.06076]
Trade   2016.11.28 00:03:32   order performed buy 2.23 at 1.06076 [#2 buy 2.23 EURUSD at 1.06076]
Money Fixed Risk (EURUSD,M1)    2016.11.28 00:03:32   CTrade::OrderSend: instant buy 2.23 EURUSD at 1.06076 sl: 1.05942 tp: 1.06142 [done at 1.06076]
Money Fixed Risk (EURUSD,M1)    2016.11.28 00:48:32   sl=0.0 CheckOpenLong: 0.01, Balance: 3000.00, Equity: 2828.29, FreeMargin: 462.80
Money Fixed Risk (EURUSD,M1)    2016.11.28 00:48:32   sl=1.05899 CheckOpenLong: 2.60, Balance: 3000.00, Equity: 2828.29, FreeMargin: 462.80
Money Fixed Risk (EURUSD,M1)    2016.11.28 00:48:32   CMoneyFixedRisk lot = 2.60, CTrade lot = 0.43
Trade   2016.11.28 00:53:15   stop loss triggered #2 buy 2.23 EURUSD 1.06076 sl: 1.05942 tp: 1.06142 [#3 sell 2.23 EURUSD at 1.05942]
Trades  2016.11.28 00:53:15   deal #3 sell 2.23 EURUSD at 1.05942 done (based on order #3)
Trade   2016.11.28 00:53:15   deal performed [#3 sell 2.23 EURUSD at 1.05942]
Trade   2016.11.28 00:53:15   order performed sell 2.23 at 1.05942 [#3 sell 2.23 EURUSD at 1.05942]

Beim zweiten Eintritt in den Umlauf zeigte es sich, dass das Geld für die Eröffnung der zweiten Position fehlt.

Beachten Sie bitte auch auf das Ausdrucken des berechneten Lotes, wenn StopLoss nicht gegeben ist (wenn StopLoss=0.0 ist) — wenn StopLoss nicht gegeben wird, so wird das berechnete Lot dem minimal möglichen Lot gleich sein.

Im Endeffekt wurde die Position nach StopLoss mit dem Verlust 298.82 geschlossen:

Money Fixed Risk history

Das entspricht fast dem Risiko 10 % vom Depositum 3000.

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

Hercules A.T.C. 2006 Hercules A.T.C. 2006

Der Expert Advisor basiert auf dem Ausbruch des gleitenden Durchschnitts. Es wurden die folgenden Indikatoren verwendet: zwei iMA (Moving Average, MA), iRSI(Relative Strength Index, RSI) und zwei iEnvelopes (Envelopes).

The Puncher The Puncher

Der Handel basiert auf den Indikatoren iStochastic (Stochastic Oscillator) und iRSI (Relative Strength Index, RSI).

up3x1_premium_v2M up3x1_premium_v2M

Zwei iMA auf der laufenden Periode und noch eine auf der PERIOD_D1.

ShowImportantParams ShowImportantParams

Es zeigt die wichtigen Parameter des Instruments und des Kontos.