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: 317
Gesamt: 317
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

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

Hallo, next user,

würde mich freuen, wenn Du auf meinen letzten comment antworten würdest. Haben wir die ganze Zeit ggf. eines der wichtigsten Dinge übersehen ?

Kann doch eigentlich nicht sein ! Und doch stehen die o.a. Argumente im Raum, um nochmals aufgegriffen zu werden !

Mit bangen Hoffen -
LG. pt.
  #32 (permalink)  
Alt 21.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
Hallo, next user,

würde mich freuen, wenn Du auf meinen letzten comment antworten würdest.
Bin nicht abgesprungen.
Hatte gestern nur keine Zeit, daher erst jetzt eine Antwort.

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

Zitat:
Zitat von piptrade Beitrag anzeigen
(Ohne den 2. "Block" "void updateSL(int ticket)" wird allerdings "updateSL" beim Kompellieren als error ausgewiesen.)
Was hast du denn jetzt schon wieder gemixt?
"void updateSL(int ticket)" ist die Funktion! "updateSL(...)" (MIT KLAMMERN) ist ein Funktionsaufruf. Wie eben im Code:
Code:
void updateSL(int ticket) // Funktion selbst
...
if(orderTicket1)
   updateSL(orderTicket1); // Funktionsaufruf
Also wo hast du plötzlich das lose "updateSL" her? Da gibts natürlich einen Error.

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

Zitat:
Zitat von piptrade Beitrag anzeigen
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.
Ich verstehe das wiederum nicht.
"updateSL" ... "nochmals aufgegriffen werden" ... HÄ?
Poste mal bitte den Code von deinem MIX!

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

Zitat:
Zitat von piptrade Beitrag anzeigen
Nicht ganz verständlich hingegen ist, was der 2. "Block" bewirkt.
Nach den beiden Punkten zuvor, frage ich mich grad, was genau bei dir der zweite Block ist?

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

Zitat:
Zitat von piptrade Beitrag anzeigen
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 ?
Ich verstehe, was du meinst. Aber in meinem Code geht das nicht, somit sollte es auch nicht zu einer direkten Schließung kommen, denn:
  • Als erstes wird ja abgefragt ob
    Code:
    if(orderTicket1 && orderTicket2)
    beide Variablen ein Ticket beinhalten (ungleich 0 sind).
  • Dann wird abgefragt, ob die zweite Order geschlossen ist.
    Code:
    if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
    Diese Abfrage wird ja aber erst DANN passiert, wenn die erste Abfrage "true" ergibt.
  • Ist die zweite Order (erster Durchgang) geschlossen, kommt ja folgender Code zum Einsatz:
    Code:
    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;
    Neben dem Schließen der ersten Order (erster Durchgang) werden hier ja ebend auch die beiden Ordervariablen auf "0" gesetzt.
    Wenn du jetzt eine neue Order1 hast und "orderTicket1" mit deren Ticket fütterst, so ist "orderTicket2" ja aber immer noch "0",
    was ein Betreten dieses Codeabschnittes durch Punkt 1 aber verhindert. Somit kann die Order1 (zweiter Durchgang) NICHT gelöscht werden!

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

Zitat:
Zitat von piptrade Beitrag anzeigen
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 ?
Vielleicht habe ich dich falsch verstanden, aber du hast dazu doch ebend die beiden Ticker-Variablen, die individuell in
"updateSL" angesprochen werden.
  #33 (permalink)  
Alt 21.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Hallo next user,

konnte erst jetzt im "Mail-Kästchen" nachsehen und so Deine Nachricht aufnehmen. DANKE.

Dennoch bin ich momentan so verwirrt, dass ich gar nicht mehr so richtig weiß, wo ich anfangen oder auch weitermachen soll.

Wenn Dein letzter comment richtig ist (... und davon gehe ich aus), sollte ich tatsächlich erst einmal einige Schritte zurückgehen und Deine Hinweise beachtend den Code rekonstruieren. Anschließend würde ich dann diesen Code mit allen relevanten Bestandteilen ins Forum stellen. Vielleicht lässt sich so der bestehende Fehler am ehesten finden.

Dennoch werde ich ein klein wenig Zeit dazu brauchen, um nicht die alten Fehler zu wiederholen. Deshalb "Sorry", wenn es ein bisschen dauert.

LG. pt.
  #34 (permalink)  
Alt 21.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
... Anschließend würde ich dann diesen Code mit allen relevanten Bestandteilen ins Forum stellen. Vielleicht lässt sich so der bestehende Fehler am ehesten finden.
Jap, das denke ich auch.

Zitat:
Zitat von piptrade Beitrag anzeigen
Dennoch werde ich ein klein wenig Zeit dazu brauchen, um nicht die alten Fehler zu wiederholen. Deshalb "Sorry", wenn es ein bisschen dauert.
Keine Eile. Mach dir nen Tee und schalt mal vielleicht für ne Runde ab.
  #35 (permalink)  
Alt 22.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Hallo next user,

das mit dem "Tee" und dem "Abschalten" war eine gute Idee. Und die Gesamtstruktur des EA darzustellen ev. auch; - denn es wurden noch 2, 3 Kleinigkeiten gefunden, die an einer "runden Sache" vorbeigingen.

Und "SO" sieht die Ges.-Struktur, einschl. der erarbeiteten Blöcke 1 + 2, jetzt aus:

Code:
//--- globale Deklarationen (extern bzw. intern) --------------------+
      int    orderTicket1 = 0;
      int    orderTicket2 = 0;
      double TSL = Trail_SL *100 *Point;
//===================================================================+
int  OnInit() { view graphic and calculat "AccountFreeMargin" 
     }
//===================================================================+
int  DeInit() { Funktion fehlt noch !   <-------------------------------fehlt noch !
     }
//===================================================================+
void OnTick() { 

//--- function for "AccountFreeMargin"
//--- Add. Conditions for TradeZoneTimer
                                                
//--- 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();                 //   nicht notwendig (next user)!!!

//=========================================        
//--- open TrailStopLoss (CheckClose_Pos.1) - Block 1 - 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;
         }
      }
   }
//---
}      //  end "void OnTick()"

//===================================================================+
//--- open TrailStopLoss    Block 2  ----------------- NEU (next user)
//===================================================================+
void updateSL(int ticket)  {
   ResetLastError();

   if(OrderSelect(ticket,SELECT_BY_TICKET))
   {
      if(OrderType() == OP_BUY  &&  (openOrders == 1  ||  openOrders == 2))
      {
         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  &&  (openOrders == 1  ||  openOrders == 2))
      {
         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());
            }
         }
      }
   }
}
//===================================================================+
int CalculateCurrentOrders(string symbol) { Calculate open positions 
    }
//===================================================================+    
void CheckForOpen() { Check for openOrder Conditions 
    }
//===================================================================+
double LotsOptimized() { MoneyManagement - Calculate lot size   
    }
//===================================================================+ 
void CheckTakeProfit()  { Check for TakeProfit Conditions 
    }
//+==================================================================+  
void CheckHedgeOpen() { Check for HedgeOrder Conditions                                 
    }
//+==================================================================+
void CloseAllOrders() { AllOrdersClosed function                                            
} 
//===================================================================+
//--- End -----------------------------------------------------------+
Sicher wird durch die o.a. Codedarstellung einiges deutlicher; - und vielleicht wird sie sogar als richtig befunden. Das wäre natürlich das HIGHLIGHT für den heutigen Tag !

Anbei möchte ich nochmals erwähnen: Toll, dass Du mich SO an der Hand nimmst, mein stetes "Aufbegehren" ohne zu Murren richtig stellst und dabei eine Ausdauer zeigst, für die man nur dankbar sein kann.
In diesem Zusammenhang bin ich immer noch davon überzeugt, dass wir (Du) es schaffen werden, das "Ding" korrekt zum Laufen zu bringen.

Also, nochmals danke und
LG. pt.

PS.: Sobald ich Dein "OK" bzw. letzte Änderungen vorliegen habe, werde ich den Original-Code nochmals überprüfen/angleichen. Dann sollten auch die nächsten Tests mit Erfolg verlaufen.
  #36 (permalink)  
Alt 22.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Ohhh - , - diesen Teil hatte ich noch vergessen.
Also der Nachtrag: Für die Pos. 2 wird die "CloseAllOrders()" nur noch in "void CheckTakeProft()" verwendet:

Code:
void CheckTakeProfit() {

   for (int i = OrdersTotal() - 1; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) continue;
      if (OrderMagicNumber() != MagicNumber || OrderSymbol() != Symbol()) continue;

//--- TakeProfit for order type BUY ---------------------------------+       
//=================================
//--- Pos. 1 (FixLevel + ATR 1) ---
   if (OrderType() == OP_BUY  &&  openOrders == 1  &&  OrderTakeProfit()==0) {
      if (Bid >= OrderOpenPrice() + Trail_Target_1 * 100 * Point) 
         {
         double TakeProfit_1  =  OrderOpenPrice() + Trail_Target_1 + (1.2 *SMA7_ATR5_1);
         bool OrderAngepasst  =  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_1,0,Lime); 
         }                                                                      
      return;
      } 
//--- Pos. 2 (FixLevel + ATR 2) ---
   if (OrderType() == OP_BUY  &&  openOrders == 2  &&  OrderTakeProfit()==0) {
      if (Bid >= OrderOpenPrice() + Trail_Target_2 * 100 * Point) 
         {
         double TakeProfit_2  =  OrderOpenPrice() + Trail_Target_2 + SMA7_ATR5_1;
         OrderAngepasst       =  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_2,0,Lime); 
      if (Bid >= TakeProfit_2) 
         CloseAllOrders();
         } 
      }  
//--- analog for SELL
   }
Ich hoffe, dass hilft ein wenig weiter ! ?

Kleiner Hinweis am Rande: dieses "CloseAllOrders()" unter"void CheckTakeProft()" könnte ggf. auch einen Mangel aufweisen, da in manchen GesamtCodeVarianten die Pos. 2 zwar eröffnet, dann aber sehr schnell am Trail_Target wieder geschlossen wurde. Man kann dann im Chart gerade noch sehen, dass TP und Trail_SL gesetzt werden und schon ist die Position einfach zu. (Auch in der History wurden dann weder TP noch SL eingetragen !) Vielleicht hilft auch das.

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

Schaue mir das nachher mal an, muss jetzt erstmal weg...
  #38 (permalink)  
Alt 22.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Warte in gespannte Haltung - DANKE !
  #39 (permalink)  
Alt 23.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Sorry,

wurde gestern doch etwas spät.
So, jetzt mal zu deinem Code:

Erstmal...
Zitat:
Zitat von piptrade Beitrag anzeigen
int DeInit() { Funktion fehlt noch ! <-------------------------------fehlt noch !
}
Wird bei dir hoffentlich "OnDeinit()" heißen

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

Zitat:
Zitat von piptrade Beitrag anzeigen
CheckTakeProfit(); // nicht notwendig (next user)!!!
Hehe, so gaaaaanz entspricht das nicht der Wahrheit.
Meine Aussage bezog sich auf "CheckTakeProfit()", wie du sie HIER gepostet hast. Mit dem Inhalt dort IST sie ja komplett unnötig gewesen.
Der Inhalt der Funktion, wie du ihn jetzt gepostet hast, kam in dem verlinkten Post ja garnicht vor.

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

Da in dem Codeblock 1 ja die Order mit einer Meldung geschlossen wird, und du dies sicherlich erwähnt hättest, ist das Problem wohl
in "CheckTakeProfit()" oder deiner Funktion, welche die Orders öffnet, zu suchen.

Jetzt mal zu folgendem Code:
Code:
//--- Pos. 1 (FixLevel + ATR 1) ---
if(OrderType() == OP_BUY  &&  openOrders == 1  &&  OrderTakeProfit()==0)
{
   if(Bid >= OrderOpenPrice() + Trail_Target_1 * 100 * Point) 
   {
      double TakeProfit_1  =  OrderOpenPrice() + Trail_Target_1 + (1.2 *SMA7_ATR5_1);
      bool OrderAngepasst  =  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_1,0,Lime); 
   }
   return;
}

//--- Pos. 2 (FixLevel + ATR 2) ---
if(OrderType() == OP_BUY  &&  openOrders == 2  &&  OrderTakeProfit()==0)
{
   if(Bid >= OrderOpenPrice() + Trail_Target_2 * 100 * Point) 
   {
      double TakeProfit_2  =  OrderOpenPrice() + Trail_Target_2 + SMA7_ATR5_1;
      OrderAngepasst       =  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_2,0,Lime); 
      
      if(Bid >= TakeProfit_2) 
         CloseAllOrders();
   }
}
  • Ein möglicher Fehler ist wohl deine Variable "openOrders". Die if's unterscheiden sich in der Abfrage ja nur bei dieser Variable.
    Du willst mit dieser Variable sicherlich zwischen erster und zweiter Order unterscheiden, richtig?
    Das Problem ist, das du sie in der Schleife nutzt. Das heißt, wenn die Variable "1" ist, bearbeitest du ALLE ORDERS mit dem
    ersten if-Block, wenn "2" dann entsprechend ALLE ORDERS mit dem zweiten if-Block. Das ist nicht so gedacht, oder?
  • Zweite mögliche Fehlerquelle sind die Zeilen
    Code:
    if(Bid >= OrderOpenPrice() + Trail_Target_2 * 100 * Point)
    ...
    double TakeProfit_2  =  OrderOpenPrice() + Trail_Target_2 + SMA7_ATR5_1;
    ...
    if(Bid >= TakeProfit_2) 
       CloseAllOrders();
    Da ich den Wert von "SMA7_ATR5_1" nicht weiß, ist es schwer eine Aussage zu treffen.
    Aber wenn hier jetzt "Trail_Target_2 + SMA7_ATR5_1" KLEINER als "Trail_Target_2 * 100 * Point" wäre, so erfüllt es
    die Bedingung des zweiten if's und du rufst "CloseAllOrders()" auf.
  • Die Variable "OrderAngepasst" wird nicht weiter in der Funktion genutzt, ist aber nur in dieser existen, hoffe das weißt du.
  • Jetzt mal unabhängig der obigen Punkte, den Code könnte man noch etwas zusammenfügen...
    Code:
    void CheckTakeProfit()
    {
       for(int i=OrdersTotal()-1; i >= 0; i--)
       {
          if(!OrderSelect(i, SELECT_BY_POS)) continue;
          if(OrderMagicNumber() != MagicNumber || OrderSymbol() != Symbol()) continue;
          
          if(OrderType() == OP_BUY && OrderTakeProfit() == 0)
          {
             if(openOrders == 1)
             {
                if(Bid >= OrderOpenPrice() + Trail_Target_1 * 100 * Point) 
                {
                   double TakeProfit_1  =  OrderOpenPrice() + Trail_Target_1 + (1.2 *SMA7_ATR5_1);
                   bool OrderAngepasst  =  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_1,0,Lime); 
                }
             }
             else if(openOrders == 2)
             {
                if(Bid >= OrderOpenPrice() + Trail_Target_2 * 100 * Point) 
                {
                   double TakeProfit_2  =  OrderOpenPrice() + Trail_Target_2 + SMA7_ATR5_1;
                   OrderAngepasst       =  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_2,0,Lime); 
                   
                   if(Bid >= TakeProfit_2) 
                      CloseAllOrders();
                }
             }
          }
       }
    }

In dem anderen Code habe ich jetzt beim kurzen Durchgehen keinen Fehler gesehen, der dein Problem begründen würde.
Also schau dir nochmal "CheckTakeProfit()", sowie ggf. die Funktion zum Öffnen der Orders, falls die Order SOFORT wieder
geschlossen wird, an.

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

Zitat:
Zitat von piptrade Beitrag anzeigen
... da in manchen GesamtCodeVarianten die Pos. 2 zwar eröffnet, dann aber sehr schnell am Trail_Target wieder geschlossen wurde. Man kann dann im Chart gerade noch sehen, dass TP und Trail_SL gesetzt werden und schon ist die Position einfach zu. (Auch in der History wurden dann weder TP noch SL eingetragen !) Vielleicht hilft auch das.
GesamtCodeVarianten? Testest du etwa mehrere Bestandteile getrennt?
---------------------------------------------------
Was du schreibst würde vom Ablauf her bedeuten:
  1. "CheckTakeProfit()" wird das erste mal aufgerufen => TP wird gesetzt (im Chart).
  2. "updateSL()" wird das erste mal aufgerufen => (Trail)SL wird gesetzt (im Chart).
  3. Beim nächsten Durchgang würde "CheckTakeProfit()" wegen "if(... OrderTakeProfit() == 0 ...)" nichts machen.
    Auch "updateSL()" würde nichts machen. Außerdem wird in "updateSL()" keine Order geschlossen.
  4. Und auch die andere Schließmöglichkeit (beim Block mit "if(orderTicket1 && orderTicket2) ...") kann es nicht sein.
    Zum einen hättest du dann eine Ausgabe
    Code:
    if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
       Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
    else     Print("BIN ZU !!!");
    erhalten, zum anderen würde dann ja die Order 1 geschlossen werden, und nicht Order 2.

Logisch betrachtet kann die Order dann NICHT in Block 1 oder "CheckTakeProfit()" geschlossen werden, wenn wirklich
TP UND SL gesetzt werden. Meine Vermutung:
  • Deine Beschreibung passt IDEAL zu folgendem Codeabschnitt
    Code:
    if(Bid >= OrderOpenPrice() + Trail_Target_2 * 100 * Point) 
    {
       double TakeProfit_2  =  OrderOpenPrice() + Trail_Target_2 + SMA7_ATR5_1;
       OrderAngepasst       =  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_2,0,Lime); 
       
       if(Bid >= TakeProfit_2) 
          CloseAllOrders();
    }
    Erst wird TP durch "OrderModify()" gesetzt (was du im Chart gesehen hast?), dann aber durch erfüllter Bedingung durch "CloseAllOrders()"
    geschlossen. Dem widerspricht aber, das "updateSL()" NACH "CheckTakeProfit()" aufgerufen wird. Dann dürftest du
    aber KEINEN SL im Chart sehen, wenn wirklich in "CheckTakeProfit()" geschlossen wurde.
  • Die zweite Stelle, an der geschlossen wird, ist
    Code:
    if(orderTicket1 && orderTicket2)
    ...
    Selbst wenn wir jetzt mal außer Acht lassen, das hier ebend nur die Order 1 und nicht Order 2 geschlossen wird,
    könnte es trotzdem nicht daran liegen, sofern du die Variablen "orderTicket1 / 2" nicht fehlerhaft nutzt (bei Ordereröffnung z.B.).
  • Bist du dir mit dem Setzen von TP UND SL auch wirklich sicher? Dann ist die Frage, was es mit den
    beiden fehlenden Werten in der Historie auf sich hat.

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


Am besten, du setzt an allen relevanten Stellen Ausgaben ein, um GENAU zu erfahren, was der Auslöser fürs Schließen ist.
  #40 (permalink)  
Alt 23.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Hallo, next user,

DANKE, DANKE, DANKE ! - das ist schon fast zuviel des Guten ! Dennoch werde ich Stück für Stück jedem Hinweis nachgehen:

1. Ok. - "OnDeInit()" = erledigt.
===
2. "CheckTakeProfit()" - alleinig, ist natürlich unnötig. Ich ging davon aus, dass Du aus dieser
1-zeiligen Erwähnung (unter "void OnTick()") auch eine später im Code enthaltenen Funktion ableitest.
"CheckForOpen()" bzw. "CheckHedgeOpen()" werden in diesen Bereich ja auch angeführt, - die zugehörigen
Funktionsabläufe aber ebenfalls nicht gepostet.
====
Zitat:
Da in dem Codeblock 1 ja die Order mit einer Meldung geschlossen wird, und du dies sicherlich erwähnt hättest, ist das Problem wohl
in "CheckTakeProfit()" oder deiner Funktion, welche die Orders öffnet, zu suchen.
Die Funktion "CheckTakeProft()" liegt Dir vor und Postionseröffnungen finden nur in "void CheckForOpen()"
Code:
res = OrderSend(Symbol(), OP_SELL, LotsOptimized(), Bid, 3, 0, 0, "", MagicNumber, 0, Red);
      return;
und im "void CheckHedgeOpen()" (hier Pos.2):
Code:
 if (OrderType() == OP_BUY  &&  openOrders  == 2) { 
         if (Close[0] < OrderOpenPrice() - HedgeTarget_1 * 100 * Point) {  //  6 Pkt.
            lot = LotsOptimized();
            Print("SELL", "  ", AccountFreeMarginCheck(Symbol(), OP_SELL, lot));
         if (AccountFreeMarginCheck(Symbol(), OP_SELL, lot) <= 0) return; 
            res = OrderSend(Symbol(), OP_SELL, lot, Bid, 3, 0, 0, "", MagicNumber, 0, Red);     //  öffne Pos. 3 
         }
         return;
      }
statt.
Sowohl das Öffnen mittels Hedging oder auch das orderOpen (nach Strategie) haben bisher keinerlei
Probleme bereitet und funktionieren einwandfrei ! Daran sollte es somit nicht liegen.
===
Zitat:
Ein möglicher Fehler ist wohl deine Variable "openOrders". Die if's unterscheiden sich in der Abfrage ja nur bei dieser Variable.
Du willst mit dieser Variable sicherlich zwischen erster und zweiter Order unterscheiden, richtig?
Das Problem ist, das du sie in der Schleife nutzt. Das heißt, wenn die Variable "1" ist, bearbeitest du ALLE ORDERS mit dem
ersten if-Block, wenn "2" dann entsprechend ALLE ORDERS mit dem zweiten if-Block. Das ist nicht so gedacht, oder?
Richtig, es soll zwischen "openOrders == 1" und "openOrders == 2" unterschieden werden. So sind hier z.B. die Targets
verschieden und auch die "SMA7_ATR5_1"- Summanden unterscheiden sich. Somit sollte es schon richtig sein, wenn unter
"openOrders() == 1" etwas anderes geschieht, als in "openOrders() == 2".
===
Zitat:
Zweite mögliche Fehlerquelle sind die Zeilen
Code:
if(Bid >= OrderOpenPrice() + Trail_Target_2 * 100 * Point)
...
double TakeProfit_2  =  OrderOpenPrice() + Trail_Target_2 + SMA7_ATR5_1;
...
if(Bid >= TakeProfit_2) 
   CloseAllOrders();
"SMA7_ATR5_1" ist der letzte geschlossene ATR-Wert mit der Periode 5, welcher mit einem SMA der Periode 7 geglättet
wird. Damit werden keine starren, sondern flexible Ziele für die TPs auslöst.

Zitat:
Aber wenn hier jetzt "Trail_Target_2 + SMA7_ATR5_1" KLEINER als "Trail_Target_2 * 100 * Point" wäre, so erfüllt es
die Bedingung des zweiten if's und du rufst "CloseAllOrders()" auf.
NEIN! "Trail_Target_2 + SMA7_ATR5_1" kann doch niemals kleiner sein, als "Trail_Target_2" !!!

... wenn Bid das Target bei z.B. + 9 Punkten überschreitet // soll "TakeProfit_2" = Target + SMA_ATR als TP gesetzt
werden. Und erst, wenn dann dieser "TakeProfit_2" durch Bid überschritten wird, - sollen alle Order gelöscht werden.
Hier scheint der Algoritmus richtig zu sein, denn "if(Bid >= TakeProfit_2)" wird richtig erkannt und CloeAllOrders() ausgelöst.
Soweit zum TP-Bereich.

Im Bereich des Trail_SL hingegen ist es etwas anders:
Hier werden durch die ersten "ifs" ebenfalls Konditionen für das Nachziehen des SL vorgegeben, dann an "OrderStopLoss()" übergeben, - welches stetig aktualisiert wird.
Hänge ich ein separates, späteres "if" an, welches diese "OrderStopLoss()" aufgreift und nur bei Unterschreitung mittels Bid dieses "CloseAllOrdes()" ausgelösen soll, - so scheint hier "OrderStopLoss()" gar nicht erkannt zu werden. Könnte das so sein? Was wäre hier zu tun, damit diese "OrderStopLoss()" erkannt wird und dann das Schließen aller "openOrder" erfolgt ? (ggf. neben Deiner Tiket-update-Variante)

Wie ich schon zu Beginn dieses Foren-Beitrags erwähnte, bringt gerade das HIER (unter Trail_SL) angehängte "CloseAllOrders()" alles durcheinander !
===
Zitat:
Die Variable "OrderAngepasst" wird nicht weiter in der Funktion genutzt, ist aber nur in dieser existent, hoffe das weißt du.
Ja.
===
Zitat:
Jetzt mal unabhängig der obigen Punkte, den Code könnte man noch etwas zusammenfügen...
Diese Änderg. finde ich recht gut und habe sie dementsprechend übernommen.
===

So weit erst einmal zu den wesentlichen Dingen. Im Weiteren werden hauptsächlich Fehlervermutungen geäußert, welchen ich noch heute Abend in aller Ruhe nachgehen werde. Bis hierher erst einmal wieder ein "dickes Lob" und das zugehörige DANKESCHÖN"!

Anbei eine für mich als Laien recht wichtige Frage:
Zitat:
Am besten, du setzt an allen relevanten Stellen Ausgaben ein, um GENAU zu erfahren, was der Auslöser fürs Schließen ist.
Das Einsetzen der Ausgaben (mittels Print) kenne ich, wo aber kann ich diese Ausgaben lesen/ablesen ?

Vielleicht kannst Du mir gerade die letzte Frage schon `mal vorab und kurzfristig beantworten.

Ansonsten werde ich ein Momentchen brauchen, um all Deinen Statemets nachzugehen. Bin ich dann endlich damit "durch",
melde ich mich natürlich umgehend !

Bis dahin mit ganz 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 18:08 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.
-----------------------------------------------------------------------------------------------------------------------------