Einzelnen Beitrag anzeigen
  #47 (permalink)  
Alt 26.03.18
piptrade piptrade ist offline
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.