Cuenta de Señales MT4 en darwinex (Backtest)

Espacio dedicado a la programación en Python para traders.
Avatar de Usuario
Foréxitos
Mensajes: 724
Registrado: 12 Mar 2017 19:13

Cuenta de Señales MT4 en darwinex (Backtest)

Mensaje por Foréxitos »

Hola a toda la comunidad de x-trader, les traigo la posibilidad de ver por completo la subyacente de una cuenta MT4 en darwinex con todo, Retorno/Riesgo, Activos & Horarios, Atributos invertibles, Trading Journal, como así también el VaR y otras métricas. Aclaro que no es como ver un DARWIN, sino solo la cuenta de señales sin pasar por el motor de riesgo de darwinex.

Metámonos en el quilombo... :-D Antes de empezar te cuento lo que se necesita:
1_ Tener cuenta MT4 con historial de ordenes realizadas, no precisamente tiene que ser el de alguna cuenta de darwinex, puede ser también de cualquier broker inclusive en DEMO.
2_ Anaconda instalado en tu CPU, lo bajas gratis desde acá https://www.anaconda.com/download/success
3_ Tener un usuario en darwinex, no sirve el de darwinex Zero, podes crearlo gratis desde acá https://www.darwinex.com/es/register

Bien, ahora hay que realizar los siguientes pasos:
1_ Abrís tu MT4 y clic en la pestaña que se encuentra abajo del todo "Historial de cuenta", haciendo siempre clic derecho en cualquier parte del historial le das check a Comisiones, Impuestos, Comentarios, luego clic arriba donde dice "Todo el historial" para que te lo muestre completo, y por ultimo, clic en "Guardar como informe" y guárdalo en tu escritorio con el nombre "H".
2_ Abrís Anaconda Navigator (si te aparecen ventanitas, cerrarlas todas), buscas Jupyter Notebook y le das al botón "Launch". Una vez dentro de Jupyter le das a File-->New-->Notebook-->Select, en la única celda copias y pegas el "Código Python" que te voy a proporcionar mas abajo y por ultimo clic al Play, se crea un archivo.csv que vamos a usar (H.csv). Si produce error, modificar las rutas de entrada y salida de los archivos.
3_ Nos logeamos en darwinex, vamos a Herramientas-->Backtest-->Subir Backtest-->completar nombre de Backtest, Siguiente-->completar la moneda de apertura de cuenta de nustro historial-->seleccionar Formato .csv-->subir, buscamos nuestro H.csv creado y lo abrimos (no puede pesar mas de 5MB)-->Siguiente-->y por ultimo ACEDER A ESTRATEGIA. Hay que esperar mínimo 2hs hasta 48hs para que se cree. Paciencia.

Código Python

Código: Seleccionar todo

from bs4 import BeautifulSoup
import csv
from datetime import datetime

# Ruta del archivo de entrada y salida
input_file = r'C:\Users\HP\OneDrive\Escritorio\H.htm'
output_file = r'C:\Users\HP\OneDrive\Escritorio\H.csv'

# Leer el archivo HTML
with open(input_file, 'r', encoding='utf-8') as f:
    soup = BeautifulSoup(f, 'html.parser')

# Buscar todas las tablas
tables = soup.find_all('table')

# Seleccionar la tabla correcta
tabla_correcta = 0
table = tables[tabla_correcta]
rows = table.find_all('tr')

# Extraer datos
data = []
header_row = None
start_processing = False

for row_index, row in enumerate(rows):
    cols = [col.get_text(strip=True) for col in row.find_all(['td', 'th'])]
    if not cols:
        continue

    # Asegurar que hay al menos 15 columnas antes de agregar Comment y LotSize
    while len(cols) < 15:
        cols.append('')

    # Buscar y guardar los encabezados
    if cols[0] == "Ticket":  # Esta es la fila de encabezados
        # Modificar los nombres de las columnas
        cols[0] = "OrderNumber"
        cols[1] = "OpenTime"
        cols[5] = "OpenPrice"
        cols[6] = "S/L"
        cols[7] = "T/P"
        cols[8] = "CloseTime"
        cols[9] = "ClosePrice"
        cols[11] = "Pips"
        cols[14] = 'Comment'
        cols.append('LotSize')
        header_row = cols  # Guardamos los encabezados para usarlos después
        continue

    # Buscar el inicio ("Closed Transactions:")
    if "Closed Transactions:" in cols[0]:
        start_processing = True
        continue  # Saltamos esta fila
    
    # Buscar el final (fila anterior a "Closed P/L:")
    if "Closed P/L:" in cols[0]:
        break  # Terminamos el procesamiento
    
    # Si estamos en el rango a procesar
    if start_processing:
        # Convertir fechas en columnas 1 y 8
        for i in [1, 8]:
            if i < len(cols):
                try:
                    dt = datetime.strptime(cols[i], "%Y.%m.%d %H:%M:%S")
                    cols[i] = int(dt.timestamp())
                except ValueError:
                    pass

        # Agregar columna LotSize
        cols.append('100000')
        data.append(cols)

        # Mayúsculas en columna [4]
        if len(cols) > 4:
            cols[4] = cols[4].upper()

        # Procesar columna [4]
        if len(cols) > 4:
            value = cols[4].strip().lower()
            if value in ("xauusd","ni225"):
                cols[15] = '100'
            elif value == "xagusd":
                cols[15] = '5000'
            elif value == "xngusd":
                cols[15] = '10000'
            elif value == "xtiusd":
                cols[15] = '1000'
            elif value in ("aus200","fchi40","gdaxi","ndx","sp500","spa35","stoxx50e","uk100"):
                cols[15] = '10'
            elif value == "ws30":
                cols[15] = '1'
            else:
                cols[15] = '100000'

        # Procesar columna [2]
        if len(cols) > 2:
            value = cols[2].strip().lower()
            if value == "buy":
                cols[2] = "Buy"
                cols[14] = ''
            elif value == "sell":
                cols[2] = "Sell"
                cols[14] = ''
            elif value == "balance":
                cols[0] = '0'
                cols[2] = ''
                cols[3] = '0.0'
                cols[5] = '0.0'
                cols[6] = '0.0'
                cols[7] = '0.0'
                cols[8] = cols[1]
                cols[9] = '0.0'
                cols[10] = '0.0'
                cols[11] = '0'
                cols[12] = '0.0'
                cols[13] = cols[4]
                cols[4] = ''
                cols[14] = "Balance"
                cols[15] = '0'
            else:
                cols[14] = ''
        else:
            cols[14] = ''

# Insertar los encabezados al principio de los datos
if header_row:
    data.insert(0, header_row)

# Eliminar la última fila antes de guardar, si hay más de una fila (para no quitar encabezados)
if len(data) > 1:
    data.pop()

# Filtrar filas que tienen OrderNumber vacío (columna 0), exceptuando la fila de encabezados
data = [row for i, row in enumerate(data) if i == 0 or row[0].strip() != '']

# Guardar en CSV
with open(output_file, 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerows(data)

print(f"\n✅ Archivo CSV fue creado correctamente y guardado en:{output_file}")
ImagenImagenImagenImagenImagen
Responder

Volver a “Python”