OrderClose funktioniert nicht - Seite 2

 
chuale:

Hallo zusammen,


Jetzt füge ich Ticket und Lots in die OrderClose ein, ohne OrderTicket() und OrderLots() zu verwenden, aber es schließt die Bestellung nicht auch. Bitte helfen Sie.



Es gibt ein paar Dinge, die Sie falsch gemacht haben. Ich nehme an, Sie möchten, dass dieser EA auf JPY-Paaren auf dem M1-Zeitrahmen arbeitet. Möchten Sie Orders nur auf einem neuen Balken platzieren und Orders nur auf einem neuen Balken schließen oder möchten Sie einen Einstieg auf einem neuen Balken und einen Ausstieg, wenn die Bedingungen erfüllt sind? Ich habe folgende Überlegungen:

Zuerst zählen Sie die Aufträge mit OrdersTotal().

Dann berechnen Sie Ihre Variablen

Wenn es Aufträge im Markt gibt, prüfen Sie, ob sie geschlossen werden müssen.

Wenn keine Aufträge auf dem Markt sind, prüfen Sie, ob die Einstiegsbedingungen erfüllt sind.

Lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben.

//+------------------------------------------------------------------+
//|                                                 chuale_test1.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.abc.com"
#property version   "1.00"
#property strict

extern double   TakeProfit=500;
extern double   Lots=0.1;
extern double   StopLoss=300;

double     bar1;
double     bar2;
double     bar3;
int        total,ticket;
datetime   previousTime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   total=OrdersTotal();
/*
  counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
  IndicatorCounted() is actually for indicators not EA
  
   */

   bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
   bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
   bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;
   /*
   Comment("Bar1 = "+DoubleToString(bar1,Digits)+"\n"+
           "Bar2 = "+DoubleToString(bar2,Digits)+"\n"+
           "Bar3 = "+DoubleToString(bar3,Digits)+"\n"
           );
   */
//Close any orders if conditions are met
   if(total>0)
     {
      if(bar3<-1) OrderClose(ticket,OrderLots(),Bid,3,Green);
      if(bar3>1) OrderClose(ticket,OrderLots(),Ask,3,Red);
     }
   if(Time[0]==previousTime) return(0);         //EA will not go past this point unless it is a new bar
   previousTime=Time[0];                        // If it was a new bar , it's old now but continue to the end
// if no order open and new bar
   if(total<1)
     {
      if(bar2>1)// if condition met
        {
         //place buy order
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",12345,0,Green);
         if(ticket<0)Print("Error OP_BUY order failed. error : "+GetLastError()); // if returned ticket is -1 OrderSent failed
         return(0);
        }
      // or if conditions for sell met
      if(bar2<-1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",12345,0,Red);
         if(ticket<0)Print("Error OP_SELL order failed. error : "+GetLastError());
         return(0); //return to start
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
Dateien:
 
GumRai:


Das Ticket ist eine lokale Variable, so dass es beim nächsten Tick nicht mehr denselben Wert haben wird.

Außerhalb der Funktionen platzieren , um es zu einem Globalscope zu machen

 
   total=OrdersTotal();

?????? ..... nutzlos

Prüfen Sie genau, welche Gewerke Sie haben

Suche nach dem richtigen Symbol und der richtigen magischen Zahl

mit einer Orderschleife können Sie dann das richtige Geschäft auswählen, um es mit

OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Green);

.

mit Ihrer Methode

verlieren Sie den Ticketwert, sobald Sie Ihren PC neu starten.

   if(total>0)
     {
      if(bar3<-1) OrderClose(ticket,OrderLots(),Bid,3,Green);
      if(bar3>1) OrderClose(ticket,OrderLots(),Ask,3,Red);
     }

scheitert .....

 
chuale:

Warum haben Sie meinen Beitrag zitiert und dann keinen Kommentar hinzugefügt?
 
Ja, es kann jetzt geschlossen werden. Danke GumRai. Jetzt weiß ich, dass sich die Ticketnummer entsprechend den Ticks ändert, also wie erhalte ich die Ticketnummer des offenen Auftrags? I have to.use OrderTicket() right?
 
chuale:
Ja, es kann jetzt geschlossen werden. Danke GumRai. Jetzt weiß ich, dass sich die Ticketnummer entsprechend den Ticks ändert, also wie erhalte ich die Ticketnummer des offenen Auftrags? Ich muss OrderTicket() verwenden, richtig?

Wenn Sie OrderTicket() verwenden, dann stellen Sie sicher, dass Sie zuerst OrderSelect() verwenden und auch sicherstellen, dass es der Handel ist, den Sie schließen möchten.
 
chuale:
Ja, es kann jetzt geschlossen werden. Danke GumRai. Jetzt weiß ich, dass sich die Ticketnummer entsprechend der Ticks ändert, wie kann ich also die Ticketnummer der offenen Order erhalten? Ich muss OrderTicket() verwenden, richtig?


Hallo Chuale,

Hier ist ein einfacher Weg, um Ihre Aufträge auszuwählen und Aufträge nach Symbol und nach Magic-Nummer zu schließen:

//+------------------------------------------------------------------+
//|                                                 chuale_test1.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.abc.com"
#property version   "1.00"
#property strict

extern double   TakeProfit=500;
extern double   Lots=0.1;
extern double   StopLoss=300;
extern int      MagicNumber = 12345;
extern int      Slip  = 3;
double     bar1;
double     bar2;
double     bar3;
int        myTrades,ticket;
datetime   previousTime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

//---

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   myTrades = CountTrades();//Count trades function counts this EA trades only
//
   bar1=(iClose(Symbol(),PERIOD_M1,2)-iClose(Symbol(),PERIOD_M1,3))*100;
   bar2=(iClose(Symbol(),PERIOD_M1,1)-iClose(Symbol(),PERIOD_M1,2))*100;
   bar3=(iClose(Symbol(),PERIOD_M1,0)-iClose(Symbol(),PERIOD_M1,1))*100;

//Close any orders if conditions are met
   if(myTrades>0)
     {
      if(bar3<-1) CloseThisSymbolAll();
      if(bar3>1) CloseThisSymbolAll();
     }
   if(Time[0]==previousTime) return(0);         //EA will not go past this point unless it is a new bar
   previousTime=Time[0];                        // If it was a new bar , it's old now but continue to the end
// if no order open and new bar
   if(myTrades<1)
     {
      if(bar2>1)// if condition met
        {
         //place buy order
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"Chua EA",MagicNumber,0,Green);
         if(ticket<0)Print("Error OP_BUY order failed. error : "+GetLastError()); // if returned ticket is -1 OrderSent failed
         return(0);
        }
      // or if conditions for sell met
      if(bar2<-1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid+-TakeProfit*Point,"Chua EA",MagicNumber,0,Red);
         if(ticket<0)Print("Error OP_SELL order failed. error : "+GetLastError());
         return(0); //return to start
        }
     }
   return(0);
  }
//========================================================================
int CountTrades()
{
int count=0;
int trade;
for(trade=OrdersTotal()-1;trade>=0;trade--)
   {
   OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
   if(OrderSymbol()!=Symbol() || OrderMagicNumber() != MagicNumber)
   continue;
   if(OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber)
   if(OrderType()==OP_SELL || OrderType()==OP_BUY)
   count++;
   }
return(count);
}
//========================================================================
void CloseThisSymbolAll()
  {
   int trade;
   for(trade=OrdersTotal();trade>=0;trade--)
     {
      OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()!=Symbol()) continue;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
        {
         if(OrderType()==OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Blue);
         if(OrderType()==OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);
        }
      //Sleep(1000);
     }
  }
//========================================================================
 
chuale:
Ja, es kann jetzt schließen. Danke GumRai. Jetzt weiß ich, dass sich die Ticketnummer je nach Tick ändert, wie kann ich also die Ticketnummer der offenen Order erhalten? Ich muss OrderTicket() verwenden, richtig?


Hallo nochmals Chuale,

Ich habe mit Ihrer Idee für USDJPY herumgespielt und konnte ohne einige Änderungen keine positiven Ergebnisse erzielen, hier ein Beispiel meiner Ergebnisse für USDJPY auf dem M1-Chart:

USDJPY auf M1

Hatten Sie vor, es auf ein anderes Paar anzuwenden?

Der Ausstieg bei bar3 < -1 oder bar3 > 1 hat keine positiven Ergebnisse gebracht.

 
deVries:

?????? ..... nutzlos

Prüfen Sie genau, welche Gewerke Sie haben

Suche nach dem richtigen Symbol und der richtigen magischen Zahl

mit einer Orderschleife können Sie dann das richtige Geschäft auswählen, um es mit

.

mit Ihrer Methode

verlieren Sie den Ticketwert, sobald Sie Ihren PC neu starten.

scheitert .....


Wenn Sie meinen, dass es nicht der beste Weg ist, einen Auftrag zu schließen, stimme ich zu, aber wenn der Kunde OrderSelect nicht verwenden möchte (oder nicht weiß, wie) und keine offenen Aufträge auf dem Markt lässt, funktioniert es.

Wir versuchen uns hier gegenseitig zu helfen und deine Antwort hat kein bisschen geholfen, du hast ihm nicht gezeigt, wie man die Order Select Funktion benutzt und sein EA funktioniert jetzt nicht besser aufgrund deines Kommentars.

Wenn Sie das nächste Mal helfen wollen, machen Sie es richtig, stellen Sie den richtigen Code ein, damit andere tatsächlich etwas lernen können.

 
thrdel:


Es gibt einige Dinge, die Sie falsch gemacht haben. Ich nehme an, Sie möchten, dass dieser EA auf JPY-Paaren im M1-Zeitrahmen arbeitet. Wollen Sie Orders nur auf einem neuen Balken platzieren und Orders nur auf einem neuen Balken schließen oder wollen Sie den Einstieg auf einem neuen Balken und den Ausstieg, wenn die Bedingungen erfüllt sind? Hier ist, was ich denke:

Zuerst zählen Sie die Bestellungen mit OrdersTotal().

Dann berechnen Sie Ihre Variablen

Wenn es Aufträge auf dem Markt gibt, prüfen Sie, ob sie geschlossen werden müssen.

Wenn keine Aufträge auf dem Markt sind, prüfen Sie, ob die Einstiegsbedingungen erfüllt sind.

Lassen Sie es mich wissen, wenn Sie noch Fragen haben.