Bibliotecas: Calendário - página 4

 
fxsaber:

Isso não foi feito. Entre em contato com um especialista.

Claro, acabei de entender o que você quis dizer. Muito obrigado
 
Percebi que o backtesting parece estar limitado a cerca de 5 anos (de 2017 em diante), embora todos os eventos de notícias sejam baixados corretamente (o arquivo BIN tem 67 MB). Existe um limite para quantos eventos o MT5 pode manipular na memória para backtesting?
 
mqtrader #:
Percebi que o backtesting parece estar limitado a cerca de 5 anos(de 2017 em diante), embora todos os eventos de notícias sejam baixados corretamente (o arquivo BIN tem 67 MB). Existe um limite para quantos eventos o MT5 pode manipular na memória para backtesting?
#property script_show_inputs

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

input bool inFromFile = false;

#define  CALENDAR_FILENAME "Calendar.bin" // Nome do arquivo para leitura/gravação do Calendário.

void OnStart()
{
  CALENDAR Calendar;
  
  if (inFromFile)
    Calendar.Load(CALENDAR_FILENAME);
  else
  {
    Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // Pegou o calendário INTEIRO.
    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 | 

O primeiro evento no banco de dados do calendário é janeiro de 2007.

 
Acabei de perceber que os valores de "Forecast" começam em 2017.05.05, e é por isso que o backtest só pode começar a partir dessa data ao executar o exemplo. Outros valores podem ser usados antes dessa data.

Mais uma vez, obrigado, fxsaber, por essa biblioteca muito útil!
 

calendário de eventos é prescrito significativamente para o futuro. É por isso que você pode usar um lembrete no MT4, tendo salvo um arquivo de dados do MT5 com antecedência (um mês antes, por exemplo).

Isso é o que eu faço no MT4.

Etapas para trabalhar com o calendário no MT4.


1. Execute um script no MT5 que salvará o calendário em um arquivo comum.

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

#define  CALENDAR_FILENAME "Calendar.bin" // Nome do arquivo para leitura/gravação do Calendário.

void OnStart()
{
  CALENDAR Calendar;
  
  Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // Pegou o calendário INTEIRO.
  Calendar.Save(CALENDAR_FILENAME, true); // Calendário gravado. > 65 MB.
}


2. Carregue o calendário do arquivo comum no MT4.


Como exemplo, abaixo está um lembrete de eventos importantes em moedas do símbolo atual, trabalhando no MT4.

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

#define  CALENDAR_FILENAME "Calendar.bin" // Nome do arquivo para leitura/gravação do Calendário.

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

void OnTimer()
{
  static CALENDAR Calendar;

  if (Calendar.GetAmount()) // Se o calendário não estiver vazio.
  {
    static int Pos = 0;
    
    Pos = Calendar.GetPosAfter(TimeCurrent(), Pos); // Eventos futuros encontrados.
    
    Comment(Calendar.ToString(Pos, 5, true)); // Imprimiu-os.
  }
  else if (Calendar.Load(CALENDAR_FILENAME, true)) // Carregou o calendário de um arquivo.
  {
    string Currencies[2];
    
    // Obter as moedas do caractere atual.
    Currencies[0] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_BASE);
    Currencies[1] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);
          
    Calendar.FilterByCurrency(Currencies); // Deixou os eventos nas moedas do símbolo.
    Calendar.FilterByImportance(CALENDAR_IMPORTANCE_HIGH); // Apenas os eventos importantes foram deixados para trás.
  }    
}


Após o lançamento, temos um lembrete atualizado no gráfico (contagem regressiva) de eventos importantes nas moedas do símbolo diretamente no MT4.


Da mesma forma, o calendário pode funcionar no MT4-Tester.

 
Mark Taylor #:

No entanto, continuo tendo um problema, pois faço o download padrão do arquivo de calendário

em seguida, defino uma hora de início e obtenho eventos após essa hora em um loop para cada moeda.

Tente colar os códigos-fonte para que eles possam ser lidos.

 

Obrigado pelo trabalho intenso e útil.

É claro que esses trabalhos devem ser desenvolvidos e corrigidos e descrever a documentação, toda a comunidade e não apenas uma pessoa. Mas, por algum motivo, a própria administração não fornece essas provisões e não insere um link para o mesmo GitHub, para uma organização adequada. Embora existam projetos e seu uso, quase o mesmo GitHub.

Obrigado! pelo código, é muito interessante ler esse tipo de código, honestamente: sobrecarga de modelos falta de comentários )) o que vale essa criatividade, 5 minutos de pensamento o que é isso? uma instância de uma classe ou uma matriz com dados. Em geral, tudo para o desenvolvimento do cérebro.
CALENDAR Calendar;
Calendar[i].time
O trabalho é certamente legal, você só precisa entender como ele funciona
 

Seria bom se a função classificasse por tempo toda a matriz após a mesclagem

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

Seria bom se a função classificasse por tempo toda a matriz após a mesclagem

Dê um exemplo em que ela não faça isso.

 
fxsaber #:

Dê-me um exemplo em que esse não seja o caso.

Seu código é difícil de entender, mas presumo que haja uma classificação final no código acima, mas o código provavelmente está errado. Não é comum, mas ao mesclar matrizes, a matriz final apresenta erros na forma de falta de classificação, pois os elementos mais recentes da matriz devem ter um período de tempo maior.

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