Kontrolle Kerze offen - Seite 3

 
  1. Der Code wurde vor Build 600 geschrieben. Seit Februar 2014 können keine Punkte in Variablennamen verwendet werden. Einfach durch Unterstriche ersetzen.
  2. Hier ist ein Beispiel für richtungsunabhängigen Code
    double DIR, OOP, OCP, ISL;  int OP;
    
    if(     Bid > High[1]){
       DIR = +1; OOP = Ask; OCP = Bid; OP = OP_BUY;
    }
    else if(Bid <  Low[1]){
       DIR = -1; OOP = Bid; OCP = Ask; OP = OP_BUY;
    }
    else return;
    
    ISL = OCP -DIR* pips_to_change( extISL_Pips );
    ... OrderSend(...);
    Sie tauschen einfach Ask/Bid gegen Open/Close-Preise aus und schreiben alles andere so, als wäre es ein Kauf: ISL liegt unter OCP (OCP - ISL) und das -DIR* ändert das Vorzeichen für einen Verkauf.
    Wenn Sie einen Vergleich benötigen (A > B), verwenden Sie (A - B) *DIR> 0, um den Vergleich für einen Verkauf umzukehren.
 
GumRai:

Es scheint, dass Sie die Idee haben.

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

Hallo GumRai,

Es ist schon eine Weile her, dass ich hier ein Update gepostet habe, aber ich habe an dem Code gearbeitet und ihn endlich fertiggestellt - schmerzhaft, wenn man 10 Stunden am Tag arbeitet. Ich habe jedoch zwei Hauptprobleme. 1) Egal was ich tue, es erzeugt einen Fehlercode: "Unbekanntes Ticket XYZ für OrderCloseFunction" und 2) Ich habe die Datei gespeichert (eine USDCAD, eine andere EURUSD), mit verschiedenen Magicnumbers usw., aber es wird immer noch nur ein Trade zu einem bestimmten Zeitpunkt ausgeführt - und die Paare werden nicht unabhängig voneinander behandelt. In der Tat, es erstellt dann ein "ungültiges Ticket für OrderCloseFunction" Fehler als gut.

Ich habe versucht, dies zu googeln, aber ohne Erfolg. Ich wäre Ihnen sehr dankbar, wenn Sie mir in dieser Angelegenheit den richtigen Weg weisen könnten. Was mache ich falsch?

#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

//part with the extern int stating the terms of the MA removed to reduce space.

int MagicNumber = 1234;
int MagicNumber2 = 2345;
double Pips;
int BuyTicket;
int SellTicket;
int CloseTicket;
int CloseSellTicket;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   double Ticksize = MarketInfo(Symbol(), MODE_TICKSIZE);
   if (Ticksize == 0.00001 || Ticksize == 0.001)
   Pips = Ticksize*10;
   else Pips = Ticksize;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
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);
      double PreviousPriceClose2=iClose(NULL,0,2);
      if((iOpen(NULL,0,1)<PreviousSlow && 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",MagicNumber,0,clrLimeGreen);
        }
        
      else
      for(int i = OrdersTotal()-1; i >= 0; i--) 
         {
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(iClose(NULL, 0,0)<PreviousSlow)
        {
          CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
         }
         }
      if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if(OrdersTotal()==0)
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
        }
      else
      for(i = OrdersTotal()-1; i >= 0; i--) 
         {
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if(iClose(NULL, 0,1)>PreviousSlow)
        {
          CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              }
     }
     }
    return(0);
    return(0); 
    }
//--------------

  

Vielen Dank im Voraus!

 

Verwenden Sie niemals OrdersTotal()==0 als Bedingung für die Eröffnung von Trades.

Das bedeutet, dass, wenn ein Handel manuell oder durch einen anderen EA oder denselben EA, der an ein anderes Chart-Symbol angehängt ist, geöffnet wurde, nur 1 Handel geöffnet werden kann.

Sie haben eine globale Variable BuyTicket, initialisieren Sie diese auf -1

int BuyTicket=-1;

      if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(BuyTicket==-1)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),
                                "Main Entry EA",MagicNumber,0,clrLimeGreen);
        }

Führen Sie vor dem Schließen keine Schleife durch die Aufträge, das ist unnötig.

else
if(OrderSelect(BuyTicket,SELECT_BY_TICKET))
  {
   if(OrderCloseTime()==0)
     {
      if(Close[0]<PreviousSlow)
        {
         bool  CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
         if(CloseTicket)
            BuyTicket=-1;
        }
     }
   else
      BuyTicket=-1;  //Order has closed so reset variable
  }

Bei der Verwendung von global deklarierten Variablen für Ticketnummern kann es zu Problemen kommen, wenn das Terminal aus irgendeinem Grund heruntergefahren und neu gestartet wird

Deklarieren Sie also eine neue Variable für den globalen Bereich

 bool Recovery=true;

  
  if(Recovery)
     {
     //loop through open orders and check for magic number, symbol and type
     //if you find a buy order with the magic number and symbol
     BuyTicket=OrderTicket();
     //if you find a sell order with the magic number and symbol
     SellTicket=OrderTicket();
     Recovery=false;
     }

Ich habe das schnell getippt, daher kann es sein, dass ich Fehler gemacht habe, aber es reicht, um Ihnen die Idee zu vermitteln

 
GumRai:


Der Grund, warum ich die Schleife in dort war, weil was ich bemerkt war, dass, wenn es den Verkauf geschlossen, würde es nicht den Kauf aus irgendeinem Grund auslösen.

Ich habe vorwärts gegangen und machte die notwendigen Änderungen ... aber etwas scheint immer noch nicht in Ordnung. Es werden keine Long-Trades mehr ausgeführt, und es wird ein Fehlercode für ein ungültiges Ticket und der OrderClose-Fehler 4051 generiert. Irgendwelche Vorschläge, was hier noch falsch ist?

Der seltsame Teil ist, dass sowohl in den vorherigen Code, und die aktuelle (nur für den Verkauf), nahm es die Trades einigermaßen okay (wenn ich es nur auf einem Chart implementiert).

Ich hätte nicht gedacht, dass das so schwer sein würde, haha! Ich nehme an, ich war falsch, wenn ich dachte, es war eine sehr einfache und geradlinige Sache ... kaufen, wenn Kerze kreuzt und öffnet über MA, schließen und verkaufen, wenn Kerze kreuzt und geht unter MA.


if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(BuyTicket==-1)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
        }
        
      else
      if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
      {
      if(OrderCloseTime()==0)
      {
       if(Close[0]<PreviousSlow)
        {
          bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
          if(CloseTicket)
            BuyTicket=-1;
            }
         }
         else
            BuyTicket= -1;
            }
            
      if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if(SellTicket==-1)
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
        }
      else
       if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
       {
         if(Close[0]>PreviousSlow)
        {
        bool  CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              if(CloseSellTicket)
                  SellTicket=-1;
                     }
         }
         else
            SellTicket= -1;
            }
            
    return(0);
    return(0); 
    }
 

Es tut mir leid, aber ich weiß wirklich nicht, was Sie zu tun versuchen

if(OrderSelect(SELECT_BY_POS,MODE_TRADES))

Es wird keine Reihenfolge ausgewählt. Lässt sich der Code überhaupt kompilieren?

      if(OrderCloseTime()==0)
      {
       if(Close[0]<PreviousSlow)
        {
          bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
          if(CloseTicket)
            BuyTicket=-1;
            }
         }
         else
            BuyTicket= -1;

Hier gilt das else, wenn(OrderCloseTime()==0) falsch ist

       if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
       {
         if(Close[0]>PreviousSlow)
        {
        bool  CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              if(CloseSellTicket)
                  SellTicket=-1;
                     }
         }
         else
            SellTicket= -1;

Hier gilt es, wenn der OrderSelect fehlschlägt, was sicherlich der Fall ist.

 
GumRai:

Es tut mir leid, aber ich weiß wirklich nicht, was Sie zu tun versuchen

Es wird keine Reihenfolge ausgewählt. Lässt sich der Code überhaupt kompilieren?

Hier gilt das else, wenn(OrderCloseTime()==0) falsch ist

Hier gilt es, wenn der OrderSelect fehlschlägt, was sicherlich der Fall ist.

Entschuldigung, das war mein Fehler. Ich habe Ihre Vorschläge nicht richtig gelesen/angewandt; vielen Dank für den Hinweis. Hier habe ich es richtig gemacht. Es werden keinerlei Fehler im Bericht generiert. Das einzige Problem ist, dass jetzt manchmal mehrere Verkaufs- und Kaufaufträge eingegeben werden, was verhindert, dass die Geschäfte zum richtigen Zeitpunkt geschlossen werden.

Edit: Um genau zu sein, wird nur bei SL und TP ausgestiegen, nicht wenn der Preis die andere Seite des MA kreuzt. Hat das etwas mit dem Bool zu tun?

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]
      if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
        {
         if(BuyTicket==-1)
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
        }
      else
      if(OrderSelect(BuyTicket,MODE_TRADES))
      {
         if(OrderCloseTime()==0)
         {
          if(Close[0]<PreviousSlow)
           {
             bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
             if(CloseTicket)
               BuyTicket=-1;
               }
            }
            else
               BuyTicket= -1; //Order has closed so reset variable
               }
            
      if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
        {
         if(SellTicket==-1)
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
        }
      else
       if(OrderSelect(SellTicket,MODE_TRADES))
       {
         if(Close[0]>PreviousSlow)
        {
        bool CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
              if(CloseSellTicket)
                  SellTicket=-1;
                     }
         }
         else 
            SellTicket= -1; //Order has closed so reset variable
            }
    return(0);
    return(0); 
    }
 
if(OrderSelect(BuyTicket,MODE_TRADES))
Hier wird kein Handel ausgewählt. Bitte folgen Sie dem Beispiel, das ich Ihnen gegeben habe, und machen Sie es richtig
 
GumRai:
Dies wählt keinen Handel aus, bitte folgen Sie dem Beispiel, das ich Ihnen gegeben habe, und machen Sie es richtig

Ich komme mir... wirklich dumm vor. lol. Danke, dass du das gefunden hast!!

1) Zwei Dinge noch...es erzeugt jetzt einen Fehlercode von OrderClose 4108. Soll ich den Code noch einmal posten? Es ist derselbe wie oben mit der von Ihnen angegebenen Korrektur. Der Ein- und Ausstieg erfolgt jedoch gemäß den Regeln.

2) Und er geht nicht sofort short, sobald er die Long-Position schließt, wie im Bild gezeigt. Der grüne Abwärtspfeil zeigt an, wo er hätte short gehen müssen. Er hat einen Kauf getätigt und diesen mit einem Verlust geschlossen, als er unter dem gelben MA schloss. Hier hätte er short gehen müssen. Wie kann ich diese Schleife?

Vielen Dank GumRai. Ich würde ehrlich gesagt nicht erreicht haben irgendwo so nah ohne Ihre Hilfe.

Hätte hier short gehen sollen

 
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]
      if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)))
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
        }
      else
      if(OrderSelect(BuyTicket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime()==0)
           {
            if(Close[0]<PreviousSlow)
              {
               bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
               if(CloseTicket)
                  BuyTicket=-1;
              }
           }
         else
            BuyTicket=-1; //Order has closed so reset variable
        }

      if(SellTicket==-1)
        {
         if((iOpen(NULL,0,1)>PreviousSlow && PreviousPriceClose<PreviousSlow && Bid<=(PreviousSlow-PipsBeforeEntry*Pips)))
           {
            SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Entry EA",MagicNumber2,0,clrLimeGreen);
           }
        }
      else
      if(OrderSelect(SellTicket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime()==0)
           {
            if(Close[0]>PreviousSlow)
              {
               bool CloseSellTicket=OrderClose(SellTicket,LotSize,Ask,Slippage,clrPink);
               if(CloseSellTicket)
                  SellTicket=-1;
              }
           }
         else
            SellTicket=-1; //Order has closed so reset variable
        }
     }
   return(0);
  }

Kleine Änderung, da geprüft wurde, ob ein Auftrag geschlossen wurde, obwohl es keinen gab.

Dem Code zufolge gibt es keinen Grund, einen Verkauf zu eröffnen, sobald ein Kauf geschlossen wird.

Die Bedingung für den Ausstieg aus einem Kauf ist nicht dieselbe wie die Bedingung für die Eröffnung eines Verkaufs.

Denken Sie daran, dass, da Sie nur das Öffnen der Kerze prüfen, Close[0] der Geldwert des ersten Ticks ist, der für die Kerze empfangen wurde.

 
GumRai:

Eine kleine Änderung, denn es wurde geprüft, ob ein Auftrag geschlossen wurde, obwohl es keinen gab.

Dem Code zufolge gibt es keinen Grund, einen Verkauf zu eröffnen, sobald ein Kauf geschlossen wird.

Die Bedingung für den Ausstieg aus einem Kauf ist nicht dieselbe wie die Bedingung für die Eröffnung eines Verkaufs.

Denken Sie daran, dass, da Sie nur das Öffnen der Kerze prüfen, Close[0] der Geldwert des ersten Ticks ist, der für die Kerze empfangen wurde.

Wahnsinn! Sie haben es geschafft! Vielen Dank wieder und wieder GumRai. Du bist der Beste.

Kann nicht vorwärts testen jetzt, aber sobald Märkte öffnen, ich denke, ich sollte in der Lage sein, dies zu verwenden, dann, mit den anderen Paaren, solange ich verschiedene magic#s auf der Demo haben.