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"
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.
¡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.

- www.mql5.com
¿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.
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.

- www.mql5.com
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.
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.
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?

- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
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.
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