Haciendo un sistema de trading en Python para MT. - página 5

 

Ayer me fascinó de repente la base de datosSQLite. Existe una interfaz de Python preparada para ello: https://docs.python.org/3.6/library/sqlite3.html.

Como resultado, hasta altas horas de la noche leí la documentación tanto de la base de datos en sí como de la interfaz de Python. Para resolver parte de la confusión, en el proceso hice un par de programas completamente inútiles para SQLite. En general, fascinado. Desperdiciado antes que descuidado. Lo que he aprendido por primera vez es que la BD SQLite se puede organizar en memoria - con un comando: conn = sqlite3.connect(":memory:") - esto es en Python. Eso es todo lo que se necesita. Luego, en algunas consultas, crear tablas y trabajar.

Solía utilizar MS SQL Server o BD Access para el mismo propósito, y organizaba la base de datos en memoria a través de las tablas DataTable de las librerías NET. Y aquí, un DLL de 1,5 MB y un comando,))), y no tienes que hacer nada.

Ahora, ¿para qué sirve? No es necesario, es necesario. Mientras su sistema está contando algo allí, llegan nuevos datos de la bolsa: el mercado, las operaciones, las cotizaciones, y los mete en la base de datos en la memoria. Y cuando el sistema necesita nuevos datos, los tiene todos aquí, a mano, en la memoria. Lo coges y lo usas. No hay que esperar a que haya garrapatas y demás. Además, cuando ocurre algo, siempre puedes dejar de pensar en los cálculos y ocuparte de ello. De nuevo, toda la información ya está ahí, en tu memoria. Por supuesto, necesitas eventos e hilos de usuario, pero no es un problema en ningún sitio.

Pues bien, la información de la base de datos de la memoria se guarda en la base de datos principal en segundo plano.

Ah, y SQLite, aunque es pequeño, admite el acceso de lectura/escritura multiusuario. Y en general, casi todo es como los adultos: hay algunas limitaciones, pero en la mayoría de los casos son insignificantes o no interfieren en absoluto.

 

Empezó a hacer la base de datos SQLite, no está mal hacer algo útil. Empecemos por importar un archivo CSV a la base de datos.

He aquí un fragmento del archivo en sí, unas 55 mil líneas en total.

<TICKER>,<PER>,<DATE>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>
SPFB.SBRF-12.17,1,01/09/17,10:01:00,18828.0000000,18838.0000000,18792.0000000,18838.0000000,25
SPFB.SBRF-12.17,1,01/09/17,10:02:00,18848.0000000,18858.0000000,18848.0000000,18858.0000000,2
SPFB.SBRF-12.17,1,01/09/17,10:03:00,18828.0000000,18828.0000000,18828.0000000,18828.0000000,2
SPFB.SBRF-12.17,1,01/09/17,10:04:00,18868.0000000,18868.0000000,18868.0000000,18868.0000000,2
SPFB.SBRF-12.17,1,01/09/17,10:05:00,18865.0000000,18879.0000000,18856.0000000,18879.0000000,10
SPFB.SBRF-12.17,1,01/09/17,10:06:00,18841.0000000,18851.0000000,18841.0000000,18851.0000000,3
SPFB.SBRF-12.17,1,01/09/17,10:07:00,18864.0000000,18864.0000000,18864.0000000,18864.0000000,1

Hemos descrito anteriormente cómo importar un archivo CSV en Python, no nos detendremos aquí. Como resultado, tenemos una cadena de título CSV y una cadena de datos.

Ahora el programa Python en sí:

# строка заголовка CSV
title=csv.title
# строки данных CSV
data=csv.InData
# подсоединяемся к БД. Если БД отсутствует, создается новая с эти именем - наш случай.
con=sql.connect('csvdb.db')
# создаем курсор
cur=con.cursor()
# выполняем запрос создания таблицы SBER и ее полей (для упрощения все поля текстовые)
cur.execute("""create table SBER ('%s' text, '%s' text,
                                  '%s' text, '%s' text, '%s' text,
                                   '%s' text, '%s' text, '%s' text,
                                    '%s' text)""" % tuple(title))

#заполняем таблицу данными из CSV строк
cur.executemany("insert into SBER values (?,?,?,?,?,?,?,?,?)", data)
#Записываем данные в таблицу БД
con.commit()
#если БД больше не нужна, закрываем соединение.
con.close()

Miramos la tabla SBER en SQLiteStudio:

Sí, toda la diversión es de 3-4s desde el inicio del programa, incluyendo la apertura y la lectura del archivo CSV. Por cierto, el tamaño del archivo de la base de datos es menor que el de un archivo CSV similar. La base de datos completa es de 4,3 MB, el tamaño del CSV es de 5,2 MB.

Bueno, el resto se hace de la misma manera)).

 

Continuemos con nuestro impopular tema con los nativos.

Hay hilos regulares en el foro sobre la lectura de datos de archivos CSV. Sólo en la última semana ya ha habido dos, que necesitábamos leer el penúltimo par de líneas.

La última vez escribimos datos de un archivo CSV en la base de datos, hoy vamos a resolver el problema de la lectura de filas de la base de datos.

En la base de datos hay unas 55 mil filas en nuestra tabla. Intentemos leer no la última, sino alguna 27568. Para ello vamos a escribir una consulta SQL y enviarla a la base de datos:

#отметка времени начала 
Tb=dt.datetime.today()
#готовим и передаем в БД SQL запрос
cur.execute('select * from SBER where id=27568')
#читаем ответ, одну строку
s=cur.fetchone()
#отметка времени конца
Te=dt.datetime.today()
#все распечатываем.
print('Tb=' + str(Tb) +', Te=' + str(Te))
print('Te-Tb='+str(Te-Tb))
print(s)

Eso es todo. Tenemos el resultado:

Tb=2018-10-05 21:53:11.185492, Te=2018-10-05 21:53:11.188496
Te-Tb=0:00:00.003004
(27568, 'SPFB.SBRF-12.17', '1', '27/10/17', '10:55:00', '19692.0', '19708.0', '19691.0', '19704.0', '1123')

Tiempo de ejecución ~0,003004 seg.

Hagamos la tarea más difícil. Buscar líneas, donde Close=22730.0000000

Todo es igual, pero la consulta parece diferente.

#это значение точно есть в строке №55420

cur.execute('select * from SBER where CLOSE=22730.0000000')
# читаем все строки, возвращаемые запросом.
s=cur.fetchall()

El resultado:

Tb=2018-10-05 22:03:09.797261, Te=2018-10-05 22:03:09.859763
Te-Tb=0:00:00.062502
[(38393, 'SPFB.SBRF-12.17', '1', '16/11/17', '18:16:00', '22708.0', '22734.0', '22707.0', '22730.0', '673'),
 (38932, 'SPFB.SBRF-12.17', '1', '17/11/17', '13:47:00', '22713.0', '22730.0', '22707.0', '22730.0', '194'), (38962,
 'SPFB.SBRF-12.17', '1', '17/11/17', '14:22:00', '22725.0', '22736.0', '22725.0', '22730.0', '362'),
 ...
 ...
 ...
 (55288, 'SPFB.SBRF-12.17', '1', '15/12/17', '21:18:00', '22723.0', '22732.0', '22723.0', '22730.0', '87'), 
(55289, 'SPFB.SBRF-12.17', '1', '15/12/17', '21:19:00', '22727.0', '22730.0', '22726.0', '22730.0', '17'),
 (55382, 'SPFB.SBRF-12.17', '1', '15/12/17', '23:05:00', '22731.0', '22731.0', '22730.0', '22730.0', '322'),
 (55420, 'SPFB.SBRF-12.17', '1', '15/12/17', '23:48:00', '22735.0', '22741.0', '22727.0', '22730.0', '315')]

Se han devuelto 20 líneas. Tiempo de ejecución ~0,0625c.

Por último, busquemos el precio más alto en la columna (campo) CERRAR

cur.execute('select max(CLOSE) from SBER')

Respuesta B:

Tb=2018-10-05 22:11:28.979472, Te=2018-10-05 22:11:29.014472
Te-Tb=0:00:00.035000
('23540.0',) //это самая высокая цена.

Bueno, y un tiempo de ejecución de -0.035s

Como ves, todo es muy sencillo y rápido. Si yo fuera un consumidor de archivos CSV, pensaría, por qué no escribir un DL con 5-6 funciones bajo MT, y usar DB en lugar de archivos CSV.

PD El archivo CSV en el que se manipuló la base de datos está en el archivo que se adjuntó hace unos post.
 

Sí, la vida no es fácil para los desarrolladores de MQL4-5. He buscado en Google si hay soluciones para conectar MT a SQLite. El artículo de SQL5.com SQL AND MQL5: WORKING WITH SQLITE DATABASE directamente desde MQ, y algunos materiales de terceros. La base de datos SQLite es demasiado complicada, y los programas no son tan sencillos, a diferencia de otros similares en Python.

De hecho, para trabajar con SQLite por primera vez es suficiente con importar sólo 7-8 funciones de alto nivel de SQLite a MQL. El resto, en su mayor parte, si es necesario, lo será en un futuro lejano. Este trabajo puede ser realizado por un programador de C++ en el peor de los casos en un par de días. Pero también puedes probar soluciones ya hechas.

PD: Mira el artículoSQL Y MQL5: TRABAJANDO CON LA BASE DE DATOS SQLITE. En realidad, tal vez funcione. Sólo utiliza la DLL x86 allí para preparar la DLL x64 para MT. El artículo es de 2014, después de todo. Pero si no me equivoco, ya existe una DLL de SQLite x64. Puedes intentar compilar con él.

 

Yuriy Asaulenko:

Sí, no es una vida fácil para los desarrolladores de MQL4-5...... Creo que es demasiado complicado, y los programas, a diferencia de los similares en Python, no son simples.

Imho, en Python los problemas no son menores: necesitas un historial, necesitas un gráfico de barras, necesitas indicadores técnicos... Yo también pensaría en un probador y en operar también....

Bueno, como dice el refrán: ¡todos los rotuladores son diferentes para cada gusto!

 
Igor Makanu:

En mi opinión, tienes tantos problemas con Python: necesitas un historial, necesitas un gráfico de barras, necesitas indicadores técnicos... Yo también pensaría en un probador y en el trading....

Bueno, como dice el refrán: ¡todos los rotuladores son diferentes para cada gusto!

La historia no es un problema y lo mismo ocurre con el bombeo. Los indicadores técnicos no son un problema, además sólo tengo mis propios indicadores. Si los necesitas, hay algoritmos sencillos allí.

Tengo una herramienta de dibujo de barras en Python. ¿Realmente lo necesito para mi autosistema? - No estoy escribiendo un terminal).

Y no es el primer sistema de este tipo, los hubo antes en VB Excel, y en C++, y en C#. En realidad, se elige Python debido a la amplitud de las bibliotecas y a que no se desea multiplicar el zoo a partir de la mezcla de diferentes lenguajes e interfaces para obtener un acceso a estas bibliotecas. Además, Python permite hacer modelado - para eso está diseñado, y es muy importante en el desarrollo de sistemas. Digamos que es un competidor directo de MathLab).

 
Yuriy Asaulenko:

Pregunta.

¿Es posible intercambiar mql-kim y python kanvas a través de un enlace?

Es fácil de hacer en C++, pero no sé en python.

 
Nikolai Semko:

Pregunta.

¿Es posible intercambiar mql-kim y python kanvas a través de un enlace?

Es fácil de hacer en C++, pero no sé en python.

No lo sé.

 

Buenas noticias))) -BetaMetaTrader 5 build 1910: Arrastrar y soltar libremente los gráficos y la biblioteca .Net en MQL5 . Ahora, cuando la beta está funcionando, no necesitas escribir nada para conectarte a SQLite (así como a muchas otras librerías). No necesitarás será DLL's.

Las bibliotecas de red SQLite ya están disponibles -http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

Ahora (o más bien más adelante, cuando aparezca la versión operativa de MT) podemos olvidarnos de la comunicación de MT con el sistema de comercio a través del intercambio de archivos y comunicarnos a través de la base de datos. Anteriormente en este hilo se demostró que es muy rápido y más que suficiente para la mayoría de los sistemas.

System.Data.SQLite: Home
  • system.data.sqlite.org
For the most recent news and developments, please see the news page. About System.Data.SQLite System.Data.SQLite is an ADO.NET provider for SQLite. System.Data.SQLite was started by Robert Simpson. Robert still has commit privileges on this repository but is no longer an active contributor. Development and maintenance work is now mostly...
 
Yuriy Asaulenko:

Buenas noticias))) -BetaMetaTrader 5 build 1910: Arrastrar y soltar libremente los gráficos y las librerías .Net en MQL5 . Ahora, cuando la beta esté funcionando, no es necesario escribir nada para conectarse a SQLite (al igual que muchas otras bibliotecas). No necesitarás será DLL's.

Las bibliotecas de red SQLite ya están disponibles -http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

Ahora (o más bien más adelante, cuando aparezca la versión operativa de MT) podemos olvidarnos de la comunicación de MT con el sistema de comercio a través del intercambio de archivos y comunicarnos a través de la base de datos. Anteriormente en este hilo se demostró que esto es muy rápido y más que suficiente para la mayoría de los sistemas.

Has entendido mal la noticia.

La compatibilidad con las bibliotecas .NET no significa que los controles de seguridad de las DLL estén desactivados. Los controles DLL siempre han funcionado y siempre funcionarán.

Sólo le permitimos cargar .NET sin ningún tipo de retoque. O, mejor dicho, nos tomamos todo el trabajo desordenado y no trivial de comunicarnos con la máquina virtual .NET y ocultamos todos los inconvenientes.


Sin embargo, hace tiempo que planeamos añadir soporte para SQlite en MQL5. Lo más probable es que lo hagamos.
Razón de la queja: