Fonctions utiles de KimIV - page 36

 

Exemples d'utilisation de SetRegression().

  • Canal de régression de la ligne rouge basé sur les barres des 2 derniers jours.
    datetime d0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
    datetime d1=TimeCurrent()-24*60*60;
    while (TimeDayOfWeek(d1)==0 || TimeDayOfWeek(d1)==6) d1-=24*60*60;
    d1=StrToTime(TimeToStr(d1, TIME_DATE));
    SetRegression(Red, "", d1, 0, True);

  • Canal marron de la régression linéaire basée sur les barres des 2 derniers jours.
    datetime d0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
    datetime d1=TimeCurrent()-24*60*60;
    while (TimeDayOfWeek(d1)==0 || TimeDayOfWeek(d1)==6) d1-=24*60*60;
    d1=StrToTime(TimeToStr(d1, TIME_DATE));
    datetime d2=d1-24*60*60;
    while (TimeDayOfWeek(d2)==0 || TimeDayOfWeek(d2)==6) d2-=24*60*60;
    d2=StrToTime(TimeToStr(d2, TIME_DATE));
    SetRegression(Brown, "", d2, d0, True, STYLE_DASH);

PS. Vous trouverez ci-joint un script pour tester la fonction SetRegression().

Dossiers :
 

La fonction EquationDirect().

L'équation d'une ligne droite. Cette fonction calcule la valeur de l'ordonnée Y pour l'abscisse X à l'intersection avec une ligne tracée par deux points arbitraires du graphique. La fonction prend les paramètres obligatoires suivants :

  • x1, y1 - Coordonnées du premier point.
  • x2, y2 - Coordonnées du deuxième point.
  • x - Valeur, abscisse pour laquelle l'ordonnée Y doit être calculée.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Уравнение прямой.                                              |
//|             Вычисляет значение Y для X в точке пересечения с прямой.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x1,y1 - координаты первой точки,                                        |
//|    x2,y2 - координаты второй точки,                                        |
//|    x     - значение, для которого вычислить Y                              |
//+----------------------------------------------------------------------------+
double EquationDirect(double x1, double y1, double x2, double y2, double x) {
  if (x2==x1) return(y1);
  return((y2-y1)/(x2-x1)*(x-x1)+y1);
}
 

Exemples d'utilisation de la fonction EquationDirect().

  • Le point rouge est à l'intersection de la ligne tracée par les minima des barres 23 et 11 et la verticale de la barre zéro.
    double y=EquationDirect(23, Low[23], 11, Low[11], 0);
    SetArrow(108, Red, "", 0, y);

  • Une ligne droite partant des points rouges et passant par deux points arbitraires du graphique.
    double p, x[2], y[2];
    int    cd=115, i, k, ot;
    string on;
    
    ArrayInitialize(x, 0.0);
    ArrayInitialize(y, 0.0);
    
    k=ObjectsTotal();
    for (i=k-1; i>=0; i--) {
      on=ObjectName(i);
      ot=ObjectType(on);
      if (ot==OBJ_ARROW) {
        if (ObjectGet(on, OBJPROP_ARROWCODE)==cd) ObjectDelete(on);
      }
    }
    k=ObjectsTotal();
    for (i=0; i<k; i++) {
      on=ObjectName(i);
      ot=ObjectType(on);
      if (ot==OBJ_ARROW) {
        if (x[0]==0) {
          x[0]=iBarShift(NULL, 0, ObjectGet(on, OBJPROP_TIME1));
          y[0]=ObjectGet(on, OBJPROP_PRICE1);
        } else {
          if (x[1]==0) {
            x[1]=iBarShift(NULL, 0, ObjectGet(on, OBJPROP_TIME1));
            y[1]=ObjectGet(on, OBJPROP_PRICE1);
          }
        }
      }
    }
    if (x[0]==0 || x[1]==0 || y[0]==0 || y[1]==0)
      Message("НЕ инициализированы исходные данные!");
    else {
      if (x[0]>x[1]) k=x[0]; else k=x[1];
      for (i=k; i>=0; i--) {
        if (i!=x[0] && i!=x[1]) p=EquationDirect(x[0], y[0], x[1], y[1], i);
        else {
          if (i==x[0]) p=y[0];
          if (i==x[1]) p=y[1];
        }
        SetArrow(cd, Red, "arr"+i, Time[i], p);
      }
    }

SZY. Vous trouverez ci-joint un script pour tester EquationDirect().

Dossiers :
 

Fonction GetArrowInterval().

J'ai écrit cette fonction pour faciliter le développement des indicateurs de signaux, c'est-à-dire les indicateurs qui donnent des signaux clairs d'achat ou de vente. Le signal d'un tel indicateur se présente généralement sous la forme d'une flèche vers le bas au-dessus du Khai d'une barre ou d'une flèche vers le haut en dessous du bas de la barre correspondante. La valeur de "moins" et "plus" était généralement de quelques points, afin que la flèche ne "dépasse" pas la barre. Ce n'était pas un gros problème dans le cas d'un indicateur à un seul horizon temporel conçu pour les barres d'une heure seulement, par exemple. Pour chaque période de temps, j'avais différentes valeurs "under" et "over". Mais pour les indicateurs multi-trames, j'ai dû utiliser la fonction GetArrowInterval() :

//+------------------------------------------------------------------+
//| Возвращает интервал установки сигнальных указателей              |
//+------------------------------------------------------------------+
int GetArrowInterval() {
  int p = Period();

  switch (p) {
    case 1:     return(4);
    case 5:     return(5);
    case 15:    return(6);
    case 30:    return(8);
    case 60:    return(10);
    case 240:   return(20);
    case 1440:  return(40);
    case 10080: return(80);
    case 43200: return(150);
  }
}

Il s'agit d'une ancienne variante qui s'est très vite transformée en une forme plus compacte et polyvalente :

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//+----------------------------------------------------------------------------+
//|  Описание : Возвращает интервал установки сигнальных указателей            |
//|  Параметры:                                                                |
//|    pr - процент относительно ценового размера окна                         |
//+----------------------------------------------------------------------------+
int GetArrowInterval(int pr=7) {
  if (pr<=0) pr=7;
  return((WindowPriceMax()-WindowPriceMin())/100*pr/Point);
}
 

Exemples d'utilisation de GetArrowInterval().

  • Signal de vente sur la barre actuelle.
    SetArrow(242, Red, "", Time[0], High[0]+GetArrowInterval(15)*Point, 2);

  • Signal d'achat sur la (première) barre précédente.
    SetArrow(233, Blue, "", Time[1], Low[1]-GetArrowInterval()*Point, 1);
    

SZY. Vous trouverez ci-joint un script pour tester la fonction GetArrowInterval().

Dossiers :
 
Cher Igor. Dans e-SOTrailing, vous devez modifier les positions de prise et d'arrêt.
 
khorosh писал (а) >>
Dans l'EA e-SOTrailing, vous devez modifier les prises et les arrêts.

Merci ! C'est fait... L'EA corrigée est sur mon site web.

 
KimIV писал (а) >>

La fonction EquationDirect().

L'équation d'une ligne droite. Cette fonction calcule la valeur de l'ordonnée Y pour l'abscisse X à l'intersection avec une ligne tracée par deux points arbitraires du graphique. La fonction prend les paramètres obligatoires suivants :

  • x1, y1 - Coordonnées du premier point.
  • x2, y2 - Coordonnées du deuxième point.
  • x - Valeur, l'abscisse pour laquelle vous voulez calculer l'ordonnée.

Veuillez écrire la deuxième partie de l'équation de la ligne.

Calculez la valeur de l'ordonnée Y pour l'abscisse de X au point d'intersection avec une ligne tracée par un point arbitraire d'un graphique avec un angle donné. La fonction prend les paramètres obligatoires suivants :

  • x1, y1 - Coordonnées du premier point.
  • a - Angle en degrés.
  • x - Valeur, l'abscisse pour laquelle vous voulez calculer l'ordonnée y .

Merci.

 
Un vrai programmeur, Igor. Grand respect et respect à vous.
 
djday писал (а) >>

Veuillez écrire la deuxième partie de l'équation d'une ligne droite.

Calculez la valeur de l'ordonnée Y pour l'abscisse X au point d'intersection avec une ligne tracée par un point arbitraire sur un graphique avec un angle donné. La fonction prend les paramètres obligatoires suivants :

  • x1, y1 - Coordonnées du premier point.
  • a - Angle en degrés.
  • x - Valeur, l'abscisse pour laquelle l'ordonnée Y doit être calculée .

Merci.

Un angle de 45° se produit lorsque les cathéters sont égaux. Lorsque l'unité de mesure des cathéters est métrique, il n'y a pas de problème. L'un des cathetus mesure deux mètres et l'autre deux mètres également. Donc c'est un angle de 45°. Mais qu'en est-il lorsqu'un cathetus est le nombre de barres ou le temps, et que l'autre cathetus est le prix ? Comment s'assurer qu'ils sont égaux pour que l'angle soit de 45° ? C'est une question d'échelle. Donnez-moi un point d'appui et je déplacerai le sol (c).