27评论

1收藏

MT4 MT5外汇EA编程教程大全之数组函数(五)

avatar EA狙击手 | 8747 人阅读 | 27 人评论 | 2012-11-13

使用数组的一组函数。

数组的最大维数为四维。
每个维数被索引编为从0 至维度-1。
事实上,第一维数组的50 个,在调用时第一个数组显示为[0], 最后一个数组显示为[49]。
使用这些函数(除那些改变定量和定性的数组外)
能够预定义时间系列
Time[], Open[], High[], Low[], Close[], Volume[]

ArrayBsearch
ArrayCopy
ArrayCopyRates
ArrayCopySeries
ArrayDimension
ArrayGetAsSeries
ArrayInitialize
ArrayIsSeries
ArrayMaximum
ArrayMinimum
ArrayRange
ArrayResize
ArraySetAsSeries
ArraySize
ArraySort

int ArrayBsearch( double array[], double value, void count, void start, void direction)
如果没有发现事件,值会返回到第一个维度的数组或者最近的一个数组。
此函数不能用在字符型或连续数字的数组上(除打开柱的连续数组)。
注解: 双元查找只能够存储数。存储数字数组使用ArraySort() 函数。
参量:
array[] - 需要搜索的数组.
value - 将要搜索的值
count - 搜索的数量,默认搜索所有的数组.
start - 搜索的开始点,默认从头开始.
direction - 搜索的方向:
MODE_ASCEND 顺序搜索,
MODE_DESCEND 倒序搜索.

示例:
datetime daytimes[];
int shift=10,dayshift;
// 全部 Time[] 数组被排列在后面的形式
ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);
if(Time[shift]>=daytimes[0]) dayshift=0;
else
{
dayshift=ArrayBsearch(daytimes,Time[shift],WHOLE_ARRAY,0,MODE_DESCEND);
if(Period()<PERIOD_D1) dayshift++;
}
Print(TimeToStr(Time[shift])," corresponds to ",dayshift," day bar opened at ",
TimeToStr(daytimes[dayshift]));


ArrayCopy
int ArrayCopy( void dest[], object source[], void start_dest, void start_source, void count)
复制一个数组到另外一个数组。 只有double[], int[], datetime[], color[], 和 bool[] 这些类型的数组可以被复制。
返回复制元素总量。
参量:
dest[] - 目标数组 。
source[] - 源数组 。
start_dest - 从目标数组的第几位开始写入,默认为0 。
start_source - 从源数组的第几位开始读取,默认为0 。
count - 读取多少位的数组 。默认值为WHOLE_ARRAY常数。

示例:
double array1[][6];
double array2[10][6];
// 数组2 被相同数据添满
ArrayCopyRates(array1);
ArrayCopy(array2,array1,0,0,60);
// 现在数组2 的前10个柱来自历史(前10个柱包括索引[Bars-1])
ArrayCopy(array2,array1,0,Bars*6-60,60);
// 现在数组2 的后10个柱来自历史(后10个柱包括索引[0])



ArrayCopyRates
int ArrayCopyRates( void dest_array[], void symbol, void timeframe)
复制一段走势图上的数据到一个二维数组,并返回复制柱总量,如果是-1表示失败。数组的第二维只有6个项目分别是:
0 - 时间,
1 - 开盘价格,
2 - 最低价格,
3 - 最高价格,
4 - 收盘价格,
5 - 成交量.

如果数据(货币对名称/不同于当前的时间周期) 拒绝其他图表,这种情况下相应的图表不能够在客户端内打开,数据自然会拒绝服务器。这种情况, 错误 ERR_HISTORY_WILL_UPDATED (4066 - 拒绝刷新历史数据) 将被放置到 last_error 变量中,并且将再次拒绝(查看范例ArrayCopySeries()).

注解:此数组通常用于到DLL函数的通过数据。
对于数据数组内存没有真正的分配,没有真正地执行复制。当数组访问时,将会改变方向。
参量:
dest_array[] - 在二维数组上的双重目标数组。
symbol - 货币对名称
timeframe - 时间周期. 可以是列出时间周期的任意值。

示例:
double array1[][6];
ArrayCopyRates(array1,"EURUSD", PERIOD_H1);
Print("当前柱 ",TimeToStr(array1[0][0]),"开盘价格", array1[0][1]);

ArrayCopySeries
int ArrayCopySeries( void array[], int series_index, void symbol, void timeframe)
复制一个系列的走势图数据到数组上.

对于数据数组内存没有真正的分配,没有真正地执行复制。当数组访问时,将会改变方向。在客户指标内禁止数组作为 数组下标分配。这种情况下,数组被真正复制。

如果数据从不同货币对/时间周期图表复制,数据可能缺乏。这种情况下, 错误 ERR_HISTORY_WILL_UPDATED (4066 - 拒绝刷新历史数据)将被放置到 last_error 变量中,并且在确定的时间周期内将重新尝试复制。

注解: 如果series_index是MODE_TIME, 那么第一个参量必须是日期型的数组
参量:
array[] - 目标第一维数字数组。
series_index - 连续数组识别符。必须是连续数组列表识别符其中的值。
symbol - 当前货币对名称
timeframe - 图表时间周期。可以是 列出时间周期的任意值。

示例:
datetime daytimes[];
int shift=10,dayshift,error;
//---- 此Time[] 数组被排列在后面的命令
ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);
error=GetLastError();
if(error==4066)
{
//---- 使两个以上接受只读
for(int i=0;i<2; i++)
{
Sleep(5000);
ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);
//---- 检查但前每日柱时间
datetime last_day=daytimes[0];
if(Year()==TimeYear(last_day) && Month()==TimeMonth(last_day) && Day()==TimeDay(last_day)) break;
}
}
if(Time[shift]>=daytimes[0]) dayshift=0;
else
{
dayshift=ArrayBsearch(daytimes,Time[shift],WHOLE_ARRAY,0,MODE_DESCEND);
if(Period()<PERIOD_D1) dayshift++;
}
Print(TimeToStr(Time[shift])," 相应 ",dayshift," day bar opened at ", TimeToStr(daytimes[dayshift]));


ArrayDimension
int ArrayDimension( object array[])
返回数组的多元维数
参量:
array[] - 将要返回的数组。

示例:
int num_array[10][5];
int dim_size;
dim_size=ArrayDimension(num_array);
// dim_size=2



ArrayGetAsSeries
bool ArrayGetAsSeries( object array[])
返回TRUE,如果数组有组织序列的数组(是否从最后到最开始排序过的),否则返回FALSE。
参量:
array[] - 需要检查的数组。

示例:
if(ArrayGetAsSeries(array1)==true)
Print("数组1是作为连续指数被编入索引");
else
Print("数组1 正常编入索引(从左到右)");



ArrayInitialize
int ArrayInitialize( void array[], double value)
对数组进行初始化,返回经过初始化的数组项的个数。
注解:在客户指标中的init()函数不建议使用到初始化缓冲,在这种函数自动初始化"空值"将自动分配和缓冲重新分配。
参量:
array[] - 需要初始化的数组。
value - 新的数组项的值 。

示例:
//----初始化所有带有2.1的数组
double myarray[10];
ArrayInitialize(myarray,2.1);



ArrayIsSeries
bool ArrayIsSeries( object array[])
如果检查数组是连续的(Time[],Open[],Close[],High[],Low[], or Volume[]), 返回 TRUE,否则返回FALSE。
参量:
array[] - 需要检查的数组。

示例:
if(ArrayIsSeries(array1)==false)
ArrayInitialize(array1,0);
else
{
Print("连续数组不能被初始化!");
return(-1);
}




ArrayMaximum
int ArrayMaximum( double array[], void count, void start)
找出数组中最大值的定位 。在数组中函数返回最大值位置。
参量:
array[] - 搜索数字数组。
count - 搜索数组中项目的个数。
start - 搜索的开始指数。

示例:
double num_array[15]={4,1,6,3,9,4,1,6,3,9,4,1,6,3,9};
int maxValueIdx=ArrayMaximum(num_array);
Print("最大值 = ", num_array[maxValueIdx]);

ArrayMinimum
int ArrayMinimum( double array[], void count, void start)
找出数组中最小值的定位 。在数组中函数返回最小值位置。
参量:
array[] - 搜索数字数组。
count - 搜索数组中项目的个数。
start - 搜索的开始指数。

示例:
double num_array[15]={4,1,6,3,9,4,1,6,3,9,4,1,6,3,9};
int minValueidx=ArrayMinimum(num_array);
Print("最小值 = ", num_array[minValueIdx]);



ArrayRange
int ArrayRange( object array[], int range_index)
取数组中指定维数中项目的数量。 索引以零为基础,维度的大小要大于最大索引1个点。
参量:
array[] - 需要检查的数组。
range_index - 指定的维数 。

示例:
int dim_size;
double num_array[10,10,10];
dim_size=ArrayRange(num_array, 1);



ArrayResize
int ArrayResize( void array[], int new_size)
设定第一维度的大小。如果成功执行,在重新设定后返回包含的全部个数。如果数组没有重设,返回 -1。
注解:在函数完成执行后,在函数内数组地方水平化并且重设将保留不变。 在函数被重新调用后,一些数组将不同于表明的数组。
参量:
array[] - 需要重设的数组。
new_size - 第一维中数组的新大小 。

示例:
double array1[][4];
int element_count=ArrayResize(array1, 20);
// 新大小 - 80个



ArraySetAsSeries
bool ArraySetAsSeries( void array[], bool set)
设定指数数组为系列数组。如果设置参量值为TRUE,数组将被编入索引。数组0位的值是最后的值。其FALSE值设定一个标准的索引命令。此函数返回先前状态。
参量:
array[] - 需要设置的数组。
set - 索引数组命令。

示例:
double macd_buffer[300];
double signal_buffer[300];
int i,limit=ArraySize(macd_buffer);
ArraySetAsSeries(macd_buffer,true);

for(i=0; i<limit; i++)
macd_buffer=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);

for(i=0; i<limit; i++)
signal_buffer=iMAOnArray(macd_buffer,limit,9,0,MODE_SMA,i);



ArraySize
int ArraySize( object array[])
返回数组的项目数 。对于第一维数组,用ArraySize函数返回的 ArrayRange(array,0)。
参量:
array[] - 任何类型数组。

示例:
int count=ArraySize(array1);
for(int i=0; i<count; i++)
{
// 一些计算.
}



ArraySort
int ArraySort( void array[], void count, void start, void sort_dir)
对数组进行排序,系列数组不能ArraySort()使用进行排序。
参量:
array[] - 被排列的数组。
count - 对多少个数组项进行排序。
start - 排序的开始点。
sort_dir - 排序方式,
MODE_ASCEND顺序排列,
MODE_DESCEND倒序排列。

示例:
double num_array[5]={4,1,6,3,9};
// 新数组包含值4,1,6,3,9
ArraySort(num_array);
// 被排列新数组1,3,4,6,9
ArraySort(num_array,WHOLE_ARRAY,0,MODE_DESCEND);
// 被排列新数组 9,6,4,3,1

""
还没有人打赏,支持一下

评论|共 27 个

dell

发表于 2012-11-13 23:45:23 | 显示全部楼层

说的不错  

sky

发表于 2012-11-13 23:45:23 | 显示全部楼层

说的不错  

hate

发表于 2012-11-13 23:45:23 | 显示全部楼层

我也想学习学习~~  

愚人码头

发表于 2012-11-13 23:46:35 | 显示全部楼层

原来这样也可以  

血狼舞

发表于 2012-11-13 23:46:35 | 显示全部楼层

呵呵 哪天得看看 `~~~~  

生活的导演

发表于 2012-11-13 23:46:35 | 显示全部楼层

发贴看看自己积分  

西点

发表于 2012-11-13 23:46:35 | 显示全部楼层

资金量设置的是10000美元啊,  

威廉

发表于 2013-11-3 22:50:06 | 显示全部楼层

MT4 MT5外汇EA编程教程大全之数组函数(

性迷

发表于 2014-10-31 10:38:01 | 显示全部楼层

谢谢分享!!!!!

123下一页
您需要登录后才可以回帖 登录 | 注册 微信登录

EA之家评论守则