Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1415
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Such mal nach (englisch bringt mehr) "calculate lotsize": https://www.mql5.com/en/search#!keyword=calculate%20lotsize&module=mql5_module_forum
Wobei man natürlich die 0.9 in (1 - maxRisk) abändern und eine vom Nutzer einstellbare "Maximales Risko in %"-Property implementieren kann.
P.S. Siezt man oder Duzt man hier im Forum?Danke für die Informationen. In The checks a trading robot must pass wird eine Methode "CheckMoneyForTrade" angeführt, welche überprüft, ob die für den Trade aufzuwendende Margin größer als die freie Margin (ACCOUNT_FREE_MARGIN) ist. Wenn ich dich richtig verstanden habe, dann sollte man zusätzlich prüfen, ob die aufgewendeten Mittel auch einen gewissen Prozentsatz des Kontostandes übertrifft, also so etwas wie:
Wobei man natürlich die 0.9 in (1 - maxRisk) abändern und eine vom Nutzer einstellbare "Maximales Risko in %"-Property implementieren kann.
P.S. Siezt man oder Duzt man hier im Forum?Über die Losgröße stolpert jeder und es gibt hier jede Menge Codes und Kommentare!
Ich habe jetzt mal für MT5 zusammengepuzzelt, was William Roeder geschrieben hat, das wäre die ungetestet(!!) Funktion:
(https://www.mql5.com/en/forum/133792/page3#comment_3405179 & https://www.mql5.com/en/forum/390088#comment_28092477)
Sag bitte, wenn Du einen Fehler findest!
Da hier die meisten irgendwie anonym sind mit ihren Spitznamen oder Vornamen und das früher noch mehr so war, hat sich das Du eingebürgert.
Danke für den code. Es fehlte nur die Anpassung an eine valide Lot-Zwischengröße:
Dazu hätte ich noch eine Frage: Wenn ich den Verlust eines ausgestopten Handels mit TICK_VALUE berechne oder eben auch mit deltaValue wie oben, dann kommt immer ein leicht anderes Ergebnis als bei der MQL5-internen Berechnung heraus:
Liegt das daran, dass sich der Verlust/Gewinn pro Tick bei einem EUR-Konto und für den Börsenkurs 1,0 und den Börsenkurs 1,2 unterscheidet? Denn wenn ich in den unteren Code bspw. statt price "price + 0.1" und statt sl "sl + 0.1" eingebe, dann ist der Tick-Abstand (diff) gleich, aber die jeweils von OrderCalcProfit ausgegebenen Ergebnisse sind unterschiedlich. Und wenn ich auf die Gewinne/Verluste schaue, die ich bei den manuellen Trades erhalte, dann scheint mir letzteres bestätigt zu sein.
Sollte ich Recht haben, dann wäre folgender code genauer:
P.S. Nochmals danke für die Grundidee: den risk-Faktor nicht an die balance, sondern an die freie Margin zu binden, ist eindeutig sinnvoll.Der folgende Code wurde nach dem mql 5 eigenen Experten Parabolic Sar erstellt. Kann ich den Vorgang des Kaufsignals und des Verkaufssignals hier umkehren? Das heißt, wenn das Kaufsignal kommt, möchte ich, dass es Verkäufe eröffnet, anstatt zu kaufen. kann jemand helfen?
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link"https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Include |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- verfügbare Signale
#include <Expert\Signal\SignalSAR.mqh>
//--- verfügbare Trailing
#include <Expert\Trailing\TrailingNone.mqh>
//--- verfügbares Geldmanagement
#include <Expert\Money\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Inputs |
//+------------------------------------------------------------------+
//--- Eingaben für Experte
input string Expert_Title ="sar"; // Name des Dokuments
ulong Expert_MagicNumber =13831; //
bool Expert_EveryTick =false; //
//--- Eingaben für das Hauptsignal
input int Signal_ThresholdOpen =10; // Signalschwellenwert zum Öffnen [0...100]
input int Signal_ThresholdClose=10; // Signalschwellenwert zum Schließen [0...100]
input double Signal_PriceLevel =0.0; // Preisniveau für die Ausführung eines Geschäfts
input int Signal_Expiration =4; // Verfall von schwebenden Aufträgen (in Takten)
input double Signal_SAR_Step =0.02; // Parabolischer SAR(0.02,0.2) Geschwindigkeitsschritt
input double Signal_SAR_Maximum =0.2; // Parabolic SAR(0.02,0.2) Maximale Geschwindigkeit
input double Signal_SAR_Gewicht =1.0; // Parabolic SAR(0.02,0.2) Gewicht [0....1.0]
//--- Eingaben für Geld
Eingabe double Geld_FixLot_Prozent =10.0; // Prozent
input double Money_FixLot_Lots =0.1; // Festes Volumen
//+------------------------------------------------------------------+
//| Globales Expertenobjekt |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Initialisierungsfunktion des Experten |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Initialisierung des Experten
if(!ExtExpert.Init(Symbol(),Zeitraum(),Expert_EveryTick,Expert_MagicNumber))
{
//----- fehlgeschlagen
printf(__FUNCTION__+": Fehler beim Initialisieren des Experten");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Signal erzeugen
CExpertSignal *signal=new CExpertSignal;
if(signal==NULL)
{
//----- fehlgeschlagen
printf(__FUNCTION__+": Fehler beim Erzeugen des Signals");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//---
ExtExpert.InitSignal(Signal);
signal.ThresholdOpen(Signal_ThresholdOpen);
signal.ThresholdClose(Signal_ThresholdClose);
signal.PriceLevel(Signal_PriceLevel);
signal.Expiration(Signal_Expiration);
//--- Filter CSignalSAR erstellen
CSignalSAR *filter0=new CSignalSAR;
if(filter0==NULL)
{
//----- fehlgeschlagen
printf(__FUNCTION__+": Fehler beim Erstellen von filter0");
ExtExpert.Deinit();
return(INIT_FAILED);
}
signal.AddFilter(filter0);
//--- Filterparameter setzen
filter0.Step(Signal_SAR_Step);
filter0.Maximum(Signal_SAR_Maximum);
filter0.Gewicht(Signal_SAR_Gewicht);
//--- Erzeugen des Trailing-Objekts
CTrailingNone *trailing=new CTrailingNone;
if(trailing==NULL)
{
//----- fehlgeschlagen
printf(__FUNCTION__+": Fehler bei der Erstellung von Trailing");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Trailing zum Experten hinzufügen (wird automatisch gelöscht))
if(!ExtExpert.InitTrailing(trailing))
{
//----- fehlgeschlagen
printf(__FUNCTION__+": Fehler beim Initialisieren der Nachsilbe");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Schleppende Parameter setzen
//--- Erzeugen eines Geldobjekts
CMoneyFixedLot *money=new CMoneyFixedLot;
if(Geld==NULL)
{
//----- fehlgeschlagen
printf(__FUNCTION__+": Fehler beim Erstellen von Geld");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Geld zum Experten hinzufügen (wird automatisch gelöscht))
if(!ExtExpert.InitMoney(Geld))
{
//----- fehlgeschlagen
printf(__FUNCTION__+": Fehler beim Initialisieren von Geld");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Geld-Parameter setzen
money.Percent(Money_FixLot_Percent);
Geld.Lots(Geld_FixLot_Lots);
//--- Alle Parameter der Handelsobjekte prüfen
if(!ExtExpert.ValidationSettings())
{
//----- fehlgeschlagen
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Einstellen aller notwendigen Indikatoren
if(!ExtExpert.InitIndicators())
{
//----- fehlgeschlagen
printf(__FUNCTION__+": Fehler beim Initialisieren der Indikatoren");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- ok
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Deinitialisierungsfunktion des Experten |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ExtExpert.Deinit();
}
//+------------------------------------------------------------------+
//| "Tick"-Ereignishandlerfunktion |
//+------------------------------------------------------------------+
void OnTick()
{
ExtExpert.OnTick();
}
//+------------------------------------------------------------------+
//| "Handel" Ereignisbehandlungsfunktion
//+------------------------------------------------------------------+
void OnTrade()
{
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| "Timer"-Ereignishandler-Funktion
//+------------------------------------------------------------------+
void OnTimer()
{
ExtExpert.OnTimer();
}
//+------------------------------------------------------------------+
So hab jetzt Zeit gehabt für Deine Lösung. Sie ist genauer (während die andere vorsichtiger ist, da die Kommission berücksichtigt wird?) und sie ist anscheinend weniger fehleranfällig, wie sich bei Gold und Silber des Demo-Kontos bei MQ zeigt - bei Roboforex ist es wie zu erwarten, etwas vorsichtiger, als Deine Lösung:
Auf dem MQ-Konto wären die Losgrößen viel zu hoch.
Hier mein Skript zum Vergleich von beiden Verfahren:
Die Richtung habe ich abgeleitet aus in > sl (buy) oder in < sl (sell). Dann gäbe es keine Probleme mit den Schwebenden Aufträgen (pending orders)
Danke für Deine Tests. Ja, wenn man die Ergebnisse miteinander vergleicht, dann sieht man einerseits die Konstanz von OrderCalcProfit und andererseits, zumindest bei EURUSD und bei RoboForex, dass die Ergebnisse in Etwa um "Lotgröße * CommissionPerLot" voneinander abweichen. Das könnte man noch einpflegen:
Wenn ich die Forensuche richtig benutzt habe, dann gibt es keine Möglichkeit den Wert "CommissionPerLot" direkt mithilfe von MQL5 abzufragen, oder?
Wenn ich die Forensuche richtig benutzt habe, dann gibt es keine Möglichkeit den Wert "CommissionPerLot" direkt mithilfe von MQL5 abzufragen, oder?Ja nicht direkt im Terminal, aber beim Broker anfragen oder in der Handelshistorie: DEAL_COMMISSION.