Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1115

 
Ich habe es herausgefunden, es ist nur eine defekte Datei, aber die ausführbare Datei ist intakt, also funktioniert es...
 
xxz:

......
EA funktioniert, aber wenn ich versuche, es im Editor zu öffnen

......

xxz:

es ist keine ausführbare Datei, es ist eine mq5-Datei...

dies ist mein Code...

Formulieren Sie also Ihre Sätze richtig.

Zum Thema. Ich öffne solche problematischen Dateien normalerweise in Notepad++. Das hilft. Aber nicht immer )))

 
Сергей Таболин:

Formulieren Sie also Ihre Sätze richtig.

Zum Thema. Ich öffne solche problematischen Dokumente normalerweise in Notepad++. Das hilft. Aber nicht immer ))))

Ich beschloss auch, sie mit Notepad++ durchzusehen, und es waren fast nur Nullen, obwohl die Datei die normale Größe hatte, wie sie sein sollte...

 
Kommentare, die sich nicht auf dieses Thema beziehen, wurden nach "Fragen von MQL4 MT4 MetaTrader 4 Anfängern" verschoben.
 

Ich habe einen EA geschrieben. Die Person, an die ich ihn geschrieben habe, öffnet beim ersten Durchlauf zwei Positionen nacheinander. Ich kann dieses Problem bei mir selbst nicht reproduzieren. Ich möchte Sie um Hilfe bitten.

Die Funktion OnTick()

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   
   GetData();
   CheckForOpen();
   CheckForCloseCP();
   CheckForCloseAll();

}
//+------------------------------------------------------------------+

Nur die Funktion CheckForOpen() ist für die Eröffnung von Positionen zuständig:

enum opp_mode {
   DoClose,       // Close and reverse with initial lot
   DoReverse,     // Close and reverse (continue Martingale last lot)
   DoHedge,       // No closing reversal (Hedge mode)
};

// Trade & MM Section
input opp_mode Mode_opp    = DoHedge;     // Trading Mode

//+------------------------------------------------------------------+
//| Check for Open function                                          |
//+------------------------------------------------------------------+
void CheckForOpen() {

   if (!IsBarNew) return;

double lot=0;
positions=Positions();

   if (Signal==OP_BUY) {
      if (longs>0) return;
      if (shorts==0) {     // First Order Placing
         Print("   *** MSG ***   "+msg);
         PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
      }
      if (shorts>0) {
         if (Mode_opp==DoClose) {      // Closing by Opposite Signal
            Print("   *** MSG ***   "+msg);
            Print("   ***   Close mode SELL by opposite signal."); 
            ClosePositions(OP_SELL);
            PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
         }
         if (Mode_opp==DoReverse) {    // Reverse by Opposite Signal
            Print("Reversing SELL by opposite signal.");
            lot=GetMaxLot(ORDER_TYPE_SELL);
            if (IsMartingale) lot=lot*LotMult;
            ClosePositions(OP_SELL);
            PlaceMarketOrder(OP_BUY, lot, _ask, _SL, _TP);
         }
         if (Mode_opp==DoHedge) {      // Hedging by Opposite Signal
            Print("Hedging SELL by opposite signal."); 
            MartinCounterB=50; MartinCounterS=50;
            PlaceMarketOrder(OP_BUY, GetMaxLot(ORDER_TYPE_SELL)*LotMult, _ask, _SL, _TP);
         }
      }
   }
   if (Signal==OP_SELL) {
      if (shorts>0) return;
      if (longs==0) {     // First Order Placing
         Print("   *** MSG ***   "+msg);
         PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
      }
      if (longs>0) {
         if (Mode_opp==DoClose) {      // Closing by Opposite Signal
            Print("   *** MSG ***   "+msg);
            Print("   ***   Close mode BUY by opposite signal."); 
            ClosePositions(OP_BUY);
            PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
         }
         if (Mode_opp==DoReverse) {    // Reverse by Opposite Signal
            Print("Reversing BUY by opposite signal."); 
            lot=GetMaxLot(ORDER_TYPE_BUY);
            if (IsMartingale) lot=lot*LotMult;
            ClosePositions(OP_BUY);
            PlaceMarketOrder(OP_SELL, lot, _bid, _SL, _TP);
         }
         if (Mode_opp==DoHedge) {      // Hedging by Opposite Signal
            Print("Hedging BUY by opposite signal."); 
            MartinCounterB=50; MartinCounterS=50;
            PlaceMarketOrder(OP_SELL, GetMaxLot(ORDER_TYPE_BUY)*LotMult, _bid, _SL, _TP);
         }
      }
   }
}
//+------------------------------------------------------------------+

Die Funktion, die eine Anfrage zur Eröffnung einer Position vom Markt sendet. Ich habe eine verzögerte Wiedergabe hinzugefügt, wenn der Server abstürzt, weil ich beim Testen mit der MetaQuotes MT5-Demo oft Requotes/Offquotes bekomme.

//+------------------------------------------------------------------+
//| Place Market Order function                                      |
//+------------------------------------------------------------------+
bool PlaceMarketOrder(int oper, double lot, double oop, double sl, double tp) {   //  mn - Magic Number

double d_sl=0, d_tp=0;

   MqlTick stTick;
   if (SymbolInfoTick(_Symbol,stTick)==false) {
      Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
   }

   Print("Placing market order. Type="+(string)oper+", OrderOpenPrice="+DoubleToString(oop,_Digits)+
         ", Bid="+DoubleToString(_bid,_Digits)+", Ask="+DoubleToString(_ask,_Digits));

   if (MathAbs(lot-Lot)<1 e-5) {MartinCounterB=0; MartinCounterS=0;}
     
   if (oper==OP_BUY)  {
      for (int i=0; i<5; i++) {
         if (SymbolInfoTick(_Symbol,stTick)==false) {
            Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
         }
         _ask=stTick.ask;
         d_sl=ND(_ask-sl*pips); if (MathAbs(sl)<1 e-5) d_sl=ND(0.0);
         d_tp=ND(_ask+tp*pips); if (MathAbs(tp)<1 e-5) d_tp=ND(0.0);
         if (m_trade.Buy(NormalizeLot(lot),NULL,_ask,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
         else {PlaySound("disconnect.wav"); Sleep(5000);}
      }
   }
   if (oper==OP_SELL) {
      for (int i=0; i<5; i++) {
         if (SymbolInfoTick(_Symbol,stTick)==false) {
            Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
         }
         _bid=stTick.bid;
         d_sl=ND(_bid+sl*pips); if (MathAbs(sl)<1 e-5) d_sl=ND(0.0);
         d_tp=ND(_bid-tp*pips); if (MathAbs(tp)<1 e-5) d_tp=ND(0.0);
         if (m_trade.Sell(NormalizeLot(lot),NULL,_bid,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
         else {PlaySound("disconnect.wav"); Sleep(5000);}
      }
   }
     
   return(false);
     
}
//+------------------------------------------------------------------+

Die Funktion der Steuerung der Öffnung eines neuen Taktes:

//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
bool   IsBarNew=false;


//+------------------------------------------------------------------+
//| Bar refreshing function                                          |
//| true - new bar opened, false - not opened                        |
//+------------------------------------------------------------------+
bool IsNewBar() {

static datetime SavedTime=iTime(NULL,PERIOD_CURRENT,0);
       datetime curTime  =iTime(NULL,PERIOD_CURRENT,0);

   if (curTime>SavedTime) {
         SavedTime=curTime;
         return(true);
   }
   else return(false);
}
//+------------------------------------------------------------------+

Die zweite Position wird unmittelbar nach der ersten eröffnet, in derselben Sekunde, die Ticks unterscheiden sich um eins. Ich dachte zunächst, es gäbe eine zweite Kopie des EA auf dem zweiten Diagramm. Ich bat darum, alle zu schließen und ein Diagramm zu belassen und den EA auszuführen, aber laut dem Kunden und nach dem Screenshot zu urteilen, ist das nicht der Grund. Nachfolgende Positionen werden nacheinander eröffnet, es gibt keine Duplikate mehr. Ich kann es nicht reproduzieren, ich habe mir schon den Kopf zerbrochen. Ich habe es auf meinem MT5-Demo ICMarkets hedge als auch den Orderer getestet. Screenshot der Dublette.


Der gesamte EA.

Dateien:
 
Grigori.S.B:

Ich habe einen EA geschrieben. Die Person, an die ich ihn geschrieben habe, öffnet beim ersten Durchlauf zwei Positionen nacheinander. Ich kann dieses Problem bei mir selbst nicht reproduzieren. Ich möchte Sie um Hilfe bitten.

Die Funktion OnTick()

Nur die Funktion CheckForOpen() ist für die Eröffnung von Positionen zuständig:

Die Funktion, die eine Anfrage zur Eröffnung einer Position vom Markt sendet. Ich habe eine verzögerte Wiedergabe hinzugefügt, wenn der Server abstürzt, weil ich beim Testen mit der MetaQuotes MT5-Demo oft Requotes/Offquotes bekomme.

Die Funktion der Steuerung der Öffnung eines neuen Taktes:

Die zweite Position wird unmittelbar nach der ersten eröffnet, in derselben Sekunde, die Ticks unterscheiden sich um eins. Ich dachte zunächst, es gäbe eine zweite Kopie des EA auf dem zweiten Diagramm. Ich bat darum, alle zu schließen und ein Diagramm zu belassen und den EA auszuführen, aber laut dem Kunden und nach dem Screenshot zu urteilen, ist das nicht der Grund. Nachfolgende Positionen werden nacheinander eröffnet, es gibt keine Duplikate mehr. Ich kann es nicht reproduzieren, ich habe mir schon den Kopf zerbrochen. Ich habe es auf meinem MT5-Demo ICMarkets hedge als auch den Orderer getestet. Screenshot der Dublette.


Der gesamte EA.

Ich verwende diese Funktion, um den neuen Takt zu kontrollieren - manchmal gibt es Fehler beim Kopieren des Taktdatums.

//+------------------------------------------------------------------------------------------------------------------+
//| Возвращает TRUE, если появился новый бар на текущем ТФ
//+------------------------------------------------------------------------------------------------------------------+
bool isNewBar()
  {
   datetime tm[];
   static datetime prevBarTime=0;

   if(CopyTime(_Symbol,0,0,1,tm)<0)
     {
      Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());
     }
   else
     {
      if(prevBarTime!=tm[0])
        {
         prevBarTime=tm[0];
         return true;
        }
      return false;
     }
   return true;
  }
 
Aleksey Vyazmikin:

Ich verwende eine solche Funktion, um einen neuen Balken zu kontrollieren - es gibt Zeiten, in denen es Fehler beim Kopieren des Balkendatums gibt.

Ich danke Ihnen. Ich werde versuchen, sie zu ersetzen. Obwohl die Funktion, die ich bisher verwendet habe, auch gut funktioniert hat. Ich habe die Idee, in den Ausdrucken die Öffnungszeit des Balkens und den Preis anzuzeigen; dann wäre der Fehler deutlich zu erkennen.

Allerdings verwirrt mich die Tatsache, dass Duplots nur bei der Eröffnung der ersten Position erscheinen, während die nachfolgenden Positionen korrekt eröffnet werden und der EA stundenlang arbeitet und Dutzende von ihnen erzeugt. Und die Funktion der Stangenöffnungssteuerung funktioniert jedes Mal. Entsprechend den Bedingungen eröffnet der Expert Advisor die erste Position, wenn keine vorhanden ist, und die nächsten erst, wenn sich der Preis weit genug bewegt hat, nachdem die erste Position eröffnet wurde.

 
Grigori.S.B:

Ich habe einen EA geschrieben. Die Person, an die ich ihn geschrieben habe, öffnet beim ersten Durchlauf zwei Positionen nacheinander. Ich kann dieses Problem bei mir selbst nicht reproduzieren. Ich möchte Sie um Hilfe bitten.

Die Funktion OnTick()

Nur die Funktion CheckForOpen() ist für die Eröffnung von Positionen zuständig:

Die Funktion, die eine Anfrage zur Eröffnung einer Position vom Markt sendet. Ich habe eine verzögerte Wiedergabe hinzugefügt, wenn der Server abstürzt, weil ich beim Testen mit der MetaQuotes MT5-Demo oft Requotes/Offquotes erhalte.

Die Funktion der Steuerung der Öffnung eines neuen Taktes:

Die zweite Position wird unmittelbar nach der ersten eröffnet, in derselben Sekunde, die Ticks unterscheiden sich um eins. Ich dachte zunächst, es gäbe eine zweite Kopie des EA auf dem zweiten Diagramm. Ich bat darum, alle zu schließen und ein Diagramm zu belassen und den EA auszuführen, aber laut dem Kunden und nach dem Screenshot zu urteilen, ist das nicht der Grund. Nachfolgende Positionen werden nacheinander eröffnet, es gibt keine Duplikate mehr. Ich kann es nicht reproduzieren, ich habe mir schon den Kopf zerbrochen. Ich habe es auf meinem MT5-Demo ICMarkets hedge als auch auf dem Orderer getestet. Screenshot der Dublette.


Der gesamte EA.

Und wie überprüfen Sie, ob auf diesem Balken nicht bereits eine Position eröffnet wurde?

 
Artyom Trishkin:

Und wie überprüfen Sie, dass für diesen Balken noch keine Position eröffnet wurde?

Nein, es gibt keine solche Prüfung.

Es gibt solche Kontrollen:

  • Wenn ein neuer Balken eröffnet wurde, kann mit seinem ersten Tick eine Position eröffnet werden,
  • Wenn keine Positionen vorhanden sind, kann die erste Position geöffnet werden.
Mit anderen Worten: Aus irgendeinem Grund werden beim ersten Tick eines neuen Balkens zwei Positionen auf einmal eröffnet. Und nur die ersten Positionen werden geöffnet. Darüber hinaus wird ein solches Phänomen nicht beobachtet.
 
Grigori.S.B:

Nein, es gibt keine solche Prüfung.

Es gibt solche Kontrollen:

  • Wenn ein neuer Balken eröffnet wurde, kann mit seinem ersten Tick eine Position eröffnet werden,
  • Wenn keine Positionen vorhanden sind, kann die erste Position geöffnet werden.
D.h. aus irgendeinem Grund werden beim ersten Tick eines neuen Balkens zwei Positionen auf einmal geöffnet. Und nur die ersten Positionen werden geöffnet. Darüber hinaus wird dieses Phänomen nicht beobachtet.

Ich habe keine Zeit, um zu analysieren, was dort vor sich geht. Versuchen Sie jedoch, die Anzahl der offenen Positionen auf dem neuen Balken zu überprüfen. Wenn nicht - öffnen.

Grund der Beschwerde: