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
{
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));
}
Vielen Dank.
Ich will gerade anfangen, den Code zu schreiben :)
Sie haben mir mehr Zeit erspart.
Vielen Dank!
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!
Ich brauche also einen guten Rat, bitte.
02:00:00.069 - custom expert EURUSD,H1: | _lotSize - DoubleToString : 0.07
Ich glaube, Sie brauchen noch NormalizeDouble().
Hier ist ein Beispiel, das Ihren Codeschnipsel verwendet (dasselbe gilt für mein Beispiel mit MathFloor):
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:
Ergebnis:
Jetzt Code angepasst:
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:
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.)
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 - 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.