皆さん、こんにちは!今日はMetaTrader 5で使えるエキスパートアドバイザー(EA)「Demo_FileWriteArray」についてお話しします。このEAは、毎ティックごとにBidとAskの価格を取得して、特定の構造体に保存します。そして、20ティックごとにデータをファイルに書き込む仕組みになっています。
データは、ローカルターミナルフォルダのサブディレクトリにあるバイナリファイルに記録されます。ターミナルのローカルフォルダの位置は、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[]; //+------------------------------------------------------------------+ //| エキスパートの初期化関数 | //+------------------------------------------------------------------+ int OnInit() { //--- 配列のメモリを割り当て ArrayResize(arr,size); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| エキスパートのデイニシャル化関数 | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- 残りのカウント分の文字列を書き込む WriteData(count); } //+------------------------------------------------------------------+ //| エキスパートのティック関数 | //+------------------------------------------------------------------+ 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