KimIV的有用功能 - 页 47

 

如果你这样称呼它,对我来说也是一样的。

  for (int i=0; i<r; i++)  {
    Y[i]=Close[i+1];
    X[i]=i;
  }
    
  Array_LR(X, Y);
  for (i=0; i<r; i++) {
    SetArrow(170, Blue, "arr"+i+r, Time[i+1], Y[i]);
  }

诚然,两种变体中的点并不完全重叠。但这很可能是SetArrow()的一个特殊性。

这里有一张图片

 
Prival писал (а)>>
诚然,两种变体中的点并不完全重叠。但这很可能是SetArrow()的一个特性。

不,这是OBJ_ARROW图形对象的一个特征。它不是由质心固定,而是由上界的中间固定。

 

ArrayMo()函数。

返回Modu - 分布密度曲线的最大值。该函数接受以下可选参数。

  • x- 数字系列值的数组。
  • d- 数字系列值的准确性,小数点后的数字。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.06.2008                                                     |
//|  Описание : Возвращает Моду - максимум кривой плотности распределения.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив значений числового ряда                                      |
//|    d - точность значений числового ряда, количество знаков после запятой   |
//+----------------------------------------------------------------------------+
double ArrayMo(double& x[], int d=4) {
  double e, s=0;
  double m[][2];             // временный массив:
                             //  столбец 1 - количество значений
                             //  столбец 2 - значения
  int    i, k=ArraySize(x);
  int    n;                  // номер строки временного массива m
  int    r;                  // количество строк во временном массиве m

  if (k>0) {
    for (i=0; i<k; i++) {
      e=NormalizeDouble(x[i], d);
      n=ArraySearchDouble(m, e);
      if (n<0) {
        r=ArrayRange(m, 0);
        ArrayResize(m, r+1);
        m[r][0]++;
        m[r][1]=e;
      } else m[n][0]++;
    }
    ArraySort(m, WHOLE_ARRAY, 0, MODE_DESCEND);
    s=m[0][1];
  } else Print("ArrayMo(): Массив пуст!");

  return(s);
}
 

使用ArrayMo()函数的例子。

确定在当前图表的最后1000个左右的条形图中最经常出现的高价位

#define R 1000
void start() {
  double a[R];
  for (int i=0; i<R; i++) a[i]=High[i];
  Message(ArrayMo(a, 4));
}
附上一个测试ArrayMo()函数的脚本。
附加的文件:
 

b-Array 函数库已经完整发布,并被设计用于处理数组。

 

还有一个,计算协方差

//+----------------------------------------------------------------------------+
//|  Автор    : Сергей Привалов aka Prival,  Skype: privalov-sv                |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.09.2008                                                     |
//|  Описание : Рассчет ковариации массива cvar(X,Y)                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    X    - массив значений числового ряда, ось X                            |
//|    Y    - массив значений числового ряда, ось Y                            |
//+----------------------------------------------------------------------------+

double cvar(double &X[], double &Y[])
{
      double mo_X = 0, mo_Y = 0, res = 0;
      int    i,N=ArraySize(X);
     
      if(N>1 && ArraySize(Y)==N)  {
        for( i = 0; i < N; i ++ ) {
            mo_X +=X[i]-X[0];
          mo_Y +=Y[i];
      }
      mo_X /=N;
      mo_Y /=N;
      for( i = 0; i < N; i ++ ) res +=(X[i]-mo_X)*(Y[i]-mo_Y);
      res /=N;
    } else Print("cvar(): Недостаточное количество элементов ряда! N=", N, " или не совпадает размерность");
   return(res);

纠正了。

 
Prival писал (а)>>

还有一个,计算协方差

将其添加到库中。虽然有更多的数组(矩阵)定义。但我认为我们会逐渐填补它。

有几个问题。

1.什么是mo_XY?

2.在以X为单位的MOs积累线中

mo_X +=X[i]-X[0];
为什么要拿掉X[0]?
3.为什么要对X阵列进行排序?
 

1. 可以删除mo_XY,检查不同的计算选项。这是不良变体留下的。

2.我引用的这个算法,如果Time[]以X的形式出现,那么在计算中出错的几率很小。大数的乘法会逐渐导致误差的积累,并会出现。正是为了这个目的,消除可能出现的这种错误,X被(额外地)移到原点,减去X[0]。

3.我想得太多了,也许是我想错了。 主要是在X中输入的数值与Y对应。

我现在就去纠正它。

 
mo_X += X[0]; // 可能被遗忘了
这是一个不必要的操作。你可以仔细检查一下。
 
TheXpert писал (а)>>

我不同意。

不信任是一个很好的经验法则。在任何数学软件包中都可以查到。我们将公布结果。我现在就在MathCade里做。