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

 
kwng111:


Sorry kwng dein Posting sieht für mich nicht nach der Lösung für madmax3 aus

Sie müssen die Trades nicht in einer Funktion( ) namens void CloseAll() ändern.
Außerdem müssen Sie dort OrderSymbol ( ) und OrderMagicNumber( ) auswählen.

und in diesem Teil des Programms

        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

Pendingtrades werden immer noch geändert

 

Hier ist der überarbeitete Code für den gesamten EA:

//+------------------------------------------------------------------+
//|                                                  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; 
        
    
}

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


   return(0);
  }
  
  
  
  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.

Die CloseAll()-Funktion ist dazu da, die Trades zu einem bestimmten Zeitpunkt zu schließen, wenn sie so lange andauern.

Dieser Teil des Codes ist der überarbeitete Teil dessen, was ich versuche, herauszufinden:
(wie Sie sehen können, sind die MagicNumber und das Symbol vorhanden, aber nur die schwebenden Aufträge werden noch geändert)

     for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}
 
deVries:
        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
int total=OrdersTotal();
 if(total>1)

Gestern wurde Ihnen gesagt, dass die Auswahl nicht funktionieren wird. Und dass Sie die Rückgabecodes und die Gesamtanzahl der Codes testen müssen.

Wenn Sie sich nicht die Mühe machen, die Beiträge zu lesen und Ihren Code zu korrigieren, werden wir uns auch nicht die Mühe machen, Ihnen zu helfen.

 
WHRoeder:

Gestern wurde Ihnen gesagt, dass die Auswahl nicht funktionieren wird. Und dass Sie die Rückgabewerte und die Gesamtsumme testen müssen.

Wenn Sie sich nicht die Mühe machen, die Beiträge zu lesen und Ihren Code zu korrigieren, werden wir uns auch nicht die Mühe machen, Ihnen zu helfen.


Ich habe beides getan, Sie beziehen sich auf die falsche Person, denke ich. Ich bin der ursprüngliche Poster, nicht deVries, und ich habe den Code in diesen geändert (wie zuvor gepostet):

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

Das Problem besteht nun darin, dass er schwebende Aufträge ändert, während ich möchte, dass er nur offene Aufträge ändert, und zwar nur dann, wenn zwei offene Aufträge desselben Symbols gleichzeitig offen sind und ausgeführt werden. Ich habe verschiedene Zahlenkombinationen und OrderSelect-Nummern ausprobiert, aber ich bin immer noch ratlos.

 
madmax3:


Ich habe beides getan, Sie beziehen sich auf die falsche Person, denke ich. Ich bin der ursprüngliche Poster, nicht deVries, und ich habe den Code in den folgenden geändert (wie zuvor gepostet):

Das Problem besteht nun darin, dass er schwebende Aufträge ändert, während ich möchte, dass er nur offene Aufträge ändert, und zwar nur dann, wenn zwei offene Aufträge desselben Symbols gleichzeitig offen sind und ausgeführt werden. Ich habe verschiedene Zahlenkombinationen und OrderSelect-Nummern ausprobiert, aber ich bin immer noch ratlos.

Sie müssen also Ihre offenen Orders in einer Schleife durchgehen, das Symbol und die MagicNumber prüfen, wie Sie es oben getan haben ... aber Sie müssen auch auf OrderType() <=OP_SELL prüfen ... die übereinstimmenden Orders zählen, wenn es 2 sind ... dann wieder eine Schleife und OrderModify().

Der einzige Weg, wie Sie das lernen können, ist, die Dokumentation über jede Funktion zu lesen und zu verstehen, wie sie funktionieren ... z.B. OrderType()

 

Ich habe verschiedene Codes ausprobiert, aber ich bekomme es nicht hin, genau zu funktionieren. Er ändert eines der offenen Geschäfte, wenn zwei offen sind, und er ändert es immer wieder. Ich muss es nur einmal ändern, und ich muss beide Geschäfte ändern.

     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_SELL)
    
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    
   if (OrderSelect(iPos, SELECT_BY_POS))
    if (OrderType() <= OP_BUY)
      if (!OrderSelect(iPos, SELECT_BY_POS))
      {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);}
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}


   return(0);
  }
     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_SELL)
    && (OrderType() <=OP_BUY)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);}
    
   if  (OrderSelect(iPos-1, SELECT_BY_POS))
    {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);



   return(0);
  }}

Haben Sie einen Vorschlag, was ich tun sollte? Ich habe übrigens die Dokumentation durchgelesen.

 
Was ist der Unterschied zwischen dem Auftrag vor und nach der Änderung? Was ändert sich?
 

Zuerst werden zwei Orders gesetzt, dann wird eine von ihnen (in diesem Fall ein Verkauf, als ich das spezifische Datum getestet habe) ausgeführt. Später am Tag wird die zweite Order (die immer noch vorhanden ist) ausgeführt, und dieser Handel ist ein Kauf.
Der Verkauf ist Auftrag 1 und der Kauf ist Auftrag 2. Beim Kauf (Auftrag 2) wird der TakeProfit um 16,3 Pips geändert (ich bin mir nicht sicher, warum er nicht um 20 Pips erhöht wird), dann wird der TakeProfit in derselben Minute um 0,2 Pips erhöht, und das passiert immer wieder, der TakeProfit wird den ganzen Tag über kontinuierlich geändert, manchmal erhöht, manchmal verringert, ich bin mir nicht sicher, warum das passiert.

Edit: Ich denke, die 16,3 Pips und weitere Änderungen werden auch durch den Spread beeinflusst?

 
OK, können wir zum Anfang zurückkehren.... Ich weiß, dass Sie versuchen, zwei Aufträge zu ändern... aber was genau versuchen Sie zu tun? SL beschatten? etwas anderes? was versuchen Sie zu erreichen?
 
madmax3 2012.03.09 15:06
WHRoeder:

Dir wurde gestern gesagt, dass die Auswahl nicht funktionieren wird. Und dass du Returncodes testen musst und über total

Wenn du dir nicht die Mühe machst, die Beiträge zu lesen und deinen Code zu korrigieren, werden wir uns auch nicht die Mühe machen, dir zu helfen.


Ich habe beides getan, Sie meinen wohl die falsche Person.

Ich bezog mich auf deinen direkt vorhergehenden Beitrag.

madmax3 2012.03.09 14:52
Hier ist der überarbeitete Code für den gesamten EA:
   total=OrdersTotal();
   if(total<1) 
Der immer noch die von mir genannten Probleme aufweist .
Grund der Beschwerde: