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

 
Automated Trading :

캘린더 :

저자 : fxsaber

고마워요 fxsaber,
이 라이브러리는 정말 훌륭합니다.
.bin 파일을 메모장 ++에서 읽을 수 있는지 물어봐도 될까요? 내 EA에서 만든 파일은 메모장 ++에서 읽을 수 없으며 BT 중에 calendar.Load는 아무것도 반환하지 않습니다. 이에 대한 힌트가 있으신가요?

고마워요
 
eepatk #:
.bin 파일을 메모장 ++에서 읽을 수 있는지 물어봐도 되나요? 내 EA에서 만든 파일은 메모장 ++에서 읽을 수 없으며 BT 중에 calendar.Load는 아무것도 반환하지 않습니다. 이에 대한 힌트가 있나요?

작업이 무엇인지 즉시 공식화하는 것이 좋습니다.

 
fxsaber # :

작업이 무엇인지 즉시 공식화하는 것이 좋습니다.

죄송합니다 fxsaber, 명확히하겠습니다.

기본적으로 공유하신 예제 코드로 시작하여 .bin 파일을 다운로드하여 만들 수 있습니다.

백 테스트를 위해 아래 코드를 작성하려고하는데, 목표는 클래스에 나열된 각 통화의 뉴스 / 이벤트를 확인하기 위해 모든 반복에서 .bin을로드하는 것입니다.

그러나 백 테스트를 할 때 Calendar.ToString이 공백으로 반환됩니다 ( "인쇄"는 디버깅 용입니다).


고마워요,

 if ( MQLInfoInteger ( MQL_TESTER )) 
 {
    NF_Stopped_CCY="";  
      for(int i=0;i<8;i++)        
        {
                Calendar.Load(CALENDAR_FILENAME);
                Print("Raw",Calendar.ToString(0,10,false));  

                Calendar.FilterByTime(TimeCurrent()-NF_Stop_in_Days*24*60*60,TimeCurrent()+NF_Stop_in_Days*24*60*60);
                Print("FilterByTime",Calendar.ToString(0,10,false));  

                Calendar.FilterByCurrency(CCYP[i].Cname);
                Print("FilterByCCY",Calendar.ToString(0,10,false));  

                Calendar.FilterByImportance(NF_Stop_Importance);  
                Print("FilterByImp",Calendar.ToString(0,10,false));  
 
                          
                CCYP[i].Stop_By_News=Calendar.GetAmount();
                if (CCYP[i].Stop_By_News) 
                {
                  int temp=StringConcatenate(NF_Stopped_CCY,NF_Stopped_CCY," ", CCYP[i].Cname);
                  Print(Calendar.ToString(0,-1,false));  
                }
        } 
   Print("NF list(BackTest)   :",NF_Stopped_CCY);
   NEWS_RefreshTime.day =CurrentDay.day;
  }
 
eepatk #:

백테스트를 위해 아래 코드를 작성하려고 하는데, 목표는 클래스에 나열된 각 통화의 뉴스/이벤트를 확인하기 위해 모든 반복에서 .bin을 로드하는 것입니다.

파일에서 정적 변수로 데이터를 한 번만 로드하면 됩니다.

#define  CALENDAR_FILENAME "Calendar.bin" // 캘린더 읽기/쓰기를 위한 파일 이름입니다.
#property tester_file CALENDAR_FILENAME  // MT5-Tester가 이 파일을 선택하도록 지정합니다.

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

CALENDAR CalendarFull; // 캘린더 데이터가 있는 개체.

int OnInit()
{      
  return(CalendarFull.Load(CALENDAR_FILENAME) == -1); // 파일에서 이벤트 로드
}

void OnTick()
{
  CALENDAR Calendar = CalendarFull;
  
  //....
}
 
fxsaber # :

파일에서 정적 변수로 데이터를 한 번만 로드하면 됩니다.


매우 편리하고 정확합니다.

 
fxsaber # :

파일에서 정적 변수로 데이터를 한 번만 로드하면 됩니다.

감사합니다,

귀하의 제안으로 코드를 정리할 수 있었지만 여전히 .bin을로드 한 후에도 CalendarFULL이 비어 있습니다.

CalendarFULL.Load는 "1"을 반환하지만 CalendarFULL 내부에는 아무것도없는 것 같습니다.

.bin의 인코딩 문제일까요?

고마워요

 
eepatk #:

를 호출하면 CalendarFULL.Load가 "1"을 반환하지만, CalendarFULL 내부에는 아무것도 없는 것 같습니다.

MT5 터미널에서 이 스크립트를 한 번 실행하여 bin 파일을 생성합니다.

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

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

void OnStart()
{
  CALENDAR Calendar;

  if (Calendar.Set(NULL, CALENDAR_IMPORTANCE_NONE, 0, 0)) // MT5-터미널에서 모든 이벤트(기록 + 미래)를 로드했습니다.
    Calendar.Save(CALENDAR_FILENAME);                     // 파일에 저장합니다.
}
 
fxsaber # :

MT5 터미널에서 이 스크립트를 한 번 실행하여 빈 파일을 생성합니다.

고마워요, fxsaber, 그렇게 했더니 7xmb .bin 파일이 생성되었습니다. 그러나 여전히 로드 및 인쇄를 시도하면 공백으로 반환됩니다.
 
eepatk #:
고마워요 fxsaber, 그렇게 했더니 7xmb .bin 파일이 생성되었습니다. 그러나 여전히 로드 및 인쇄를 시도하면 공백으로 반환됩니다.
#define  CALENDAR_FILENAME "Calendar.bin" // 캘린더 읽기/쓰기를 위한 파일 이름입니다.
#property tester_file CALENDAR_FILENAME  // MT5-Tester가 이 파일을 선택하도록 지정합니다.

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

const string inSymbols[] = {"EURUSD", "AUDCAD"};

CALENDAR Calendars[];

int OnInit()
{      
  CALENDAR Calendar;
  const bool Res = (Calendar.Load(CALENDAR_FILENAME) != -1);

  if (Res)
    for (int i = ArrayResize(Calendars, ArraySize(inSymbols)) - 1; i >= 0; i--)
    {
      Calendars[i] = Calendar;
      
      Calendars[i].FilterBySymbol(inSymbols[i]);
    }

  return(!Res);
}

string NewsToString( const CALENDAR &Calendar, const datetime From, const datetime To )
{
  CALENDAR CalendarTmp = Calendar;
  
  CalendarTmp.FilterByTime(From, To);
  
  return(CalendarTmp.ToString(0, 10));
}

#define  HALF_INTERVAL (6 * 3600)

void OnTick()
{  
  string Str = NULL;
  
  for (int i = ArraySize(Calendars) - 1; i >= 0; i--)
  {
    const datetime From = TimeCurrent() - HALF_INTERVAL;
    const datetime To = TimeCurrent() + HALF_INTERVAL;
    
    Str += "\n\n" + inSymbols[i] + "-news (" + (string)From + " - " + (string)To + "):\n" + NewsToString(Calendars[i], From, To);
  }
  
  Comment(Str);
}

 
fxsaber #:

감사합니다,

결국 내 코드의 문제를 발견했는데 .mq5가 어떻게 든 유니 코드로 저장되어 파일 읽기가 작동하지 않았고 ANSI로 변경하면 작동합니다.


고마워요,