Dimensione della posizione che restituisce un valore negativo

 

All'interno della mia strategia, uso una funzione GetPosSize() per calcolare le dimensioni della posizione. Al momento sto usando la strategia solo con EURUSD e per quanto mi riguarda non riesco a capire perché posSize restituisce un valore negativo, con conseguente errore OrderSend 4051. Qualsiasi aiuto sarebbe molto apprezzato. Posterò tutto il codice rilevante qui. Nessun altro calcolo verso posSize viene fatto in tutto il codice, solo la funzione viene chiamata. Tutti e tre i pezzi di codice separati sono all'interno della funzione.

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);
 

Prova a stampare i valori di marginAllot, PercentRisk e pipsToSL per restringere il campo da dove viene il numero negativo. La mia ipotesi speculativa è che pipsToSL venga passato come numero negativo in certe circostanze.

 
  1. NormalizeDouble(posSize,2);
    Questa linea non fa nulla.
  2. Non usare NormalizeDouble, MAI. Per nessuna ragione. È un trucco, non usarlo. Ilsuo uso è sempre sbagliato
 
honest_knave:

Prova a stampare i valori di marginAllot, PercentRisk e pipsToSL per restringere il campo da dove viene il numero negativo. La mia ipotesi speculativa è che pipsToSL venga passato come numero negativo in certe circostanze.

Sono stato in grado di trovare alcuni punti nel resto del codice dove pipsToSL è stato calcolato erroneamente come negativo. Grazie.

WHRoeder:
  1. Questa linea non fa nulla.
  2. Non usare NormalizeDouble, MAI. Per nessuna ragione. È un trucco, non usarlo. Il suo uso è sempre sbagliato

Ho letto dei tuoi post su questo argomento prima, ma non ho capito il tuo punto fino al tuo ultimo link. Grazie.

 

Perché dovrei ancora ottenere risposte con più decimali se sto usando MathRound()? Ho provato a usare DoubleToString ma non mi ha aiutato per niente. È dovuto interamente alle limitazioni di Print() o c'è qualcos'altro di sbagliato?

posSize = posSize * 10;
MathRound(posSize);
posSize = posSize / 10;
 
NoLimitations: Perché dovrei ancora ottenere risposte con più cifre decimali se sto usando MathRound()
MathRound restituisce un doppio; un numero infinito di cifre decimali.
 
WHRoeder:
NoLimitations : Perché dovrei ancora ottenere risposte con più cifre decimali se sto usando MathRound()
MathRound restituisce un doppio; numero infinito di posizioni decimali.

Non secondo la pagina del doc per essa. https://docs.mql4.com/math/mathround

"Valore di ritorno

Valore arrotondato all'intero più vicino".

Se si suppone che lo faccia ma non lo fa, allora MQ deve essere avvisato, o devono mettere un'etichetta di avviso sulla funzione.

 
JD4 ha ragione, la pagina del documento dice che arrotonda al numero intero più vicino. Non sono sicuro di un altro modo per realizzare quello che stavo cercando di fare sopra senza arrotondare o tagliare un certo numero di cifre decimali. Quale sarebbe lo scopo di MathRound() o round() se non restituiscono un numero intero?
 
NoLimitations:
JD4 ha ragione, la pagina del documento dice che arrotonda al numero intero più vicino. Non sono sicuro di un altro modo per realizzare quello che stavo cercando di fare sopra senza arrotondare o tagliare un certo numero di cifre decimali. Quale sarebbe lo scopo di MathRound() o round() se non restituiscono un numero intero?
Hai detto che MathRound ti dava problemi, hai provato l'alternativa suggerita di arrotondare solo con round()?
 
Sì, ho usato round(); il risultato è lo stesso identico valore. Ho provato a usare MathFloor() o MathCeil() per calcolare il valore in modo meno accurato e aggirare il problema per il momento, ma entrambi sembrano non fare nulla. Voglio solo trasformare un dannato doppio in un int hahaha
 

Ho anche appena provato ad usarlo senza successo. È possibile che DTS cambi semplicemente la precisione di un valore per l'aspetto e non il valore effettivo? Non vedo altre opzioni.

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