Mira cómo descargar robots gratis
¡Búscanos en Twitter!
Pon "Me gusta" y sigue las noticias
¿Es interesante este script?
Deje un enlace a él, ¡qué los demás también lo valoren!
¿Le ha gustado el script?
Evalúe su trabajo en el terminal MetaTrader 5
Librerías

Biblioteca de alta productividad iTimeSeries - librería para MetaTrader 5

Visualizaciones:
832
Ranking:
(34)
Publicado:
2017.08.10 16:13
\MQL5\Include\ \MQL5\Scripts\
¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa

Uno de los principales problemas de MQL5 hasta el día de hoy es la eliminación de las funciones incorporadas para trabajar con las series temporales. A pesar de que este enfoque haya ampliado las posibilidades de desarrollo para los programadores, también ralentiza el funcionamiento, debido al paso obligatorio que supone la creación y eliminación de nuevas celdas de memoria cada vez que se necesita acceso a los datos de las series temporales. 

...
   if(CopyTime(symbol,timeframe,time,1,checkcandle)==1)
     {
...

Vamos a analizar el popular algoritmo de iBarShift. Para devolver el índice de la barra según su fecha y hora, primero tenemos que llamar ::CopyTime(...), que crea una matriz dinámica, modifica su tamaño, copia los datos y después elimina todo ello de la memoria. Esto no constituye un problema para unas cuantas llamadas individuales, pero puesto que las funciones de trabajo de las series temporales se llaman comúnmente muchas veces en marcos temporales distintos, los elevados gastos de memoria provocan una ralentización considerable en el funcionamiento del programa. Imagínese por un instante el sobregasto inútil de recursos que realizamos, y que tiene lugar al reservar nuevas celdas de memoria cada vez que el programa llama este tipo de método al usar los datos de la serie temporal.

Para acelerar la tarea, la biblioteca que presentamos implementa las clases de la biblioteca estándar CObject y CArrayObj para copiar la matriz de datos una vez, y después de nuevo obtener acceso a ella desde todas las llamadas de las series temporales de este símbolo y periodo concretos. La verdad es que se trata de una espada de doble filo, porque la base de inicialización se prolonga durante más tiempo que la implementación habitual. Sin embargo, las últimas llamadas obtienen acceso a los datos aproximadamente en un 1/100 del periodo de tiempo. En el ejemplo con  iBarShift() este nuevo algoritmo funciona más rápido creando la matriz int[], que guarda la variable, el índice de la barra y después recurre a ella usando time (convertida en el tipo int) como dirección de la matriz. En otras palabras, usted transmite time como dirección directa para obtener acceso a los datos. 

Dos advertencias importantes:

La parte principal del tiempo se invierte en la etapa de inicialización. Si usted planea acceder multitud de veces - más de varios miles de veces durante la formación de una barra - a los datos de las series temporales, debería tener en cuenta métodos alternativos. 

Los objetos de la clase CiTimeSeries están configurados para actualizar automáticamente las barras guardadas cuando se forma una nueva barra. Si se configura este parámetro en el modo "false" se pasará el objeto al modo de alta productividad, que permite ejecutar rápidamente llamadas desde "puntos calientes" extremadamente importantes, pero durante el siguiente ciclo de servicio, necesitará una actualización manual

Ejemplo:

#include <itimeseries_nicholishen.mqh>
//--- declaración global del objeto iTimeSeries 
CiTimeSeries iBar;
int OnInit()
{
//--- fase de inicialización
   iBar.Init(  NULL,
               PERIOD_CURRENT,
               false  // auto-actualización              
               );
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   if(hot_path_operations)
   {  // ejemplo
      index = iBar.Shift(time);
   }
   else if(maintenance_path_operations)
   {
      iBar.Refresh();   
   }
}

Además, usted puede llamar directamente las funciones globales (como en MQL4), sin crear el ejemplar CiTimeSeries, pero la primera vez el tiempo de acceso resultará lento, porque será necesaria una primera inicialización del objeto global "en el plano de fondo" del funcionamiento del programa. Usando la biblioteca, este enfoque puede ser incluso más lento si se llama a una sola función TimeSeries varias veces. Sin embargo, hay una ventaja en el rendimiento definitivo cuando el algoritmo requiere la llamada de más de unos pocos miles de iteraciones de datos de series temporales para el mismo periodo y conjunto de caracteres. 

El desarrollador del algoritmo iBarShift más popular hasta la fecha ha realizado una prueba comparativa de "iBarShift", que podrá encontrar aquí https://www.mql5.com/en/code/1864.

AV Benchmark

Puesto que a día de hoy se trata del método más rápido y preciso, he decidido usarlo como patrón de referencia para la simulación.

New Benchmark

El tiempo total de cálculo de las 100 000 llamadas directas (globales) de las funciones ha resultado 50 más rápido que en el más rápido de los métodos disponibles en la actualidad. La llamada de métodos públicos después de la inicialización en el "modo de productividad" es 100 veces más rápida. 

Están disponibles los métodos públicos y las funciones globales:

Nota: Las funciones globales son las mismas que en MetaTrader 4, es decir,  iBarShift, iTime, etcétera.

//--- inicializa un símbolo y periodo; establecer Auto-refresh en false para el modo de productividad
   bool              Init(string            symbol=NULL,
                          ENUM_TIMEFRAMES   period      = PERIOD_CURRENT,
                          const bool        autoRefresh = true   ); 
//--- inicializa un símbolo y todos los periodos de la matriz ENUM_TIMEFRAMES; establecer Auto-refresh en false para el modo de productividad
   bool              Init(string            symbol,
                          ENUM_TIMEFRAMES   &period[],
                          const bool        autoRefresh = true   );


//--- inicializa todos los periodos
   bool InitAllPeriods (  string            symbol      = NULL,
                        const bool        autoRefresh=true);


//--- establecer auto-refresh en false para gestionar la actualización de datos manualmente
   void              AutoRefresh(const bool ref) { m_autoRefresh=ref;     }
   bool              AutoRefresh() const { return m_autoRefresh;          }


//--- llamada de actualizaciones manualmente; actualiza los datos en todos los periodos inicializados
   bool              Refresh();


   CRatesArray      *GetArrayObjPointer(string            symbol,
                                        ENUM_TIMEFRAMES   period);

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

cheduecoglioni cheduecoglioni

Esperamos cuando TP o SL se activen, y después de esto abrimos una posición en la dirección opuesta. Se comprueba que los recursos sean suficientes antes de enviar la orden comercial. OnTradeTransaction.

Size of candles (text) Size of candles (text)

Tamaño de la barra. El tamaño de la vela se calcula según la fórmula: "minuendo" menos "sustraendo".

CandleRange CandleRange

Dos histogramas en una ventana que muestran la desviación de precios promedio máxima desde el valor inicial, medidas en puntos.

TotalPowerIndicatorX_HTF TotalPowerIndicatorX_HTF

Indicador TotalPowerIndicatorX con posibilidad de cambiar el marco temporal del indicador en los parámetros de entrada.