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 21:18

Das Problem scheint sich wohl eher auf Indizes zu beziehen, da wie in meinem Fall der Kurs in 0,25ern Schritten geliefert wird (DAX)

als Beispiel mal diese Fehlermeldung:

2015.01.26 10:17:02.387 '2715450': modification of order #21925852 sell 0.10 EUREX.FDX at 10691.00 sl: 0.00 tp: 10533.00 -> sl: 10744.46 tp: 10533.00 failed [Invalid S/L or T/P]

Die Berechnung des TP ergab zufällig denn wert 10533.00 und wurde vom Broker beim anpassen des TP mit OrderModify angenommen :rolleyes:

Die Berechnung des SL ergab 10744.46 und erzeugte dann einen Fehler - Tick für Tick weil der SL nicht gesetzt werden konnte --- bis ich die Order dann von Hand geschlossen hab.

Ich denke mal das dieses Problem bei WährungsPaaren wohl kein Problem darstellt

pako 26.01.15 21:23

Zitat:

Zitat von traderdoc (Beitrag 28421)
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

Code:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    double b= 10745.75,tp,offset=0.5;
 
      tp=NormalizeDouble(b+offset,2);
      Alert(DoubleToString(tp,3));
      Print(DoubleToString(tp,3));
   
  }
//+------------------------------------------------------------------+

+/- offset

pako 26.01.15 21:34

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

Zitat von traderdoc (Beitrag 28424)
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

Code:

double TP_Prozent=10.0;
  double TakeProfit=NormalizeDouble(10744.25*(1+(TP_Prozent/100.0)),2);

  double TP=TakeProfit;
  double Nachkomma=TakeProfit-TP;

Nachkomma =0;
weil TP=TakeProfit; TakeProfit-TP=0

wenn int TP , kommt warning

int TP=(int)TakeProfit; richtig

traderdoc 26.01.15 21:58

Ne, wenn
double TP=TakeProfit;
double Nachkomma=TakeProfit-TP;

Dann wird Nachkomma immer 0 sein!

Also, es muß bei int TP = TakeProfit; bleiben.
Getestet und ohne Warning!

traderdoc

pako 26.01.15 22:01

Zitat:

Zitat von pako (Beitrag 28426)
Code:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    double b= 10745.75,tp,offset=0.5;
 
      tp=NormalizeDouble(b+offset,2);
      Alert(DoubleToString(tp,3));
      Print(DoubleToString(tp,3));
   
  }
//+------------------------------------------------------------------+

+/- offset

Code:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
  double a=0.25,b= 10744.75,tp,offset=0.5;
  int cnt =15;
  for(int y=0;y<cnt;y++)
    {
      a+=0.25;
      tp=NormalizeDouble((b+a)+offset,2);
      Alert(DoubleToString(tp,3));
      Print(DoubleToString(tp,3));
    }

  }
//+------------------------------------------------------------------+


pako 26.01.15 22:06

Zitat:

Zitat von traderdoc (Beitrag 28428)
Ne, wenn
double TP=TakeProfit;
double Nachkomma=TakeProfit-TP;

Dann wird Nachkomma immer 0 sein!

Also, es muß bei int TP = TakeProfit; bleiben.
Getestet und ohne Warning!

traderdoc

wenn #property strict

int TP = TakeProfit; kommt warning

int TP = (int)TakeProfit; keine warning

markusrgb 27.01.15 18:05

:confused:OK, jetzt bin ich offiziell Verwirrt :confused:

werd das alles jetzt einfach mal irgendwie durchtesten

und sag dann bescheid was davon funktioniert hat

aber auf jeden fall schon mal ein danke :D

traderdoc 27.01.15 18:07

Nimm diese Version:

Code:

double TP_Prozent = 10.0;
double TakeProfit = NormalizeDouble(OrderOpenPrice()*(1+(TP_Prozent/100.0)),2);
 
int TP = (int)TakeProfit;  //zur Sicherheit!
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

markusrgb 28.01.15 17:25

hmmm ich hab jetzt mal versucht das einzubauen ....
aber irgendwo liegt in meinem Code noch der Hund begraben
es wurde kein einziger SL/TP gesetzt

hier mal das Journal seit heute morgen:
2015.01.28 16:17:00.724 '2715450': order #21939548 sell 0.10 EUREX.FDX at 10616.25 sl: 0.00 tp: 0.00 closed at price 10691.75
2015.01.28 16:17:00.665 '2715450': close order #21939548 sell 0.10 EUREX.FDX at 10616.25 sl: 0.00 tp: 0.00 at price 0.00
2015.01.28 12:11:03.993 '2715450': order was opened : #21939548 sell 0.10 EUREX.FDX at 10616.25 sl: 0.00 tp: 0.00
2015.01.28 12:11:03.929 '2715450': order sell market 0.10 EUREX.FDX sl: 0.00 tp: 0.00
2015.01.28 12:11:03.929 '2715450': order #21939177 buy 0.10 EUREX.FDX at 10629.25 sl: 0.00 tp: 0.00 closed at price 10616.25
2015.01.28 12:11:03.871 '2715450': close order #21939177 buy 0.10 EUREX.FDX at 10629.25 sl: 0.00 tp: 0.00 at price 0.00
2015.01.28 11:08:03.220 '2715450': order was opened : #21939177 buy 0.10 EUREX.FDX at 10629.25 sl: 0.00 tp: 0.00
2015.01.28 11:08:03.160 '2715450': order buy market 0.10 EUREX.FDX sl: 0.00 tp: 0.00
2015.01.28 11:08:03.159 '2715450': order #21938400 sell 0.10 EUREX.FDX at 10717.50 sl: 0.00 tp: 0.00 closed at price 10629.25
2015.01.28 11:08:01.973 '2715450': close order #21938400 sell 0.10 EUREX.FDX at 10717.50 sl: 0.00 tp: 0.00 at price 0.00
2015.01.28 09:04:02.332 '2715450': order was opened : #21938400 sell 0.10 EUREX.FDX at 10717.50 sl: 0.00 tp: 0.00
2015.01.28 09:04:02.276 '2715450': order sell market 0.10 EUREX.FDX sl: 0.00 tp: 0.00
2015.01.28 07:20:53.117 Automated trading enabled

bin mir jetzt nicht sicher ob ich die umrechnung in 0,25er Schritten falsch eingebunden habe oder ob das Problem auch noch an anderer Stelle liegen könnte :confused:


Code:

void OnTick()
{
//---

double StoppLoss;
double TakeProfit;
bool OrderAngepasst;
int TP;
int SL;
double NachkommaTP;
double NachkommaSL;

// Überprüfen ob ein neuer Periodenbeginn vorliegt
if (PeriondenStartZeit != Time[0])
{
NeuePeriodeBegonnen = true;
PeriondenStartZeit = Time[0];
}
else NeuePeriodeBegonnen = false;


...
……für Forum Ausgeblendetete Berechnungen - sonst wird der code zu unübersichtlich ......
...



//+------------------------------------------------------------------+
//| Kauf / Verkauf Signal umsetzen                              |
//+------------------------------------------------------------------+ 
 
// Kaufen
if(LongSignal == true)
{
      // Evtl Short Order vorher Schließen
      if(ShortOrder>0)
          {
            if(OrderSelect(ShortOrder,SELECT_BY_TICKET)==true)
            {
            bool ShortOrderGeschlossen = OrderClose(ShortOrder,OrderLots(),Ask,10,Blue);
            if (ShortOrderGeschlossen==true) ShortOrder=0;
            Print("Short Order geschlossen bei ",AnzahlMA20);
            }
          }
      // Jetzt erst Long Order eröffnen
      while(LongOrder<=0)
          {
          LongOrder = OrderSend("EUREX.FDX",OP_BUY,HandelsLots,Ask,10,0,0,"Dax30 LONG",MagicNummer,0,Green);
          Print("Long Order geöffnet bei ",AnzahlMA20);
          }
}

// Verkaufen
if (ShortSignal == true)
{
      // Evtl Long Order vorher Schließen
    if (LongOrder>0)
        {
          if(OrderSelect(LongOrder,SELECT_BY_TICKET)==true)
          {
          bool LongOrderGeschlossen = OrderClose(LongOrder,OrderLots(),Bid,10,Blue);
          if (LongOrderGeschlossen==true) LongOrder=0;
          Print("Long Order geschlossen bei ",AnzahlMA20);
          }
        }
      // Verkaufs Order jetzt eröffnen
      while(ShortOrder<=0)
        {
        ShortOrder = OrderSend("EUREX.FDX",OP_SELL,HandelsLots,Bid,10,0,0,"Dax30 SHORT",MagicNummer,0,Red);
        Print("Short Order geöffnet bei ",AnzahlMA20);
        }
}

//+------------------------------------------------------------------+
//|StopLoos und TakeProfit setzen                                  |
//+------------------------------------------------------------------+ 
 
// SL bei Long Deals setzen - Erst aber umrechnung für 0,25 Schritt Broker
// Umrechnung SL_Prozent in 0,25er Schritten
StoppLoss = NormalizeDouble(OrderOpenPrice()/(1+(SL_Prozent/100.0)),2); 
SL = (int)StoppLoss;  //zur Sicherheit!
NachkommaSL = StoppLoss - SL;
if (NachkommaSL <= 0.12) StoppLoss = SL;
if (NachkommaSL > 0.12 && NachkommaSL <= 0.37) StoppLoss = SL + 0.25;
if (NachkommaSL > 0.37 && NachkommaSL <= 0.62) StoppLoss = SL + 0.5;
if (NachkommaSL > 0.62 && NachkommaSL <= 0.87) StoppLoss = SL + 0.75;
if (NachkommaSL > 0.87) StoppLoss = SL + 1.0;

// SL bei Long Deals setzen
if (OrderSelect(LongOrder,SELECT_BY_TICKET)==true)
{
    if(OrderCloseTime()==0 && OrderStopLoss()==0)
      {
      OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StoppLoss,OrderTakeProfit(),0,Yellow);
      Print("SL für Long Order gesetzt bei = ",StoppLoss);
      }
}

// SL bei Short Deals setzen - Erst aber umrechnung für 0,25 Schritt Broker
// Umrechnung SL_Prozent in 0,25er Schritten
StoppLoss = NormalizeDouble(OrderOpenPrice()*(1+(SL_Prozent/100.0)),2); 
SL = (int)StoppLoss;  //zur Sicherheit!
NachkommaSL = StoppLoss - SL;
if (NachkommaSL <= 0.12) StoppLoss = SL;
if (NachkommaSL > 0.12 && NachkommaSL <= 0.37) StoppLoss = SL + 0.25;
if (NachkommaSL > 0.37 && NachkommaSL <= 0.62) StoppLoss = SL + 0.5;
if (NachkommaSL > 0.62 && NachkommaSL <= 0.87) StoppLoss = SL + 0.75;
if (NachkommaSL > 0.87) StoppLoss = SL + 1.0;

// SL bei Short Deals setzen
if (OrderSelect(ShortOrder,SELECT_BY_TICKET)==true)
{
    if(OrderCloseTime()==0 && OrderStopLoss()==0)
      {
      OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StoppLoss,OrderTakeProfit(),0,Yellow);
      Print("SL für Short Order gesetzt bei = ",StoppLoss);
      }
}



// TP bei Long Deals setzen - Erst aber umrechnung für 0,25 Schritt Broker
// Umrechnung TP_Prozent in 0,25er Schritten

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

// TP bei Long Deals setzen
if (OrderSelect(LongOrder,SELECT_BY_TICKET)==true)
{
    if(OrderCloseTime()==0 && OrderTakeProfit()==0)
      {
      OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange);
      Print("TP für Long Order gesetzt bei = ",TakeProfit);
      }
}


// TP bei Short Deals setzen - Erst aber umrechnung für 0,25 Schritt Broker
// Umrechnung TP_Prozent in 0,25er Schritten

TakeProfit = NormalizeDouble(OrderOpenPrice()/(1+(TP_Prozent/100.0)),2); 
TP = (int)TakeProfit;  //zur Sicherheit!
NachkommaTP = TakeProfit - TP;
if (NachkommaTP <= 0.12) TakeProfit = TP;
if (NachkommaTP > 0.12 && NachkommaTP <= 0.37) TakeProfit = TP + 0.25;
if (NachkommaTP > 0.37 && NachkommaTP <= 0.62) TakeProfit = TP + 0.5;
if (NachkommaTP > 0.62 && NachkommaTP <= 0.87) TakeProfit = TP + 0.75;
if (NachkommaTP > 0.87) TakeProfit = TP + 1.0;

// TP bei Short Deals setzen
if (OrderSelect(ShortOrder,SELECT_BY_TICKET)==true)
{
    if(OrderCloseTime()==0 && OrderTakeProfit()==0)
      {
      OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange);
      Print("TP für Short Order gesetzt bei = ",TakeProfit);
      }
}



// Ticketnummern nach schließen auf 0 zurücksetzen
if(OrderSelect(LongOrder,SELECT_BY_TICKET)==true)
{
  if(OrderTicket()>0 && OrderCloseTime()>0) LongOrder=0;
}

if(OrderSelect(ShortOrder,SELECT_BY_TICKET)==true)
{
  if(OrderTicket()>0 && OrderCloseTime()>0) ShortOrder=0;
}


markusrgb 28.01.15 17:40

Ich poste gleich noch mal denn ganzen Code mit vereinfachter Berechnung....


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