???iATR Point abrunden auf ganzes Pip???

Einloggen oder registrieren, um einen Kommentar zu schreiben
janseninvestings
41
janseninvestings  

Hallo liebe Programmierer.

Mein mq4-Code sieht folgendermaßen aus...

In Zeile 161 bekomm ich es aber, verflucht noch eins, nicht gebacken, dass mir im Chart die Trigger-Dots nicht auf den Punkt genau angezeigt werden. Die sollen auf das volle Pip abgerundet angezeigt werden.

Probiert habe ich bereits MathPow(), MathFloor() und NormalizeDouble(). Aber nix will funktionieren.

Es ist zum Verzweifeln. Kann jemand bitte helfen? Riesen Dank

Otto Pauser
1573
Otto Pauser  
janseninvestings:

Hallo liebe Programmierer.

Mein mq4-Code sieht folgendermaßen aus...

In Zeile 161 bekomm ich es aber, verflucht noch eins, nicht gebacken, dass mir im Chart die Trigger-Dots nicht auf den Punkt genau angezeigt werden. Die sollen auf das volle Pip abgerundet angezeigt werden.

Probiert habe ich bereits MathPow(), MathFloor() und NormalizeDouble(). Aber nix will funktionieren.

Es ist zum Verzweifeln. Kann jemand bitte helfen? Riesen Dank

Verwende doch DoubleToString()
Carl Schreiber
Moderator
8285
Carl Schreiber  
Bitte keine Double-Posts! Den anderen Beitrag habe ich gelöscht!
alphatrading
100
alphatrading  
double value = 1.23456789;

int pipDigits = Digits & (~1);                                        
double pipValue = NormalizeDouble(value, pipDigits);

int subPipDigits = pipDigits+1;
double subPipValue = NormalizeDouble(value, subPipDigits);
janseninvestings
41
janseninvestings  
Otto Pauser:
Verwende doch DoubleToString()
Leider brachte es kein Erfolg. Dafür hast mich aber auf DoubleToStr() gebracht. :-D Danke. Warum auch immer nimmt er dennoch das fünfte Digit zur Berechnung. Soll heißen, dass er, wie gewünscht, schön abrundet, wenn er unter 0.00005 bleibt. Aber ab 0.00005 rundet er noch auf.
janseninvestings
41
janseninvestings  
alphatrading:
Klappt nicht. Nimmt weiterhin 5 Digits. Danke für die Hilfe aber.
janseninvestings
41
janseninvestings  
alphatrading , otto pauser:
Hilft es vielleicht weiter, wenn ich meine ganze mql4 zeige? Würde das für die Lösung meines Probs vielleicht mehr helfen? Danke im Voraus.
Carl Schreiber
Moderator
8285
Carl Schreiber  

Könnte Ihr keine Mathe mehr?

double atr = ( floor( iAtr(..) * pow(10,_Digits) + 0.5) )/pow(10,_Digits);

ungestestet, so ähnlich!

alphatrading
100
alphatrading  
janseninvestings:
Klappt nicht. Nimmt weiterhin 5 Digits. Danke für die Hilfe aber.

Schreib genauer, daß du "abrunden" willst. Es steht zwar im Thread-Titel, wurde aber aus deinem Posting nicht wirklich klar. Der Code, den du gepostet hast, hilft nicht, denn da rundest du übehaupt nicht und zeigst auch nicht an, wo dein Problem liegen könnte. Das macht man normalerweise in der Art:

(1) Was hab ich gemacht?

(2) Was hab ich erwartet? (expected result)

(3) Was hab ich stattdessen erhalten? (actual result)

Ohne genaue Beschreibung kann niemand dein Problem nachvollziehen, und dir kann nicht geholfen werden.

Hier ist alles, was man zum Runden von Integers und Doubles braucht. Daraus läßt sich jede beliebige Variante zusammenstellen:

/**
 * Integer version of MathRound()
 *
 * @param  double value
 *
 * @return int
 */
int Round(double value) {
   return(MathRound(value));
}


/**
 * Integer version of MathFloor()
 *
 * @param  double value
 *
 * @return int
 */
int Floor(double value) {
   return(MathFloor(value));
}


/**
 * Integer version of MathCeil()
 *
 * @param  double value
 *
 * @return int
 */
int Ceil(double value) {
   return(MathCeil(value));
}


/**
 * Extended version of MathRound(). Rounds to the specified amount of digits before or after the decimal separator.
 *
 * Examples:
 *  RoundEx(1234.5678,  3) => 1234.568
 *  RoundEx(1234.5678,  2) => 1234.57
 *  RoundEx(1234.5678,  1) => 1234.6
 *  RoundEx(1234.5678,  0) => 1235
 *  RoundEx(1234.5678, -1) => 1230
 *  RoundEx(1234.5678, -2) => 1200
 *  RoundEx(1234.5678, -3) => 1000
 *
 * @param  double number
 * @param  int    decimals [optional] - (default: 0)
 *
 * @return double - rounded value
 */
double RoundEx(double number, int decimals = 0) {
   if (decimals > 0) return(NormalizeDouble(number, decimals));
   if (!decimals)    return(      MathRound(number));

   // decimals < 0
   double factor = MathPow(10, decimals);
          number = MathRound(number * factor) / factor;
          number = MathRound(number);
   return(number);
}


/**
 * Extended version of MathFloor(). Rounds to the specified amount of digits before or after the decimal separator down.
 * That's the direction to zero.
 *
 * Examples:
 *  RoundFloor(1234.5678,  3) => 1234.567
 *  RoundFloor(1234.5678,  2) => 1234.56
 *  RoundFloor(1234.5678,  1) => 1234.5
 *  RoundFloor(1234.5678,  0) => 1234
 *  RoundFloor(1234.5678, -1) => 1230
 *  RoundFloor(1234.5678, -2) => 1200
 *  RoundFloor(1234.5678, -3) => 1000
 *
 * @param  double number
 * @param  int    decimals [optional] - (default: 0)
 *
 * @return double - rounded value
 */
double RoundFloor(double number, int decimals = 0) {
   if (decimals > 0) {
      double factor = MathPow(10, decimals);
             number = MathFloor(number * factor) / factor;
             number = NormalizeDouble(number, decimals);
      return(number);
   }

   if (decimals == 0)
      return(MathFloor(number));

   // decimals < 0
   factor = MathPow(10, decimals);
   number = MathFloor(number * factor) / factor;
   number = MathRound(number);
   return(number);
}


/**
 * Extended version of MathCeil(). Rounds to the specified amount of digits before or after the decimal separator up.
 * That's the direction from zero away.
 *
 * Examples:
 *  RoundCeil(1234.5678,  3) => 1234.568
 *  RoundCeil(1234.5678,  2) => 1234.57
 *  RoundCeil(1234.5678,  1) => 1234.6
 *  RoundCeil(1234.5678,  0) => 1235
 *  RoundCeil(1234.5678, -1) => 1240
 *  RoundCeil(1234.5678, -2) => 1300
 *  RoundCeil(1234.5678, -3) => 2000
 *
 * @param  double number
 * @param  int    decimals [optional] - (default: 0)
 *
 * @return double - rounded value
 */
double RoundCeil(double number, int decimals = 0) {
   if (decimals > 0) {
      double factor = MathPow(10, decimals);
             number = MathCeil(number * factor) / factor;
             number = NormalizeDouble(number, decimals);
      return(number);
   }

   if (decimals == 0)
      return(MathCeil(number));

   // decimals < 0
   factor = MathPow(10, decimals);
   number = MathCeil(number * factor) / factor;
   number = MathRound(number);
   return(number);
}

Das ist von hier kopiert: https://github.com/rosasurfer/mt4-mql/blob/master/mql4/include/stdfunctions.mqh#L1725

Mehr Utility-Funktionen zu allen möglichen anderen Bereichen (nicht nur Mathe) gibts in meinen Github-Projekten. Einen Überblick gibt's hier:

https://github.com/rosasurfer/mt4-mql/blob/master/mql4/include/api.mqh

janseninvestings
41
janseninvestings  

Vorab einen ganz lieben Dank an alle, die helfen wollten und haben.

Warum schwer machen, wenn es doch einfach geht. Konnte mein Problem lösen und es schaut wie folgt aus:



Für alle 3-Digits ist der Faktor 100 und für alle 5-Digits ist es 10.000. So einfach kann man es sich machen. :-)

Endlich kann das "Geld schei***" weitergehn, nur mit der letzten Optimierung des Arbeitsaufwandes.

Lieben Dank nochmal und Traidts Systems wünscht euch weiterhin viel Erfolg bei euren Programmierungen und Trades.

Carl Schreiber
Moderator
8285
Carl Schreiber  

Damit rundest Du alles ab also auch zB 1.123459 auf : 1.12345 statt mathem. korrekt 1.12346.

Aber wenn Du das so willst ist das natürlich ok!

12
Einloggen oder registrieren, um einen Kommentar zu schreiben