Индикатор Bollinger Bands

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

Индикатор Bollinger Bands

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

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

int Length,Shift,LimitBars;
double Deviations;

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

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

int OnInit()
  {
   s_buff(0,1,1,0,"Green","Green","Green");
   s_buff(1,1,1,0,"Green","Green","Green");
   s_buff(2,1,1,0,"Green","Green","Green");
   s_buff(3,5,1,0,"","","");
   s_par(0,"int","Length",20);
   s_par(1,"int","Shift",0);
   s_par(2,"double","Deviations",2);
   s_par(3,"int","LimitBars",1000);
  }

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

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

   Length=g_par(0);
   Shift=g_par(1);
   Deviations=g_par(2);
   LimitBars=g_par(3);
   ShowName();

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

int ShowName()
  {
   prt(0,"Bollinger Bands [");
   prt_a(0,Length);prt_a(0,", ");
   prt_a(0,Shift);prt_a(0,", ");
   prt_a(0,Deviations);
   prt_a(0,"]");
  }

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

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

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

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

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

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

   for(i=ReCount-1;i>=0;i=i-1)
     {
      ma=avg(i,Length,0,Count,6);
      s_dbuff(0,i,ma,0,0,"",0);
      StdDev=StdDev_Func(i,Length);
      s_dbuff(3,i,StdDev,0,0,"",0);
      temp=ma+Deviations*StdDev;
      s_dbuff(1,i,temp,0,0,"",0);
      temp=ma-Deviations*StdDev;
      s_dbuff(2,i,temp,0,0,"",0);
     }

В цикле последовательно перебираются все бары. Сначала рассчитывается значение скользящего среднего. Его значение фиксируется в буфере 0 с помощью команды s_dbuff. Буфер будет отображаться как средняя линия индикатора на ценовом графике. Следующий шаг - использование пользовательской функции StdDev_Func для расчета целевого значения индикатора. Данные функции сохраняются в не визуальном буфере номер три, командой s_dbuff. В следующих шагах рассчитывается отклонение вверх и вниз с записью значений в буфер 1 и 2 соответственно. В буфере один будет отображаться верхняя линия индикатора, в буфере два будет отображается нижняя линия.

Функция StdDev_Func, принимает входные параметры position и period. Параметр position - указывает на индекс расчетного бара на графике. Параметр period - указывает период расчета индикатора.

double StdDev_Func(int position,int period)
  {
   double StdDev_dTmp;
   StdDev_dTmp=0.0;
   double temp;
   int i;
   for(i=0;i<period;i=i+1)
     {
      temp=open(position+i)-g_dbuff(0,position);
      StdDev_dTmp=StdDev_dTmp+pow(temp,2);
     }
   StdDev_dTmp=Sqrt(StdDev_dTmp/period);
   return StdDev_dTmp;
  }

Главной частью функции является цикл от указанного индекса бара в глубь ценового графика на глубину периода. Для расчета алгоритма используются команды: open, g_dbuff, а также математические команды pow и sqrt. Результат расчета хранится во временной переменной StdDev_dTmp и передается как результат функции с помощью базовой команды return.

Функция OnTick

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

int OnTick()
  {
  }

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

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

//+------------------------------------------------------------------+
//|                                            Bollinger Bands.lcryp |
//|                                     Copyright 2017, TerminalCoin |
//|                                             www.terminalcoin.com |
//+------------------------------------------------------------------+
int Length,Shift,LimitBars;
double Deviations;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   s_buff(0,1,1,0,"Green","Green","Green");
   s_buff(1,1,1,0,"Green","Green","Green");
   s_buff(2,1,1,0,"Green","Green","Green");
   s_buff(3,5,1,0,"","","");
   s_par(0,"int","Length",20);
   s_par(1,"int","Shift",0);
   s_par(2,"double","Deviations",2);
   s_par(3,"int","LimitBars",1000);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnBar()
  {
   Length=g_par(0);
   Shift=g_par(1);
   Deviations=g_par(2);
   LimitBars=g_par(3);
   ShowName();
   if(ReCount>LimitBars)
     {
      ReCount=LimitBars;
     }
   if(ReCount<1){return -1;}
   int i;
   double ma,StdDev,temp;
   for(i=ReCount-1;i>=0;i=i-1)
     {
      ma=avg(i,Length,0,Count,6);
      s_dbuff(0,i,ma,0,0,"",0);
      StdDev=StdDev_Func(i,Length);
      s_dbuff(3,i,StdDev,0,0,"",0);
      temp=ma+Deviations*StdDev;
      s_dbuff(1,i,temp,0,0,"",0);
      temp=ma-Deviations*StdDev;
      s_dbuff(2,i,temp,0,0,"",0);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double StdDev_Func(int position,int period)
  {
   double StdDev_dTmp;
   StdDev_dTmp=0.0;
   double temp;
   int i;
   for(i=0;i<period;i=i+1)
     {
      temp=open(position+i)-g_dbuff(0,position);
      StdDev_dTmp=StdDev_dTmp+pow(temp,2);
     }
   StdDev_dTmp=Sqrt(StdDev_dTmp/period);
   return StdDev_dTmp;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnTick()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int ShowName()
  {
   prt(0,"Bollinger Bands [");
   prt_a(0,Length);prt_a(0,", ");
   prt_a(0,Shift);prt_a(0,", ");
   prt_a(0,Deviations);
   prt_a(0,"]");
  }
//+------------------------------------------------------------------+


Назад

TerminalCoin

2018-10-03 06:41:59