Bibliotecas: Calendário - página 14

 
mbjen #:

Olá. Existe alguma possibilidade de mover o calendário para um determinado horário?


Não me lembro de toda a funcionalidade. ALT+M ajuda.

 
fxsaber # :


Não me lembro de todas as funcionalidades. ALT+M ajuda.

Tenho uma boa sugestão:
Em Save():
Subtrair Calendar -= Server_GMT_Offset;
Isso armazenará os horários do calendário no horário UTC.

Em Load():
Adicionar Calendar += Server_GMT_Offset;
Isso permite a reutilização do arquivo salvo de um terminal em outro terminal com um gmt_offset de corretor diferente (teste de EA em terminais diferentes).

Sugiro adicionar essa funcionalidade aos métodos Save() e Load() da classe. Além disso, seria útil adicionar uma opção de usuário (propriedade de classe) para permitir a correção dos horários do calendário ao salvar/carregar.


 
amrali #:
Sugiro adicionar essa funcionalidade aos métodos Save() e Load() da classe. Além disso, seria útil adicionar uma opção de usuário (propriedade de classe) para permitir a correção das horas do calendário ao salvar/carregar.

Isso é razoável. Infelizmente, ainda não estou pronto para fazer isso.

 
Olá - Acabei de usar seu exemplo de EA de calendário e parece que ele não está baixando os dados do calendário. Ele estava funcionando muito bem antes da versão 5.0 build 5200. Alguma ideia do que está errado ou alguma correção? Muito obrigado
 
v88 #:
Olá - Acabei de usar o exemplo do EA Calendar e parece que ele não está carregando os dados do calendário. Antes da versão 5.0 build 5200, ele estava funcionando bem. Alguma ideia do que está errado ou alguma correção? Obrigado

Verificado - está funcionando.


Esses arquivos armazenam um único calendário para todos os terminais.

...\AppData\Roaming\MetaQuotes\Terminal\Community\Calendar\*.dat
 
fxsaber #:

Verificado - está funcionando.


Esses arquivos armazenam um único calendário para todos os terminais.

Definitivamente não está funcionando aqui com seu EA de teste, com dois terminais diferentes. Um diretamente da metaquotes e outro por meio de minha corretora. Veja abaixo, ambos mostram o erro de código 1:



Vejo 3 arquivos em \AppData\Roaming\MetaQuotes\Terminal\Community\Calendar, eventos, países e descrições.


As linhas em seu EA de teste mostram que o arquivo calendar.bin deve ser salvo como "Calendar.bin" na pasta "Roaming\MetaQuotes\Terminal\<identifier>\MQL5\Files", mas ele não está lá. Antes da compilação 5200, eles eram colocados lá corretamente. Alguma ideia do que pode estar errado?


#define  FAKE // Уберите эту строку, чтобы советник заработал. Нужно для прохождения автоматической проверки КБ.

#ifndef  FAKE

// Советник для торговли в MT4/5-Тестере на истории фундаментальных данных.

#define  CALENDAR_FILENAME "Calendar.bin" // Название файла для чтения/записи Календаря.
#property tester_file CALENDAR_FILENAME  // Указание, чтобы MT5-Тестер подхватывал данный файл.

#include <fxsaber\Calendar\Calendar.mqh> // Календарь - фундаментальный анализ на истории и в реал-тайме.

input group "Calendar"
input string inCurrency = "USD";        // Moeda
input string inFilterName = "payrolls"; // FilterName

input group "EA"
input int inTP = 1000; // TakeProfit
input int inSL = 1000; // StopLoss
input bool inReverse = true; // Direção da negociação

CALENDAR Calendar; // Объект с данными календаря.

int OnInit()
{
  bool Res = false;

  if (MQLInfoInteger(MQL_TESTER)) // Если работаем в Тестере
  {
    Res = Calendar.Load(CALENDAR_FILENAME) &&      // Загрузили события из файла.
          Calendar.FilterByCurrency(inCurrency) && // Применили фильтр по валюте.
          Calendar.FilterByName(inFilterName);     // Применили фильтр по названию события.

    if (!Res)                                      // Если проблемы с загруженными данными,
      Print("Run the EA in the MT5-Terminal!");    // сообщили, что нужно их получить запуском советника в MT5-Терминале.
  }
#ifdef __MQL5__
  // Работаем в Терминале.
  else if (Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, 0) && // Загрузили абсолютно все события (история + будущее) из MT5-Терминала.
           Calendar.AutoDST() &&                                 // Синхронизировали календарь с котировками.
           Calendar.Save(CALENDAR_FILENAME))                     // Сохранили их в файл.
    MessageBox("You can run the EA in the MT4/5-Tester.");       // Сообщили, что можем теперь работать в MT4/5-Тестере.
#endif // #ifdef __MQL5__

  return(!Res);
}

void OnTick()
{
  static int Pos = Calendar.GetPosAfter(TimeCurrent()); // Получили позицию события в Календаре, которая стоит сразу за текущим временем.

  if ((Pos < Calendar.GetAmount()) &&       // Если не вышли за границы Календаря
      (Calendar[Pos].time < TimeCurrent())) // и текущее время перешагнуло событие.
  {
    const EVENT Event = Calendar[Pos];      // Получили соответствующее событие.

    if ((Event.Actual != LONG_MIN) && (Event.Forecast != LONG_MIN)) // Если текущее и прогнозное значения события заданы
    {
      Print(Event.ToString()); // Распечатываем полностью это событие.

      if (Event.Actual > Event.Forecast)                                                                          // Если текущее значение больше прогнозного,
        PositionOpen(inReverse, "Act.(" + Event.ActualToString() + ")>(" + Event.ForecastToString() + ")For.");   // открываем позицию одного направления.
      else
        PositionOpen(!inReverse, "Act.(" + Event.ActualToString() + ")<=(" + Event.ForecastToString() + ")For."); // Иначе - другого направления.
    }

    Pos = Calendar.GetPosAfter(TimeCurrent(), Pos); // Получили позицию события в Календаре, которая стоит сразу за текущим временем.
  }
}

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

// Открывает позицию с заданным коммментарием.
TICKET_TYPE PositionOpen( const int Type, const string comment )
{
  return(Type ? OrderSend(_Symbol, OP_SELL, 1, Bid, 0, Bid + inSL * _Point, Bid - inTP * _Point, comment)
              : OrderSend(_Symbol, OP_BUY, 1, Ask, 0, Ask - inSL * _Point, Ask + inTP * _Point, comment));
}

#else // #ifndef FAKE
  int OnInit() { return(INIT_FAILED); }
#endif // #ifndef FAKE #else
 
v88 #:

Definitivamente não está funcionando aqui com seu EA de teste, com dois terminais diferentes. Um diretamente da metaquotes e outro por meio de minha corretora. Veja abaixo, ambos mostram o erro de código 1:



Vejo 3 arquivos em \AppData\Roaming\MetaQuotes\Terminal\Community\Calendar, eventos, países e descrições.


As linhas em seu EA de teste mostram que o arquivo calendar.bin deve ser salvo como "Calendar.bin" na pasta "Roaming\MetaQuotes\Terminal\<identifier>\MQL5\Files", mas ele não está lá. Antes da compilação 5200, eles eram colocados lá corretamente. Alguma ideia do que pode estar errado?


Para garantir que não seja a minha configuração, instalei uma máquina virtual do Windows fora da minha própria rede, tudo limpo. Baixei o terminal, instalei os arquivos de inclusão e o EA Calendar_Example. O problema continua o mesmo, código de erro 1, calendar.bin não está sendo baixado:


 
v88 #:

Alguma ideia do que pode estar errado?

Até que as alterações na MQL5 sejam corrigidas, não vejo sentido em investigar o problema. Experimente a compilação abaixo.

Новая версия платформы MetaTrader 5 build 5200: расширение OpenBLAS и усиление контроля в MQL5 - Проверил логин во вкладке Сообщество в MetaEditor
Новая версия платформы MetaTrader 5 build 5200: расширение OpenBLAS и усиление контроля в MQL5 - Проверил логин во вкладке Сообщество в MetaEditor
  • 2025.08.04
  • www.mql5.com
----------------- Открываю Метатрейдер, который давно вообще не открывал. Иду в MetaEditor - там не подключено к Git - ----------------- Проверил логин во вкладке Сообщество. То есть - пока я глядел на вкладку Сообщество в MetaEditor е - этот MetaEditor сам все сделал
 

Recentemente, notei que salvar o calendário inteiro em um arquivo para trabalhar com ele no testador começou a expirar após cerca de 50 segundos.

Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, 0); // <-- тут падает на 5401 - ERR_CALENDAR_TIMEOUT (превышен лимит времени запроса),

Anteriormente, tudo funcionava bem e todo o calendário era baixado em um arquivo sem nenhum problema. Suspeito que, em uma das versões do terminal, o tempo limite do CalendarValueHistory tenha sido reduzido.

Verifiquei em diferentes terminais e servidores, embora o terminal seja b5327 em todos os lugares. Também tentei reduzir o período. Portanto, durante um ano, também há um tempo limite. Mas por alguns dias, o download é feito normalmente.

Há alguma solução alternativa para evitar a divisão das chamadas em períodos curtos?

 
Denis Kislicyn CalendarValueHistory tenha sido reduzido. Verifiquei em diferentes terminais e servidores, embora o terminal seja b5327 em todos os lugares. Também tentei reduzir o período. Portanto, durante um ano, também há um tempo limite. Mas, por alguns dias, o download é feito normalmente.

Há alguma solução alternativa para evitar a divisão das chamadas em períodos curtos?

Fiz uma pequena pesquisa. Se eu passar um período maior que um mês para CalendarValueHistory , a função trava por cerca de 50 segundos e depois expira. No entanto, a mesma chamada, mas com apenas um dia a menos, é executada em menos de 70 ms e armazena perfeitamente cerca de 5.000 eventos do calendário. Algo definitivamente mudou.