Metámonos en el quilombo...

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}")