Gracias por este gran artículo.
Creo que he implementado el patrón de estrategia en un Asesor Experto, pero tal vez de una manera diferente.
Esto podría dar un ejemplo más práctico para nuestros queridos lectores mente, y para mí tal vez me gustaría obtener su retroalimentación si he cometido errores conceptuales:
Voy a simplificar el proceso aquí:
el propio Experto es un objeto y se convierte en el Contexto:
- Tengo un Enum para poder elegir la estrategia (como ejemplo STRATEGY_RSI, STRATEGY_MA,...)
- Tengo una sentencia switch en el OnInit(), sobre el enum de la estrategia, y dependiendo del resultado, yo
switch(strategyName) { case STRATEGY_RSI : m_strategy = new Strategy_RSI(); break; case STRATEGY_MA : m_strategy = new Strategy_MA(); break; default: break; }
- Establezco los parámetros de entrada en la estrategia a través de un objeto parámetro (como mqlparams)
[...] // añadir los parámetros de la señal a la estrategia a través del experto Método Expert.AddParameterObject(signal_RSI_Params); // signal_RSI_Params es el objeto parámetro que contiene los parámetros de entrada //detalle del método AddParameterObject (simplificado): bool CExpert::AddParameterObject(CParameter & parameter) { if(!m_strategy.AddParameterObject(parameter)) { return(false); } } return true; } // añade los parámetros del experto genérico. Expert.InitStrategyParameters(expert_1_Params); //detalle del método (simplificado) : bool CExpert::InitStrategyParameters(CParameter & expertParameters) { // if(!m_strategy.InitStrategyParameters(expertParameters)) { [...] return false; } return true; }
- Todas las estrategias implementan los mismos métodos (abrir una señal, cerrar una operación,...)
- Todas las estrategias pueden cargar una señal o sus indicadores personalizados
en la función OnTick del experto llamo a los métodos genéricos de la estrategia
bool CExpert::CheckOpenLong(void) { [...] if(true == m_strategy.CheckOpenLong([...])) { [...] } [...] }
Funciona muy bien ya que puedo probar varias estrategias / optimizaciones con el mismo experto.
La única cosa que nunca encontré, además de poner los parámetros de entrada en un archivo separado, es cómo cargar dinámicamente los parámetros de entrada de acuerdo a lo que el usuario está eligiendo como este parámetro particular de entrada (es decir, la entrada de la estrategia).
Me gustaría obtener su opinión sobre la forma en que he implementado, ¿es un patrón de estrategia, o un híbrido, lo que podría mejorarse?
¿Y tienes una idea de cómo podríamos tener (no creo que sea posible con MT5) parámetros de entrada contextuales dinámicos?
Muchas gracias
Didma
muy instructivo
¿Por qué funciones con la misma funcionalidad tienen nombres diferentes?
por ejemplo aquí
void Memento::SetState(string state) { m_state=state; } void Originator::State(string state) { m_state=state; }
- 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
Artículo publicado Patrones de diseño en MQL5 (Parte 4): Patrones conductuales 2:
Este artículo concluye la serie sobre patrones de diseño en ingeniería de software. Ya hemos mencionado que existen tres tipos de patrones de diseño: de creación, estructurales y conductuales. Hoy perfeccionaremos los patrones conductuales restantes, que nos ayudarán a especificar la forma en que interactúan los objetos de manera que nuestro código sea limpio.
Recordatorio (Memento)
El patrón puede utilizarse para externalizar el estado de un objeto y ofrecer una función de reversión. También se conoce como token.
¿Qué hace el patrón?
Podemos aplicar el patrón cuando necesitemos guardar una instantánea del estado de un objeto para reconstruirla más tarde, y cuando una interfaz directa para recuperar el estado puede revelar detalles de la ejecución y romper el encapsulamiento del objeto. De esta forma, el patrón capturará y exportará el estado del objeto para su posterior recuperación. A continuación figura un diagrama con la estructura de este patrón, que muestra cómo podría funcionar:
Autor: Mohamed Abdelmaaboud