首页 系统交易 帖子

MetaTrader 5中的价格数据记录专家顾问

附件
1620.zip (1.04 KB, 下载 0次)

大家好!今天我们来聊聊一个非常实用的MetaTrader 5专家顾问(也就是EA),它能帮助我们记录每个报价的Bid和Ask价格,并将这些数据存储到文件中。这个专家顾问在每隔20个tick时,会使用 FileWriteArray() 函数将数据写入文件。数据会被保存在本地终端文件夹的子目录下,想要获取终端本地文件夹的位置,可以调用 TerminalInfoString() 函数。

PrintFormat("终端本地文件夹路径:%s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH)); 

当我们从图表中删除这个专家顾问时,它会把未写入的数据保存到文件中,然后终止运行。

代码示例:

//--- 输入参数
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)
  {
//--- 如果count<n,写入剩余的计数字符串
   WriteData(count);
  }
//+------------------------------------------------------------------+
//| 专家的tick函数                                             |
//+------------------------------------------------------------------+
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)