Discusión sobre el artículo "Crear Multi-Expert Advisors basados en los modelos de trading" - página 3

 
Serj_Che:

Creo que habría que cambiar el nombre del artículo: por qué hacerlo sencillo cuando puedes hacerlo complicado.

Buena observación.

Interesante:

Al menos he entendido (o creo haber entendido) la esencia de lo que el autor quería transmitir a los lectores.

A eso me refiero. Todo el mundo ha entendido la esencia de lo que está escrito. ¿Quién de los que lo lean tomará los códigos adjuntos como una implementación lista de alguna fase de desarrollo? Prácticamente nadie, excepto el autor. El artículo resultó ser uno introductorio, del que se puede tomar sólo la idea, no el código. Y no hacía falta hacer tantas letras para eso.

Si te consideras un cargador, entonces métete en el cuerpo. Si decides enseñar a otros o compartir tu propia experiencia, entonces debes escribir pensando en cada palabra y en la estructura de la información que estás presentando. Si los pensamientos están caminando, y quieren abrazar la inmensidad y escribir sobre todo en el mundo, entonces no hay nada que tomar la escritura de artículos plan fundamental. Y las palabras que esta es la versión 1.0 beta no es adecuado. Como se echa a perder la reputación de un codificador competente.

Deseo que la dirección del foro esté más atenta a los materiales publicados y realice un control más estricto de los trabajos de los autores (no sólo de los artículos, sino también de los códigos). Y que para llenar el número de publicaciones no se lleve todo seguido. Para que no pase como con Codebase en MQL4. Trabajos realmente valiosos sin análogos se pierden detrás de cientos de versiones beta 1.0.

 

Руководству форума желаю...

1. No me digas cómo escribir o qué escribir.

2. No le diga a MetaQuotes Software Corporation qué política de marketing debe seguir y cómo evaluar y seleccionar a los autores para su producto.

Considere estos puntos no como un deseo, sino como una advertencia. Si continúa difundiendo negatividad en el hilo del foro dedicado a mi artículo y además le dice a MetaQuotes lo que tiene que hacer, será considerado por mí como un intento de denigrar mi trabajo y cuestionar la profesionalidad del equipo de MetaQuotes. En este caso, presentaré la correspondiente queja a los moderadores de esta sección, y tengo serias razones para creer que el conflicto entre usted y yo se resolverá a mi favor.

No llevemos el asunto a la aclaración oficial de relaciones y vayamos simplemente al acuerdo amistoso: dejarás de escribir en el hilo dedicado a mi artículo información que en nada se relaciona con el tema que aquí se trata y dejarás de denigrar el trabajo realizado por mí. Será mejor que dejes de publicar nada aquí. Entiendo tu punto de vista, lo has expresado en las páginas anteriores. Yo discrepo de él y tú discrepas de mi opinión. Creo que ambos somos personas inteligentes y dejemos esta polémica inútil.

 
udmurt2:

Deseo que la dirección del foro esté más atenta a los materiales publicados y lleve a cabo un control más estricto de los trabajos de autor (no sólo de los artículos, sino también de los códigos). Y que para llenar el número de publicaciones no se lleve todo seguido. Para que no pase como con Codebase en MQL4. Trabajos realmente valiosos sin análogos se pierden detrás de cientos de versiones beta 1.0.

+1

Creo que la sección "Artículos ¡¡¡ debería ser útil para los consumidores!!! ¡Nadelektsya, no asustarlos y confundirlos !

Y ahora - "Chukcha es un escritor, Chukcha no es un lector" .....

 

>>> ¡Imagínese,su único Asesor Experto negocia varias decenas de estrategias de trading, en todos los instrumentos disponibles y en todos los plazos posibles a la vez! Además, este Asesor Experto está perfectamente probado en el tester, y uno o varios sistemas de gestión de dinero están disponibles para todas las estrategias incluidas en él.

Así es exactamente como está organizado mi trading con Expert Advisor en el Campeonato. Todo, según me parece, es más sencillo. Lo principal es diseñar todo correctamente y no mezclarlo en un montón.

//+------------------------------------------------------------------+
//|Vigor-Levels.mq5
//| Copyright 2010, MetaQuotes Software Corp. | |
//|http://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#include <Vigor\Strategy.mqh>

#include <Vigor\TradeSignal.mqh>
#include <Vigor\ADXMAStrategy.mqh>
#include <Vigor\ADXStrategy.mqh>
#include <Vigor\MAVSimpleStrategy.mqh>
#include <Vigor\Order.mqh>
#include <Vigor\Dispatcher.mqh>
#include <Vigor\AdaptiveStrategy.mqh>
CDispatcher dispatcher;

//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   int myTick = 60;
   EventSetTimer(myTick);
   dispatcher.tickSeconds = myTick;

  //-- el objeto despachador trabaja con órdenes, los objetos de estrategia 
// sólo se ocupan de las señales y no trabajan con el mercado

  //-- estrategias simples que negocian por separado. herederos de la clase CStrategy
 //--estrategias
   CMAVStrategy *s4 = new CMAVStrategy();
   s4.Symbol = "EURGBP";
   s4.onBars = true;
   s4.TimeFrame = PERIOD_M5;
   s4.HourStart = 7;
   s4.HourEnd = 18;
   s4.Risk = 0.1;
   s4.takeProfit = 2000;
   s4.stopLoss = 450;
   s4.trailingStop = 77;
   s4.lots = 0.1;
   s4.maxLots = 5;
  //--custom;
   s4.period1 = 2;
   s4.max = 0.0025;
   s4.sensity = 0.39;
   s4.unsensity = 0.53;
   s4.init();
   dispatcher.strategies.Add(s4);



  //--estrategias
   CADXStrategy *s2 = new CADXStrategy();
   s2.Symbol = "GBPUSD";
   s2.onBars = true;
   s2.TimeFrame = PERIOD_M5;
   //s2.mHoraInicio = 0;
   //s2.mHoraFin = 24;
   s2.Risk = 0.13;
   s2.takeProfit = 2000;
   s2.stopLoss = 360;
   s2.trailingStop = 150;
   s2.lots = 0.1;
   s2.maxLots = 5;
  //--personalizado
   s2.period = 17;
   s2.level = 0.0042;
   s2.init();
   dispatcher.strategies.Add(s2);

  //--etc.


  //-- estrategia adaptativa que contiene dentro de sí un virtual 
//trade de la lista conectada (CStrategy herederos de nuevo), 
//también CStrategy heredero y para dispetcher'a no hay diferencia.
   CAdaptiveStrategy *sadapt4 = new CAdaptiveStrategy();
   sadapt4.onBars = false;
   sadapt4.mRisk = 0.13;
   sadapt4.lots = 0.1;
   sadapt4.performance_variant = 2;
   sadapt4.maxLots = 5;
   sadapt4.init();
        
        // ***************************************** M30
        CADXStrategy *s_gbpjpy1 = new CADXStrategy();    s_gbpjpy1.Symbol = "GBPJPY";    s_gbpjpy1.onBars = true;    s_gbpjpy1.TimeFrame = PERIOD_M30;  s_gbpjpy1.takeProfit = 2000; s_gbpjpy1.trailingStop = 70; s_gbpjpy1.lots = 0.1; s_gbpjpy1.maxLots = 5; 
        s_gbpjpy1.stopLoss = 300;  s_gbpjpy1.init();
        sadapt4.strategies.Add(s_gbpjpy1); // poner todo en la estrategia adaptativa
        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
        //  и т.д.
        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
        


  dispatcher.strategies.Add(sadapt4);


 // rellénalo con lo que quieras

  return(0);
  }
//+------------------------------------------------------------------+
//| Función de desinicialización experta|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   dispatcher.control();
  }
//+------------------------------------------------------------------+
 

En realidad, el ejemplo que has puesto es muy parecido al mío. Hay menos diferencias de lo que puede parecer. Todo se implementa también a través de clases y cada clase-estrategia tiene sus propios parámetros independientes. La mayor diferencia está en su disposición, en tu caso todas las estrategias son manejadas por el dispatcher, en el mío son manejadas en una lista de tipo CObject. De hecho, mi enfoque no es mucho más complicado que el tuyo, simplemente hablamos de las mismas cosas, pero en diferente lenguaje.

Inicialmente pretendía que mi enfoque resolviera cualquier combinación de tres "multis": multitimeframe, multistrategy, multitool. Ahora lo veo como mucho más que eso. En la segunda parte, estoy pensando en cubrir el problema de las decisiones del experto. El Asesor Experto decidirá cómo operar, qué operar y cuándo operar. Todo esto permite mi enfoque. Probablemente su enfoque también, y es bueno, porque varias soluciones de la misma cosa es un desarrollo.

Por cierto, ¿puedes mirar la implementación del propio despachador?

 
class CDispatcher {
   public:
      CTrade trade;
      CList strategies; 
      CList newOrders; 
      CList currentOrders;
      CList* strategiesResults;
      int repeats;
      int tickSeconds;
   private:
      ulong Magic;            
   public:
      void CDispatcher() {
          strategiesResults = new CList();
          repeats = 5;
          tickSeconds = 1;
      }
      void ~CDispatcher() {
        delete(strategiesResults);
      }
      
      void control();

      bool controlLimits();
      void controlOrders();
      bool controlOpen();
      bool controlClose();
      bool controlModify();      
      ulong ticketOpen(string smb, ENUM_ORDER_TYPE type,double lot,int SL,int TP);
      double countLotByRisk(CSymbolInfo *symbinfo, CStrategy *s, int dist, double risk, double lot, double maxlot);
       double NormalPrice(CSymbolInfo *symbinfo, double d);
      double NormalLot(CSymbolInfo *symbinfo, double lot);
      double BasePrice(CSymbolInfo *symbinfo, int dir);
      double ReversePrice(CSymbolInfo *symbinfo, int dir);
      double ReversType(ENUM_ORDER_TYPE type);
      double NormalTP(CSymbolInfo *symbinfo, int dir,double op,double pr,int TP,double stop);
      double NormalSL(CSymbolInfo *symbinfo, int dir,double op,double pr,int SL,double stop);
      void   checkDeals(CStrategy *s);
       ENUM_ORDER_TYPE getTypeByDirection(int dir);
       int getDirectionByType(ENUM_ORDER_TYPE type);
};
No voy a publicar la aplicación. Todo está claro aquí. Las estrategias son todas descendientes de CObject. Pero son procesados por el despachador. Necesitamos ir de lo simple a lo complejo. Una simple interfaz de objetos, para un observador externo, debería ocultar todos los detalles de la implementación. Sólo quiero decir que no hay nada extraordinario en multis en absoluto. Teniendo OOP y polimorfismo todo se hace simplemente.
 
Vigor:
No voy a publicar la aplicación. Todo está claro aquí. Las estrategias son todas descendientes de CObject. Pero son procesados por el despachador. Necesitamos ir de lo simple a lo complejo. Una simple interfaz de objetos, para un observador externo, debería ocultar todos los detalles de la implementación. Sólo quiero decir que no hay nada extraordinario en multis en absoluto. Con OOP y polimorfismo todo se hace simplemente.
+1. Totalmente de acuerdo. Y en general quiero decir que mi enfoque es como dos gotas de agua similar al tuyo. Las estrategias son todas descendientes de la estrategia base CModel, que a su vez es descendiente de CObject. Igual que tú, todo se inicializa dinámicamente y se pone en una lista. Igual que tú he implementado una simple interfaz de objeto ocultando todos los detalles de implementación. Otra cosa es que tuve que describir toda la implementación en el artículo, y por eso mucha gente pensó que era complicado. Pero para usar objetos de mi tipo ni siquiera necesitas saber cómo funciona todo por dentro.
 

Vasily, ¡muchas gracias por el artículo! Lo he leído como un torbellino. Me resultó muy fácil, supongo que estoy maduro para este tipo de material. Yo, como muchos traders, reflexioné sobre algunas de las cuestiones tratadas en el artículo. Algunas las resolví, otras no. Y otras se quedaron sólo en una vaga idea. Y fue muy agradable e inesperado ver todo en una presentación tan sistemática.

La escala de cuestiones resueltas y, además, de perspectivas es enorme. No todas las "mentes" son lo suficientemente maduras para plantearlas, y mucho menos para resolverlas. De ahí los comentarios al estilo de la fábula de Krylov "La zorra y las uvas", pues "aunque el ojo ve al ojo, el diente no conoce al diente". Y el deseo de autoafirmación es indomable, por eso comentan y esperan que los demás piensen: "¡Ah, la Musgo! ¡Sé que es lo bastante fuerte como para ladrarle al Elefante!". :) Ni siquiera merece la pena prestarle atención.

Sigue creando, ¡esperamos la continuación!

P.D. Aunque todavía no puede trabajar en MetaTrader 5 en la vida real, puede utilizar el artículo "Copiar el comercio de MetaTrader 5 a MetaTrader 4". ¡Es algo muy sensato y probado! ¡Así que todo es muy relevante y se puede utilizar en el comercio de hoy!

 

......
¿Por qué, sin temor al pecado,
alaba el Cuco al Gallo?

 

es mejor ser merecidamente elogiado que injustificadamente etiquetado.