Discusión sobre el artículo "Trabajo con el SGBD MySQL desde MQL5 (MQL4)" - página 7
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Ok, veo que ha escrito un asesor experto para estos fines, y está escrito sin recomendaciones que he publicado en el artículo.
Por lo tanto, vamos a ir paso a paso: 1. La llamada de " DB = cMySqlConnect
1. La llamada de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " debe hacerse dentro de OnInit() en lugar de OnTick(). 2. Está utilizando cMySqlConnect.
2. Estás usando cMySqlConnect - es una función importada de la DLL, tienes que usar la función MySqlConnect en lugar de ¡ cMySqlConnect !
3. Debe llamar a la función MySqlDisconnect dentro de la función estándar OnDeinit().
4. Debe verificar el identificador de conexión a la base de datos dentro de la función estándar OnTick() para asegurarse que la conexión fue exitosa.
Finalmente se verá como.
Ok, veo que ha escrito un asesor experto para estos fines, y está escrito sin recomendaciones que he publicado en el artículo.
Por lo tanto, vamos a ir paso a paso: 1. La llamada de " DB = cMySqlConnect
1. La llamada de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " debe hacerse dentro de OnInit() en lugar de OnTick(). 2. Está utilizando cMySqlConnect.
2. Estás usando cMySqlConnect - es una función importada de la DLL, tienes que usar la función MySqlConnect en lugar de ¡ cMySqlConnect !
3. Debe llamar a la función MySqlDisconnect dentro de la función estándar OnDeinit().
4. Debe verificar el identificador de conexión a la base de datos dentro de la función estándar OnTick() para asegurarse que la conexión fue exitosa.
Finalmente se verá así.
Ok, veo que ha escrito un asesor experto para estos fines, y está escrito sin recomendaciones que he publicado en el artículo.
Por lo tanto, vamos a ir paso a paso: 1. La llamada de " DB = cMySqlConnect
1. La llamada de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " debe hacerse dentro de OnInit() en lugar de OnTick(). 2. Está utilizando cMySqlConnect.
2. Estás usando cMySqlConnect - es una función importada de la DLL, tienes que usar la función MySqlConnect en lugar de ¡ cMySqlConnect !
3. Debe llamar a la función MySqlDisconnect dentro de la función estándar OnDeinit().
4. Debe verificar el identificador de conexión a la base de datos dentro de la función estándar OnTick() para asegurarse que la conexión fue exitosa.
Finalmente se verá así.
He cambiado paso a paso, pero el problema sigue existiendo cuando se utiliza el experto en un mt4 para cuatro o mas simbolos. se imprime " Access violation read to 0x0000000B en '... .MQLMySQL.dll'
"
el código es el siguiente
<--
#include <MQLMySQL.mqh
int MySqlErrorNumber; // número de error reciente de MySQL
string MySqlErrorDescription; // descripción del error
//+------------------------------------------------------------------+
//| Función de inicialización experta & nbsp; |
//+------------------------------------------------------------------+
int OnInit()
OnInit(); int OnInit()
EventSetTimer(tiempoSegundos);
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); if( DB == -1 )
if( DB == -1 )
{
Print("La base de datos no está conectada ..."); if( DB == -1 ) { print("La base de datos no está conectada ... "); }
}
return(INIT_SUCCEEDED); }
}
//+------------------------------------------------------------------+
//| Función experta de desinicialización |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
MySqlDisconnect(DB);
EventKillTimer();
ObjectsDeleteAll();
}
void OnTimer()
{
//Alert(TimeCurrent());
OnTick();
}
//+------------------------------------------------------------------+
//| Función tick experta & nbsp; |
//+------------------------------------------------------------------+
void OnTick()
{
if( DB == -1 )
{
Alert("La base de datos no está conectada ... "); return; { Alert("La base de datos no está conectada ...")
return; }
}
¡if( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 && DB ! = -1 )
{
int cuenta = AccountNumber();
¡string símbolo = Símbolo(); if( cmd !
¡if( cmd ! ¡= "" && cmd ! = NULL )
{
símbolo = cmd; }
}
symbolOrder = symbol + "_table";
double spread = (Ask - Bid); } symbolOrder = symbol + "_table"; }
admisión = spread*MathPow(10, Dígitos).
//int DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);
Query = "SELECT * FROM " + símbolo + " where NúmeroDeCuenta = " + (cadena)NúmeroDeCuenta();
//Imprimir(Consulta);
int Cursor1 = MySqlCursorOpen(DB, Query);
if (Cursor1 >= 0)
{
int Filas1 = MySqlCursorFilas(Cursor1); int Cursor1 = MySqlCursorOpen(BD, Consulta); if (Cursor1 >= 0)
int dataRows1 = Rows1;
//Alert(dataRows);
if( dataRows1 > 0 )
{
Query = "update " + symbol + " set Oferta = " + (cadena)Oferta + ", Demanda = " + ( cadena)Ask
+ ", Spread = " + DoubleToStr(spread, Digits)
+ ", Hora = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS ) + "' where NúmeroDeCuenta = "
+ (cadena)cuenta; // + "' y Símbolo = '" + símbolo + "'".
MySqlExecute(DB, Consulta);
MySqlCursorClose(Cursor1);
}
else if( dataRows1 == 0 )
{
Query = "CREATE TABLE IF NOT EXISTS " + symbol + " (id int NOT NULL AUTO_ INCREMENT PRIMARY KEY, AccountNumber int, "
+ "Symbol char(20), Bid double, Ask double, Spread double,"
+ "Memo char(50), "
+ "Time datetime) ENGINE=MEMORY DEFAULT CHARSET=utf8 ";
MySqlExecute(DB, Consulta);
Query = "INSERT INTO " + symbol + "(AccountNumber, Symbol, Bid, Ask, Spread. Memo, Time) VALUES ("
+ (cadena)cuenta + ", '" + símbolo + "', "+(cadena)Oferta+", "+ (cadena)Demanda + ", "
+ DoubleToStr(spread, Dígitos)
+ ", '" + (cadena)CuentaEmpresa()
+ "', \'"+TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')"";
¡if(MySqlExecute(DB, Query) ! = true )
{
//Query = "DROP TABLE IF EXISTS `tabla_datos`";
//MySqlExecute(DB, Query);
Query = "CREATE TABLE IF NOT EXISTS " + symbol + "(id int NOT NULL AUTO_INCREMENT PRIMARY KEY, AccountNumber int, "
+ "Symbol char(20), Bid double, Ask double, Spread doble," + "Memo char(50)
+ "Memo char(50), "
+ "Time datetime) ENGINE=MEMORY DEFAULT CHARSET= utf8 ";
MySqlExecute(DB, Consulta);
}
}
¡¡¡¡MySqlCursorClose(Cursor1); // NUNCA OLVIDE CERRAR CURSOR !!!!
}
}
}
-->
Ok, veo que ha escrito un asesor experto para estos fines, y está escrito sin recomendaciones que he publicado en el artículo.
Por lo tanto, vamos a ir paso a paso: 1. La llamada de " DB = cMySqlConnect
1. La llamada de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " debe hacerse dentro de OnInit() en lugar de OnTick(). 2. Está utilizando cMySqlConnect.
2. Estás usando cMySqlConnect - es una función importada de la DLL, tienes que usar la función MySqlConnect en lugar de ¡ cMySqlConnect !
3. Debe llamar a la función MySqlDisconnect dentro de la función estándar OnDeinit().
4. Debe verificar el identificador de conexión a la base de datos dentro de la función estándar OnTick() para asegurarse que la conexión fue exitosa.
Finalmente se verá así.
El problema es que no se puede usar en un mt4 para mas de dos simbolos, si se usa en un solo simbolo, es normal. Cuando se usa en cuatro o mas, funciona bien, pero despues de unos minutos, imprime el problema "OnTick()". minutos, imprime el problema "Access violation read to 0x0000000B in '...MQLMySQL.db'". .MQLMySQL.dll'"
Los exambles son todos los scripts, se ejecuta sólo una vez, Usted puede tratar de uno de los expertos llamar a la dll en cuatro o más símbolos en uno o dos mt4, Usted puede encontrar el problema.
¿Será que la dll necesita un memeoy release o garbe collection?
CRT vuelque las fugas tras la destrucc ión estática de los datos, y esto provoca ο informes de fugas espurios para objetos que asignaron memoria antes de que se inicializara MFC y que, por tanto, se destruyen tras la salida de MFC. nbsp;
informes de fugas espurias para objetos que asignaron memoria antes de que se inicializara el MFC
y que, por tanto, se destruyen después de la salida del MFC. Esto se observa con frecuencia en
cuando se utiliza la DLL de MFC en un programa que también utiliza
la DLL de tiempo de ejecución de C++.
Hola de nuevo.
Basado en el código que ha proporcionado supongo que eres nuevo en MQL.
Lo siento, no tengo tiempo para enseñarte, pero tengo tiempo para probar el software que he desarrollado.
Lo siento, no tengo tiempo para enseñarle, pero tengo tiempo para probar el software que he desarrollado. Por lo tanto, aquí están los registros adjuntos.
Han construir pruebas de EA para usted, basado en su lógica: cada tabla definida para cada par de divisas y puede mantener los datos de mercado en línea para diferentes cuentas.
Usted puede inspeccionar los registros, ningún error "Violación de acceso ..." se planteó. Usted puede inspeccionar los registros, ningún error "Violación de acceso ..." se planteó.
El problema no está en la biblioteca MQLMySQL.
Probando EA.
Esta es la lógica correcta de usar la librería.
Debido a la optimización usted puede incluso no usar la sentencia SELECT, solo ejecutar la sentencia UPDATE, entonces verifique si (MySqlRowsAffected()==0) significa que ninguna fila fue afectada. Tiene ~100% de actualizaciones, así que aplique la sentencia INSERT.
Usted tiene ~100% de las actualizaciones, por lo que esta solución puede aumentar el rendimiento y reducir el tráfico de red.
Y al final, los códigos fuente completos del proyecto (incluyendo el desarrollo de DLL) se ha adjuntado al artículo, usted puede cambiar a su manera.
Si usted llena que el problema en MqlMySQL.DLL de todos modos, se puede depurar y arreglar por ti mismo.
Saludos cordiales, Eugene
Eugene
Gran trabajo, muchas gracias Eugeniy.
Sus códigos me ayudan mucho, puedo ahorrar mucho tiempo. He intentado hacer INSERT, SELECT, UPDATE y DELETE consulta con éxito. Si no me equivoco, el "Cursor" es necesario sólo para la consulta SELECT?
= pedma
Gran trabajo, muchas gracias Eugeniy.
Sus códigos me ayudan mucho, puedo ahorrar mucho tiempo. He intentado hacer INSERT, SELECT, UPDATE y DELETE consulta con éxito. Si no me equivoco, el "Cursor" es necesario sólo para la consulta SELECT?
= pedma
¡Exactamente hombre!
Los cursores utilizados sólo para la selección de datos porque tenemos que recibir los datos de la base de datos en la variable MQL, no sólo para enviar el comando sql a la base de datos.
Me alegro de que mi solución le ayuda.
Mucha suerte,
Eugene
Hola Eugene,
Me preguntaba si usted todavía hace proyectos de desarrollo pagados como estoy buscando para crear un copiador de comercio a distancia que se integra en un EA que voy a vender?
He mirado en Upwork y no parece que hayas realizado ningún proyecto freelance recientemente.
Hice un intento yo mismo usando la librería que creaste, pero no salió demasiado bien. Aunque estoy seguro de que sería fácil para alguien con tu capacidad de programación.
Gracias de antemano,
James
Hola Eugene,
Me preguntaba si usted todavía hace proyectos de desarrollo pagados como estoy buscando para crear un copiador de comercio a distancia que se integra en un EA que voy a vender?
He mirado en Upwork y no parece que hayas realizado ningún proyecto freelance recientemente.
Hice un intento yo mismo usando la librería que creaste, pero no salió demasiado bien. Aunque estoy seguro de que sería fácil para alguien con tu capacidad de programación.
Gracias de antemano,
James
Hola James
Estoy trabajando en Upwork sólo en un gran proyecto en la actualidad. Por lo tanto, no tienen mucho tiempo libre en la actualidad. ¿Cuál es el problema que tienes con las librerías? ¿Cómo puedo ayudarte?