Индикатор Regression

В данной статье будет подробно рассмотрена работа индикатора Regression с точки зрения программирования на языке LCRYP.

Индикатор Regression

Глобальные переменные

В первых строках объявлены глобальные переменные (degree,kstd,bars,LimitBars), в этих переменных будут храниться входные параметры, которые может задавать пользователь. Ими можно будет пользоваться во всех функциях программы. Но нужно помнить, что в каждой функции их нужно инициировать.

int degree;
double kstd;
int bars;
int LimitBars;

Рассмотрим функцию OnInit

Первые строки используют команду s_buff для настройки буферов для отображения графиков. С ее помощью создаются буфера для вывода информации с номерами 0, 1, 2. Все они имеют тип отображения буфера  линия - для вывода информации Regression. Цвета видимых линий - Olive для границ канала, и Green - для средней линии.. Следующие строки используют команду s_par, которая устанавливает набор входных данных для пользователя. Входные данные индексируются от 0 до 3 (используется 4 входных параметра). Также команда s_par задает тип для каждого поля, название, которое будет отображаться, и значение по умолчанию. На этом работа данной части программы завершена. 

int OnInit()
{ 
  s_buff(0,1,1,0,"Olive","Olive","Olive"); 
  s_buff(1,1,1,0,"Green","Green","Green"); 
  s_buff(2,1,1,0,"Olive","Olive","Olive"); 
  s_par(0,"int","degree",3); 
  s_par(1,"int","kstd",2.0); 
  s_par(2,"int","bars",250); 
  s_par(3,"int","LimitBars",1000); 
}

Рассмотрим функцию OnBar

В начале функции нужно узнать входные параметры с помощью команды g_par и сохранить их в соответствующие глобальные переменные согласно индексов, описанных в функции OnInit.

   degree=g_par(0);
   kstd=g_par(1);
   bars=g_par(2);
   LimitBars=g_par(3);
   if(degree<1){degree=1;}
   if(degree>9){degree=9;}
   if(kstd<0.1){kstd=0.1;}
   if(kstd>10){kstd=10;}
   if(bars<10){bars=10;}
   if(bars>1000){bars=1000;}
   ShowName();

После чего используется пользовательская функция ShowName, которая выводит название индикатора с параметрами на окно чарта, используя команды prt и prt_a.

int ShowName()
  {
   prt(0,"Regression [");
   prt_a(0,degree);prt_a(0,", ");
   prt_a(0,kstd);prt_a(0,", ");
   prt_a(0,bars);prt_a(0,"]");
  }

Дальше несколько дополнительных условий:

if(ReCount>LimitBars){ReCount=LimitBars;}

Условие устанавливает ограничение количества входных баров для пересчета, то есть перерасчет будет не более, чем LimitBars баров, заданных пользователем. Встроенная переменная ReCount несет информацию о количестве баров, которое необходимо пересчитать.

if(ReCount<1){return -1;}

Условие завершает работу функции, если нет новых баров для пересчета.

Следующими объявлены локальные переменные p_regr, sq, sql, sqh - в которых хранятся рассчитанные промежуточные значения. Основная часть функции - цикл, который проходит по всем барам ценового графика.

   for(i=ReCount-1;i>=0;i=i-1)
     {
      p_regr=regr(0,i,degree,kstd,bars);
      sq=g_reg(0);
      sqh=p_regr+sq;
      sql=p_regr-sq;
      s_dbuff(0,i,sqh,0,0,"",0);
      s_dbuff(1,i,p_regr,0,0,"",0);
      s_dbuff(2,i,sql,0,0,"",0);
     }

В цикле последовательно перебираются все бары. Рассчитывается значение по алгоритму Гаусса с помощью regr. Можно было бы эту функцию реализовать самостоятельно, но она очень ресурсоемкая и значительно лучше использовать готовую команду. Значение фиксируется в буфере 0 с помощью команды s_dbuff. Буфер будет отображаться как средняя линия индикатора на ценовом графике. Следующий шаг - узнать границы канала. Для этого используется буфер g_reg в котором после результата вызова команды regr будет храниться значение отклонения канала от средней линии. Для отображения границ останется следующее: для расчета верхней линии канала добавить отклонения к средней линии, а для расчета нижней, наоборот вычитать, для чего используются переменные sqh и sql, и та же команда для передачи значений в соответственные буфера s_dbuff.

Функция OnTick

Функция не используется, но сама функция должна присутствовать в теле программы.

int OnTick()
  {
  }

Как можно использовать эту функцию в контексте данного индикатора? Если функция OnBar учитывает нулевой бар, то отображаемый результат работы на нем будет не корректен, поскольку цена на нулевом баре не сформирована до конца. Тогда можно при пересчете баров или не учитывать нулевой бар, или на каждом тике делать перерасчет, чтобы постоянно корректировать значением индикатора на нулевом баре по мере формирования нулевого бара.

Полный листинг программы Regression:

//+------------------------------------------------------------------+
//|                                                 Regression.lcryp |
//|                                     Copyright 2017, TerminalCoin |
//|                                             www.terminalcoin.com |
//+------------------------------------------------------------------+
int degree;
double kstd;
int bars;
int LimitBars;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   s_buff(0,1,1,0,"Olive","Olive","Olive");
   s_buff(1,1,1,0,"Green","Green","Green");
   s_buff(2,1,1,0,"Olive","Olive","Olive");
   s_par(0,"int","degree",3);
   s_par(1,"int","kstd",2.0);
   s_par(2,"int","bars",250);
   s_par(3,"int","LimitBars",1000);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnBar()
  {
   degree=g_par(0);
   kstd=g_par(1);
   bars=g_par(2);
   LimitBars=g_par(3);
   if(degree<1){degree=1;}
   if(degree>9){degree=9;}
   if(kstd<0.1){kstd=0.1;}
   if(kstd>10){kstd=10;}
   if(bars<10){bars=10;}
   if(bars>1000){bars=1000;}
   ShowName();
   if(ReCount>LimitBars)
     {
      ReCount=LimitBars;
     }
   if(ReCount<1){return -1;}
   double p_regr,sq,sql,sqh;
   int i;
   for(i=ReCount-1;i>=0;i=i-1)
     {
      p_regr=regr(0,i,degree,kstd,bars);
      sq=g_reg(0);
      sqh=p_regr+sq;
      sql=p_regr-sq;
      s_dbuff(0,i,sqh,0,0,"",0);
      s_dbuff(1,i,p_regr,0,0,"",0);
      s_dbuff(2,i,sql,0,0,"",0);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnTick()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int ShowName()
  {
   prt(0,"Regression [");
   prt_a(0,degree);prt_a(0,", ");
   prt_a(0,kstd);prt_a(0,", ");
   prt_a(0,bars);prt_a(0,"]");
  }
//+------------------------------------------------------------------+

Назад

TerminalCoin

2018-10-03 06:46:38