Gestor de riesgos profesional remoto para Forex en Python
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:
- 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.
- 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.
- 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.
- 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:
- Integración con múltiples terminales MetaTrader 5/MetaTrader 4 — para tráders que trabajan con diferentes brókeres y plataformas.
- 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.
- Aprendizaje automático — previsión de riesgos potenciales basada en datos históricos y en las condiciones actuales del mercado.
- Alertas a través de Telegram/Discord/Email — notificaciones instantáneas de eventos críticos en su teléfono u ordenador.
- 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
Advertencia: todos los derechos de estos materiales pertenecen a MetaQuotes Ltd. Queda totalmente prohibido el copiado total o parcial.
Este artículo ha sido escrito por un usuario del sitio web y refleja su punto de vista personal. MetaQuotes Ltd. no se responsabiliza de la exactitud de la información ofrecida, ni de las posibles consecuencias del uso de las soluciones, estrategias o recomendaciones descritas.
Cierres parciales condicionales (Parte 1): Creación de la clase base
Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 13): Herramienta RSI Sentinel
Operaciones de arbitraje en Forex: Panel de evaluación de correlaciones
Algoritmo del restaurador de éxito — Successful Restaurateur Algorithm (SRA)
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso