und werden Sie Mitglied unserer Fangruppe
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Bewerten Sie es im Terminal MetaTrader 5
Money Fixed Risk - Experte für den MetaTrader 5
- Ansichten:
- 1237
- Rating:
- Veröffentlicht:
- 2017.03.20 08:43
- Aktualisiert:
- 2018.02.15 17:30
- 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.
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:
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.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.
Für das Simulieren des Handels wurde ein solcher Umlauf organisiert:
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
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:
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:
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):
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>=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):
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=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:
Das entspricht fast dem Risiko 10 % vom Depositum 3000.
Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/17199
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 PuncherDer Handel basiert auf den Indikatoren iStochastic (Stochastic Oscillator) und iRSI (Relative Strength Index, RSI).
Zwei iMA auf der laufenden Periode und noch eine auf der PERIOD_D1.
ShowImportantParamsEs zeigt die wichtigen Parameter des Instruments und des Kontos.