Hay un par de adiciones importantes (y sugerencias de mejora:))
1. El autor utiliza la función sqlite_open(), pero existe una función más flexible sqlite_open_v2(), que puede trabajar con banderas de apertura, lo que significa: - controlar la delimitación de acceso al fichero de base de datos; - crear bases de datos temporales en memoria; - trabajar con la base de datos por URI, no sólo en el sistema de ficheros local, etc.
#define SQLITE_OPEN_READONLY 0x00000001 /* Ok para sqlite3_open_v2() */ #define SQLITE_OPEN_READWRITE 0x00000002 /* Ok para sqlite3_open_v2() */ #define SQLITE_OPEN_CREATE 0x00000004 /* Ok para sqlite3_open_v2() */ #define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* Sólo VFS */ #define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* Sólo VFS */ #define SQLITE_OPEN_AUTOPROXY 0x00000020 /* Sólo VFS */ #define SQLITE_OPEN_URI 0x00000040 /* Ok para sqlite3_open_v2() */ #define SQLITE_OPEN_MEMORY 0x00000080 /* Ok para sqlite3_open_v2() */ #define SQLITE_OPEN_MAIN_DB 0x00000100 /* Sólo VFS */ #define SQLITE_OPEN_TEMP_DB 0x00000200 /* Sólo VFS */ #define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* Sólo VFS */ #define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* Sólo VFS */ #define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* Sólo VFS */ #define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* Sólo VFS */ #define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* Sólo VFS */ #define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok para sqlite3_open_v2() */ #define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok para sqlite3_open_v2() */ #define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok para sqlite3_open_v2() */ #define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok para sqlite3_open_v2() */ #define SQLITE_OPEN_WAL 0x00080000 /* Sólo VFS */
2. He estado utilizando sqlite para resolver el problema de acelerar la optimización del EA cuando utiliza un indicador "pesado" en cálculos. La solución lógica en tal situación es guardar las lecturas del indicador para el período de optimización en la base de datos durante la primera ejecución, y durante las ejecuciones posteriores - extraer directamente las lecturas ya calculadas de la base de datos. Por lo tanto, si se utiliza el motor sqlite en la "forma predeterminada", el proceso de enviar muchas consultas INSERT y SELECT empieza a llevar mucho tiempo. Prácticamente se encontró que la salida es utilizar ya sea 1) base de datos en memoria, que no siempre es bueno si queremos dejar los datos para más tarde y 2) #pragma-directivas del motor SQL.
La segunda opción es más preferible, porque elimina la necesidad de volcar la base de datos de RAM a disco. Se hace de la siguiente manera: antes de crear la primera tabla en la base de datos es necesario enviarle las siguientes consultas:
"PRAGMA temp_store = MEMORY;" "PRAGMA page_size = 65536;" "PRAGMA cache_size = 16384;" "PRAGMA journal_mode = OFF;" "PRAGMA locking_mode = EXCLUSIVE;" "PRAGMA synchronous = OFF;"
Bueno, y después
"CREATE TABLE IF NOT EXISTS"etc.
¡Suerte a todos!
Hay un par de adiciones importantes (y sugerencias de mejora:))
1. El autor utiliza la función sqlite_open(), pero existe una función más flexible sqlite_open_v2() que puede trabajar con banderas de apertura, lo que significa: - controlar la delimitación de acceso al fichero de base de datos; - crear bases de datos temporales en memoria; - trabajar con la base de datos por URI, no sólo en el sistema de ficheros local, etc.
2. He estado utilizando sqlite para resolver el problema de acelerar la optimización del EA cuando utiliza un indicador "pesado" en cálculos. La solución lógica en tal situación es guardar las lecturas del indicador para el período de optimización en la base de datos durante la primera ejecución, y durante las ejecuciones posteriores - extraer directamente las lecturas ya calculadas de la base de datos. Por lo tanto, si se utiliza el motor sqlite en la "forma predeterminada", el proceso de enviar muchas consultas INSERT y SELECT empieza a llevar mucho tiempo. Prácticamente se encontró que la salida es utilizar ya sea 1) base de datos en memoria, que no siempre es bueno si queremos dejar los datos para más tarde y 2) #pragma-directivas del motor SQL.
La segunda opción es más preferible, porque elimina la necesidad de volcar la base de datos de RAM a disco. Se hace de la siguiente manera: antes de crear la primera tabla en la base de datos hay que enviarle las siguientes consultas:
Bien, y después puedes
etc.
¡Buena suerte a todos!
Los datos de las lecturas de los indicadores al ejecutar el tester son por naturaleza un simple array, un stream con acceso secuencial, por lo que es redundante y poco racional guardarlos y leerlos en base SQL.
Lo mismo puede decirse de la lista de operaciones comerciales propuesta por el autor del artículo como ejemplo de aplicación de SQLite.
Por lo tanto, debemos darnos cuenta de que la eficiencia del uso de modelos de datos relacionales, multienlazados, depende principalmente de las tareas que se resuelvan, y en estos ejemplos, en mi opinión, puede que sólo se "tire de las orejas".
.
Los datos de lecturas de indicadores durante la ejecución del tester son por su naturaleza un simple array, un stream con acceso serie, por lo que es redundante y poco racional guardarlos y leerlos en la base SQL.
Léalo de nuevo, aunque sea redundante y no racional: para optimizar el Asesor Experto
Es posible utilizarlo y es bueno. Otra cosa es que SQLite no debería utilizarse para proyectos serios. En cualquier caso, yo no lo recomendaría. Yo mismo me he enfrentado más de una vez al problema de las colisiones en él. Por ejemplo, si un robot de trading está conectado a diferentes gráficos, pero utiliza la misma base, y el acceso es a una tabla de propósito general (digamos registro/cambio de sesiones, cuentas), entonces en cualquier caso obtendrás un error como "tabla bloqueada". Y no importa que todas las transacciones se hayan completado, los cursores estén cerrados y la base de datos se haya abierto en modo compartido. Este problema también lo conocen los desarrolladores de SQLite.
En mi opinión, MS Access es la mejor de las bases de datos de archivos con soporte SQL. No importa cuánto regañes a la gente de small-soft, pero yo dejé SQLite por MS Access y no me arrepiento en absoluto. OleDB driver Jet 4.0 se instala incluso con Win98, para que los proyectos funcionen en todos los OC Windows.
¡En primer lugar muchas gracias por tu trabajo!
¡Lo porté a mql4 con éxito! (algunos #property strict, solucionan los errores de compilación).
Y como uso la plataforma de 32 bits tuve que comentar y eliminar algunas funciones de importación relacionadas con 64 bits. El terrminal usa early binding, asi que 64 bit-dll tambien intenta cargarse durante la carga del programa. (aunque no se usa, solo la 32bit.dll.).Da error.
Pero de todas formas, ¡me gusta tu implementación! (Me gustaria poder escribir un programa tan bueno como el tuyo).
El script no funciona, no funciona fuera de la caja.
fumate el manual si no entiendes que hacer y como hacerlo.
- 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 SQL y MQL5: Trabajando con la base de datos SQLite:
El presente artículo va dirigido a programadores a los que les interesa el uso de SQL en sus proyectos. En el mismo, presentamos a los lectores la funcionalidad de SQLite y sus ventajas. El artículo no exige de conocimientos previos de SQLite, pero si sería de agradecer un conocimiento mínimo de SQL.
Autor: o_O