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.
... your code
int DB = -1; // identificador de la base de datos//--
... your code
intOnInit()
{
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);
if (DB != -1)
{
// ¡La conexión ha tenido éxito!// aquí tienes que definir la lógica de creación de la tabla
}
return(INIT_SUCCEEDED);
}
voidOnDeinit(constint reason)
{
MySqlDisconnect(DB);
}
voidOnTick()
{
// primer comando.if (DB==-1) return; // no realizar ninguna acción cuando no hay conexión// aquí su código sin llamada a cMySqlConnect
}
You have to rebuild your code based on the requirements of project, as I see the currently there is no clear logic, everything messed up.
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í.
Gracias, lo intentaré de nuevo y daré el resultado.
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
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?
MFC vuelca las fuga s prematuramente al salir, en lugar de esperar a que 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++.
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.
//+------------------------------------------------------------------+//|& nbsp;   DFTest.mq4//|& Copyright 2014, MetaQuotes Software Corp.//|& nbsp;   ; http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2014, MetaQuotes Software Corp."#property link"http://www.mql5.com"#property version"1.00"#property strict#include <MQLMySQL.mqh>
inputstring Host = "localhost";
inputstring User = "root";
inputstring Password = "ioctrl";
inputstring Database = "mysql";
inputint Port = 3306;
inputstring Socket = "";
inputint ClientFlag = 0;
inputint Timer = 1; // Temporizador (segundos) no utilizado ahoraint DB;
intOnInit()
{
SQLTrace = true; // para ver todas las consultas que se enviarán a la base de datosEventSetTimer(Timer);
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);
if( DB == -1 )
{
Print("Database is not connected! Error: ", MySqlErrorDescription);
return (INIT_FAILED);
}
// crear tabla si no existestring cmd;
cmd = "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";
if (!MySqlExecute(DB, cmd))
{
Print ("Table creation error: ",MySqlErrorDescription);
return (INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
voidOnDeinit(constint reason)
{
MySqlDisconnect(DB);
EventKillTimer();
}
voidOnTimer()
{
// nunca se debe llamar a OnTick desde OnTimer y viceversa.// el objetivo de estas 2 funciones es diferente
}
voidOnTick()
{
int account;
string symbol;
double spread;
string Query, cmd;
int Cursor;
int Rows;
if (DB == -1)
{
Comment("Database is not connected ... ");
return;
}
if ( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 )
{
account = AccountNumber();
symbol = "`"+Symbol()+"`"; // si tienes que usarlo como nombre de tabla tienes que usar comillas como buena práctica para base de datos MySQL
spread = (Ask - Bid);
// posiblemente sería mejor utilizar algo como esto: admission = MarketInfo(symbol, MODE_SPREAD);
Query = "SELECT * FROM " + symbol + " where AccountNumber = " + (string)account;
Cursor = MySqlCursorOpen(DB, Query);
if (Cursor >= 0)
{
Rows = MySqlCursorRows(Cursor);
if ( Rows > 0 )
{
cmd = "update " + symbol + " set Bid = "+(string)Bid + ", Ask = " + (string)Ask
+ ", Spread = " + DoubleToStr(spread, Digits)
+ ", Time = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS) +"' where AccountNumber = " + (string)account;
}
else
{
cmd = "INSERT INTO " + symbol + "(AccountNumber, Symbol, Bid, Ask, Spread, Memo, Time) VALUES ("
+ (string)account + ", \'" + symbol + "\', "+DoubleToStr(Bid,Digits)+","+ DoubleToStr(Ask,Digits) + "," + DoubleToStr(spread, Digits)
+ ", \'" + AccountCompany() +"\', \'"+TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')";
}
if (!MySqlExecute(DB, cmd))
{
Print("Updating error: ",MySqlErrorDescription);
Print (cmd);
}
MySqlCursorClose(Cursor);
}
}
}
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.
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
//+------------------------------------------------------------------+//|MySQL-006.mq4//|Copyright 2014, Eugene Lugovoy |//| http://www.fxcodexlab.com ||//| Consulta Seleccionar, Insertar, Actualizar y Eliminar|//| modificado por : pedma|//+------------------------------------------------------------------+#property copyright"Copyright 2014, Eugene Lugovoy."#property link"http://www.fxcodexlab.com"#property version"1.00"#property strict#include <MQLMySQL.mqh>
string INI;
//+------------------------------------------------------------------+//| Función de inicio del programa de script|//+------------------------------------------------------------------+voidOnStart() {
string Host, User, Password, Database, Socket; // credenciales de la base de datosint Port,ClientFlag;
int DB; // identificador de la base de datosPrint (MySqlVersion());
INI = "C:\\This\\Must\\be\\Real\\Path\\To\\MyConnection.ini";
// lectura de las credenciales de la base de datos desde el archivo INI
Host = ReadIni(INI, "MYSQL", "Host");
User = ReadIni(INI, "MYSQL", "User");
Password = ReadIni(INI, "MYSQL", "Password");
Database = ReadIni(INI, "MYSQL", "Database");
Port = StrToInteger(ReadIni(INI, "MYSQL", "Port"));
Socket = ReadIni(INI, "MYSQL", "Socket");
/// ClientFlag = StrToInteger(ReadIni(INI, "MYSQL", "ClientFlag"));
ClientFlag = CLIENT_MULTI_STATEMENTS;
Print ("Host: ",Host, ", User: ", User, ", Database: ",Database);
// abrir la conexión a la base de datosPrint ("Connecting...");
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);
if (DB == -1) { Print ("Connection failed! Error: "+MySqlErrorDescription); return; } else { Print ("Connected! DBID#",DB);}
// ejecución de la sentencia SELECTstring Query0,Query1,Query2,Query3,Query4,Query5,Query6,Query7;
int i,Cursor1,Cursor3,Cursor5,Cursor7,Rows,total;
int vId;
string vCode;
datetime vStartTime;
Query0 = "DROP TABLE IF EXISTS `test_table`";
MySqlExecute(DB, Query0);
Query0 = "CREATE TABLE `test_table` (id int, code varchar(50), start_date datetime)";
if (MySqlExecute(DB, Query0)) {
Print ("Table `test_table` created.");
}
else {
Print ("Table `test_table` cannot be created. Error: ", MySqlErrorDescription);
}
//--- insertar datos
Query0 = "INSERT INTO `test_table` (id, code, start_date) VALUES ("+(string)AccountNumber()+",\'ACCOUNT\',\'"+TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')";
if (MySqlExecute(DB, Query0)) {
Print ("Succeeded: ", Query0);
}
else {
Print ("Error: ", MySqlErrorDescription);
Print ("Query: ", Query0);
}
// multi-insert
Query0 = "INSERT INTO `test_table` (id, code, start_date) VALUES (1,\'EURUSD\',\'2014.01.01 00:00:01\');";
Query0 = Query0 + "INSERT INTO `test_table` (id, code, start_date) VALUES (2,\'EURJPY\',\'2014.01.02 00:02:00\');";
Query0 = Query0 + "INSERT INTO `test_table` (id, code, start_date) VALUES (3,\'USDJPY\',\'2014.01.03 03:00:00\');";
if (MySqlExecute(DB, Query0)) {
Print ("Succeeded! 3 rows has been inserted by one query.");
}
else {
Print ("Error of multiple statements: ", MySqlErrorDescription);
}
//--- select query, need Cursor ----
Query1 = "SELECT id, code, start_date FROM `test_table`";
Print ("SQL> ", Query1);
Cursor1 = MySqlCursorOpen(DB, Query1);
if (Cursor1 >= 0) {
Rows = MySqlCursorRows(Cursor1);
Print (Rows, " row(s) selected.");
for (i=0; i<Rows; i++) {
if (MySqlCursorFetchRow(Cursor1)) {
vId = MySqlGetFieldAsInt(Cursor1, 0); // id
vCode = MySqlGetFieldAsString(Cursor1, 1); // código
vStartTime = MySqlGetFieldAsDatetime(Cursor1, 2); // hora_inicioPrint ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
}
total += vId;
}
//--- insertar datos basados en la consulta
Query2 = "INSERT INTO `test_table` (id, code, start_date) VALUES ("+(string)total+",\'ABCDEF\',\'"+TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\'); ";
if (MySqlExecute(DB, Query2)) {
Print ("Succeeded! 1 new row has been inserted.");
}
else {
Print ("Error inserting data based on SELECT query : ", MySqlErrorDescription);
}
//---
MySqlCursorClose(Cursor1); // ¡¡¡NUNCA OLVIDES CERRAR EL CURSOR!!!
}
else {
Print ("Cursor1 opening failed. Error: ", MySqlErrorDescription);
}
//--- nuevo Cursor para select ---
Query3 = "SELECT id, code, start_date FROM `test_table`";
Print ("SQL> ", Query3);
Cursor3 = MySqlCursorOpen(DB, Query3);
if (Cursor3 >= 0) {
Rows = MySqlCursorRows(Cursor3);
Print (Rows, " row(s) selected.");
for (i=0; i<Rows; i++) {
if (MySqlCursorFetchRow(Cursor3)) {
vId = MySqlGetFieldAsInt(Cursor3, 0); // id
vCode = MySqlGetFieldAsString(Cursor3, 1); // código
vStartTime = MySqlGetFieldAsDatetime(Cursor3, 2); // hora_inicioPrint ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
}
}
//--- actualizar datos ----
Query4 = "UPDATE `test_table` SET id=8,code='PQRXYZ',start_date=\'"+TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\' WHERE code='ABCDEF'; ";
if (MySqlExecute(DB, Query4)) {
Print ("Succeeded! last row has been updated (code ABCDEF => PQRXYZ & new id=8.");
}
else {
Print ("Error updating data of last row : ", MySqlErrorDescription);
}
//---
MySqlCursorClose(Cursor3); // ¡¡¡NUNCA OLVIDES CERRAR EL CURSOR!!!
}
else {
Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
}
//--- mostrar resultado después de actualizado , se necesita nuevo cursor ----
Query5 = "SELECT id, code, start_date FROM `test_table`";
Print ("SQL> ", Query5);
Cursor5 = MySqlCursorOpen(DB, Query5);
if (Cursor5 >= 0) {
Rows = MySqlCursorRows(Cursor5);
Print (Rows, " row(s) selected.");
for (i=0; i<Rows; i++) {
if (MySqlCursorFetchRow(Cursor5)) {
vId = MySqlGetFieldAsInt(Cursor5, 0); // id
vCode = MySqlGetFieldAsString(Cursor5, 1); // código
vStartTime = MySqlGetFieldAsDatetime(Cursor5, 2); // hora_inicioPrint ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
}
}
//--- borrar consulta ---
Query6 = "DELETE FROM `test_table` WHERE id=3; ";
if (MySqlExecute(DB, Query6)) {
Print ("Succeeded! 1 row (id=3) has been deleted.");
}
else {
Print ("Error deleting 1 row : ", MySqlErrorDescription);
}
//---
MySqlCursorClose(Cursor5); // ¡¡¡NUNCA OLVIDES CERRAR EL CURSOR!!!
}
else {
Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
}
//--- mostrar resultado después de borrado, se necesita otro cursor ---
Query7 = "SELECT id, code, start_date FROM `test_table`";
Print ("SQL> ", Query7);
Cursor7 = MySqlCursorOpen(DB, Query7);
if (Cursor7 >= 0) {
Rows = MySqlCursorRows(Cursor7);
Print (Rows, " row(s) selected.");
for (i=0; i<Rows; i++) {
if (MySqlCursorFetchRow(Cursor7)) {
vId = MySqlGetFieldAsInt(Cursor7, 0); // id
vCode = MySqlGetFieldAsString(Cursor7, 1); // código
vStartTime = MySqlGetFieldAsDatetime(Cursor7, 2); // hora_inicioPrint ("ROW[",i,"]: id = ", vId, ", code = ", vCode, ", start_time = ", TimeToStr(vStartTime, TIME_DATE|TIME_SECONDS));
}
}
//---
MySqlCursorClose(Cursor7); // ¡¡¡NUNCA OLVIDES CERRAR EL CURSOR!!!
}
else {
Print ("Cursor3 opening failed. Error: ", MySqlErrorDescription);
}
//----- al final ----
MySqlDisconnect(DB);
Print ("Disconnected. Script done!");
}
//+------------------------------------------------------------------+
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 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.
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?
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
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?