Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   "CloseAllOrders" am SL einer 2. Position (http://www.expert-advisor.com/forum/showthread.php?t=6038)

next user 24.03.18 05:53

Zitat:

Zitat von piptrade (Beitrag 40659)
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 40659)
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 40659)
"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... :D
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 40659)
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 40659)
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 40659)
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 40659)
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.

piptrade 24.03.18 16:54

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.

next user 24.03.18 20:05

Zitat:

Zitat von piptrade (Beitrag 40681)
"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 40681)
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 40681)
"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 40681)
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 40681)
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 40681)
Ansonsten hoffe ich, dass Du Dich ein wenig erholt hast und warte `mal wieder voller Spannung auf Dein nächstes
Statement.

Hab gut geschlafen... :cool:
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...

piptrade 24.03.18 22:26

Toll, Thanks !

Ich melde mich !!!

LG. pt.

piptrade 25.03.18 18:08

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 ! ...:rolleyes:

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 !

next user 26.03.18 05:51

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

Zitat:

Zitat von piptrade (Beitrag 40706)
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 40706)
(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 40706)
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 40706)
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 :D)

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

Zitat:

Zitat von piptrade (Beitrag 40706)
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?

piptrade 26.03.18 18:14

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 ? ...:o

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.

next user 26.03.18 19:46

Werde ich nachher in Ruhe durchgehen.

traderdoc 26.03.18 20:01

Zitat:

Zitat von next user (Beitrag 40753)
Werde ich nachher in Ruhe durchgehen.

Aber nur bei einer ganz großen Kanne Tee. :D

traderdoc

piptrade 26.03.18 23:29

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

piptrade 27.03.18 00:02

PS.: Der hier vorliegende EA wurde innerhalb der letzten 3 Jahre soweit geschrieben und entwickelt, dass er ca. 1.600% p.a. erwirtschaftet. Und das zu 99,2 % (2017) vollautomatisch ! Und die verbleibenden 0,8% werden im manuellen Trading mittels einer "ausgefeilten Trading-Strategie" erreicht. (gerade hier sind natürlich auch gigantische und überproportionale Profitzuwächse möglich !, - die genutzt werden sollten.)

Ich habe vor 4 Jahren operative Eingriffe erleben müssen, was nur die aller wenigsten überstehen. Nach dem 1. Jahr der Lethargie habe ich mich aufraffen können und mich mit der mql4 motiviert. DAS war der richtige Weg.

Der "HEAD_ExpertAdvisor" ist der lebendige Beweis dafür.

LG. Euer piptrade

next user 27.03.18 12:46

Zitat:

Zitat von traderdoc (Beitrag 40755)
Zitat:

Zitat von next user (Beitrag 40753)
Werde ich nachher in Ruhe durchgehen.

Aber nur bei einer ganz großen Kanne Tee. :D

traderdoc

Aber bitte nicht für dich, wenn du meinen Tee-Vorschlag im anderen Thread wahrnimmst...

next user 27.03.18 13:30

Zwar etwas später als geplant, aber naja...

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

Zitat:

Zitat von piptrade (Beitrag 40745)
...
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.

Du führst ja wieder etwas ein...
Also Punkt 2 & 3, damit sind die von dir neu hinzugefügte Funktion "CheckForUpdateSL()" und meine ursprüngliche "updateSL()" gemeint.
Dazu gleich weiter unten mehr...

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

Zitat:

Zitat von piptrade (Beitrag 40745)
Zitat:

Zitat von next user (Beitrag 40720)
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...

---> 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 ? ...:o

Was ich damit meinte (wie geschrieben, ausgehend von 2 Orders!), z.B.:
Zitat:

Zitat von piptrade (Beitrag 40706)
Code:

res = OrderSend(Symbol(), OP_BUY, LotsOptimized(), Ask, 3, 0, 0, "", MagicNumber, 0, Green);

"OrderSend()" liefert ja die Ticketnummer. Warum nutzt du hier "res"? Warum nicht direkt die Ticket-Variablen?
Wo erst bekommen denn bei dir die Ticket-Variablen ihren Wert?
Das meinte ich mit "überall" nutzen.

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

Jetzt zum Codeabschnitt:

Ich geh erstmal kurz auf deine roten Hinweise im Code ein...

  • Zitat:

    Zitat von piptrade (Beitrag 40745)
    Code:

    int    orderTicket1 = 0;                //  jetzt wieder global
          int    orderTicket2 = 0;                //  jetzt wieder global
    ...
    ...
    void  OnDeinit() { Funktion hatte in der Form noch gefehlt !


    Jap.

  • Zitat:

    Zitat von piptrade (Beitrag 40745)
    Code:

    CheckForUpdateSL();          //    <=========== NEU (für Block_B)
    //                          notwendig für späteren Aufruf dieser Funktion


    Erklär mir mal, was diese zweite Funktion für eine Notwendigkeit für spätere Aufrufe hat.

  • Zitat:

    Zitat von piptrade (Beitrag 40745)
    Code:

    MODE_TRADES  hinzugefügt

    Joahh. Da es der vorbelegte Standard ist, lass ich es immer weg...

  • Zitat:

    Zitat von piptrade (Beitrag 40745)
    Code:

    void CloseAllOrders()  { AllOrders closed                                               
    }        //  Anwendg. by TakeProfit / Pos.1, Pos. 3 - 6 /not for Pos.2


    Dann müsste man bei Block A noch ergänzen und prüfen, ob Pos 1 nicht SCHON geschlossen ist, wenn du sagst,
    das "CloseAllOrders()" auch für Pos 1 Verwendung findet.

----------------------------------------------------------------

So, jetzt noch kurz zum Code an sich:

  • Zitat:

    Zitat von piptrade (Beitrag 40745)
    1. Schritt: es werden "int Ticket_1 = 0" und "int Ticket_2 = 0" global (also im Code ganz oben) deklariert.

    CODE:
    Code:

    //--- globale Deklarationen (extern bzw. intern) --------------------+
          int    orderTicket1 = 0;                //  jetzt wieder global
          int    orderTicket2 = 0;                //  jetzt wieder global


    Einigen wir uns jetzt auf den ersten, oder den zweiten Variablennamen?

  • Zitat:

    Zitat von piptrade (Beitrag 40745)
    CODE:
    Code:

    CheckForUpdateSL();          //    <=========== NEU (für Block_B)
    //                          notwendig für späteren Aufruf dieser Funktion
    ...
    ...                           
    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());
                }
            }
          }
    //---
      }
    }


    • Doppelte Codeblöcke müssen nicht sein!
    • Ich sehe hier schon wieder NUR die Unterscheidung zwischen Order 1 & 2. Das kann man doch bequem mit den Tickets machen.
    • Wie schon gesagt, erklär bitte, warum diese eingeführte Funktion notwendig ist?

piptrade 27.03.18 17:12

Hallo, next user !

Lieber später, als NIE ! - das ist schon völlig in Ordnung.
Hauptsache Du unterstützt mich bis "zum bitteren Ende" und lässt mich "nicht im Regen stehen"! Und für das, was ich bisher dazulernen konnte/durfte bin ich sehr dankbar! Thanks !

So, nun aber wieder an die Arbeit:

Pkt.1)
Zitat:

Du führst ja wieder etwas ein...
Also Punkt 2 & 3, damit sind die von dir neu hinzugefügte Funktion "CheckForUpdateSL()" und meine ursprüngliche "updateSL()" gemeint.
---> "updateSL()" unter "void OnTick()"; bzw. "void updateSL(int ticket)", als eigenständige Funktion, wären hier natürlich richtig gewesen !

Pkt.2)
Zitat:

Zitat von piptrade Beitrag anzeigen
Code:
res = OrderSend(Symbol(), OP_BUY, LotsOptimized(), Ask, 3, 0, 0, "", MagicNumber, 0, Green);

Zitat:
"OrderSend()" liefert ja die Ticketnummer. Warum nutzt du hier "res"? Warum nicht direkt die Ticket-Variablen?
Wo erst bekommen denn bei dir die Ticket-Variablen ihren Wert?
Das meinte ich mit "überall" nutzen.
---> wenn ich Dich hier richtig verstehe, sollte ich auf das "res" (Eröffnung der Pos.1 nach Strategie) verzichten und statt dessen
die "OrderSend"-Funktion (siehe Code) verwenden:

Code:

int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoploss,takeprofit,"My order",16384,0,clrGreen);
    if(ticket<0)
      {  Print("OrderSend failed with error #",GetLastError());  }
    else Print("OrderSend placed successfully");

Richtig ? Und wenn "Ja", müßte ich wahrscheinlich hier das "int ticket" gegen unser "int ticket_1" austauschen.
Und wenn auch das richtig sein sollte, müßte ich dann das "void updateSL(int ticket)" gegen "void updateSL(int ticket_2)"
für "ticket_2" ersetzen ?

Und jetzt die unklaren Codeabschnitte:

Zitat:

Erklär mir mal, was diese zweite Funktion für eine Notwendigkeit für spätere Aufrufe hat.
---> wenn ich unter "void OnTick()" dieses "CheckTakeProfit();" aufführe, damit die spätere und weiter unten angeführte Funktion
"void CheckTakeProfit()" auch läuft, ... dann sollte ich mit "CheckForUpdateSL()" bzw. richtiger: "updateSL()" / "void updateSL()" analog verfahren.
Oder sind unter "void OnTick()" werder dieses "CheckTakeProfit()" noch das "updateSL()" notwendig ? (So ist es, glaube ich !)

Zitat:

Dann müsste man bei Block A noch ergänzen und prüfen, ob Pos 1 nicht SCHON geschlossen ist, wenn du sagst, dass "CloseAllOrders()" auch für Pos 1 Verwendung findet.
---> wird die Prüfung der Pos.1 nicht schon durch diese Zeilen erledigt ?

Code:

    if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))  {
        if(OrderSelect(orderTicket1,SELECT_BY_TICKET,MODE_TRADES))

.. und, wenn "Ja" soll doch nicht mehr dieses "CloseAllOrders()", sondern statt dessen "if(!OrderClose(orderTicket1,Order... )"
Verwendung finden. Oder liege ich da falsch ?

Zum Code an sich:

Pkt.1) "int orderTicket1 = 0;" bzw. "int orderTicket2 = 0;" - so steht es jetzt durchgängig im Code.
Pkt.2) Thema "Doppelblöcke": So, wie Du es darstellst ist es nicht ganz richtig. Die Unterscheidungen betreffen nicht nur die"openOrders",
sondern auch die "Trail_Targets" und die "TSL(s)".
Hier sollen Auslöser und Spanne (von Pos.1 zu Pos.2) reduziert werden, da hier mit einer höheren Positionsgröße gearbeitet wird.

Puhhh... , - das war`s mal wieder.

Nunmehr hoffe ich, dass wieder einige Kleinigkeiten richtiggestellt wurden und unsere nächsten Posts kürzer ausfallen. Und wenn dann als neuer Post nur noch das lang ersehnte "OK" übermittelt wird, sollten wir es geschafft haben.

DANKE, dass Du wirklich auf jedes Komma, jeden Punkt und auch auf ... eingehst. Und vielen, vielen Dank für Deine Geduld, Ausdauer und Zielstrebigkeit. Mit jedem neuen Statement habe ich etwas dazugelernt, so dass schon jetzt allein die Verständigung besser klappt.

Thanks, bis bald und LG. pt.

next user 27.03.18 19:17

Zitat:

Zitat von piptrade (Beitrag 40776)
Pkt.1)
---> "updateSL()" unter "void OnTick()"; bzw. "void updateSL(int ticket)", als eigenständige Funktion, wären hier natürlich richtig gewesen !

Lass uns bitte aufhören, von Funktion und Funktionsaufruf getrennt zu reden, ok.

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

Zitat:

Zitat von piptrade (Beitrag 40776)
Pkt.2)
---> wenn ich Dich hier richtig verstehe, sollte ich auf das "res" (Eröffnung der Pos.1 nach Strategie) verzichten und statt dessen
die "OrderSend"-Funktion (siehe Code) verwenden:

Code:

int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoploss,takeprofit,"My order",16384,0,clrGreen);
    if(ticket<0)
      {  Print("OrderSend failed with error #",GetLastError());  }
    else Print("OrderSend placed successfully");


Ja, die Ticket-Variablen einfach direkt bei "OrderSend()" füllen.

Zitat:

Zitat von piptrade (Beitrag 40776)
Und wenn "Ja", müßte ich wahrscheinlich hier das "int ticket" gegen unser "int ticket_1" austauschen.

Hattest du mit deinem letzten Post nicht bestätigt, das wir uns jetzt auf "orderTicket1 / 2" geeinigt haben?
Der Rest ist richtig.

Zitat:

Zitat von piptrade (Beitrag 40776)
Und wenn auch das richtig sein sollte, müßte ich dann das "void updateSL(int ticket)" gegen "void updateSL(int ticket_2)"
für "ticket_2" ersetzen ?

Da bist du jetzt denke ich bischen durcheinander:
Code:

void updateSL(int ticket)
{
...
}

Das ist die erstellte Funktion selbst! Die Variable "ticket" ist nur ein Parameter für die Funktion (Platzhalter). Die Ticket-Variablen selbst
werden doch beim Aufruf genutzt:
Code:

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

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

Zitat:

Zitat von piptrade (Beitrag 40776)
Oder sind unter "void OnTick()" werder dieses "CheckTakeProfit()" noch das "updateSL()" notwendig ? (So ist es, glaube ich !)

So, jetzt kommst du wohl ganz aus der Spur, oder? :D
"CheckTakeProfit()" nutzt du ja denke ich für TP. Ob es notwendig ist, weißt nur du genau.
"updateSL()" SORGT DOCH EBEN FÜR DAS UPDATEN DER (TRAIL)SL! Die wird doch die ganze Zeit genutzt und jetzt denkst
du, sie sei unnötig? Hast du vergessen, wozu wir sie erstellt haben?

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

Zitat:

Zitat von piptrade (Beitrag 40776)
---> wird die Prüfung der Pos.1 nicht schon durch diese Zeilen erledigt ?

Code:

    if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))  {
        if(OrderSelect(orderTicket1,SELECT_BY_TICKET,MODE_TRADES))


Nope! Die erste fragt ab, ob Pos2 schon geschlossen ist. Ist das der Fall, so wird in der zweiten die Pos1 selektiert, UM sie zu schließen!
Wenn sie aber von dir bereits an anderer Stelle aus welchem Grund auch immer durch "CloseAllOrders()" geschlossen wurde,
so wird "OrderSelect()" fehlschlagen und der Block danach NICHT ausgeführt, was Folgen hat!

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

Zitat:

Zitat von piptrade (Beitrag 40776)
.. und, wenn "Ja" soll doch nicht mehr dieses "CloseAllOrders()", sondern statt dessen "if(!OrderClose(orderTicket1,Order... )"
Verwendung finden. Oder liege ich da falsch ?

Davon bin ich ja bis jetzt ausgegangen, aber dann schreibst du in deinem Code, das ALLE Orders bis auf Order2 von
"CloseAllOrders()" verarbeitet werden. Da hast du mich verwirrt...

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

Zitat:

Zitat von piptrade (Beitrag 40776)
Pkt.1) "int orderTicket1 = 0;" bzw. "int orderTicket2 = 0;" - so steht es jetzt durchgängig im Code.

Gut.

Zitat:

Zitat von piptrade (Beitrag 40776)
Pkt.2) Thema "Doppelblöcke": So, wie Du es darstellst ist es nicht ganz richtig. Die Unterscheidungen betreffen nicht nur die"openOrders",
sondern auch die "Trail_Targets" und die "TSL(s)".
Hier sollen Auslöser und Spanne (von Pos.1 zu Pos.2) reduziert werden, da hier mit einer höheren Positionsgröße gearbeitet wird.

Mit "Doppelblöcke" meinte ich nicht "nahezu identisch", sondern, dass man diese 4 Blöcke mit großen Ähnlichkeiten
auf 2 Blöcke mit entsprechenden Bedingungen reduzieren kann.

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

Wegen dem ganzen "Durcheinander" im Code ect. frage ich mich grad, ob nicht das die Ursache für das plötzliche schließen der Order
verantwortlich ist...
Auch haben wir ja vor ein paar Tagen Ausgaben angesprochen, die du doch machen wolltest, oder.

Schauen wir mal weiter...

piptrade 29.03.18 16:15

Lieber next user,

„erstens kommt es anders, zweitens als man denkt !“ So und dieses Mal auch hier.

Vorab aber erst einmal das DANKESCHÖN, für Deine letzten Hinweise. Wie immer haben mir diese wieder einmal geholfen, ein Stückchen weiterzukommen.
Einerseits dadurch, dass ich nur diesen Hinweisen nachging und andererseits dadurch, dass ich registrieren musste, dass mir das Hintergrundwissen zu „OrderSend“„ zu Order Modify“ sowie das Auslesen der History und der Umgang mit den „tickets“ zumindest teilweise noch fehlt !

Und genau das ist der Grund, weshalb ich mich nicht eher gemeldet habe. Deshalb „Sorry“ und die Bitte um Verständnis.

Im Weiteren erscheint es mir als sinnvoll diese Lücken mit Wissen zu füllen, so dass ich über die Osterfeiertage „eirige Dinge“ aus der Welt schaffen und „runde Dinge“ machen möchte. Deshalb auch jetzt und hier keinen vorschnellen Comment.

Anbei: Es ist schon gut, all diese mögliche Abfolgen einmal selbst zu coden und sich zu zwingen, der entsprechenden Logik nachzugehen. So ist es auch wesentlich leichter, entsprechende Hinweisdetails zu verstehen.

Lassen wir das Fest in aller Ruhe verstreichen, um dann mit neuem Elan an alten Dingen „zu feilen“. DANKE.

Ich denke, dass ich mich spätestens Mo./Di. wieder melde,
wünsche ein “Frohes Fest“ und verbleibe mit

LG. pt.

next user 29.03.18 18:56

Zitat:

Zitat von piptrade (Beitrag 40838)
Es ist schon gut, all diese mögliche Abfolgen einmal selbst zu coden und sich zu zwingen, der entsprechenden Logik nachzugehen. So ist es auch wesentlich leichter, entsprechende Hinweisdetails zu verstehen.

Jap. Das ist so ziemlich das beste "Lernmaterial". Einmal selber verstanden, geht es wie Butter von der Hand...

Dir auch noch schöne Feiertage.

piptrade 04.04.18 12:22

Hallo, next user,

das Fest der unrunden Dinge ist nun vorbei und, wie versprochen, hier meine Rückmeldung.
Ebenfalls, wie zugesagt, habe ich mich neben österlichen Dingen auch um einige MQL4-Funktionen gekümmert.
Sicher sind im Nachfolgenden noch Fehler enthalten, sicher werden hier und da auch umrichtige Begriffe verwendet, dennoch bin ich unterschiedliche Codebestandteile des betreffenden EA durchgegangen und möchte hier hauptsächlich die Passagen ansprechen, die in diesem Forenbeitrag primär zur Disskusion stehen.

1. Der Grundaufbau des EA wurde bereits in einem vorhergehenden post übergeben. Hier konnte entnommen werden, dass unter „void OnTick()“ unter anderem die Funktionen „CheckForOrder()“, „CheckHedgeOpen()“ und „CheckTakeProfit()“ deklariert sind, welche im späteren Verlauf des EA als separate “void“- oder „Funktions“-Blöcke ausführlich behandelt werden. Und hier gab es eine este Ungereimtheit: Die Funktion „Trail_SL()“ wurde bisher unter „void CheckTakePrpfit“ gecodet.
Also müßte nach meinem Ermessen folgende Veränderung vorgenommen werden: zusätzliche Deklaration der Funktion „CheckTrail_SL()“ unter „void OnTick()“, um später auch hierfür einen separaten „Funktions-Block“ „void CheckTrail_SL()“ ausbilden zu können. Also nicht mehr unser altes „updateSL(int ticket)“.
Jetzt hätte ich 4 „saubere“ Deklarationen und die Möglichkeit auch 4 separate Funktionsblöcke zu bilden.

2. Gehen wir `mal davon aus, dass dies annähernd richtig ist. So wird die Pos.1 immer und generell unter „void CheckForOrder()“ mittels „OrderSend...“und die Pos.2 immer und generell unter „void CheckHedgeOpen()“ ebenfalls unter einer „OrderSend...“ geöffnet. 2 x „OrderSend...“ !
Bei diesen Eröffnungen sind StopLoss und TakeProfit jeweils „0“.
Das Schließen der Pos.1 erfolgt dann mittels TP unter „voidCheckTakeProfit()“ und einem „OrderModify...“ oder eines SL unter „void CheckTrail_SL()“ und wiederum einem „OrderModify...“
Selbiges betrifft die Pos.2 !
Um an dieser Stelle konsequent zu bleiben, wäre es n.m.E. richtig, wenn „ticket_1“ und „ticket_2“ nicht aus den Modifizierungen „geupdatet“, sondern mittels der „OderSend...“-Befehle festgelegt werden. Dies wiederum würde heissen, das das o.a, „void CheckForOpen()“ auf „void CheckForOpen(int ticket_1)“ - und das „void CheckHedgeOpen()“ auf „void HedgeOpen(int ticket_2)“ erweitert werden müßte.
In den jeweiligen Funktionen/Durchläufen wären dann nicht mehr diese „res = OrderSend...“ gefragt, sondern „ticket_1 = OrderSend...“ bzw. „ticket_2 = OrderSend...“ zu formulieren.
Damit sind nunmehr auch die Tickets eindeutig und könnten mit „return ticket_1“ bzw. „return ticket_2“ übergeben werden.

Und damit zu 3. „ticket_1 = 0;“ und „ticket_2 = 0;“ werden global deklariert und stellen den jeweiligen Ausgangszustand der Tickets dar.

4. Jetzt könnte direkt unter“void OnTicK“ ein zusätzlicher Block platzieren werden, der zwischen „HISTORY = geschlossene Pos. 2“ und „TICKET = offene Pos.1“ unterscheidet und welcher dafür zuständig ist, die ggf. noch geöffnete Position nachträglich zu schließen.
In diesem Zusammenhang müsste als erstes die Anweisung gegeben sein, dass „if (ticket_1) --→ CheckForOpen (ticket_1)“ und dass „if (ticket_2) --→ CheckHedgeOpen (ticket_2)“. Dann sollten die Ticket-Abfragen und der „OrderClose...“-Befehl folgen. Den Abschluss würden die Rücksetzungen der Tickets auf “0“ und ein „return“ bilden.

Bis auf Formulierungs- oder Benennungsfehler erscheint mir das alles recht logisch und nachvollziehbar. Dennoch bin ich relativ sicher, dass der „Teufel wahrscheinlich im Detail“ liegt und ggf. doch noch einiges Andere „geradezurücken“ ist.


Vielleicht könnte das ursprüngliche Problem aber auch auf der hier beschriebenen Basis gelöst werden !? Sauber, klar und eindeutig.

Bin natürlich auf Deine neuerliche Reaktion gespannt, warte voller Ungeduld auf Deinen nächsten post, sage schon `mal DANKE und bis bald ...

LG. pt.

piptrade 06.04.18 23:04

Lieber next user,

wie schon angenommen, war nicht alles zu 100% wirklich richtig ! - Dennoch stimmte der „Leitfaden“; - die zu vermutende Logik und der zu vermutende Code !

4 separate Blöcke, einschließlich Deklaration und deren Funktionsausführung wurden umgesetzt ! Die „Ticket-updates“ werden jetzt in der „void CheckForOpen()“ und in der „void CheckHedgeOpen()“ (Primär-Orders für Pos.1 und Pos.2) festgelegt und in der Endkonsequenz sogar übernommen ! Globale Deklarationen wurden ebenfalls ergänzt.
Soweit war ein erster und wichtiger Fortschritt erreicht !!! - Eine tatsächliche Kommunikation und damit eine neue BASIS !!!
Thanks, - für mehrere kleine Details Deiner Statements, die ich mir immer wieder „vor Augen führte“, haben mir hier weitergeholfen.

Da Du momentan scheinbar "verschollen“ bist und weder im Forum noch direkt an meiner Seite "aufwachst", blieb nur nur DAS „Do it`s your help“; … und das waren nunmehr 3 Tage „Kampf“ !
Dennoch bin ich mehr als nur zufrieden, diese „Krampf-Orgie“ auf mich genommen zu haben, dass Resultat kann sich nämlich wirklich sehen lassen !!! (Bis auf eine absolute Kleinigkeit); - läuft der EA ! Und er läuft richtig gut !

Jetzt ist lediglich noch etwas „Kosmetik“ der Conditions und im Code-Styling angesagt und das „DINGELING“ kann seinen Weg, - welcher das auch seien mag`, - gehen !

Lieber next user, … lieber traderdock, - herzlichen Dank für Eure „Bemühungen“, vielleicht ist hier aber auch „Herausforderungen“ richtiger ? Dennoch DANKE !!!

In diesem Sinne LG. Euer piptrade

PS.: (Fair play !) An alle, die den Beitrag verfolgt haben: Den allumfassenden, richtigen Code werde auch ich Euch nicht so einfach liefern. Dafür musste ich zu hart dafür arbeiten.
Dennoch hat jeder Interessierte die Möglichkeit eines direkten Kontaktes. Für einen kleinen Obolus gebe ich gern den richtigen Code preis. Eine Einsicht “in“ - oder ein realer Test des EXPERT ADVISORs - wäre dann eine vielleicht nächste und zugesichert, lukrative Option.
LG.

Und um "meiner Seele freien Lauf zu lassen": Lieber next user - Programmierungswissen und Strategie-Erfahrung wären ggf. der richtige "DEAL" gewesen !


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:01 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum