MT4智能交易编程教程-CopyBuffer函数
在需要数量中,获得确定指标指定缓冲区的数据。 从一开始执行位置计算复制数据元素(指标缓冲区标引buffer_num)到当前传递位置。例如,起始位置是0代表当前字节(当前字节指标值)。 当复制位置数量的数据时,推荐使用动态数组和buffer[]容器缓冲区,因为函数试图分配复制数据的接收数组的大小。如果指标缓冲区(通过使用SetIndexBufer() 函数将数组再分配给存储指标值)以buffer[]容量数组来使用,就允许局部复制。示例可以在标准客户端包自定义指标Awesome_Oscillator.mql5中找到。 如果需要局部复指标值到另一数组(没有指标缓冲区),应该使用媒介数组,这样可以复制预期数量。如果从中间接收数组,可以管理复制所需元素值的管理之后加到要求的位置。 如果知道所需复制数据的数量,为了阻止过多分配内存,最好操作静态分配缓冲区 。 无论目标数组- as_series=true or as_series=false的属性是什么。数据都需要复制,因为最旧的元素放置在数组的记忆内存存储位置,有3种变体可以实现函数调用。 第一位置调用和所需元素数量 int CopyBuffer(
int indicator_handle, // 指标处理
int buffer_num, // 指标缓冲区数
int start_pos, // 启动位置
int count, // 复制总额
double buffer[] // 复制的目标数组
); |
开始日期调用和所需元素的数量 int CopyBuffer(
int indicator_handle, // 指标处理
int buffer_num, // 指标缓冲区数
datetime start_time, // 启动日期和时间
int count, // 复制总额
double buffer[] // 复制的目标数组
); |
开始调用和要求时间间隔的最后日期 int CopyBuffer(
int indicator_handle, // 指标处理
int buffer_num, // 指标缓冲区数
datetime start_time, // 启动日期和时间
datetime stop_time, // 结束日期和时间
double buffer[] // 复制的目标数组
); |
参量 indicator_handle [in] 指标处理,通过类似指标函数返回。 buffer_num [in] 指标缓冲区数量。 start_pos [in] 第一复制元素位置。 count [in] 复制结算数据。 start_time [in] 字节时间,与第一元素相一致。 stop_time [in] 字节时间,与最后元素相一致。 buffer[] [out] 双精度 类型数组。 返回值 返回计算的复制数据或者错误时是-1。 注释 当向指标要求数据,如果要求的时序列没有建立或者需要从服务器上下载,函数很快会返回-1,但是下载/建立的过程将会开始。 当EA交易或脚本要求数据时,来自服务器的下载 会开始,如果终端本地没有这些数据,要求建立的时序列就会开始,如果数据可以从本地历史建立但尚未准备好。函数在超时期满时,会返回一定数量的准备好的数据,但是历史下载会继续,在下一个类似要求函数中会返回更多数据。
示例: - //+------------------------------------------------------------------+
- //| TestCopyBuffer3.mq5 |
- //| Copyright 2009, MetaQuotes Software Corp. |
- //| http://www.mql5.com |
- //+------------------------------------------------------------------+
- #property copyright "2009, MetaQuotes Software Corp."
- #property link "http://www.mql5.com"
- #property version "1.00"
-
- #property indicator_separate_window
- #property indicator_buffers 1
- #property indicator_plots 1
- //---- 图 MA
- #property indicator_label1 "MA"
- #property indicator_type1 DRAW_LINE
- #property indicator_color1 clrRed
- #property indicator_style1 STYLE_SOLID
- #property indicator_width1 1
- //--- 输入参量
- input bool AsSeries=true;
- input int period=15;
- input ENUM_MA_METHOD smootMode=MODE_EMA;
- input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
- input int shift=0;
- //--- 指标缓冲区
- double MABuffer[];
- int ma_handle;
- //+------------------------------------------------------------------+
- //| 自定义指标初始化函数 |
- //+------------------------------------------------------------------+
- int OnInit()
- {
- //--- 指标缓冲区绘图
- SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
- Print("Parameter AsSeries = ",AsSeries);
- Print("Indicator buffer after SetIndexBuffer() is a timeseries = ",
- ArrayGetAsSeries(MABuffer));
- //--- 设置短小的指标名称
- IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
- //--- 设置 AsSeries(依据输入参量)
- ArraySetAsSeries(MABuffer,AsSeries);
- Print("Indicator buffer after ArraySetAsSeries(MABuffer,true); is a timeseries = ",
- ArrayGetAsSeries(MABuffer));
- //---
- ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
- return(INIT_SUCCEEDED);
- }
- //+------------------------------------------------------------------+
- //| 自定义指标重复函数 |
- //+------------------------------------------------------------------+
- int OnCalculate(const int rates_total,
- const int prev_calculated,
- const datetime &time[],
- const double &open[],
- const double &high[],
- const double &low[],
- const double &close[],
- const long &tick_volume[],
- const long &volume[],
- const int &spread[])
- {
- //--- 检测是否计算了所有数据
- if(BarsCalculated(ma_handle)<rates_total) return(0);
- //--- 不复制所有数据
- int to_copy;
- if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total;
- else
- {
- to_copy=rates_total-prev_calculated;
- //--- 常常复制最后的值
- to_copy++;
- }
- //--- 复制
- if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0);
- //--- 为下次调用返回prev_calculated值
- return(rates_total);
- }
- //+------------------------------------------------------------------+
-
复制代码
|