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: 43521
Benutzer: 7.220
Aktive Benutzer: 82
Links: 84
Wir begrüßen unseren neuesten Benutzer: JosephTK
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 39 Minuten
- JosephTK
vor 2 Tagen
- Hopfen&Mal...
vor 2 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107

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

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #41 (permalink)  
Alt 24.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
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.
Das "CheckTakeProfit()" eine vorhandene Funktion ist, ist mir bewusst. Du hast mich falsch verstanden, bitte lies meine Bemerkung dazu nochmal.
In deiner 1-zeiligen Erwähnung hast du daneben ein Kommentar ("// nicht notwendig (next user)!!!") stehen.
Mein, einige Posts zurückliegendes "nicht nötig" bezog sich auf deinen geposteten Beitrag HIER !!!
Alles, was du DORT in der Funktion "CheckTakeProfit()" stehen hattest, war unnötig.
Der Inhalt deiner Funktion "CheckTakeProfit()", wie du ihn jetzt aber wenige Posts zurück gepostet hast, war bei
dem verlinkten Beitrag doch garnicht drinne. Deshalb sagte ich "unnötig"!

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

Zitat:
Zitat von piptrade Beitrag anzeigen
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".
Das da etwas anderes geschieht, habe ich ja auch nie bemängelt. Ich glaube, du hast mich auch hier falsch verstanden.
Was ich sagte war, das deine beiden if-Abfragen sich nur um den Wert deiner Variablen "openOrders" unterscheidet.
Diese Abfragen läufst du in ner Schleife durch. Bei einer Order ("openOrders" == 1) kommt der erste if-Block, soweit ok.
Sobald es aber mindestens 2 Orders sind ("openOrders" == 2), bearbeitest du in der Schleife AUCH DIE ERSTE Order mit dem
zweiten if-Block, ist das so gewollt (ich denke nicht)?

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

Zitat:
Zitat von piptrade Beitrag anzeigen
"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.
...
...
NEIN! "Trail_Target_2 + SMA7_ATR5_1" kann doch niemals kleiner sein, als "Trail_Target_2" !!!
Da ich schon viel fremden Code gesehen habe, und da einige "verrückte" Sachen waren, habe ich aufgehört, bei Variablen
IMMER Inhalt entsprechend dem Variablennamen zu erwarten. Und auch deine Kombination (Berechnung, Glättung) der beiden kenne
ich nicht. Auch da kann ein "außenstehender" theoretisch alles erwarten, wenn ich an so manchen Code denke den ich schon gesehen habe...
Daher meine allgemeine "Vermutung"!
Außerdem habe ich nicht
Zitat:
"Trail_Target_2 + SMA7_ATR5_1" KLEINER als "Trail_Target_2"
geschrieben, sondern
Zitat:
"Trail_Target_2 + SMA7_ATR5_1" KLEINER als "Trail_Target_2 * 100 * Point"
=== === === === === === === === === === === ===

Zitat:
Zitat von piptrade Beitrag anzeigen
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.
Du redest von "updateSL()" und den Bedingungen der ersten if's, oder?
Was wird denn da an "OrderStopLoss()" "übergeben"?

Zitat:
Zitat von piptrade Beitrag anzeigen
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)
Wo genau willst du ein separates, späteres if anhängen? Das habe ich jetzt nicht verstanden.
Und was meinst du mit "OrderStopLoss()" erkannt? Erfolgloser Aufruf?

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

Zitat:
Zitat von piptrade Beitrag anzeigen
Wie ich schon zu Beginn dieses Foren-Beitrags erwähnte, bringt gerade das HIER (unter Trail_SL) angehängte "CloseAllOrders()" alles durcheinander !
Mhmm... verstehe auch hier nicht genau, was du meinst. "CloseAllOrders()" hast du doch nur in "CheckTakeProfit()", soweit
ich es richtig gesehen habe.

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

Zitat:
Zitat von piptrade Beitrag anzeigen
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.
Sorry, war zu dem Zeitpunkt außer Haus und beschäftigt...
Kommt etwas spät, aber die Print-Ausgaben siehst du im Terminal im Reiter "Experten".
Ich persönlich setze immer eine MessageBox ein, die dann plötzlich aufplopt und ich sofort bescheid weiß.



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

Kann sein, das ich dich da bei paar Punkten falsch verstanden habe, aber es ist gleich 6 und ich bin müde.
Evtl. Fehler bei meinen Zeilen oben sind dann wohl auf den bereits aktiven "Sparmodus" meines Gehirns zurückzuführen... hehe.
  #42 (permalink)  
Alt 24.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Hallo, lieber next user,

Danke für Deine Zeit und Danke für Deine Hinweise. Ich hoffe Du konntest Dich zwischenzeitlich etwas erholen.

Nun aber zu Deinem letzten Beitrag:

"nötig oder unnötig" zu "ChechTakeProfit()", sollte nicht das Thema sein.
===
Bei "openOrders == 1" bzw. "openOrders == 2" wird es schon interessanter:

Zitat:
Diese Abfragen läufst du in ner Schleife durch. Bei einer Order ("openOrders" == 1) kommt der erste if-Block, soweit ok.
Sobald es aber mindestens 2 Orders sind ("openOrders" == 2), bearbeitest du in der Schleife AUCH DIE ERSTE Order mit dem zweiten if-Block, ist das so gewollt (ich denke nicht)?
Dass dem so ist, wußte ich nicht. Bisher ging ich davon aus, dass bei "openOrders == 2" nur der 2. if-Block bearbeitet wird.
Danke für den Hinweis. Somit hast Du natürlich recht; - beide Blöcke sollen eigentlich getrennt voneinander bearbeitet werden.
"openOrders == 1" mit den dortigen Konditionen und "openOrders == 2" mit den Konditionen, die dann dort aufzuführen wären.
(Lediglich zur Vereinfachung des Codes haben wir momentan die Konditionen für "openOrders == 1" bzw. "openOrders == 2" gleichgesetzt.)
===
"Trail_Target_2 + SMA7_ATR5_1" bzw. " *100 * Point", können wir uns wahrscheinlich "schenken". Nunmehr wissen wir beide, was gemeint war.
(Unabhängig davon weiß ich nicht, wie ich "SMA7_ATR5_1" besser erklären soll. Zudem hat diese variierende Größe wenig Code-Relevanz.)
===
Nun aber zum "Trail_SL()" bzw. dem "updateSL()":
Um wieder einheitliche Begriffe zu verwenden, ist es sicher sinnvoll, zu den Ursprüngen zurückzukehren.
So sollte unter "void OnTick()" das (nachträgliche) Schließen der Position 1 erfolgen. Hier wurde der Begriff "updateSL" verwendet und der diesbezügliche Code als "Block 1" bezeichnet:

Code:
void OnTick() { 
// ...
int    orderTicket1 = 0;
int    orderTicket2 = 0;

   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;
         }
      }
   }
// ...   
}
Ist das richtig ? Haben wir jetzt wieder die notwendige Übereinstimmung ?

Separat bzw. parallel dazu müssen natürlich erst einmal die Positionen 1 + 2 eröffnet werden. Dies sollte dann außerhalb der "void OnTick()" erfolgen ("Block 2") und "SO" aussehen:

Code:
void TrailStopLoss(int ticket)  
{
   ResetLastError();  //  könnte ggf. entfallen

   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());
            }
         }
      }
   }
}
Ist auch das richtig ? Haben wir auch an dieser Stelle wieder die notwendige Übereinstimmung ?
"Alle sprechen deutsch, doch keiner versteht mich !" - Oder vielleicht doch ?
Ich wäre überaus dankbar, wenn dem so sein sollte !!!

Wenn allerdings Korrekturen notwendig sind, würde ich mich über die entsprechenden Hinweise freuen.

Anbei herzlichen Dank für Deine Anmerkungen zu den "Print-Ausgaben".

Ansonsten hoffe ich, dass Du Dich ein wenig erholt hast und warte `mal wieder voller Spannung auf Dein nächstes
Statement.

Bis dahin mit LG. pt.
  #43 (permalink)  
Alt 24.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
"nötig oder unnötig" zu "ChechTakeProfit()", sollte nicht das Thema sein.
Wollte ich auch nicht zu einem Thema machen. In deinem (neuesten) Code hast du aber neben "CheckTakeProfit()" als
Kommentar "// nicht notwendig (next_user) !!!" stehen, was ich lediglich richtig stellen wollte...

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

Zitat:
Zitat von piptrade Beitrag anzeigen
Bei "openOrders == 1" bzw. "openOrders == 2" wird es schon interessanter:
Nur so nebenbei gefragt, wenn "openOrders" nur zwischen 1 & 2 trennt, könntest du dort doch einfach auch die
beiden Variablen "orderTicket1 / 2" nutzen.

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

Zitat:
Zitat von piptrade Beitrag anzeigen
"Trail_Target_2 + SMA7_ATR5_1" bzw. " *100 * Point", können wir uns wahrscheinlich "schenken". Nunmehr wissen wir beide, was gemeint war.
(Unabhängig davon weiß ich nicht, wie ich "SMA7_ATR5_1" besser erklären soll. Zudem hat diese variierende Größe wenig Code-Relevanz.)
Zum ersten Teil, jap.
Zum zweiten Teil, du hast es ja ausreichend gut erklärt, das war ja nicht das Problem. Ich habe ja im vorherigen Post erklärt,
warum ich es TROZDEM als mögliche Fehlerquelle angesprochen hatte, eben weil ich schon viele "gut benannte" Variablen anderer
gesehen habe, die sich dann komplett anders herausstellten.

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

Zitat:
Zitat von piptrade Beitrag anzeigen
Hier wurde der Begriff "updateSL" verwendet und der diesbezügliche Code als "Block 1" bezeichnet:
...
...
Ist das richtig ? Haben wir jetzt wieder die notwendige Übereinstimmung ?
Hatten wir sie denn nicht? So stand es doch bisher immer in deinem Code.

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

Zitat:
Zitat von piptrade Beitrag anzeigen
Separat bzw. parallel dazu müssen natürlich erst einmal die Positionen 1 + 2 eröffnet werden. Dies sollte dann außerhalb der "void OnTick()" erfolgen ("Block 2") und "SO" aussehen:

Code:
void TrailStopLoss(int ticket)  
{
   ResetLastError();  //  könnte ggf. entfallen

   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());
            }
         }
      }
   }
}
Ist auch das richtig ? Haben wir auch an dieser Stelle wieder die notwendige Übereinstimmung ?
Zum ersten Satzt ("(Block2) und "SO" aussehen"). Ja, nur das der Code nicht für die Ordereröffnung, sonder den SL dient.
Zum zweiten Satz, auch hier war eine Übereinstimmung ja gegeben. Lediglich deine beiden Codeblöcke müsstest du
"kommunizieren" lassen. In Block 1 nutzt du "updateSL()" in diesem, zweiten Block nennst du die Funktion "TrailStopLoss()"

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

Zitat:
Zitat von piptrade Beitrag anzeigen
Ansonsten hoffe ich, dass Du Dich ein wenig erholt hast und warte `mal wieder voller Spannung auf Dein nächstes
Statement.
Hab gut geschlafen...
Schauen wir mal, wenn das nächste mal der Fehler auftaucht, welche deiner Print-Ausgaben dabei aktiv werden.
So sollten wir dann schnell zur Ursache kommen...
  #44 (permalink)  
Alt 24.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Toll, Thanks !

Ich melde mich !!!

LG. pt.
  #45 (permalink)  
Alt 25.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Wink

So, nun endlich meine Antwort:

Lieber next user,

Zitat:
Zitat von piptrade
Bei "openOrders == 1" bzw. "openOrders == 2" wird es schon interessanter:
Zitat von next user
Nur so nebenbei gefragt, wenn "openOrders" ... zwischen 1 & 2 trennt, könntest du dort doch einfach auch die
beiden Variablen "orderTicket1 / 2" nutzen.
Genau diese (Deine) Idee hat auch mich beschäftigt! (- deshalb erst jetzt meine Antwort ---> sorry !)
Und "Yes !" Inhaltlich völlig richtig und auch mein Ansinnen ! ...

Vorschlag:
Als erstes sollten wir uns vielleicht wieder auf einen einheitlichen Sprachgebrauch einigen und dabei die einzelnen Code-Bezeichnungen ggf. etwas eindeutiger formulieren:

A) Block_A (ehemals "Block 1" = neue Benennung!) = der, welcher unter "void OnTick()" zugeordnet ist, welcher die Ticket-Abfrage bewerkstelligen und die openOrder == 1 (Pos.1) schließen soll.

Code:
void OnTick() { 
// ...
int    orderTicket1 = 0;
int    orderTicket2 = 0;

   if (orderTicket1) 
       updateSL(orderTicket1);
   if (orderTicket2)   //  usw. 
//......
B) Block_B (ehem. "Block 2" = auch neue Benennung!) = der, welcher die Pos.1 (OrderOpening nach strategy-conditions = "void CheckForOpen()") auslöst und so auch für die Initiierung "Ticket_1" verantwortlich ist.

Code:
void CheckForOpen()  {   //  Formulierung entsprechend üblicher Codes
//....
      {
      res = OrderSend(Symbol(), OP_BUY, LotsOptimized(), Ask, 3, 0, 0, "", MagicNumber, 0, Green);
      return;
      }   
//    analog für SELL
//....
//    hier müßte dann das Ticket_1 (updateSL = Ticket_1 ????) initiiert werden
}
C) Block_C (bisher nicht benannter Block) = der, welcher die Pos.2 (Hedging = "void CheckHedgeOpen()") auslöst und so auch für die Initiierung "Ticket_2" verantwortlich wäre.

Code:
void CheckHedgeOpen() {
//...
   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;
   }   
//    analog für SELL
//....
//    hier müßte dann das Ticket_2 (updateSL = Ticket_2 ????) initiiert werden
}
Wobei sich gerade hier eine Frage aufdrängt: Wird dieses "Ticket_2" überhaupt gebraucht ? Die Pos.2 wird doch schon durch den TP bzw. den SL geschlossen ! (Probleme gab es immer nur, wenn dieses "CloseAllOrders()" (unter "void TrailStopLoss()") die Pos.2 UND die Pos.1 schließen sollte. Ließ ich die Pos. 1 unberührt, war ja "alles paletti" !)
Und wenn wir dieses "Ticket_2" tatsächlich nicht brauchen, könnte im "Block_A" ja auch die "Abfrage in der History" entfallen.
Ob all diese Gedanken richtig sind, weiß ich nicht, - dennoch erscheinen sie mir logisch !

Eine zweite Idee (Deine Frage: Wo wird denn die Pos.1 eröffnet?) könnte darin bestehen, dass man genau diese EröffnungsOrder modifiziert, indem eine "OrderModify ..." ergänzt wird, die schon einen SL enthält. (Auslöser: openOrders == 2 oder fix, die Hedge-Grenze 1 Pkt. überschreitend) - In diesem Falle könnten wir sogar auf die gesamte "Ticket-Geschichte" verzichten !

Die Vorteile hier : 1.) Verlustbegrenzung = wird verbessert
2.) Die 3. Position (jetzt openOrder == 2 !!!) würde nicht mit 1.1 lot sondern wiederum mit 0.4 lot ausgelöst werden, was dann die Gesamt-Positionsgröße der Tradefolge reduziert und damit ggf. auch eine Pos.7 (wäre ja auch für kleinere Equity sinnvoll !) zulässt. Nur `mal so nebenbei !


In der Hoffnung, dass die o.a. Gedanken und Ideen zumindest nachvollziehbar und halbwegs richtig/umsetzbar sind, würde ich gern
diese Änderungen/Optimierungen vornehmen. Wäre oder "IST" das der richtige Weg ?

Und wieder einmal in Erwartung Deiner (hoffentlich baldigen) Antwort sowie mit

dem üblichen DANKE und LG. pt.


PS.: Wenn wir dann ggf. bis zu dieser Stelle Einigkeit hergestellt haben, müsste nur noch Ticket_1 (in "Block_B") initiiert, "Block_A" inhaltlich reduziert und die richtige Korrespodenz zwischen den Blöcken A und B hergestellt werden. So zur ersten neuen Idee. Ist das soweit richtig ?
Zum zweiten Gedanken: "OrderModify ..." in der "void CheckForOpen()"- hier müsste eine korrekte Formulierung und Einfügung erfolgen.
Wenn Dein "JA" vorliegt, sollte das "Dingeling" nun endlich, und wie gewünscht, funktionieren !
  #46 (permalink)  
Alt 26.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

So, Wochenende um...
... auf in den Montag!

Zitat:
Zitat von piptrade Beitrag anzeigen
Wobei sich gerade hier eine Frage aufdrängt: Wird dieses "Ticket_2" überhaupt gebraucht ? Die Pos.2 wird doch schon durch den TP bzw. den SL geschlossen !
Die beiden Tickets werden ja beim "updateSL()" und nachher auch bei der Schließbedingung verwendet.
Da es ursprünglich nur um die beiden Orders ging, habe ich die beiden Variablen eingeführt. Allerdings hatte ich auch erwartet,
das du sie dann auch überall nutzt. Die Ticketnummern speicherst du bei "OrderSend()" aber anscheinend (erst) in einer
Variablen "res". Warum nutzt du nicht die beiden Ticketvariablen? Auch sind die nicht als lokale Variablen in "OnTick()" vorgesehen,
sondern wurden von mir ursprünglich global definiert...

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

Zitat:
Zitat von piptrade Beitrag anzeigen
(Probleme gab es immer nur, wenn dieses "CloseAllOrders()" (unter "void TrailStopLoss()") die Pos.2 UND die Pos.1 schließen sollte. Ließ ich die Pos. 1 unberührt, war ja "alles paletti" !)
So genau hast du es aber glaube ich bisher nicht angegeben, oder ich habe es überlesen...
Trotzdem sollten auch unabhängig davon die Probleme ermittelt und beseitigt werden...

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

Zitat:
Zitat von piptrade Beitrag anzeigen
Und wenn wir dieses "Ticket_2" tatsächlich nicht brauchen, könnte im "Block_A" ja auch die "Abfrage in der History" entfallen.
Die Abfrage dient ja dazu, Order 1 zu schließen, wenn Order 2 geschlossen wurde. Die Historie ist ja nur eine Möglichkeit.
Wenn du nicht mit den Tickets arbeiten willst, müsstest du die Orders ja anders ansprechen. Die Tickets sind da doch
aber eine bequeme Methode...

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

Zitat:
Zitat von piptrade Beitrag anzeigen
Eine zweite Idee (Deine Frage: Wo wird denn die Pos.1 eröffnet?) könnte darin bestehen, dass man genau diese EröffnungsOrder modifiziert, indem eine "OrderModify ..." ergänzt wird, die schon einen SL enthält. (Auslöser: openOrders == 2 oder fix, die Hedge-Grenze 1 Pkt. überschreitend) - In diesem Falle könnten wir sogar auf die gesamte "Ticket-Geschichte" verzichten !
Den Teil habe ich jetzt nicht ganz verstanden (kann auch am Montag morgen liegen )

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

Zitat:
Zitat von piptrade Beitrag anzeigen
Die Vorteile hier : 1.) Verlustbegrenzung = wird verbessert
2.) Die 3. Position (jetzt openOrder == 2 !!!) würde nicht mit 1.1 lot sondern wiederum mit 0.4 lot ausgelöst werden, was dann die Gesamt-Positionsgröße der Tradefolge reduziert und damit ggf. auch eine Pos.7 (wäre ja auch für kleinere Equity sinnvoll !) zulässt. Nur `mal so nebenbei !
Was haben die beiden Punkte denn mit dem Verwenden über Tickets zu tun?
  #47 (permalink)  
Alt 26.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Liebe next user, Hallo !
Es ist einfach nur "große Klasse", dass Du Dich sogar am Montag Morgen, den eigenltlich keiner so gerne mag, meiner annimmst und akribisch jeden von mir geäußerten Gedanken "geraderückst". Toll ! - und Danke !

Dennoch bin ich mittlerweile zu einer Erkenntnis gelangt:

1. Ich selbst sollte nicht ständig neue Dinge ins Spiel bringen (weniger ist oft mehr!). Statt dessen ist es sicher wesentlich effektiver auf einen vormals recht weit entwickelten Code zurückzugreifen (den mit Ticket_1 und Ticket_2), hier die Ursache(n) für die Nicht-Ausführung zu finden und das "Ding" funktionsfähig zu machen. Grundvoraussetzung hierfür wäre, dass man wirklich Schritt für Schritt vorgeht und jeder einzelne Schritt auch von beiden Seiten exakt verstanden wird.
Wenn dann alles laufen sollte, kann man ja immer noch darüber nachdenken, wie der Code/die Herangehensweise optimiert werden kann. Damit wäre mein anfängliches Ansinnen letztendlich umgesetzt.

Und 2. Für den Fall (und wirklich nur für diesen Fall), dass sich innerhalb aller Disskusionen eine strategisch bessere und codetechnisch sinnvollere Variante ergibt, sollte auch diese zumindest erörtert werden. Das aber erst, wenn die obige Ausführung fertiggestellt ist.

Würdest Du da mitgehen ?

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

Beginnen wir also nochmals, wie unter 1. beschrieben:

1. Schritt: es werden "int Ticket_1 = 0" und "int Ticket_2 = 0" global (also im Code ganz oben) deklariert.
2. Unter "void OnTick()" wird dann das "updateSL()" aufgeführt, damit die weiter unten stehende Funktion "void updateSL()"
auch per Tick erfolgen kann.
3. Ebenfalls unter "void On Tick()" müßte dann die Funktion "updateSL()" (= Block_A) ausgeführt und die Pos.1
nachträglich geschlossen werden.
4. NICHT unter "void OnTick()" stehend !!!, also eher im unteren Teil des Codes, wird dann die Funktion "void updateSL()"
aufgeführt, welche den Trail_SL immer wieder aktuell modifiziert (= Block_B). Gleichzeitig sollte dieser Block dann auch
für das ticket-update zuständig sein.

So ! Jetzt nochmals zu Deinen letzten Hinweisen:

vorheriges Zitat:
Zitat:
Zum ersten Satz ("(Block_B) und "SO" aussehen"). Ja, nur das der Code nicht der Ordereröffnung, sondern dem SL dient.
---> völlig richtig ! - Sorry.
... Und weiter - Zitat:
Zitat:
Zum zweiten Satz, auch hier war eine Übereinstimmung ja gegeben. Lediglich deine beiden Codeblöcke "_A" und "_B" müsstest du "kommunizieren" lassen. In "Block_A" nutzt du "updateSL()", in dem zweiten Block ("_B") nennst du die Funktion "TrailStopLoss()"
---> das war natürlich Unsinn ! - jetzt sollten sie "kommunizieren". Für beide Blöcke wird nunmehr "updateSL()" verwendet.

Letztes Zitat:
Zitat:
Die beiden Tickets werden ja beim "updateSL()" und nachher auch bei der Schließbedingung verwendet. Da es ursprünglich nur um die beiden Orders ging, habe ich die beiden Variablen eingeführt. Allerdings hatte ich auch erwartet, dass du sie dann auch überall nutzt. Die Ticketnummern speicherst du bei "OrderSend()" aber anscheinend (erst) in einer Variablen "res". Warum nutzt du nicht die beiden Ticketvariablen? Auch sind die nicht als lokale Variablen in "OnTick()" vorgesehen, sondern wurden von mir ursprünglich global definiert...
---> Die Variablen wurden jetzt wieder global, also ganz oben, angeordnet. So zum 2. Teil Deines Zitates.
---> Den ersten Teil des Zitates verstehe ich allerdings nicht. Die Verwendung der Tickets = ok. und verstanden. NICHT verstanden Deine Erwartung, dass ich die Tickets auch überall verwenden soll und die Ticketnummern bei "OrderSend()" zu speichern sind.
Wo sollten die Tickets denn noch genutzt werden ? Und was hat es mit der "OderSend()" und einer Speicherung der Ticketnummern auf sich. Beides wurde bisher gar nicht erwähnt. Oder ? ...

Im Resultat sieht die Gesamt-Struktur des EA, einschließlich "UNSERER" Deklarationen und Blöcke jetzt "SO" aus:

CODE:
Code:
/*--- EA_Gesamt-Struktur:

//--- globale Deklarationen (extern bzw. intern) --------------------+
      int    orderTicket1 = 0;                 //  jetzt wieder global
      int    orderTicket2 = 0;                 //  jetzt wieder global
      double TSL_1 = Trail_SL_1 *100 *Point;   //  for Pos.1
      double TSL_2 = Trail_SL_2 *100 *Point;   //  for Pos.2   
//===================================================================+
int  OnInit() { view graphic and calculat "AccountFreeMargin" 
     }
//===================================================================+
void  OnDeinit() { Funktion hatte in der Form noch gefehlt !  
     }
//===================================================================+
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();
   
      CheckForUpdateSL();           //     <=========== NEU (für Block_B)
//                          notwendig für späteren Aufruf dieser Funktion                             
//========================================        
//--- CheckCloseFirstPos                   <=============== NEU (Block_A)
//========================================     nachträgliches Close Pos.1
  if(orderTicket1)  updateSL(orderTicket1);     // updateSL (Kommunikat.)
  if(orderTicket2)  updateSL(orderTicket2);     // updateSL (Kommunikat.) 

  if(orderTicket1 && orderTicket2)  {
     if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))  {
        if(OrderSelect(orderTicket1,SELECT_BY_TICKET,MODE_TRADES))  
        {                                     //  MODE_TRADES  hinzugefügt
           if(OrderType() == OP_BUY) 
           {
              if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
                  Print("Order konnte nicht ..., weil: ", GetLastError());
              else     Print("BIN ZU !!!");
           }
           else if (OrderType() == OP_SELL)
           {
              if(!OrderClose(orderTicket1,OrderLots(),Ask,3))
                  Print("Order konnte nicht ..., weil: ", GetLastError());
              else    Print("BIN ZU !!!");
           }
           orderTicket1 = 0;
           orderTicket2 = 0;
         }
      }
   }
//---
}      //  end "void OnTick()"
//===================================================================+
int CalculateCurrentOrders(string symbol) { Calculate open positions 
    }
//===================================================================+    
void CheckForOpen()    { Check for openOrder Conditions 
    }                         //  Pos.-Opening (by strategy) der Pos.1
//===================================================================+
double LotsOptimized() { MoneyManagement - Calculate lot size   
    }
//===================================================================+ 
void CheckTakeProfit() { Check for TakeProfit Conditions 
    }                                           //  Close for all Pos.
//===================================================================+
//--- UpdateSL() Pos.1 + Pos.2                      <======= (Block_B) NEU
//===================================================================+
void CheckForUpdateSL()(int ticket)  {
   ResetLastError();                        //  könnte ev. entfallen !

//--- Pos. 1
   if(OrderSelect(ticket,SELECT_BY_TICKET))  {
      if(OrderType() == OP_BUY  &&  openOrders == 1)  {
         if(Bid - OrderOpenPrice() > Trail_Target_1 *100 * Point)  {
            if(OrderStopLoss() < Bid - TSL_1 || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL_1, OrderTakeProfit(), Blue))
                  Print("Error setting Buy trailing stop: ", GetLastError());
            }
         }
      }
      else if(OrderType() == OP_SELL  &&  openOrders == 1)  {
         if(OrderOpenPrice() - Ask > Trail_Target_1 *100 * Point)  {
            if(OrderStopLoss() > Ask + TSL_1 || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL_1, OrderTakeProfit(), Blue))
                  Print("Error setting Sell trailing stop: ", GetLastError());
            }
         }
      }
//--- Pos.2     
      if(OrderType() == OP_BUY  &&  openOrders == 2)  {
         if(Bid - OrderOpenPrice() > Trail_Target_2 *100 * Point)  {
            if(OrderStopLoss() < Bid - TSL_2 || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL_2, OrderTakeProfit(), Blue))
                  Print("Error setting Buy trailing stop: ", GetLastError());
            }
         }
      }
      else if(OrderType() == OP_SELL  &&  openOrders == 2)  {
         if(OrderOpenPrice() - Ask > Trail_Target_2 *100 * Point)  {
            if(OrderStopLoss() > Ask + TSL_2 || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL_2, OrderTakeProfit(), Blue))
                  Print("Error setting Sell trailing stop: ", GetLastError());
            }
         }
      }
//---
   }
}
//===================================================================+  
void CheckHedgeOpen()  { Check for HedgeOrder Conditions                                 
    }                                   //  Pos.-Opening Pos.2 - Pos.6
//===================================================================+
void CloseAllOrders()  { AllOrders closed                                                
}        //  Anwendg. by TakeProfit / Pos.1, Pos. 3 - 6 /not for Pos.2
//===================================================================+
//--- End -----------------------------------------------------------+

// mit welcher Code-Formulierung und an welcher Stelle "OrderSend" ???


ANMERKUNG: Jede einzelne Formulierung (Wortwahl) wurde nochmals überprüft
und teilweise korrigiert, um zukünftige Missverständnisse auszuschließen.
Vielleicht kannst Du Dir die EA-Struktur, einschließlich der näher ausgeführten Bereiche, nochmals ansehen und mir die oben gestellten Fragen nach "Variable überall verwenden" und "Speichern in OrderSend()" beantworten. Damit sollten wir einem Erfolg wieder ein Stückchen näher kommen.

Obwohl mich noch viele Fragen quälen; - im Sinne von "Konzentration auf eine Sache" halte ich mich jedoch zurück, warte natürlich wieder geduldig und verbleibe vorerst mit

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

Werde ich nachher in Ruhe durchgehen.
  #49 (permalink)  
Alt 26.03.18
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.733
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von next user Beitrag anzeigen
Werde ich nachher in Ruhe durchgehen.
Aber nur bei einer ganz großen Kanne Tee.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #50 (permalink)  
Alt 26.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Hallo, traderdaoc,

ein ganz herzliches "Willkommen" in diesem Beitrag !
Große Kanne Tee? - kein Thema ! Wenn Du es wünscht, auch eine ganze Plantage !!!

Ich freue mich riesig, dass es nunmehr ggf. einen "Einklang" im "Dreiklang" geben könnte. (next user, traderdoc und meine Wenigkeit -piptrade) Deine Hinweise könnten diesen Forenbeitrag imens bereichern und uns ggf. schneller/optimaler ans Ziel führen.

Für alle anderen zur Info: traderdoc hat mir schon 2 x zum Code-Erfolg verholfen; - und das in einfach fairer Form ! Somit meine Empfehlung: "Daumen hoch !"

In angespannter Haltung und voller Ungeduld,

Euer einfach nur dankbarer (und natürlich wartender) piptrade
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 22:40 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.
-----------------------------------------------------------------------------------------------------------------------------