Einzelnen Beitrag anzeigen
  #2 (permalink)  
Alt 06.12.14
pako pako ist offline
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 224
pako befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Bucardo Beitrag anzeigen
Hallo zusammen,

nachdem ich für meinen ersten EA in diesem Forum bereits eine Menge Ideen und Hinweise finden konnte, bin ich bei der Entwicklung inzwischen auf ein Problem gestoßen, dass ich nicht lösen kann.

Der EA soll als News-EA fungieren und zu einer bestimmten Zeit zwei Pending-Orders (BuyStop und SellStop) setzen. Das klappt bisher einwandfrei. Dann soll die klassische OCO-Funktion ins Spiel kommen und die nicht eröffnete Position schließen. Dazu verwende ich folgenden Code:

//+------------------------------------------------------------------+
//| Benutzer-Input |
//+------------------------------------------------------------------+

extern int News_Tag = 5;
extern int News_Stunde = 20;
extern int News_Minute = 30;
extern double Lots = 0.1;
extern int StopLoss = 30;
extern int TakeProfit = 400;
extern int TrailingStop = 30;
extern int Pip_Differenz = 50;


//+------------------------------------------------------------------+
//| Variablen-Definitionen |
//+------------------------------------------------------------------+
int Zaehler = 0;
int ticket1, ticket2;


void OnTick()
{

//===Tag & Uhrzeit prüfen===

static bool Erster_Tick = true;


if(Day() == News_Tag && Hour() == News_Stunde && Minute() == News_Minute)
{
if(Erster_Tick == true)
{
Alert("Order startet");
Erster_Tick = false;
//===Programmkern===

//===Orderaufgabe START===
//Buy-Order
if (Zaehler < 1)
{
ticket1 = OrderSend(Symbol(), OP_BUYSTOP, Lots, Close[0] + Pip_Differenz*Point, 10, Close[0] - StopLoss*Point, Close[0] + TakeProfit*Point, "Set by News-Advisor");
if (ticket1 < 0)
{
Alert ("Error sending Buy-Order!Fehlercode:", GetLastError());
}

//Sell-Order
ticket2 = OrderSend(Symbol(), OP_SELLSTOP, Lots, Close[0] - Pip_Differenz*Point, 10, Close[0] + StopLoss*Point, Close[0] - TakeProfit*Point, "Set by News-Advisor");
if (ticket2 < 0)
{
Alert ("Error sending Sell-Order!Fehlercode:", GetLastError());
}
}
//===Orderaufgabe ENDE===

//===OCO-Funktion START===
for (int i = 0; i < OrdersTotal(); i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if (OrderType() == OP_BUY)
{
OrderDelete(ticket2);
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
}
}
}

if (OrderType() == OP_SELL)
{
OrderDelete(ticket1);
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if(OrderStopLoss()>(Ask+Point*TrailingStop))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Poi nt*TrailingStop,OrderTakeProfit(),0,Red);
}
}
}
}

//===OCO-Funktion ENDE===
}


//===Programmkern ENDE===
}
else
{
Erster_Tick = true;
}
}
//+------------------------------------------------------------------+

Das Programm zeigt mir im StrategyTester eine Dauerschleife aus Fehlermedlungen (4108 : Invalid Ticket) an die ich nicht beheben kann.

Wo liegt mein Fehler?

Danke für eure Hilfe,
mfG Bucardo
Code:
for(int i=OrdersTotal()-1; i>=0; i--)
  {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol())
        {
         if(OrderType()>1)
           {
            int ticket=OrderTicket();
            OrderDelete(ticket);
           }
        }
     }
  }