int ArrayBsearch( double 数组名, double 查找值, int 范围=WHOLE_ARRAY, int 始点=0, void 方向=MODE_ASCEND)
搜索某在组中的位置
如果找到,则返回第一次找到的元素下标。如果未找到,则返回最接近搜索值的元素下标。
此函数不能用于字符串型数组或序列数组(不包括K线开盘时间)。
注:二进制查找只能在已排序的数组中进行。使用 ArraySort() 函数可以排序数值数组。
:: 输入参数
array[] - 需要搜索的数组
value - 要搜索的值
count - 搜索的数量,默认搜索所有的数组
start - 搜索的开始点,默认从头开始
direction - 搜索的方向,
MODE_ASCEND 顺序搜索
MODE_DESCEND 倒序搜索
示例:
datetime 日期组[];
int shift= 350,
dayshift;
//--Time[]中所有数值降序排列
ArrayCopySeries(日期组, MODE_TIME, Symbol(), PERIOD_D1); // 将日K线的时间序列考贝到日期组
//--若在当前时框内的所查棒时间大于今天,则按今天的日线棒
if(Time[shift]>=日期组[0])
dayshift= 0;
//--否则按
else{
dayshift= ArrayBsearch(日期组, Time[shift], WHOLE_ARRAY, 0, MODE_DESCEND); // 查找
if(Period()<PERIOD_D1)
dayshift++;
}
Print("所查棒时间 ",TimeToStr(Time[shift]),"在日K线前第 ",dayshift," 天内,该日K开盘时间为:",TimeToStr(日期组[dayshift]));
int ArrayCopy( object& 受组名, object 源组名, int 受组始下标=0, int 源组始下标 =0, int 拷贝总数=WHOLE_ARRAY)
把一个数组拷贝到另外一个数组。
数组必须类型相同,且只有同类型的double, int, datetime, color和bool型数组之间可以被复制。
返回被复制元素的个数。
:: 输入参数
dest[] - 目标接受数组
source[] - 读取源数组
start_dest - 从目标数组的第几位开始写入,默认为0
start_source - 从源数组的第几位开始读取,默认为0
count - 要复制的元素个数;默认为 WHOLE_ARRAY 常数。
示例:
double 源数组[][6];
double 接受组[10][6];
//--将源数组的部分数据填充进接受组中
ArrayCopyRates(源数组);
ArrayCopy(接受组, 源数组, 0, Bars-9, 10);
//--结果现在接受组 已经有了前10个历史K线数据
int ArrayCopyRates( double& 受组名, string 货币名=NULL, int 时框=0)
把K线数据拷贝到二维数组,数组的第二维只有6个项目分别是:
0 - 时间,
1 - 开盘价,
2 - 最低价,
3 - 最高价,
4 - 收盘价,
5 - 成交量.
返回已复制的柱数。如果返回-1,表示复制失败。
如果想从另一个图表获取数据(货币对名称/图表时段与当前不同),而相应的图表又没有打开,需要从服务器下载必要的数据,那么出现这种状况是有可能的。这种情况下,错误信息ERR-HISTORY-WILL-UPDATED (4066 – 历史数据正在更新)将被放到 last_error 变量中,并且不得不再次下载数据( 查看范例 ArrayCopySeries() )。
注:此数组通常用于向DLL函数传递数据。没有真正为数据数组分配内存,也没有真正地执行复制。当存取这样的数组时,访问将被重定向。
:: 输入参数
dest_array[] - 目标接收数组
symbol - 货币对名称
timeframe - 时框
示例:
double 数组[][6];
ArrayCopyRates(数组, "EURUSD", PERIOD_H1);
Print("E/U一小时框K线: 当前 ", TimeToStr(数组[0][0]), "开盘价为", 数组[0][1]);
int ArrayCopySeries( double& 受组名, int 序号, string 货币名=NULL, int 时框=0)
把K线数据拷贝到一维数组
返回复制的元素个数。
没有真正为数据数组分配内存,也没有真正地执行复制。当存取这样数组时,访问将被重定向。自定义指标中指标数组是例外情况,这种情况下,数组被真正复制。
如果数据从不同货币对或不同的时框复制,可能会出现缺少数据情况,则错误信息ERR-HISTORY-WILL-UPDATED(4066 – 历史数据正在更新)将被放到last_error中,在一段时间之后重新尝试复制。
注: 如果series_index是MODE_TIME, 那么这个一维数组必须是datetim型数组而不能是double型
:: 输入参数
dest_array[] - 目标接收数组
series_index - 想要取的系列的名称或编号,0-5
symbol - 货币对名称
timeframe - 时框
示例:
datetime 日K时间组[];
int shift= 10,
dayshift,
错码;
//--此 Time[] 数组降序排列
ArrayCopySeries(日K时间组, MODE_TIME, Symbol(), PERIOD_D1);
错码= GetLastError();
if(错码==4066){
//--试读两次以上
for(int i=0;i<2; i++){
Sleep(5000);
ArrayCopySeries(日K时间组,MODE_TIME,Symbol(),PERIOD_D1);
//--检查每日K线时间
datetime last_day=日K时间组[0];
if(Year()==TimeYear(last_day) && Month()==TimeMonth(last_day) && Day()==TimeDay(last_day))
break;
}
}
if(Time[shift]>=日K时间组[0])
dayshift= 0;
else{
dayshift= ArrayBsearch(日K时间组, Time[shift], WHOLE_ARRAY, 0, MODE_DESCEND);
if(Period()<PERIOD_D1)
dayshift++;
}
Print(TimeToStr(Time[shift]), " corresponds to ",dayshift," day bar opened at ", TimeToStr(日K时间组[dayshift]));
int ArrayDimension( int 数组名)
数组的维数
:: 输入参数
array[] - 需要检查的数组
示例:
int 数组[10][5];
int 维数;
维数= ArrayDimension(数组);
// 维数结果为2
bool ArrayGetAsSeries(object 数组名)
判断数组是否按序列数组形式排列( 即数组元素从最后到最开始的顺序)
:: 输入参数
array[] - 需要检查的数组
示例:
if(ArrayGetAsSeries(数组1)==true)
Print("数组1 是作为序列数组排序");
else
Print("数组1 正常排序(从左到右)");
int ArrayInitialize( double& 数组名, double 新元素值)
初始化为统一值
将数值型数组的每个元素的值都设为同一个数值,
返回己初始化的元素个数。
注:在自定义指标init()函数中不建议初始化指标缓冲区,在缓冲区分配和重分配内存时这种函数自动初始化为 "空值" 。
:: 输入参数
array[] - 需要初始化的数组
value - 设置新的数组项的值
示例:
//---- 把所有元素的值都设置为2.1
double 数组[10];
ArrayInitialize( 数组 , 2.1);
bool ArrayIsSeries( object 数组名)
检查数组是否为系列的(如 Close[], Open[], High[], Low[], Time[] 或 Volume[] )
:: 输入参数
array[] - 需要检查的数组
示例:
if(ArrayIsSeries(array1)==false)
ArrayInitialize(array1,0);
else{
Print("序列数组不能被初始化!");
return(-1);
}
int ArrayMaximum( double 数组名, int 搜索总数 =WHOLE_ARRAY, int 搜始点=0)
找出数组中最大值的定位
:: 输入参数
array[] - 需要检查的数组
count - 搜索数组中元素的个数
start - 搜索的开始点
示例:
double 数组[15]={4,1,6,3,9,4,1,6,3,9,4,1,6,3,9};
int 最大位= ArrayMaximum(数组);
Print("最大值 = ", 数组[最大位]);
int ArrayMinimum( double 数组名, int 搜索总数 =WHOLE_ARRAY, int 搜始点=0)
找出数组中最小值的定位
:: 输入参数
array[] - 需要检查的数组
count - 搜索数组中元素的个数
start - 搜索的开始点
示例:
double 数组[15]={4,1,6,3,9,4,1,6,3,9,4,1,6,3,9};
double 最小位= ArrayMinimum(数组);
Print("最小值 = ", 数组[最小位]);
int ArrayRange( object 数组名 , int 指定维)
取数组中指定维数的元素的个数。
由于下标从零开始,数组的大小要比最大下标数多1。
:: 输入参数
array[] - 需要检查的数组
range_index - 指定的维数
示例:
double 数组[30,20,10]; // 数组[第0(+1)维, 第1(+1)维, 第2(+1)维]
int 维0个数;
int 维1个数;
int 维2个数;
int 维3个数;
维0个数= ArrayRange(数组, 0);
维1个数= ArrayRange(数组, 1);
维2个数= ArrayRange(数组, 2);
维3个数= ArrayRange(数组, 3);
Comment(" 维0(+1)的元素个数= ",维0个数," 维1(+1)的元素个数= ",维1个数," 维2(+1)的元素个数= ",维2个数," 维3(+1)的元素个数= ",维3个数);
// 结果为:第一维30个,第二维20个,第三维10个,第四维0个
int ArrayResize( object& 数组名, int 新大小)
重新设定数组第一维的大小。
如果执行成功的话,函数将返回新数组的元素个数,否则,返回-1,数组大小并不改变。
注:函数执行完成后,在函数内局部定义和重设大小的数组将维持原样不变。在函数被重新调用后,这种数组的大小将会与定义时大小有差异。
:: 输入参数
array[] - 需要检查的数组
new_size - 第一维中数组的新大小值
示例:
double 数组[][4];
int 元素总数= ArrayResize(数组, 20);
// 结果为新的大小 为80个元素 (每维20个元素,共4维) 未
bool ArraySetAsSeries( double& 数组名 , bool 设置方向)
设置数组为系列化数组,设定数组的排列方向。
:: 输入参数
array[] - 需要处理的数值型数组
set - 数组索引顺序,(即:是否是设置为系列数组)
true 为倒序 (即: 数组元素下标为0的值 是最后的值)
false 为顺序。(表明数组原本是一个正常的排列顺序,此函数原样返回以前的数组。)
示例:
double Macd缓组[300];
double 信号缓组[300];
int i,
limit= ArraySize(Macd缓组);
ArraySetAsSeries(Macd缓组, true);
for(i=0; i<limit; i++)
Macd缓组[i]= 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++)
信号缓组[i]= iMAOnArray(Macd缓组, limit, 9, 0, MODE_SMA, i);
int ArraySize( object 数组名 )
数组元素的个数。
对于一维数组,用ArraySize()返回的大小和ArrayRange(array, 0)的结果相等
:: 输入参数
array[] - 需要处理的数组
示例:
int 元素总数= ArraySize(数组);
for(int i=0; i<元素总数; i++){
// 。。。一些计算.
}
int ArraySort( double& 数组名, int 元素总数=WHOLE_ARRAY, int 起点=0, int 方向=MODE_ASCEND)
按数值型数组的第一维进行排序。
该函数不可以对系列数组进行排序
:: 输入参数
array[] - 需排序的数组
count - 参与排序的元素个数
start - 排序的起始下标
sort_dir - 排序方式:
MODE_ASCEND顺序排列;
MODE_DESCEND倒序排列
示例:
double 数组[5]= {4,1,6,3,9}; // 现在数组包含了值 4,1,6,3,9
ArraySort(数组); // 结果为 1,3,4,6,9
ArraySort(数组,MODE_DESCEND); // 结果为 9,6,4,3,1
网友评论