路路发智能交易研发中心

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

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

[复制链接]

管理员

MT4软件工程师

Rank: 9Rank: 9Rank: 9

积分
6521
帖子
2771
主题
2761
QQ
发表于 2014-3-27 09:54:15 | 显示全部楼层 |阅读模式
MT4智能交易编程教程-CopyRates函数
当复制未知数量数据时,推荐使用动态数组为目标数组,因为如果要求数据账户少于(或多于)目标数值的长度,函数试图重新分配内存以完全适应要求数据。
如果知道所需复制的数据数量,为了阻止内存过多分配,最好使用 静态分配缓冲区。
无论目标数组- as_series=true or as_series=false的属性是什么,数据就会复制,以至于最旧的数组元素会在记忆内存开始中放置。有3个变量函数可供调用。
调用第一位置和要求元素的数量
int  CopyRates(
   string           symbol_name,       // 交易品种名称
   ENUM_TIMEFRAMES  timeframe,         // 周期
   int              start_pos,         // 启动位置
   int              count,             // 复制数据计算
   MqlRates         rates_array[]      // 复制目标数组
   );


调用起始位置日期和要求元素数量
int  CopyRates(
   string           symbol_name,       // 交易品种名称
   ENUM_TIMEFRAMES  timeframe,         // 周期
   datetime         start_time,        // 开始日期和时间
   int              count,             // 复制数据计算
   MqlRates         rates_array[]      // 复制目标数组
   );


调用起始位置和要求时间间隔的日期末尾
int  CopyRates(
   string           symbol_name,       // 交易品种名称
   ENUM_TIMEFRAMES  timeframe,         // 周期
   datetime         start_time,        // 开始日期和时间
   datetime         stop_time,         // 结束日期和时间
   MqlRates         rates_array[]      // 复制目标数组
   );


参量
symbol_name
[in] 交易品种名称。
timeframe
[in]  周期。
start_time
[in]  复制的第一元素字节时间。
start_pos
[in]  复制的第一元素起始位置。
count
[in]  复制的数据点。
stop_time
[in] 字节时间,与最后一个复制元素相一致。
rates_array[]
[out] MqlRates 类型数组
返回值
返回复制数据数量或者错误时是-1。
注释
如果要求数据的全部间隔不在服务器的可用数据内,函数返回-1。如果外部数据TERMINAL_MAXBARS(图表中的最大字节量)是要求的,函数也会返回-1。
当向指标要求数据,如果要求的时序列没有建立或者需要从服务器上下载,函数很快会返回-1,但是下载/建立的过程将会开始。
当EA交易或脚本要求数据时,来自服务器的下载 会开始,如果终端本地没有这些数据,要求建立的时序列就会开始,如果数据可以从本地历史建立但尚未准备好。函数在超时期满时,会返回一定数量的准备好的数据,但是历史下载会继续,在下一个类似要求函数中会返回更多数据。
When requesting data by the start date and the number of required elements, only data whose date is less (earlier) or equal to the date specified. It means, the open time of any bar, for which value is returned (volume, spread, value on the indicator buffer, prices Open, High, Low, Close or open time Time) is always less or equal to the specified one.
当在日期指定范围内要求数据,只有间隔中的数据才能返回,间隔建立并指到秒。这表示,任意字节的开始时间,返回的值(成交量,传播,指标缓冲区的值,开仓价,最高阶,最低价,收盘价或者开仓时间)是间隔要求范围内的。

因此,如果当前日期是星期六,想要复制指定的一周的时间表start_time=Last_Tuesdaystop_time=Last_Friday ,函数的返回值是0,因为每周开盘时间是星期日,但是一周字节不能分成特殊的间隔。
如果需要返回与当前未完成字节相类似的值,可以调用指定的 start_pos=0 和 count=1第一种形式。
示例:
  1. void OnStart()
  2.   {
  3. //---
  4.    MqlRates rates[];
  5.    ArraySetAsSeries(rates,true);
  6.    int copied=CopyRates(Symbol(),0,0,100,rates);
  7.    if(copied>0)
  8.      {
  9.       Print("Bars copied: "+copied);
  10.       string format="open = %G, high = %G, low = %G, close = %G, volume = %d";
  11.       string out;
  12.       int size=fmin(copied,10);
  13.       for(int i=0;i<size;i++)
  14.         {
  15.          out=i+":"+TimeToString(rates[i].time);
  16.          out=out+" "+StringFormat(format,
  17.                                   rates[i].open,
  18.                                   rates[i].high,
  19.                                   rates[i].low,
  20.                                   rates[i].close,
  21.                                   rates[i].tick_volume);
  22.          Print(out);
  23.         }
  24.      }
  25.    else Print("Failed to get history data for the symbol ",Symbol());
  26.   }
复制代码






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

使用道具 举报

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

本版积分规则


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

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

© 2009-2022 520EA.com EA668.com

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