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.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4973
Beiträge: 43248
Benutzer: 7.219
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: Hopfen&Malz
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- Hopfen&Mal...
vor 2 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107
vor 2 Wochen
- rg-trader

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

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #21 (permalink)  
Alt 15.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Hallo, lieber next user,

bin in den vergangene Stunden tatsächlich nochmals ALLES durchgegangen, habe den Code entsprechend den aktuellen Gegebenheiten ergänzt und noch unverstandene Details markiert (red). Mit nachfolgendem Resultat:

Code:
int   orderTicket1 = 0;
int   orderTicket2 = 0;

void ChekTicket(int ticket)  //  mein Versuch == ohne error  //  ????
//void OnTick()              //  deaktiviert, da error: 'OnTick' - function already defined and has body

{
   if(OrderSelect(ticket,SELECT_BY_TICKET)== true)  //  meine Ergänzug  //  ????

   if(orderTicket1)
      updateSL(orderTicket1);
      
   if(orderTicket2)
      updateSL(orderTicket2);


if(orderTicket1 && orderTicket2)
   {
   if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
      {
      if(OrderSelect(orderTicket1,SELECT_BY_TICKET))
         {
         if(OrderType() == OP_BUY)
         {
            if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
               Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
            else
               Print("BIN ZU !!!");
         }
       else if (OrderType() == OP_SELL)
         {

            if(!OrderClose(orderTicket1,OrderLots(),Ask,3))
               Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
            else
               Print("BIN ZU !!!");
         }

         orderTicket1 = 0;
         orderTicket2 = 0;
         }
      }
   }
}

void updateSL(int ticket)
{
   ResetLastError();

   if(OrderSelect(ticket,SELECT_BY_TICKET))
   {
      if(OrderType() == OP_BUY  &&  (openOrders == 1  ||  openOrders == 2))
      {
         if(Bid - OrderOpenPrice() > Trail_Target_1 *100 * Point)
         {
            if(OrderStopLoss() < Bid - TSL || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
                  Print("Error setting Buy trailing stop: ", GetLastError());
            }
         }
      }
      else if(OrderType() == OP_SELL  &&  (openOrders == 1  ||  openOrders == 2))
      {
         if(OrderOpenPrice() - Ask > Trail_Target_1 *100 * Point)
         {
            if(OrderStopLoss() > Ask + TSL || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
                  Print("Error setting Sell trailing stop: ", GetLastError());
            }
         }
      }
   }
}
So, wie o.a., erscheinen nach der Kompellierung keine errors und warnings !!! SUUUPER !!!
Dennoch gibt es sicher 2 - 3 "Ungereimtheiten" (meine Ergänzungen), die geprüft und ggf. bereinigt werden sollten.
In der Hoffnung auf Deine nochmaligen Denkanstöße

der ungeduldige, spannungsgeladene piptrade



PS.: Und wieder warst Du schneller ! Dieses mal habe ich mir Deinen post jedoch schon angesehen und die Ergänzungen bereits integriert.
Ich bin begeistert !
Darüber hinaus ist es einfach "Spitze", DASS Du und WIE Du die einzelnen Details "auseinandernimmst" und erläuternd darauf eingehst. Sicher werde ich noch einige Zeit brauchen, bis jede Erklärung auch bei mir in "Fleisch und Blut" übergegangen ist, dennoch habe ich schon bis hier her eine Menge dazugelernt.
Wenn jetzt noch die letzten kleinen Unsicherheiten ausgeräumt werden könnten, wäre die Welt endlich wieder in Ordnung.

DANKE für Deinen tollen Einsatz ! pt
  #22 (permalink)  
Alt 15.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von piptrade Beitrag anzeigen
Code:
void ChekTicket(int ticket)  //  mein Versuch == ohne error  //  ????
//void OnTick()              //  deaktiviert, da error: 'OnTick' - function already defined and has body
Der Error liegt darin, dass du offensichtlich eine weitere Funktion "OnTick()" erstellt hast. Vermutlich hast du meinen Code mit
eben der OnTick-Angabe übernommen.

Ich dachte, dir wäre klar, wie ich es gemeint habe. "OnTick()" ist ja eine "hauseigene" Funktion eines EA's. Mit meinem Code
hatte ich nur angegeben, das der Code (in meinem OnTick) in die Funktion "OnTick gehört".

Also kurz nochmal:
  • In meinem Code ist nur die Funktion "updateSL()" eine eigens erstellte.
  • "OnTick()" ist, genau wie z.B. die Funktion "OnInit()", "OnDeinit()". "OnTimer()" oder "OnChartEvent()" Bestandteil
    eines EA's.
  • Das, was in meiner "OnTick()" im Code steht, gehört in deine vorhandene "OnTick()".
  • "OnTick()" ist die Funktion, die bei jedem neuen Tick aufgerufen wird. Und genau da soll der
    Code rein.
  #23 (permalink)  
Alt 16.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Lieber next user, Hallo !

Da hast Du absolut recht; - dieses "OnTick()" wurde tatsächlich, ohne grassartig nachzudenken, übernommen. Damit war natürlich
ein "OnTick()" zuviel im Code und mußte als "error" ausgewiesen werden. Sorry, mein Fehler.

Was die Unterscheidung zwischen "hauseigenen" und "persönlichen" Haupt-Funktionen eines EA betrifft, bin ich mir der Differenzierung
bewußt. Dennoch habe ich auch hierzu nachfolgende Frage:

Nach Initialisierung und Deklaration von Parametern, nach "void OnInit()" und "void DeInit()" beginnt irgendwann auch der Abschnitt "void OnTick()". So der "hauseigene" Funktionsablauf. Alle in diesen letzten 2 Klammern stehenden Operationen werden also per Tick durchlaufen.
Innerhalb meines Codes wurde die "OnTick()"-Funktion zwar richtig angelegt, fälschlicher Weise aber relativ zeitig wieder geschlossen. Es folgten weitere abgegrenzte Bereiche mit eigens kreierten, persönlichen "voids", die weitere Funktionen im EA abdecken. Auch diese Bereiche werden per Tick durchlaufen und funktionieren tadellos.
So wurde das Auslösen der "Trail_SL-Funktion" in einem Abschnitt "void TakeProfit()" untergebracht und wurde dort auch ohne Beanstandung ausgeführt !!! So weit zur Vorgeschichte.

Jetzt waren die in diesem Beitrag erarbeiteten Code-Bereiche A) "Schließen der 1. Position" und B) "updateSL" in den Gesamt-Code zu integrieren.
Bereich A): wurde nun unmittelbar an die "Trail_SL-Funktion" angehängt und "void TakeProfit()" auch erst hier per Klammer geschlossen.
Bereich B): hier funktionierte dieses Anhängen nicht; - hier sollte "Global deklariert" werden. Dem entsprechend habe ich die Funktion "updateSL" unmittelbar hinter der "OnTick()"-Funktion eingeordnet - und siehe da - keine errors !
Allerdings verblaßte diese erste Freude, als ich den ersten Test durchführte !
Ich bin exakt auf dem Stand von vor 5 Tagen. Irgend etwas scheint immer noch nicht zu stimmen.

Hier die Demonstration des "Eibaus", einschl. ausführlichen Code-Details:

Code:
void OnTick() {
       
// ...
 
//--- calculate open orders by current symbol --> and close by TP
   if (CalculateCurrentOrders(Symbol()) == 0) CheckForOpen();

//--- calculate open orders --> and opening a hedging position 
   if (CalculateCurrentOrders(Symbol()) != 0) CheckHedgeOpen();
   
   CheckTakeProfit();
}
//---------------------------------------------------------------------------
void updateSL(int ticket)
{
   ResetLastError();

double TSL = Trail_SL *100 *Point;


   if(OrderSelect(ticket,SELECT_BY_TICKET))
   {
      if(OrderType() == OP_BUY  &&  (openOrders == 1  ||  openOrders == 2))
      {
         if(Bid - OrderOpenPrice() > Trail_Target_1 *100 * Point)
         {
            if(OrderStopLoss() < Bid - TSL || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
                  Print("Error setting Buy trailing stop: ", GetLastError());
            }
         }
      }
      else if(OrderType() == OP_SELL  &&  (openOrders == 1  ||  openOrders == 2))
      {
         if(OrderOpenPrice() - Ask > Trail_Target_1 *100 * Point)
         {
            if(OrderStopLoss() > Ask + TSL || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
                  Print("Error setting Sell trailing stop: ", GetLastError());
            }
         }
      }
   }
}
//------------------- 
//--- mehrere eigene "voids"
//-------------------
void CheckTakeProfit();  {

//--- Bereich TakeProfit

//+==================================================================+
//|  Check for Trailing_StopLoss Conditions                          |  
//+==================================================================+  
int    orderTicket1 = 0;
int    orderTicket2 = 0;
double TSL = Trail_SL *100 *Point;

//--- Trailing_SL for order type BUY --------------------------------+
   if (OrderType() == OP_BUY  &&  (openOrders == 1  ||  openOrders == 2))
      {
      if (Bid - OrderOpenPrice() > Trail_Target_1 *100 * Point)
         {
         if (OrderStopLoss() == 0  ||  OrderStopLoss() < Bid - TSL)
            {
            if (!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
               Print("Error setting Buy trailing stop: ", GetLastError());
            }
         }
      }  
//--- Trailing_SL for order type SELL ---------------------------------+
   if(OrderType() == OP_SELL  &&  (openOrders == 1  ||  openOrders == 2))
      {
      if (OrderOpenPrice() - Ask > Trail_Target_1 *100 *Point)
         {
         if (OrderStopLoss() == 0  ||  OrderStopLoss() > Ask + TSL)
            {
            if (!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
                Print("Error setting Sell trailing stop: ", GetLastError());
            }  
         }
      }

//--- Schließen Ticket1 -------------------------
//    völlig NEU (next user)

   if(orderTicket1)
      updateSL(orderTicket1);
      
   if(orderTicket2)
      updateSL(orderTicket2);


if(orderTicket1 && orderTicket2)
   {
   if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
      {
      if(OrderSelect(orderTicket1,SELECT_BY_TICKET))
         {
         if(OrderType() == OP_BUY)
         {
            if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
               Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
            else
               Print("BIN ZU !!!");
         }
       else if (OrderType() == OP_SELL)
         {

            if(!OrderClose(orderTicket1,OrderLots(),Ask,3))
               Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
            else
               Print("BIN ZU !!!");
         }

         orderTicket1 = 0;
         orderTicket2 = 0;
         }
      }
   }
 }
 }  //  diese Klammer schließt nun den gesamten TP-Bereich
Was kann ich jetzt noch verändern, damit unsere Arbeit nicht umsonst war ? Vielleicht findest Du am WE ein bisschen Zeit
und entdeckst den verhängnisvollen "Haken" ? - Ich würde mich riesig freuen - und auch gegenüber den anderen usern wäre es ein "runder"
Beitrag.

Und wieder spannungsgeladen und ungeduldig - mit
ganz lb. Grüße pt.


PS.: Die Tests dauern ewig, da die 2. Pos. entweder gar nicht erreicht oder ergebnislos schon durch eine 3. Pos. abgelöst wird.
Somit "SORRY", dass ich mich nicht schneller melden konnte.
  #24 (permalink)  
Alt 16.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Oh oh, ich glaub da ist bischen was an Verständnis verrutscht

Gehen wirs nochmal durch:
Code:
void OnTick()
{
   //--- calculate open orders by current symbol --> and close by TP
   if(CalculateCurrentOrders(Symbol()) == 0)
      CheckForOpen();
   
   //--- calculate open orders --> and opening a hedging position 
   if(CalculateCurrentOrders(Symbol()) != 0)
      CheckHedgeOpen();
   
   CheckTakeProfit();
}
Die ersten beiden Funktionen kann ich nicht beurteilen. Hoffe die funktionieren wie gewollt.
Die dritte "CheckTakeProfit()" muss ich jetzt aber etwas auseinandernehmen:

Code:
void CheckTakeProfit();  {
Müsste bei dir eigentlich einen Fehler beim Kompilieren generieren. Das Semikolon gehört da nicht hin.

=== === === === === === === === === === === ===

Code:
double TSL = Trail_SL *100 *Point;
Diese Variable brauchst du ja unabhängig der Funktion. Da bietet es sich doch an, diese global oben zu erstellen.

=== === === === === === === === === === === ===

Code:
//--- Trailing_SL for order type BUY --------------------------------+
   if (OrderType() == OP_BUY  &&  (openOrders == 1  ||  openOrders == 2))
   {
      if (Bid - OrderOpenPrice() > Trail_Target_1 *100 * Point)
      {
         if (OrderStopLoss() == 0  ||  OrderStopLoss() < Bid - TSL)
         {
            if (!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
            Print("Error setting Buy trailing stop: ", GetLastError());
         }
      }
   }
   
   //--- Trailing_SL for order type SELL ---------------------------------+
   if(OrderType() == OP_SELL  &&  (openOrders == 1  ||  openOrders == 2))
   {
      if (OrderOpenPrice() - Ask > Trail_Target_1 *100 *Point)
      {
         if (OrderStopLoss() == 0  ||  OrderStopLoss() > Ask + TSL)
         {
            if (!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
            Print("Error setting Sell trailing stop: ", GetLastError());
         }  
      }
   }
  • Das ist ja der Code, den ich in die "updateSL()" gepakt habe.
  • Ich finde, in "updateSL()" passt er namentlich besser rein, als "CheckTakeProfit()", oder?

=== === === === === === === === === === === ===

Code:
//--- Schließen Ticket1 -------------------------
//    völlig NEU (next user)

if(orderTicket1)
updateSL(orderTicket1);

if(orderTicket2)
updateSL(orderTicket2);


if(orderTicket1 && orderTicket2)
{
   if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
   {
      if(OrderSelect(orderTicket1,SELECT_BY_TICKET))
      {
         if(OrderType() == OP_BUY)
         {
            if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
               Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
            else
               Print("BIN ZU !!!");
         }
         else if (OrderType() == OP_SELL)
         {
            if(!OrderClose(orderTicket1,OrderLots(),Ask,3))
               Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
            else
               Print("BIN ZU !!!");
         }
         
         orderTicket1 = 0;
         orderTicket2 = 0;
      }
   }
}
  • So, nachdem der Punkt zuvor vom Programm bearbeitet wurde, rufst du hier mit "updateSL()" erneut den gleichen Code auf.
  • Der Code gehört eigentlich in die "OnTick()", wie bereits erwähnt.

=== === === === === === === === === === === ===

Code:
void updateSL(int ticket)
{
   ResetLastError();
   
   double TSL = Trail_SL *100 *Point;
   
   if(OrderSelect(ticket,SELECT_BY_TICKET))
   {
      if(OrderType() == OP_BUY  &&  (openOrders == 1  ||  openOrders == 2))
      {
         if(Bid - OrderOpenPrice() > Trail_Target_1 *100 * Point)
         {
            if(OrderStopLoss() < Bid - TSL || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
               Print("Error setting Buy trailing stop: ", GetLastError());
            }
         }
      }
      else if(OrderType() == OP_SELL  &&  (openOrders == 1  ||  openOrders == 2))
      {
         if(OrderOpenPrice() - Ask > Trail_Target_1 *100 * Point)
         {
            if(OrderStopLoss() > Ask + TSL || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
               Print("Error setting Sell trailing stop: ", GetLastError());
            }
         }
      }
   }
}
  • Die Variable "TSL" würde ich wie gesagt global oben definieren.
  • Sowohl hier, als auch im selben Code in der "CheckTakeProfit()" hast du den Code mit
    Code:
    (openOrders == 1  ||  openOrders == 2)
    erweitert. Was genau steckt dahinter? Was machen sie?

Eigentlich müsste dein Code ungefähr so aussehen:
Code:
// OBEN
int    orderTicket1 = 0;
int    orderTicket2 = 0;
double TSL = Trail_SL *100 *Point;
...

// In OnTick()
void OnTick()
{
   //--- calculate open orders by current symbol --> and close by TP
   if(CalculateCurrentOrders(Symbol()) == 0)
      CheckForOpen();
   
   //--- calculate open orders --> and opening a hedging position 
   if(CalculateCurrentOrders(Symbol()) != 0)
      CheckHedgeOpen();
   
   
1  if(orderTicket1)
   updateSL(orderTicket1);
   
2  if(orderTicket2)
   updateSL(orderTicket2);
   
3  if(orderTicket1 && orderTicket2)
   {
      if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
      {
         if(OrderSelect(orderTicket1,SELECT_BY_TICKET))
         {
            if(OrderType() == OP_BUY)
            {
               if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
                  Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
               else
                  Print("BIN ZU !!!");
            }
            else if (OrderType() == OP_SELL)
            {
               if(!OrderClose(orderTicket1,OrderLots(),Ask,3))
                  Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
               else
                  Print("BIN ZU !!!");
            }
            
            orderTicket1 = 0;
            orderTicket2 = 0;
         }
      }
   }
}

// Die Funktion "updateSL()" außerhalb setzen.
// Der Code & die ganze Funktion "CheckTakeProfit()" sind unnötig.
void updateSL(int ticket)
{
   ResetLastError();

   if(OrderSelect(ticket,SELECT_BY_TICKET))
   {
      if(OrderType() == OP_BUY)
      {
         if(Bid - OrderOpenPrice() > Trail_Target *100 * Point)
         {
            if(OrderStopLoss() < Bid - TSL || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
                  Print("Error setting Buy trailing stop: ", GetLastError());
            }
         }
      }
      else if(OrderType() == OP_SELL)
      {
         if(OrderOpenPrice() - Ask > Trail_Target *100 * Point)
         {
            if(OrderStopLoss() > Ask + TSL || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
                  Print("Error setting Sell trailing stop: ", GetLastError());
            }
         }
      }
   }
}
  • Die drei Variablen außerhalb, oben definieren.
  • OnTick():
    1. Ist "orderTicket1 != 0" dann in der Funktion "updateSL()" Bedingungen überprüfen und ggf. StopLoss anpassen.
    2. Ist "orderTicket2 != 0" dann in der Funktion "updateSL()" Bedingungen überprüfen und ggf. StopLoss anpassen.
    3. Ist "orderTicket1 && orderTicket2 != 0" dann in den folgenden Codezeilen schauen, ob Order2 geschlossen ist.
      Ist das der Fall, so Order1 schließen.
  • Der Code der Funktion "updateSL()" hat nichts in der "CheckTakeProfit()" zu suchen.
    Auch der andere Code in "CheckTakeProfit()" gehört nicht darein. Die Funktion ist somit unnötig!

=== === === === === === === === === === === ===

Code:
}  //  diese Klammer schließt nun den gesamten TP-Bereich
Ironie des Schiksals: Eben diese Klammer ist eine Klammer zuviel!
  #25 (permalink)  
Alt 16.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Lieber next user, Hallo!

Es ist einfach nur toll, dass Du mich nicht "auf die Folter spannst", sondern mir so schnell geantwortet hast. DANKE.
Dem entsprechend bin ich jedes Wort, jede Silbe und manchesmal sogar jeden Buchstaben durchgegangen und habe jeden Logikansatz nachvollzogen.

Deine Argumente sind absolut überzeugend !

Das, was zwischenzeitlich etwas durcheinandergeraten war, sollte jetzt wieder geradegerückt sein und in den richtigen Bahnen verlaufen.

Fast auf Anhieb "NULL error" !!! Schon DAS ist richtig gut ! ... Und wenn dann noch die Live-Tests am Mo. halbwegs klappen - ohhhh, dass wäre ... !

Lieber next user; - zwischendurch nochmals DANKE; - ich melde mich !
LG. pt.

PS.: ... und wenn dann der in diesem Thema ursprünglich gewünschte Part tatsächlich funktionsfähig ist, gebe ich mehr als nur gern, meine Empfehlung weiter !
Allein das "Hin und Her" der Diskussionen war lehrreich und hilft zumindest mir ein großes Stück weiter.
  #26 (permalink)  
Alt 17.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Lieber next user, nochmals Hallo!
Was in den letzten Tagen relativ schnell abgearbeitet wurde, kann ich heute "Revue passieren" lassen:

Zitat 1:
Zitat:
void CheckTakeProfit(); {
Müsste bei dir eigentlich einen Fehler beim Kompilieren generieren. Das Semikolon gehört da nicht hin.
Wie sich das Semikolon "eingeschlichen" hat, weiß ich nicht. Im Original-Code ist es zumindest NICHT enthalten.

Zitat 2:
Zitat:
double TSL = Trail_SL *100 *Point;
Diese Variable brauchst du ja unabhängig der Funktion. Da bietet es sich doch an, diese global oben zu erstellen.
Richtig ! Habe jetzt verschiedene Variablen dem laufenden Code entnommen und global deklariert.

Zitat 3:
Zitat:
... Code ...
Das ist ja der Code, den ich in die "updateSL()" gepakt habe.
Ich finde, in "updateSL()" passt er namentlich besser rein, als "CheckTakeProfit()", oder?
"CheckTakeProfit()" paßt natürlich überhaupt nicht ! Dennoch habe ich mich für "void CheckStopLoss()" entschieden, um den Terminus der anderen Funktionen beizubehalten.

Zitat 4:
Zitat:
... Code ...
So, nachdem der Punkt zuvor vom Programm bearbeitet wurde, rufst du hier mit "updateSL()" erneut den gleichen Code auf.
Der Code gehört eigentlich in die "OnTick()", wie bereits erwähnt.
Lapsus meinerseits;- sorry ! Er wird jetzt nur noch 1 x verwendet und sollte an der korrekten Stelle stehen.

Zitat 5:
Zitat:
Sowohl hier, als auch im selben Code in der "CheckTakeProfit()" hast du den Code mit
(openOrders == 1 || openOrders == 2)
erweitert. Was genau steckt dahinter? Was machen sie?
Sinn und Zweck ist, dass die Trailing-Order für Pos. 1 UND für Pos. 2 erfolgen soll (auch, wenn das im Moment nicht sehr einleuchtend ist). Rein strategisch ist es aber dennoch sinnvoll.

Zitat 6:
Zitat:
OnTick():
Ist "orderTicket1 != 0" dann in der Funktion "updateSL()" Bedingungen überprüfen und ggf. StopLoss anpassen.
Ist "orderTicket2 != 0" dann in der Funktion "updateSL()" Bedingungen überprüfen und ggf. StopLoss anpassen.
Ist "orderTicket1 && orderTicket2 != 0" dann in den folgenden Codezeilen schauen, ob Order2 geschlossen ist.
Ist das der Fall, so Order1 schließen.
Wie bereits erwähnt: Diese Herangehensweise ist einfach genial. Und jetzt, wo ich den Inhalt verstanden habe, - eine tolle, neue Erkenntnis.

Zitat 7:
Zitat:
Der Code der Funktion "updateSL()" hat nichts in der "CheckTakeProfit()" zu suchen.
O.k. ! - siehe oben: - ein Lapsus.

Zitat 8:
Zitat:
Auch der andere Code in "CheckTakeProfit()" gehört nicht darein. Die Funktion ist somit unnötig!
Ja und Nein ! Klar gehört der Code NICHT da hinein.
Die Funktion "CheckTakeProfit()" ist aber dennoch notwendig für eine 3., 4., 5. und 6. Order (DAX). Diese TPs werden "step by step" verkleinert, um eine 7. oder 8. Position möglichst auszuschließen. Hierzu wäre allerdings eine Strategie-Erläuterung sinnvoll, um das Gesamtanliegen des EA zu verstehen. 2 Anhänge sollen hierzu wenigstens eine kleinen Einblick vermitteln. (Bei näherem Interesse bitte einfach nachfragen.)

And the last:
Zitat:
Code:
} // diese Klammer schließt nun den gesamten TP-Bereich
Ironie des Schicksals: Eben diese Klammer ist eine Klammer zuviel!
No comment ! Du sagst es !

So weit, so gut. Und wenn der gesamte Code dann etwas "aufgeräumt" und strukturiert ist, kann er sogar ästhetisch gut aussehen und "das Auge erfreuen"!

Dieses kleine "Zwischenspiel" war ich noch schuldig. Auch ein kleiner Einblick zur Wirkungsweise des EA und in die Performance gehören sicher dazu (siehe Anhänge).
Ansonsten werde ich mich am Mo. melden, um Erfolg oder Misserfolg meiner Tests zu verkünden.

Bis dahin, LG. pt.
Angehängte Grafiken
Dateityp: jpg Hedging_Grundidee.jpg (80,8 KB, 8x aufgerufen)
Dateityp: jpg Statement_Forex_10_01_18.jpg (253,2 KB, 8x aufgerufen)
  #27 (permalink)  
Alt 19.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Hallo an alle user, die das Thema begleiten,
und natürlich ein Hallo an next user !

Mit Bangen hatte ich dem Moment entgegengesehen, der nun über Erfolg oder Misserfolg entscheiden würde: Die ersten
Tradingstunden der neuen Woche. Und um nicht lange drumherum zu reden, - der Code funktioniert NICHT !
Was könnte jetzt noch falsch sein ? "Sehe ich den Wald vor lauter Bäumen" nicht mehr?

Hier nochmals der vollständige Code:

Code:
int OnInit() 
{
//--- calculate open orders by current symbol --> and close by TP
   if (CalculateCurrentOrders(Symbol()) == 0) CheckForOpen();

//--- calculate open orders --> and opening a hedging position 
   if (CalculateCurrentOrders(Symbol()) != 0) CheckHedgeOpen();

//+==================================================================+
//|  Check for Trailing_StopLoss Conditions                          |  
//+==================================================================+  

int    orderTicket1 = 0;
int    orderTicket2 = 0;

//--- Nachträgliches Schließen Ticket1 (Pos.1) ---------------------+
//    völlig NEU (next user) und innerhalb der "void OnTick"

   if (orderTicket1) 
       TrailStopLoss(orderTicket1);
      
   if (orderTicket2) 
       TrailStopLoss(orderTicket2);


   if(orderTicket1 && orderTicket2)                                         
   {
      if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
      {
         if(OrderSelect(orderTicket1,SELECT_BY_TICKET))
         {
            if(OrderType() == OP_BUY)
            {
               if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
                  Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
               else
                  Print("BIN ZU !!!");
            }
            else if (OrderType() == OP_SELL)
            {
               if(!OrderClose(orderTicket1,OrderLots(),Ask,3))
                  Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
               else
                  Print("BIN ZU !!!");
            }
            orderTicket1 = 0;
            orderTicket2 = 0;
         }
      }
   }
}

//--- Trailing SL - openOrder ----------------------------------------+
//    Diese Funktion "TrailStopLoss()" außerhalb "void OnTick()" setzen 

void TrailStopLoss(int ticket)  
{
   ResetLastError();

   if(OrderSelect(ticket,SELECT_BY_TICKET))
   {  
      if(OrderType() == OP_BUY  &&  (openOrders == 1  ||  openOrders == 2))
      {
         if(Bid - OrderOpenPrice() > Trail_Target_1 *100 * Point)
         {
            if(OrderStopLoss() < Bid - TSL || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
               return;
                  Print("Error setting Buy trailing stop: ", GetLastError());
            }
         }
      }
      else if(OrderType() == OP_SELL  &&  (openOrders == 1  ||  openOrders == 2))
      {
         if(OrderOpenPrice() - Ask > Trail_Target_1 *100 * Point)
         {
            if(OrderStopLoss() > Ask + TSL || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
               return;
                  Print("Error setting Sell trailing stop: ", GetLastError());
            }
         }
      }
   }
}
Das Problem ist jetzt noch größer, als zuvor: Position 2 erreicht das Trail_Target [BUY = +9] (setzt jetzt den TP [+18]) und schließt
sofort danach Pos.1 und Pos. 2 bei eben diesen + 9 Punkten (abzüglich Spread), - ohne sichtlichen Grund.
Auch in der 1. Position wird nun gar nicht mehr getrailt !

Schade, eine ganze Woche Arbeit, ohne den gewünschten Erfolg. Ich habe zwar vieles dazugelernt und kann die gewollten
Schritte auch nchvollziehen, dennoch liegen ein oder mehrere Fehler vor !

In meinem ursrünglichen Code hatte wenigstens die Pos.1 tadellos funktioniert.
Ursprünglich entstand das o.a. Problem nur bei der Pos. 2, hatte ich (CloseAllOrder()" eingefügt.
Ließ ich "CloserAllOrder()" weg, funktionierte auch hier das Trailing hervorragend; - allerdings wurde die Pos. 1 dann nicht geschlossen.
Soweit zur Erinnerung.

Was nun ??? Große Trauer, - ich war soooo zuversichtlich !

LG. pt.
  #28 (permalink)  
Alt 19.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von piptrade Beitrag anzeigen
Hier nochmals der vollständige Code:
Ich hoffe, du hast den Code auch WIRKLICH in die entsprechenden Funktionen gepackt! Dein geposteter Code liegt nähmlich (obere Hälfte) in "OnInit()"!

Zitat:
Zitat von piptrade Beitrag anzeigen
Das Problem ist jetzt noch größer, als zuvor: Position 2 erreicht das Trail_Target [BUY = +9] (setzt jetzt den TP [+18]) und schließt
sofort danach Pos.1 und Pos. 2 bei eben diesen + 9 Punkten (abzüglich Spread), - ohne sichtlichen Grund.
Auch in der 1. Position wird nun gar nicht mehr getrailt !
  • Hier musst du jetzt erstmal herausfinden, warum Order 2 geschlossen wird.
  • Denn erst wird Order 2 geschlossen, was dann die Bedingungen für's Schließen der Order 1 erfüllt.
  • Wie kommst du eigentlich darauf, nach der "OrderModify-Abfrage" ein "return" zu setzen? So bekommst du die
    Errormeldung in der nächsten Zeile erst garnicht!
  • Schau mal bitte in deinem Code und ermittle, WO genau die Order 2 (durch welchen Codeteil) geschlossen wird.
    Ich sehe nähmlich bei dem kleinen Ausschnitt keine Möglichkeit, sofern du es auch richtig implementiert hast!
  • Auch kenne ich deine anderen Funktionen nicht. Sofern du auch in denen etwas mit den Orders machst, kann ich ja
    schlecht herausfinden, wo der Fehler ist.

Falls du es nicht schaffst, den Zeitpunkt & Codestelle beim Schließen der 2 Order zu ermitteln, dann poste mal den ganzen,
relevanten Code und nicht nur Passagen. Dann kann ich auch viel wahrscheinlicher den Fehler sehen!
  #29 (permalink)  
Alt 19.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Hallo next user,

lieb von Dir, dass Du "am Ball bleibst". Kann morgen früh in aller Ruhe Deine Hinweise durchgehen. In diesem
Zusammenhang werde ich auch versuchen einen Gesamtüberblick des EA zusammenzustellen, damit Fehlerstellen leichter erkennbar
werden.
Ich hoffe nur, wir (Du) finden den "Haken.

Bis dahin LG pt.
  #30 (permalink)  
Alt 20.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

So, da bin ich wieder !
... und das mit ersten Erkenntnissen :

Hallo, lieber next user,

habe mir jetzt nochmals die Zeit genommen, alles in Ruhe zu überprüfen.
Die erste Erkenntnis war nun, dass der von Dir gewählte Begriff "updateSL" (unter "void OnTick()"
die ganze Anglegenheit tatsächlich am besten trifft.
Dieses update ist ja wichtig, um a) die Positionen 1 + 2 ständig zu "scannen", b) zu registrieren, dass ggf. eine der beiden
Tickets geschlossen wurde und c) um dann nachträglich die Pos. 1 zu schließen.
Bis dahin ist in Punkto "Block 1" alles recht gut verständlich.
(Ohne den 2. "Block" "void updateSL(int ticket)" wird allerdings "updateSL" beim Kompellieren als error ausgewiesen.)

Somit muß dieses "updateSL" also in einem 2. "Block" = "void updateSL(int ticket)" nochmals aufgegriffen werden
und - siehe da, - das o.a. error verschwindet, da es jetzt erkannt wird.
Auch bis dahin ist alles halbwegs verständlich.

Nicht ganz verständlich hingegen ist, was der 2. "Block" bewirkt.
Theoretisch sind jetzt alle Orders geschlossen und es sollte (irgendwann) eine neue, erste Order, gem. Strategie-Konditionen,
eröffnet werden. So z.B. eine BUY-Pos.. Auch das ist noch OK.
Damit gibt es jetzt wieder ein Ticket in der History (wie eigentlich immer), ein zweites Ticket ist geöffnet. Dies wiederum
wird unter OrderSelect erkannt, was zum Schließen der Position führen müßte. Kaum wäre die neue 1. Pos. geöffnet, würde sie auch
schon wieder gechlossen werden ?
Wo ist hier der Gedankenfehler ? - oder ist der Gedanke ggf. gar nicht so falsch ?

Und ein zweiter Gedanke:
Angenommen, die o.a. 1. Pos. verbleibt im Markt, sie wird selektiert, es wird festgestellt BUY oder SELL, so würde
bei Erreichen des Trail_Targets der Trail_SL übergeben werden.
Weiterhin angenommen, die 1. Pos. erreicht ihr Trail_Target NICHT und rutscht statt dessen in die Verlustzone, ---> jetzt wird
gehedged und eine 2. Pos. zusätzlich geöffnet.

Somit gibt es jetzt 2 geöffnete Tickets, wobei nur die 2. Pos. den Trail_SL erhalten soll.
Da im Code aber nur nach Ticket bzw. Tickets und anschließend nur nach BUY bzw. SELL unterschieden wird, müßte doch wenigstens auch die "openOrders == 2" angesprochen werden ? - Oder ? Wie sonst kann der Trail_SL an die richtige Pos. übergeben werden ?

Erst einmal bis zu diesem Punkt. Vielleicht kannst Du meine ersten Gedanken nochmals prüfen und sollten sie Fehler aufweisen,
korrigieren.

LG. pt.
Thema geschlossen

Lesezeichen

Stichworte
alle order schließen, closeallorders, mql4, programmierung, programmierung metatrader, programmierung mql4, trailingstop

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 10:46 Uhr.





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