Librerías: Calendario - página 4

 
fxsaber:

Esto no se hace. Póngase en contacto con un especialista.

Claro, acabo de darme cuenta de lo que quiere decir. Gracias
 
Me di cuenta de backtesting parece estar limitado a unos 5 años (a partir de 2017), a pesar de que todos los eventos de noticias se descargan correctamente (archivo BIN es 67mb). Hay un límite a cuántos eventos MT5 puede manejar en la memoria para backtesting?
 
mqtrader #:
Me di cuenta de backtesting parece estar limitado a unos 5 años(a partir de 2017), a pesar de que todos los eventos de noticias se descargan correctamente (archivo BIN es 67mb). ¿Existe un límite a la cantidad de eventos MT5 puede manejar en la memoria para backtesting?
#property script_show_inputs

#include <fxsaber\Calendar\Calendar.mqh> // https://www.mql5.com/es/code/32430

input bool inFromFile = false;

#define  CALENDAR_FILENAME "Calendar.bin" // Nombre del fichero para leer/escribir el Calendario.

void OnStart()
{
  CALENDAR Calendar;
  
  if (inFromFile)
    Calendar.Load(CALENDAR_FILENAME);
  else
  {
    Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // Tomó TODO el calendario.
    Calendar.Save(CALENDAR_FILENAME); // > > 65 MB.
  }
  
  Print(Calendar[0].ToString());
}


Resultado.

2007.01.06 23:30 USD 1 CFTC Crude Oil Non-Commercial Net Positions(cftc-crude-oil-non-commercial-net-positions), United States(US) | 2.2 K |  | 19.8 K | 

El primer evento en la base de datos del calendario es enero de 2007.

 
Acabo de darme cuenta de que los valores de "Previsión" comienzan a partir de 2017.05.05, por lo que el backtest sólo puede comenzar a partir de esa fecha al ejecutar el ejemplo. Se pueden utilizar otros valores anteriores a esa fecha.

¡Gracias una vez más fxsaber por esta biblioteca tan útil!
 

calendario de eventos se prescribe de manera significativa hacia adelante en el futuro. Es por eso que usted puede utilizar un recordatorio en MT4, después de haber guardado un archivo de datos de MT5 de antemano (un mes antes, por ejemplo).

Esto es lo que yo hago para MT4.

Pasos para trabajar con el calendario en MT4.


1. Ejecutar un script en MT5 que guarde el calendario en un fichero Common.

#include <fxsaber\Calendar\Calendar.mqh> // https://www.mql5.com/es/code/32430

#define  CALENDAR_FILENAME "Calendar.bin" // Nombre del fichero para leer/escribir el Calendario.

void OnStart()
{
  CALENDAR Calendar;
  
  Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // Tomó TODO el calendario.
  Calendar.Save(CALENDAR_FILENAME, true); // Calendario grabado. > 65 MB.
}


2. 2. Cargar el calendario desde el archivo Common en MT4.


Como ejemplo a continuación se muestra un recordatorio de eventos importantes sobre divisas del símbolo actual, trabajando en MT4.

#include <fxsaber\Calendar\Calendar.mqh> // https://www.mql5.com/es/code/32430

#define  CALENDAR_FILENAME "Calendar.bin" // Nombre del fichero para leer/escribir el Calendario.

int OnInit()
{
  return(!EventSetTimer(1));
}

void OnTimer()
{
  static CALENDAR Calendar;

  if (Calendar.GetAmount()) // Si el calendario no está vacío.
  {
    static int Pos = 0;
    
    Pos = Calendar.GetPosAfter(TimeCurrent(), Pos); // Eventos futuros encontrados.
    
    Comment(Calendar.ToString(Pos, 5, true)); // Los imprimí.
  }
  else if (Calendar.Load(CALENDAR_FILENAME, true)) // Cargado el calendario desde un fichero.
  {
    string Currencies[2];
    
    // Obtener las monedas del carácter actual.
    Currencies[0] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_BASE);
    Currencies[1] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);
          
    Calendar.FilterByCurrency(Currencies); // Deja los eventos en las monedas del símbolo.
    Calendar.FilterByImportance(CALENDAR_IMPORTANCE_HIGH); // Sólo se dejaron atrás los acontecimientos importantes.
  }    
}


Después del lanzamiento tenemos un gráfico actualizado (cuenta atrás) recordatorio de eventos importantes en las monedas del símbolo directamente en MT4.


Del mismo modo Calendario puede trabajar en MT4-Tester.

 
Mark Taylor #:

Sin embargo, sigo encontrando un problema, hago la descarga estándar del archivo de calendario

a continuación, establecer un starttime y obtener eventos después de este tiempo en un bucle para cada moneda.

Trate de pegar las fuentes para que puedan ser leídos.

 

Gracias por el fuerte trabajo material útil.

Por supuesto, estas obras deben ser desarrollados y corregidos y describir la documentación, toda la comunidad y no sólo una persona. Pero por alguna razón la propia administración no da tales disposiciones, así como no inserta un enlace a la misma GitHub, para la correcta organización. Aunque hay proyectos, su uso, casi el mismo GitHub.

Gracias! por el código, es muy interesante leer este tipo de código, honestamente: sobrecarga de plantillas falta de comentarios )) lo que vale la pena esta creatividad, 5 minutos pensó lo que es? una instancia de una clase o un array con datos. En general, todo para el desarrollo del cerebro.
CALENDAR Calendar;
Calendar[i].time
Por supuesto, el trabajo es genial, sólo debe entender cómo funciona
 

Estaría bien que la función ordenara por tiempo toda la matriz después de fusionarla

int operator +=( const CALENDAR &Value )
  {
    const int Size1 = this.GetAmount();
    const int Size2 = Value.GetAmount();

    if (!Size1)
      for (int i = ::ArrayResize(this.Events, Size2) - 1; i >= 0; i--)
        this.Events[i] = Value.Events[i];
    else if (Size2)
    {
      EVENT Array[];

      ::ArrayResize(Array, Size1 + Size2);

      int i = 0;
      int j = 0;
      int k = 0;

      while ((i < Size1) && (j < Size2))
        Array[k++] = (this.Events[i] < Value.Events[j]) ? this.Events[i++] : Value.Events[j++];

      while (i < Size1)
        Array[k++] = this.Events[i++];

      while (j < Size2)
        Array[k++] = Value.Events[j++];

    #ifdef __MQL5__
      ::ArraySwap(this.Events, Array);
    #else // #ifdef __MQL5__
      ::ArrayFree(this.Events);

      ::ArrayCopy(this.Events, Array);
    #endif // #ifdef __MQL5__ #else
    }

    return(this.GetAmount());
  }
bool operator <( const EVENT &Value ) const
  {
    return(!Value.time || (this.time < Value.time));
  }
 
BillionerClub #:

Estaría bien que la función ordenara por tiempo toda la matriz después de fusionarla

Pon un ejemplo en el que no lo haga.

 
fxsaber #:

Deme un ejemplo en el que no sea así.

Su código es difícil de entender, pero supongo que hay una ordenación final en el código anterior, pero el código es probablemente un error. No es frecuente, pero cuando se fusionan matrices, la matriz final viene con errores en forma de falta de ordenación, porque los elementos más recientes de la matriz debe tener un período de tiempo más largo.

2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 08:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 13:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 16:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 20:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.05 00:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.07 00:00
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 00:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 00:30
2022.11.04 07:05:33.053 EventsManager (FUTSP500CONT,M15)        2022.11.04 00:30
   int totall = Calendar+=Calendar3;

for(int i=0;i<totall;i++)
  {
   Print(TimeToString(Calendar[i].time));
  }