Nützliche Funktionen von KimIV - Seite 47

 

Für mich ist es dasselbe, wenn Sie es so nennen.

  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]);
  }

Zwar überlagern sich die Punkte in beiden Varianten nicht exakt. Aber das ist höchstwahrscheinlich eine Eigenheit von SetArrow()

Hier ist ein Bild

 
Prival писал (а) >>
Es stimmt, dass sich die Punkte in beiden Varianten nicht genau überschneiden. Dies ist jedoch höchstwahrscheinlich eine Funktion von SetArrow()

Nein, dies ist eine Funktion des grafischen Objekts OBJ_ARROW. Er wird nicht durch den Massenschwerpunkt, sondern durch die Mitte der oberen Begrenzung verankert.

 

Die Funktion ArrayMo().

Gibt Modu - das Maximum der Verteilungsdichtekurve - zurück. Die Funktion akzeptiert die folgenden optionalen Parameter:

  • x - Array mit numerischen Reihenwerten.
  • d - Die Genauigkeit der numerischen Reihenwerte, die Anzahl der Dezimalstellen.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
 

Beispiel für die Verwendung der Funktion ArrayMo().

Ermittelt das am häufigsten vorkommende Höchstkursniveau unter den letzten etwa 1000 Balken des aktuellen Charts:

#define R 1000
void start() {
  double a[R];
  for (int i=0; i<R; i++) a[i]=High[i];
  Message(ArrayMo(a, 4));
}
SZY: Im Anhang finden Sie ein Skript zum Testen der Funktion ArrayMo().
Dateien:
 

Die Funktionsbibliothek b-Array wurde vollständig veröffentlicht und ist für die Arbeit mit Arrays konzipiert.

 

Es gibt noch eine weitere Möglichkeit, die Berechnung der Kovarianz

//+----------------------------------------------------------------------------+
//|  Автор    : Сергей Привалов 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);

korrigiert.

 
Prival писал (а) >>

Es gibt noch eine weitere Möglichkeit, die Berechnung der Kovarianz

fügen Sie es der Bibliothek hinzu. Allerdings gibt es viel mehr Definitionen für Arrays (Matrizen). Aber ich denke, wir werden sie nach und nach füllen.

Es gibt ein paar Fragen:

1. Was ist mo_XY?

2. In der Linie der Akkumulation von MOs durch X

mo_X +=X[i]-X[0];
Warum sollte man X[0] wegnehmen?
3. Warum sollte das Feld X bestellt werden?
 

1. mo_XY kann entfernt werden, verschiedene Berechnungsoptionen geprüft. Dies ist ein Überbleibsel einer schlechten Variante.

2. dieser Algorithmus, den ich zitiert habe, hat minimale Chancen, Fehler in den Berechnungen zu bekommen, wenn Time[] in als X kommt. Die Multiplikation großer Zahlen führt zu einem allmählichen Fehleraufbau, der sich bemerkbar machen wird. Genau zu diesem Zweck, um das mögliche Auftreten dieses Fehlers auszuschließen, wird X (zusätzlich) zum Ursprung verschoben, indem X[0] abgezogen wird.

3. Ich habe zu viel nachgedacht, vielleicht bin ich nicht ganz bei der Sache. Die Hauptsache ist, dass die in X eingegebenen Werte mit Y übereinstimmen.

Ich werde sie jetzt korrigieren.

 
mo_X += X[0]; // Wahrscheinlich vergessen .
Dies ist ein unnötiger Vorgang. Sie können es noch einmal überprüfen.
 
TheXpert писал (а) >>

Da bin ich anderer Meinung.

Es ist eine gute Faustregel, Misstrauen zu hegen. Überprüfen Sie dies in einem beliebigen Mathepaket. Wir werden die Ergebnisse veröffentlichen. Ich werde es jetzt in MathCade machen.