Einzelnen Beitrag anzeigen
  #6 (permalink)  
Alt 20.02.12
Benutzerbild von sandmann23
sandmann23 sandmann23 ist offline
Mitglied
 
Registriert seit: Feb 2012
Beiträge: 67
sandmann23 befindet sich auf einem aufstrebenden Ast
sandmann23 eine Nachricht über Skype™ schicken
Standard

Hi,
Zitat:
Zitat von Mast83 Beitrag anzeigen
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--;
              }              
          }
       }
    }
Code:
//BuyOrder
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