Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1115

 
Lo he resuelto, es un archivo roto, pero el ejecutable está intacto, así que funciona...
 
xxz:

......
EA funciona, pero cuando intento abrirlo en el editor

......

xxz:

no es un ejecutable, es un archivo mq5...

este es mi código...

Así que forme sus frases correctamente.

Sobre el tema. Suelo abrir estos problemas en el Bloc de notas++. Ayuda. Pero no siempre )))

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

Así que forme sus frases correctamente.

Sobre el tema. Suelo abrir estos problemas en el Bloc de notas++. Ayuda. Pero no siempre ))))

También decidí revisarlo con el Notepad++ y era casi todo ceros, aunque el archivo tenía el tamaño normal como debería ser...

 
Los comentarios no relacionados con este tema han sido trasladados a "Preguntas de los principiantes de MQL4 MT4 MetaTrader 4".
 

He escrito un EA. La persona a la que se lo escribí, en la primera ejecución, abre dos posiciones una tras otra. No puedo reproducir este problema conmigo mismo. Me gustaría pedirle ayuda.

La función OnTick()

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

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

Sólo la función CheckForOpen() es responsable de la apertura de posiciones:

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 función que envía una solicitud para abrir una posición desde el mercado. He añadido una repetición retardada en ella cuando el servidor se cae porque a menudo tengo requotes/offquotes cuando hago pruebas con la demo de MetaQuotes MT5.

//+------------------------------------------------------------------+
//| 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 función de controlar la apertura de un nuevo bar:

//+------------------------------------------------------------------+
//| 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 segunda posición se abre inmediatamente después de la primera, en el mismo segundo, los ticks difieren en uno. Inicialmente pensé que había una segunda copia del EA en el segundo gráfico. Pedí que se cerraran todos y se dejara un gráfico y se ejecutara el EA, pero según el cliente y a juzgar por la captura de pantalla, no es esa la razón. Las posiciones posteriores se abren de una en una, no hay más duplicados. No puedo reproducirlo, ya me he devanado los sesos. Lo he probado en mi MT5 demo ICMarkets hedge, así como el ordenador. Captura de pantalla del doblete.


Todo el EA.

Archivos adjuntos:
 
Grigori.S.B:

He escrito un EA. La persona a la que se lo escribí, en la primera ejecución, abre dos posiciones una tras otra. No puedo reproducir este problema conmigo mismo. Me gustaría pedirle ayuda.

La función OnTick()

Sólo la función CheckForOpen() es responsable de la apertura de posiciones:

La función que envía una solicitud para abrir una posición desde el mercado. He añadido una repetición retardada en ella cuando el servidor se cae porque a menudo tengo requotes/offquotes cuando hago pruebas con la demo de MetaQuotes MT5.

La función de controlar la apertura de un nuevo bar:

La segunda posición se abre inmediatamente después de la primera, en el mismo segundo, los ticks difieren en uno. Inicialmente pensé que había una segunda copia del EA en el segundo gráfico. Pedí que se cerraran todos y se dejara un gráfico y se ejecutara el EA, pero según el cliente y a juzgar por la captura de pantalla, no es esa la razón. Las posiciones posteriores se abren de una en una, no hay más duplicados. No puedo reproducirlo, ya me he devanado los sesos. Lo he probado en mi cobertura MT5 demo ICMarkets, así como el ordenador. Captura de pantalla del doblete.


Todo el EA.

Utilizo esta función para controlar la nueva barra - a veces hay errores al copiar la fecha de la 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:

Hay veces que hay errores al copiar la fecha de la barra.

Gracias. Intentaré reemplazarlo. Aunque hasta ahora la función que he utilizado ha funcionado bien también. Tengo una idea para imprimir la hora de apertura de la barra y el precio, entonces se vería claramente que el error es en este caso particular.

Sin embargo, me confunde el hecho de que los duplots aparezcan sólo en la apertura de la primera posición mientras que las posiciones posteriores se abren correctamente y el EA trabaja durante horas generando decenas de ellos. Y la función de control de apertura de la barra funciona siempre. Y de acuerdo con las condiciones el Asesor Experto abre la primera posición cuando no hay ninguna y las siguientes se abren sólo cuando el precio se ha movido lo suficiente después de que se abrió la primera.

 
Grigori.S.B:

He escrito un EA. La persona a la que se lo escribí, en la primera ejecución, abre dos posiciones una tras otra. No puedo reproducir este problema conmigo mismo. Me gustaría pedirle ayuda.

La función OnTick()

Sólo la función CheckForOpen() es responsable de la apertura de posiciones:

La función que envía una solicitud de apertura de una posición desde el mercado. He añadido una repetición retardada en ella cuando el servidor se cae porque a menudo tengo requotes/offquotes cuando pruebo con la demo de MetaQuotes MT5.

La función de controlar la apertura de un nuevo bar:

La segunda posición se abre inmediatamente después de la primera, en el mismo segundo, los ticks difieren en uno. Inicialmente pensé que había una segunda copia del EA en el segundo gráfico. Pedí que se cerraran todos y se dejara un gráfico y se ejecutara el EA, pero según el cliente y a juzgar por la captura de pantalla, no es esa la razón. Las posiciones posteriores se abren de una en una, no hay más duplicados. No puedo reproducirlo, ya me he devanado los sesos. Lo he probado en mi cobertura MT5 demo ICMarkets, así como el ordenador. Captura de pantalla del doblete.


Todo el EA.

¿Y cómo se comprueba que no se ha abierto ya una posición en esta barra?

 
Artyom Trishkin:

¿Y cómo se comprueba que aún no se ha abierto ninguna posición en esta barra?

No, no existe tal control.

Hay controles de este tipo:

  • Si se ha abierto una nueva barra, con su primer tick se puede abrir una posición,
  • Si no hay posiciones, se puede abrir la primera posición.
Es decir, por alguna razón se abren dos posiciones a la vez en el primer tick de una nueva barra. Y sólo se abren las primeras posiciones. Además, este fenómeno no se observa.
 
Grigori.S.B:

No, no existe tal control.

Hay controles de este tipo:

  • Si se ha abierto una nueva barra, con su primer tick se puede abrir una posición,
  • Si no hay posiciones, se puede abrir la primera posición.
Es decir, por alguna razón se abren dos posiciones a la vez en el primer tick de una nueva barra. Y sólo se abren las primeras posiciones. Además, este fenómeno no se observa.

No tengo tiempo para analizar lo que sucede allí. Pero intente comprobar el número de posiciones abiertas en la nueva barra. Si no es así, abre.

Razón de la queja: