Wiederholtes Ordersetzen und Positionen schließen

Einloggen oder registrieren, um einen Kommentar zu schreiben
MrSeedan
33
MrSeedan  
Mein EA soll, wenn eine Position geschlossen wurde (durch tp oder sl) wieder zu einem bestimmten Preis(Hoch- oder Tiefpreis) wieder eine Pending Order setzen, aber irgendwie kriege ich das nicht hin egal welche loop Funktion ich benutze. Ein weiteres Problem ist das der EA eigentlich um etwa 22:00 Uhr alle offenen Positionen schließen soll (also nie länger als den aktuellen Tag eine offene Position haben soll) dies aber nicht tut...Kann mir jemand weiterhelfen? Ich bedanke mich schonmal für jede Hilfe. :D
input color           InpColor=clrRed;     // Linienfarbe
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Linienstil
input int             InpWidth=2;          // Linienbreite
input int             Periode=PERIOD_M5;
input datetime        anfangszeit = D'10:00';
input datetime        endzeit     = D'11:00';
input datetime        tagesende   = D'21:58';
input int             Lot=2;


#include <ChartObjects\ChartObjectsLines.mqh>
#include <Trade\Trade.mqh>
CChartObjectHLine high_line, low_line;

CTrade trade;

void CloseAllPositions()
{
      for (int i=PositionsTotal()-1; i>=0; i--)
          {int ticket=PositionGetTicket(i);
         trade.PositionClose(i);}
}


int OnInit()
{

 
   high_line.Create(0, "high", 0, 0.0);   
   high_line.Color(InpColor);
   high_line.Style(InpStyle);
   high_line.Width(InpWidth);
   low_line.Create(0, "low", 0, 0.0);   
   low_line.Color(InpColor);
   low_line.Style(InpStyle);
   low_line.Width(InpWidth);

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+

void OnTick()
{

MqlTradeRequest request;
MqlTradeResult  result;
MqlTradeRequest request1;
MqlTradeResult  result1;
MqlTradeCheckResult checkresult;



  
   
   string Time1= TimeToString(anfangszeit,TIME_MINUTES);
   string Time2= TimeToString(endzeit,TIME_MINUTES);
   string Time3= TimeToString(TimeLocal(),TIME_MINUTES);
   string Time4= TimeToString(tagesende, TIME_MINUTES);

if (Time1<Time3 && Time3<Time2 ) 
{
   int BarIndex1=iBarShift(_Symbol,PERIOD_H1,anfangszeit,false);
   int BarIndex2=iBarShift(_Symbol,PERIOD_H1,endzeit,false);
   double Hoch=iHigh(_Symbol,PERIOD_H1,BarIndex2);
   double Tief=iLow(_Symbol,PERIOD_H1,BarIndex2);
   high_line.Price(0,Hoch);
   low_line.Price(0,Tief);
   double HochPreis=high_line.Price(0,Hoch);
   double TiefPreis=low_line.Price(0,Tief);
   
 };

if(Time3>Time2 && OrdersTotal()==0 && PositionsTotal()==0)

{    
         double HochPreis =ObjectGetDouble(0,"high",OBJPROP_PRICE,0);
         Print("HochPreis" , HochPreis);
         double TiefPreis =ObjectGetDouble(0,"low",OBJPROP_PRICE,0);
         Print("TiefPreis" , TiefPreis);         
         ZeroMemory(request);
         ZeroMemory(request1);
         Print("HochPreis" ,HochPreis);
         Print("TiefPreis" , TiefPreis);
         double Range=HochPreis-TiefPreis;
         request.action = TRADE_ACTION_PENDING;
         request.type = ORDER_TYPE_BUY_STOP;
         request.symbol = _Symbol;
         request.volume = Lot;
         request.type_filling = ORDER_FILLING_FOK;
         request.price = HochPreis;
         request.sl = TiefPreis;
         request.tp = HochPreis+Range;
         request.type_time = ORDER_TIME_DAY;
         request.deviation = 50;
         request.stoplimit = 0;

      if (!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
      PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
      
      if (SymbolInfoDouble(_Symbol,SYMBOL_BID)>HochPreis && result.retcode == 4756)
      request.action=TRADE_ACTION_DEAL;    
      request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); 
   

        
         
         
         request1.action = TRADE_ACTION_PENDING;
         request1.type = ORDER_TYPE_SELL_STOP;
         request1.symbol = _Symbol;
         request1.volume = Lot;
         request1.type_filling = ORDER_FILLING_FOK;
         request1.price = TiefPreis;
         request1.sl = HochPreis;
         request1.tp = TiefPreis-Range;
         request1.type_time = ORDER_TIME_DAY;
         request1.deviation = 50;
         request1.stoplimit = 0;   
 
      if (!OrderSend(request1,result1))
      PrintFormat("OrderSend error %d",GetLastError());
      PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result1.retcode,result1.deal,result1.order);
      
      if (SymbolInfoDouble(_Symbol,SYMBOL_BID)<TiefPreis && result1.retcode == 4756)
      request1.action=TRADE_ACTION_DEAL; 
      request1.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);    


}
if(Time3>Time4)
{
CloseAllPositions();
};
};
 

amando
740
amando  

Was funktioniert denn nicht? Ob eine order oder position besteht kann man ja einfach abfragen, wo das hoch oder tief ist auch, die zeit, dafür gubts ja die zeitfunktion.


verstehe dein problem nicht ganz ohne deinen code jetzt ganz zu lesen, wo noch dazu die restlichen Funktionen fehlen

Carl Schreiber
Moderator
6861
Carl Schreiber  

Dass liegt wahrscheinlich daran, dass Du nicht verstanden hast wie Metaquotes den Ablauf von der order (Auftrag) über transactions (Transaktionen) hin zu den positions (Positionen) organisiert hat.

Gib einfach mal "Pending Order" ein und such in der CodeBase nach einem EA oder TradeManager und schau Dir den Code an, der dort verwendet wird!!

Einloggen oder registrieren, um einen Kommentar zu schreiben