Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1415

 
  1. Also bei den meisten Broker kommen heute keine Margin-Calls mehr, da, bevor ein Konto ins Minus fällt (und man Geld nachschießen müsste: der Margin-Call), alle Positionen (automatisch?) geschlossen werden.
  2. Margin ist der Betrag, der für eine offenen Position quasi als Pfand angesehen wird, ACCOUNT_MARGIN_FREE ist dann der Rest (nicht belegter Teil).
  3. Man sollte maximal  zwischen 5% und 10% vom Kontostand (-saldo, balance) oder Kaptialstand (Kontostand + offene Positionen, equity) zum Handeln verwenden, um zu verhindern, dass aus Kapitalnot und Verlust in Positionen die Positionen geschlossen werden.
  4. Das Risiko einer Position hängt ab vom SL und der Losgröße, da SL meist aus technischen Gründen festgelegt ist, wird die Losgröße zur Risikoberechnung verwendet:
    Such mal nach (englisch bringt mehr) "calculate lotsize": https://www.mql5.com/en/search#!keyword=calculate%20lotsize&module=mql5_module_forum
  5. Tipp die meisten Artikel gibt es auch in deutsch, mann muss nur in der URL das /en/ durch /de/ ersetzen: https://www.mql5.com/de/articles/2555
 
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:
 if (freeMargin - tradeMargin < balance * 0.9) return false;

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?
 
Benjamin Fotteler #:
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)

double lotsz (double risk, double sl, ENUM_ORDER_TYPE ordDir, string sym="", double CommissionPerLot=0) {
   MqlTick mqTick;
   if (sym == "") sym = _Symbol;
   double deltaValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   SymbolInfoTick(sym,mqTick); 
   double diff = (ordDir==ORDER_TYPE_BUY) ? mqTick.ask - sl : ( (ordDir==ORDER_TYPE_SELL) ? sl - mqTick.bid : -1.0 );
   if (diff<0.0) return(0.0);
   double lts = ( (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk/100) / (diff * deltaValue + CommissionPerLot) );
   return( fmin(fmax(SymbolInfoDouble(sym,SYMBOL_VOLUME_MIN),lts),SymbolInfoDouble(sym,SYMBOL_VOLUME_MAX)));
}
// use: lotsz(5, sl)

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.

Why is there NO Complete EA within the Code-Base? - When does the market close or open?
Why is there NO Complete EA within the Code-Base? - When does the market close or open?
  • 2011.08.20
  • www.mql5.com
I wanted to close all orders before end of the week (market close friday,) to prevent loss should the market gap over the week end, by passing the sl. ) so the question is when does the market close (or open. For example info on opened charts and history data, time info (like gmt, timezone, dst), market open, close info
 

Danke für den code. Es fehlte nur die Anpassung an eine valide Lot-Zwischengröße:

double lotsz (double risk, double sl, ENUM_ORDER_TYPE ordDir, string sym="", double CommissionPerLot=0) {
   MqlTick mqTick;
   if (sym == "") sym = _Symbol;
   double deltaValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   SymbolInfoTick(sym,mqTick); 
   double diff = (ordDir==ORDER_TYPE_BUY) ? mqTick.ask - sl : ( (ordDir==ORDER_TYPE_SELL) ? sl - mqTick.bid : -1.0 );
   if (diff<0.0) return(0.0);
   double lts = ( (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk/100) / (diff * deltaValue + CommissionPerLot) );
   lts = ( fmin(fmax(SymbolInfoDouble(sym,SYMBOL_VOLUME_MIN),lts),SymbolInfoDouble(sym,SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return ((int)MathRound(lts/stepSize)*stepSize);
}
// use: lotsz(5, sl)

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:

double price=(ordDir==ORDER_TYPE_BUY) ? mqTick.ask : ((ordDir==ORDER_TYPE_SELL) ? mqTick.bid : mqTick.last);
double loss;
OrderCalcProfit(ordDir, sym, 1, price, sl, loss)

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:

double lotsz (double risk, double entry, double sl, ENUM_ORDER_TYPE ordDir, string sym="", double CommissionPerLot=0) {
   if (sym == "") sym = _Symbol;
   double loss;
   OrderCalcProfit(ordDir, sym, 1, entry, sl, loss);
   double lts = ((AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01) / -loss);
   lts = (fmin(fmax(SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN), lts), SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return ((int)MathRound(lts / stepSize) * stepSize);
}
// use: lotsz(5, ask, sl)
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();

}

//+------------------------------------------------------------------+


 
Interessanter Vorschlag, ich schau mir den mal an. Die Funktion OrderCalcProfit() gibt es nur in MT5 und die Ideen zu Lot-Berechnung stammen noch aus MT4 Zeiten...
 
Ich kann meine Sitzung in der App nicht öffnen, um zu sehen, wie viel Geld ich habe.
 

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:

MetaQuotes demo account (b. 3369 Beta channel)
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   XAUUSD  in: 1717.65000 sl:1717.15000  diff:0.50000  delta:10.00000  delta:*diff:5.00000  tVal:0.10000  tSz:0.01000
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   XAGUSD  in: 18.45100 sl:18.40100  diff:0.05000  delta:500.00000  delta:*diff:25.00000  tVal:0.50000  tSz:0.00100
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   EURUSD  in: 1.02185 sl:1.02235  diff:0.00050  delta:97861.72139  delta:*diff:48.93086  tVal:0.97862  tSz:0.00001
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 9983.40 EUR:  XAUUSD  BU  in: 1717.65000  sl: 1717.15000  lotsC: 71.3100 (-3489.26)  lotsB: 10.2000 (-499.09)
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 9983.40 EUR:  XAGUSD  BU  in: 18.45100  sl: 18.40100  lotsC: 18.4900 (-4523.66)  lotsB: 2.0400 (-499.09)
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 9983.40 EUR:  EURUSD  SE  in: 1.02185  sl: 1.02235  lotsC: 9.8000 (-479.29)  lotsB: 10.2100 (-499.34)


RoboForex Demo account (b. 3320 release channel)
2022.07.25 17:46:22.772 test_MM-functions (EURUSD,D1)   XAUUSD  in: 1717.10000 sl:1717.15000  diff:0.05000  delta:100.00000  delta:*diff:5.00000  tVal:0.10000  tSz:0.00100
2022.07.25 17:46:22.772 test_MM-functions (EURUSD,D1)   XAGUSD  in: 18.43400 sl:18.43350  diff:0.00050  delta:5000.00000  delta:*diff:2.50000  tVal:0.05000  tSz:0.00001
2022.07.25 17:46:22.772 test_MM-functions (EURUSD,D1)   EURUSD  in: 1.02186 sl:1.02236  diff:0.00050  delta:100000.00000  delta:*diff:50.00000  tVal:1.00000  tSz:0.00001
2022.07.25 17:46:22.773 test_MM-functions (EURUSD,D1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 5348.69 USD:  XAUUSD  SE  in: 1717.10000  sl: 1717.15000  lotsC: 38.2000 (-191.00)  lotsB: 53.4900 (-267.45)
2022.07.25 17:46:22.773 test_MM-functions (EURUSD,D1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 5348.69 USD:  XAGUSD  BU  in: 18.43400  sl: 18.43350  lotsC: 59.4300 (-148.57)  lotsB: 106.9700 (-267.42)
2022.07.25 17:46:22.773 test_MM-functions (EURUSD,D1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 5348.69 USD:  EURUSD  SE  in: 1.02186  sl: 1.02236  lotsC: 5.1400 (-257.00)  lotsB: 5.3500 (-267.50)

Auf dem MQ-Konto wären die Losgrößen viel zu hoch.

Hier mein Skript zum Vergleich von beiden Verfahren:

//+------------------------------------------------------------------+
//|                                            test_MM-functions.mq5 |
//|                                                            Calli |
//|                              https://www.mql5.com/de/users/gooly |
//+------------------------------------------------------------------+
#property copyright "Calli"
#property link      "https://www.mql5.com/de/users/gooly"
#property version   "1.00"
#property script_show_inputs
//--- input parameters
input double   risk_perCent   = 5.0;   // risk of capital in % on free_margin
input double   diff_sl        = 50;    // diff sl in points from entry
input double   CommPerLot     = 2.00;  

string Com = "",Syms[] = {"XAUUSD", "XAGUSD", "EURUSD" }; //,"AUDUSD","GBPCHF","GBPUSD", "EURCAD", "USDCAD", "USDRUB", "GBPJPY", "USDJPY"};

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
#define forEach(TYPE, VAR, ARRAY) \
                TYPE VAR=NULL; \
                for(int i##VAR=0; i##VAR<ArraySize(ARRAY)&&((VAR=ARRAY[i##VAR])!=NULL||true); i##VAR++)

void OnStart()
  {
//---
   MqlTick mqTick;
   forEach(string, sym, Syms){
      
      double pnt = SymbolInfoDouble(sym,SYMBOL_POINT);
      ENUM_ORDER_TYPE ord = GetMicrosecondCount()%2==0 ? ORDER_TYPE_BUY : ORDER_TYPE_SELL; // randomly buy or sell
      SymbolInfoTick(sym,mqTick); 
      double entry = (ord==ORDER_TYPE_BUY) ? mqTick.ask : mqTick.bid,
             sl    = (ord==ORDER_TYPE_BUY) ? entry - diff_sl*pnt : entry + diff_sl*pnt,
             lossC = 0.0, lossB = 0.0,
             lotsC = lotszC(risk_perCent, entry, sl, sym, CommPerLot), 
             lotsB = lotszB(risk_perCent, entry, sl, sym, CommPerLot);
      
      if (!OrderCalcProfit(ord, sym, lotsC, entry, sl, lossC) ) 
         Print("chk OrderCalcProfit(",EnumToString(ord),", ",sym,", lot: ",lotsC,", in: ",DoubleToString(entry,6),", out: ",DoubleToString(sl,6),", lossC) => err: ",_LastError," lossC: ",lossC);
             
      if (!OrderCalcProfit(ord, sym, lotsB, entry, sl, lossB) ) 
         Print("chk OrderCalcProfit(",EnumToString(ord),", ",sym,", lot: ",lotsC,", in: ",DoubleToString(entry,6),", out: ",DoubleToString(sl,6),", lossC) => err: ",_LastError," lossC: ",lossC);
             
      string res = StringFormat("Set: Risk: %.1f %%, dSL: %.0f  Com/Lot: %.2f  Free: %.2f %s:  %s  %s  in: %.5f  sl: %.5f  lotsC: %.4f (%+.2f)  lotsB: %.4f (%+.2f)",
                                 risk_perCent, diff_sl, CommPerLot,
                                 AccountInfoDouble(ACCOUNT_MARGIN_FREE),AccountInfoString(ACCOUNT_CURRENCY),
                                 sym, (ord==ORDER_TYPE_BUY ? "BU" : "SE"), entry, sl, lotsC, lossC, lotsB, lossB );
      Com = Com + res+"\n";
   }
   Comment(Com);
   //Print(Com);
  }
//+------------------------------------------------------------------+
double lotszC (double risk, double entry, double sl, string sym="", double CommissionPerLot=0) {
   if (sym == "") sym = _Symbol;
   double deltaValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   ENUM_ORDER_TYPE ordDir = entry > sl ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
   double diff = fabs (entry - sl); 
   Print(sym,"  in: ",DoubleToString(entry,5)," sl:",DoubleToString(sl,5),"  diff:",DoubleToString(diff,5),
         "  delta:",DoubleToString(deltaValue,5),"  delta:*diff:",DoubleToString(deltaValue*diff,5),
         "  tVal:",DoubleToString(SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE),5),"  tSz:",
         DoubleToString(SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE),5));
   double lts = ( (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk/100) / (diff * deltaValue + CommissionPerLot) );
   lts = ( fmin(fmax(SymbolInfoDouble(sym,SYMBOL_VOLUME_MIN),lts),SymbolInfoDouble(sym,SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return (MathRound(lts/stepSize)*stepSize);
}

double lotszB (double risk, double entry, double sl, string sym="", double CommissionPerLot=0) {
   if (sym == "") sym = _Symbol;
   ENUM_ORDER_TYPE ordDir = entry > sl ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
   double loss;
   if (!OrderCalcProfit(ordDir, sym, 1, entry, sl, loss)) return(-1.0);
   double lts = ((AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01) / -loss);
   lts = (fmin(fmax(SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN), lts), SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return (MathRound(lts / stepSize) * stepSize);
}

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:

if (!OrderCalcProfit(ordDir, sym, 1, entry, sl, loss)) return(-1.0);
double lts = ((AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01) / (-loss + CommissionPerLot);
Wenn ich die Forensuche richtig benutzt habe, dann gibt es keine Möglichkeit den Wert "CommissionPerLot" direkt mithilfe von MQL5 abzufragen, oder?
 
Benjamin Fotteler #:


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.

Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Eigenschaften der Deals
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Eigenschaften der Deals
  • www.mql5.com
Eigenschaften der Deals - Handelskonstanten - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
Grund der Beschwerde: