Hi,
Zitat:
Zitat von Mast83
ich habe einen EA geschrieben und dieser ist soweit auch fertig bis auf eine Detailsfrage.
|
Dir fehlt noch ein komplettes OrdermanagementSystem, aktuell ist der Code sehr gefährlich. Multiple Orders können eröffnet werden, wenn auf der Seite des Brokers Fehler passieren.
Zitat:
Der EA soll im 1 Stunden Chart handeln und hat einen engen SL als auch TP. Leider eröffnet dieser sofort eine neue Order nachdem die alte geschlossen wurde. Eigentlich soll stattdessen gewartet werden bis die laufende Stunde vorbei ist und dann in der darauf folgenden Stunde erneut gehandelt werden.
|
Hier ein Teil des Codes:
Code:
opensell = 0;
openbuy = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) //==> select also on magicnumber and symbol
SELECT_BY_POS vermeiden, da nicht sichergestellt ist, das alle offenen Orders auch angezeigt werden.
Die tickets besser selber verwalten und dann über die ticketnummer und die OrderClosetime nachschauen, ob der trade noch offen ist. Durch ein OrderClose() innerhalb der for Schleife veränderst du auch die Reihenfolge der Trades.
Code:
{
if(OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol() && OrderType() == OP_BUY){openbuy++;}
if(OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol() && OrderType() == OP_SELL){opensell++;}
if((OrderOpenTime()+3600) < TimeCurrent() && OrderMagicNumber()== MagicNumber && OrderSymbol()== Symbol())
{
if (OrderType() == OP_BUY)
{
bool Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red);
es hat einen Sinn, das OrderClose ein true/false zurück liefert. Das musst du auswerten. Was passiert, wenn die Order nicht geschlossen wurde?
Code:
openbuy = openbuy-1; //openbuy--;
}
if (OrderType() == OP_SELL)
{
Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red);
opensell = opensell-1; //opensell--;
}
}
}
}
wenn sl oder tp erreicht wurde, wird
innerhalb der Stunde sofort eine neue Order eröffnet.
Du brauchst eine Funktion, die nur zum HourCandle-Close/open ausgeführt wird.
Code:
/**
* liefert beim ersten mal true, danach nur noch stündlich
*/
bool Time60M(){
static datetime PrevTime60;
if(PrevTime60 < iTime(NULL, PERIOD_H1, 0))
{
PrevTime60 = iTime(NULL, PERIOD_H1, 0);
return(true);
} else {
return(false);
}
}
Die for Schleife von oben wird ja nur ausgeführt, wenn ein trade offen ist, also bleibt opensell/-buy = 0
Sicher das du dich auf die Uhrzeit des Brokers verlassen willst? TimeHour() mit TimeLocal() dürfte besser sein.
Sommerzeitumstellung kommt ja bald.
Code:
if ((TradeHour1==Hour()) && openbuy == 0) //Signal Buy
{
openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,Bid + TakeProfit * Point,"Kompensation buy",MagicNumber,0,Green);
if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
}
//SellOrder
if ((TradeHour1==Hour()) && opensell == 0) //Signal Sell
{
opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,Ask - TakeProfit * Point,"Kompensation sell",MagicNumber,0,Red);
if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() );
}
//----
return(0);
}
Gruss
sandmann23