Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.


Portalsuche


Werbung

Login
Benutzername:
Kennwort:


Statistik
Themen: 3824
Beiträge: 36909
Benutzer: 6.081
Aktive Benutzer: 495
Links: 80
Wir begrüßen unseren neuesten Benutzer: DarthTrader
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor einer Stunde
- DarthTrade...
vor 3 Stunden
- Eren
vor 10 Stunden
- Rene1504
vor 11 Stunden
- ibdafx
vor einem Tag
- Batangenyo

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 75
Gesamt: 75
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Werbung

Like Tree1Likes
Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #11 (permalink)  
Alt 26.01.15
Benutzerbild von markusrgb
Mitglied
 
Registriert seit: Jan 2015
Beiträge: 34
markusrgb befindet sich auf einem aufstrebenden Ast
Standard

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

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
  #12 (permalink)  
Alt 26.01.15
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 224
pako befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
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
  #13 (permalink)  
Alt 26.01.15
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 224
pako befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
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
Angehängte Grafiken
Dateityp: jpg falsch.jpg (270,4 KB, 4x aufgerufen)

Geändert von pako (26.01.15 um 21:52 Uhr)
  #14 (permalink)  
Alt 26.01.15
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.875
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #15 (permalink)  
Alt 26.01.15
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 224
pako befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von pako Beitrag anzeigen
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));
     }

  }
//+------------------------------------------------------------------+
  #16 (permalink)  
Alt 26.01.15
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 224
pako befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
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
  #17 (permalink)  
Alt 27.01.15
Benutzerbild von markusrgb
Mitglied
 
Registriert seit: Jan 2015
Beiträge: 34
markusrgb befindet sich auf einem aufstrebenden Ast
Standard

OK, jetzt bin ich offiziell Verwirrt

werd das alles jetzt einfach mal irgendwie durchtesten

und sag dann bescheid was davon funktioniert hat

aber auf jeden fall schon mal ein danke
  #18 (permalink)  
Alt 27.01.15
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.875
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #19 (permalink)  
Alt 28.01.15
Benutzerbild von markusrgb
Mitglied
 
Registriert seit: Jan 2015
Beiträge: 34
markusrgb befindet sich auf einem aufstrebenden Ast
Standard

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


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;
}
  #20 (permalink)  
Alt 28.01.15
Benutzerbild von markusrgb
Mitglied
 
Registriert seit: Jan 2015
Beiträge: 34
markusrgb befindet sich auf einem aufstrebenden Ast
Standard

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

Lesezeichen

Stichworte
digits, digits problem, mql4, nachkomma stellen, nachkomma stellen problem, nachkommastellen, programmierung, programmierung metatrader


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 Uhr.



Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2017 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------