Discusión sobre el artículo "SQL y MQL5: Trabajando con la base de datos SQLite"

 

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.

SQL y MQL5: Trabajando con la base de datos SQLite

Autor: o_O

 

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!

 
alsu:

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

 
Existe un SGBD SQL columnar llamado MonetDB. Este es un SGBD gratuito diseñado para almacenar datos en columnas, esta base de datos tiene buena velocidad y fiabilidad. Si no me equivoco, cualquier DBMS SQL puede ser conectado a MT en la forma presentada en el tema.
 
revers45:

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.

 
Maravillosa idea y artículo, no pensé en eso. Sería genial sin embargo tener un soporte nativo en mql5, por lo que podría ser utilizado en el producto de mercado.
 

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

 
Estoy usando una versión de 64 bits de MetaTrader 5 y no soy capaz de obtener el código de trabajo. He intentado eliminar las referencias al código de 32 bits, pero sigue apareciendo un error "Sqlite3_32.dll" no se puede cargar. ¿Puedes decirme si el código hace referencia a esta dll en algún sitio? Necesito que funcione para 64 bits.
 

El script no funciona, fuera de la caja no funciona, a la basura este tipo de proyectos.

En la consola da https://s.mail.ru/9dWTNLqx6RT2/img-2015-11-10-20-15-44.png

В таблице https://s.mail.ru/QZyK6HwhMvo9/img-2015-11-10-20-16-18.png

Код https://s.mail.ru/2ooLdMg5MrHP/img-2015-11-10-20-16-56.png

 
delphiec:

El script no funciona, no funciona fuera de la caja.

fumate el manual si no entiendes que hacer y como hacerlo.