Скачать MetaTrader 5

Помогите с каналом регрессии

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нет времени изучать MQL5? Библиотека исходников для вас!
Mihail Gorjunov
509
Mihail Gorjunov 2016.10.12 11:36 
Уважаемые поделитесь кодом канала линейной регрессии, тем что в мт4 встроен. Я как понял у него размах по High/Low.
Ihor Herasko
9020
Ihor Herasko 2016.10.12 13:24  
Mihail Gorjunov:
Уважаемые поделитесь кодом канала линейной регрессии, тем что в мт4 встроен. Я как понял у него размах по High/Low.

Только он не будет совпадать по границам со встроенным инструментом. Во встроенном инструменте либо ошибка, либо неизвестный алгоритм построения границ.

//+-------------------------------------------------------------------------------------+
//| Отображение графического объекта - трендовой линии                                  |
//+-------------------------------------------------------------------------------------+
void ShowTrendLine(string name, datetime time1, double price1, datetime time2, double price2, color clr, ENUM_LINE_STYLE style, bool ray)
{
   if (Point == 0)
      return;
      
   //string name = PREFIX + SIGN_LINE + time1 + DoubleToStr(price1 / Point, 0);

   if (ObjectFind(name) < 0)                       // Если объект не существует
   {
      ObjectCreate(name, OBJ_TREND,                // Создадим его
                   0, time1, price1, time2, price2); 
      ObjectSet(name, OBJPROP_COLOR, clr);         
      ObjectSet(name, OBJPROP_RAY, ray);         
      ObjectSet(name, OBJPROP_STYLE, style);       
      return;
   }
   
   ObjectMove(name, 0, time1, price1);              // Перемещение существующего объекта
   ObjectMove(name, 1, time2, price2);              // Перемещение существующего объекта
   ObjectSet(name, OBJPROP_RAY, ray);         
}
//+-------------------------------------------------------------------------------------+
//| Расчет значения отклонения границ канала линейной регрессии                         |
//+-------------------------------------------------------------------------------------+
double GetLinearRegressionValues(int rightBar, int leftBar, double &leftValue, double &kKoef, double &bKoef)
{
// - 1 - == Инициализация переменных ====================================================
   int n = leftBar - rightBar + 1;                 // Количество баров для расчета
   if (n <= 0)                                     // Если количество баров не является..
      return(0);                                   // ..натуральным числом, то это ошибка
   double sumy = 0,                                // Сумма значений функции
          sumx = 0.0,                              // Сумма аргументов функции
          sumxy = 0.0,                             // Сумма произведения аргументов и..
                                                   // ..значений
          sumx2 = 0.0;                             // Сумма квадратов аргументов функции
// - 1 - == Окончание блока =============================================================

// - 2 - == Нахождение необходимых сумм =================================================
   for (int i = rightBar; i <= leftBar; i++)       // Справа налево по графику
   {
      sumy += Close[i];                            
      sumxy += Close[i]*i;                         
                                                   
      sumx += i;                                   
      sumx2 += i*i;                                
   }  
// - 2 - == Окончание блока =============================================================
 
// - 3 - == Вычисление коэффициентов К и В ==============================================
   double denominator = sumx2*n - sumx*sumx;       // Знаменатель для нахождения коэф. К
   if (denominator == 0.0)                         
      return(0);                                   
   kKoef = (sumxy * n - sumx * sumy) / denominator;// Нахождение значения коэффициента K
   bKoef = (1.0 / n) * (sumy - kKoef * sumx);      // Коэффициент B
// - 3 - == Окончание блока =============================================================

// - 4 - == Расчет значений линии на крайних барах ======================================
   leftValue = kKoef*leftBar + bKoef;              // Значение линии на левом баре
   return(kKoef*rightBar + bKoef);                 // Значение линии на правом баре
// - 4 - == Окончание блока =============================================================
}
//+-------------------------------------------------------------------------------------+
//| Определение максимального отклонения от прямой регрессии на указанном участке       |
//+-------------------------------------------------------------------------------------+
double GetMaxLRDeviation(int leftBarIndex, int rightBarIndex, double kKoef, double bKoef)
{
   double max = 0.0;
   for (int i = leftBarIndex; i >= rightBarIndex; i--)
   {
      double lineValue = kKoef * i + bKoef;
      double deviation = MathAbs(Close[i] - lineValue);
      max = MathMax(max, deviation);
   }
   
   return max;
}
//+-------------------------------------------------------------------------------------+
//| Отображение графического объекта - канала линейной регрессии                        |
//+-------------------------------------------------------------------------------------+
void ShowRegressionChannel(int leftBarIndex, int rightBarIndex, color clr, int raySign)
{
   // Определение цен крайних точек прямой регрессии
   double leftLRPrice, kKoef, bKoef;
   double rightLRPrice = GetLinearRegressionValues(rightBarIndex, leftBarIndex, leftLRPrice, kKoef, bKoef);
   if (rightLRPrice <= 0)
      return;
    
   // Определение максимального отклонения от прямой регрессии
   double maxDev = GetMaxLRDeviation(leftBarIndex, rightBarIndex, kKoef, bKoef);

   // Центральная линия канала 
   datetime time1 =  Time[leftBarIndex];
   datetime time2 =  Time[rightBarIndex];
   ShowTrendLine(PREFIX + SIGN_CHANNEL_AV + time1, time1, leftLRPrice, time2, rightLRPrice,
                 clr, STYLE_SOLID, raySign);
                 
   // Верхняя линии канала
   double bKoefUp = bKoef + maxDev;
   ShowTrendLine(PREFIX + SIGN_CHANNEL_UP + time1, time1, kKoef * leftBarIndex + bKoefUp, 
                 time2, kKoef * rightBarIndex + bKoefUp, clr, STYLE_SOLID, raySign);
                 
                 
   // Нижняя линия канала        
   double bKoefDn = bKoef - maxDev;
   ShowTrendLine(PREFIX + SIGN_CHANNEL_DN + time1, time1, kKoef * leftBarIndex + bKoefDn, 
                 time2, kKoef * rightBarIndex + bKoefDn, clr, STYLE_SOLID, raySign);
}
Канал Линейной Регрессии - Каналы - Линейные инструменты - Технический Анализ
Канал Линейной Регрессии - Каналы - Линейные инструменты - Технический Анализ
  • www.metatrader5.com
Канал Линейной Регрессии - Каналы - Линейные инструменты - Технический Анализ
Mihail Gorjunov
509
Mihail Gorjunov 2016.10.12 17:05  
спасибо будем разбирается.
-Aleks-
6934
-Aleks- 2016.10.14 13:28  

В код базе есть, который совпадает с каналом, но надо искать.

По точкам сам не понял, как он строит канал - т.е. с какой точки начинает - кажется с клозета... 

Приложил - не знаю как искать в базе. 

Файлы:
Yuriy Asaulenko
3306
Yuriy Asaulenko 2016.10.14 13:55  

Самый простой индикатор лин. регрессии - линии (полосы) Боллинджера. Лучше вместо МАшки использовать в нем что-то поинтересней. Скажем, можно WMA - просто проще, чем писать самому фильтр. Ну, и изменить настройки периода полос и их сглаживания.

Эффективность такой регрессии выше, чем ах+b. 

-Aleks-
6934
-Aleks- 2016.10.14 14:02  
Yuriy Asaulenko:

Самый простой индикатор лин. регрессии - линии (полосы) Боллинджера. Лучше вместо МАшки использовать в нем что-то поинтересней. Скажем, можно WMA - просто проще, чем писать самому фильтр. Ну, и изменить настройки периода полос и их сглаживания.

Эффективность такой регрессии выше, чем ах+b. 

Полосы Боллинджера оказались одним из худших конвертов.... впрочем, может я их не умею готовить...
Yuriy Asaulenko
3306
Yuriy Asaulenko 2016.10.14 14:10  
-Aleks-:
Полосы Боллинджера оказались одним из худших конвертов.... впрочем, может я их не умею готовить...
Наверное не умеете. ) В принципе, полосы Боллинджеры приближение той-же полиномиальной (линейной) регрессии. Я не рассматриваю стандартные стратегии на их основе, но если нужна регрессия, то их (п.Бол-ра) модификация дает неплохое приближение.
Mihail Gorjunov
509
Mihail Gorjunov 2016.10.15 06:02  
Yuriy Asaulenko:
Наверное не умеете. ) В принципе, полосы Боллинджеры приближение той-же полиномиальной (линейной) регрессии. Я не рассматриваю стандартные стратегии на их основе, но если нужна регрессия, то их (п.Бол-ра) модификация дает неплохое приближение.
хорошая мысль. надо попробовать болинджера. интересно что получится. писал я тут в сапорт код не дают заразы.
-Aleks-
6934
-Aleks- 2016.10.15 09:52  
Mihail Gorjunov:
хорошая мысль. надо попробовать болинджера. интересно что получится. писал я тут в сапорт код не дают заразы.
Я же дал индикатор, он совпадает с каналом терминала.
Ihor Herasko
9020
Ihor Herasko 2016.10.15 09:55  
Mihail Gorjunov:
надо попробовать болинджера. интересно что получится. писал я тут в сапорт код не дают заразы.
Зачем его давать, если он давно уже в свободном доступе?
Roman Kutemov
1786
Roman Kutemov 2016.10.15 14:28  
Юрий, а можете сделать индикатор лент боллинджера с изменениями, которые вы выше предложили ?
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий