Apenas "Recursos úteis do KimIV". - página 6

 

A função ArrayMin().

Esta função retorna o valor do elemento mínimo da matriz.

  • x - Um conjunto de elementos do tipo duplo, no qual o valor mínimo do elemento é procurado.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 17.05.2008                                                     |
//|  Описание : Возвращает значение минимального элемента массива.             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив значений числового ряда                                      |
//+----------------------------------------------------------------------------+
double ArrayMin(double& x[]) {
  if (ArraySize(x)>0) return(x[ArrayMinimum(x)]);
  else {
    Print("ArrayMin(): Массив пуст!");
    return(0);
  }
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает номер бара экстремума ЗигЗага по его номеру.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    ne - номер экстремума           (      0     - последний)               |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
int GetExtremumZZBar(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bc=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=0; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bc, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(i);
    }
  }
  Print("GetExtremumZZBar(): Экстремум ЗигЗага номер ",ne," не найден");
  return(-1);
}
 

A função ArrayAvg().

Esta função retorna a aritmética média dos elementos da matriz.

  • x - Um conjunto de elementos do tipo duplo.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает среднее аримфетическое элементов массива.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив значений числового ряда                                      |
//+----------------------------------------------------------------------------+
double ArrayAvg(double& x[]) {
  double s=0;
  int    i, k=ArraySize(x);

  for (i=0; i<k; i++) s+=x[i];
  if (k>0) s/=k; else Print("ArrayAvg(): Массив пуст!");

  return(s);
}

A função ArrayAvGeom().

Esta função retorna a média geométrica dos itens da matriz.

  • x - Um conjunto de elementos do tipo duplo.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.06.2008                                                     |
//|  Описание : Возвращает среднее геометрическое элементов массива.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив значений числового ряда                                      |
//+----------------------------------------------------------------------------+
double ArrayAvGeom(double& x[]) {
  double s=1, k=ArraySize(x);
  int    i;

  for (i=0; i<k; i++) s*=x[i];
  if (k>0) s=MathPow(s, 1/k); else Print("ArrayAvGeom(): Массив пуст!");

  return(s);
}
 

A função SetHLine().

Esta função define o objeto de linha horizontal OBJ_HLINE no gráfico atual.

  • cl - Cor do objeto da linha horizontal OBJ_HLINE. Parâmetro necessário.
  • nm - nome do objeto. Se o valor padrão "" for passado, o tempo aberto da barra atual é usado como o nome do objeto.
  • p1 - nível de preço do objeto. Valor padrão - 0 - preço atual da Licitação.
  • st - Estilo de linha. Os valores admissíveis são STYLE_SOLID (por padrão) - linha sólida, STYLE_DASHDOT - linha tracejada, STYLE_DOT - linha tracejada, STYLE_DASHDOT - linha tracejada, STYLE_DASHDOT - linha tracejada com pontos duplos.
  • wd - Espessura da linha. O valor padrão é 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.03.2008                                                     |
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}

A função SetVLine().

Esta função define a linha vertical do objeto OBJ_VLINE no gráfico atual.

  • cl - Cor do objeto da LINHA VERTICAL. Parâmetro obrigatório.
  • nm - nome do objeto. Quando o valor padrão é passado - "", o tempo aberto da barra atual é usado como o nome do objeto.
  • t1 - Tempo de ajuste do objeto. Valor padrão - 0 - tempo de abertura da barra atual.
  • st - Estilo de linha. Os valores válidos são STYLE_SOLID (padrão), STYLE_DASH, STYLE_DOT, STYLE_DASHDOT.
  • wd - Largura da linha. O valor padrão é 1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.07.2008                                                     |
//|  Описание : Установка объекта OBJ_VLINE вертикальная линия                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    t1 - время                      (0  - время открытия текущего бара)     |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (1  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetVLine(color cl, string nm="", datetime t1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[0];
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_VLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1, t1);
  ObjectSet(nm, OBJPROP_COLOR, cl);
  ObjectSet(nm, OBJPROP_STYLE, st);
  ObjectSet(nm, OBJPROP_WIDTH, wd);
}
 

A função SetTLine().

Esta função define o objeto da linha de tendência OBJ_TREND na tabela atual.

  • cl - Cor do objeto TREND LINE. É um parâmetro obrigatório.
  • nm - Nome do objeto. Quando o valor padrão é passado - "", o tempo aberto da barra atual é usado como o nome.
  • t1 - Primeira coordenada do tempo de ajuste do objeto. Valor padrão - 0 - tempo de abertura da décima barra.
  • p1 - Primeira coordenada do objeto que fixa o preço. Valor padrão - 0 - mínimo da décima barra.
  • t2 - Segunda coordenada do tempo de ajuste do objeto. Valor padrão - 0 - tempo de abertura da barra atual.
  • p2 - Segunda coordenada do objeto que fixa o preço. Valor padrão - 0 - barra de corrente baixa.
  • ry - Bandeira da propriedade AZUL. O valor padrão é Falso.
  • st - Estilo de linha. Os valores válidos são STYLE_SOLID (padrão), STYLE_DASH, STYLE_DOT, STYLE_DASHDOT.
  • wd - Largura da linha. O valor padrão é 1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка объекта OBJ_TREND трендовая линия                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - текущий бар)                   |
//|    p2 - ценовой уровень            (  0   - Bid)                           |
//|    ry - луч                        (False - по умолчанию)                  |
//|    st - стиль линии                (  0   - простая линия)                 |
//|    wd - ширина линии               (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetTLine(color cl, string nm="",
              datetime t1=0, double p1=0, datetime t2=0, double p2=0,
              bool ry=False, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[10];
  if (p1<=0) p1=Low[10];
  if (t2<=0) t2=Time[0];
  if (p2<=0) p2=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_TREND, 0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t1);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_TIME2 , t2);
  ObjectSet(nm, OBJPROP_PRICE2, p2);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_RAY   , ry);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}

Função SetTLineByAngle().

Esta função define o objeto OBJ_TRENDBYANGLE pelo ângulo de inclinação no gráfico atual.

  • cl - Cor do objeto TRENDBYANGLE. Parâmetro necessário.
  • nm - Nome do objeto. Quando o valor padrão é passado - "", o tempo aberto da barra atual é usado como o nome.
  • t1 - Primeira coordenada do tempo de ajuste do objeto. Valor padrão - 0 - tempo de abertura da décima barra.
  • p1 - Primeira coordenada do objeto que fixa o preço. Valor padrão - 0 - mínimo da décima barra.
  • t2 - Segunda coordenada do tempo de ajuste do objeto. Valor padrão - 0 - tempo de abertura da barra atual.
  • p2 - Segunda coordenada do preço de ajuste do objeto. Este parâmetro é uma espécie de interruptor. Seu valor não zero iguala esta função ao SetTLine(), ou seja, uma linha de tendência será desenhada usando o par de coordenadas tempo/preço, enquanto o valor do ângulo de inclinação da linha de tendência será ignorado. Valor padrão - 0 - a linha de tendência será traçada pelo ângulo de inclinação.
  • an - Ângulo de inclinação em graus. Valor padrão - 0 - Linha horizontal.
  • ry - Bandeira da propriedade BOW. O valor padrão é Falso.
  • st - Estilo de linha. Os valores válidos são STYLE_SOLID (padrão), STYLE_DASH, STYLE_DOT, STYLE_DASHDOT.
  • wd - Largura da linha. O valor padrão é 1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка объекта OBJ_TRENDBYANGLE трендовая линия по углу     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - время открытия текущего бара)  |
//|    p2 - ценовой уровень            (  0   - по углу)                       |
//|    an - угол                       (  0   - по умолчанию)                  |
//|    ry - луч                        (False - не луч)                        |
//|    st - стиль линии                (  0   - простая линия)                 |
//|    wd - ширина линии               (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetTLineByAngle(color cl, string nm="",
              datetime t1=0, double p1=0, datetime t2=0, double p2=0,
              double an=0, bool ry=False, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[10];
  if (p1<=0) p1=Low[10];
  if (t2<=0) t2=Time[0];
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_TRENDBYANGLE, 0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t1);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_TIME2 , t2);
  if (p2>0) ObjectSet(nm, OBJPROP_PRICE2, p2);
  else ObjectSet(nm, OBJPROP_ANGLE, an);
  ObjectSet(nm, OBJPROP_COLOR, cl);
  ObjectSet(nm, OBJPROP_RAY  , ry);
  ObjectSet(nm, OBJPROP_STYLE, st);
  ObjectSet(nm, OBJPROP_WIDTH, wd);
}
 

A função SetArrow().

Esta função define o ícone do objeto OBJ_ARROW para a tabela atual.

  • cd - código do ícone. Parâmetro necessário.
  • cl - Cor do ícone. Parâmetro necessário.
  • nm - Nome do objeto. Se o valor padrão for transferido - "", o tempo aberto da barra atual é usado como um nome.
  • t1 - Primeira coordenada do tempo de ajuste do objeto. Valor padrão - 0 - tempo de abertura da barra atual.
  • p1 - Primeira coordenada do objeto que fixa o preço. Valor padrão - 0 - preço atual da Licitação.
  • sz - Tamanho do ícone. Valor padrão - 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка значка на графике, объекта OBJ_ARROW.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cd - код значка                                                         |
//|    cl - цвет значка                                                        |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    t1 - время открытия бара        (0  - текущий бар)                      |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    sz - размер значка              (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetArrow(int cd, color cl,
              string nm="", datetime t1=0, double p1=0, int sz=0) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[0];
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_ARROW, 0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1    , t1);
  ObjectSet(nm, OBJPROP_PRICE1   , p1);
  ObjectSet(nm, OBJPROP_ARROWCODE, cd);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_WIDTH    , sz);
}

Função SetLabel().

Esta função define o objeto da etiqueta de texto OBJ_LABEL no gráfico atual.

  • nm - nome do objeto. Parâmetro necessário.
  • tx - Texto. Parâmetro necessário.
  • cl - Cor do marcador. Parâmetro necessário.
  • xd - X coordenada em pixels em relação ao ângulo de referência. Parâmetro necessário.
  • yd - Coordenadas em Y em pixels em relação ao ângulo de referência. Parâmetro obrigatório.
  • cr - Número do ângulo de referência. Valores válidos: 0 superior esquerda, 1 superior direita, 2 inferior esquerda, 3 inferior direita. O valor padrão é 0.
  • fs - Tamanho da fonte. O valor padrão é 9.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка текстовой метки, объект OBJ_LABEL.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    nm - наименование объекта                                               |
//|    tx - текст                                                              |
//|    cl - цвет метки                                                         |
//|    xd - координата X в пикселах                                            |
//|    yd - координата Y в пикселах                                            |
//|    cr - номер угла привязки        (0 - левый верхний,                     |
//|                                     1 - правый верхний,                    |
//|                                     2 - левый нижний,                      |
//|                                     3 - правый нижний )                    |
//|    fs - размер шрифта              (9 - по умолчанию  )                    |
//+----------------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
 

A função CrossPointOfLines().

Esta função calcula as coordenadas do ponto de intersecção de duas linhas. Cada linha é definida por um par de suas coordenadas de ponto. Três arrays são passados para a função como parâmetros:

  • x - matriz Abscissa. Deve conter quatro elementos: x[0], x[1] - as abcissas da primeira linha, x[2], x[3] - as abcissas da segunda linha.
  • y - Matriz de ordenados. Deve conter quatro elementos: y[0], y[1] - as ordenanças da primeira linha, y[0], y[1] - as ordenanças da segunda linha.
  • t - Conjunto de coordenadas do ponto de intersecção das duas linhas. Após a execução normal da função, esta matriz conterá dois elementos: t[0] é a abcissa do ponto de intersecção das duas linhas e t[1] é a ordenada do mesmo ponto.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Вычисляет координаты точки пересечения двух прямых.            |
//|             Каждая прямая задаётся парой координат своих точек.            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив абсцисс              x[0], x[1] - первая прямая              |
//|                                    x[2], x[3] - вторая прямая              |
//|    y - массив ординат              y[0], y[1] - первая прямая              |
//|                                    y[0], y[1] - вторая прямая              |
//|    t - массив искомых координат    t[0]       - абсцисса                   |
//|                                    t[1]       - ордината                   |
//+----------------------------------------------------------------------------+
void CrossPointOfLines(double& x[], double& y[], double& t[]) {
  double z=(y[3]-y[2])*(x[1]-x[0])-(y[1]-y[0])*(x[3]-x[2]);
  ArrayResize(t, 2);
  ArrayInitialize(t, 0.0);

  if (z==0) Print("CrossPointOfLines(): Не удалось найти точку пересечения!");
  else {
    double xy1=x[1]*y[0]-x[0]*y[1];
    double xy2=x[3]*y[2]-x[2]*y[3];
    t[0]=NormalizeDouble((xy1*(x[3]-x[2])-xy2*(x[1]-x[0]))/z, 0);
    t[1]=(xy1*(y[3]-y[2])-xy2*(y[1]-y[0]))/z;
  }
}

Conjunto de funçõesRegressão().

Esta função define o objeto OBJ_REGRESSION do canal de regressão linear no gráfico atual.

  • cl - Cor do objeto. É um parâmetro obrigatório.
  • nm - Nome do objeto. Quando o valor padrão é passado - "", o tempo de abertura da barra atual é usado como o nome.
  • t1 - Primeira coordenada do tempo de ajuste do objeto. Valor padrão - 0 - tempo de abertura da décima barra.
  • t2 - Segunda coordenada do tempo de ajuste do objeto. O valor padrão é 0 - o tempo aberto da barra atual.
  • ry - Bandeira da propriedade BOW. O valor padrão é Falso.
  • st - Estilo de linha. Os valores válidos são STYLE_SOLID (padrão), STYLE_DASH, STYLE_DOT, STYLE_DASHDOT.
  • wd - Largura da linha. O valor padrão é 1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка объекта OBJ_REGRESSION канал линейной регрессии.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ( ""   - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10])                      |
//|    t2 - время открытия бара        (  0   - Time[0])                       |
//|    ry - луч                        (False - по умолчанию)                  |
//|    st - стиль линии                (  0   - простая линия)                 |
//|    wd - ширина линии               (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetRegression(color cl, string nm="", datetime t1=0, datetime t2=0,
                    bool ry=False, int st=STYLE_SOLID, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[10];
  if (t2<=0) t2=Time[0];
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_REGRESSION, 0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1, t1);
  ObjectSet(nm, OBJPROP_TIME2, t2);
  ObjectSet(nm, OBJPROP_COLOR, cl);
  ObjectSet(nm, OBJPROP_RAY  , ry);
  ObjectSet(nm, OBJPROP_STYLE, st);
  ObjectSet(nm, OBJPROP_WIDTH, wd);
}
 

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

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". Entretanto, para os indicadores multiframe 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);
  }
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
 

Função FindNearFractal().

Esta função procura o fractal mais próximo e retorna seu nível de preço. A função aceita os seguintes parâmetros opcionais:

  • sy - Nome do instrumento. "" ou NULL - símbolo atual. O valor padrão é NULL.
  • tf - Cronograma. Valor padrão 0 - símbolo atual.
  • modo - Tipo fractal. MODE_LOWER e MODE_UPPER são permitidos. O valor padrão é MODE_LOWER.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Поиск ближайшего фрактала. Возвращает ценовой уровень.         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy   - наименование инструмента      ("" или NULL - текущий символ)     |
//|    tf   - таймфрейм                     (    0       - текущий ТФ)         |
//|    mode - тип фрактала                  (MODE_LOWER|MODE_UPPER)            |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int    d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}

Função GetExtremumZZBar().

Esta função procura um extremo do indicador ZigZag padrão personalizado e retorna o número de barras. A função aceita os seguintes parâmetros opcionais:

  • sy - Nome do instrumento. "" ou NULL - o símbolo atual. O valor padrão é NULL.
  • tf - Cronograma. O valor padrão é 0 - o período de tempo atual.
  • ne - Número extremo. 0 - último, 1 - anterior, 2 - anterior, etc.
  • dp, dv, bs - Parâmetros ZigZaga: ExtDepth, ExtDeviation, ExtBackstep respectivamente.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает номер бара экстремума ЗигЗага по его номеру.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    ne - номер экстремума           (      0     - последний)               |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
int GetExtremumZZBar(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bc=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=0; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bc, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(i);
    }
  }
  Print("GetExtremumZZBar(): Экстремум ЗигЗага номер ",ne," не найден");
  return(-1);
}
 

Função GetExtremumZZZPrice().

Esta função procura um extremo do indicador ZigZag padrão personalizado e retorna seu nível de preço. A função aceita os seguintes parâmetros opcionais:

  • sy - Nome do instrumento. "" ou NULL - símbolo atual. O valor padrão é NULL.
  • tf - Cronograma. Valor padrão 0 - símbolo atual.
  • ne - Número extremo. 0 - último, 1 - anterior, 2 - anterior, etc.
  • dp, dv, bs - Parâmetros ZigZaga: ExtDepth, ExtDeviation, ExtBackstep.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает экстремум ЗигЗага по его номеру.                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    ne - номер экстремума           (      0     - последний)               |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.08.2008                                                     |
//|  Описание : Возвращает номер бара фрактала по его номеру.                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер фрактала                  (    0       - последний)          |
//+----------------------------------------------------------------------------+
int GetFractalBar(string sy="0", int tf=0, int nf=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int    i, k=iBars(sy, tf), kf;

  for (i=2; i<k; i++) {
    f=iFractals(sy, tf, MODE_LOWER, i);
    if (f!=0) {
      kf++;
      if (kf>nf) return(i);
    }
    f=iFractals(sy, tf, MODE_UPPER, i);
    if (f!=0) {
      kf++;
      if (kf>nf) return(i);
    }
  }
  Print("GetFractalBar(): Фрактал не найден");
  return(-1);
}
 

Função GetNearestDownFractal().

Esta função procura o fractal inferior mais próximo e retorna seu nível de preço. A peculiaridade desta função é a possibilidade de estabelecer uma fórmula arbitrária para o fractal. A fórmula fractal padrão, geralmente aceita, é 2-2. Isso significa 2 barras à esquerda e 2 barras à direita. Com esta função, você pode realizar até mesmo fractais muito exóticos, tais como 8-2 (8 barras à esquerda e 2 barras à direita) ou 5-3 (5 barras à esquerda e 3 barras à direita) e assim por diante. A função aceita os seguintes parâmetros opcionais:

  • sy - Nome do instrumento. "" ou NULL - símbolo atual. O valor padrão é NULL.
  • tf - Cronograma. Valor padrão 0 - símbolo atual.
  • nl - Número de barras à esquerda. O valor padrão é 2.
  • - Número de barras à direita. Valor padrão - 2.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает ценовой уровень ближайшего нижнего фрактала         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    nl - количество баров слева                                             |
//|    nr - количество баров справа                                            |
//+----------------------------------------------------------------------------+
double GetNearestDownFractal(string sy="0", int tf=0, int nl=2, int nr=2) {
  bool f;
  int  fb, i, nb=-1;

  if (sy=="" || sy=="0") sy=Symbol();
  if (nl<1) nl=1;
  if (nr<1) nr=1;

  fb=nr;
  while (nb<0) {
    fb++;
    f=True;
    for (i=fb; i>fb-nr; i--) {
      if (iLow(sy, tf, i)>iLow(sy, tf, i-1)) { f=False; break; }
    }
    if (f) {
      for (i=fb; i<fb+nl; i++) {
        if (iLow(sy, tf, i)>iLow(sy, tf, i+1)) { f=False; break; }
      }
      if (f) { nb=fb; break; }
    }
  }

  return(iLow(sy, tf, nb));
}

Função GetNearestUpFractal().

Esta função procura o fractal ascendente mais próximo e retorna seu nível de preço. A peculiaridade desta função é a possibilidade de estabelecer uma fórmula arbitrária para o fractal. A fórmula fractal padrão, geralmente aceita, é 2-2. Isso significa 2 barras à esquerda e 2 barras à direita. Com esta função, você pode realizar até mesmo fractais muito exóticos, tais como 8-2 (8 barras à esquerda e 2 barras à direita) ou 5-3 (5 barras à esquerda e 3 barras à direita) e assim por diante. A função aceita os seguintes parâmetros opcionais:

  • sy - Nome do instrumento. "" ou NULL - símbolo atual. O valor padrão é NULL.
  • tf - Cronograma. Valor padrão 0 - símbolo atual.
  • nl - Número de barras à esquerda. O valor padrão é 2.
  • - Número de barras à direita. Valor padrão - 2.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает ближайший верхний фрактал                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL - текущий символ)                 |
//|    tf - таймфрейм                  ( 0 - текущий таймфрейм)                |
//|    nl - количество баров слева                                             |
//|    nr - количество баров справа                                            |
//+----------------------------------------------------------------------------+
double GetNearestUpFractal(string sy="0", int tf=0, int nl=2, int nr=2) {
  bool f;
  int  fb, i, nb=-1;

  if (sy=="" || sy=="0") sy=Symbol();
  if (nl<1) nl=1;
  if (nr<1) nr=1;

  fb=nr;
  while (nb<0) {
    fb++;
    f=True;
    for (i=fb; i>fb-nr; i--) {
      if (iHigh(sy, tf, i)<iHigh(sy, tf, i-1)) { f=False; break; }
    }
    if (f) {
      for (i=fb; i<fb+nl; i++) {
        if (iHigh(sy, tf, i)<iHigh(sy, tf, i+1)) { f=False; break; }
      }
      if (f) { nb=fb; break; }
    }
  }

  return(iHigh(sy, tf, nb));
}