Полезные функции от KimIV - страница 36

 

Примеры использования функции SetRegression().

  • Красный канал линейной регрессии на основе баров 2-х последних суток.
    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);

  • Коричневый канал линейной регрессии на основе баров 2-х предыдущих суток.
    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. Во вложении скрипт для тестирования функции SetRegression().

Файлы:
 

Функция EquationDirect().

Уравнение прямой. Эта функция вычисляет значение ординаты Y для абсциссы X в точке пересечения с прямой, проведённой через две произвольные точки на графике. Функция принимает следующие обязательные параметры:

  • x1, y1 - Координаты первой точки.
  • x2, y2 - Координаты второй точки.
  • x - Значение, абсцисса для которой нужно вычислить ординату 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);
}
 

Примеры использования функции EquationDirect().

  • Красная точка на пересечении прямой, проведённой через минимумы 23-го и 11-го баров, и вертикалью нулевого бара.
    double y=EquationDirect(23, Low[23], 11, Low[11], 0);
    SetArrow(108, Red, "", 0, y);

  • Прямая из красных точек через две произвольные точки на графике.
    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);
      }
    }

ЗЫ. Во вложении скрипт для тестиирования функции EquationDirect().

Файлы:
 

Функция GetArrowInterval().

Эту функцию я написал для повышения удобства разработки сигнальных индикаторов, то есть тех индикаторов, которые дают на выходе чёткий сигнал купить или продать. Сигнал такого индикатора я обычно делаю в виде стрелки вниз над хаем соответствующего бара или в виде стрелки вверх под лоу соответствующего бара. В качестве величины "под" и "над" обычно бралось несколько пунктов, чтобы стрелка не "наезжала" на бар. Проблем особых не было в случае однотаймфреймового индикатора, предназначенного, например, только для часовок. Для каждого таймфрейма у меня были свои значения "под" и "над". А вот для мультифреймовых индикаторов приходилось пользоваться услугами функции 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);
}
 

Примеры использования функции GetArrowInterval().

  • Сигнал на продажу на текущем баре.
    SetArrow(242, Red, "", Time[0], High[0]+GetArrowInterval(15)*Point, 2);

  • Сигнал на покупку на предыдущем (первом) баре.
    SetArrow(233, Blue, "", Time[1], Low[1]-GetArrowInterval()*Point, 1);
    

ЗЫ. Во вложении скрипт для тестирования функции GetArrowInterval().

Файлы:
 
Уважаемый Игорь. В советнике e-SOTrailing нужно сделать модификацию тейков и стопов.
 
khorosh писал (а) >>
В советнике e-SOTrailing нужно сделать модификацию тейков и стопов.

Благодарю! Сделал... Исправленный советник лежит у меня на сайте.

 
KimIV писал (а) >>

Функция EquationDirect().

Уравнение прямой. Эта функция вычисляет значение ординаты Y для абсциссы X в точке пересечения с прямой, проведённой через две произвольные точки на графике. Функция принимает следующие обязательные параметры:

  • x1, y1 - Координаты первой точки.
  • x2, y2 - Координаты второй точки.
  • x - Значение, абсцисса для которой нужно вычислить ординату Y.

Прошу Вас написать вторую часть уравнения прямой.

Вычисление значения ординаты Y для абсциссы X в точке пересечения с прямой, проведённой через одну произвольную точку на графике с заданным углом. Функция принимает следующие обязательные параметры:

  • x1, y1 - Координаты первой точки.
  • a - Угол в градусах.
  • x - Значение, абсцисса для которой нужно вычислить ординату Y.

Спасибо.

 
Реальный программер Игорь. Большой тебе респект и уважуха.
 
djday писал (а) >>

Прошу Вас написать вторую часть уравнения прямой.

Вычисление значения ординаты Y для абсциссы X в точке пересечения с прямой, проведённой через одну произвольную точку на графике с заданным углом. Функция принимает следующие обязательные параметры:

  • x1, y1 - Координаты первой точки.
  • a - Угол в градусах.
  • x - Значение, абсцисса для которой нужно вычислить ординату Y.

Спасибо.

Угол 45° возникает при равенстве катетов. Когда единица измерения катетов - метрическая, то нет проблем. Один катет два метра и второй тоже два метра. Вот тебе и угол 45°. А как быть, когда один катет - количество баров или время, а другой катет - цена? Как обеспечить их равенство, чтобы угол был 45°? Это вопрос масштабирования. Дайте мне точку опоры, и я передвину землю (с).

Причина обращения: