Discusión sobre el artículo "Trabajando con las funciones de red, o MySQL sin DLL: Parte II - El programa para monitorear los cambios de las propiedades de las señales"

 

Artículo publicado Trabajando con las funciones de red, o MySQL sin DLL: Parte II - El programa para monitorear los cambios de las propiedades de las señales:

En el artículo anterior, nos familiarizamos con la implementación del conector MySQL. En esta parte, vamos a analizar su aplicación usado como ejemplo la implementación del servicio de recopilación de las propiedades de las señales y el programa. Además, el ejemplo implementado puede tener un sentido práctico en el caso de que el usuario necesite observar los cambios de las propiedades que no se representan en la página web de la señal.

En la figura 6, podemos ver una demostración del funcionamiento de la aplicación.

Demostrando el funcionamiento de la aplicación

Fig. 6. Demostración del funcionamiento de la aplicación para visualizar la dinámica de las propiedades de las señales


Autor: Serhii Shevchuk

 

Esta es una aplicación práctica y genial.

Es una pena que MQ no recoja (¿o no dé acceso a?) estos datos para todas las señales. Sería una base de datos muy útil.

 
Andrey Khatimlianskii:

¡Al final resultó una aplicación genial y práctica!

Es una pena que MQ no recoja (¿o no dé acceso a?) estos datos para todas las señales. Sería una base de datos muy útil.

¿Qué quieres decir con "no recogen" si la base de datos se genera a partir de su API? No sólo no la recogen, sino que la regalan.

Yo estoy más "contento" de que ahora se pueda prescindir de la dependencia de MySQL y adaptar el proyecto al SQLite incorporado.

Документация по MQL5: Управление сигналами
Документация по MQL5: Управление сигналами
  • www.mql5.com
Управление сигналами - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Stanislav Korotky:

¿Cómo que "no recopilan" si la base de datos se genera a partir de su API? No solo no la recopilan, sino que la regalan.

No recopilan el historial. Sólo dan el estado actual.

Y es interesante ver, por ejemplo, el cambio de posición en el rating o el número de suscriptores a lo largo del tiempo.

 

Artículo relacionado: SQLite: Trabajo nativo con bases de datos SQL en MQL5

Ahora se puede trabajar con bases de datos y manejar grandes volúmenes de forma nativa en MQL5 decenas de veces más rápido que con servidores SQL externos. Esto se consigue gracias a la perfecta integración del rápido motor SQLite en el subsistema MQL5 y a la completa eliminación de las operaciones de red.

 

¡Todo esto es bueno, pero un PERO!

Cuando la prueba en Testor a través de socket está apagado, según tengo entendido, y los datos no se restablecerá. Y es muy importante utilizar los datos al probar productos.

 
MIKHAIL VINOGRADOV:

Eso está muy bien, pero hay un PERO.

Cuando las pruebas en Testor a través de socket está apagado, según tengo entendido, y los datos no se restablecerá. Y es muy importante utilizar los datos al probar productos.

Es mejor utilizar SQLite en el probador
SQLite: нативная работа с базами данных на SQL в MQL5
SQLite: нативная работа с базами данных на SQL в MQL5
  • www.mql5.com
MQL5 является идеальным решением для алготрейдинга, так как максимально близок к языку С++ как по синтакису, так и по скорости вычислений. Платформа MetaTrader 5 предоставила трейдерам современный специализированный язык для написания торговых роботов и пользовательских индикаторов, который позволяет выйти за рамки простых торговых задач  —...
 

Lo he implementado en mi EA sin problemas, compila perfectamente, pero a veces se produce un error y el EA se cierra.

array fuera de rango en 'MySQLTransaction.mqh' (365,36)


//+------------------------------------------------------------------+
//| Parse received data                                              |
//+------------------------------------------------------------------+
ENUM_TRANSACTION_STATE CMySQLTransaction::Incoming(uchar &data[], uint len)
  {
   int ptr=0; // index of the current byte in the 'data' buffer
   ENUM_TRANSACTION_STATE result=MYSQL_TRANSACTION_IN_PROGRESS; // result of handling accepted data
   while(len>0)
     {
      if(m_packet.total_length==0)
        {
         //--- If the amount of data in the packet is unknown
         while(m_rcv_len<4 && len>0)
           {
            m_hdr[m_rcv_len] = data[ptr];
            m_rcv_len++;
            ptr++;
            len--;
           }
         //--- Received the amount of data in the packet
         if(m_rcv_len==4)
           {
            //--- Reset error codes etc.
            m_packet.Reset();
            m_packet.total_length = reader.TotalLength(m_hdr);
            m_packet.number = m_hdr[3];
            //--- Length received, reset the counter of length bytes
            m_rcv_len = 0;
            //--- Highlight the buffer of a specified size
            if(ArrayResize(m_packet.data,m_packet.total_length)!=m_packet.total_length)
               return MYSQL_TRANSACTION_ERROR;  // internal error
           }
         else // if the amount of data is still not accepted
            return MYSQL_TRANSACTION_IN_PROGRESS;
        }
      //--- Collect packet data
      while(len>0 && m_rcv_len<m_packet.total_length)
        {
         m_packet.data[m_rcv_len] = data[ptr];
         m_rcv_len++;
         ptr++;
         len--;
        }
      //--- Make sure the package has been collected already
      if(m_rcv_len<m_packet.total_length)
         return MYSQL_TRANSACTION_IN_PROGRESS;
      //--- Handle received MySQL packet
      m_packet.index = 0;
      m_packet.type = MYSQL_PACKET_NONE;
      if(m_packet.total_length>0)
        {
         if(m_packet.data[0]==0)
           {
            //--- Ok packet
            m_packet.type = MYSQL_PACKET_OK;
            m_packet.index++;
            m_packet.affected_rows = reader.GetDataFieldLen(&m_packet);
            m_packet.last_id = reader.GetDataFieldLen(&m_packet);
            m_packet.server_status = reader.Uint16(&m_packet);
            m_packet.warnings = reader.Uint16(&m_packet);
            if(m_packet.index<m_packet.total_length)
               m_packet.message = reader.DfString(&m_packet);
            if((result = PacketOkHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
               break;
           }
         else
            if(m_packet.data[0]==0xfe)
              {
               //--- End Of File packet
               m_packet.type = MYSQL_PACKET_EOF;
               m_packet.index++;
               m_packet.warnings = reader.Uint16(&m_packet);
               m_packet.server_status = reader.Uint16(&m_packet);
               if((result = PacketEOFHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
                  break;
              }
            else
               if(m_packet.data[0]==0xff)
                 {
                  //--- Error packet
                  m_packet.type = MYSQL_PACKET_ERROR;
                  m_packet.index++;
                  m_packet.error.code = reader.Uint16(&m_packet);
                  if((result = PacketErrorHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
                     break;
                 }
               else
                  if(!m_packet.number && m_packet.data[0]==0x0a)
                    {
                     //--- Greeting packet
                     m_packet.type = MYSQL_PACKET_GREETING;
                     if((result = PacketGreetingHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
                        break;
                    }
                  else
                    {
                     //--- Data packet
                     m_packet.type = MYSQL_PACKET_DATA;
                     if((result = PacketDataHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
                        break;
                    }
        }
      m_rcv_len = 0;
      m_packet.total_length = 0;
     }
   return result;
  }

Este error ocurre incluso cuando Algotrading está desactivado.

 
rprocha:

Lo he implementado en mi EA sin problemas, compila perfectamente, pero a veces se produce un error y el EA se cierra.

array fuera de rango en 'MySQLTransaction.mqh' (365,36)


Este error ocurre incluso cuando Algotrading está desactivado.

No puedo reproducir la situación que describes. Me puede dar algún código de ejemplo donde esto sucede?
 

Estoy intentando utilizar la parte MySQL del sistema, pero me sigue apareciendo el error "No hay base de datos seleccionada", incluso si emito un comando "use `mytable`".

¿Tiene alguna idea de por qué está sucediendo esto?