下载MetaTrader 5

请观看如何免费下载自动交易

有趣的脚本?
因此发布一个链接 -
让其他人评价

喜欢这个脚本? 在MetaTrader 5客户端尝试它

2013.10.24 16:43
脚本

演示_FileWriteDouble - MetaTrader 5脚本

| Chinese English Русский Español Deutsch 日本語 Português

显示:
506
等级:
投票: 28

脚本获取 Moving Average(移动平均线) 指标的数值,并写进二进制文件,文件位于客户端本地文件夹下的 "Data" 子目录。脚本的输入参数可以指定 MA 指标的参数, 货币对的名字和时间帧, 以及数据分析的开始日期。

不光 MA 指标数值,相应的时间也以 double 类型 至文件。

代码:

//--- 当脚本启动时显示输入参数窗口
#property script_show_inputs
//--- 输入参数
input string             InpSymbolName="EURJPY";           // 货币对
input ENUM_TIMEFRAMES    InpSymbolPeriod=PERIOD_M15;       // 时间帧
input int                InpMAPeriod=10;                  // 平滑周期
input int                InpMAShift=0;                    // 指标平移
input ENUM_MA_METHOD     InpMAMethod=MODE_SMA;             // 平滑类型
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE;      // 价格类型
input datetime           InpDateStart=D'2013.01.01 00:00'; // 数据复制开始时间
//--- 文件写参数
input string             InpFileName="MA.csv";    // 文件名
input string             InpDirectoryName="Data"; // 目录名
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   datetime date_finish=TimeCurrent();
   double   ma_buff[];
   datetime time_buff[];
   int      size;
//--- 获取 MA 指标句柄
   ResetLastError();
   int ma_handle=iMA(InpSymbolName,InpSymbolPeriod,InpMAPeriod,InpMAShift,InpMAMethod,InpAppliedPrice);
   if(ma_handle==INVALID_HANDLE)
     {
      //--- 获取指标句柄失败
      PrintFormat("获取指标句柄错误. 错误代码 = %d",GetLastError());
      return;
     }
//--- 循环计算指标所有数值
   while(BarsCalculated(ma_handle)==-1)
      Sleep(20); // 暂停等待指标计算数值
   PrintFormat("指标数值从 %s 开始将会写入文件",TimeToString(InpDateStart));
//--- 复制指标数值
   ResetLastError();
   if(CopyBuffer(ma_handle,0,InpDateStart,date_finish,ma_buff)==-1)
     {
      PrintFormat("复制指标数值失败。错误代码 = %d",GetLastError());
      return;
     }
//--- 复制柱线时间
   ResetLastError();
   if(CopyTime(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,time_buff)==-1)
     {
      PrintFormat("复制时间失败。错误代码 = %d",GetLastError());
      return;
     }
//--- 接收缓存区尺寸
   size=ArraySize(ma_buff);
//--- 释放指标占用内存
   IndicatorRelease(ma_handle);
//--- 打开用于写指标数值的文件 (如果文件缺失, 自动创建)
   ResetLastError();
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("%s 文件可用于写入",InpFileName);
      PrintFormat("文件路径: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
      //--- 首先, 写数据尺寸
      FileWriteDouble(file_handle,(double)size);
      //--- 写指标时间和数值至文件
      for(int i=0;i<size;i++)
        {
         FileWriteDouble(file_handle,(double)time_buff[i]);
         FileWriteDouble(file_handle,ma_buff[i]);
        }
      //--- 关闭文件
      FileClose(file_handle);
      PrintFormat("数据写入, %s 文件关闭",InpFileName);
     }
   else
      PrintFormat("打开失败 %s 文件, 错误代码 = %d",InpFileName,GetLastError());
  }

本文译自 MetaQuotes Software Corp. 撰写的俄文原文
官方代码: https://www.mql5.com/ru/code/1629

演示_FileReadDatetime 演示_FileReadDatetime

这段脚本简单示例如何使用 FileReadDatetime() 函数

演示_FileWrite 演示_FileWrite

这段脚本简单示例如何使用 FileWrite() 函数

演示_FileReadDouble 演示_FileReadDouble

这段脚本简单示例如何使用 FileReadDouble() 函数

演示_FileSize 演示_FileSize

这段脚本简单示例如何使用 FileSize() 函数