MetaTrader 5用EA「Demo_FileWriteArray」の使い方と実装方法

Mike 2013.04.09 22:14 64 0 0
添付ファイル

皆さん、こんにちは!今日はMetaTrader 5で使えるエキスパートアドバイザー(EA)「Demo_FileWriteArray」についてお話しします。このEAは、毎ティックごとにBidとAskの価格を取得して、特定の構造体に保存します。そして、20ティックごとにデータをファイルに書き込む仕組みになっています。

データは、ローカルターミナルフォルダのサブディレクトリにあるバイナリファイルに記録されます。ターミナルのローカルフォルダの位置は、TerminalInfoString()関数を使用して取得できます。

PrintFormat("ターミナルのローカルフォルダのパス: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH)); 

チャートからEAを削除すると、未書き込みのデータがファイルに書き込まれ、その後EAは作業を終了します。

コード:

//--- 入力パラメータinputstring InpFileName="data.bin";
inputstring InpDirectoryName="SomeFolder";
//+------------------------------------------------------------------+//| 価格データを保存するための構造体                                 |//+------------------------------------------------------------------+struct prices
  {
   datetime          date; // データ
   double            bid;  // Bid価格
   double            ask;  // Ask価格
  };
//--- グローバル変数int    count=0;
int    size=20;
string path=InpDirectoryName+"//"+InpFileName;
prices arr[];
//+------------------------------------------------------------------+//| エキスパートの初期化関数                                   |//+------------------------------------------------------------------+intOnInit()
  {
//--- 配列のメモリを割り当て
   ArrayResize(arr,size);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+//| エキスパートのデイニシャル化関数                                 |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
  {
//--- 残りのカウント分の文字列を書き込む
   WriteData(count);
  }
//+------------------------------------------------------------------+//| エキスパートのティック関数                                             |//+------------------------------------------------------------------+voidOnTick()
  {
//--- データを配列に保存
   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(constint 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