Oh oh, ich glaub da ist bischen was an Verständnis verrutscht
Gehen wirs nochmal durch:
Code:
void OnTick()
{
//--- 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();
CheckTakeProfit();
}
Die ersten beiden Funktionen kann ich nicht beurteilen. Hoffe die funktionieren wie gewollt.
Die dritte "CheckTakeProfit()" muss ich jetzt aber etwas auseinandernehmen:
Code:
void CheckTakeProfit(); {
Müsste bei dir eigentlich einen Fehler beim Kompilieren generieren. Das Semikolon gehört da nicht hin.
=== === === === === === === === === === === ===
Code:
double TSL = Trail_SL *100 *Point;
Diese Variable brauchst du ja unabhängig der Funktion. Da bietet es sich doch an, diese global oben zu erstellen.
=== === === === === === === === === === === ===
Code:
//--- Trailing_SL for order type BUY --------------------------------+
if (OrderType() == OP_BUY && (openOrders == 1 || openOrders == 2))
{
if (Bid - OrderOpenPrice() > Trail_Target_1 *100 * Point)
{
if (OrderStopLoss() == 0 || OrderStopLoss() < Bid - TSL)
{
if (!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
Print("Error setting Buy trailing stop: ", GetLastError());
}
}
}
//--- Trailing_SL for order type SELL ---------------------------------+
if(OrderType() == OP_SELL && (openOrders == 1 || openOrders == 2))
{
if (OrderOpenPrice() - Ask > Trail_Target_1 *100 *Point)
{
if (OrderStopLoss() == 0 || OrderStopLoss() > Ask + TSL)
{
if (!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
Print("Error setting Sell trailing stop: ", GetLastError());
}
}
}
- Das ist ja der Code, den ich in die "updateSL()" gepakt habe.
- Ich finde, in "updateSL()" passt er namentlich besser rein, als "CheckTakeProfit()", oder?
=== === === === === === === === === === === ===
Code:
//--- Schließen Ticket1 -------------------------
// völlig NEU (next user)
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;
}
}
}
- So, nachdem der Punkt zuvor vom Programm bearbeitet wurde, rufst du hier mit "updateSL()" erneut den gleichen Code auf.
- Der Code gehört eigentlich in die "OnTick()", wie bereits erwähnt.
=== === === === === === === === === === === ===
Code:
void updateSL(int ticket)
{
ResetLastError();
double TSL = Trail_SL *100 *Point;
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))
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))
Print("Error setting Sell trailing stop: ", GetLastError());
}
}
}
}
}
- Die Variable "TSL" würde ich wie gesagt global oben definieren.
- Sowohl hier, als auch im selben Code in der "CheckTakeProfit()" hast du den Code mit
Code:
(openOrders == 1 || openOrders == 2)
erweitert. Was genau steckt dahinter? Was machen sie?
Eigentlich müsste dein Code ungefähr so aussehen:
Code:
// OBEN
int orderTicket1 = 0;
int orderTicket2 = 0;
double TSL = Trail_SL *100 *Point;
...
// In OnTick()
void OnTick()
{
//--- 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();
1 if(orderTicket1)
updateSL(orderTicket1);
2 if(orderTicket2)
updateSL(orderTicket2);
3 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;
}
}
}
}
// Die Funktion "updateSL()" außerhalb setzen.
// Der Code & die ganze Funktion "CheckTakeProfit()" sind unnötig.
void updateSL(int ticket)
{
ResetLastError();
if(OrderSelect(ticket,SELECT_BY_TICKET))
{
if(OrderType() == OP_BUY)
{
if(Bid - OrderOpenPrice() > Trail_Target *100 * Point)
{
if(OrderStopLoss() < Bid - TSL || OrderStopLoss() == 0)
{
if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
Print("Error setting Buy trailing stop: ", GetLastError());
}
}
}
else if(OrderType() == OP_SELL)
{
if(OrderOpenPrice() - Ask > Trail_Target *100 * Point)
{
if(OrderStopLoss() > Ask + TSL || OrderStopLoss() == 0)
{
if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
Print("Error setting Sell trailing stop: ", GetLastError());
}
}
}
}
}
- Die drei Variablen außerhalb, oben definieren.
- OnTick():
- Ist "orderTicket1 != 0" dann in der Funktion "updateSL()" Bedingungen überprüfen und ggf. StopLoss anpassen.
- Ist "orderTicket2 != 0" dann in der Funktion "updateSL()" Bedingungen überprüfen und ggf. StopLoss anpassen.
- Ist "orderTicket1 && orderTicket2 != 0" dann in den folgenden Codezeilen schauen, ob Order2 geschlossen ist.
Ist das der Fall, so Order1 schließen.
- Der Code der Funktion "updateSL()" hat nichts in der "CheckTakeProfit()" zu suchen.
Auch der andere Code in "CheckTakeProfit()" gehört nicht darein. Die Funktion ist somit unnötig!
=== === === === === === === === === === === ===
Code:
} // diese Klammer schließt nun den gesamten TP-Bereich
Ironie des Schiksals: Eben diese Klammer ist eine Klammer zuviel!