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)
-   -   lots an schritweite anpassen (http://www.expert-advisor.com/forum/showthread.php?t=3097)

L0rd 21.07.13 22:20

lots an schritweite anpassen
 
Hallo,

ich bin bei JFD und da sind nur lots in 0,05 Schritten möglich also z.B. so
0,40
0,45
0,50
0,55
0,60
0,65
usw...

bis jetzt habe ich das umgegangen in dem ich bis auf eine stelle hinter dem Komma gerundet habe

PHP-Code:

lot=NormalizeDouble(lot,1); 

da kriege ich z.B. so was raus
0,4
0,5
0,6

die Schritte sind ziemlich grob, und habe mir folgendes zum "Aufrunden" gebastelt. Ab x,x3 bis x,x7 wird auf x,x5 gerundet usw.
PHP-Code:

lot=NormalizeDouble(lot,2);

double rest=lot 0.05;

if (
rest == 0.01lot=lot-0.01;
if (
rest == 0.02lot=lot-0.02;
if (
rest == 0.03lot=lot+0.02;
if (
rest == 0.04lot=lot+0.01;
if (
rest == 0.06lot=lot-0.01;
if (
rest == 0.07lot=lot-0.02;
if (
rest == 0.08lot=lot+0.02;
if (
rest == 0.09lot=lot+0.01

doch die Freude war kurz, da das Problem dabei ist, dass "%" Operator nur mit int Zahlen umgehen kann.

Hat jemand eine Idee wie man das lösen könnte ?
Gibts ein Befehl dass die letzte Stelle einer double Zahl auslesen kann ?

danke

feelfree 22.07.13 09:27

Hi Lord,

du kannst MathRound für deine Berechnung und korrekte Rundung nutzen.
MathRound - MQL4 Documentation

Das Ergebnis kannst du dann ja durch 10 teilen um die Dezimal-Lotsteps zu ermitteln.

Grüße
Dan

traderdoc 22.07.13 10:55

@L0rd,

Ähm, wo liegt denn eigentlich das Problem?
Wenn der Broker nur Schritte in 0,05 Lot anbietet, dann ist das halt so Undank muß damit leben und traden oder man wechselt zu einem Broker der das in 0,01 Schritten anbietet. Mir ist ehrlich gesagt noch unklar was Du erreichen wolltest.

Ich vermute! mal, dass Du z.B. 0,43 Lot per Programm errechnet hast und willst jetzt die am dichtesten an den Lotsteps liegende Lotzahl ermitteln, um die Order öffnen zu können.
Willst Du die zweite Kommastelle auslesen!!, dann wandelt man die Zahl in einen String um, läßt die letzte Stelle auslesen. Ratz fatz, ist sie 0 oder 5 ist alles gut. Ist sie 1 oder 2 wird auf die erste Kommastelle abgerundet, ist sie 3, 4, 6 oder 7 wird sie mit einer 5 substituiert und ist sie 8 oder 9 dann wird einfach auf die erste Stelle nach dem Komma aufgerundet. Sollte mit der 5 substituiert werden muß danach der String wieder in eine Double mit 2 Kommastellen umgewandelt werden und fertig ist die Laube.

traderdoc

L0rd 22.07.13 16:06

@ feelfree
wenn es nur Runden währe... :)

@traderdoc
du hast genau richtig verstanden. Irgendein lot-wert (mit 2 Nachkommastellen) wird errechnet und soll so gerundet werden, dass das Ergebnis auch 2 Nachkommastellen hat und durch 0,05 teilbar(ohne Rest) ist. D.h. letzte Nachkommastelle kann nur 0 oder 5 sein.

Bis jetzt (wie gesagt)hab ich dem Problem ausgewichen durch "Abschneiden" der letzten der zwei Nachkommastellen.

Als ich das Thema eröffnet habe wollte ich noch zu meiner Frage " ... ohne Broker zu wechseln" hinzufügen :) Leider habe ich noch keine Zeit um alternative zu JFD zu finden, hier in Forum hat mir auch noch keiner was empfohlen. JFD ist halt schnell bei Orderausführung, das ist bei meiner Strategie überlebenswichtig, deswegen muss ich bei denen erstaml bleiben.

traderdoc 22.07.13 18:02

Zitat:

Zitat von L0rd (Beitrag 22549)
@traderdoc
du hast genau richtig verstanden. Irgendein lot-wert (mit 2 Nachkommastellen) wird errechnet und soll so gerundet werden, dass das Ergebnis auch 2 Nachkommastellen hat und durch 0,05 teilbar(ohne Rest) ist. D.h. letzte Nachkommastelle kann nur 0 oder 5 sein.

Na ja, dann hast Du doch jetzt die Methode, um es richtig zu machen.

Viel Erfolg!

traderdoc

L0rd 22.07.13 18:28

Hallo nochmal,

das mit stringumwandeln ist mir zu kompliziert und kostet rechenleistung, deswegen würde ich mit der Lösung nicht anfangen und was eleganteres suchen.

... und bin auf Funktion MathMod() gestossen die mir Operator "%" ersetzt und für double eignet:

PHP-Code:

double lot=1.23;
double rest=MathMod(lot,0.05);

Print(
"lot am Anfang ",lot," rest ",rest);

if (
rest==0.01lot=lot-0.01;
if (
rest==0.02lot=lot-0.02;
if (
rest==0.03lot=lot+0.02;
if (
rest==0.04lot=lot+0.01;

Print(
"lot am Ende ",lot); 

in dem Beispiel ist rest 0.03, deswegen um auf 1.25 aufzurunden addiere ich 0.02 dazu.
Hacken tuts aber leider bei ifs, denn lot am Ende bleibt genau so gross wie am Anfang, deswegen denke ich, dass if Abfrage nichts tut, ich sehe aber nicht wieso :(
Könnt Ihr bitte kucken, ich komm einfach nicht drauf :(

traderdoc 22.07.13 18:39

Ja ja, immer wieder dasselbe, mit dem Vergleich von double-Werten.

Da fehlt schlicht die Zeile:

rest = NormalizeDouble(rest, 2);

Viel Spaß

traderdoc

PS. Die Variante mit dem String habe ich Dir nur geschrieben, weil Du die 2. Stelle nach dem Komma unbedingt auslesen wolltest und das geht am schnellsten über den String.

L0rd 22.07.13 22:42

danke ! es funktioniert !
hätte ich nie gedacht, denn Print hat auch 2 Nachkommastellen ausgegeben und mehr sind da auch nicht möglich. Werden warscheinlich mit 00000000 ausgefüllt in Wirklichkeit, deswegen hat vergleich nicht hingehauen.

@traderdoc es war auch kein Vorwurf oder Kritik, wenn, dann an mich selbst.

@feelfree durch dich bin ich auf Funktion MathMod() aufmerksam geworden, da ich Dokumentation für MathRound angeschaut habe.

Danke euch und VIEL ERFOLG !

Übrigens in Theorie das mit 0,05 bringt mir 6% mehr, habe eben getestet.


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:00 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