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)
-   -   Erweitertes Nachkomma Stellen Problem (http://www.expert-advisor.com/forum/showthread.php?t=4034)

markusrgb 26.01.15 18:02

Erweitertes Nachkomma Stellen Problem
 
Hallo Zusammen,

Bin schon ne ganze weile am googeln aber finde nichts zu meinem Spezielen Problem und das ich noch Anfänger auf dem Gebiet MT Programmierung bin macht es auch nicht leichter :p

Mit dem Befehl "Digits" kann ich ja soweit ich das Richtig verstanden habe, die Nachkommastellen je nach Broker auf die richtige Anzahl Nachkommastellen Reduzieren.

Jetzt ist es aber so dass mein Broker im Falle des DAX die Daten in 0,25er Schritten ... (0,25 - 0,5 - 0,75 - 0,00) z.B. 10744.75 ... 10744.00 ... 10745.25
liefert

Als SL oder TP werden aber häufig Werte errechnet, die als Nachkommastelle keine 0, 0,25, 0,50 oder 0,75 haben
sondern so sachen wie : 10744.43 oder 10745.77

Code:

TakeProfit = NormalizeDouble(OrderOpenPrice()*(1+(TP_Prozent/100)),Digits);
und das akzeptiert der Broker eben nicht und verweigert das OrderModify().:mad:

Jetzt ist meine Frage welche Möglichkeit es gibt diesen Berechneten "NormalizeDouble" Wert in 0,25 oder gerne auch 0,5 er schritten zu Runden?

Soll also z.B. aus 10744.43 --> 10744.50 machen


Code:

// TP bei Long Deals setzen
if (OrderSelect(LongOrder,SELECT_BY_TICKET)==true)
{
    if(OrderCloseTime()==0 && OrderTakeProfit()==0)
      {
      TakeProfit = NormalizeDouble(OrderOpenPrice()*(1+(TP_Prozent/100)),Digits);
      OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange);
      }
}

// TP bei Short Deals setzen
if (OrderSelect(ShortOrder,SELECT_BY_TICKET)==true)
{
    if(OrderCloseTime()==0 && OrderTakeProfit()==0)
      {
      TakeProfit = NormalizeDouble(OrderOpenPrice()/(1+(TP_Prozent/100)),Digits);
      OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange);
      }
}


pako 26.01.15 19:03

Code:


TakeProfit = NormalizeDouble(OrderOpenPrice()*(1+(TP_Prozent/100)),1);


traderdoc 26.01.15 19:14

TakeProfit = NormalizeDouble(10744,75*(1+(10/100)),1);
TakeProfit = 11819,2

11819,2 ??:confused:

traderdoc

pako 26.01.15 19:48

Liste der Anhänge anzeigen (Anzahl: 1)
Code:

void OnStart()
  {
//---
  double TakeProfit = NormalizeDouble(10744.75*(1+(10/100)),1);
  Alert(DoubleToString(TakeProfit,3));
  Print(DoubleToString(TakeProfit,3));
  }
//+------------------------------------------------------------------+


markusrgb 26.01.15 19:51

Zitat:

Zitat von traderdoc (Beitrag 28413)
TakeProfit = NormalizeDouble(10744,75*(1+(10/100)),1);
TakeProfit = 11819,2

11819,2 ??:confused:

traderdoc

die letzte 1 im code .......(1+(10/100)),1); reduziert das ganze dann wohl auf 1 nachkommastelle

ich kann das jetzt im moment nicht testen, aber ich nehm mal an dass das auch wieder einen fehler Produziert? :confused:

da es nicht mit 0,25 - 0,5 - 0,75 - 0,00 endet?

pako 26.01.15 19:57

Zitat:

Zitat von traderdoc (Beitrag 28413)
TakeProfit = NormalizeDouble(10744,75*(1+(10/100)),1);
TakeProfit = 11819,2

11819,2 ??:confused:

traderdoc

falsch 10744,75

pako 26.01.15 20:03

Zitat:

Zitat von markusrgb (Beitrag 28416)
die letzte 1 im code .......(1+(10/100)),1); reduziert das ganze dann wohl auf 1 nachkommastelle

NormalizeDouble
Rounding floating point number to a specified accuracy.

pako 26.01.15 20:22

Code:


void OnStart()
  {
//---
  double TakeProfit0 = NormalizeDouble(10744.75,1);
  double TakeProfit1 = MathCeil(10744.75);
  double TakeProfit2 = MathFloor(10744.75);
  double TakeProfit3 = MathRound(10744.75);
  Alert(DoubleToString(TakeProfit0,3)," -:- ",DoubleToString(TakeProfit1,3)," -:-  ",DoubleToString(TakeProfit2,3)," -:-  ",DoubleToString(TakeProfit3,3));
  Print(DoubleToString(TakeProfit0,3)," -:- ",DoubleToString(TakeProfit1,3)," -:-  ",DoubleToString(TakeProfit2,3)," -:-  ",DoubleToString(TakeProfit3,3));
  }
//+------------------------------------------------------------------+


traderdoc 26.01.15 20:28

void OnStart()
{
//---
double TakeProfit = NormalizeDouble(10744.75*(1+(10/100)),1);
Alert(DoubleToString(TakeProfit,3));
Print(DoubleToString(TakeProfit,3));
}
//+------------------------------------------------------------------+

Auch falsch: ergibt dann 10744,8

Er braucht aber .25 oder .5 oder .75 oder .0

und wenn dann double TakeProfit = NormalizeDouble(10744.75*(1+(10.0/100.0)),1);
TakeProfit = 11819.2
Das wäre aber auch nicht das, was er braucht!

traderdoc

traderdoc 26.01.15 21:02

Auf die Schnelle mal eine Hilfslösung:

Code:

double TP_Prozent = 10.0;
double TakeProfit = NormalizeDouble(OrderOpenPrice()*(1+(TP_Prozent/100.0)),2);
 
int TP = TakeProfit;
double Nachkomma = TakeProfit - TP;
if (Nachkomma <= 0.12) TakeProfit = TP;
if (Nachkomma > 0.12 && Nachkomma <= 0.37) TakeProfit = TP + 0.25;
if (Nachkomma > 0.37 && Nachkomma <= 0.62) TakeProfit = TP + 0.5;
if (Nachkomma > 0.62 && Nachkomma <= 0.87) TakeProfit = TP + 0.75;
if (Nachkomma > 0.87) TakeProfit = TP + 1.0;

traderdoc


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