Funciones útiles de KimIV - página 36

 

Ejemplos de cómo utilizar SetRegression().

  • Canal de regresión de la línea roja basado en las barras de los últimos 2 días.
    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 marrón de la regresión lineal basada en las barras de los dos últimos días.
    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. Se adjunta un script para probar la función SetRegression().

Archivos adjuntos:
 

La función EquationDirect().

La ecuación de una línea recta. Esta función calcula el valor de la ordenada Y para la abscisa X en la intersección con una línea trazada a través de dos puntos arbitrarios del gráfico. La función toma los siguientes parámetros obligatorios:

  • x1, y1 - Coordenadas del primer punto.
  • x2, y2 - Coordenadas del segundo punto.
  • x - Valor, abscisa para la que se debe calcular la ordenada Y.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
 

Ejemplos de cómo utilizar EquationDirect().

  • El punto rojo se encuentra en la intersección de la línea que pasa por los mínimos de las barras 23 y 11 y la vertical de la barra cero.
    double y=EquationDirect(23, Low[23], 11, Low[11], 0);
    SetArrow(108, Red, "", 0, y);

  • Una línea recta desde los puntos rojos a través de dos puntos arbitrarios en el gráfico.
    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. Se adjunta un script para probar EquationDirect().

Archivos adjuntos:
 

Función GetArrowInterval().

Escribí esta función para mejorar la conveniencia de desarrollar indicadores de señales, es decir, aquellos indicadores que dan claras señales de compra o venta. La señal de dicho indicador suelo hacerla como una flecha hacia abajo por encima del Khai de una barra o como una flecha hacia arriba por debajo del mínimo de la barra correspondiente. El valor de "menos" y "más" solía ser de unos pocos puntos, para que la flecha no "pasara por encima" de la barra. No era un gran problema en el caso de un indicador de un solo marco temporal diseñado para barras de una hora solamente, por ejemplo. Para cada marco temporal tenía diferentes valores "por debajo" y "por encima". Pero para los indicadores multiframe, tuve que usar la función 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);
  }
}

Se trata de una variante antigua que se ha transformado muy rápidamente en una forma más compacta y versátil:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
 

Ejemplos de cómo utilizar GetArrowInterval().

  • Señal de venta en la barra actual.
    SetArrow(242, Red, "", Time[0], High[0]+GetArrowInterval(15)*Point, 2);

  • Señal de compra en la barra anterior (primera).
    SetArrow(233, Blue, "", Time[1], Low[1]-GetArrowInterval()*Point, 1);
    

SZY. Se adjunta un script para probar la función GetArrowInterval().

Archivos adjuntos:
 
Querido Igor. En e-SOTrailing, es necesario modificar las posiciones de toma y parada.
 
khorosh писал (а) >>
En el EA e-SOTrailing es necesario hacer la modificación de la toma y las paradas.

Gracias. Hecho... El EA corregido está en mi página web.

 
KimIV писал (а) >>

La función EquationDirect().

La ecuación de una línea recta. Esta función calcula el valor de la ordenada Y para la abscisa X en la intersección con una línea trazada a través de dos puntos arbitrarios del gráfico. La función toma los siguientes parámetros obligatorios:

  • x1, y1 - Coordenadas del primer punto.
  • x2, y2 - Coordenadas del segundo punto.
  • x - Valor, la abscisa para la que se quiere calcular la ordenada Y.

Escribe la segunda parte de la ecuación de la línea.

Calcular el valor de la ordenada Y para la abscisa de X en el punto de intersección con una recta trazada a través de un punto arbitrario de una gráfica con un ángulo dado. La función toma los siguientes parámetros obligatorios:

  • x1, y1 - Coordenadas del primer punto.
  • a - Ángulo en grados.
  • x - Valor, la abscisa para la que se quiere calcular la ordenada y .

Gracias.

 
El verdadero programador Igor. Un gran respeto y respeto para ti.
 
djday писал (а) >>

Escribe la segunda parte de la ecuación de una recta.

Calcular el valor de la ordenada Y para la abscisa X en el punto de intersección con una recta trazada a través de un punto arbitrario de una gráfica con un ángulo dado. La función toma los siguientes parámetros obligatorios:

  • x1, y1 - Coordenadas del primer punto.
  • a - Ángulo en grados.
  • x - Valor, la abscisa para la que se debe calcular la ordenada Y .

Gracias.

Un ángulo de 45° se produce cuando los catetos son iguales. Cuando la unidad de medida de los catetos es el sistema métrico, no hay ningún problema. Un cateto mide dos metros y el otro también. Así que es un ángulo de 45°. ¿Pero qué pasa cuando un cateto es el número de barras o el tiempo, y el otro cateto es el precio? ¿Cómo se garantiza que sean iguales para que el ángulo sea de 45°? Es una cuestión de escala. Dame un punto de apoyo y moveré el suelo (c).

Razón de la queja: