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

 
Yuriy Asaulenko:

Ese es otro tema).

Yo no armo un equipo. Camino por mi cuenta, hago lo que me parece correcto e interesante, y no asumo ningún compromiso.

Si alguien quiere salir conmigo, no hay objeción y tampoco compromiso.

No hablo del equipo, sino del motor en forma de aplicación EXE para enlazar Python y R con MQL, que sugerí en ese hilo.
 
Ivan Negreshniy:
No me refiero al comando sino al motor en forma de aplicación EXE para enlazar Python y R con MQL que sugerí en ese hilo.

Tendrás tus EXE - no hay problema en Python. R, lo siento, no lo uso - imho, un gran vertedero de todo y cualquier cosa. Si hay diamantes en este vertedero, su búsqueda es problemática. A menos que SanSanych me lo diga).

Me ocupo sobre todo de las redes neuronales, y hay bastantes sin R.

Pero, en realidad, la metodología de interacción está planeada para ser universal, y probablemente se puede utilizar para R también.

 
Ahora que tenemos una aplicación preconstruida, es el momento de intercambiar datos entre el terminal y Python.
Para empezar, elegiremos el tipo de intercambio más sencillo: el intercambio de datos a través de archivos.
Ahora muchos se reirán en sus tinteros, y en vano. Pues que lo hagan).
1. Durante la construcción y la depuración de la aplicación, el intercambio de archivos es lo más eficaz, ya que no requiere ningún esfuerzo de actualización. Y una vez construida la aplicación, puede ser sustituida por otra.
2. En la mayoría de las CTs preparadas, la velocidad de intercambio de archivos es más que suficiente. 50-100 ms. ¿No es suficiente para ti?
3. Cuando se intercambian archivos a través de la tasa de intercambio RAM-Disco se alcanza 1,5 GByte/s. Es imposible medir la latencia en absoluto.
En definitiva, escúpelo y olvídate de los rivales).
Bueno, en realidad, está previsto otro intercambio para la última fase, si nosotros o el tema están a la altura).

Intercambiaremos con el terminal a través de archivos CSV. Hasta ahora un camino - desde el terminal a la aplicación.
Para evitar conflictos de intereses, utilizaremos archivos semáforos.
Entonces, dejemos que DataTS.csv sea el archivo de datos, y STS.s sea el archivo de semáforos.
El terminal escribe los datos en DataTS.csv y, tras la escritura, crea un archivo semáforo vacío STS.s.
La aplicación comprueba la presencia del archivo STS.s semáforo, luego lee el archivo DataTS.csv, y luego borra el archivo STS.s semáforo.
A continuación, el terminal detecta la desaparición del archivo semáforo STS.s y sólo entonces escribe los nuevos datos en el archivo DataTS.csv.
Posibles variaciones, dependiendo de las funciones de los archivos Phyton y MT - aún no he mirado.
Sin embargo, no todo a la vez, primero tenemos que trabajar con Python, y determinar sus capacidades.
Eso es lo que haremos.
 
Ha habido algunos cambios desde mi última visita. La aplicación es ahora completamente funcional - todo lo descrito en el post anterior ha sido implementado. Ahora todos los botones funcionan y el intercambio de archivos está implementado.
- El botón Borrar borra la ventana de salida,
- El botón Enviar envía la línea de la ventana de entrada a la ventana de salida,
- el botón de inicio activa el intercambio de archivos,
- El botón Stop detiene el intercambio de archivos.
Esto es fácil de comprobar. Creamos la carpeta C:\PyTS, colocamos el archivo de datos - DFile.csv, colocamos el archivo semáforo - SFile.tx. Nuestro programa Python detecta el archivo semáforo, lee el archivo de datos, lo muestra en la ventana de salida y borra el archivo semáforo.
Ahora puede cambiar los datos en DFile.csv y crear un nuevo archivo semáforo, entonces el programa leerá y emitirá los nuevos datos.
Se puede escribir un simple programa MQL, cambiar la carpeta de lectura en nuestro programa a la carpeta donde escribe MT, y entonces se puede evaluar la velocidad de intercambio, los posibles vacíos de datos y muchas otras cosas.
La única función responsable del intercambio de archivos es FileExchange(). Se implementa en un hilo adicional - el hilo del temporizador. Podemos tener decenas de estos hilos y funciones y no afectarán a la aplicación de ninguna manera, es decir, podemos disponer de decenas de canales de intercambio de datos paralelos e independientes.
En este momento el temporizador está ajustado a 10.0s - puedes ajustarlo a 0.001s, ver documentación.
Bueno, si realmente quieres medir la velocidad y otras características - elimina las funciones de depuración print() en la ruta de intercambio - reducen significativamente la velocidad.
El código del programa Python está en el archivo adjunto. Como siempre, renómbralo a .py
Archivos adjuntos:
PyTS_1.0.txt  3 kb
 

Hablamos de intercambiar archivos CSV, pero la versión 1.0 (ver post anterior) sólo abre y lee archivos. La siguiente versión - 1.01, después de algunas modificaciones, lee archivos CSV y los almacena en la variable InData.

En realidad todas las modificaciones:

def FileExchange():
    global Change
    if Change==True:
        if os.path.exists(SFile):
            print("SFile.txt is")
            if os.path.exists(DFile):
                print("DFile.csv is")
                InData = csv.reader(open(DFile, 'r'))
                data_read = [row for row in InData]
                print(data_read)
                os.remove(SFile)
            else:
                print("DFile.csv no")
        else:
            print("SFile.txt no")
        print('Вывод таймера')
        timer =threading.Timer(10.0,FileExchange)
        timer.start()

Sólo se han cambiado 3 líneas + la conexión de la biblioteca csv.

Y también controlar la salida del contenido CSV desde la variable InData:

In [18]: [['04.08.2018 14:00', ' 1300', ' 1295', '1310', '1305', '100'], ['04.08.2018 14:10', ' 1307', ' 1297', '1320', '1315', '150']]

Ahora los valores de las filas están disponibles por índices, tipo - fila, columna.

Bueno, y el código en sí mismo - ver el archivo adjunto.

Archivos adjuntos:
PyTS_1.01.txt  3 kb
 
Yuriy Asaulenko:

Hablamos de intercambiar archivos CSV, pero la versión 1.0 (ver post anterior) sólo abre y lee archivos. La siguiente versión - 1.01, después de algunas modificaciones, lee archivos CSV y los almacena en la variable InData.

En realidad todas las modificaciones:

Sólo 3 líneas cambiadas + conexión de la biblioteca csv.

Y también controlar la salida del contenido CSV desde la variable InData:

Ahora los valores de las filas están disponibles por índices, tipo - fila, columna.

Bueno, y el código en sí mismo - ver el archivo adjunto.

El uso de archivos compartidos no es la mejor solución. Las operaciones de archivo son muy lentas. Hay que conectar un disco RAM para dicho intercambio.
 
Grigoriy Chaunin:
El uso de archivos para el intercambio no es la mejor solución. Las operaciones de archivo son muy lentas. Hay que conectar un disco RAM para dicho intercambio.
¿Puedes dar las características de rendimiento del intercambio de archivos (lo que hay) y las tareas requeridas (lo que se necesita)?


Y yo, por mi parte, diré que son extremadamente rápidos, no lentos. Sin características numéricas, tanto tus afirmaciones como las mías no se basan en nada y, por tanto, no tienen sentido en la tarea que nos ocupa. Se necesitan características tanto del intercambio de archivos como de las necesidades del problema, y sólo después de compararlas se puede llegar a conclusiones válidas. Dado que Yuri Asaulenko decidió que los archivos son adecuados, creo que conoce mejor el volumen previsto de transferencia de datos y el tiempo de procesamiento.

En general, los archivos de disco tienen una gran ventaja sobre la memoria volátil: se almacenan en el disco de apagado y se puede acceder a ellos después de una semana o un año. Controlar, analizar, verificar, simplemente observar.

 
Grigoriy Chaunin:
Utilizar archivos para intercambiar no es la mejor solución. Las operaciones de archivo son muy lentas. Hay que conectar un disco RAM para dicho intercambio.

Este tema ya ha sido discutido en este hilo, en posts anteriores, incluyendo el posible uso de RAM-Disco, si fuera necesario:

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

Cómo hacer un sistema de trading para MT usando Python.

Yuriy Asaulenko, 2018.08.01 19:33

Ahora que ya tenemos el plano de la aplicación, es el momento de dedicarnos al intercambio de datos del terminal con Python.
En primer lugar, elegiremos el tipo de intercambio más sencillo: el intercambio de datos a través de archivos.
Ahora muchos se reirán en sus tinteros, y en vano. Pues que lo hagan).
1. Durante la construcción y la depuración de la aplicación, el intercambio de archivos es lo más eficaz, ya que no requiere ningún esfuerzo de actualización. Y una vez construida la aplicación, puede ser sustituida por otra.
2. En la mayoría de las CTs preparadas, la velocidad de intercambio de archivos es más que suficiente. 50-100 ms. ¿No es suficiente para ti?
3. Cuando se intercambian archivos a través de la tasa de intercambio RAM-Disco se alcanza 1,5 GByte/s. Es imposible medir la latencia en absoluto.
En definitiva, escúpelo y olvídate de los rivales).
Bueno, en realidad, está previsto otro intercambio para la última fase, si nosotros o el tema están a la altura).
También en uno de los primeros mensajes del hilo.
 

Presento una nueva versión de PyTS 1.02. Esta versión es funcionalmente equivalente a la versión 1.01, pero los controles innecesarios de print() fueron eliminados del código y el enfoque de clase comenzó a ser implementado (Lenin escribió - el enfoque debe estar basado en la clase) - el procesamiento de archivos CSV está totalmente asignado a la clase - cCSVJob.

Archivo Zip en el adjunto, donde también encontrará todas las versiones anteriores del programa, así como, en la carpeta PyTS, los archivos necesarios con los datos de origen para las pruebas.

Archivos adjuntos:
PyTS.zip  6 kb