Falls mal jemand über diesen Beitrag stolpert, ich teste gerade dieses Vorgehen: Es geht um eine Multicurrency-EA mit Ordermanagement (Hidden-SL, -Trailing, -BE, -Teilverkauf, -TP). Da sich die Variablen für die Preislinien sich ständig ändern (je nach selektierter Order) orientiere ich mich an iHighest, iLowest und OrderOpenPrice() der jeweiligen Order.
Die Ordermanagement-Funktion rufe ich auf und übergebe die Ticketnumber.
Code:
//Anzahl der M1-Bars seit Ordereröffnung
BarsAfterOpen=iBarShift(symbol,PERIOD_M1,OrderOpenTime(),false);
if(BarsAfterOpen == 0) { // wenn innerhalb der selben Kerze der Ordereröffnung
if(ask >= OrderOpenPrice()) { // wenn momentaner Preis >= Eröffnungspreis ...
PeriodHighest = ask; // momentaner Preis ist der höchste
PeriodLowest = OrderOpenPrice(); // tiefster Preis ist Eröffnungspreis
}
if(bid <= OrderOpenPrice()){ // siehe oben al reves
PeriodHighest = OrderOpenPrice();
PeriodLowest = bid;
}
else { // wenn seit der Eröffnung mehr als 0 Kerzen vergangen sind
PeriodHighest = iHigh(symbol,PERIOD_M1,iHighest(symbol,PERIOD_M1,MODE_HIGH,BarsAfterOpen,0));
PeriodLowest = iLow(symbol,PERIOD_M1,iLowest(symbol,PERIOD_M1,MODE_LOW,BarsAfterOpen,0));
}
Die Preislinien PeriodHighest / PeriodLowest verwende ich, um den Abstand zum OrderOpenPrice() zu messen und um festzustellen, ob ich mich über/unter den Werten für TrailingStart, TrailingDistance, MoveToBreakEven, PartialClose etc. befinde:
Code:
if(PeriodHighest > OrderOpenPrice()+trailingstart*point)
{
buystoplossprice= PeriodHighest - trailingdistance * point;
}
if(PeriodHighest > OrderOpenPrice() + breakevenpoints * point)
{
if(buystoplossprice < OrderOpenPrice())
buystoplossprice = OrderOpenPrice() + breakevengain * point;
}
etc., etc., etc.
Am Ende der Funktion
prüfe ich, ob mein aktueller Preis eine der Linien (buystoplossprice, sellstoplossprice) über-/unterschritten hat um die Order teilweise oder ganz zu schließen.
Code:
//---- schließt Order wenn unter/über SL/TP-Linie --------
if((bid <= buystoplossprice) || (ask >= buytakeprofitprice))
{
bool ret=OrderClose(ticketnumber,OrderLots(),OrderClosePrice(),Slippage,Red);
}
Falls es so nicht klappen sollte, kann es immer noch als Inspiration dienen:-)
Schönen Gruß
Werner