Discusión sobre el artículo "Cómo transferir los cálculos de cualquier indicador al código de un asesor experto" - página 3

 

Decidí compartir Indicator.mqh, que fue modificado para mí, tal vez le ahorrará tiempo a alguien al traducir el indicador en una clase.

Archivos adjuntos:
 

Una explosión del pasado aquí.

Un artículo muy interesante. Sonido y agradable concepto ... pero me temo que hay un error en el software distribuido, y no es bueno dejar errores alrededor.


Método GetData. El código distribuido es:

double CIndicator::GetData(const uint buffer_num,const uint shift)
  {
   if(!Calculate())
      return EMPTY_VALUE;
//---
   if((int)buffer_num>=m_buffers)
      return EMPTY_VALUE;
//---
   return ar_IndBuffers[buffer_num].At(m_data_len-shift);
  }

El código corregido debería ser:

double CIndicator::GetData(const uint buffer_num,const uint shift)
  {
   if(!Calculate())
      return EMPTY_VALUE;
//---
   if((int)buffer_num>=m_buffers)
      return EMPTY_VALUE;
//---
   return ar_IndBuffers[buffer_num].At(m_data_len-shift - 1);
  }

El índice del array empieza en 0 y el último elemento tiene índice (m_data_len - 1) en vez de m_data_len, ¿no?

 

rf, sección Trabajar con indicadores personalizados de https://www.mql5.com/es/articles/261

Use of Resources in MQL5
Use of Resources in MQL5
  • www.mql5.com
MQL5 programs not only automate routine calculations, but also can create a full-featured graphical environment. The functions for creating truly interactive controls are now virtually the same rich, as those in classical programming languages. If you want to write a full-fledged stand-alone program in MQL5, use resources in them. Programs with resources are easier to maintain and distribute.
 
Hola muchas gracias
 

Gracias por el artículo. Lo estoy estudiando para alejarme de los indicadores convencionales inestables.

Pero para mi es importante poder visualizar los indicadores en un gráfico. ¿Alguien lo ha implementado?

 

¿Por qué es necesario transferir los cálculos de un indicador a un Asesor Experto?

Muchas personas utilizan indicadores sin EA en absoluto.

Usted puede simplemente dividir los cálculos en etapas.

Por ejemplo, así:

//+------------------------------------------------------------------+
//|FutData.mq5
//|Copyright 2020 - 2021, prostotrader ||
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2020-2021, prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.001"
//---
#property indicator_separate_window
#property indicator_plots   1
#property indicator_buffers 1
//---
enum IND_STAGE
{
  LOAD_TICKS = 0,
  READ_TICKS = 1,
  READ_DEALS = 2,
  FILL_DATA = 3
} stage;
//+------------------------------------------------------------------+
//| Función OnInit personalizada del indicador|
//+------------------------------------------------------------------+
int OnInit()
{
  stage = LOAD_TICKS;  
//---
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Indicador personalizado Función de carga de ticks |
//+------------------------------------------------------------------+
bool LoadTicks(const datetime &a_times[])
{
  return(false);
}
//+------------------------------------------------------------------+
//| Indicador personalizado Función de lectura de ticks primarios |
//+------------------------------------------------------------------+
bool ReadTicks()
{
  return(false);
}
//+------------------------------------------------------------------+
//| Indicador personalizado Función de lectura de ticks secundarios |
//+------------------------------------------------------------------+
bool ReadDeals()
{
  return(false);
}
//+------------------------------------------------------------------+
//| Indicador personalizado Función de llenado de datos |
//+------------------------------------------------------------------+
void FillData()
{
//---
}
//+------------------------------------------------------------------+
//| Indicador personalizado en la función Calcular |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,  
                 const int prev_calculated, 
                 const datetime& time[], 
                 const double& open[], 
                 const double& high[], 
                 const double& low[], 
                 const double& close[], 
                 const long& tick_volume[], 
                 const long& volume[],
                 const int& spread[]  
)
{
    
  if(prev_calculated == 0)
  {
      switch (stage)
      {
        case LOAD_TICKS:
          if(LoadTicks(time) == true)
          {
            stage = READ_TICKS;
          }
          return(0);
        break;
        case READ_TICKS:
          if(ReadTicks() == true)
          {
            stage = READ_DEALS;
          }  
          return(0);
        break;
        case READ_DEALS:
          if(ReadDeals() == true)
          {
            stage = FILL_DATA;
          }  
          return(0);
        break;
        case FILL_DATA:
          stage = LOAD_TICKS;
        break;
      }
  }
  else
  {
    //
  }    
  //---
  return(rates_total);
}
//+------------------------------------------------------------------+
 
prostotrader #:

¿Por qué tengo que transferir los cálculos de un indicador a un Asesor Experto?

Muchas personas utilizan indicadores sin un Asesor Experto en absoluto.

Usted puede simplemente dividir los cálculos en etapas.

Por ejemplo, así:

Debido al hecho de que el mecanismo regular de indicadores funciona a través de un muñón, por ejemplo: https://www.mql5.com/ru/forum/372612 y esto se debe a su aplicación.

Con el aumento de la complejidad de los indicadores, mi Asesor Experto "empantanado". En el probador me di cuenta de muchos otros errores en el trabajo de los indicadores, pero yo no los describen, porque es inútil.

No he entendido su idea.

Некорректная инициализация индикаторов в визуальном тестере
Некорректная инициализация индикаторов в визуальном тестере
  • 2021.07.04
  • www.mql5.com
Если делаю инициализацию индикаторов в OnInit() { } эксперта, то в визуальном тестере индикатор обычно не появляется и не отрисовывается...
 
Sunriser #:

Debido a que el mecanismo indicador regular funciona a través del muñón , por ejemplo: https://www.mql5.com/ru/forum/372612 y esto se debe a su aplicación.

Con la creciente complejidad de los indicadores, mi Asesor Experto "se empantanó". En el probador, me di cuenta de muchos otros errores en el trabajo de los indicadores, pero yo no los describen, porque es inútil.

No entendí su idea.

Para empezar, su código no es del todo correcto.

Yo lo escribiría así:

int OnInit()
  {int  TicksTesterIndicatorHandle = INVALID_HANDLE;
   bool InitComplite=false;
   if(IndicatorInitialization() == false) return(INIT_FAILED);
    return(INIT_SUCCEEDED);
 }
void OnDeinit(const int reason)
{
     if(TicksTesterIndicatorHandle != INVALID_HANDLE) IndicatorRelease(TicksTesterIndicatorHandle);
}
void OnTick()   { //if(!InitComplite)
 // { // IndicatorInitialisation();
 // }   } //+------------------------------------------------------------------+
bool IndicatorInitialization()
   { //---Get TicksTesterIndicator indicator handle
    TicksTesterIndicatorHandle=iCustom(NULL, _Period, "OnInit_TestIndicator");
 //--- Hay que comprobar si se han devuelto valores de Handle no válidos 
  if(TicksTesterIndicatorHandle == INVALID_HANDLE)
      {       Print("Error al crear el indicador TicksTesterIndicator - número de error: ",GetLastError(),"!!!");
      
   }
    else
      { 
      Print("TicksTesterIndicator inicializado, handle: ", TicksTesterIndicatorHandle);
       ArraySetAsSeries(Buf, true);
     InitComplite=true;
     return(true);
   }
    return(false);  
 }

Además, como las funciones de los indicadores deben ejecutarse con el mínimo retardo, los procesos complejos (carga de históricos, cálculos complejos, etc.)

se dividen en varias partes, volviendo a

OnCalculate

valor cero (return(0) ), es decir, el indicador está en la fase inicial hasta que realizamos todas las acciones necesarias con retrasos mínimos en cada fase.

 
В архитектуре MetaTrader 5 организован асинхронный доступ к значениям индикаторов. Иными словами, при получении хэндла индикатора он прикрепляется к графику. Далее этот индикатор производит свои расчеты вне потока советника. Они взаимодействуют лишь на этапе передачи данных, аналогично получению данных тайм-серий. Поэтому и время на выполнение этих операций сопоставимо.

¡¿Así que estás diciendo que será más rápido en la vida real?! -Porque en la realidad será así. Experto en una pista, indicador en otra (y tal vez incluso en diferentes núcleos). Esto es sólo si lo pones en el procesamiento en serie, resulta más lento - pero esto es sólo una limitación artificial debido a la estrategia probador.

 
No entendí del artículo, ¿el class-indicator tiene protección contra barras perdidas? Por ejemplo, hubo un corte de conexión de 5 barras, y luego se cargó el historial, ¿el class-indicator rellenará sólo el último valor en el taladro o hará un recálculo completo?