English Русский 中文 Deutsch 日本語 Português
preview
La técnica comercial RSI Deep Three Move

La técnica comercial RSI Deep Three Move

MetaTrader 5Sistemas comerciales | 15 enero 2024, 15:41
539 0
Javier Santiago Gaston De Iriarte Cabrera
Javier Santiago Gaston De Iriarte Cabrera

1. Introducción

El presente artículo se basa en una nueva serie de estudios que demuestran varias técnicas comerciales basadas en el RSI. Una técnica comercial es una forma de usar un indicador. La investigación se basa en el lenguaje de programación MQL5.


2. Una breve introducción al indicador RSI

El RSI (índice de fuerza relativa) es un indicador técnico para medir la fuerza y ​​​​el impulso de los valores, incluidas las acciones, las divisas o las materias primas. El RSI se calcula mediante fórmulas matemáticas y se muestra en un gráfico que muestra el nivel de fortaleza o debilidad de un valor durante un periodo específico.

El RSI supone que a medida que los precios crecen, el valor se sobrecompra y, a medida que los precios caen, el valor se sobrevende. El RSI ayuda a los tráders a encontrar posibles cambios de tendencia o correcciones de precios.

El cálculo del RSI implica comparar el beneficio promedio de un valor durante un periodo determinado con la pérdida promedio de un valor durante el mismo periodo. El RSI estándar se muestra en una escala de 0 a 100. Los valores superiores a 70 se consideran sobrecomprados, mientras que los valores inferiores a 30 se consideran sobrevendidos. El RSI es un indicador popular entre los tráders porque puede proporcionar señales de alerta temprana sobre tendencias potenciales. Por ejemplo, si el RSI de un valor aumenta constantemente y alcanza un nivel superior a 70, esto podría indicar que el valor está sobrecomprado y debe corregirse. Por otro lado, si el RSI cae continuamente y alcanza un nivel por debajo de 30, esto podría indicar que el valor está sobrevendido y se espera un rebote.

El RSI no debe utilizarse como única base a la hora de tomar decisiones comerciales. Los tráders suelen usar el RSI en combinación con otras herramientas de análisis técnico e indicadores de mercado para comprender mejor las condiciones del mercado y tomar decisiones comerciales fundamentadas. Normalmente, el RSI se calcula en un periodo igual a 14.


3. Qué es el RSI (descripción más detallada)

3.1 Introducción

El índice de fuerza relativa (RSI) es un indicador técnico que se utiliza para analizar los mercados financieros. Está diseñado para mostrar la fortaleza o la debilidad actual e histórica de una acción o mercado según los precios de cierre de un periodo comercial reciente. El indicador no debe confundirse con la fuerza relativa:

el RSI se clasifica como un oscilador de impulso y mide la velocidad y la magnitud de los movimientos de precios. El impulso es la velocidad a la que un precio sube o baja. La fuerza relativa (RS) es la relación entre los cierres más altos y más bajos. En concreto, se calculan dos valores absolutos promedio de los cambios en el precio de cierre, es decir, las dos sumas que incluyen los tamaños de las velas en el gráfico de velas. El RSI calcula el impulso como la relación entre cierres más altos y los cierres totales: las acciones que han tenido cambios positivos más fuertes poseen un RSI más alto que las acciones que han tenido cambios negativos más fuertes.

El RSI se utiliza con mayor frecuencia en un periodo de 14 días y se mide en una escala de 0 a 100, con los máximos y mínimos marcados en 70 y 30 respectivamente. Se utilizan marcos temporales más cortos o más largos para pronósticos alternativamente más cortos o más largos. Los máximos y mínimos (80 y 20 o 90 y 10) resultan menos comunes pero indican un impulso más fuerte.

El índice de fuerza relativa fue desarrollado por J. Welles Wilder y publicado en 1978 en el libro "New Concepts in Technical Trading Systems", así como en la revista Commodities (ahora Modern Trader) en el número de junio de 1978. El RSI se ha convertido en uno de los índices osciladores más populares;

ofrece señales de compra cuando un valor o divisa está sobrevendido y señales de venta cuando está sobrecomprado.

El RSI con los parámetros recomendados y la optimización diaria se probó y comparó con otras estrategias en Marek and Šedivá (2017). Las pruebas se realizaron de forma aleatoria en función del tiempo y de las empresas (por ejemplo, Apple, Exxon Mobil, IBM, Microsoft) y demostraron que el RSI puede dar buenos resultados, pero generalmente se ve superado por una simple estrategia de "compra y mantenimiento" a medida que aumenta el periodo temporal.

3.2 Cálculo

Para cada periodo comercial se calcula el cambio alcista U o el cambio bajista D. Los periodos alcistas se caracterizan por el hecho de que el nuevo cierre es más alto que el anterior:

1

Por el contrario, en los periodos bajistas, el precio de cierre es inferior al precio de cierre del periodo anterior.

2

Si el último cierre es igual al anterior, entonces U y D serán iguales a cero. Tenga en cuenta que U y D son números positivos.

Los promedios ahora se calcularán a partir de secuencias de dichos U y D usando una media móvil de n periodos suavizada o modificada (SMMA o MMA), que será una media móvil exponencialmente suavizado con α = 1/n. Estas son medias positivamente ponderadas de términos positivos que se comportan de forma aditiva respecto a la partición.

Wilder formuló originalmente el cálculo de la media móvil como: newval = (prevval * (n - 1) + newdata) / n, que es el equivalente al suavizado exponencial antes mencionado. Por ello, los nuevos datos simplemente se dividirán por n o se multiplicarán por α, mientras que las medias anteriores se cambiarán por (n – 1)/n, es decir 1 – α. Algunas soluciones comerciales, como AIQ, usan una media móvil exponencial (EMA) estándar en lugar de la SMMA de Wilder como media. Las medias móviles suavizadas deben inicializarse de la forma correspondiente a una media móvil simple utilizando los primeros n valores de la serie de precios.

La relación de estas medias es la fuerza relativa o el coeficiente de fuerza relativa:

3

Después, el coeficiente de fuerza relativa se convierte en un índice de fuerza relativa que oscilará entre 0 y 100:

4

Si la media de U es cero, RS y RSI también serán cero. Si la media de U es igual a la media de D, RS será 1 y RSI será 50. Si el valor medio de U es máximo, de modo que el valor medio de D sea cero, entonces el valor de RS divergirá hacia el infinito y el RSI será igual a 100.


3.3 Definición

3.3.1 Configuración básica

El RSI se presenta en un gráfico por encima o por debajo del gráfico de precios. El indicador tiene una línea superior, generalmente en la marca 70, una línea inferior en 30 y una línea media punteada en 50. Wilder recomendó un periodo de suavizado de 14 (suavizado exponencial, es decir, α = 1/14 o N = 14).

image EURUSD 30m

3.3.2. Principios

Wilder argumentó que cuando un precio asciende muy rápido, en algún momento se considerará sobrecomprado. Asimismo, cuando el precio desciende muy rápido, en algún momento se considerará sobrevendido. En ambos casos, Wilder creía que una reacción o un cambio de rumbo resultaría inevitable.

El nivel de RSI es un indicador de la fortaleza comercial reciente de una acción. La inclinación del RSI es directamente proporcional a la velocidad a la que cambia la tendencia. La distancia recorrida por el RSI es proporcional a la magnitud del movimiento.

Wilder creía que los máximos y los mínimos se producen cuando el RSI asciende por encima de 70 o desciende por debajo de 30. Tradicionalmente, los valores de RSI por encima del nivel 70 se consideran en territorio de sobrecompra, mientras que los valores de RSI por debajo del nivel 30 se consideran en territorio de sobreventa. Un nivel entre 30 y 70 se considera neutral, mientras que un nivel de 50 representa una señal de que no hay tendencia.


3.3.3. Divergencia

Wilder también creía que una divergencia entre el RSI y la acción del precio supone una señal muy fuerte de la inminencia de un punto de inflexión en el mercado. Se produce una divergencia bajista cuando el precio alcanza un nuevo máximo, mientras que el RSI alcanza un máximo más bajo sin confirmar un nuevo movimiento alcista. La divergencia alcista ocurre cuando el precio alcanza un nuevo mínimo, mientras que el RSI alcanza un mínimo más alto.

3.3.4. Condiciones de sobrecompra y sobreventa

Wilder creía que las "oscilaciones malas" del RSI por encima y por debajo de 50 suponen señales intensas de una reversión del mercado. Por ejemplo, digamos que el RSI llega a 76, regresa a 72 y luego asciende a 77. Si el índice cae por debajo de 72, supondrá una "mala oscilación" por encima de 70, según Wilder.

Wilder escribió que los gráficos y las áreas de apoyo y resistencia a veces resultan más fáciles de ver en el gráfico de RSI que en el gráfico de precios. La línea central del índice de fuerza relativa es igual a 50, lo que a menudo se considera como la línea de apoyo y resistencia del indicador.

Si el índice de fuerza relativa está por debajo de 50, generalmente significará que las pérdidas de la acción son superiores a sus ganancias. Cuando el índice de fuerza relativa está por debajo de 50, normalmente significará que las ganancias son superiores a las pérdidas.

3.3.5. Tendencias alcistas y bajistas

Además de la interpretación original de Wilder del RSI, Andrew Cardwell desarrolló varias interpretaciones nuevas del RSI que ayudan a identificar y confirmar las tendencias. En primer lugar, Cardwell señaló que una tendencia alcista normalmente se comercia entre un RSI de 40 y 80, mientras que una tendencia bajista normalmente se comercia entre un RSI de 60 y 20. Cardwell también señaló que cuando los valores cambian de una tendencia alcista a una bajista y viceversa, el RSI sufre un "desplazamiento de rango".

Además, señaló que la divergencia bajista: 1) sucede solo durante una tendencia alcista y 2) generalmente conduce solo a una corrección a corto plazo y no a una inversión de tendencia. Por tanto, la divergencia bajista supone una señal de confirmación de una tendencia alcista. Asimismo, la divergencia alcista supone una señal de confirmación de una tendencia bajista.

3.3.6. Reversiones

Finalmente, Cardwell descubrió la existencia de reversiones positivas y negativas del RSI. Las reversiones son lo opuesto a la divergencia. Por ejemplo, se produce una reversión positiva cuando una corrección de precios en una tendencia alcista provoca un mínimo más alto en comparación con la última corrección de precio, mientras que el RSI da como resultado un mínimo más bajo en comparación con la corrección anterior. Se produce una reversión negativa cuando un repunte de tendencia bajista alcanza un máximo más bajo en comparación con el último repunte de tendencia bajista, pero el RSI alcanza un máximo más alto en comparación con el repunte anterior.

En otras palabras, a pesar de que el impulso ha sido más fuerte, como indica un máximo más alto o un mínimo más bajo en el RSI, el precio no ha logrado alcanzar un máximo más alto o un mínimo más bajo. Y esto indica que la tendencia principal está a punto de reanudarse. Cardwell señaló que las reversiones positivas solo ocurren en una tendencia alcista, mientras que las reversiones negativas solo suceden en una tendencia bajista y, por lo tanto, su existencia confirma la tendencia.


4. RSI Deep Three Move

La técnica Deep Three Move genera una señal cuando el RSI entra en un nivel de sobreventa o sobrecompra y realiza tres movimientos consecutivos en una dirección, mientras que el cuarto movimiento (en la misma dirección) supone una confirmación. Las condiciones comerciales son las siguientes:

  • Una señal alcista se detecta siempre que el RSI está por debajo del RSI anterior, que a su vez también estará por debajo del RSI anterior, y este último también se encontrará por debajo del RSI anterior. Como normalmente se utiliza con un RSI de 8 periodos, el RSI de hace tres periodos debería estar por debajo de 20, mientras que el RSI de hace cuatro periodos debería estar por encima de 20 (para evitar señales duplicadas).
  • Una señal bajista se detecta siempre que el RSI está por encima del RSI anterior, que a su vez también estará por encima del RSI anterior, y este último también se encontrará por encima del RSI anterior. Como normalmente se utiliza con un RSI de 8 periodos, el RSI de hace tres periodos debería estar por encima de 80, mientras que el de hace cuatro periodos debería estar por debajo de 80 (para evitar señales duplicadas).

La siguiente figura muestra una señal alcista basada en dicha técnica:

Technique



5. Código

//+------------------------------------------------------------------+
//|                                          RSI Deep Three Move.mq5 |
//|                              Javier S. Gastón de Iriarte Cabrera |
//|              https://https://www.mql5.com/en/users/jsgaston/news |
//+------------------------------------------------------------------+
#property copyright "Javier S. Gastón de Iriarte Cabrera"
#property link      "https:/https://www.mql5.com/en/users/jsgaston/news"
#property version   "1.01"
#property script_show_inputs
#include <GetIndicatorBuffers.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>


#include <Trade\AccountInfo.mqh>
//---
CPositionInfo  m_position;                                                         // object of CPositionInfo class
CTrade         m_trade;                                                            // object of CTrade class
CSymbolInfo    m_symbol;                                                           // object of CSymbolInfo class
CAccountInfo   m_account;                                                          // object of CAccountInfo class

CTrade  trade;
CTrade  Ctrade;

input string             Expert_Title             ="RSI Deep Three Move Strategy"; // Document name

enum ENUM_LOT_TYPE
  {
   LOT_TYPE_FIX   = 0,                                                             // fix lot
   LOT_TYPE_RISK  = 1,                                                             // risk %
  };
//--- input parameters

input ENUM_LOT_TYPE        inp_lot_type               = LOT_TYPE_FIX;              // type of lot

input double               inp_lot_fix                = 0.01;                      // fix lot
input double               inp_lot_risk               = 0.01;
input bool     InpPrintLog          = false;                                       // Print log
ulong                    Expert_MagicNumber       =11777;            
bool                     Expert_EveryTick         =false;            
input ENUM_TIMEFRAMES my_timeframe=PERIOD_CURRENT;                                 // Timeframe

input ENUM_APPLIED_PRICE   Inp_RSI_applied_price = PRICE_CLOSE;                    // RSI: type of price
input int InpPeriodRSI=8;                                                          // Period of the signal for the RSI inside custom
int    handle_iCustom;


input int ptsl = 5000;                                                             // points for stoploss
input int pttp = 5000;                                                             // points for takeprofit
string Orden;
double sl2;
double tp2;

Podemos ver un fragmento de código complejo escrito en MQL5. Esta es una estrategia comercial que usa el índice de fuerza relativa (RSI) para identificar posibles oportunidades comerciales. El código incluye la utilización de varias clases como CPositionInfo, CTrade, CSymbolInfo y CAccountInfo. También incluye el uso de varios parámetros de entrada, como el tipo de lote, el lote fijo, el porcentaje de riesgo, el nombre del asesor, el número mágico, el marco temporal, el periodo de promediación de RSI, el tipo de precio y los puntos de stop loss y take profit. Asimismo, el código incluye el uso de variables como handle_iRSI2, handle_iCustom, Orden, sl y tp. La misión del código consiste en identificar posibles oportunidades comerciales basadas en el indicador RSI.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   handle_iCustom=iCustom(_Symbol,my_timeframe,"\\Indicators\\Examples\\RSI",InpPeriodRSI);

   if(handle_iCustom==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d",
                  _Symbol,
                  EnumToString(my_timeframe),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }

El código es parte de la función de inicialización del asesor en MQL5. Se usa para crear un descriptor del indicador iCustom para un símbolo y un marco temporal determinados. También crea descriptores de indicadores iRSI con los parámetros indicados. Si no se puede crear el identificador del indicador iCustom, se mostrará un mensaje de error y el indicador se detendrá. Si el identificador se ha creado correctamente, significará que la inicialización ha tenido éxito.

void OnTick()
  {
   MqlTick tick;
   double last_price = tick.ask;
   SymbolInfoTick(_Symbol,tick);
   int total = PositionsTotal();
//---
// Retrieve the current value
   MqlTradeResult  result;
   MqlRates rates[];
//---
   double array_rsi[];
   ArraySetAsSeries(array_rsi,true);
   int start_pos=0,count=5;
   if(!iGetArray(handle_iCustom,0,start_pos,count,array_rsi))
      return;
   string text="";
   for(int i=0; i<count; i++)
      text=text+IntegerToString(i)+": "+DoubleToString(array_rsi[i],Digits()+1)+"\n";
//---
   Comment(text);
     {
      if(array_rsi[0] < array_rsi[1] && array_rsi[1] < array_rsi[2] && array_rsi[2] < array_rsi[3] && array_rsi[3] < 20.0 && array_rsi[4] > 20.0)
        {
         Print("Open Order Buy");
         Alert(" Buying");
         Orden="Buy";
         sl=NormalizeDouble(tick.ask - ptsl*_Point,_Digits);
         tp=NormalizeDouble(tick.bid + pttp*_Point,_Digits);
         trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,get_lot(tick.bid),tick.bid,sl,tp,"Buy");
         return;
        }
     }
     {
      if(array_rsi[0] > array_rsi[1] && array_rsi[1] > array_rsi[2] && array_rsi[2]  > array_rsi[3] && array_rsi[3] > 80.0 && array_rsi[4] < 80.0)
        {
         Print("Open Order Sell");
         Alert(" Selling");
         Orden="Sell";
         sl=NormalizeDouble(tick.bid + ptsl*_Point,_Digits);
         tp=NormalizeDouble(tick.ask - pttp*_Point,_Digits);
         trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,get_lot(tick.ask),tick.ask,sl,tp,"Sell");
         return;
        }
     }
   if(total>0)
     {
      if(Orden=="Sell" && array_rsi2[0]<20.0)
        {
         trade.PositionClose(_Symbol,5);
         Print("cerró sell");
         return;
        }
      if(Orden=="Buy" && array_rsi2[0]>80.0)
        {
         trade.PositionClose(_Symbol,5);
         Print("cerró buy");
         return;
        }
     }
  }
Este fragmento de código representa la función Expert Tick en el lenguaje MQL5. Se usa para abrir y cerrar posiciones en el mercado. Primero, extrae el valor actual del símbolo y lo almacena en la variable tick MqlTick. Después recupera el número total de posiciones y lo almacena en la variable total. A continuación extrae los valores RSI de la función iCustom y los almacena en array_rsi y una variable. Luego comprueba si los valores del RSI se encuentran por debajo de 20 para una orden de venta y por encima de 80 para una orden de compra y, en caso afirmativo, abre una posición con los parámetros adecuados. Finalmente, comprueba si los valores del RSI han superado el umbral de 20 u 80 y, de ser así, cerrará la posición.
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      //if(InpPrintLog)
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      //if(InpPrintLog)
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                  __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }

Este código se usa para copiar los valores del búfer de indicador a un array. La función toma cinco parámetros: el descriptor del indicador, el búfer de indicador, la posición inicial en el búfer, el número de valores a copiar y un array para almacenar los valores. Luego verifica si el array es dinámico y, de ser así, restablece el código de error y copia los valores del búfer al array. Si el copiado falla, se imprime un mensaje de error y se retorna false. En caso opuesto, se retorna true.

double get_lot(double price)
  {
   if(inp_lot_type==LOT_TYPE_FIX)
      return(normalize_lot(inp_lot_fix));
   double one_lot_margin;
   if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,one_lot_margin))
      return(inp_lot_fix);
   return(normalize_lot((AccountInfoDouble(ACCOUNT_BALANCE)*(inp_lot_risk/100))/ one_lot_margin));
  }
double normalize_lot(double lt)
  {
   double lot_step = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   lt = MathFloor(lt / lot_step) * lot_step;
   double lot_minimum = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   lt = MathMax(lt, lot_minimum);
   return(lt);
  }

Este código se usa para calcular el tamaño del lote de una transacción. La primera función, get_lot(), toma el precio de la transacción como argumento y verifica el tipo de lote (fijo o basado en riesgo). Si el tipo de lote es fijo, se llama a la función normalize_lot() para normalizar el tamaño del lote. Si el tipo de lote se basa en el riesgo, la función OrderCalcMargin() se usa para calcular el margen requerido para la transacción y la función AccountInfoDouble() se utiliza para obtener el balance de la cuenta. Luego, el tamaño del lote se calcula dividiendo el balance de la cuenta por el margen y multiplicándolo por el porcentaje de riesgo. Después se llama a la función normalize_lot() para normalizar el tamaño del lote. La función normalize_lot() toma el tamaño del lote como argumento y calcula el tamaño del paso y el tamaño mínimo del lote para el símbolo dado. A continuación, el tamaño del lote se redondea hasta el paso más cercano y, de ser necesario, se aplica un tamaño de lote mínimo.


6. Resultados

EURUSD, periodos de 30 minutos y 900 puntos para el SL (recuerde usar 8 periodos para RSI) para 2023 desde el uno de enero hasta finales de junio.

Gráfico

Datos



7. Conclusión

Obviamente, no todos los métodos son ideales. Seguramente encontrará algunas señales malas, especialmente en los periodos de tendencia. Como habrá notado, durante las tendencias importantes el método no funciona correctamente.

La estrategia debe optimizarse para su posterior aplicación en el mercado, pero, en esencia, la idea consiste en presentar un enfoque sobre el análisis de mercado basado en la reversión hacia la media.

A continuación le mostramos los resultados rentables para todos los símbolos de mi bróker en una cuenta de centavos con un periodo de 30 minutos hasta finales de junio de 2023.

Optimización

Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/12846

Archivos adjuntos |
Transacciones comerciales. Estructuras de solicitud y respuesta, descripción y registro. Transacciones comerciales. Estructuras de solicitud y respuesta, descripción y registro.
En el presente artículo veremos cómo trabajar con las estructuras de las solicitudes comerciales: la creación de una solicitud, su verificación preliminar antes de enviarla al servidor, la respuesta del servidor a una solicitud comercial y la estructura de las transacciones comerciales. Asimismo, crearemos funciones simples y cómodas para enviar órdenes comerciales al servidor y, basándonos en todo lo discutido, y también crearemos un asesor-informante sobre las transacciones comerciales.
Redes neuronales: así de sencillo (Parte 51): Actor-crítico conductual (BAC) Redes neuronales: así de sencillo (Parte 51): Actor-crítico conductual (BAC)
Los dos últimos artículos han considerado el algoritmo SAC (Soft Actor-Critic), que incorpora la regularización de la entropía en la función de la recompensa. Este enfoque equilibra la exploración del entorno y la explotación del modelo, pero solo es aplicable a modelos estocásticos. El presente material analizará un enfoque alternativo aplicable tanto a modelos estocásticos como deterministas.
Teoría de categorías en MQL5 (Parte 15): Funtores con grafos Teoría de categorías en MQL5 (Parte 15): Funtores con grafos
El artículo continúa la serie sobre la implementación de la teoría de categorías en MQL5, analizando los funtores como un puente entre grafos y conjuntos. Volveremos nuevamente a los datos del calendario y, a pesar de sus limitaciones en el uso de un simulador de estrategias, justificaremos el uso de funtores para predecir la volatilidad mediante la correlación.
Todo lo que necesita saber sobre la estructura de un programa MQL5 Todo lo que necesita saber sobre la estructura de un programa MQL5
Cualquier programa en cualquier lenguaje de programación tiene una estructura determinada. En este artículo, aprenderá los componentes principales de la estructura de un programa en MQL5, que pueden resultarle muy útiles a la hora de crear un sistema comercial o una herramienta comercial para MetaTrader 5.