Fonctions utiles de KimIV - page 46

 
SK. писал (а) >>

C'est ce que je veux dire. Vous devez tenir compte des contraintes existantes, qui, d'une manière générale, changent tout le temps.

Existe-t-il une fonction qui analyse toutes les contraintes possibles ?

Même chose pour les modifications.

--

(J'ai 16 fonctions - 3 pour chaque bon ordre (OP,SL,TP) et 2 pour chaque ordre au marché (SL,TP),

puis d'autres fonctions analysant les combinaisons de permis).

oui, j'ai aussi une fonction séparée pour définir une commande en vérifiant toutes les limitations possibles et une autre (partiellement similaire à la première) pour les modifications. je ne donnerai pas le code - il y a tellement de choses "à gauche" dont je suis le seul à avoir besoin, que - ouch. :-) mais en général - il est difficile de s'en passer dans le trading réel des conseillers experts. :-)

 
Shu писал (а) >>

Oui, j'ai aussi une fonction séparée pour la mise en place d'un ordre, qui vérifie toutes les limitations possibles et une autre (partiellement similaire à la première) pour la modification. Je ne vous donnerai pas le code - il y a tellement d'astuces "de gauche", dont je suis le seul à avoir besoin, que - ouch. :-) mais en général - il est difficile de s'en passer dans le trading réel des conseillers experts. :-)

En fait, je voulais vérifier moi-même si j'avais tout pris en compte. Si vous ne les vérifiez pas, vous risquez d'être confronté à une série de rebonds (avec parfois la perspective d'être banni).

Je vais énumérer brièvement mes contrôles.

1) StopLevel. Par exemple, lorsque vous modifiez le BuyStop SL.

Il ne vérifie pas seulement la distance. Vous devez analyser la position actuelle de StopLevel et la direction du mouvement de l'ordre stop.

Si SL est en dehors du couloir StopLevel, vous pouvez le rapprocher ou le déplacer indéfiniment.

Si le SL se trouve dans le couloir, le mouvement vers le haut est rejeté. Le mouvement vers le bas est accepté, mais en tenant compte du StopLevel : si la distance de modification à l'intérieur du couloir de distance est fixée à 3 p, et que le couloir est de 30 p, alors la valeur réelle acceptée pour l'exécution est définie par la limite du couloir StopLevel.

2) FreezeLevel.

3. le rapport entre StopLevel et TICKSIZE. L'ordre peut être en dehors de tous les couloirs, mais pas multiple de TICKSIZE - alors il y a un problème. Elle doit être arrondie dans le sens de la modification. Critique pour "non monnaie".

4. Beaucoup. Minlote +/- minlote. Tenez compte du fait que les fermetures partielles et les fermetures à guichet sont limitées aux minlots également (bien que cela soit illogique à mon avis, mais c'est comme ça).

Après les contrôles personnels, l'ordre est émis si chaque contrôle se termine positivement (pas d'interdiction).

 

Bibliothèques de fonctions entièrement publiées :

b-Graphics.rar - travailler avec des objets graphiques.

b-Indicators.rar - travailler avec des indicateurs.

 

La fonction ArrayLR().

Cette fonction génère un tableau de valeurs de régression linéaire. La fonction accepte les paramètres obligatoires suivants :

  • x est un tableau de valeurs de séries numériques. Il s'agit du paramètre d'entrée. Ce tableau doit contenir les valeurs avant l'appel de la fonction.
  • y est un tableau de valeurs de régression linéaire. C'est le paramètre de sortie, c'est-à-dire que le tableau sera rempli après l'exécution de la fonction.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.05.2008                                                     |
//|  Описание : Формирует массив значений линейной регрессии.                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив значений числового ряда                                      |
//|    y - массив значений линейной регрессии                                  |
//+----------------------------------------------------------------------------+
void ArrayLR(double& x[], double& y[]) {
  double a, b, c, sx=0, sx2=0, sxy=0, sy=0;
  int    i, n=ArraySize(x);

  if (n>1) {
    for (i=0; i<n; i++) {
      sx+=i+1;
      sy+=x[i];
      sxy+=(i+1)*x[i];
      sx2+=(i+1)*(i+1);
    }
    a=sx*sy-n*sxy;
    c=sx*sx-n*sx2;
    if (c!=0) a=a/c; else a=0;
    b=(sy-a*sx)/n;
    ArrayResize(y, n);
    for (i=0; i<n; i++) y[i]=a*(i+1)+b;
  } else Print("ArrayLR(): Недостаточное количество элементов ряда! n=", n);
}
 

Exemple d'utilisation de la fonction ArrayLR().

Marquons les niveaux de prix de la régression linéaire pour les 30 barres précédentes.

#define r 30
double x[r], y[];
for (int i=0; i<r; i++) x[i]=Close[i+1];
ArrayLR(x, y);
for (i=0; i<r; i++) SetArrow(170, Red, "arr"+i, Time[i+1], y[i]);

P.S. Vous trouverez ci-joint un script pour tester la fonction ArrayLR().

Dossiers :
 
KimIV писал (а) >>

Bibliothèques de fonctions entièrement publiées :

b-Graphics.rar - travailler avec des objets graphiques.

b-Indicators.rar - travailler avec des indicateurs.

Très cool ! >> Merci !

 
Parabellum писал (а) >>

Igor, il existe un bon indicateur qui peut combiner plusieurs bougies en une seule. Mais cela ne fonctionne que sur le graphique horaire. Est-il possible de le rendre universel ?

Merci.

?

 
Parabellum писал (а) >>

?

ooh... désolé...

Un tel indicateur a déjà été écrit, je ne sais plus par qui et je ne sais plus où je l'ai vu... Je pensais que tu le trouverais toi-même ou que quelqu'un te donnerait le lien...

 

La fonction ArrayLR() ne fonctionne pas correctement.

1. Il ne prend pas en compte l'emplacement temporel des barres. Il ne fonctionne pas correctement lorsque les barres sont manquantes.

2. l'algorithme utilisé pour calculer les coefficients présente un inconvénient sous la forme d'une accumulation d'erreurs d'arrondi, voir 'Help me write a linear regression' (le tout bas de la page Rosh confirme cet écueil).

3. Je propose un algorithme sans ces inconvénients.

4. Si vous remplacez X[i]=Time[i+1] ; par X[i]=i+1 ; l'algorithme est similaire, mais sans accumulation d'erreurs.

5. Les barres ne sont pas seulement sautées le week-end :-(((

Voici ma variante

//+----------------------------------------------------------------------------+
//|  Автор    : Сергей Привалов aka Prival,  Skype: privalov-sv                |
//+----------------------------------------------------------------------------+
//|  Версия   : 10.09.2008                                                     |
//|  Описание : Формирует массив значений линейной регрессии y(x)=A*x+B.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    X    - массив значений числового ряда, ось X                            |
//|    Y    - массив значений числового ряда, ось Y                            |
//+----------------------------------------------------------------------------+

void Array_LR(double &X[], double& Y[])
{
      double mo_X = 0, mo_Y = 0, var_0 = 0, var_1 = 0;
      int    i,N=ArraySize(X);
      double A,B;
     
      if(N>1)  {
         for ( i = 0; i < N; i ++ ) {
            mo_X +=X[i];
          mo_Y +=Y[i];
      }
      mo_X /=N;
      mo_Y /=N;
        
      for ( i = 0; i < N; i ++ )   {
         var_0 +=(X[i]-mo_X)*(Y[i]-mo_Y);
         var_1 +=(X[i]-mo_X)*(X[i]-mo_X);
      }
      // значение коэффициента A
      if(var_1!=0)   A = var_0 / var_1; else A=0;
      // значение коэффициента B
      B = mo_Y - A * mo_X;
      ArrayResize(Y, N);
     for (i=0; i<N; i++) Y[i]=A*X[i]+B;
    } else Print("ArrayLR(): Недостаточное количество элементов ряда! n=", N);
    
}

voici une photo

Exemple de travail

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

Script de vérification ci-joint

Dossiers :
 
Prival писал (а) >>
Voici ma variante

OK, Sergei ! Soit deux variantes de cette fonction.

Ma variante est bonne car elle est identique à l'objet graphique intégré OBJ_REGRESSION. Si quelqu'un a besoin de tirer des prix de cet objet, ma fonction l'aidera, tandis que la vôtre, hélas... Mais il pourrait être utilisé pour autre chose... Merci !