Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Überprüfung ob "double Variable" ganze Zahl (http://www.expert-advisor.com/forum/showthread.php?t=6007)

Leopold 22.02.18 20:45

Überprüfung ob "double Variable" ganze Zahl
 
Hallo zusammen,

ich hoffe mir kann da jemand helfen.
Ich habe einen double Wert und möchte überprüfen ob es sich hier um eine ganze Zahl handelt oder nicht.
Bitte um eure Hilfe.

--- Leopold ---

traderdoc 22.02.18 20:56

Code:

if (Double_Wert - NormalizeDouble(Double_Wert, 0) != 0) {
  //Wert mit Kommastelle
} else {
  //Wert ohne Kommastelle
}

Das funktioniert aber nur, wenn der Double_Wert auch tatsächlich
x.0 ist. Sollte der wie manchmal x.00000000001 sein, dann wird das nicht gehen.

Ach und übrigens, ein double Wert kann per se keine Ganzzahl sein, weil per Definiton der Double Wert immer eine Kommastelle hat, auch wenn sie Null ist.

traderdoc

Leopold 22.02.18 21:04

Vielen Dank für die schnelle Antwort,

hab vermutet das ich es so machen muss, hatte gehofft es gibt eine fertige Funktion.
Sollte aber mit "MathRound()" genau so funktionieren oda?

Zur Definition: wie würde man sonst so eine Zahl bezeichnen?

--- Leopold ---

traderdoc 22.02.18 22:24

Na ja, ne ganze Zahl oder Ganzzahl ist nun mal eine negative oder positive Zahl ohne Dezimalstelle.

Die Zahl x.0 ist somit keine Ganzzahl und bleibt eine Dezimalzahl.
Aber man könnte diese Dezimalzahl in eine Integerzahl umwandeln und dann wäre es eine Ganzzahl.
Mit Ganzzahl = (int)Doublezahl;

wird einfach die Dezimalstelle abgeschnitten.

traderdoc

Ca$hDigger 23.02.18 00:19

Das Problem der Fließkommaarithmetik ist das Vergleiche nicht funktionieren ohne Bedingungen mit einzubauen.

1 != 1.00000000000001
1 != 0.99999999999999
Obwohl die rechte Seite nahezu 1 entspricht wird dies vom Computer anderes gesehen.

Auf die Schnelle als möglichen Lösungsweg würde ich prüfen ob die Gleitkommazahl ein bestimmten Abstand zur nächstgelegenen ganzen Zahl unterschreitet.

1. ermittle die nächstliegende ganze Zahl.
2. definiere Toleranzabstand zB 0.0000001
3. prüfe ob die Differenz zwischen Gleitkommazahl und nächstliegender ganzer Zahl den Toleranzabstand unterschreitet. Ist diese Bedingung erfüllt kann man sagen, der Wert liegt so nah an der ganzen Zahl, dass er als ganze Zahl gelten kann.

Gibt sicherlich auch andere Wege, dies war das erste was mir dazu eingefallen ist.
Beim Prüfen auf Gleichheit von zwei double-Werten arbeitet man oft mit solchen Toleranzwerten. Dies hier ist nichts anderes, nur dass man mit der nächstliegenden Ganzzahl vergleicht.

C$D

Leopold 23.02.18 08:56

Danke für diese Ergänzung.

Für die aktuelle Situation benötige ich das aber nicht, da die Berechnung wirklich genau 0 ergeben muss.

Ich überprüfe nämlich ob der gewählte Timeframe zum Inputparameter passt.

--- Leopold ---

traderdoc 23.02.18 11:51

... aber dabei fällt doch gar keine double Zahl an.

traderdoc

Leopold 23.02.18 11:56

Ich überprüfe den gewählten Timeframe indem ich den Parameter durch die Timeframe-Minuten teile.

Parameter/Timeframe(Period())

Das muss dann eine ganze Zahl ergeben. Der EA kann dann auf verschiedenen Timeframes angewand werden.

--- Leopold ---

traderdoc 23.02.18 14:38

Also jetzt interessiert es mich vollständig.

Dieser Parameter wird in den Eigenschaften des EAs eingegeben. Hat dieser Parameter noch eine andere Funktion? Und warum gibt es nicht einfach eine string-Variable, in der alle TFs aufgelistet sind, auf die der EA laufen soll?

traderdoc

Leopold 24.02.18 09:34

Hallo

Es handelt sich um ein Ausbruchssystem aus einer zeitlichen Range.
Die Start- und Endzeit der Range werden über Parameter als Wert in Minuten ab Tagesbeginn eingegeben. Dadurch habe ich den Vorteil, dass ich beim Optimieren für z.B. die Startzeit nur den einen Parameter und nicht zwei Parameter (Stunden und Minuten) habe und diesen auch durchgehend aufwärts durchlaufen lassen kann und somit nur eine Datenreihe habe. Ich finde das ist für die Auswertung der Optimierung leichter.
Für die Hoch- und Tiefbestimmung muss ich dann die Kerzen in dieser Range abfragen können.
Außerdem lasse ich den Großteil des Programms nur durchlaufen wenn sich eine neue Kerze gebildet hat.
Aus diesen Gründen muss der Parameter ein vielfaches des Timeframe sein.
Zum einen müssen die Kerzen selektiert werden und zum anderen muss das Programm durchlaufen sobald die Range abgeschlossen ist.
Feste Timeframes möchte ich nicht definieren, weil diese Parameter-abhängig sind.

Hoffe des ist verständlich.
Bin auch offen für bessere Lösungsvorschläge.

--- Leopold ---


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:58 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum