Einfacher Code für EA benötigt (zwei offene Aufträge ändern) - Seite 3

 

Grundsätzlich setze ich zwei schwebende Aufträge zu einer bestimmten Zeit, nämlich 23:00 GMT+2 glaube ich. Einer der schwebenden Aufträge ist ein Verkaufsstopp und der andere ist ein Kaufstopp. Beide Aufträge sind gleich weit von der Eröffnung der 23:00 Kerze entfernt, in diesem Fall 14 Pips. Beide haben einen TakeProfit von 28 Pips (in diesem Fall) und einen StopLoss von 55 Pips.

Wenn nun beide Aufträge erfüllt sind (im Wesentlichen sowohl nach oben als auch nach unten 14 Pips vom Eröffnungskurs an der 23:00-Kerze, bevor die Aufträge ablaufen), möchte ich, dass die Take Profits beider Aufträge um beispielsweise 20 Pips erhöht werden. Der neue Take-Profit beträgt in diesem Fall also 58 Pips. Der Stop-Loss sollte jedoch immer gleich bleiben. Im Wesentlichen versuche ich, eine Art Absicherung zu erreichen.

Wenn zwei Trades offen sind, ist es wahrscheinlich, dass der Kurs in eine Richtung geht, und zwar so weit, dass Verluste ausgeglichen werden, wenn die Take Profits beider Trades erhöht werden. Um einen Gewinn zu erzielen, muss entweder nur ein Handel eröffnet werden und der Take-Profit erreicht werden, oder beide Handel müssen eröffnet werden und die Take-Profits erreichen, ohne weit in eine Richtung zu gehen.

Ich hoffe, das ist klar, wenn nicht, werde ich ein Bild zur Verfügung stellen, das klarer sein sollte.

 
WHRoeder:

Ich bezog mich auf Ihren unmittelbar vorhergehenden Beitrag

madmax3 2012.03.09 14:52
Hier ist der überarbeitete Code für den gesamten EA:
Die immer noch zeigt die Probleme, die ich angegeben.
Dieser Teil des Codes ist für einen anderen Teil des EA ich glaube, der Teil, der die schwebenden Aufträge öffnet, würde das überhaupt irgendeine Auswirkung auf den Teil, den ich versuche, zu beheben? Sorry, ich glaube, ich habe Teile des Codes verwechselt, vor allem im ursprünglichen Beitrag. Ich habe jedoch getan, was Sie auf den Teil des Codes, die ich speziell für benötigen angegeben haben.
 
madmax3:

Ich hoffe, das ist klar, wenn nicht, werde ich ein Bild zur Verfügung stellen, das klarer sein sollte.

Es ist klar, danke.

Sie wollen diese Aufträge also nur einmal ändern... dann ist die Antwort einfach. Sie müssen den 23:00 Uhr-Balken überprüfen und die TPs bestimmen, an denen die Orders hätten eröffnet werden sollen ... wenn die Orders an demselben TP liegen, müssen sie geändert werden, wenn sie nicht an demselben TP liegen, wurden sie bereits geändert und müssen nicht erneut geändert werden ... ganz einfach.

 
RaptorUK:

Das ist klar, danke.

Sie wollen diese Aufträge also nur einmal ändern ... dann ist die Antwort einfach. Sie müssen den 23:00-Balken überprüfen und die TPs bestimmen, an denen die Aufträge geöffnet werden sollten ... wenn die Aufträge am gleichen TP liegen, müssen sie geändert werden, wenn sie nicht am gleichen TP liegen, wurden sie bereits geändert und müssen nicht erneut geändert werden ... einfach.

Das Ändern und Prüfen sollte jedoch nur dann erfolgen, wenn zwei Geschäfte offen sind, wie würde ich vorgehen? Sollte ich den Code, den ich bereits habe, ergänzen oder neu beginnen?

Also im Wesentlichen, wenn es zwei Trades (gleiches Symbol und magische Zahl) der EA sollte die Take Profits der offenen Trades im Vergleich zu den zuvor bestehenden schwebenden Aufträgen (die jetzt ausgeführt werden) und dann, wenn sie die gleichen sind, sollte es geändert werden, und sobald es Schleifen wird es erneut überprüfen und feststellen, dass sie nicht die gleichen sind und somit nicht weiter die Trades ändern?
 
madmax3:
1. Das Ändern und Prüfen sollte nur dann erfolgen, wenn zwei Geschäfte offen sind, wie würde ich vorgehen? Sollte ich den Code, den ich bereits habe, ergänzen oder neu beginnen?

2. Also im Wesentlichen, wenn es zwei Trades (gleiches Symbol und magische Zahl) der EA sollte die Take Profits der offenen Trades im Vergleich zu den zuvor bestehenden schwebenden Aufträgen (die jetzt ausgeführt werden) und dann, wenn sie gleich sind, sollte es geändert werden, und sobald es Schleifen wird es erneut überprüfen und feststellen, dass sie nicht gleich sind und somit nicht weiter ändern die Trades?

1. Gehen Sie die offenen Aufträge durch, prüfen Sie das Symbol und die magische Zahl, wenn Sie eine Übereinstimmung haben, die kein schwebender Auftragstyp ist, erhöhen Sie einen Zähler ... wenn Sie mit der Prüfung der Aufträge fertig sind und 2 gezählt haben, dann haben Sie 2 offene Aufträge für das richtige Symbol und die magische Zahl ... jetzt können Sie sie ändern ... siehe 2.

2. Nein, Sie können den TP der schwebenden Aufträge nicht sehen, wenn sie aktiviert wurden und nun nicht mehr schwebend sind. Der EA sollte den 23:00-Balken überprüfen und herausfinden, was die ursprünglichen TPs gewesen wären... und diese dann mit den TPs der beiden offenen Aufträge vergleichen ... anhand dieser Informationen kann entschieden werden, ob eine Änderung vorgenommen werden soll oder nicht.

 
RaptorUK:

1. Gehen Sie die offenen Aufträge durch, prüfen Sie das Symbol und die magische Zahl, wenn Sie eine Übereinstimmung haben, die kein schwebender Auftragstyp ist, erhöhen Sie einen Zähler ... wenn Sie mit der Prüfung der Aufträge fertig sind und 2 gezählt haben, dann haben Sie 2 offene Aufträge für das richtige Symbol und die magische Zahl ... jetzt können Sie sie ändern ... siehe 2.

2. Nein, Sie können den TP der schwebenden Aufträge nicht sehen, wenn sie aktiviert wurden und nun nicht mehr schwebend sind. Der EA sollte den 23:00-Balken überprüfen und herausfinden, was die ursprünglichen TPs gewesen wären... und diese dann mit den TPs der 2 offenen Aufträge vergleichen ... anhand dieser Informationen kann die Entscheidung getroffen werden, ob sie geändert werden sollen oder nicht.

Ah, ich verstehe, ich glaube, das ist es, was ich die ganze Zeit zu tun versucht habe. Bis jetzt ist eine der Bestellungen geändert (speziell die Kaufbestellung, die in meinem Test die Bestellung 2 ist), aber sie wird immer wieder geändert, kann ich 'break' verwenden, um die Wiederholung zu stoppen? Wie zähle ich außerdem die offenen Aufträge und ändere sie nur, wenn zwei von ihnen offen sind? Ich habe versucht, OrdersTotal() dafür zu verwenden, aber das klappt nicht. Ich glaube nicht, dass ich für jede Order zwei separate Codeteile erstellen muss, oder?
Nur die geraden nummerierten offenen Aufträge werden geändert, und wie ich sagte, erhalten sie wiederholt geändert, ich habe versucht, verschiedene Kombinationen für OrderSelect(), aber ich kann immer noch nicht herausfinden, wie ich sagte, ich bin ein totaler Noob bei MQL und diese EA ist sehr fast fertig, so dass ich möchte nur es zu beenden. Ich habe diesehttps://book.mql4.com/trading/ordermodify gelesen würde dies etwas mit meiner Situation zu tun haben? Es ist für einen Stop-Loss, aber ich brauche es für einen Take-Profit im Wesentlichen.

Was mache ich hier falsch?

     for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    && (OrderType() == OP_BUY)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);}
    return(0);
    
  if (
        OrderSelect(iPos-1, SELECT_BY_POS-1)                    
    &&  OrderMagicNumber()  == MagicNumber                
    &&  OrderSymbol()       == "EURUSD"                
    && (OrderType() == OP_SELL)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);}
return(0);
  }

Wie würde ich überprüfen, ob der TP mit der 23:00-Kerze übereinstimmt? Wäre das überhaupt notwendig, denn solange die offenen Orders geändert werden, wenn 2 von ihnen da sind, würde das den gleichen Effekt erzielen? Oder geht es nur darum, zu verhindern, dass die Order ständig geändert wird, und ja, ich habe die Dokumentation gelesen.

Vielen Dank!

madmax3

 

Ihr return(0) führt Sie aus start() heraus, bevor der 2. Auftrag geändert wird.

Alles, was Sie tun, ist die Auswahl der Order nach Position, die Überprüfung, dass sie die richtige Magic-Nummer hat, die Überprüfung, dass es das richtige Symbol ist und die Überprüfung, dass es OP_BUY ist ... dann ändern Sie es, wo sind Sie bestimmen, ob es bereits geändert wurde oder nicht?

Ihr EA muss in der Lage sein, sich von einer Unterbrechung zu erholen ... wenn Ihre Aufträge platziert werden und MT4 abstürzt, muss er in der Lage sein, beim Neustart dort weiterzumachen, wo er aufgehört hat.

Deshalb müssen Sie feststellen, ob die Order bereits geändert wurde oder noch geändert werden muss ... wie?

"Ich habe zwei schwebende Orders zu einer bestimmten Zeit, nämlich 23:00 GMT+2, eingestellt. Eine der schwebenden Orders ist ein Verkaufsstopp und die andere ein Kaufstopp, beide Orders sind gleich weit von der Eröffnung der 23:00-Kerze entfernt, in diesem Fall 14 Pips. Beide haben einen TakeProfit von 28 Pips (in diesem Fall) und einen StopLoss von 55 Pips."

Sie können berechnen, wo der ursprüngliche TP war, indem Sie sich auf die 23:00-Kerze beziehen, die Order überprüfen und sehen, ob sie immer noch auf den ursprünglichen TP gesetzt ist, wenn ja, kann sie geändert werden ... wenn nicht, wurde sie bereits geändert, also ändern Sie sie nicht noch einmal.

Es gibt noch andere Möglichkeiten, um zu protokollieren, dass der Auftrag geändert wurde, z. B. die Ticketnummer zu notieren, die Informationen in eine Datei zu schreiben, wenn er geändert wurde, die Datei zu öffnen und nach der Ticketnummer zu suchen, wenn man ihn wieder ändern will usw. . Ich denke, dass die Überprüfung gegenüber der ursprünglichen TP viel einfacher ist.

 

Bis jetzt habe ich dies,

//+------------------------------------------------------------------+
//|                                                  TimeBasedEA.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
//changed by:       "forex4capital@yahoo.ca"
//changed again by: madmax3

// Time frame: M5 and higher

extern int     MagicNumber = 20080122;
extern double DistancefromAsk;
extern double DistancefromBid;
extern double  TakeProfit  = 28;
extern double  StopLoss    = 55;
extern double  Lots        = 0.1;
extern int     StartHour   = 2300;      // Open Trade time
extern bool    OpenBuy     = true;
extern bool    OpenSell    = true;
extern int     NumBuys     = 1;
extern int     NumSells    = 1;
extern int     Slippage    = 2;

//+------------------------------------------------------------------+
//|                        S T A R T                                 |
//+------------------------------------------------------------------+
int start()
  {
   int cnt, ticket, total;
      if (TimeDayOfWeek(TimeCurrent())==5 && TimeCurrent()>=StrToTime("22:59")) { CloseAll(); return(0); }
   int ct;
//-------------------------------------+
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
//-------------------------------------+

//-------------------------------------+
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
//-------------------------------------+

   ct = Hour() * 100 + Minute();
   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      if(ct == StartHour && Close[1]>Open[1] && OpenBuy)
      //if(ct == StartHour && High[1]<Open[0] && OpenBuy)
        {
         for ( cnt = 0; cnt < NumBuys; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromAsk*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromBid*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); 
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }

          
           else Print("Error opening BUY order : ",GetLastError()); 
           

         }
         return; 
        }
      // check for short position (SELL) possibility
      if(ct == StartHour && Close[1]<Open[1] && OpenSell)
      //if(ct == StartHour && Low[1]>Open[0] && OpenSell)
        {
         for ( cnt = 0; cnt < NumSells; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromAsk*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromBid*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
           else Print("Error opening SELL order : ",GetLastError());
         } 
         return; 
        
    
}
//---------------------------------------------------------------

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name="check.csv";        // File name
   
    Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening
   

         FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
          for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
      {       
       OrderSelect(iPos,SELECT_BY_POS) ;
       FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime())  //int
       
        ) ; //end file write
           }   }
           
}
//---------------------------------------------------------------   
 
     
     
  void CloseAll()
{
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderMagicNumber()!=MagicNumber) continue;
         
      //
      //
      //
      //
      //
         
      if (OrderType()==OP_BUY || OrderType()==OP_SELL)
      {
         for(int c=0; c<3; c++)
         {
            RefreshRates();
            if (OrderType()==OP_BUY)
                  { double cp = Bid;}  
            else  {        cp = Ask;}
               
            OrderClose(OrderTicket(),OrderLots(),cp,0,Yellow);
               int err=GetLastError();
               if(err==4 || err==136 || err==137 || err==138 || err==146)
               {
                  Sleep(5000); continue;
               }  
               break;                     
         }
         break;
      }
      }
      }
   
// the end.

Der Code zum Schreiben der Datei ist in der obigen Tabelle enthalten,

//---------------------------------------------------------------

 int Handle,                         // File descriptor
   Qnt_Symb;                           // Number of recorded symbols
   string File_Name="check.csv";        // File name
   
    Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening
   

         FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
          for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
      {       
       OrderSelect(iPos,SELECT_BY_POS) ;
       FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime())  //int
       
        ) ; //end file write
          	 FileClose(Handle); }   }
           
}
//---------------------------------------------------------------   

Ich erhalte jedoch diese Fehler,

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA Version 2: FileOpen - zu viele geöffnete Dateien

2012.04.04 15:30:06 2012.01.16 06:25 TimeBasedEA Version 2: Ungültiges Handle -1 in FileWrite

Was ist da los?

 

Warum in aller Welt haben Sie die schwierigste der beiden Optionen gewählt?

Wenn Sie mit dem Schreiben in die Datei fertig sind, müssen Sie sie schließen ... wenn sie bereits geöffnet ist, brauchen Sie sie nicht erneut zu öffnen.

//---------------------------------------------------------------

int Handle,                         // File descriptor
    Qnt_Symb;                           // Number of recorded symbols
string File_Name="check.csv";        // File name
   
Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE|FILE_READ,";");//File opening    File opened here, outside the loop
   

FileWrite(Handle,"Ticket","Magic","OTime","Type","Lots","Symbol","OPrice","S/L","T/P"); 
         
for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--)
   {       
   OrderSelect(iPos,SELECT_BY_POS);
   FileWrite(
         Handle,
         OrderTicket(),                //int
         OrderMagicNumber(),           //int
         TimeToStr(OrderOpenTime()),   //datetime   //  this is a string - Time  to  String
         
         OrderLots(),                  //double
         OrderSymbol(),                //string
         OrderOpenPrice(),             //double
         OrderStopLoss(),              //double
         OrderTakeProfit(),            //double
         TimeToStr(OrderCloseTime() )  //int     //  this is a string - Time  to  String
       
        ) ; //end file write

   FileClose(Handle);      //  why close the file inside the loop when it was opened outside the loop ?
   }   
}    //  what is this code inside of ?
           
}  // end of start
//--------------------------------------------------------------- 

Ihre for-Schleife ist falsch ... die letzte Auftragsposition ist 0 und nicht 1.

 
RaptorUK:

Warum in aller Welt haben Sie sich für die schwierigste der beiden Optionen entschieden?

Ist das nicht der Weg, die Änderung und die Überprüfung mit Hilfe der Datei durchzuführen? Oder muss ich beide Codes kombinieren, die Änderung (mein Beitrag vor dem letzten) und den Dateicode (der nur dazu dient, sicherzustellen, dass keine weiteren Änderungen vorgenommen werden)?
Grund der Beschwerde: