Características úteis da KimIV - página 36

 

Exemplos de como usar o SetRegression().

  • Canal de regressão de linha vermelha com base nas barras dos últimos 2 dias.
    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 marrom da regressão linear com base nas barras dos últimos 2 dias.
    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. Em anexo está um roteiro para testar a função SetRegression().

Arquivos anexados:
 

A função EquationDirect().

A equação de uma linha reta. Esta função calcula o valor da ordenada Y para a abscissa X na intersecção com uma linha traçada através de dois pontos arbitrários no gráfico. A função toma os seguintes parâmetros obrigatórios:

  • x1, y1 - Coordenadas do primeiro ponto.
  • x2, y2 - Coordenadas do segundo ponto.
  • x - Valor, abcissa para o qual a ordenação Y deve ser calculada.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
 

Exemplos de como usar o EquationDirect().

  • O ponto vermelho está na intersecção da linha traçada através dos mínimos das barras 23 e 11 e da barra zero vertical.
    double y=EquationDirect(23, Low[23], 11, Low[11], 0);
    SetArrow(108, Red, "", 0, y);

  • Uma linha reta a partir dos pontos vermelhos através de dois pontos arbitrários no 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. Em anexo está um roteiro para testar o EquationDirect().

Arquivos anexados:
 

Função GetArrowInterval().

Escrevi esta função para melhorar a conveniência de desenvolver indicadores de sinais, ou seja, aqueles indicadores que dão sinais claros de compra ou venda. O sinal de tal indicador eu normalmente faço como uma seta para baixo acima do Khai de uma barra ou como uma seta para cima abaixo do baixo da barra correspondente. O valor de "abaixo" e "acima" era geralmente alguns pontos, de modo que a seta não "passava por cima" da barra. Não foi um grande problema no caso de um único indicador de tempo projetado para barras de apenas uma hora, por exemplo. Para cada período de tempo eu tinha valores diferentes "abaixo" e "acima". Mas para indicadores multiframe, eu tive que usar a função 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);
  }
}

Esta é uma variante antiga que se transformou muito rapidamente em uma forma mais compacta e 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);
}
 

Exemplos de como usar o GetArrowInterval().

  • Vender sinal na barra de corrente.
    SetArrow(242, Red, "", Time[0], High[0]+GetArrowInterval(15)*Point, 2);

  • Comprar sinal no (primeiro) bar anterior.
    SetArrow(233, Blue, "", Time[1], Low[1]-GetArrowInterval()*Point, 1);
    

SZY. anexado um script para testar a função GetArrowInterval().

Arquivos anexados:
 
Prezado Igor. No e-SOTrailing, você precisa modificar as posições de tomada e parada.
 
khorosh писал (а) >>
No e-SOTrailing EA você precisa fazer modificações de tomadas e paradas.

Obrigado! Feito... A EA corrigida está em meu site.

 
KimIV писал (а) >>

A função EquationDirect().

A equação de uma linha reta. Esta função calcula o valor da ordenada Y para a abscissa X na intersecção com uma linha traçada através de dois pontos arbitrários no gráfico. A função toma os seguintes parâmetros obrigatórios:

  • x1, y1 - Coordenadas do primeiro ponto.
  • x2, y2 - Coordenadas do segundo ponto.
  • x - Valor, a abcissa para a qual você deseja calcular a ordenação Y.

Por favor, escreva a segunda parte da equação da linha.

Calcular o valor da ordenada Y para a abscissa de X no ponto de intersecção com uma linha traçada através de um ponto arbitrário em um gráfico com um determinado ângulo. A função toma os seguintes parâmetros obrigatórios:

  • x1, y1 - Coordenadas do primeiro ponto.
  • a - Ângulo em graus.
  • x - Valor, a abcissa para a qual você deseja calcular a ordenação y .

Obrigado.

 
O verdadeiro programador Igor. Grande respeito e respeito a você.
 
djday писал (а) >>

Favor escrever a segunda parte da equação de uma linha reta.

Calcular o valor da ordenada Y para a abscissa X no ponto de intersecção com uma linha traçada através de um ponto arbitrário em um gráfico com um determinado ângulo. A função toma os seguintes parâmetros obrigatórios:

  • x1, y1 - Coordenadas do primeiro ponto.
  • a - Ângulo em graus.
  • x - Valor, a abcissa para a qual a ordenação Y deve ser calculada.

Obrigado.

Um ângulo de 45° ocorre quando os catafuses são iguais. Quando a unidade de medida dos catéteres é métrica, não há problema. Um cateto tem dois metros e o outro também tem dois metros. Portanto, isso é um ângulo de 45°. Mas e quando um cateto é o número de barras ou tempo, e o outro cateto é o preço? Como você garante que eles sejam iguais para que o ângulo seja de 45°? É uma questão de escalonamento. Dê-me um fulcro e eu moverei o chão (c).