Einzelnen Beitrag anzeigen
  #5 (permalink)  
Alt 30.12.16
traderdoc traderdoc ist offline
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.735
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von RetepM Beitrag anzeigen
Ich sehe zwischen Deiner bzw. den Generator-Funktionen keine großen Unterschiede. Die Generator-Funktion hat den Vorteil, dass man keine weiteren if/bool-Konditionen braucht, und man kann (weil es ja ein kompletter EA ist) auch problemlos testen. Ich hatte gedacht, das ist vielleicht etwas Anwender-freundlich :-)
Ne wirklich, den Unterschied erkennst Du nicht?
Gut, dann möchte ich Dir den gern aufzeigen:
Mal abgesehen vom Schreibstil des Codes, der bei Dir extrem schwer zu lesen ist. Ich habe den mal aufgearbeitet, dann sieht man es auch besser.
Code:
void CheckLastOrderType2()
{
   int orderType = -1;
   int orderId     = -1;
   datetime lastCloseTime = 0;
   int cnt = OrdersHistoryTotal();

   for (int i = 0; i < cnt; i++)                    //8
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderSymbol() == Symbol() && lastCloseTime < OrderCloseTime() &&  orderId == 1)  //11
      {
         lastCloseTime = OrderCloseTime();   //13
         orderType = OrderType();              //14
         orderId = OrderMagicNumber();       //15
      }
   }
   if (orderType == OP_SELL || FirstTime2) //18
   {
      FirstTime2 = false;                           //20
      BuyOrder6();                                  //21
   }
}
Und jetzt mal nur die wichtigsten Unterschiede.
1. In Zeile 8 wird die Historie vom Urschleim bis zur aktuell geschlossenen Order durchforstet. Das kostet ewig Zeit und ist unnötig, denn er wollte nur die letzte geschlossene Order haben und die liegt am Ende der OrdersHistory() und nicht am Anfang und daher
for (int i = OrdersHistoryTotal()-1; i >= 0; i--) {
2. In Zeile 11 fehlt eigentlich die Abfrage nach der MagicNumber, sofern nicht auf eine expilizite Vergabe der MagicNumber verzichtet wird, also
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
3. Und was soll das orderId == 1 eigentlich bewirken, außer dass der darunterstehende Klammerausdruck mit Zeile 13, 14 und 15 nie angesprungen wird, weil per se in der Funktionsdeklaration int orderID = -1 gesetzt wurde.
4. Damit bleibe auch lastCloseTime auf dem initialisierten Wert von 0 stehen, aber das würde dann eh keine Rolle mehr spielen, weil die Übergabe in Zeile 13 ja nicht angesprungen wird usw. usf.

Was passiert nun wirklich in diesem Teil des EAs:
1. Der EA nimmt sich die Order mit der historischen Listennummer 0
2. Zeile 11 ergibt false, s.o.
3. Damit wird Zeile 13, 14 und 15 nicht angesprungen
4. Die for-Schleife rattert alls geschlossenen Orders durch - nix passiert
5. Nach Abschluß der for-Schleife wird geprüft, ob orderType == OP_SELL, also den Wert 1 hat, kann orderType aber nicht haben, weil immer noch der initialisierte Wert -1 in dieser Variablen steht (Zeile 14 wurde ja nicht angesprungen).
6. Da nun mit Installierung des EAs die Variable FirstTime2 auf true gesetzt wurde und in Zeile 18 eine ODER-Verknüpfung steht, ist die Abfrage in Zeile 18 true, wenigstens nur für den ersten Ansprung der Funktion CheckLastOrderType2(), denn in Zeile 20 wird diese Variable endgültig auf false gesetzt und nirgends im laufenden Programm wieder auf true. D.h. jedes weitere Anspringen dieser Funktion endet mit einem glatten Durchlauf der Funktion ohne Aktion!
7. Aber!!! Nur beim ersten! Durchlauf dieser Funktion wird die Funktion in Zeile 21 angesprungen und eine evtl. neue BuyOrder geöffnet. (Den Code habe ich mir nun nicht mehr angesehen)

So, ich habe die Analyse mal etwas ausführlicher gestaltet, weil ich auch zeigen wollte, dass genau
unter Verwendung irgendwelcher Generatoren ("PS Code kommt aus meinem Generator." - Zitat aus dem Post von @RetepM) nur Murks rauskommt, wenn man die Eingangsbedingungen nicht klar und eineindeutig beschreibt und am Ende den Code anscheinend auch nicht recht versteht und sich nur darauf verlässt.
Wofür der Code auch immer generiert wurde, das Problem von @akuh löst er in keinster Weise.

Viel Spass noch beim Erlernen von MQL4 auch im Jahre 2017. Prosit Neujahr!

traderdoc

PS. Sollte ich etwas übersehen haben, dann werde ich mich gern korrigieren.
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.