Einzelnen Beitrag anzeigen
  #4 (permalink)  
Alt 09.02.15
Bucardo Bucardo ist offline
Mitglied
 
Registriert seit: Nov 2014
Beiträge: 31
Bucardo befindet sich auf einem aufstrebenden Ast
Standard Neues Problem

Hallo zusammen,

nachdem mir pako mit meinem ersten OCO-Problem geholfen hat, bin ich nach einiger Zeit auf das nächste Problem bzgl. der OCO-Funktion gestoßen.

Das Ziel ist wie immer das gleiche: Sollte eine der beiden Pending-Orders erfüllt werden, soll die noch offene PO gelöscht werden. Dazu verwende ich den COde unter "/// OCO-Funktion". Könnt ihr mir sagen wo mein Fehler liegt? Im Strategy-Tester schwanken die Ergebnisse zwischen "keine Order wird gelöscht" und "FehlerCOde 4108 / falsches Ticket". In der aktuellen Konfiguration passiert einfach nichts und ich finde den Fehler einfach nicht. :/

P.S. zur Vereinfachung des COdes habe ich diverse VOrbedingungen zur Orderaufgabe weggelassen, weil diese (inkl. der Orderaufgabe einwandfrei funktionieren)

Pp.S. pako's Lösung sorgt im aktuellen Fall dafür, dass immer wieder Orders eröffnet und geschlossen werden.

Danke & Gruß
Bucardo


void OnTick()
{

int ticket_b;
int ticket_s;

// Programmkern START

//// Prüfung ob keine Order offen ist, bevor neue Order eröffnet wird
bool res;
res=OrderSelect(ticket,SELECT_BY_TICKET);
if(res == true)
{
if(OrderCloseTime() == 0)
{
bool res2;
res2=OrderClose(ticket,Lots,OrderClosePrice(),10);
if(res2 == false)
{
Alert("Error Closing Nr.",ticket);
}
}
}

//// Orderaufgabe
ticket_b = OrderSend(Symbol(),OP_BUYSTOP,Lots,Buy_Price,20,Bu y_SL,Buy_TP,"Set by London-Breakout-Advisor");
ticket_s = OrderSend(Symbol(),OP_SELLSTOP,Lots,Sell_Price,20, Sell_SL,Sell_TP,"Set by London-Breakout-Advisor");
// Programmkern ENDE
}

////Risikomanagement


//// OCO-Funktion
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(ticket_b,SELECT_BY_TICKET,MODE_TRAD ES))
{
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
{
OrderDelete(ticket_s);
}
}
}
if(OrderSelect(ticket_s,SELECT_BY_TICKET,MODE_TRAD ES))
{
if(OrderSymbol()==Symbol())
{
if(OrderType()==OP_SELL)
{
OrderDelete(ticket_b);
}
}
}
}


//// Schließung aller Orders um 21:30 Uhr
if (Hour() == 21 && Minute() > 30)
{
if (OrdersTotal() > 0)
{
for (int j=OrdersTotal()-1;j>=0;j--)
{
ph1=OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if (OrderType() == OP_BUY)
{
ph2=OrderClose(OrderTicket(),OrderLots(), Bid, 10);
}
if (OrderType() == OP_SELL)
{
ph3=OrderClose(OrderTicket(),OrderLots(), Ask, 10);
}
if (OrderType() == OP_BUYSTOP)
{
ph4=OrderDelete(OrderTicket());
}
if (OrderType() == OP_SELLSTOP)
{
ph5=OrderDelete(OrderTicket());
}
}
}
}

}