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));
}
SZY. 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によるMOの蓄積のラインでは

mo_X +=X[i]-X[0];
なぜX[0]を取り上げるのか?
3.なぜアレイXを発注する必要があるのか?
 

1.mo_XYを削除し、異なる計算オプションを確認することができます。これは、悪いバリアントが残っているんです。

2.引用したこのアルゴリズムは、Time[]がXとして入ってきても、計算でエラーが出る可能性が少ないです。大きな数字の掛け算は、徐々に誤差が蓄積され、それが現れてきます。このため,X[0]を減算してXを原点に移動させる(追加)。

3.考えすぎて、順番が狂っていたのかもしれません。 要は、Xに入力された値がYに対応することです

これから訂正します。

 
mo_X += X[0]; // 忘れてたかも
これは不要な操作です。ダブルチェックが可能です。
 
TheXpert писал (а)>>

私はそうは思いません。

不信感を抱くのが鉄則です。どの数学のパッケージでもいいので、確認してみてください。その結果を掲載します。今すぐMathCadeでやってみる。