expert advisor - verschiedene Fragen - Seite 3

 
double LotCalculator(double lots)
  {
   double minlot  = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),
          maxlot  = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX),
          lotstep = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   lots = MathFloor(lots/lotstep)*lotstep;
   lots = MathMax(lots,minlot);
   lots = MathMin(lots,maxlot);
   return(NormalizeDouble(lots,2));
  }
 
honest_knave:
double LotCalculator(double lots){}

Vielen Dank.

Ich will gerade anfangen, den Code zu schreiben :)

Sie haben mir mehr Zeit erspart.

Vielen Dank!

 
Ich erhalte dieselbe Meldung für die Losgröße.
Ich rufe 'LotCalculator()' in 'OnChartEvent()' auf, ist das nicht richtig?
 

Ich bin auf der Suche nach einem guten Forum für'MarketInfo & LotSize' Berechnung.
Wer weiß, dass die Art der guten Forum bitte mit mir teilen.

Danke!

 
Haben Sie zufällig meinen Codeschnipsel verwendet, bevor ich die letzte Zeile (NormalizeDouble) bearbeitet habe? Ich sehe, dass zwischen meinem Beitrag und deinem nur 3 Minuten lagen, und ich habe ihn fast sofort bearbeitet.
 
Max Enrik: Ich verwende NormalizeDouble für meine EAs. Aber ich mache mir Sorgen über die'NormalizeDouble'-Meldung, aber ich sehe die Losgröße auf dem Chart wie folgt: 0.07

Ich brauche also einen guten Rat, bitte.

02:00:00.069 - custom expert EURUSD,H1: | _lotSize - NormalizeDouble: 0.07000000000000001
02:00:00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07
  1. NormalizeDouble gibt ein Double zurück. Fließkomma hat unendlich viele Nachkommastellen, es ist Ihr nicht verstehen, Fließkomma und dass einige Zahlen nicht genau dargestellt werden können. (z.B. 1/10.) Double-precision floating-point format - Wikipedia, the free encyclopedia Siehe auch Der == Operand. - MQL4-Forum
  2. Verwenden Sie NICHT NormalizeDouble, NIEMALS. Aus JEDEM Grund. Es ist ein Trick, verwenden Sie ihn nicht. Seine Verwendung ist immer falsch.
 
whroeder1:
  1. Verwenden Sie NICHTNormalizeDouble, NIE. Aus JEDEM Grund. Es ist eine Spielerei, verwenden Sie es nicht.Seine Verwendung ist immer falsch.

Ich glaube, Sie brauchen noch NormalizeDouble().

Hier ist ein Beispiel, das Ihren Codeschnipsel verwendet (dasselbe gilt für mein Beispiel mit MathFloor):

double NormalizeLots(double lots, string pair=""){
    if (pair == "") pair = Symbol();
    double  lotStep     = MarketInfo(pair, MODE_LOTSTEP),
            minLot      = MarketInfo(pair, MODE_MINLOT);
    lots                = MathRound(lots/lotStep) * lotStep;
    if (lots < minLot) lots = 0;    // or minLot
    return(lots);
}

Aufgerufen:

Print(NormalizeLots(2/3.0));

Ergebnis:

0.7000000000000001

Jetzt Code angepasst:

double NormalizeLots(double lots, string pair=""){
    if (pair == "") pair = Symbol();
    double  lotStep     = MarketInfo(pair, MODE_LOTSTEP),
            minLot      = MarketInfo(pair, MODE_MINLOT);
    lots            = MathRound(lots/lotStep) * lotStep;
    if (lots < minLot) lots = 0;    // or minLot
    return(NormalizeDouble(lots,2));
}

Ergebnis:

0.7


 

 Result: 0.7000000000000001

Welcher Teil von "Du verstehst die Fließkommazahl nicht und dass einige Zahlen nicht exakt dargestellt werden können. (z.B. 1/10.) Double-precision floating-point format - Wikipedia, the free encyclopedia" war unklar?

NormalizeDouble(0.7, 2) liefert genau das gleiche Ergebnis (oder möglicherweise 0.69999999999999999.)

 
whroeder1:

Welcher Teil von "Du verstehst die Fließkommazahl nicht und dass einige Zahlen nicht exakt dargestellt werden können. (wie 1/10.) Double-precision floating-point format - Wikipedia, the free encyclopedia" war unklar?

NormalizeDouble(0.7, 2) liefert genau das gleiche Ergebnis (oder möglicherweise 0.69999999999999999).

Ich sage nicht, dass NormalizeDouble() für einen gültigen OrderSend erforderlich ist. Deshalb wurde sie in meinem ersten Codeschnipsel ausgeschlossen. Ich bin auch nicht im Unklaren über die Art und Weise, wie Fließkommazahlen dargestellt werden.

Ich habe das Snippet bearbeitet, um es einzuschließen, weil ich das Gefühl hatte, dass es mein Verständnis des Problems des Auftraggebers besser anspricht (im Wesentlichen ein Anzeigeproblem, das entweder durch die Verwendung von NormalizeDouble() im "Lot Normalizer"-Code oder durch die Verwendung von printf oder DoubleToStr gelöst werden kann, wenn der Wert angezeigt werden muss).

Vielleicht habe ich den OP missverstanden.

02:00:00.069 - custom expert EURUSD,H1: | _lotSize - NormalizeDouble: 0.07000000000000001
02:00:00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07

(bearbeitet, um unnötige Langatmigkeit zu entfernen)

 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- get minimum stop level
   double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
   Print("Minimum Stop Level=",minstoplevel," points");
   double price=Ask;
//--- calculated SL and TP prices must be normalized
   double stoploss=NormalizeDouble(Bid-minstoplevel*Point,Digits);
   double takeprofit=NormalizeDouble(Bid+minstoplevel*Point,Digits);
//--- place market order to buy 1 lot
   int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoploss,takeprofit,"My order",16384,0,clrGreen);
   if(ticket<0)
     {
      Print("OrderSend failed with error #",GetLastError());
     }
   else
      Print("OrderSend placed successfully");
//---
  }

Dies könnte verwirrend sein, da die MQL4-Dokumentation in den meisten Beispielen die Funktion NormalizeDouble() verwendet.

Sie geht sogar so weit, dass sie davor warnt, dass nicht normalisierte Preise nicht angewendet werden können:

Hinweis

Bei der Eröffnung einer Marktorder (OP_SELL oder OP_BUY) können nur die letzten Preise von Bid (für Verkauf) oder Ask (für Kauf) als Eröffnungskurs verwendet werden. Wenn die Operation mit einem anderen Wertpapier als dem aktuellen ausgeführt wird, muss die Funktion MarketInfo() mit dem Parameter MODE_BID oder MODE_ASK verwendet werden, um die letzten Kurse für dieses Wertpapier zu erhalten.

Berechnete oder nicht normalisierte Kurse können nicht verwendet werden. Wenn der angeforderte offene Preis nicht im Preis-Thread vorhanden ist oder nicht entsprechend der Anzahl der Nachkommastellen normalisiert wurde, wird der Fehler 129 (ERR_INVALID_PRICE) erzeugt. Ist der angeforderte offene Preis völlig veraltet, wird unabhängig vom Slippage-Parameter der Fehler 138 (ERR_REQUOTE) generiert. Wenn der angeforderte Preis veraltet, aber im Thread vorhanden ist, wird der Auftrag zum aktuellen Preis eröffnet, und zwar nur dann, wenn der aktuelle Preis innerhalb der Spanne von Preis+Slippage liegt.

Und sogar in einigen der besseren Bücher über MQL wird es ziemlich stark verwendet.

Es hängt vielleicht von der Anwendung ab, ob ein Anzeigeproblem weniger dramatisch ist als Auftrags- oder Änderungsfehler.

Ich persönlich konvertiere immer in ganze Integer-Werte, so dass ich selten damit zu tun.