- 显示:
- 1755
- 等级:
- 已发布:
- 2013.10.24 16:43
- 已更新:
- 2016.11.22 07:33
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
脚本获取 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 Ltd译自俄语
原代码: https://www.mql5.com/ru/code/1629