시스템트레이딩 게시글

MetaTrader 5를 위한 데이터 기록 EA: Demo_FileWriteArray

첨부파일
1620.zip (1.04 KB, 다운로드 0회)

안녕하세요, 트레이더 여러분! 오늘은 MetaTrader 5에서 데이터를 기록하는 Expert Advisor, 즉 EA인 Demo_FileWriteArray에 대해 알아보려고 합니다. 이 EA는 매 틱마다 Bid와 Ask 가격을 받아와서 "prices" 구조체 배열에 저장해요. 매 20번째 틱마다 이 데이터를 파일에 기록하는데, 이는 FileWriteArray() 함수를 사용합니다. 기록된 데이터는 로컬 터미널 폴더의 하위 디렉토리에 있는 이진 파일로 저장됩니다. 터미널 로컬 폴더의 위치는 TerminalInfoString() 함수를 호출하여 확인할 수 있습니다.

PrintFormat("터미널 로컬 폴더 경로: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH)); 

EA를 차트에서 삭제할 때는 아직 기록되지 않은 데이터가 파일에 쓰여지고, 그 후 EA의 작업이 종료됩니다.

코드 설명:

//--- 입력 파라미터
input string InpFileName="data.bin";
input string InpDirectoryName="SomeFolder";
//+------------------------------------------------------------------+
//| 가격 데이터를 저장하기 위한 구조체                                 |
//+------------------------------------------------------------------+
struct prices
  {
   datetime          date; // 데이터
   double            bid;  // Bid 가격
   double            ask;  // Ask 가격
  };
//--- 전역 변수
int    count=0;
int    size=20;
string path=InpDirectoryName+"//"+InpFileName;
prices arr[];
//+------------------------------------------------------------------+
//| EA 초기화 함수                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 배열 메모리 할당
   ArrayResize(arr,size);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| EA 비초기화 함수                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- 남은 카운트 문자열을 기록
   WriteData(count);
  }
//+------------------------------------------------------------------+
//| EA 틱 함수                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 데이터를 배열에 저장
   arr[count].date=TimeCurrent();
   arr[count].bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
   arr[count].ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
//--- 현재 데이터 출력
   Print("날짜 = ",arr[count].date," Bid = ",arr[count].bid," Ask = ",arr[count].ask);
//--- 카운터 증가
   count++;
//--- 배열이 채워지면 데이터를 파일에 기록하고 초기화
   if(count==size)
     {
      WriteData(size);
      count=0;
     }
  }
//+------------------------------------------------------------------+
//| 배열의 n 요소를 파일에 기록                       |
//+------------------------------------------------------------------+
void WriteData(const int n)
  {
//--- 파일 열기
   ResetLastError();
   int handle=FileOpen(path,FILE_READ|FILE_WRITE|FILE_BIN);
   if(handle!=INVALID_HANDLE)
     {
      //--- 배열 데이터를 파일 끝에 기록
      FileSeek(handle,0,SEEK_END);
      FileWriteArray(handle,arr,0,n);
      //--- 파일 닫기
      FileClose(handle);
     }
   else
      Print("파일 열기에 실패했습니다, 오류: ",GetLastError());
  }

연관 포스트

댓글 (0)