English Русский Português
preview
Gestor de riesgos profesional remoto para Forex en Python

Gestor de riesgos profesional remoto para Forex en Python

MetaTrader 5Estadística y análisis |
172 0
Yevgeniy Koshtenko
Yevgeniy Koshtenko

Introducción

En un mundo en el que un simple movimiento erróneo en el mercado de divisas puede dejar nuestra cuenta a cero antes de que podamos decir "stop loss", el arte de la gestión del riesgo se convierte no solo en una habilidad útil, sino en un auténtico salvavidas para los tráders. Recuerda aquella apasionante historia del tráder que perdió todos sus ahorros debido a un repentino salto en el tipo de cambio del franco suizo en 2015? ¿O el que se fue a dormir con una posición abierta y se despertó con una llamada de margen?

Hoy le presento un verdadero escudo para su capital comercial: un sistema de gestión remota del riesgo en Python que permanece despierto, no se distrae y nunca sucumbe a las emociones. Es como tener un guardaespaldas personal para su cuenta comercial que vigila todos sus movimientos las 24 horas del día y está listo para intervenir instantáneamente a la primera señal de peligro.

Imagínese: usted se ocupa de sus asuntos y su fiel asistente digital controla las reducciones, supervisa los límites de pérdidas diarios y semanales, e incluso puede cerrar todas las posiciones automáticamente si el mercado va en su contra. Nada de ataques de nervios, nada de noches sin dormir ni oportunidades perdidas por miedo a perder el control.

Nuestro gestor de riesgos a distancia no solo es una herramienta, es su seguro contra el caos financiero en el impredecible mundo del comercio de divisas. ¿Está listo para que su trading pase de una aventura arriesgada a un proceso controlado? Pues abróchese el cinturón: hoy le llevaremos de viaje por el mundo de la gestión inteligente de riesgos, allí donde la tecnología se une a la seguridad financiera.



¿Por qué hoy en día un tráder no puede sobrevivir sin gestión de riesgos?

En el trading moderno, la gestión del riesgo ha dejado de ser una opción para convertirse en un requisito imprescindible para sobrevivir en los mercados financieros. Veamos por qué.

Una era de volatilidad extrema

En los últimos años, los mercados financieros se han visto sometidos a una agitación sin precedentes: pandemias, conflictos geopolíticos, cambios bruscos en la política monetaria de los bancos centrales y turbulencias económicas de carácter mundial. Cada uno de estos acontecimientos creó en su momento unas condiciones de volatilidad extrema, en las que un movimiento equivocado podía destruir una cuenta comercial en cuestión de minutos.

Basta recordar enero de 2015, cuando el Banco Nacional de Suiza canceló repentinamente la vinculación del franco al euro. En cuestión de minutos, se produjo un salto sin precedentes del 30% en el tipo de cambio, arruinando a miles de tráders e incluso a algunas empresas de corretaje. ¿Y quién sobrevivió aquel día? Los que disponían de un sólido sistema de gestión de riesgos.

El factor psicológico arruina a la mayoría

Hace tiempo que se demostró que el principal enemigo de un tráder no es el mercado, sino su propia psicología: miedo, codicia, esperanza, venganza contra el mercado; estas emociones destruyen incluso las estrategias comerciales más elaboradas. La gestión automatizada del riesgo puede protegerle no solo del mercado, sino también de usted mismo.

Cuando el mercado se mueve en su contra, la presión psicológica puede resultar insoportable. Muchos tráders se ven tentados a "promediar" una posición perdedora o a eliminar un stop loss con la esperanza de que se produzca un cambio de tendencia. Estas decisiones, tomadas en un momento de tensión emocional, normalmente tienen consecuencias desastrosas.

El progreso tecnológico es un arma de doble filo

Las modernas plataformas comerciales ofrecen un acceso sin precedentes a los mercados. Con un solo clic, podemos abrir una posición que controlará decenas o incluso cientos de miles de dólares. Este poder requiere la correspondiente responsabilidad.

Fallos técnicos, errores de conexión a Internet, clics erróneos, errores tipográficos al introducir el volumen... en el mundo de alta velocidad del trading algorítmico, incluso un pequeño error puede provocar enormes pérdidas. Un sistema automatizado de gestión de riesgos actúa como red de seguridad frente a dichas catástrofes.

Los agentes institucionales tienen ventaja

Bancos, fondos de alto riesgo y otros jugadores institucionales del mercado invierten millones en sistemas de gestión de riesgos. Usan complejos algoritmos, cientos de analistas y potentes ordenadores para minimizar sus riesgos y maximizar sus beneficios.

Un tráder minorista que negocia sin un sistema de gestión de riesgos es como un aficionado que sale a jugar contra un equipo profesional. Su única defensa es una disciplina estricta y sistemas automatizados de control de riesgos.

La automatización como necesidad

En un mundo en el que los mercados funcionan las veinticuatro horas del día y las decisiones se toman en milisegundos, la atención humana no resulta suficiente. No podemos estar pendiente de todas nuestras posiciones todo el tiempo, sobre todo cuando dormimos o estamos ocupado con otras cosas.

Un sistema automatizado de gestión de riesgos como el que presentamos en este artículo, se convertirá en un guardián constante que vigilará sus reglas comerciales 24/7, nunca se cansará, nunca se distraerá y nunca sucumbirá a las emociones.

En el actual trading de alta frecuencia, esto no supone un lujo, sino una condición necesaria para sobrevivir.



Las matemáticas de la gestión del riesgo: por qué las transacciones conservadoras ganan a largo plazo

Existe una asimetría fundamental en el trading que a menudo subestiman los novatos e ignoran los tráders emocionales. Esta asimetría es de naturaleza matemática y explica por qué un enfoque conservador de la gestión del riesgo casi siempre supera a las estrategias agresivas a largo plazo. Por eso hemos creado un sistema automatizado de gestión de riesgos en Python, que presentamos en este artículo.

Las implacables matemáticas de las pérdidas y las recuperaciones

Vamos a analizar un modelo matemático sencillo. Supongamos que tenemos una cuenta de $10,000. Esto es lo que ocurrirá en diferentes escenarios de pérdidas:

Pérdida (%)
Saldo de la cuenta
Beneficio necesario para la recuperación (%)
10%
$9,000
11.1%
20%
$8,000
25%
30%
$7,000
42.9%
40%
$6,000
66.7%
50%
$5,000
100%
60%
$4,000
150%
75%
$2,500
300%
90%
$1,000
900%
95%
$500
1900%

Observación clave: el porcentaje de recuperación necesario aumentará exponencialmente a medida que aumenten las pérdidas. No se trata de una relación lineal, sino hiperbólica, expresada mediante la fórmula:

Porcentaje de recuperación requerido = (100% / (100% - porcentaje de pérdida)) - 100%

Esta realidad matemática es inapelable, y funciona independientemente de nuestra experiencia, del conocimiento del mercado o de la estrategia comercial. Nuestro servicio de gestión de riesgos en Python está diseñado considerando este patrón matemático.

Cómo resuelve este problema nuestro sistema de gestión de riesgos en Python

El servicio que hemos desarrollado supervisa automáticamente varios parámetros de riesgo clave. Supervisa la reducción máxima: nuestro sistema supervisa tanto la reducción del saldo, como de la equidad, y puede cerrar posiciones automáticamente cuando se alcanza un umbral preestablecido (por ejemplo, el 10% del máximo). El sistema también controla los límites de pérdida diarios y semanales: podemos establecer la pérdida máxima permitida para un día o una semana, tanto en términos porcentuales como absolutos; superar estos límites conllevará el bloqueo automático de las transacciones. Además, se garantiza el control del margen: el sistema supervisa constantemente el nivel de margen y avisa cuando se aproxima a valores peligrosos.

Dentro del código del sistema, estos parámetros pueden verse en los siguientes fragmentos:

# Определение лимитов риска
daily_loss_limit = self.risk_settings.get('daily_loss_limit', 5 if limit_mode == 'percent' else 100)
weekly_loss_limit = self.risk_settings.get('weekly_loss_limit', 10 if limit_mode == 'percent' else 300)
max_drawdown_limit = self.risk_settings.get('max_drawdown', 10 if limit_mode == 'percent' else 100)

# Проверка превышения лимитов
daily_balance_limit_exceeded = abs(daily_balance_loss) > (account_info.balance * daily_balance_limit / 100 if limit_mode == 'percent' else daily_balance_limit)
weekly_balance_limit_exceeded = abs(weekly_balance_loss) > (account_info.balance * weekly_balance_limit / 100 if limit_mode == 'percent' else weekly_balance_limit)

# Контроль превышения максимальной просадки
if drawdown_mode == 'balance':
    max_drawdown_exceeded = balance_drawdown > max_drawdown_limit
elif drawdown_mode == 'equity':
    max_drawdown_exceeded = equity_drawdown > max_drawdown_limit
else:  # both
    max_drawdown_exceeded = balance_drawdown > max_drawdown_limit or equity_drawdown > max_drawdown_limit

Rentabilidad esperada considerando la probabilidad

Supongamos que tenemos un sistema de inversión con una probabilidad de éxito del 60% y una relación entre pérdidas y ganancias de 1:1. La esperanza matemática de un sistema así es positiva, pero ¿qué ocurre con diferentes tamaños de posición?

Vamos a calcular el crecimiento esperado del capital tras 100 transacciones con distintos niveles de riesgo por transacción:

Riesgo por transacción (%)
Crecimiento medio del capital (%)
Desviación típica (%)
Probabilidad de un resultado negativo
1%
20%
10%
2.3%
2%
44%
21%
1.8%
5%
152%
65%
1%
10%
463%
225%
2%
20%
2125%
1250%
4.5%

A primera vista, puede parecer que más riesgo = mayor recompensa. Sin embargo, esto es una ilusión porque la desviación típica (volatilidad de los resultados) crece en proporción a la magnitud del riesgo. Además, con riesgos superiores al 20%, la probabilidad de ruina total aumenta de forma considerable. También debemos considerar que el estrés psicológico provocado por las grandes caídas a menudo conduce a la ruptura del sistema comercial. Esto es quizás lo primero que debemos pensar para llegar a la conclusión: cualquier tráder dejará la cuenta a cero si el riesgo es elevado. En nueve años en el mercado, no he visto ni un solo "aumento vertiginoso del depósito" que haya tenido éxito.

La automatización evita errores emocionales

Una de las principales ventajas de nuestro sistema de gestión de riesgos basado en Python es la eliminación del error humano. El código presentado contiene la función de cierre automático de posiciones en caso de infracción de los parámetros de riesgo:

def close_all_positions(self):
    positions = mt5.positions_get()
    if positions is None:
        self.error_signal.emit(f"Ошибка получения позиций для закрытия: {mt5.last_error()}")
        return
    if not positions:
        self.error_signal.emit("Нет открытых позиций для закрытия")
        return

    for position in positions:
        try:
            symbol = position.symbol
            volume = position.volume
            position_id = position.ticket
            position_type = position.type
            tick = mt5.symbol_info_tick(symbol)
            if not tick:
                self.error_signal.emit(f"Не удалось получить данные по символу {symbol}")
                continue

            close_price = tick.bid if position_type == mt5.ORDER_TYPE_BUY else tick.ask
            close_type = mt5.ORDER_TYPE_SELL if position_type == mt5.ORDER_TYPE_BUY else mt5.ORDER_TYPE_BUY

            close_request = {
                "action": mt5.TRADE_ACTION_DEAL,
                "symbol": symbol,
                "volume": volume,
                "type": close_type,
                "position": position_id,
                "price": close_price,
                "deviation": 100,
                "comment": "Close by Risk Manager",
            }

            result = mt5.order_send(close_request)
            if not result or result.retcode != mt5.TRADE_RETCODE_DONE:
                self.error_signal.emit(f"Ошибка закрытия позиции {position_id}: {result.retcode if result else mt5.last_error()}")
        except Exception as e:
            self.error_signal.emit(f"Ошибка при закрытии позиции: {str(e)}")

El sistema no sucumbe al miedo, la codicia o la esperanza: sigue estrictamente unas reglas establecidas, lo que resulta fundamental cuando los mercados sufren turbulencias.

Monitorización continua para un sueño reparador

Nuestra solución Python funciona 24 horas al día, 7 días a la semana, incluso cuando usted duerme o está ocupado haciendo otras cosas. Cada 18 segundos, el sistema comprueba todos los parámetros de riesgo y toma las medidas necesarias para proteger su capital:

while self.running:
    try:
        account_info = mt5.account_info()
        # ... анализ рисков ...
        
        limits_exceeded = daily_balance_limit_exceeded or weekly_balance_limit_exceeded or daily_equity_limit_exceeded or weekly_equity_limit_exceeded or max_drawdown_exceeded

        with self.block_lock:
            if limits_exceeded and self.risk_settings.get('auto_close_positions', True):
                self.blocked_trading = True
                if positions:
                    self.close_all_positions()
                    self.error_signal.emit(f"Все позиции закрыты из-за превышения лимитов")
    except Exception as e:
        self.error_signal.emit(f"Ошибка в цикле мониторинга: {str(e)}")
        
    time.sleep(18)  # Обновление каждые 18 с

El uso de nuestro sistema de gestión de riesgos

El código Python presentado en este artículo ofrece una protección total de su cuenta comercial mediante el control de las pérdidas diarias y semanales, la supervisión de la reducción máxima, el cierre automático de posiciones cuando se superan los límites y la visualización de todos los parámetros de riesgo a través de una cómoda interfaz gráfica de usuario.

Su uso resulta intuitivamente sencillo: cargue la cuenta, los límites de riesgo para el día, para la semana, especifique si desea controlar el riesgo según el saldo/equidad o ambos, y empiece a utilizarlo.

Con nuestro sistema, puede estar seguro de que las matemáticas de la gestión de riesgos trabajarán a su favor, no en su contra. Esto le ayudará a evitar pérdidas catastróficas y a garantizar su supervivencia a largo plazo en el entorno altamente competitivo de los mercados financieros.



Aplicación práctica del sistema de gestión de riesgos

La implantación de un gestor de riesgos remoto en su práctica comercial se realizará en unos sencillos pasos. Primero necesitará instalar Python y las bibliotecas necesarias en su ordenador o servidor remoto. Las dependencias clave incluyen PyQt5 para la interfaz gráfica de usuario, MetaTrader 5 para la comunicación con la plataforma comercial, y pandas y numpy para el análisis de datos.

Después de instalar todos los componentes, podrá iniciar el sistema y empezar a configurar los ajustes para su cuenta comercial. La interfaz intuitiva le permitirá introducir rápidamente los datos para la conexión a MetaTrader 5: el servidor, el nombre de usuario y la contraseña. El sistema permite supervisar varias cuentas simultáneamente, lo que resultará especialmente cómodo para quienes gestionan varias estrategias o fondos de clientes.

Deberá prestar especial atención al establecimiento de los parámetros de gestión de riesgos. Podrá establecer límites de pérdidas diarios y semanales, en porcentaje del saldo o en valores absolutos. Por ejemplo, muchos tráders profesionales utilizan la regla empírica de "no perder más de un 2% al día y un 5% a la semana". Este enfoque garantiza que incluso una serie de malas transacciones no provoquen pérdidas críticas.

El sistema también le permitirá fijar la reducción máxima permitida. Se trata de un parámetro extremadamente importante, ya que los datos históricos muestran que salir de una reducción resulta exponencialmente más difícil a medida que aumenta la profundidad de la reducción. Fijando, por ejemplo, una reducción máxima del 10-15%, se protegerá de un largo y doloroso proceso de recuperación del capital.

La interfaz gráfica del sistema, de fácil manejo, ofrece una visualización en tiempo real de las métricas clave. Podrá supervisar el estado de su cuenta, las posiciones abiertas, los niveles de margen y los riesgos potenciales en gráficos y tablas informativos. Esto le permitirá evaluar instantáneamente la situación y tomar decisiones con conocimiento de causa.

Una de las características exclusivas de nuestro sistema son los informes semanales. El sistema genera automáticamente informes HTML detallados con gráficos y tablas que ilustran la dinámica de la cuenta, la eficacia de la gestión del riesgo y los puntos clave de la negociación. Estos informes se convierten así en una herramienta inestimable para analizar y mejorar su estrategia.

La arquitectura del sistema se basa en el principio del flujo múltiple, que garantiza una respuesta rápida a las condiciones cambiantes del mercado. El flujo principal supervisa la cuenta y los riesgos, mientras que otros flujos se encargan de actualizar la interfaz y guardar los datos. Este planteamiento garantiza un funcionamiento fiable incluso en condiciones de gran volatilidad del mercado.

La función integrada de guardado automático del estado garantiza que, incluso si falla el software o se reinicia del servidor, se guardarán todos los ajustes y el estado de bloqueo de operaciones. Esto elimina la posibilidad de apertura involuntaria de posiciones tras el reinicio del sistema.

Implementando este sistema en su práctica de trading, no solo obtendrá un programa, sino un asistente digital fiable que nunca se cansará, no cederá a las emociones y seguirá claramente las reglas establecidas. Esto resulta especialmente valioso en momentos de tensión en los mercados, cuando la psicología humana tiende a tomar decisiones irracionales.

Bien, ahora pasemos al diseño de la arquitectura.

Arquitectura del gestor de riesgos remoto

El gestor de riesgos remoto desarrollado tiene una arquitectura en capas que garantiza la fiabilidad, la escalabilidad y la facilidad de uso. Veamos los principales componentes del sistema y cómo estos interactúan entre sí.

Los principales componentes del sistema son:

  1. El módulo de monitorización AccountMonitor: el núcleo de nuestro sistema, implementado como un flujo independiente que posibilita un seguimiento continuo del estado de la cuenta comercial a través de MetaTrader 5 API.
  2. La interfaz gráfica RiskManagerGUI: un cómodo intérprete de comandos de interacción con el sistema, que permite configurar los parámetros de gestión de riesgos y supervisar el estado actual de las cuentas.
  3. La base de datos SQLite: un repositorio con los datos históricos de las cuentas, que se utiliza para calcular los valores máximos de saldo y equidad, y también para generar informes.
  4. El módulo de informes: el componente encargado de crear informes semanales en formato HTML con gráficos y tablas para analizar los resultados de las transacciones.

Trabajo con la API de MetaTrader 5

La pieza central de nuestro sistema es la integración con MetaTrader 5 a través de la API oficial de Python. Esta integración nos permite recuperar datos sobre el estado de la cuenta, las posiciones abiertas y la historia de transacciones, así como ejecutar transacciones cuando sea necesario.

# Инициализируем MetaTrader 5 с явным указанием пути
if not mt5.initialize(path=self.terminal_path):
    self.error_signal.emit(f"Ошибка инициализации MetaTrader 5 по пути {self.terminal_path}: {mt5.last_error()}")
    return

authorized = mt5.login(
    login=int(self.account_info['login']),
    password=self.account_info['password'],
    server=self.account_info['server']
)

Tenga en cuenta que, durante la inicialización, indicamos explícitamente la ruta al terminal MetaTrader 5. Esto resulta especialmente importante al implantar el sistema en un servidor remoto, donde la ubicación de los archivos puede ser diferente de la predeterminada.

Una vez obtenida la autorización, el sistema inicia el monitoreo continuo de la cuenta, solicitando información cada 18 segundos:

while self.running:
    try:
        account_info = mt5.account_info()
        if not account_info:
            self.error_signal.emit("Не удалось получить информацию о счете")
            time.sleep(18)
            continue

        positions = mt5.positions_get()
        # Дальнейший анализ данных...
    except Exception as e:
        self.error_signal.emit(f"Ошибка в цикле мониторинга: {str(e)}")
    
    time.sleep(18)  # Обновление каждые 18 с

Arquitectura multiflujo

Para garantizar la capacidad de respuesta de la interfaz de usuario incluso durante el procesamiento intensivo de datos, usamos una arquitectura multiflujo. El módulo de monitorización se ejecuta en un flujo separado que se comunica con el flujo principal de la GUI a través del sistema de señales y ranuras de PyQt5:

class AccountMonitor(QThread):
    update_signal = pyqtSignal(dict)
    error_signal = pyqtSignal(str)
    
    # ...
    
    def run(self):
        # Код мониторинга и анализа
        # ...
        self.update_signal.emit(update_data)

Este enfoque asegura que incluso con retrasos en la recepción de datos de MetaTrader 5, la interfaz de usuario de la API permanecerá receptiva y lista para responder.

Algoritmos de análisis de riesgos

En el corazón de nuestro sistema se encuentran algoritmos de análisis de riesgos que evalúan continuamente el estado actual de la cuenta y toman decisiones basándose en los parámetros definidos por el usuario.

Uno de los algoritmos clave es el cálculo de la reducción del saldo y de la equidad:

cursor.execute('SELECT MAX(balance) FROM account_history WHERE account_id = ?', (self.account_info['login'],))
result = cursor.fetchone()
max_balance = result[0] if result and result[0] is not None else initial_balance

balance_drawdown = 0
equity_drawdown = 0
drawdown_mode = self.risk_settings.get('drawdown_mode', 'balance')
limit_mode = self.risk_settings.get('limit_mode', 'percent')

if max_balance > 0:
    if drawdown_mode in ['balance', 'both']:
        balance_drawdown = (max_balance - account_info.balance) / max_balance * 100 if limit_mode == 'percent' else max_balance - account_info.balance

El sistema almacena la información sobre el saldo máximo alcanzado y la equidad, lo que le permite calcular con precisión la reducción actual. Dependiendo de la configuración del usuario, la reducción puede calcularse en tanto por ciento o en valores absolutos.

Otro algoritmo importante es el análisis de las pérdidas diarias y semanales:

from_date = dt.datetime.now() - dt.timedelta(days=7)
to_date = dt.datetime.now()
deals = mt5.history_deals_get(from_date, to_date) or []
daily_balance_loss = weekly_balance_loss = daily_equity_loss = weekly_equity_loss = 0

if deals:
    deals_df = pd.DataFrame(list(deals), columns=deals[0]._asdict().keys())
    today = dt.datetime.now().date()
    today_deals = deals_df[pd.to_datetime(deals_df['time']).dt.date == today]
    week_start = (dt.datetime.now() - dt.timedelta(days=dt.datetime.now().weekday())).date()
    week_deals = deals_df[pd.to_datetime(deals_df['time']).dt.date >= week_start]

    daily_balance_loss = today_deals[today_deals['profit'] < 0]['profit'].sum() if not today_deals.empty else 0
    weekly_balance_loss = week_deals[week_deals['profit'] < 0]['profit'].sum() if not week_deals.empty else 0

El sistema analiza la historia de transacciones del día y la semana en curso, calcula las pérdidas totales y las compara con los límites establecidos.

Mecanismo de cierre automático de posiciones

Una de las funciones más importantes de nuestro sistema es el cierre automático de posiciones cuando se superan los límites de riesgo. Es un mecanismo de defensa de importancia crítica que se activa incluso en ausencia del tráder:

limits_exceeded = daily_balance_limit_exceeded or weekly_balance_limit_exceeded or daily_equity_limit_exceeded or weekly_equity_limit_exceeded or max_drawdown_exceeded

with self.block_lock:
    if limits_exceeded and self.risk_settings.get('auto_close_positions', True):
        self.blocked_trading = True
        if positions:
            self.close_all_positions()
            self.error_signal.emit(f"Все позиции закрыты из-за превышения лимитов: DBL={daily_balance_limit_exceeded}, WBL={weekly_balance_limit_exceeded}, DEL={daily_equity_limit_exceeded}, WEL={weekly_equity_limit_exceeded}, MDD={max_drawdown_exceeded}")

Si se supera alguno de los límites configurados, el sistema puede cerrar automáticamente todas las posiciones abiertas y bloquear nuevas transacciones. Esto protege al tráder de pérdidas catastróficas, si el mercado sufre fuertes movimientos o se da una serie de malas transacciones.

El proceso de cierre de posiciones se implementa considerando todas las características de MetaTrader 5 API:

def close_all_positions(self):
    positions = mt5.positions_get()
    if positions is None:
        self.error_signal.emit(f"Ошибка получения позиций для закрытия: {mt5.last_error()}")
        return
    if not positions:
        self.error_signal.emit("Нет открытых позиций для закрытия")
        return

    for position in positions:
        try:
            symbol = position.symbol
            volume = position.volume
            position_id = position.ticket
            position_type = position.type
            tick = mt5.symbol_info_tick(symbol)
            if not tick:
                self.error_signal.emit(f"Не удалось получить данные по символу {symbol}")
                continue

            close_price = tick.bid if position_type == mt5.ORDER_TYPE_BUY else tick.ask
            close_type = mt5.ORDER_TYPE_SELL if position_type == mt5.ORDER_TYPE_BUY else mt5.ORDER_TYPE_BUY

            close_request = {
                "action": mt5.TRADE_ACTION_DEAL,
                "symbol": symbol,
                "volume": volume,
                "type": close_type,
                "position": position_id,
                "price": close_price,
                "deviation": 100,
                "comment": "Close by Risk Manager",
            }

            result = mt5.order_send(close_request)
            # Обработка результата...
        except Exception as e:
            self.error_signal.emit(f"Ошибка при закрытии позиции: {str(e)}")

El sistema procesa secuencialmente cada posición abierta, determina la dirección de la posición (compra o venta), recibe los precios actuales del mercado y genera una solicitud de cierre con los parámetros correspondientes.

Persistencia de datos y ajustes

Para garantizar un funcionamiento fiable, incluso en caso de reinicio, el sistema usa una base de datos SQLite para almacenar toda la información necesaria:

def save_to_db(self, data):
    try:
        conn = sqlite3.connect(self.db_path)
        cursor = conn.cursor()

        cursor.execute('''CREATE TABLE IF NOT EXISTS accounts (
            account_id INTEGER PRIMARY KEY,
            server TEXT,
            login TEXT,
            password TEXT,
            timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
        )''')

        cursor.execute('''CREATE TABLE IF NOT EXISTS account_history (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            account_id INTEGER,
            balance REAL,
            equity REAL,
            balance_drawdown REAL,
            equity_drawdown REAL,
            margin REAL,
            free_margin REAL,
            margin_level REAL,
            daily_balance_loss REAL,
            weekly_balance_loss REAL,
            daily_equity_loss REAL,
            weekly_equity_loss REAL,
            positions_count INTEGER,
            blocked_trading INTEGER,
            timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
        )''')

        # Сохранение данных в базу...
    except sqlite3.Error as e:
        self.error_signal.emit(f"Ошибка базы данных: {str(e)}")
    finally:
        conn.close()

La base de datos almacena información sobre las cuentas conectadas, su configuración y la historia del estado de las cuentas. Esto no solo permite restaurar el estado del sistema tras un reinicio, sino que también ofrece los datos necesarios para calcular las reducciones y generar informes analíticos.

Visualización e informes

Un aspecto importante de nuestro sistema es la clara visualización de los datos y la generación de informes. Para trazar gráficos en tiempo real, usamos la biblioteca pyqtgraph:

equity_plot = getattr(self, f"equity_plot_{account_id}")
equity_data = getattr(self, f"equity_data_{account_id}")
equity_times = getattr(self, f"equity_times_{account_id}")
equity_data.append(data['equity'])
equity_times.append(dt.datetime.now().timestamp())
if len(equity_data) > 100:
    equity_data.pop(0)
    equity_times.pop(0)
equity_plot.clear()
equity_plot.plot(equity_times, equity_data, pen=pg.mkPen(color=(0, 150, 0), width=2))

Para los informes semanales, el sistema genera páginas HTML con gráficos matplotlib y tablas de datos:

def generate_weekly_report(self, data):
    try:
        conn = sqlite3.connect(self.db_path)
        df = pd.read_sql_query('SELECT timestamp, balance, equity, balance_drawdown, equity_drawdown FROM account_history WHERE account_id = ? AND timestamp >= ?',
                               conn, params=(data['account_id'], dt.datetime.now() - dt.timedelta(days=7)))

        if df.empty:
            self.error_signal.emit(f"Нет данных для отчета по счету {data['account_id']}")
            return

        table_html = df.to_html(index=False, classes='table table-striped', border=0)

        fig, ax = plt.subplots(figsize=(10, 6))
        ax.plot(pd.to_datetime(df['timestamp']), df['balance_drawdown'], label='Balance Drawdown (%)', color='blue')
        ax.plot(pd.to_datetime(df['timestamp']), df['equity_drawdown'], label='Equity Drawdown (%)', color='red')
        ax.set_title(f"Weekly Drawdown Report for Account {data['account_id']}")
        ax.set_xlabel("Date")
        ax.set_ylabel("Drawdown (%)")
        ax.legend()
        ax.grid(True)

        # Формирование HTML-отчета...
    except Exception as e:
        self.error_signal.emit(f"Error generating report: {str(e)}")
    finally:
        conn.close()

Estos informes se convierten en una herramienta indispensable para analizar los resultados comerciales y la eficacia de la gestión de riesgos.

Despliegue del sistema en un servidor remoto

Una de las principales ventajas de nuestro gestor de riesgos es que puede desplegarse en un servidor remoto, lo cual garantiza un funcionamiento ininterrumpido 24 horas al día, 7 días a la semana, independientemente del estado de su ordenador principal. Esto resulta especialmente importante para los tráders profesionales que no pueden permitirse el riesgo de que su sistema de monitorización se apague debido a un fallo eléctrico o a problemas de conexión a Internet (bueno, o cuando simplemente no puede molestarse en mantener su máquina principal encendida todo el tiempo).

Perfeccionamiento del sistema

Nuestro marco de gestión de riesgos ofrece una base sólida para controlar los riesgos comerciales, pero hay mucho margen para ampliarlo aún más:

  1. Integración con múltiples terminales MetaTrader 5/MetaTrader 4 — para tráders que trabajan con diferentes brókeres y plataformas.
  2. Análisis avanzados métricas de rendimiento adicionales como el ratio de Sharpe, la serie máxima de transacciones perdedoras, el ratio de ganancias/pérdidas, etc.
  3. Aprendizaje automático — previsión de riesgos potenciales basada en datos históricos y en las condiciones actuales del mercado.
  4. Alertas a través de Telegram/Discord/Email — notificaciones instantáneas de eventos críticos en su teléfono u ordenador.
  5. Estrategias mejoradas de cierre de posiciones — por ejemplo, cierre parcial de posiciones en lugar de cierre total al acercarse a los límites de riesgo.



Conclusión

Remote Risk Manager en Python es una potente herramienta para proteger su capital comercial contra riesgos excesivos. Con la automatización del control de riesgos, podrá centrarse en encontrar oportunidades comerciales, con la confianza de que el sistema le protegerá de pérdidas catastróficas.

En el actual entorno altamente competitivo de los mercados financieros, no sobreviven quienes maximizan los beneficios a corto plazo, sino quienes pueden gestionar eficazmente el riesgo y preservar el capital a largo plazo. Nuestro sistema le ayudará a formar parte de este exitoso grupo de tráders.

Recuerde: el principal objetivo de la gestión del riesgo no es solo protegerle de grandes pérdidas, sino también hacer posible que se sienta cómodo a nivel psicológico, logrando así seguir la estrategia comercial elegida incluso durante periodos de tensión en el mercado. Como demuestra la práctica, es precisamente la disciplina psicológica lo que suele distinguir a los tráders con éxito de aquellos que no lo tienen.

Implemente el sistema descrito en su práctica comercial, adáptelo a sus necesidades individuales y observe cómo cambia su enfoque del mercado al saber que su capital está seguro.

Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/17410

Archivos adjuntos |
Cierres parciales condicionales (Parte 1): Creación de la clase base Cierres parciales condicionales (Parte 1): Creación de la clase base
En este artículo implementaremos un nuevo método para la gestión de posiciones, parecido a los cierres parciales "simples" que implementamos anteriormente, pero con una diferencia importante. En lugar de basarse en niveles de takeprofit fijos, este enfoque aplica los cierres parciales al momento de cumplirse cierta condición específica. De ahí su nombre: "Cierres parciales condicionales". En esta primera parte de la implementación en MQL5 veremos cómo funciona esta técnica de gestión de posiciones.
Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 13): Herramienta RSI Sentinel Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 13): Herramienta RSI Sentinel
La evolución de los precios puede analizarse eficazmente identificando divergencias, con indicadores técnicos como el RSI que proporcionan señales de confirmación cruciales. En el siguiente artículo, explicamos cómo el análisis automatizado de divergencias del RSI puede identificar continuaciones y reversiones de tendencias, ofreciendo así información valiosa sobre el sentimiento del mercado.
Operaciones de arbitraje en Forex: Panel de evaluación de correlaciones Operaciones de arbitraje en Forex: Panel de evaluación de correlaciones
Hoy analizaremos la creación de un panel de arbitraje en el lenguaje MQL5. ¿Cómo obtener tipos de cambio justos en Forex de formas diferentes? En esta ocasión, crearemos un indicador para obtener las desviaciones de los precios de mercado respecto a los tipos justos, y para estimar el beneficio de las vías de arbitraje para cambiar una divisa por otra (como en el arbitraje triangular).
Algoritmo del restaurador de éxito —  Successful Restaurateur Algorithm (SRA) Algoritmo del restaurador de éxito — Successful Restaurateur Algorithm (SRA)
El algoritmo del restaurador de éxito (SRA) es un innovador método de optimización inspirado en los principios de la gestión de restaurantes. A diferencia de los enfoques tradicionales, el SRA no descarta las soluciones débiles, sino que las mejora combinándolas con elementos de las que han tenido éxito. El algoritmo muestra resultados competitivos y ofrece una nueva perspectiva sobre el equilibrio entre investigación y explotación en los problemas de optimización.