Einzelnen Beitrag anzeigen
  #40 (permalink)  
Alt 23.03.18
piptrade piptrade ist offline
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Hallo, next user,

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

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

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

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

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

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

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

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

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

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

Bis dahin mit ganz LG. pt.