안녕하세요, 트레이더 여러분! 오늘은 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()); }