Discusión sobre el artículo "Ampliación de la librería estándar de MQL5 y la reutilización del código"

 

Artículo publicado Ampliación de la librería estándar de MQL5 y la reutilización del código:

La librería estándar de MQL5 le facilita la vida como desarrollador. No obstante, no abarca todas las necesidades de todos los desarrolladores del mundo, con lo cual querrá tener a su disposición más material personalizado para dar un paso más y ampliarla. En este artículo, se describe la integración del indicador técnico Zig-Zag de MetaQuotes en la librería estándar. Para conseguir nuestro objetivo, nos hemos basado en la filosofía de diseño de MetaQuotes.

En pocas palabras, la interfaz de programación de aplicaciones (API por sus siglas en inglés) está diseñada para proporcionarle fiabilidad, flexibilidad y facilidad de mantenimiento, así como la ventaja de reutilizar el código. Esto es lo que dice la teoría, pero más allá de todo esto, si planea seguir progresando en MQL5 y desarrollar cosas más sofisticadas, como los Asesores Expertos multidivisa, tendrá primero que dominar la librería estándar para garantizar el éxito de sus aplicaciones.

Figure 2. We start downloading MetaQuotes' ZigZag from our MT5 Terminal

Autor: Jordi Bassaganas

[Eliminado]  

Gracias. Muy informativo.

 

Trato de entender lo que significa este código en este artículo por qué tenemos un * cerca de la CINDICATOBUFFER y luego usar at.

((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
((CIndicatorBuffer*)At(1)).Name("HIGH");
((CIndicatorBuffer*)At(2)).Name("LOW");

Agradecería una explicación detallada

gracias

 
rodlivar:<br/ translate="no">

Trato de entender lo que significa este código en este artículo por qué tenemos un * cerca de la CINDICATOBUFFER y luego usar at.

((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
((CIndicatorBuffer*)At(1)).Name("HIGH");
((CIndicatorBuffer*)At(2)).Name("LOW");

Agradecería una explicación detallada

gracias

* indica un puntero. Explicación detallada en este artículo Uso de los punteros a objetos en MQL5
 

cadena

m_handle=iCustom(symbol,period,zigzag,depth,deviation_create,backstep);

No encuentro la ruta al indicador.

¿Cuál es la forma correcta de especificar la ruta aquí, los indicadores que estoy tratando de llamar están en la carpeta estándar

 
Tango_X:

cadena

m_handle=iCustom(symbol,period,zigzag,depth,deviation_create,backstep);

No encuentro la ruta al indicador.

¿Cuál es la forma correcta de especificar aquí, los indicadores que estoy tratando de llamar se encuentran en la carpeta estándar.

Standard Zigzag se encuentra en la carpeta Examples, debe añadir el nombre de la carpeta a la ruta.


 
Rashid Umarov:

El Zigzag estándar se encuentra en la carpeta Examples - es necesario añadir el nombre de la carpeta en la ruta de acceso



2017.07.12 10:38:05.703 Proba2(EURUSD.m,M1) no puede cargar el indicador personalizado 'Examples\ZigZag' [4302]

Que pasa?? todo esta igual que en tu imagen.
 
Tango_X:

2017.07.12 10:38:05.703 Proba2 (EURUSD.m,M1) no puede cargar el indicador personalizado 'Examples\ZigZag'[4302]

¿Qué pasa? Todo es igual que en su imagen.

¿Quién va a mirar el código de error?

ERR_MARKET_NOT_SELECTED

4302

Símbolo no seleccionado en MarketWatch

 
Rashid Umarov:

¿Quién va a mirar el código de error?

ERR_MERCADO_NO_SELECCIONADO

4302

Símbolo no seleccionado en MarketWatch


¡¡¡¡Pongo NULL - funciona, pongo "EURUSD" - no funciona!!!!

bool CiZigZag::Create(const string symbol,const ENUM_TIMEFRAMES period,
                      const int depth,const int deviation_create,const int backstep)
  {
//--- comprobar historial
   if(!SetSymbolPeriod(symbol,period))
      return(false);
//--- crear
   //m_handle=iCustom(symbol,period, "Examples\\ZigZag",depth,deviation_create,backstep);
     //m_handle=iCustom("EURUSD",period, "Examples\\ZigZag",depth,deviation_create,backstep); - NO funciona
     m_handle=iCustom(NULL,period,"Examples\\ZigZag",depth,deviation_create,backstep);       - работает
//--- comprueba el resultado
   if(m_handle==INVALID_HANDLE)
      return(false);
//--- indicador creado con éxito
   if(!Initialize(symbol,period,depth,deviation_create,backstep))
     {
      //--- error de inicialización
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
 
¡Ya lo tengo! La pregunta está resuelta! Tengo un nombre de símbolo con un prefijo) - "EURUSD.m".
 
//+------------------------------------------------------------------+
//|| Crear el indicador "Zig Zag|
//+------------------------------------------------------------------+
bool CiZigZag::Create(const string symbol,const ENUM_TIMEFRAMES period,
                      const int depth,const int deviation_create,const int backstep)
  {
//--- comprobar historial
   if(!SetSymbolPeriod(symbol,period))
      return(false);
//--- crear
   m_handle=iCustom(symbol,period,"zigzag",depth,deviation_create,backstep);
//--- comprueba el resultado
   if(m_handle==INVALID_HANDLE)
      return(false);
//--- indicador creado con éxito
   if(!Initialize(symbol,period,depth,deviation_create,backstep))
     {
      //--- error de inicialización
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
bool CiZigZag::Initialize(const string symbol,const ENUM_TIMEFRAMES period,
                        const int depth,const int deviation_init,const int backstep)
  {
   if(CreateBuffers(symbol,period,3))
     {
      //--- renderización de la línea de estado
      m_name  ="ZigZag";
      m_status="("+symbol+","+PeriodDescription()+","+
               IntegerToString(depth)+","+IntegerToString(deviation_init)+","+
               IntegerToString(backstep)+") H="+IntegerToString(m_handle);
      //--- guardar configuración
      m_depth=depth;
      m_deviation=deviation_init;
      m_backstep=backstep;       
      //--- crear buffers
      ((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
      ((CIndicatorBuffer*)At(1)).Name("HIGH");
      ((CIndicatorBuffer*)At(2)).Name("LOW");
      //--- ok
      return(true);
     }
//--- error
   return(false);
  }


Ayúdame a entender cómo se establece aquí la dirección de indexación de la matriz del búfer del indicador, es decir, lo mismo que ArraySetAsSeries. La dirección por defecto es de presente a pasado, pero necesito que sea de pasado a presente. Desde ayer estoy luchando con esta pregunta ¡Ayuda!