English Русский 中文 Deutsch 日本語 Português
preview
Características del Wizard MQL5 que debe conocer (Parte 28): Revisión de las GAN con una introducción a las tasas de aprendizaje

Características del Wizard MQL5 que debe conocer (Parte 28): Revisión de las GAN con una introducción a las tasas de aprendizaje

MetaTrader 5Sistemas comerciales |
138 0
Stephen Njuki
Stephen Njuki

Introducción

Volvemos a una forma de red neuronal que habíamos considerado en un artículo anterior refiriéndonos a un hiperparámetro específico. La tasa de aprendizaje. La Red Generativa Adversarial (Generative Adversarial Network, GAN) es una red neuronal que funciona por parejas, en la que una red se entrena tradicionalmente para discernir la verdad, mientras que otra se entrena para discernir las proyecciones de la primera a partir de sucesos reales. Esta dualidad implica que la red entrenada tradicionalmente (la primera) está tratando de engañar a la segunda y esto es cierto, sin embargo las dos redes están en el "mismo equipo" y el entrenamiento simultáneo de ambas en última instancia hace que la red generadora sea más útil para el comerciante. En este artículo nos centraremos en el proceso de entrenamiento centrándonos en la tasa de aprendizaje.

Como siempre en estos artículos, el objetivo es mostrar clases de señales, o clases de seguimiento o clases de gestión de dinero que no están preinstaladas en la biblioteca y, sin embargo, podrían ser compatibles de alguna forma con las estrategias existentes de un comerciante. El asistente MQL5 en particular permite que el ensamblaje y la prueba de esto se realicen sin problemas y con requisitos de codificación mínimos para las funciones comerciales comunes de un Asesor Experto. Lo que se puede sacar de aquí es una clase personalizada que se puede probar de forma independiente como un Asesor Experto ensamblado o en paralelo con otras clases de asistente, ya que el ensamblaje del asistente lo permite fácilmente. Para cualquiera que sea nuevo en el proceso de montaje de asistentes, estos artículos aquí y aquí proporcionan saludables introducciones al tema.

Por lo tanto, en este artículo, dentro de una red generativa antagónica (GAN) simple, examinaremos la importancia, si la hay, que tienen las tasas de aprendizaje en el rendimiento. El término “rendimiento” en sí es muy subjetivo y, estrictamente hablando, las pruebas deberían realizarse durante períodos mucho más largos que los que consideramos en estos artículos. Entonces, para nuestros propósitos, el "rendimiento" será simplemente el beneficio total teniendo en cuenta el factor de recuperación. Vamos a considerar varios tipos (o calendarios) de tasas de aprendizaje, y nos esforzaremos por realizar pruebas exhaustivas con todos ellos, sobre todo si se diferencian claramente del resto.

El formato de este artículo va a ser un poco diferente al que estamos acostumbrados en artículos anteriores. Al presentar cada formato de tasa de aprendizaje, lo acompañarán sus informes de pruebas de estrategia. Esto contrasta ligeramente con lo que teníamos antes, donde los informes normalmente aparecían al final del artículo, antes de la conclusión. Por lo tanto, este es un formato exploratorio que mantiene una mente abierta al potencial que tienen o no las tasas de aprendizaje en el rendimiento de los algoritmos de aprendizaje automático, o más específicamente, las GANs. Debido a que analizamos múltiples tipos y formatos de tasas de aprendizaje, es importante tener métricas de prueba uniformes y es por eso que utilizaremos un solo símbolo, marco de tiempo y período de prueba en todos los tipos de tasas de aprendizaje.

En base a esto, nuestro símbolo será EURJPY, el marco temporal será el diario y el período de prueba será el año 2023. Estamos haciendo pruebas en una GAN y su arquitectura por defecto es sin duda un factor. Siempre existe el argumento de que un diseño más elaborado en términos de número y tamaño de cada capa es primordial, sin embargo, si bien todas esas son consideraciones importantes, nuestro enfoque aquí es la tasa de aprendizaje. Para tal fin, nuestras GAN serán relativamente simples, con solo 3 capas que incluyen una capa oculta. El tamaño general de cada uno será 5-8-1 desde la entrada hasta la salida. Las configuraciones para estos se indican en el código adjunto y pueden ser modificadas fácilmente por el lector si desea utilizar una configuración alternativa.

Para generar las condiciones largas y cortas, estamos implementando todos los diferentes formatos de tasa de aprendizaje de la misma manera que lo hicimos en este artículo mencionado anteriormente que exploró el uso de GAN como una clase de señal personalizada en MQL5. Ese código fuente como siempre está adjunto, sin embargo se presenta a continuación para completar:

//+------------------------------------------------------------------+
//| "Voting" that price will grow.                                   |
//+------------------------------------------------------------------+
int CSignalCGAN::LongCondition(void)
{  int result = 0;
   double _gen_out = 0.0;
   bool _dis_out = false;
   GetOutput(_gen_out, _dis_out);
   _gen_out *= 100.0;
   if(_dis_out && _gen_out > 50.0)
   {  result = int(_gen_out);
   }
   //printf(__FUNCSIG__ + " generator output is: %.5f, which is backed by discriminator as: %s", _gen_out, string(_dis_out));return(0);
   return(result);
}
//+------------------------------------------------------------------+
//| "Voting" that price will fall.                                   |
//+------------------------------------------------------------------+
int CSignalCGAN::ShortCondition(void)
{  int result = 0;
   double _gen_out = 0.0;
   bool _dis_out = false;
   GetOutput(_gen_out, _dis_out);
   _gen_out *= 100.0;
   if(_dis_out && _gen_out < 50.0)
   {  result = int(fabs(_gen_out));
   }
   //printf(__FUNCSIG__ + " generator output is: %.5f, which is backed by discriminator as: %s", _gen_out, string(_dis_out));return(0);
   return(result);
}


Tasa de aprendizaje fija

Para empezar, la tasa de aprendizaje fija es probablemente la que utilizan la mayoría de los nuevos usuarios de algoritmos de aprendizaje automático, ya que es la más simple. Una medida estándar mediante la cual los pesos y sesgos de un algoritmo se ajustan en cada iteración de aprendizaje; no cambia en absoluto a lo largo de las diferentes épocas de entrenamiento.

Las ventajas de una tasa fija se derivan de su simplicidad. Es muy fácil de implementar ya que tienes un valor de punto flotante para usar en todas las épocas y esto también hace que la dinámica de entrenamiento sea más predecible, algo que ayuda a comprender mejor todo el proceso, así como a depurarlo. Además, esto fomenta la reproducibilidad. En muchas redes neuronales, especialmente aquellas que se inicializan con pesos aleatorios, los resultados de una ejecución de prueba determinada no son necesariamente reproducibles. En nuestro caso, en todos los diferentes formatos de tasa de aprendizaje, utilizamos un peso inicial estándar de 0,1 y un sesgo inicial de 0,01. Al tener dichos valores fijos estamos mejor posicionados para reproducir los resultados de nuestras pruebas.

Además, una tasa de aprendizaje fija aporta estabilidad en el proceso de entrenamiento inicial porque la tasa de aprendizaje no disminuye ni cae en las etapas posteriores como es el caso con la mayoría de los otros formatos de tasa de aprendizaje. Los datos que se encuentran más adelante en las ejecuciones de prueba se consideran en un grado similar a los datos más antiguos. Esto hace que la evaluación comparativa y la comparación sean más fáciles en los casos en que se está ajustando una red para otro hiperparámetro que no es la tasa de aprendizaje. Este podría ser, por ejemplo, el peso inicial utilizado por la red neuronal. Al tener una tasa de aprendizaje fija, dicha búsqueda de optimización puede llegar más rápidamente a un resultado significativo.

El principal problema con una tasa de aprendizaje fija es la convergencia subóptima. Existe la preocupación de que durante el entrenamiento, el descenso de gradiente podría quedarse atascado en mínimos locales y no converger de forma óptima. Esto es especialmente importante antes de establecer la tasa de aprendizaje fija ideal. Además, existe el argumento de la mala adaptación, que sigue a un consenso general de que, a medida que se van sucediendo épocas de entrenamiento, la necesidad de "aprender" no sigue siendo la misma. La opinión general es que está disminuyendo.

Sin embargo, con estos pros y contras, obtenemos la siguiente imagen cuando se realiza una prueba para el año 2023 para el par EURJPY en el marco temporal diario:

r1

c1


Decaimiento escalonado

A continuación está la tasa de aprendizaje por decaimiento escalonado, que en realidad es una tasa de aprendizaje fija con simplemente dos parámetros adicionales que rigen cómo se reduce la tasa de aprendizaje fija inicial con cada época subsiguiente. Esto se implementa de la siguiente manera en MQL5:

      if(m_learning_type == LEARNING_STEP_DECAY)
      {  int _epoch_index = int(MathFloor((m_epochs - i) / m_decay_epoch_steps));
         _learning_rate = m_learning_rate * pow(m_decay_rate, _epoch_index);
      }

Por lo tanto, determinar la tasa de aprendizaje en cada época es un proceso de dos pasos. Primero, necesitamos obtener el índice de época. Se trata simplemente de un índice que mide lo avanzados que estamos a través de las épocas, durante una sesión de entrenamiento. Su valor está fuertemente influenciado por un segundo parámetro de entrada, 'm_decay_epoch_steps'. Nuestro bucle for está contando hacia atrás, no hacia arriba como suele ser el caso, por lo que restamos el valor i actual del número total de épocas y luego realizamos una división Math-Floor de esto contra esta segunda entrada. El resultado entero redondeado de esto sirve como un índice de época que usamos para cuantificar cuánto necesitamos reducir la tasa de aprendizaje inicial en la época actual. Si nuestro tamaño de paso es 5, entonces siempre esperamos y sólo reducimos la tasa de aprendizaje después de cada 5 épocas. Si el tamaño del paso es 10, entonces la reducción se produce después de 10 épocas, y así sucesivamente.

La estrategia general del decaimiento escalonado es reducir gradualmente esta tasa de aprendizaje para no "sobrepasar" el mínimo y llegar eficientemente a la solución óptima. Se enorgullece de ofrecer un equilibrio entre un aprendizaje inicial rápido y un ajuste posterior. Puede ayudar a escapar de los mínimos locales y los puntos de silla en el paisaje de pérdidas y a menudo conduce a una mejor generalización a través de la reducción de la tasa de aprendizaje (a diferencia de la tasa fija) y esto podría ayudar a evitar el sobreajuste.

Si realizamos corridas como las anteriores para el EURJPY en el diario para el año 2023, obtenemos lo siguiente:

r2

c2


Decaimiento exponencial

La tasa de aprendizaje de decaimiento exponencial, a diferencia de la tasa de decaimiento escalonado, es más suave en su reducción de la tasa de aprendizaje. Recordemos que arriba vimos cómo la tasa de aprendizaje por decaimiento de pasos solo se reduce cuando el índice de época aumenta o después de un número predefinido de pasos de época. Con la descomposición exponencial, la reducción en la tasa de aprendizaje siempre ocurre con cada nueva época. Esto se representa mediante la siguiente fórmula:

Dónde

  • "lr" es la tasa de aprendizaje
  • "initial_lr" es la tasa de aprendizaje inicial
  • e "is" la constante de Euler
  • decay_rate y epoch representan sus nombres respectivamente

Esto se codificaría en MQL5 de la siguiente manera:

      else if(m_learning_type == LEARNING_EXPONENTIAL_DECAY)
      {  _learning_rate = m_learning_rate * exp(-1.0 * m_decay_rate * (m_epochs - i + 1));
      }

La desintegración exponencial es capaz de reducir la tasa de aprendizaje multiplicándola por un factor de desintegración en cada nueva época. Esto garantiza una reducción más gradual de la tasa de aprendizaje en comparación con el enfoque escalonado anterior. Las ventajas de un enfoque gradual tienden a coincidir más con los enfoques generales para reducir la tasa de aprendizaje. Estos ya se compartieron anteriormente con el método de decaimiento escalonado. Lo que la desintegración exponencial podría proporcionar, y que falta en la desintegración escalonada, es evitar caídas repentinas en la tasa de aprendizaje que pueden desestabilizar el proceso de entrenamiento.

Si realizamos pruebas como las indicadas anteriormente para el EURJPY en el marco temporal diario del año 2023, obtenemos los siguientes resultados:

r3

c3

Aunque la desintegración exponencial permite una reducción más suave y gradual de la tasa de aprendizaje, al revisar la tasa de aprendizaje en cada época, no todos los pasos de reducción son del mismo tamaño. Al inicio del entrenamiento, las reducciones en la tasa de aprendizaje son significativamente mayores y estos valores se reducen a medida que el entrenamiento avanza hacia las últimas épocas.


Decaimiento polinomial

Esto, al igual que la disminución exponencial, también reduce la tasa de aprendizaje a medida que avanza el entrenamiento. La principal diferencia con la desintegración exponencial es que la desintegración polinomial comienza reduciendo lentamente la tasa de aprendizaje. La tasa de reducción aumenta eventualmente a medida que el entrenamiento se acerca a las últimas épocas del proceso. Esto se puede representar en una ecuación de la siguiente manera:

Dónde

  • lr(t) es la tasa de aprendizaje en la época t
  • "initial_lr" es la tasa de aprendizaje inicial
  • t es el índice de la época
  • max_epochs y power representan sus nombres respectivamente

La implementación sería entonces la siguiente:

      else if(m_learning_type == LEARNING_POLYNOMIAL_DECAY)
      {  _learning_rate = m_learning_rate * pow(1.0 - ((m_epochs - i) / m_epochs), m_polynomial_power);
      }

La desintegración polinomial introduce el parámetro de entrada "potencia" a nuestra clase de señal. Todos los formatos de tasa de aprendizaje se combinan en un único archivo de clase de señal, donde los parámetros de entrada permiten la selección de una tasa de aprendizaje específica. Este archivo de código se adjunta al final del artículo. La entrada de potencia polinomial es un exponente constante de un factor que utilizamos para reducir la tasa de aprendizaje dependiendo de la época, como se muestra en la fórmula anterior.

La desintegración polinomial, al igual que la desintegración exponencial y la desintegración escalonada, reducen sus tasas de aprendizaje. Lo que podría diferenciar la desintegración polinomial de este grupo es, como se mencionó anteriormente, la rápida reducción en la tasa de aprendizaje hacia el final del entrenamiento. Esta última reducción rápida tiende a permitir un "ajuste fino" del proceso de entrenamiento, de manera que la tasa de aprendizaje se mantiene lo más alta posible durante el mayor tiempo posible y solo se reduce cuando se agotan las épocas. Este 'ajuste fino' se logra determinando la potencia polinomial óptima en varias situaciones de entrenamiento y, una vez determinado esto, se puede esperar un proceso de aprendizaje más óptimo.

Las ventajas de la desintegración polinomial son similares a las que hemos mencionado anteriormente con otros formatos de tasa de aprendizaje, centrándose principalmente en la reducción gradual, que proporciona un proceso más suave en genera.m El ajuste fino de la tasa de aprendizaje como se mencionó además de determinar las tasas de aprendizaje ideales a través de las épocas, también permite el control de la cantidad de tiempo que toma el proceso de entrenamiento. Se puede entender que una potencia polinomial mayor acelera el proceso de entrenamiento, mientras que una potencia baja debería ralentizarlo.

Las pruebas realizadas en el marco temporal diario del EURJPY durante el año 2023 nos arrojan los siguientes resultados:

r4

c4


Decaimiento temporal inverso

El tiempo inverso también reduce la tasa de aprendizaje por época mediante lo que se conoce como decaimiento temporal. Si bien anteriormente consideramos una reducción inicial rápida en la tasa de aprendizaje con decaimiento exponencial versus una reducción lenta en la tasa de aprendizaje con decaimiento polinomial, el decaimiento temporal permite una reducción aún más lenta en la tasa de aprendizaje, lo que lo hace más adecuado que incluso el decaimiento polinomial cuando se manejan conjuntos de datos de entrenamiento muy grandes.

La fórmula para el tiempo inverso es:

Dónde

  • ηn+1 es la tasa de aprendizaje en la época n + 1
  • ηn es la tasa de aprendizaje previa en la época n
  • d es la tasa de desintegración
  • y no es el índice de época.

Implementamos esto en MQL5 de la siguiente manera:

      else if(m_learning_type == LEARNING_INVERSE_TIME_DECAY)
      {  _learning_rate = m_prior_learning_rate / (1.0 + (m_decay_rate * (m_epochs - i)));
         m_prior_learning_rate = _learning_rate;
      }

Este algoritmo es ideal para conjuntos de datos de entrenamiento muy grandes, dada la forma en que realmente ralentiza la reducción de la tasa de aprendizaje. Comparte la mayoría de las ventajas ya mencionadas con los otros formatos de tasa de aprendizaje. Se incluye aquí como una muestra de estudio para ver cómo se compararía con estas otras tasas de aprendizaje cuando se prueba en el mismo símbolo, marco de tiempo y período de prueba. Se adjunta el código fuente completo, para que el usuario pueda realizar cambios para realizar pruebas más elaboradas. Sin embargo, si hacemos una prueba siguiendo la configuración que hemos estado utilizando hasta ahora, obtenemos los siguientes resultados:

r5

c5


Recocido de coseno

El programador de tasa de recocido de coseno también reduce la tasa de aprendizaje, gradualmente, hacia un mínimo preestablecido siguiendo una función coseno. El objetivo de reducción de la tasa de aprendizaje es similar a los formatos mencionados anteriormente, sin embargo, con el recocido de coseno hay un mínimo objetivo y el proceso continúa reiniciándose cada vez que se alcanza la tasa de aprendizaje mínima hasta que se agotan todas las épocas.

La fórmula para esto se puede presentar de la siguiente manera:

Dónde

  • lr(t) es la tasa de aprendizaje en la época t
  • "initial_lr" es la tasa de aprendizaje inicial
  • t es el índice de la época
  • T es el número total de épocas
  • min_lr es la tasa mínima de aprendizaje

La implementación de esto en MQL5 puede ser la siguiente:

      else if(m_learning_type == LEARNING_COSINE_ANNEALING)
      {  _learning_rate = m_min_learning_rate + (0.5 * (m_learning_rate - m_min_learning_rate) * (1.0 + MathCos(((m_epochs - i) * M_PI) / m_epochs)));
      }

El recocido de coseno es más adecuado para conjuntos de datos grandes, incluso más que el decaimiento temporal inverso. Esto se debe a que, mientras que la descomposición temporal inversa pospone suficientemente las grandes caídas en la tasa de aprendizaje hacia las últimas épocas de entrenamiento, el recocido coseno permite un "reinicio" del aprendizaje al restaurarlo a su valor inicial una vez que se alcanza una tasa de aprendizaje mínima preestablecida. Esto es similar pero diferente de otra técnica conocida como "reinicio en caliente", donde en un ciclo de entrenamiento preestablecido la tasa de aprendizaje se restaura a su valor inicial.

Los reinicios en caliente serían adecuados en escenarios de entrenamiento muy grandes donde se utilizan lotes/ciclos de modo que cada lote se divida en épocas, a diferencia del enfoque de lote único que hemos estado considerando hasta ahora en todos los formatos de tasa de aprendizaje. Cuando se utilizan lotes, el restablecimiento o restauración de la tasa de aprendizaje a su valor original se realizará automáticamente al final de un lote determinado.

Los resultados de las pruebas con el formato de lote único para el recocido de coseno nos dan el siguiente informe:

r6

c6

Además, también es posible realizar un ajuste fino con el recocido de coseno, ya que tenemos un parámetro de entrada adicional de tasa de aprendizaje mínima. Dependiendo del valor que le asignemos a esta tasa, no sólo podremos controlar la calidad/minuciosidad del proceso de entrenamiento, sino que también podremos determinar cuánto durará el entrenamiento a lo largo de todas las épocas. Entonces, dependiendo del tamaño de los datos de entrenamiento con los que uno se enfrenta, esto puede ser enormemente significativo.

Con este fin, a menudo se argumenta que el recocido coseno proporciona un equilibrio entre la exploración y la explotación. La exploración es la búsqueda de la tasa de aprendizaje ideal, especialmente a través del ajuste y puesta a punto de la tasa de aprendizaje mínima; mientras que la explotación se utiliza para referirse a la recolección de los mejores pesos y sesgos de la red mientras se utilizan las tasas de aprendizaje más conocidas. Esto tiende a conducir a una mejor generalización del modelo dada la doble optimización.


Tasa de aprendizaje cíclica

La tasa de aprendizaje cíclica, a diferencia de los formatos que hemos visto hasta ahora, comienza aumentando la tasa de aprendizaje antes de finalmente reducirla al mínimo. Esto sucede siguiendo un patrón cíclico. Por lo tanto, el entrenamiento siempre comienza con la tasa mínima de aprendizaje en cada ciclo. Se guía por la siguiente fórmula:

Dónde

  • η(t) es la tasa de aprendizaje en la época t
  • ηmín es la tasa mínima de aprendizaje
  • ηmáximo es la tasa máxima de aprendizaje
  • Tcycle es el número total de épocas en un lote o ciclo determinado (estamos probando solo con ciclos individuales)
  • (t modTcycle) es el resto de dividir el número de épocas de un ciclo por el índice de la época. Multiplicamos este valor por 2

Implementamos esto en MQL5 de la siguiente manera:

      else if(m_learning_type == LEARNING_CYCLICAL)
      {  double _x = fabs(((2.0 * fmod(m_epochs - i, m_epochs))/m_epochs) - 1.0);
         _learning_rate = m_min_learning_rate + ((m_learning_rate - m_min_learning_rate) * fmax(0.0, (1.0 - _x)));
      }

Realizar pruebas con esta tasa de aprendizaje mientras mantenemos las mismas configuraciones de símbolo, marco de tiempo y período de prueba que hemos estado usando anteriormente nos da estos resultados:

r7

c7

Hay otra implementación de la tasa de aprendizaje cíclico llamada 'triangular-2' donde una vez más la tasa de aprendizaje se incrementa inicialmente y luego se reduce al mínimo. La diferencia aquí, sin embargo, con lo que hemos visto anteriormente es que el valor máximo de la tasa de aprendizaje al que se aumenta la tasa, continúa reduciéndose con cada ciclo.

Consideraremos este formato de tasa de aprendizaje, así como formatos adicionales que incluyen la tasa de aprendizaje adaptativa que por sí misma es relativamente amplia ya que presenta diferentes formatos; reinicios en caliente y las tasas de ciclo único para el próximo artículo.


Conclusión

Para concluir, hemos visto cómo la alteración únicamente de la tasa de aprendizaje dentro de un algoritmo de aprendizaje automático, como las redes generativas antagónicas, puede producir una gran variedad de resultados diferentes. Claramente, la tasa de aprendizaje es un hiperparámetro muy sensible. El objetivo principal de algo que puede parecer tan trivial como una tasa de aprendizaje, es llegar a los pesos y sesgos de red más concretos y buscados, y sin embargo, está claro que el camino elegido para llegar a estos pesos y sesgos, cuando se prueba dentro de una cantidad fija de tiempo y recursos, puede variar significativamente dependiendo de la tasa de aprendizaje utilizada.


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

Archivos adjuntos |
SignalWZ_28.mqh (15.88 KB)
gan_learn_r.mq5 (7.52 KB)
Algoritmo de campo eléctrico artificial (AEFA) — Artificial Electric Field Algorithm (AEFA) Algoritmo de campo eléctrico artificial (AEFA) — Artificial Electric Field Algorithm (AEFA)
Este artículo presenta el algoritmo de campo eléctrico artificial (AEFA) inspirado en la ley de Coulomb de la fuerza electrostática. El algoritmo modela fenómenos eléctricos para resolver problemas de optimización complejos usando partículas cargadas y las interacciones de estas. El AEFA presenta propiedades únicas en el contexto de otros algoritmos relacionados con las leyes de la naturaleza.
Redes neuronales en el trading: Modelo de doble atención para la previsión de tendencias Redes neuronales en el trading: Modelo de doble atención para la previsión de tendencias
Continuamos la conversación sobre el uso de la representación lineal por partes de las series temporales iniciada en el artículo anterior. Y hoy hablaremos de la combinación de este método con otros enfoques del análisis de series temporales para mejorar la calidad de la previsión de la tendencia del movimiento de precios.
Del básico al intermedio: Comando FOR Del básico al intermedio: Comando FOR
En este artículo hablaremos de los conceptos más básicos sobre el comando FOR. Todo lo que se mostrará aquí debe asimilarse y comprenderse a fondo. A diferencia de otros comandos que hemos tratado anteriormente, este comando FOR tiene ciertas peculiaridades que lo hacen muy complejo con rapidez. Así que, querido lector, no permitas que este tipo de material se acumule. Comienza a estudiarlo y practicarlo cuanto antes. El contenido expuesto aquí tiene un propósito puramente didáctico. En ningún caso debe considerarse una aplicación cuya finalidad no sea aprender y estudiar los conceptos mostrados.
Del básico al intermedio: Comando SWITCH Del básico al intermedio: Comando SWITCH
En este artículo aprenderemos a utilizar el comando SWITCH en su forma más simple y básica. El contenido expuesto aquí tiene un propósito puramente didáctico. En ningún caso debe considerarse una aplicación cuya finalidad no sea el aprendizaje y el estudio de los conceptos presentados.