美文网首页
数组函数

数组函数

作者: 牛在汇上飞 | 来源:发表于2018-10-23 12:01 被阅读0次

    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

    相关文章

      网友评论

          本文标题:数组函数

          本文链接:https://www.haomeiwen.com/subject/mvttzftx.html