Fonctions utiles de KimIV - page 47

 

C'est la même chose pour moi si tu l'appelles comme ça.

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

Il est vrai que les points des deux variantes ne se superposent pas exactement. Mais c'est très probablement une particularité de SetArrow()

Voici une photo

 
Prival писал (а) >>
Il est vrai que les points des deux variantes ne se superposent pas exactement. Mais il s'agit très probablement d'une fonctionnalité de SetArrow().

Non, il s'agit d'une caractéristique de l'objet graphique OBJ_ARROW. Il n'est pas ancré par le centre de masse, mais par le milieu de la limite supérieure.

 

La fonction ArrayMo().

Renvoie Modu - le maximum de la courbe de densité de distribution. La fonction accepte les paramètres facultatifs suivants :

  • x - Tableau de valeurs de séries numériques.
  • d - La précision des valeurs de la série numérique, le nombre de décimales.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
 

Exemple d'utilisation de la fonction ArrayMo().

Détermine le niveau de prix élevé le plus fréquent parmi les quelque 1000 dernières barres du graphique actuel :

#define R 1000
void start() {
  double a[R];
  for (int i=0; i<R; i++) a[i]=High[i];
  Message(ArrayMo(a, 4));
}
SZY. Vous trouverez ci-joint un script pour tester la fonction ArrayMo().
Dossiers :
 

La bibliothèque de fonctions b-Array a été publiée dans son intégralité et est conçue pour fonctionner avec des tableaux.

 

Il en existe une autre, le calcul de la covariance.

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

corrigée.

 
Prival писал (а) >>

Il en existe une autre, le calcul de la covariance.

l'ajouter à la bibliothèque. Bien qu'il y ait beaucoup plus de définitions de tableaux (matrices). Mais je pense que nous allons le remplir progressivement.

Il y a quelques questions :

1. Qu'est-ce que mo_XY ?

2. Dans la ligne d'accumulation des MO par X

mo_X +=X[i]-X[0];
Pourquoi enlever X[0] ?
3. Pourquoi le tableau X devrait-il être commandé ?
 

1. mo_XY peut être supprimé, vérifié différentes options de calcul. Ce sont les restes d'une mauvaise variante.

2) Cet algorithme que j'ai cité a des chances minimales d'obtenir des erreurs dans les calculs si Time[] entre en tant que X. La multiplication de grands nombres entraîne progressivement l'accumulation d'erreurs et celles-ci apparaissent. Exactement dans ce but, en éliminant l'apparition possible de cette erreur, X est (en plus) décalé vers l'origine en soustrayant X[0]

3. J'ai trop réfléchi, peut-être que je suis à côté de la plaque. L'essentiel est que les valeurs tapées en X correspondent à Y

Je vais le corriger maintenant.

 
mo_X += X[0]; // Oublié probablement .
Il s'agit d'une opération inutile. Vous pouvez le vérifier.
 
TheXpert писал (а) >>

Je ne suis pas d'accord.

C'est une bonne règle de base pour se méfier. Vérifiez-le dans n'importe quel paquet de maths. Nous publierons les résultats. Je vais le faire dans MathCade tout de suite.