Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1115

 
Ho capito, è solo un file rotto, ma l'eseguibile è intatto, quindi funziona...
 
xxz:

......
EA funziona, ma quando provo ad aprirlo nell'editor

......

xxz:

non è un eseguibile, è un file mq5...

questo è il mio codice...

Quindi formate le vostre frasi correttamente.

In tema. Di solito apro questi problemi in Notepad++. Aiuta. Ma non sempre )))

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

Quindi formate le vostre frasi correttamente.

In tema. Di solito apro questi problemi in Notepad++. Aiuta. Ma non sempre ))))

Ho anche deciso di guardarlo con Notepad++ ed era quasi tutto a zero, anche se il file era di dimensioni normali come dovrebbe essere...

 
I commenti non relativi a questo argomento sono stati spostati in "Domande dai principianti di MQL4 MT4 MetaTrader 4".
 

Ho scritto un EA. La persona a cui l'ho scritto, al primo giro, apre due posizioni una dopo l'altra. Non riesco a riprodurre questo problema con me stesso. Vorrei chiedervi aiuto.

La funzione OnTick()

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

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

Solo la funzione CheckForOpen() è responsabile dell'apertura delle posizioni:

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

La funzione che invia una richiesta di aprire una posizione dal mercato. Ho aggiunto un replay ritardato quando il server si blocca perché spesso ottengo requotes/offquotes durante i test con MetaQuotes MT5 demo.

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

La funzione di controllo dell'apertura di una nuova barra:

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

La seconda posizione si apre immediatamente dopo la prima, nello stesso secondo, i tick differiscono di uno. Inizialmente ho pensato che ci fosse una seconda copia dell'EA sul secondo grafico. Ho chiesto di chiuderli tutti e lasciare un solo grafico ed eseguire l'EA, ma secondo il cliente e a giudicare dallo screenshot, non è questo il motivo. Le posizioni successive sono aperte una alla volta, non ci sono più duplicati. Non posso riprodurlo, mi sono già scervellato. L'ho testato sul mio MT5 demo ICMarkets hedge e sull'ordinatore. Screenshot del doppietto.


L'intera EA.

File:
 
Grigori.S.B:

Ho scritto un EA. La persona a cui l'ho scritto, al primo giro, apre due posizioni una dopo l'altra. Non riesco a riprodurre questo problema con me stesso. Vorrei chiedervi aiuto.

La funzione OnTick()

Solo la funzione CheckForOpen() è responsabile dell'apertura delle posizioni:

La funzione che invia una richiesta di aprire una posizione dal mercato. Ho aggiunto un replay ritardato quando il server si blocca perché spesso ottengo requotes/offquotes durante i test con MetaQuotes MT5 demo.

La funzione di controllo dell'apertura di una nuova barra:

La seconda posizione si apre immediatamente dopo la prima, nello stesso secondo, i tick differiscono di uno. Inizialmente ho pensato che ci fosse una seconda copia dell'EA sul secondo grafico. Ho chiesto di chiuderli tutti e lasciare un solo grafico ed eseguire l'EA, ma secondo il cliente e a giudicare dallo screenshot, non è questo il motivo. Le posizioni successive sono aperte una alla volta, non ci sono più duplicati. Non posso riprodurlo, mi sono già scervellato. L'ho testato sul mio MT5 demo ICMarkets hedge e sull'ordinatore. Screenshot del doppietto.


L'intera EA.

Uso questa funzione per controllare la nuova barra - a volte ci sono errori quando si copia la data della barra.

//+------------------------------------------------------------------------------------------------------------------+
//| Возвращает 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:

Uso tale funzione per controllare una nuova barra - ci sono volte in cui ci sono errori quando si copia la data della barra.

Grazie. Cercherò di sostituirlo. Anche se finora la funzione che ho usato ha funzionato bene. Ho un'idea per stampare il tempo di apertura della barra e il prezzo, poi si vedrebbe chiaramente che l'errore è in questo caso particolare.

Tuttavia, sono confuso dal fatto che i duplots appaiono solo all'apertura della prima posizione mentre le posizioni successive vengono aperte correttamente e l'EA lavora per ore generandone decine. E la funzione di controllo dell'apertura della barra funziona sempre. E secondo le condizioni l'Expert Advisor apre la prima posizione quando non ce n'è nessuna e le successive si aprono solo quando il prezzo si è mosso abbastanza lontano dopo che la prima è stata aperta.

 
Grigori.S.B:

Ho scritto un EA. La persona a cui l'ho scritto, al primo giro, apre due posizioni una dopo l'altra. Non riesco a riprodurre questo problema con me stesso. Vorrei chiedervi aiuto.

La funzione OnTick()

Solo la funzione CheckForOpen() è responsabile dell'apertura delle posizioni:

La funzione che invia una richiesta di aprire una posizione dal mercato. Ho aggiunto un replay ritardato quando il server si blocca perché spesso ottengo requotes/offquotes durante i test con MetaQuotes MT5 demo.

La funzione di controllo dell'apertura di una nuova barra:

La seconda posizione si apre immediatamente dopo la prima, nello stesso secondo, i tick differiscono di uno. Inizialmente ho pensato che ci fosse una seconda copia dell'EA sul secondo grafico. Ho chiesto di chiuderli tutti e lasciare un solo grafico ed eseguire l'EA, ma secondo il cliente e a giudicare dallo screenshot, non è questo il motivo. Le posizioni successive sono aperte una alla volta, non ci sono più duplicati. Non posso riprodurlo, mi sono già scervellato. L'ho testato sul mio MT5 demo ICMarkets hedge e sull'ordinatore. Screenshot del doppietto.


L'intera EA.

E come controllate che una posizione non sia già stata aperta su questa barra?

 
Artyom Trishkin:

E come si controlla che nessuna posizione sia stata ancora aperta su questa barra?

No, non c'è questo controllo.

Ci sono questi controlli:

  • Se si è aperta una nuova barra, con il suo primo tick si può aprire una posizione,
  • Se non ci sono posizioni, la prima posizione può essere aperta.
In altre parole, per qualche motivo due posizioni si aprono contemporaneamente al primo tick di una nuova barra. E solo le prime posizioni sono aperte. Inoltre un tale fenomeno non viene osservato.
 
Grigori.S.B:

No, non c'è un tale controllo.

Ci sono questi controlli:

  • Se si è aperta una nuova barra, con il suo primo tick si può aprire una posizione,
  • Se non ci sono posizioni, la prima posizione può essere aperta.
Cioè, per qualche motivo, due posizioni si aprono contemporaneamente al primo tick di una nuova barra. E solo le prime posizioni sono aperte. Inoltre un tale fenomeno non viene osservato.

Non ho tempo per analizzare quello che sta succedendo lì. Ma prova a controllare il numero di posizioni aperte sulla nuova barra. In caso contrario - aprire.