大家好!今天我们来聊聊一个非常实用的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()); }