Русский Português
preview
Descarga de datos del Fondo Monetario Internacional en Python

Descarga de datos del Fondo Monetario Internacional en Python

MetaTrader 5Integración |
24 1
Yevgeniy Koshtenko
Yevgeniy Koshtenko

Imagínese esto: mientras la mayoría de los tráders analizan velas japonesas y trazan líneas de soporte, usted ya sabe que la economía de la eurozona está mostrando signos de desaceleración y la libra esterlina se está preparando para una serie de shocks debido al deterioro de la balanza comercial. ¿Suena a ciencia ficción? Pues no lo es en absoluto. El FMI publica diariamente terabytes de datos macroeconómicos que, si se procesan correctamente, pueden convertirse en una poderosa herramienta para crear estrategias comerciales.

A lo largo de sus décadas de existencia, el FMI ha acumulado una base de datos única que abarca indicadores económicos de 190 países. Esta información incluye no solo métricas tradicionales como el PIB y la inflación, sino también indicadores estructurales complejos que nos permiten ver el estado real de las economías mucho antes de que los mercados empiecen a reaccionar. El problema es que estos datos se presentan sin procesar y requieren un procesamiento significativo para extraer valor práctico.


Anatomía de los datos económicos del FMI

Cada vez que el banco central publica estadísticas o el gobierno informa sobre indicadores fiscales, esta información se ingresa en las bases de datos del FMI. Pero simplemente leer hojas de cálculo de Excel nos ofrecerá poco beneficio como tráders. La verdadera magia comienza cuando comprendemos cómo los diferentes indicadores económicos interactúan entre sí e influyen en los tipos de cambio.

Tomemos, por ejemplo, la relación entre la cuenta corriente y el PIB. Para el observador inexperto, esto es solo un número aburrido en un informe. Pero un analista experimentado sabe que un déficit de cuenta corriente persistente superior al 5% del PIB con frecuencia precede a una crisis monetaria. Turquía en 2018, Argentina en 2019 e incluso el Reino Unido durante la crisis de la libra demostraron exactamente esta dinámica.

Los datos del FMI resultan particularmente valiosos porque están estandarizados y son comparables entre países. A diferencia de las estadísticas nacionales, que pueden diferir en su metodología, el FMI usa principios contables uniformes. Esto permite realizar comparaciones relevantes e identificar las fortalezas o debilidades relativas de las economías.


Solución arquitectónica para la minería de datos

Para construir un sistema que trabaje con datos del FMI es necesario comprender los detalles específicos de su API. El FMI utiliza el estándar SDMX-JSON, que, aunque es un estándar de la industria, es algo complejo de implementar. La interfaz está construida sobre el principio REST, pero la estructura de las respuestas puede variar sustancialmente dependiendo de los datos solicitados.

El principal desafío técnico es que la interfaz devuelve datos en una estructura JSON de varios niveles, donde cada serie temporal puede contener diversos metadatos, estados de observación y atributos adicionales. Además, algunos indicadores se publican en intervalos diferentes, lo cual requiere una lógica adicional para sincronizar los datos.

class IMFDataCollector:
    def __init__(self):
        self.base_url = "http://dataservices.imf.org/REST/SDMX_JSON.svc"
        self.session = requests.Session()
        self.rate_limiter = RateLimitManager(max_requests_per_minute=60)
        
    def fetch_economic_data(self, dataset_id: str, countries: List[str], 
                           indicators: List[str], start_year: int, end_year: int) -> pd.DataFrame:
        """
        Universal method for fetching IMF data with error handling and optimization
        """
        self.rate_limiter.wait_if_needed()
        
        # Build complex URL according to SDMX specification
        countries_string = '+'.join(countries)
        indicators_string = '+'.join(indicators)
        
        url = f"{self.base_url}/CompactData/{dataset_id}/A.{countries_string}.{indicators_string}"
        
        params = {
            'startPeriod': str(start_year),
            'endPeriod': str(end_year)
        }
        
        try:
            response = self.session.get(url, params=params, timeout=30)
            response.raise_for_status()
            
            raw_data = response.json()
            return self._parse_complex_response(raw_data)
            
        except requests.exceptions.RequestException as e:
            logger.error(f"Error fetching data: {e}")
            return pd.DataFrame()

Un elemento crítico de la arquitectura es el sistema de almacenamiento en la caché. La API del FMI tiene límites de consultas y los datos macroeconómicos se actualizan con relativamente poca frecuencia. La implementación de una caché inteligente acelera significativamente el sistema y reduce la carga en los servidores del FMI.


La alquimia de los indicadores económicos

El simple hecho de obtener datos sobre el PIB o la inflación no nos proporcionará una ventaja competitiva. El valor real surge de la creación de indicadores compuestos que combinen varios indicadores económicos en una única métrica. Y aquí es donde entra en juego el arte del análisis económico.

Hoy analizaremos la creación de un índice de la fortaleza económica de un país. El enfoque tradicional implica una simple ponderación de indicadores, pero una solución más sofisticada considera las dependencias no lineales y las correlaciones dinámicas entre las variables.

def calculate_dynamic_economic_strength(country_data: pd.DataFrame) -> pd.Series:
    """
    Calculate dynamic economic strength index accounting for volatility patterns
    """
    # Extract key economic indicators
    gdp_growth = country_data['NGDP_RPCH'].rolling(4).mean()
    inflation = country_data['PCPIPCH']
    unemployment = country_data['LUR']
    current_account = country_data['BCA_NGDPD']
    
    # Normalize with historical volatility consideration
    gdp_normalized = normalize_with_volatility(gdp_growth, target_vol=0.15)
    inflation_normalized = proximity_to_target(inflation, target=2.0, tolerance=1.0)
    unemployment_normalized = inverse_normalize(unemployment)
    current_account_normalized = sigmoid_normalize(current_account, inflection=-3.0)
    
    # Dynamic weights based on currency correlation
    weights = calculate_dynamic_weights(country_data, lookback_quarters=8)
    
    strength_index = (gdp_normalized * weights['gdp'] + 
                     inflation_normalized * weights['inflation'] +
                     unemployment_normalized * weights['unemployment'] +
                     current_account_normalized * weights['current_account'])
    
    return strength_index.rolling(2).mean()  # Smoothing to reduce noise

Resulta de particular interés la creación de un indicador de atractivo monetario que tenga en cuenta no solo los indicadores económicos actuales, sino también sus tendencias, así como la posición relativa del país en comparación con sus socios comerciales.


Traduciendo la macroeconomía a señales comerciales

Tener buenos datos económicos por sí solo no garantiza una negociación rentable. El desafío clave consiste en transformar la información fundamental en decisiones de trading concretas. Aquí debemos entender que los factores macroeconómicos operan en diferentes horizontes temporales y con diferentes retardos.

Una de las estrategias más efectivas se basa en el concepto de impulso económico. La idea es que los cambios en la fortaleza económica relativa de dos países eventualmente se reflejen en el tipo de cambio de sus monedas. Sin embargo, los mercados a menudo reaccionan con retraso, lo cual crea oportunidades comerciales para aquellos que pueden interpretar correctamente los datos macroeconómicos.

class EconomicMomentumStrategy:
    def __init__(self, imf_data_source: IMFDataCollector):
        self.data_source = imf_data_source
        self.momentum_threshold = 0.3
        self.confirmation_period = 3  # quarters
        
    def generate_trading_signals(self, currency_pairs: List[str]) -> List[Dict]:
        """
        Generate signals based on economic momentum changes
        """
        signals = []
        
        for pair in currency_pairs:
            base_country = self._extract_country_from_currency(pair[:3])
            quote_country = self._extract_country_from_currency(pair[3:])
            
            # Get economic data for the last 5 years
            base_data = self._fetch_country_indicators(base_country, years=5)
            quote_data = self._fetch_country_indicators(quote_country, years=5)
            
            # Calculate economic strength
            base_strength = self._calculate_economic_strength(base_data)
            quote_strength = self._calculate_economic_strength(quote_data)
            
            # Determine trend and momentum
            momentum = self._calculate_momentum_differential(base_strength, quote_strength)
            trend_confirmation = self._verify_trend_confirmation(momentum)
            
            # Generate signal if sufficient momentum and confirmation exist
            if abs(momentum.iloc[-1]) > self.momentum_threshold and trend_confirmation:
                direction = 'BUY' if momentum.iloc[-1] > 0 else 'SELL'
                confidence = min(abs(momentum.iloc[-1]) / self.momentum_threshold, 2.0)
                
                signals.append({
                    'pair': pair,
                    'direction': direction,
                    'confidence': confidence,
                    'economic_basis': self._get_fundamental_reasoning(base_data, quote_data),
                    'expected_duration': 'medium_term'  # 3-12 months
                })
        
        return self._rank_signals_by_quality(signals)

Otra estrategia prometedora consiste en buscar divergencias en las tasas de interés y la actividad económica. Los bancos centrales con frecuencia ajustan la política monetaria con un cierto retraso respecto a los cambios en la economía, lo que crea ventanas de oportunidad para transacciones comerciales rentables.


Integración con la infraestructura comercial

La creación de gráficos hermosos y el cálculo de indicadores es solo la mitad de la tarea. Para su aplicación práctica, debemos integrar el sistema de análisis de macrodatos con la plataforma comercial MetaTrader 5. Esta integración debería ofrecer actualizaciones de datos en tiempo real, transmisión de señales fiable y la capacidad de realizar pruebas retrospectivas de estrategias.

La solución más elegante consiste en crear una capa intermedia que convierta el análisis de Python en un formato comprensible para MQL5. Esta capa puede usar varios métodos de comunicación: desde simples archivos CSV hasta soluciones más avanzadas a través de pipelines con nombre o conexiones TCP.

class MT5DataBridge:
    def __init__(self, output_directory: str = "Files"):
        self.output_dir = Path(output_directory)
        self.output_dir.mkdir(exist_ok=True)
        
    def export_economic_signals(self, signals: List[Dict], filename: str):
        """
        Export signals in format optimized for MQL5 reading
        """
        mt5_signals = []
        
        for signal in signals:
            mt5_signals.append({
                'timestamp': datetime.now().strftime('%Y.%m.%d %H:%M'),
                'symbol': signal['pair'],
                'signal_type': signal['direction'],
                'strength': signal['confidence'],
                'timeframe': 'H4',  # Recommended timeframe for macro strategies
                'fundamental_score': signal.get('economic_basis', 0),
                'expected_duration_days': self._convert_duration(signal['expected_duration'])
            })
        
        df = pd.DataFrame(mt5_signals)
        df.to_csv(self.output_dir / f"{filename}.csv", index=False)
        
        # Create binary file for fast reading as well
        self._create_binary_export(df, filename)


Casos prácticos y estrategias probadas

Los argumentos teóricos sobre los beneficios del análisis macroeconómico solo se vuelven convincentes cuando tenemos ejemplos concretos de su aplicación exitosa. Veamos ahora varios casos en los que la interpretación correcta de los datos del FMI podría producir beneficios significativos.

En 2018, los datos del FMI mostraron un deterioro constante de los indicadores económicos externos de Turquía. El déficit de cuenta corriente alcanzó el 6% del PIB, la deuda externa superó el 50% del PIB y la inflación empezó a volverse incontrolable. Los tráders que utilizan nuestro sistema de monitoreo habrían notado estas señales de advertencia meses antes del colapso de la lira turca en agosto, cuando el USD/TRY subió de 4,5 a 7,0 en solo unas pocas semanas.

Aún más ilustrativo resulta el ejemplo de la libra esterlina durante el periodo del Brexit. Los datos del FMI sobre la balanza comercial, la inversión directa y la estructura exportadora del Reino Unido demostraron claramente la vulnerabilidad de la economía ante una ruptura de los lazos comerciales con la UE. Un sistema de alerta temprana basado en estos datos podría haber advertido de una mayor volatilidad de la libra mucho antes de la celebración del referéndum.

De particular interés resulta la aplicación del modelo de carry trade, complementado con análisis macroeconómico. El carry trading tradicional se basa en diferenciales de tasas de interés, pero añadir factores fundamentales mejora significativamente la relación riesgo-recompensa.

class EnhancedCarryTradeStrategy:
    def __init__(self, imf_data: IMFDataCollector):
        self.data_source = imf_data
        self.min_rate_differential = 2.0  # Minimum rate difference in %
        self.stability_threshold = 0.7    # Economic stability threshold
        
    def find_carry_opportunities(self) -> List[Dict]:
        """
        Search for carry trade opportunities considering macroeconomic stability
        """
        major_currencies = ['USD', 'EUR', 'GBP', 'JPY', 'AUD', 'CAD', 'CHF', 'NZD']
        opportunities = []
        
        # Get interest rates and economic indicators data
        rates_data = self._fetch_interest_rates_data(major_currencies)
        economic_data = self._fetch_economic_stability_data(major_currencies)
        
        # Analyze all possible pairs
        for high_yield_currency in major_currencies:
            for low_yield_currency in major_currencies:
                if high_yield_currency == low_yield_currency:
                    continue
                
                rate_differential = rates_data[high_yield_currency] - rates_data[low_yield_currency]
                
                if rate_differential >= self.min_rate_differential:
                    # Check economic stability of high-yield currency
                    stability_score = self._calculate_stability_score(
                        economic_data[high_yield_currency]
                    )
                    
                    if stability_score >= self.stability_threshold:
                        risk_premium = self._calculate_risk_premium(
                            economic_data[high_yield_currency],
                            economic_data[low_yield_currency]
                        )
                        
                        expected_return = rate_differential - risk_premium
                        
                        opportunities.append({
                            'pair': f"{high_yield_currency}{low_yield_currency}",
                            'rate_differential': rate_differential,
                            'stability_score': stability_score,
                            'risk_premium': risk_premium,
                            'expected_annual_return': expected_return,
                            'recommended_allocation': self._calculate_optimal_size(
                                expected_return, stability_score
                            )
                        })
        
        return sorted(opportunities, key=lambda x: x['expected_annual_return'], reverse=True)


Gestión de riesgos en las estrategias macroeconómicas

Las estrategias macroeconómicas requieren un enfoque especial en la gestión de riesgos. A diferencia de las estrategias técnicas de corto plazo, aquí tratamos con desequilibrios fundamentales que pueden persistir durante más tiempo del que aguantan nuestros recursos, como dijo Keynes.

El elemento clave es la diversificación no solo entre pares de divisas, sino también entre regiones y factores económicos. Una estrategia basada únicamente en la divergencia de las tasas de interés puede fracasar durante una crisis global cuando las correlaciones entre monedas aumentan sustancialmente.

Igualmente importante resulta la gestión adecuada del tamaño de la posición. Las señales macroeconómicas a menudo muestran alta precisión pero baja frecuencia, lo que requiere un enfoque apropiado para dimensionar las posiciones.

class MacroRiskManager:
    def __init__(self, max_portfolio_risk: float = 0.15):
        self.max_risk = max_portfolio_risk
        self.correlation_matrix = None
        self.last_correlation_update = None
        
    def calculate_position_size(self, signal: Dict, portfolio_context: Dict) -> float:
        """
        Calculate position size considering correlations and macroeconomic risks
        """
        # Base size based on signal strength
        base_size = signal['confidence'] * 0.1  # Maximum 10% per signal
        
        # Adjustment for correlation with existing positions
        correlation_adjustment = self._calculate_correlation_adjustment(
            signal['pair'], portfolio_context
        )
        
        # Adjustment for macroeconomic risk environment
        macro_risk_adjustment = self._assess_macro_risk_environment()
        
        # Adjustment for historical volatility of the pair
        volatility_adjustment = self._get_volatility_adjustment(signal['pair'])
        
        final_size = (base_size * 
                     correlation_adjustment * 
                     macro_risk_adjustment * 
                     volatility_adjustment)
        
        return min(final_size, self.max_risk / 3)  # No more than 1/3 of maximum risk


Los problemas técnicos y sus soluciones

Trabajar con los datos del FMI presenta una serie de desafíos técnicos que debemos comprender y procesar correctamente. La interfaz a veces retorna datos incompletos o de calidad variable. Algunas cifras se publican con revisiones, lo cual puede influir en la consistencia histórica.

El procesamiento de valores faltantes y valores atípicos es particularmente importante. Los datos económicos de los países en desarrollo a menudo contienen lagunas o valores extremos que pueden distorsionar el análisis. El uso de técnicas de interpolación avanzadas y métodos estadísticos robustos se vuelve entonces crítico.

class DataQualityManager:
    def __init__(self):
        self.outlier_threshold = 3.0  # Z-score threshold for outliers
        self.max_missing_ratio = 0.3   # Maximum proportion of missing values
        
    def clean_economic_series(self, series: pd.Series, country: str, indicator: str) -> pd.Series:
        """
        Comprehensive cleaning of economic time series
        """
        # Log initial data quality
        missing_ratio = series.isnull().sum() / len(series)
        
        if missing_ratio > self.max_missing_ratio:
            logger.warning(f"High missing data ratio for {country}.{indicator}: {missing_ratio:.2%}")
        
        # Handle outliers considering economic context
        cleaned_series = self._handle_outliers(series, country, indicator)
        
        # Intelligent interpolation
        cleaned_series = self._smart_interpolation(cleaned_series, indicator)
        
        # Check for structural breaks
        cleaned_series = self._detect_structural_breaks(cleaned_series, country)
        
        return cleaned_series
    
    def _handle_outliers(self, series: pd.Series, country: str, indicator: str) -> pd.Series:
        """
        Handle outliers considering economic specifics
        """
        if indicator in ['PCPIPCH']:  # Inflation can have legitimate extremes
            threshold = 5.0  # Softer threshold for inflation
        elif country in ['AR', 'TR', 'VE']:  # High volatility countries
            threshold = 4.0
        else:
            threshold = self.outlier_threshold
        
        z_scores = np.abs(stats.zscore(series.dropna()))
        outliers = z_scores > threshold
        
        # Replace outliers with median filter values
        series_cleaned = series.copy()
        series_cleaned[outliers] = series.rolling(5, center=True).median()[outliers]
        
        return series_cleaned
```меть законные экстремумы
            threshold = 5.0  # Более мягкий порог для инфляции
        elif country in ['AR', 'TR', 'VE']:  # Страны с высокой волатильностью
            threshold = 4.0
        else:
            threshold = self.outlier_threshold
        
        z_scores = np.abs(stats.zscore(series.dropna()))
        outliers = z_scores > threshold
        
        # Заменяем выбросы на значения, рассчитанные через медианный фильтр
        series_cleaned = series.copy()
        series_cleaned[outliers] = series.rolling(5, center=True).median()[outliers]
        
        return series_cleaned


Perspectivas de desarrollo e integración con el aprendizaje automático

Las modernas capacidades de aprendizaje automático abren nuevos horizontes para el análisis de datos macroeconómicos. El uso de técnicas de aprendizaje profundo permite identificar relaciones no lineales complejas entre indicadores económicos de distintos países.

Particularmente prometedor resulta el uso de redes neuronales recurrentes para pronosticar series temporales económicas y arquitecturas de transformadores para analizar las relaciones entre diversos indicadores económicos.

class MacroeconomicLSTM:
    def __init__(self, sequence_length: int = 12, hidden_size: int = 64):
        self.sequence_length = sequence_length
        self.model = self._build_model(hidden_size)
        
    def _build_model(self, hidden_size: int):
        """
        Create LSTM model for macroeconomic indicators forecasting
        """
        model = tf.keras.Sequential([
            tf.keras.layers.LSTM(hidden_size, return_sequences=True),
            tf.keras.layers.Dropout(0.2),
            tf.keras.layers.LSTM(hidden_size // 2),
            tf.keras.layers.Dropout(0.2),
            tf.keras.layers.Dense(32, activation='relu'),
            tf.keras.layers.Dense(1)
        ])
        
        model.compile(
            optimizer='adam',
            loss='mse',
            metrics=['mae']
        )
        
        return model
    
    def train_on_multi_country_data(self, economic_data: Dict[str, pd.DataFrame]):
        """
        Train model on multiple countries data
        """
        X_train, y_train = self._prepare_training_data(economic_data)
        
        # Add regularization and early stopping
        callbacks = [
            tf.keras.callbacks.EarlyStopping(patience=10, restore_best_weights=True),
            tf.keras.callbacks.ReduceLROnPlateau(factor=0.5, patience=5)
        ]
        
        history = self.model.fit(
            X_train, y_train,
            validation_split=0.2,
            epochs=100,
            batch_size=32,
            callbacks=callbacks,
            verbose=1
        )
        
        return history

La integración con prácticas modernas de aprendizaje automático en la producción permite la creación de un sistema totalmente automatizado que aprende continuamente de los nuevos datos y adapta las estrategias comerciales a las condiciones cambiantes del mercado.


Indicadores básicos para el análisis de divisas

Indicador (código)
Descripción
Impacto en la moneda
Ejemplo de interpretación
NGDP_XDC
PIB nominal en moneda nacional. Muestra la actividad económica general de un país sin considerar la inflación.
Positivo con crecimiento
El crecimiento del PIB del 3% de Australia apunta a una expansión económica → fortalecimiento del dólar australiano
TXG_FOB_USD
Exportación de bienes a precios FOB (en dólares estadounidenses). Refleja el volumen de mercancías enviadas al exterior.
Positivo con crecimiento
El aumento del 15% en las exportaciones de Canadá refleja una fuerte demanda externa → fortalecimiento del CAD
TMG_CIF_USD
Importación de mercancías a precios CIF (en USD). Muestra el volumen de mercancías importadas incluida la entrega.
Negativo con crecimiento
El aumento de las importaciones de Suiza podría provocar salidas de divisas → debilitamiento del CHF
LUR_PT
Tasa de desempleo (como porcentaje de la población en edad laboral). Es un indicador clave del estado del mercado laboral.
Negativo con crecimiento
Un aumento del desempleo en Canadá del 5% al 7% indica problemas en el mercado laboral → debilitamiento del CAD
PCPI_IX
Índice de Precios al Consumidor (IPC). Mide el nivel de precios relativo a un año base.
Negativo con alto crecimiento
Un fuerte aumento del IPC suizo podría indicar inflación → posible debilitamiento del CHF si el banco central no sube la tasa
ENDA_XDC_USD_RATE
Tipo de cambio promedio de la moneda nacional frente al USD. Muestra la fuerza relativa de una moneda.
Sensible al contexto
La caída del tipo de cambio JPY a USD de 110 a 130 indica un debilitamiento del JPY → crecimiento de los pares con JPY en el denominador
BCA_NGDPD
Saldo por cuenta corriente como porcentaje del PIB. Muestra el saldo del comercio exterior y los flujos financieros.
Positivo con crecimiento
Un superávit de cuenta corriente de Australia de +2% del PIB indica un saldo externo saludable → apoyo al AUD
GGXWDG_PIBNG
Deuda pública como porcentaje del PIB. Refleja la carga de la deuda sobre la economía del país.
Negativo con crecimiento
Una deuda gubernamental de Japón por encima del 250% del PIB, podría ser una preocupación para los inversores → presión sobre el JPY
GGXONLB_NGDP
Déficit/superávit presupuestario como porcentaje del PIB. Muestra el estado de las finanzas públicas.
Positivo con crecimiento
El déficit presupuestario de Canadá se reduce del -3% al -1% del PIB, lo que impulsa la confianza → apoyo al CAD

Algunos de estos indicadores tienen una correlación extremadamente alta con el par de divisas (1,00), mientras que otros tienen una correlación extremadamente negativa (-1,00):


Conclusión: de los datos a las ganancias

Los datos del FMI abren el camino para decisiones comerciales estratégicas basadas en señales macroeconómicas. Su aplicación exitosa requiere no tanto algoritmos complejos como una comprensión profunda de las relaciones económicas y la capacidad de transformar la información en ideas de trading viables.

Es importante entender que las estrategias macroeconómicas requieren paciencia y disciplina. No se trata de trading de alta frecuencia, donde las ganancias se miden en milisegundos. Aquí trabajamos con desequilibrios fundamentales que se desarrollan en horizontes trimestrales y anuales.

En el próximo artículo, analizaremos con detalle cómo crear un algoritmo de pronóstico basado en estos datos.

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

Archivos adjuntos |
IMF_Datemine.py (47.76 KB)
Henrique Grilo Verza
Henrique Grilo Verza | 12 feb 2026 en 17:29
Gran contenido, creo que si cruzas estos datos con los tipos de interés y el 10Y, obtendrás un gran indicador semanal.
Simulación de mercado (Parte 24): Iniciando SQL (VII) Simulación de mercado (Parte 24): Iniciando SQL (VII)
En el artículo anterior terminamos de hacer las debidas presentaciones sobre SQL. Así, lo que me había propuesto mostrar y explicar sobre SQL, a mi juicio, quedó debidamente explicado. Esto, para que todos los que vengan a ver el sistema de repetición/simulador en construcción consigan, como mínimo, tener alguna noción de lo que puede estar ocurriendo allí. Esto se debe a que no tiene sentido programar diversas cosas que SQL puede cubrir perfectamente.
Características del Wizard MQL5 que debe conocer (Parte 62): Uso de patrones del ADX y el CCI con aprendizaje por refuerzo TRPO Características del Wizard MQL5 que debe conocer (Parte 62): Uso de patrones del ADX y el CCI con aprendizaje por refuerzo TRPO
El oscilador ADX y el oscilador CCI son indicadores de seguimiento de tendencias y de impulso que pueden combinarse al desarrollar un asesor experto. Retomamos donde lo dejamos en el artículo anterior y analizamos cómo es posible llevar a cabo el entrenamiento en condiciones reales y la actualización del modelo que hemos desarrollado gracias al aprendizaje por refuerzo. Estamos utilizando un algoritmo que aún no hemos tratado en esta serie, conocido como «optimización de políticas de región de confianza» (Trusted Region Policy Optimization, TRPO). Y, como siempre, la creación de asesores expertos mediante el Asistente de MQL5 (Wizard MQL5) nos permite configurar nuestros modelos para su prueba de forma mucho más rápida y, además, de manera que puedan distribuirse y probarse con diferentes tipos de señales.
Simulación de mercado: Iniciando SQL en MQL5 (I) Simulación de mercado: Iniciando SQL en MQL5 (I)
En este artículo, comenzaremos a explorar el uso de SQL dentro de un código MQL5. Veremos cómo podemos crear una base de datos. O, mejor dicho, cómo podemos crear un archivo de base de datos en SQLite, utilizando, para ello, recursos o procedimientos incluidos en el lenguaje MQL5. Veremos también cómo crear una tabla y, después, cómo crear una relación entre tablas mediante una clave primaria y una clave foránea. Todo esto usando, nuevamente, MQL5. Veremos lo sencillo que es crear un código que, en el futuro, podrá portarse a otras implementaciones de SQL, usando una clase que nos ayude a ocultar la implementación creada. Y, lo más importante de todo, veremos que, en diversos momentos, podemos correr el riesgo de que algo no salga bien al usar SQL. Esto se debe a que, dentro del código MQL5, un código SQL siempre se colocará dentro de una STRING.
Optimización basada en biogeografía — Biogeography-Based Optimization (BBO) Optimización basada en biogeografía — Biogeography-Based Optimization (BBO)
La optimización basada en biogeografía (BBO) supone un elegante método de optimización global inspirado en los procesos naturales de migración de especies entre islas de archipiélagos. El algoritmo se basa en una idea simple pero poderosa: las soluciones de alta calidad comparten activamente sus características, mientras que las soluciones de baja calidad adoptan activamente nuevas características, creando un flujo natural de información desde las mejores soluciones hacia las peores. El BBO, un operador de mutación adaptativa único que ofrece un excelente equilibrio entre exploración y explotación, demuestra una alta eficiencia en una variedad de tareas.