Positionsgröße mit negativem Wert

 

In meiner Strategie verwende ich die Funktion GetPosSize(), um die Positionsgrößen zu berechnen. Ich verwende die Strategie im Moment nur mit EURUSD und kann beim besten Willen nicht herausfinden, warum posSize einen negativen Wert zurückgibt, was zu einem OrderSend-Fehler 4051 führt. Für jede Hilfe wäre ich sehr dankbar. Ich werde alle relevanten Code hier posten. Im gesamten Code werden keine weiteren Berechnungen zu posSize durchgeführt, nur die Funktion wird aufgerufen. Alle drei separaten Teile des Codes befinden sich innerhalb der Funktion.

double GetPosSize(string symbol, double pipsToSL)
{
   double marginReq;
   double marginAllot = AccountBalance()/Number_of_Pairs;
   double posSize;
   int pairsOpen = OpenOrderCount();
   int pairsNotOpen = Number_of_Pairs - pairsOpen;
   if(symbol == "EURUSD")
   {
      marginReq = 2600;
   }
if(pairsOpen == 0)
   {
      posSize = (marginAllot * (PercentRisk/100)/pipsToSL) / 10;
   }
NormalizeDouble(posSize,2);
   Print(posSize);
   return(posSize);
 

Versuchen Sie, die Werte von marginAllot, PercentRisk und pipsToSL auszudrucken, um einzugrenzen, woher die negative Zahl kommt. Meine spekulative Vermutung ist, dass pipsToSL unter bestimmten Umständen als negative Zahl übergeben wird.

 
  1. NormalizeDouble(posSize,2);
    Diese Zeile bewirkt nichts.
  2. Verwenden Sie NICHT NormalizeDouble, NIE. Aus JEDEM Grund. Es ist ein Trick, verwenden Sie es nicht.Es ist immer falsch.
 
honest_knave:

Versuchen Sie, die Werte von marginAllot, PercentRisk und pipsToSL auszudrucken, um einzugrenzen, woher die negative Zahl kommt. Meine spekulative Vermutung ist, dass pipsToSL unter bestimmten Umständen als negative Zahl übergeben wird.

Ich konnte tatsächlich einige Stellen im restlichen Code finden, an denen pipsToSL fälschlicherweise als negativ berechnet wurde. Danke!

WHRoeder:
  1. Diese Zeile bewirkt nichts.
  2. Verwenden Sie NICHT NormalizeDouble, NIE. Aus JEDEM Grund. Es ist eine Mogelpackung, verwenden Sie es nicht. Seine Verwendung ist immer falsch.

Ich habe schon früher von Ihren Beiträgen zu diesem Thema gelesen, aber ich habe Ihren Standpunkt bis zu Ihrem letzten Link nicht verstanden. Danke!

 

Warum sollte ich immer noch Antworten mit mehreren Dezimalstellen erhalten, wenn ich MathRound() verwende? Ich habe versucht, DoubleToString zu verwenden, aber das hat überhaupt nicht geholfen. Liegt das ausschließlich an den Einschränkungen von Print() oder ist noch etwas anderes falsch?

posSize = posSize * 10;
MathRound(posSize);
posSize = posSize / 10;
 
NoLimitations: Warum sollte ich immer noch Antworten mit mehreren Dezimalstellen erhalten, wenn ich MathRound() verwende?
MathRound gibt einen Double zurück; unendliche Anzahl von Dezimalstellen.
 
WHRoeder:
NoLimitations : Warum erhalte ich immer noch Antworten mit mehreren Dezimalstellen, wenn ich MathRound() verwende?
MathRound gibt einen Double zurück; unendliche Anzahl von Dezimalstellen.

Laut der Dokumentseite für diese Funktion ist das nicht der Fall. https://docs.mql4.com/math/mathround

"Rückgabewert

Wert gerundet auf die nächste Ganzzahl."

Wenn dies der Fall sein sollte, aber nicht der Fall ist, muss MQ benachrichtigt werden, oder es muss ein Warnhinweis auf die Funktion gesetzt werden.

 
JD4 hat Recht, die Doku-Seite sagt, dass es auf die nächste ganze Zahl rundet. Ich bin mir nicht sicher, ob es einen anderen Weg gibt, das zu erreichen, was ich oben versucht habe, ohne zu runden oder eine bestimmte Anzahl von Dezimalstellen abzuschneiden. Was wäre der Sinn von MathRound() oder round(), wenn sie keine ganze Zahl zurückgeben?
 
NoLimitations:
JD4 hat Recht, die Doku-Seite sagt, dass es auf die nächste ganze Zahl rundet. Ich bin mir nicht sicher, ob es einen anderen Weg gibt, das zu erreichen, was ich oben versucht habe, ohne zu runden oder eine bestimmte Anzahl von Dezimalstellen abzuschneiden. Was wäre der Sinn von MathRound() oder round(), wenn sie keine ganze Zahl zurückgeben?
Sie sagten, dass MathRound Ihnen Probleme bereitet. Haben Sie die vorgeschlagene Alternative von round() ausprobiert?
 
Ja, ich habe round() verwendet; es ergab genau die gleichen Werte. Ich habe versucht, MathFloor() oder MathCeil() zu verwenden, um den Wert weniger genau zu berechnen und das Problem vorerst zu umgehen, aber beides scheint auch nichts zu bringen. Ich will einfach nur ein verdammtes Double in ein Int verwandeln hahaha
 

Ich habe auch gerade versucht, dies zu verwenden, ohne Erfolg. Möglicherweise ändert DTS einfach die Genauigkeit eines Wertes für das Aussehen und nicht den tatsächlichen Wert? Ich sehe keine anderen Optionen.

posSize = posSize * 100;
DoubleToString(posSize,0);
StringToDouble(posSize);
posSize = posSize / 100;