Librerie: Calendario - pagina 4

 
fxsaber:

Questo non è stato fatto. Contattare uno specialista.

Certo, ho appena capito cosa intendi. Grazie
 
Ho notato che il backtesting sembra essere limitato a circa 5 anni (dal 2017 in poi), anche se tutte le notizie sono scaricate correttamente (il file BIN è di 67mb). Esiste un limite al numero di eventi che MT5 può gestire in memoria per il backtesting?
 
mqtrader #:
Ho notato che il backtesting sembra essere limitato a circa 5 anni(dal 2017 in poi), anche se tutte le notizie sono scaricate correttamente (il file BIN è di 67mb). Esiste un limite al numero di eventi che MT5 può gestire in memoria per il backtesting?
#property script_show_inputs

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

input bool inFromFile = false;

#define  CALENDAR_FILENAME "Calendar.bin" // Nome del file per la lettura/scrittura del Calendario.

void OnStart()
{
  CALENDAR Calendar;
  
  if (inFromFile)
    Calendar.Load(CALENDAR_FILENAME);
  else
  {
    Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // Ha preso l'intero calendario.
    Calendar.Save(CALENDAR_FILENAME); // > > 65 MB.
  }
  
  Print(Calendar[0].ToString());
}


Risultato.

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 | 

Il primo evento nel database del calendario è gennaio 2007.

 
Mi sono appena accorto che i valori "Forecast" partono da 2017.05.05, motivo per cui il backtest può partire solo da quella data quando si esegue l'esempio. Altri valori possono essere utilizzati prima di tale data.

Grazie ancora una volta a fxsaber per questa utilissima libreria!
 

calendario degli eventi è prescritto significativamente in avanti nel futuro. Per questo motivo è possibile utilizzare un promemoria in MT4, dopo aver salvato un file dai dati di MT5 in anticipo (un mese prima, ad esempio).

Questo è ciò che faccio io per la MT4.

Procedura per lavorare con il calendario nella MT4.


1. Eseguire uno script in MT5 che salvi il calendario in un file comune.

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

#define  CALENDAR_FILENAME "Calendar.bin" // Nome del file per la lettura/scrittura del Calendario.

void OnStart()
{
  CALENDAR Calendar;
  
  Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // Ha preso l'intero calendario.
  Calendar.Save(CALENDAR_FILENAME, true); // Calendario registrato. > 65 MB.
}


2. Caricare il calendario dal file comune nella MT4.


Di seguito è riportato un esempio di promemoria di eventi importanti sulle valute del simbolo corrente, lavorando in MT4.

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

#define  CALENDAR_FILENAME "Calendar.bin" // Nome del file per la lettura/scrittura del Calendario.

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

void OnTimer()
{
  static CALENDAR Calendar;

  if (Calendar.GetAmount()) // Se il calendario non è vuoto.
  {
    static int Pos = 0;
    
    Pos = Calendar.GetPosAfter(TimeCurrent(), Pos); // Trovato Eventi futuri.
    
    Comment(Calendar.ToString(Pos, 5, true)); // Stampateli.
  }
  else if (Calendar.Load(CALENDAR_FILENAME, true)) // Il calendario è stato caricato da un file.
  {
    string Currencies[2];
    
    // Ottenere le valute del carattere corrente.
    Currencies[0] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_BASE);
    Currencies[1] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);
          
    Calendar.FilterByCurrency(Currencies); // Lascia gli eventi sulle valute del simbolo.
    Calendar.FilterByImportance(CALENDAR_IMPORTANCE_HIGH); // Solo gli eventi importanti sono stati lasciati indietro.
  }    
}


Dopo il lancio abbiamo un grafico aggiornato (conto alla rovescia) che ci ricorda gli eventi importanti sulle valute del simbolo direttamente in MT4.


Allo stesso modo, il calendario può funzionare in MT4-Tester.

 
Mark Taylor #:

Continuo però a riscontrare un problema: eseguo il download standard del file del calendario

poi imposto un orario di inizio e ottengo gli eventi dopo questo orario in un ciclo per ogni valuta.

Cercate di incollare i sorgenti in modo che possano essere letti.

 

Grazie per le forti fatiche e le cose utili.

Naturalmente, tali lavori dovrebbero essere sviluppati e corretti e descrivere la documentazione, l'intera comunità e non solo una persona. Ma per qualche motivo l'amministrazione stessa non dà tali disposizioni e non inserisce un link allo stesso GitHub, per una corretta organizzazione. Anche se ci sono progetti, il loro uso, quasi lo stesso GitHub.

Grazie! per il codice, è molto interessante leggere tale codice, onestamente: modelli di sovraccarico mancanza di commenti )) che cosa vale la creatività, 5 minuti pensato che cosa è? un'istanza di una classe o un array con i dati. In generale, tutto per lo sviluppo del cervello.
CALENDAR Calendar;
Calendar[i].time
Il lavoro è certamente bello, si dovrebbe solo capire come funziona
 

Sarebbe bello se la funzione ordinasse per tempo l'intero array dopo l'unione

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 #:

Sarebbe bello se la funzione ordinasse per tempo l'intero array dopo l'unione

Fornire un esempio in cui non lo fa.

 
fxsaber #:

Mi faccia un esempio in cui questo non è il caso.

Il vostro codice è difficile da capire, ma presumo che ci sia un ordinamento finale nel codice qui sopra, ma probabilmente il codice è in errore. Non capita spesso, ma quando si uniscono gli array, l'array finale presenta errori sotto forma di mancanza di ordinamento, perché gli elementi più recenti dell'array dovrebbero avere un periodo di tempo più lungo.

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));
  }