Errores, fallos, preguntas - página 2589

 
fxsaber:

Pregunta sobre ArrayResize. Hago una reserva para varios gigabytes a la vez. Luego aumento gradualmente el tamaño, que es menor que la reserva inicial.

¿Por qué TaskManager muestra un aumento del consumo de memoria durante el aumento de tamaño?

No hacemos nada al respecto a propósito: es una característica del sistema operativo (¿y realmente el usuario necesita gigabytes?

Si quieres tener memoria caliente en un punto crítico de un programa, tienes que "recorrer" las páginas del chunk asignado antes de ese punto, para que las páginas de memoria virtual del proceso obtengan las físicas.


Pero, desde MQL, no hay acceso al trozo reservado del array.

 
Ilyas:

No hacemos nada a propósito para ello: es una característica del sistema operativo (¿y realmente el usuario necesita gigabytes?

Si quieres tener memoria caliente en un punto crítico de un programa, tienes que "recorrer" las páginas del chunk asignado antes de ese punto, para que las páginas de memoria virtual del proceso obtengan las físicas.


Pero, desde MQL, no hay acceso al trozo reservado del array.

Gracias. Me pregunto cómo debería afectarse el rendimiento si se hace un ArrayResize completo en gigabytes a la vez.

 
void OnStart()
{  datetime m_stoptime = 0;
//1.
   if(m_stoptime < TimeCurrent())
   {
      //расчеты   
   }


//2.
   MqlTick last_tick;
   if(SymbolInfoTick(_Symbol, last_tick))
   {  if(m_stoptime < last_tick.time) 
      {
         //расчеты
      }
   }
//3. 
      const  int start = 0;
      const int count = 1;
      datetime time[1];
      if(CopyTime(_Symbol,PERIOD_M1,start,count,time)>0)
      {
        if(m_stoptime < time[0]) 
         {
         //расчеты
         }
      }
}

Probado, corrió un rebasamiento completo mientras optimizaba mi EA para 5000 pases, contados sólo desde el registro del probador

1. 14:04:28.365 - 14:15:47.481 = 11 m 19 s

2. 13:49:56.885 - 14:00:30.819 = 10 m 34 seg.

3. 14:28:35.89 - 14:41:11.659 = 12 m 36 seg.


en principio, como era de esperar la opción 2 es más rápida, para 5000 carreras la ganancia es de unos 30 segundos, también bastante buena

 

Por favor, ayude a llamar a este menú a través de WinAPI.

Puedo obtener la línea con el nombre del EA seleccionado. Sólo hay una línea en ComboBox, a diferencia de MT4.

Pero no puedo llamar al menú. BM_CLICK no funciona.


¿Cómo se utilizan los mensajes en x64?


Resuelto el problema usando WM_LBUTTONDOWN.

 
¿Es un error o no que la estática cero no lo sea?
int Array0[] = {};
 
¿Habrá una opción en el terminal móvil para aplicar los indicadores del sótano directamente al gráfico?
 
Igor Makanu:

Básicamente como se esperaba la opción 2 es más rápida, para 5000 pases la ganancia es de unos 30 segundos, tampoco está mal.

Estaría bien tener un hilo donde se recopilaran resultados similares. Para el optimizador es relevante.

 
fxsaber:

Sería bueno tener una rama donde se recogieran resultados similares. Es relevante para el optimizador.

Lo apoyo, no es la primera vez que pruebo y publico resultados en medio de la nada

pero no estoy dispuesto a abrir una rama.... mala educación, un sentido de la responsabilidad me abruma, y mantener el tema al día ... No estoy seguro de poder hacerlo (((

ZS: siguiendo el ejemplo anterior.... ayer no decidió escribir este hilo de nuevo en el ejemplo #2 SymbolInfoTick() aSymbolInfoInteger(_Symbol, SYMBOL_TIME)

ZZZY: aquí hay un ejemplo en el que uso, es más conveniente para mí en el optimizador para buscar el tiempo con una frecuencia de muestreo de 5 minutos - menos pases, por lo que el tiempo en el optimizador generalmente hizo 2 bytes en ushort, si 0 - entonces esta opción no se utiliza, tengo más - para comprobar cómo trabajar con bytes, pero no ahora - en mi ejemplo una vez en OnInit() dividí bytes - no crítico

class CWorkTime
{
private:
   int               m_starthour, m_stophour, m_startmin, m_stopmin;
   datetime          m_starttime, m_stoptime;
   bool              UseThisSession, NotIntraDay;
   void              setTodayWorkTime();
public:
   void              CWorkTime(const ushort worktime);
   bool              Disable(); };
//+------------------------------------------------------------------+
void CWorkTime::CWorkTime(const ushort worktime): UseThisSession(true)
{  union UShortToByte { ushort u_short; uchar byte[2]; } ShortToByte;
   if(worktime == 0)
   {  UseThisSession = false;
      Print("EA working time is not used"); }
   else
   {  ShortToByte.u_short = worktime;
      int t = (int)(ShortToByte.byte[0] * 5.625);
      m_starthour = (int)(t / 60);
      m_startmin = t % 60;

      t = (int)(ShortToByte.byte[1] * 5.625);
      m_stophour = (int)(t / 60);
      m_stopmin = t % 60;
      NotIntraDay = m_starthour > m_stophour ? true : false;
      setTodayWorkTime();
      printf("EA working time start: %d h %d min , end: %d h %d min", m_starthour, m_startmin, m_stophour, m_stopmin); } }
//+------------------------------------------------------------------+
void CWorkTime::setTodayWorkTime()
{  MqlDateTime dtstart, dtstop;
   TimeCurrent(dtstart);
   dtstop         = dtstart;
   dtstart.hour   = m_starthour;
   dtstart.min    = m_startmin;
   dtstop.hour    = m_stophour;
   dtstop.min     = m_stopmin;
   m_starttime    = StructToTime(dtstart);
   m_stoptime     = StructToTime(dtstop);
   if(NotIntraDay) m_stoptime += 86400; }
//+------------------------------------------------------------------+
bool CWorkTime::Disable(void)
{  bool result    = false;
   if(UseThisSession)
   {  datetime time = (datetime)SymbolInfoInteger(_Symbol, SYMBOL_TIME);
      if(m_stoptime < time) setTodayWorkTime();
      result      = time >= m_starttime && time <= m_stoptime ? false : true; }
   return(result); };
//+------------------------------------------------------------------+

uso:

int OnInit()
  {
   WorkTime=new CWorkTime(EA_Time);
   }

void OnTick()
  {
    bool DisableTradingByTime=WorkTime.Disable();
.....
    if(DisableTradingByTime) return;

es decir, el resultado del método Disable() - très no tiempo de trabajo, falce - trabajo

 
fxsaber:

Sería bueno tener una rama donde se recogieran resultados similares. Es relevante para el optimizador.

Hay uno similar sobre el tema:

Алгоритмы, методы решений, сравнение их производительности
Алгоритмы, методы решений, сравнение их производительности
  • 2017.12.10
  • www.mql5.com
В данной ветке будем обсуждать разные способы решения тех, или иных задач, сравнивать производительность предложенных решений...
 

¿Puedo tener algunos detalles: por qué SocketTlsReadAvailable () devuelve un error (5273 ERR_NETSOCKET_IO_ERROR) cuando el Socket está conectado (SocketIsConnected () devuelve true)?

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategia

Bichos, errores, preguntas

Alain Verleyen, 2019.08.29 01:17

Acerca de las funciones mql SocketXXX () este mensaje está dirigido principalmente a los desarrolladores de Metaquotes: @Renat Fatkhullin, @Slava, @Ilyas

Estoy utilizando el siguiente código para controlar la recepción de mensajes a través de una conexión segura.

int socket;
//+------------------------------------------------------------------+
//| void OnTimer()                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   string message;
   if(receive(message))
     {
      //--- ...     
     }
  }
//+------------------------------------------------------------------+
//| Call every X ms                                                  |
//+------------------------------------------------------------------+
bool receive(string &message)
  {
//--- ...
   char response[];
   message="";

   ResetLastError();
   uint len=SocketIsReadable(socket);
   if(len>1)
     {
      int read=SocketTlsReadAvailable(socket,response,len);

      //--- analyze the response 
      if(read>0)
        {
         //--- ...

         message=CharArrayToString(response,0,read);
         return(true);
        }
      else if(read==-1)
        {
         if(SocketIsConnected(socket))
           {
            printf("ERROR: %i, socket(%i) read: len=%i",_LastError,socket,len);
           }
         else
           {
            printf("ERROR: %i, socket(%i) not connected. len=%i",_LastError,socket,len);
            //--- ...            
           }
        }
     }
   else
     {
      if(_LastError!=0)
         printf("ERROR: %i (SocketIsReadable).",_LastError);
     }
//--- ...
   return(false);
  }

La mayoría de las veces funciona correctamente. Sin embargo, de vez en cuando me sale un mensaje de error aunque el socket está conectado, y después de un tiempo (de 1 a 5/6 errores) sigue funcionando.

... datos / mensajes recibidos correctamente

2019.08.29 00: 45: 43.019 XXXX (EURUSD, H1) ERROR: 5273, socket (1), read: len = 437
2019.08.29 00: 45: 43.237 XXXX (EURUSD, H1) ERROR: 5273, socket (1), read: len = 1242

... datos / mensajes recibidos correctamente

El error 5273 es muy común y no ayuda mucho. ¿Es posible obtener más información sobre estos errores?