路路发智能交易研发中心

 找回密码
 立即注册
查看: 3031|回复: 0

MT4智能交易编程教程-CopyBuffer函数

[复制链接]

管理员

MT4软件工程师

Rank: 9Rank: 9Rank: 9

积分
6521
帖子
2771
主题
2761
QQ
发表于 2014-3-27 09:53:03 | 显示全部楼层 |阅读模式
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交易或脚本要求数据时,来自服务器的下载 会开始,如果终端本地没有这些数据,要求建立的时序列就会开始,如果数据可以从本地历史建立但尚未准备好。函数在超时期满时,会返回一定数量的准备好的数据,但是历史下载会继续,在下一个类似要求函数中会返回更多数据。

示例:
  1. //+------------------------------------------------------------------+
  2. //|                                              TestCopyBuffer3.mq5 |
  3. //|                        Copyright 2009, MetaQuotes Software Corp. |
  4. //|                                              http://www.mql5.com |
  5. //+------------------------------------------------------------------+
  6. #property copyright "2009, MetaQuotes Software Corp."
  7. #property link      "http://www.mql5.com"
  8. #property version   "1.00"

  9. #property indicator_separate_window
  10. #property indicator_buffers 1
  11. #property indicator_plots   1
  12. //---- 图 MA
  13. #property indicator_label1  "MA"
  14. #property indicator_type1   DRAW_LINE
  15. #property indicator_color1  clrRed
  16. #property indicator_style1  STYLE_SOLID
  17. #property indicator_width1  1
  18. //--- 输入参量
  19. input bool               AsSeries=true;
  20. input int                period=15;
  21. input ENUM_MA_METHOD     smootMode=MODE_EMA;
  22. input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
  23. input int                shift=0;
  24. //--- 指标缓冲区
  25. double                   MABuffer[];
  26. int                      ma_handle;
  27. //+------------------------------------------------------------------+
  28. //| 自定义指标初始化函数                                                |
  29. //+------------------------------------------------------------------+
  30. int OnInit()
  31.   {
  32. //--- 指标缓冲区绘图
  33.    SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
  34.    Print("Parameter AsSeries = ",AsSeries);
  35.    Print("Indicator buffer after SetIndexBuffer() is a timeseries = ",
  36.          ArrayGetAsSeries(MABuffer));
  37. //--- 设置短小的指标名称
  38.    IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
  39. //--- 设置 AsSeries(依据输入参量)
  40.    ArraySetAsSeries(MABuffer,AsSeries);
  41.    Print("Indicator buffer after ArraySetAsSeries(MABuffer,true); is a timeseries = ",
  42.          ArrayGetAsSeries(MABuffer));
  43. //---
  44.    ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
  45.    return(INIT_SUCCEEDED);
  46.   }
  47. //+------------------------------------------------------------------+
  48. //| 自定义指标重复函数                                                  |
  49. //+------------------------------------------------------------------+
  50. int OnCalculate(const int rates_total,
  51.                 const int prev_calculated,
  52.                 const datetime &time[],
  53.                 const double &open[],
  54.                 const double &high[],
  55.                 const double &low[],
  56.                 const double &close[],
  57.                 const long &tick_volume[],
  58.                 const long &volume[],
  59.                 const int &spread[])
  60.   {
  61. //--- 检测是否计算了所有数据
  62.    if(BarsCalculated(ma_handle)<rates_total) return(0);
  63. //--- 不复制所有数据
  64.    int to_copy;
  65.    if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total;
  66.    else
  67.      {
  68.       to_copy=rates_total-prev_calculated;
  69.       //--- 常常复制最后的值
  70.       to_copy++;
  71.      }
  72. //--- 复制
  73.    if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0);
  74. //--- 为下次调用返回prev_calculated值
  75.    return(rates_total);
  76.   }
  77. //+------------------------------------------------------------------+

复制代码




外汇智能交易,成就财富梦想!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


MT4编程培训|EA定制开发|QQ在线咨询|路路发智能交易研发中心

GMT+8, 2024-12-22 22:02 , Processed in 0.162917 second(s), 26 queries .

© 2009-2022 520EA.com EA668.com

快速回复 返回顶部 返回列表