라이브러리: 캘린더 - 페이지 4

 
fxsaber:

아직 완료되지 않았습니다. 전문가에게 문의하세요.

네, 방금 무슨 뜻인지 알았습니다. 고마워요
 
모든 뉴스 이벤트가 올바르게 다운로드되었는데도 백테스팅이 약 5년(2017년 이후)으로 제한되는 것 같습니다(BIN 파일은 67MB). 백테스팅을 위해 MT5가 메모리에서 처리할 수 있는 이벤트 수에 제한이 있나요?
 
mqtrader #:
모든 뉴스 이벤트가 올바르게 다운로드되었는데도 백테스팅이 약 5년(2017년 이후) 으로 제한되는 것 같습니다(BIN 파일은 67MB). 백테스팅을 위해 MT5가 메모리에서 처리할 수 있는 이벤트 수에 제한이 있나요?
#property script_show_inputs

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

input bool inFromFile = false;

#define  CALENDAR_FILENAME "Calendar.bin" // 캘린더 읽기/쓰기를 위한 파일 이름입니다.

void OnStart()
{
  CALENDAR Calendar;
  
  if (inFromFile)
    Calendar.Load(CALENDAR_FILENAME);
  else
  {
    Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // 전체 달력을 가져왔습니다.
    Calendar.Save(CALENDAR_FILENAME); // > > 65MB.
  }
  
  Print(Calendar[0].ToString());
}


결과.

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 | 

캘린더 데이터베이스의 첫 번째 이벤트는 2007년 1월입니다.

 
'예측' 값이 2017.05.05부터 시작되므로 예제를 실행할 때 백테스트는 해당 날짜부터만 시작할 수 있다는 것을 방금 깨달았습니다. 다른 값은 그 날짜 이전에 사용할 수 있습니다.

이 유용한 라이브러리에 대해 다시 한 번 fxsaber에게 감사드립니다!
 

이벤트 일정은 미래로 상당히 앞당겨져 있습니다. 그렇기 때문에 MT5 데이터의 파일을 미리(예를 들어 한 달 전) 저장해 두면 MT4에서 미리 알림을 사용할 수 있습니다.

이것이 제가 MT4에서 하는 일입니다.

MT4에서 캘린더로 작업하는 단계.


1. MT5에서 캘린더를 공통 파일에 저장하는 스크립트를 실행합니다.

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

#define  CALENDAR_FILENAME "Calendar.bin" // 캘린더 읽기/쓰기를 위한 파일 이름입니다.

void OnStart()
{
  CALENDAR Calendar;
  
  Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, INT_MAX); // 전체 달력을 가져왔습니다.
  Calendar.Save(CALENDAR_FILENAME, true); // 기록된 캘린더. > 65MB.
}


2. 공통 파일에서 MT4로 캘린더를 로드합니다.


아래 예는 MT4에서 작업하는 현재 심볼의 통화에 대한 중요 이벤트 알림입니다.

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

#define  CALENDAR_FILENAME "Calendar.bin" // 캘린더 읽기/쓰기를 위한 파일 이름입니다.

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

void OnTimer()
{
  static CALENDAR Calendar;

  if (Calendar.GetAmount()) // 캘린더가 비어 있지 않은 경우.
  {
    static int Pos = 0;
    
    Pos = Calendar.GetPosAfter(TimeCurrent(), Pos); // 향후 이벤트를 찾았습니다.
    
    Comment(Calendar.ToString(Pos, 5, true)); // 인쇄했습니다.
  }
  else if (Calendar.Load(CALENDAR_FILENAME, true)) // 파일에서 캘린더를 로드했습니다.
  {
    string Currencies[2];
    
    // 현재 캐릭터의 통화를 가져옵니다.
    Currencies[0] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_BASE);
    Currencies[1] = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);
          
    Calendar.FilterByCurrency(Currencies); // 심볼의 통화에 이벤트를 남겼습니다.
    Calendar.FilterByImportance(CALENDAR_IMPORTANCE_HIGH); // 중요한 이벤트만 남았습니다.
  }    
}


실행 후 MT4에서 직접 해당 심볼의 통화에 대한 중요 이벤트에 대한 차트 업데이트(카운트다운) 알림이 표시됩니다.


마찬가지로 캘린더는 MT4-Tester에서 작동할 수 있습니다.

 
Mark Taylor #:

하지만 계속 문제가 발생합니다. 캘린더 파일의 표준 다운로드를 수행합니다.

을 다운로드한 다음 시작 시간을 설정하고 이 시간 이후의 이벤트를 각 통화에 대해 반복해서 가져옵니다.

읽을 수 있도록 소스를 붙여 넣으세요.

 

유용한 정보를 제공해 주셔서 감사합니다.

물론 이러한 작업은 한 사람이 아닌 문서, 전체 커뮤니티를 개발하고 수정하고 설명해야합니다. 그러나 어떤 이유로 관리 자체는 그러한 조항을 제공하지 않으며 적절한 조직을 위해 동일한 GitHub에 대한 링크를 삽입하지 않습니다. 프로젝트가 있지만 그 사용은 거의 동일한 GitHub입니다.

감사합니다! 코드의 경우, 솔직히 그러한 코드를 읽는 것은 매우 흥미 롭습니다 : 템플릿 과부하 주석 부족 ))이 창의력의 가치가있는 것은 무엇입니까, 5 분 생각? 클래스 또는 데이터가있는 배열의 인스턴스입니다. 일반적으로 두뇌 개발을위한 모든 것.
CALENDAR Calendar;
Calendar[i].time
물론 작업은 멋지다, 당신은 그것이 어떻게 작동하는지 이해해야합니다.
 

병합 후 전체 배열을 시간별로 정렬하는 함수가 있으면 좋을 것입니다.

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

병합 후 전체 배열을 시간별로 정렬하는 함수가 있으면 좋을 것입니다.

그렇게 하지 않는 예를 들어주세요.

 
fxsaber #:

그렇지 않은 경우를 예로 들어주세요.

코드를 이해하기 어렵지만 위의 코드에 최종 정렬이 있다고 가정하지만 코드에 오류가있을 수 있습니다. 자주 있는 일은 아니지만 배열을 병합할 때 배열의 가장 최근 요소가 더 긴 기간을 가져야 하기 때문에 최종 배열에 정렬 부족의 형태로 오류가 발생합니다.

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