Kontrolle Kerze offen

 

Hallo Leute,

Ich bin ziemlich neu in der Programmierung in mql4 und habe wirklich versucht, meinen ersten EA zum Laufen zu bringen. Ich würde ehrlich gesagt zu schätzen wissen Hilfe mit dem folgenden. Es ist nur eine grundlegende Cross-over so-to-speak, aber anstelle von gleitenden Durchschnitten überqueren, es ist nur Preis über einen gleitenden Durchschnitt überqueren.

Ich brauche eine Order, die bei Candle Open ausgelöst wird, wenn: (Aktueller Kerzeneröffnungskurs ist > als der gleitende Durchschnitt) und wenn (die vorherige Kerze unterhalb des gleitenden Durchschnitts geschlossen hat).

Bisher habe ich den folgenden Code im Hauptbereich:


//+------------------------------------------------------------------+

int start()

{

//---

double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,1);

double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0);

double PreviousFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,1);

double CurrentFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,0);

double PreviousPriceClose= iClose(NULL, 0, 1);

double CurrentCandleOpen= iOpen(NULL,0,0);

//----------------------Hauptberechnung beginnt hier


if(PreviousPriceClose<PreviousSlow && (CurrentCandleOpen>(CurrentSlow)))

if(OrdersTotal () == 0)

BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,CurrentCandleOpen, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0,clrLimeGreen);

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

return(0);

return(0);

}

//+------------------------------------------------------------------+

Was auch immer ich tue, es scheint nicht zu funktionieren, und ich glaube nicht, dass ich hier etwas richtig mache. Nochmals: Ich wäre Ihnen für Ihre Hilfe sehr dankbar!

 
    

  double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0);   

Dieser Wert ändert sich, während die Kerze aktuell ist

double CurrentCandleOpen= iOpen(NULL,0,0);

Dieser Wert ist nicht

BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,CurrentCandleOpen, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0,clrLimeGreen);

Es istunwahrscheinlich, dass CurrentCandleOpen für viele Ticks ein gültiger Einstiegskurs ist.

Wenn Sie diese Logik verwenden müssen, rechnen Sie nur einmal, wenn ein neuer Balken geöffnet wird.

Prüfen Sie die Rückgabewerte, wenn der OrderSend fehlschlägt

 
GumRai:

Dieser Wert ändert sich, während die Kerze aktuell ist

Dieser Wert ist nicht

Es istunwahrscheinlich, dass CurrentCandleOpen für viele Ticks ein gültiger Einstiegskurs ist.

Wenn Sie diese Logik verwenden müssen, rechnen Sie nur einmal, wenn ein neuer Balken geöffnet wird.

Überprüfen Sie die Rückgabewerte, wenn der OrderSend fehlschlägt


Vielen Dank für die schnelle Antwort! Lassen Sie mich sehen, ob ich das richtig verstanden habe:

  1. Der CurrentSlow wird nicht wirklich funktionieren, weil er sich noch bildet. Okay, das ist in Ordnung, ich kann den Wert des gleitenden Durchschnitts verwenden, der sich für die vorherige Kerze gebildet hat. Das sollte kein Problem sein.
  2. Da CurrentCandleOpen kein gleitender Wert ist... nehme ich an, dass dieser Teil des Codes korrekt ist?
  3. Wie kann ich es so einrichten, dass es nahe genug am CandleOpen liegt? Sie haben erwähnt, dass nur einmal berechnet werden soll, wenn ein neuer Balken eröffnet wird. Könnten Sie das bitte näher erläutern? Ich weiß nicht genau, wie ich das machen soll.
Nochmals vielen Dank GumRai.

 
   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      //Code to process the signal
     }

   
Der Code innerhalb der geschweiften Klammern wird nur beim ersten Tick eines neuen Balkens ausgeführt
 
GumRai:
Der Code in den geschweiften Klammern wird nur beim ersten Tick eines neuen Balkens ausgeführt

Vielen Dank für den Code! Ich habe das Folgende wie zuvor besprochen aktualisiert:

  1. MA's current slow wurde in Previous Slow geändert.
  2. Entfernt CurrentCandleOpen mit Ask. Immer wenn ich CurrentCandleOpen anstelle von Ask verwendet habe, wurden keine Trades durchgeführt. Als ich jedoch Ask anstelle von CurrentCandleOpen einsetzte, funktionierte es, aber natürlich wurde immer dann gehandelt, wenn Ask den MA überschritt, und nicht bei Candle Open.

Aber danach, wenn ich den Code wie folgt in Ihren Code einfüge, werden keine Geschäfte mehr getätigt. Habe ich das richtig eingefügt?

int start()
  {
//---
    
  double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,1);     //1 at the end signifies that we want it on candle close
  double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0);     //1 at the end signifies that we want it on candle close

  double PreviousFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,1);     //1 at the end signifies that we want it on candle close
  double CurrentFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,0);     //1 at the end signifies that we want it on candle close
   
  double PreviousPriceClose= iClose(NULL, 0, 1);
  double CurrentPriceClose= iOpen(NULL, 0, 0);
  
//----------------------Main calculation starts here

 static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
   if(PreviousPriceClose<PreviousSlow && Ask>PreviousSlow)
      if(OrdersTotal () == 0)
         BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,Ask, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0,clrLimeGreen);
   }
//--------------
   return(0);
   return(0);
  }
 

Warum werden die iMA-Aufrufe außerhalb des neuen Strichcodes platziert? Das bedeutet, dass sie jeden Tick aufgerufen werden, wenn sie nicht benötigt werden - ineffizient.

   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo,1);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      if(PreviousPriceClose<PreviousSlow && Bid>PreviousSlow)
         if(OrdersTotal()==0)
            {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen);
            if(BuyTicket==-1)
               {
               //Error checking code
               }
     }

Verwenden Sie Ask nicht, um Werte in einem MT4-Chart zu vergleichen, sie basieren auf dem Bid-Preis.

Prüfen Sie auf Fehler, wenn der OrderSend fehlschlägt.

Es gibt nicht viele Fälle, in denen der erste Tick eines neuen Balkens über einem MA liegt, wenn der letzte Tick des vorherigen Balkens unter diesem lag.

 

Vielen Dank, GumRai. Ich schätze die Hilfe wirklich sehr.

Ihr Code funktioniert wie ein Charme. Ich bin immer noch versuchen, die Seile hier zu lernen, und sah die iMA auf seine eigene wie das separat gesetzt werden. Wird Ihre Methode stattdessen folgen.

***smacks self on the head***

Ich werde meinen Code überarbeiten. Deine letzte Zeile hat den Fehler in dem, was ich wollte und was ich tatsächlich codiert habe, aufgezeigt.

Was ich eigentlich tun muss, ist:

  • Schritt 1: Kerze schließt unter MA,
  • Schritt 2: Kerze kreuzt und schließt über MA
  • Schritt 3: Handel bei neuer offener Kerze eingeben.

Letzte Frage, und ich denke, ich habe es...

für den obigen Schritt 1, den iMA, wäre die SlowMaShift 2 korrekt? Da es 2 Bars hinter? und die iClose würde sein: iClose(NULL,0,2) für diesen Vergleich richtig?

 

Es scheint, dass Sie die Idee haben.

Ändern und posten Sie Ihren Code und ich oder jemand anderes wird ihn kommentieren

 
GumRai:

Es scheint, dass Sie die Idee haben.

Ändern und posten Sie Ihren Code und ich oder jemand anderes wird ihn kommentieren

Ich habe es geschafft, dass es funktioniert! Danke GumRai.
Jetzt mache ich das Gleiche, aber mit den umgekehrten Regeln, um den Short zu nehmen. Unabhängig davon, dass funktioniert gut, aber ich weiß nicht, wie man die OrderCloseBy-Funktion zu verwenden, so dass, wenn die lange offen ist, und die kurze löst, schließt es die lange in erster Linie, weil ich keine Ahnung, wie man die Bestellung Ticket zu finden... Ich habe versucht, die OrderCloseBy zu umgehen, indem ich das Folgende tue:

int start()
  {
//---
 static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo,1);
      double PreviousSlow2 = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      double PreviousPriceClose2=iClose(NULL, 0,2);
      if(PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips))
         if(OrdersTotal()==0)
            {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen);
      if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow)
         if(OrdersTotal()==1)
         {
            OrderClose(BuyTicket,LotSize,Ask,Slippage,clrPink) && OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue);
                  }
         if(OrdersTotal()==0)
         {
            OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue);
            }
     }
//--------------
   return(0);
   return(0);
  }
  return(0);
  }
 
      if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow)
         if(OrdersTotal()==1)

kann nicht erfüllt werden, da es sich innerhalb des Bedingungsblocks befindet

         if(OrdersTotal()==0)

   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
      double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      double PreviousPriceClose2=iClose(NULL,0,2);
      if(PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips))
        {
         if(OrdersTotal()==0)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen);
        }
      else
      if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow)
        {
         if(OrdersTotal()==1)
           {
            OrderClose(BuyTicket,LotSize,Ask,Slippage,clrPink);
            OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue);
           }
         else
         if(OrdersTotal()==0)
           {
            OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue);
           }
        }
     }

Ich denke, dass die obige Formulierung eher Ihrer Absicht entspricht

Sie sollten die Fehlerrückgabecodes überprüfen

 
GumRai:

Ich denke, dass die obigen Angaben eher dem entsprechen, was Sie beabsichtigen

Sie sollten die Fehlerrückgabecodes überprüfen

Danke für den Code...leider hat er nicht wirklich funktioniert, da er jetzt mehr als einmal einen Short eingeht. Hier ist, was ich versucht habe, stattdessen zu tun - ich bin brechen es separat - lange Eintrag und Ausstieg, und dann werde ich das Gegenteil für kurze Eintrag und Ausstieg erstellen. Das ist für mich überschaubarer und etwas einfacher zu optimieren. Ich arbeite daran, zuerst nur den langen Ein- und Ausstiegsbereich zu erstellen. Aber irgendwie ist dies nicht schließen Trades, wenn die Kerze schließt unter dem Gleitenden Durchschnitt für die kurze. Irgendeine Idee, was ich falsch mache? Es gibt einen Fehler: Der Rückgabewert von 'OrderClose' sollte überprüft werden. Ich habe den ganzen Morgen nach einer Lösung gegoogelt, aber es scheint nicht zu funktionieren.

   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
      double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      double PreviousPriceClose2=iClose(NULL,0,2);
      if(PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips))
        {
         if(OrdersTotal()==0)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen);
        }
      else
      if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow && Bid<PreviousSlow)
        {
          OrderClose(BuyTicket,LotSize,Ask,Slippage,clrPink);
          
        }
     

Update: Ich bin den Fehlercode losgeworden, aber das Ticket schließen scheint immer noch nicht zu funktionieren. Alles, was ich will, ist, dass der Kauf geschlossen wird, sobald die Kerze über und unter dem MA schließt.

Grund der Beschwerde: