Индикатор Price Channel

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

 

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

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

int Length,LimitBars;

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

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

int OnInit()
  {
   s_buff(0,1,1,0,"Blue","Blue","Blue");
   s_buff(1,1,1,0,"Silver","Silver","Silver");
   s_buff(2,1,1,0,"Blue","Blue","Blue");
   s_par(0,"int","Length",14);
   s_par(1,"int","LimitBars",1000);
  }

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

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

   Length=g_par(0);
   LimitBars=g_par(1);
   if(Length<1){Length=1;}
   ShowName();

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

int ShowName()
  {
   prt(0,"PriceChannel [");
   prt_a(0,Length);
   prt_a(0,"]");
  }

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

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

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

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

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

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

   for(i=ReCount-1;i>=0;i=i-1)
     {
      p_low=lowest(i,Length,Count);
      p_high=highest(i,Length,Count);
      s_dbuff(0,i,p_high,0,0,"",0);
      s_dbuff(1,i,(p_high+p_low)/2,0,0,"",0);
      s_dbuff(2,i,p_low,0,0,"",0);
     }

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

После чего рассчитанные значения записываются в буфер командой s_dbuff. В нулевой буфер передается максимальное значение. В первый - среднее. Во второй буфер передается минимальное значение.

Функция OnTick

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

int OnTick()
  {
  }

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

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

//+------------------------------------------------------------------+
//|                                              Price Channel.lcryp |
//|                                     Copyright 2017, TerminalCoin |
//|                                             www.terminalcoin.com |
//+------------------------------------------------------------------+
int Length,LimitBars;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   s_buff(0,1,1,0,"Blue","Blue","Blue");
   s_buff(1,1,1,0,"Silver","Silver","Silver");
   s_buff(2,1,1,0,"Blue","Blue","Blue");
   s_par(0,"int","Length",14);
   s_par(1,"int","LimitBars",1000);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnBar()
  {
   Length=g_par(0);
   LimitBars=g_par(1);
   if(Length<1){Length=1;}
   ShowName();
   if(ReCount>LimitBars)
     {
      ReCount=LimitBars;
     }
   if(ReCount<1){return -1;}
   double p_low,p_high;
   int i,j;
   for(i=ReCount-1;i>=0;i=i-1)
     {
      p_low=lowest(i,Length,Count);
      p_high=highest(i,Length,Count);
      s_dbuff(0,i,p_high,0,0,"",0);
      s_dbuff(1,i,(p_high+p_low)/2,0,0,"",0);
      s_dbuff(2,i,p_low,0,0,"",0);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnTick()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int ShowName()
  {
   prt(0,"PriceChannel [");
   prt_a(0,Length);
   prt_a(0,"]");
  }
//+------------------------------------------------------------------+

Назад

TerminalCoin

2018-05-15 19:38:55