Saltar al contenido

Descarga de datos para tu trading desde Darwinex

    Desacrga de datos desde Darwinex

    En el artículo de conexión a Darwinex ya comentamos un poco como es el funcionamiento de ese broker y como nos puede apoyar si somos buenos con nuestra operativa. Hoy vamos a tratar como realizar la descarga de datos desde este broker para utilizar sus mismos datos.

    Como ya sabéis tener buenos datos es esencial para nuestro trabajo de trading algorítmico (como para todas las tareas realizadas en machine learning) y es importante que si vamos a trabajar con un broker realizar el entrenamiento con los datos del propio broker y de esta forma no caeremos en el error de utilizar otros datos que pueden no coincidir con los de Darwinex a la hora de operar.

    Darwinex no lo pone tan fácil como podemos estar acostumbrados a conseguir estos datos y es posible que esto sea una gran barrera para muchos, así que con esta entrada voy a intentar facilitaros un poco esta tarea para que podáis realizar entrenamientos también con este bróker. Y seguro que final os daréis cuenta que los datos que nos da Darwinex pueden darnos ventaja respecto a otras descarga de datos

    Conseguir el acceso

    El primer paso que tenemos que realizar para poder realizar la descarga de datos de Darwinex es solicitar el acceso a los mismos, que se realiza desde una página que se encuentra en la web: https://www.darwinex.com/es/tick-data y luego dando al botón “Obtener acceso FTP”.

    Página de la descarga de datos

    Para conseguir el acceso al FTP y la descarga de datos os piden los datos necesarios para abrir una cuenta, pero no os preocupéis, no hay necesidad de hacer un ingreso para conseguir descargar los datos y tener nuestro entorno de prueba.

    Una vez que rellenéis todos los datos en poco tiempo ya os enviarán un correo con vuestros datos para poder acceder al FTP. Donde os envían tanto la dirección a la que debemos conectar como vuestro nombre de usuario y contraseña (que es totalmente distinto al de vuestra cuenta ya que son dos entornos separados.

    Acceso al FTP

    Voy a explicar que es esto del FTP (resumidamente y sin tecnicismos) ya que puede parecer un poco raro al principio. Estamos más acostumbrados a que el acceso a los datos de la operativa sea por una API o incluso por una librería que nos permita descargar los datos directamente con Python y tenerlos en un formato cómodo para tratarlo. En este caso el acceso no es así, sino por FTP.

    FTP es un protocolo de transferencia de datos que nace incluso antes de lo que ahora conocemos como internet, y permite descargar ficheros de manera muy rápida y segura sin mucho esfuerzo. La forma de hacerlo es similar a navegar por el sistema de carpetas del servidor y cuando veamos un fichero que estamos buscando descargarlo sin problemas.

    Una vez que tenemos el usuario y contraseña ya podemos acceder al FTP de Darwinex para realizar la descarga de datos. Si queremos hacerlo de manera simple se podría hacer con herramientas como Filezilla, en la cual introduciendo nuestro usuario y contraseña podremos ver todo el directorio.

    Descarga con Filezilla

    En la imagen vemos como nos hemos conectado al FTP de Darwinex y hemos entrado en la carpeta de Apple (AAPL). Dentro de esta carpeta vamos que existen ficheros que son los ASKs y los BIDs de cada hora de operativa. Si descargamos, descomprimos (vienen en formato .gz que es un comprimido) y abrimos uno de estos ficheros veremos que es un .csv normal con tres datos: la fecha en un formato UNIX (que luego transformaremos), el precio de la compra, y la cantidad que se ha comprado:

    1618234260475,132.61,1500.0
    1618234260731,132.57,1500.0
    1618234260797,132.58,1500.0
    1618234261623,132.59,1500.0
    1618234261681,132.55,1500.0
    1618234262326,132.54,1500.0
    1618234262378,132.55,1500.0
    1618234262492,132.54,1500.0
    1618234262886,132.53,1500.0
    1618234263527,132.52,1500.0
    1618234263587,132.49,1500.0
    1618234264271,132.46,1500.0
    1618234264546,132.48,1500.0
    1618234264608,132.51,1500.0
    1618234264662,132.52,1500.0

    Simple, no? Veamos como conectarnos con Python y como hacer algo de magia con esto.

    Conexión y descarga de datos con Python

    La conexión con Python es muy sencillo solo necesitamos la librería “ftplib” para conectarnos así que esto será lo primero que hay que hacer:

    import ftplib

    Una vez instanciada la librería la conexión es muy sencilla. En una línea se realiza la conexión y se mete en una variable:

    # Abrir la conexión FTP
    ftp = ftplib.FTP('tickdata.darwinex.com', 'TU_USUARIO', 'TU_CONTRASEÑA')

    La forma de descargar una fichero es muy sencilla. Imaginemos que queremos descargar los datos de Apple de las 17:00 horas del día 27 de Junio de 2022 . Sería tan sencillo como este comando:

    # Descargamos el fichero
    ftp.retrbinary("RETR /AAPL/AAPL_BID_2022-06-27_17.log.gz" ,open("Apple.log", 'wb').write)

    Con esto ya tendremos un fichero llamado “Apple.log” en nuestro directorio local dentro de la carpeta donde ejecutemos este script. Pero como he dicho antes, el fichero es un .csv pero está comprimido, así que hay que hacer es descomprimirlo y leer el .csv como hacemos otras veces para transformarlo en formato dataframe.

    Para hacer esto hay que importar dos nuevas librerías, con la que descomprimiremos el fichero y, una vieja conocida, la librería pandas para el manejo de los datos.

    import gzip
    import pandas as pd
    
    # Abrimos el fichero con los logs
    with open('Apple.log', 'rb') as fd:
    		# Descomprimos el fichero
        gzip_fd = gzip.GzipFile(fileobj=fd)
    		# Metemos los datatos en un dataframe
        df = pd.read_csv(gzip_fd,names=["Date","Price","Size"])

    Con esto ya tenemos en la variable “df” el dataframe con los datos. Las columnas del dataframe las he puesto como “Date”, “Price” y “Size”, pero esto ya es gusto personal y podéis poner lo que os sea más cómodo. Si vemos que hay dentro de las variables pero todavía tendremos la fecha en el formato UNIX. Para transformarla solo hace falta esta línea:

    df['Date'] = pd.to_datetime(df['Date'],unit='ms')

    Y si vemos la variable “df” ya veremos algo así:

    Datos descargados

    Con esto ya podríamos empezar a trabajar ya que lo tenemos en un formato perfecto para empezar a realizar nuestro Machine learning o Aprendizaje por refuerzo.

    Descargar más datos

    Con lo anterior hemos conseguido realizar la descarga de datos, pero solo un fichero de una hora y la hemos puesto en el formato correcto para realizar nuestro trabajo, pero ¿Si quiero descargar más datos, como una semana entera, cómo hago eso? Vamos a ello.

    La forma de hacerlo sería creando un bucle que me descargue todos los datos que necesitemos.

    from datetime import date, timedelta
    import os
    
    fecha_inicio = "26-06-2022"
    fecha_fin = "27-06-2022"
    
    # Creo la carpeta data para guardar los datos
    try:
      os.mkdir('data')
    except:
      pass
    
    # Preparo las fechas para trabajar más fácil con ellas
    fecha_inicio_split = fecha_inicio.split("-")
    fecha_fin_split = fecha_fin.split("-")
    fecha_inicio_datetime = date(int(fecha_inicio_split[2]), int(fecha_inicio_split[1]), int(fecha_inicio_split[0]))
    fecha_fin_datetime = date(int(fecha_fin_split[2]), int(fecha_fin_split[1]), int(fecha_fin_split[0]))
    
    # Calculo la diferencia entre las fechas para ir hacíando el bucle
    # que va descargar todos los datos
    delta = fecha_fin_datetime - fecha_inicio_datetime
    for i in range(delta.days + 1):
        day = fecha_inicio_datetime + timedelta(days=i)
        # Pongo para que descargue todas las horas para casos de divisas
        # Si no encuentra el fichero (al ser una acción normal) continua
        for i in range(24):
          hora = str(i).rjust(2, '0')
          try:
            download_file = TICKER+"_BID_"+str(day.year)+"-"+str(day.month).rjust(2, '0')+"-"+str(day.day).rjust(2, '0')+"_"+hora+".log.gz"
            ftp.retrbinary("RETR /"+TICKER+"/"+download_file ,open("data/"+download_file, 'wb').write)
          except:
            pass

    Con este código indicamos al principio las fechas desde las que queremos descargar y luego el código hace el resto.

    Para leer todo lo descargado y meterlo en un dataframe se haría lo siguiente:

    from os import listdir
    from os.path import isfile, join
    onlyfiles = [f for f in listdir("data") if isfile(join("data", f))]
    
    appended_data = []
    
    for stock_file in onlyfiles:
      with open("data/"+stock_file, 'rb') as fd:
          gzip_fd = gzip.GzipFile(fileobj=fd)
          appended_data.append(pd.read_csv(gzip_fd,names=["Date","Price","Size"]))
    
    df_stock = pd.concat(appended_data)
    df_stock['Date'] = pd.to_datetime(df_stock['Date'],unit='ms')

    De esta forma en la variable df_stock tenemos ya el dataframe con el que ya podemos empezar a trabajar para realizar todos nuestros proyectos.

    Datos de más días descargados

    Sacar los datos OLHC en diferentes rangos temporales

    Vale, hasta el momento tenemos toda la operativa pero normalmente estamos acostumbrados a trabajar con los datos de las velas japonesas y con los precios de apertura, máximo, mínimo y cierre (o olhc). ¿Como sacamos estos datos?

    Pues con pandas esto se hace muy fácil. Lo único es que hay que poner la fecha como el índice del dataframe pero una vez hecho esto lo resolvemos en par de líneas. Vamos a ver un ejemplo de como hacerlo para lo que serían velas de 15 minutos.

    df_stock = df_stock.set_index('Date')
    stock_15min_ohlc = df_stock['Price'].resample('15Min').ohlc(_method='ohlc')
    stock_15min_ohlc['Volume'] = df_stock['Size'].resample('15Min').sum()

    Una vez hecho esto ya podemos ver que en la variable stock_15min_ohlc tenemos todos los datos en el formato ohlc listo para trabajar.

    Datos descargados en formato ohlc

    Conclusiones

    Aunque al principio parece complicado la descarga de datos de Darwinex vemos que al final los datos que nos permiten descargar nos da más información de la que nos ofrecen otras plataformas al darnos los datos de cada movimiento del mercado.

    Con los scripts que os he dejado aquí y con la conexión del otro artículo ya podéis empezar a trabajar utilizando Darwinex en todo el proceso, desde los datos a la operativa y hacer vuestro propio robot de trading.

    Como siempre, si tenéis cualquier duda o mejora del artículo no dudéis en poneros en contacto conmigo y os contestaré lo antes posible.

    Etiquetas:

    11 comentarios en «Descarga de datos para tu trading desde Darwinex»

    1. Hola Iván,

      Soy cliente de Darwinex, y a través de ellos te he conocido.

      No he podido ver mucho de todo el contenido que tienes, pero felicidades por el gran trabajo que aportas, es muy interesante.

      Yo soy novato en esto y estoy ya optimizando mi primer robot que me ha llevado tiempo perfeccionarlo, y también el comprobar los datos estadísticos históricos que me he descargado de Dukascopy en QuantDataManager y les he aplicado las propiedades del broker Darwinex para que se asemejen lo máximo posible a la realidad. Los he descargado primero en temporalidad de 1M y luego en tick y a la hora de exportar a MT4 le he añadido el archivo de properties de Darwinex y los he comparado, etc. pero no he hecho lo que tú dices en esta página, primero porque sólo conocía un vídeo en inglés que no entendía y ahora que conozco tu forma de hacerlo, porque estoy ya probándolo en demo después de haber hecho los backtests y optimizaciones que creía necesarias para comenzar.

      Llegado a este punto, quería hacerte las siguientes preguntas si eres tan amable, sólo para saber si debería replantearme de nuevo el estudio:
      -¿has comprobado tú también los datos estadísticos de la mismas fuentes que yo?
      -si es que sí ¿los has comparado con los descargados de Darwinex con Python?
      -y en cualquier caso ¿te parece fiable como lo he hecho yo o debería hacerlo como lo has hecho tú?

      Evidentemente, se nota que no tengo ganas de aprender en estos momentos Python, porque tengo ganas ya de marchar mi sistema cada vez con más activos y así crear un portafolio equilibrado, y porque ahora se me hace complicado a primera vista, aunque supongo que si he aprendido a programar un robot y todo lo demás que conlleva, también podría conseguir descargar los datos de Darwinex como lo haces tú.

      Gracias de antemano y un saludo

    2. Hola Carlos,

      Respecto a las preguntas que me haces comentarte que yo no he trabajado nunca con los datos de Dukascopy y no he hecho tampoco comparaciones entre sus datos y Darwinex. De todas formas si el robot lo vas a poner con los datos de Darwinex te recomiendo que las pruebas las hagas con los datos que te ofrecen ellos.

      Lo que sí he llegado a comprobar que los datos pueden cambiar entre los que te ofrecen en un sitio y en otro, y por eso creo que lo mejor es hacer las pruebas con la misma fuente con la que vas a tener el robot.

      Si tu problema es la programación en Python desde ya te digo que es bastante sencillo y que con lo que he puesto yo aquí puedes hacer la descarga de datos sin problemas. Si necesitas guardarlos en algún formato determinado, me puedes comentar y te echo una mano.

      Un saludo.

    3. Buenas tardes Ivan:
      Sigo todos tus pasos para descargar los históricos y todo va perfecto
      hasta esta linea:
      stock_15min_ohlc = df_stock[‘Price’].resample(’15Min’).ohlc(_method=’ohlc’)

      me da el siguiente error:
      Traceback (most recent call last):
      File “d:\BackupManual\MT4DarwinexTick\Historicos\darwinex_historicos1.py”, line 59, in
      stock_15min_ohlc = df_stock[‘Price’].resample(’15Min’).ohlc(_method=’ohlc’)
      File “C:\Users\gabal\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\resample.py”, line 1122, in f
      nv.validate_resampler_func(name, args, kwargs)
      File “C:\Users\gabal\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\compat\numpy\function.py”, line 413, in validate_resampler_func
      raise TypeError(“too many arguments passed in”)
      TypeError: too many arguments passed in

      No he encontrado nada tanto bueno en la web como este trabajo.
      Muchas gracias por compartir y espero que me ayudes.

      1. Hola Jose,

        Pues he repasado el código por si se me hubiera pasado algo pero me funciona bien. Pudiera ser un problema de las versiones de las librerías. Si quieres y por no extender mucho los comentarios aquí, mándame el código a mi correo [email protected] (acuérdate de quitar tus contraseñas), lo resolvemos por privado y luego cuelgo yo la respuesta aquí por si le pasa a alguien más.

        Un saludo,

    4. Hola Ivan. Muchas gracias por la informacón que pones aqui. Al respecto, te pregunto si es posible que tu generaras los datos históricos de darwinex para que los lea Metatrader 4, por solicitud de personas como yo, cobrando una tarifa justamente por “el favor” que nos haces (La verdad se me dificulta mucho el tema de programación).

      Gracias por tu respuesta.
      Saludos

    5. Muchas gracias , por información expuesta.
      Tengo una consulta, he bajado los datos de los ticks y lo he resampleado como en tu articulo, pero al compararlos con una cuenta demo de darwinex no son los mismo. Puede ser que los datos de las cuentas demo de darwinex en metatrader no tenga los mismos datos que una cuenta real?.
      Saludos

    6. Hola Iván, muchas gracias por toda la información. Ya descargués los archivos comprimidos del ftp de darwinex a mi disco duro. Voy a ejecutar solo los comandos para descomprimirlos, corregir dates de epoch a ms y consolidar todos los archivos en un df.
      ¿Este código ya tiene en cuenta si los archivos son bid o ask? porque del ftp se descargan por separado para un mismo horario. ¿Me puedes ayudar? Muchas gracias.

      1. Hola Leandro,

        La descarga que se hace en el artículo son los datos del BID como puedes ver cuando ejecutas el comando:
        ftp.retrbinary("RETR /AAPL/AAPL_BID_2022-06-27_17.log.gz" ,open("Apple.log", 'wb').write)
        Si quieres bajar también los del ASK tendrás que utilizar el mismo comando pero cambiando “BID” por “ASK” y con eso tendrás todos los datos, que incluso si quisieras, podrías juntar en un mismo df para hacer tus pruebas.

        Un saludo

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *