В левом меню в разделе "Индикаторы" кликните по индикатору "Moving Average". Во всплывающем окне нажмите кнопку "Правка".

В открывшемся редакторе загрузится код индикатора.

Рассмотрим непосредственно код. Каждый файл начинается с блока настраиваемых параметров в формате JSON, в виде "ключ-значение". Блок должен быть закомментирован в виде /* */. После открытия комментария необходимо поставить знак "&", указывающий тестеру на то, что комментарий содержит текст настроек.
Первый ключ "name" в JSON-настройке содержит название индикатора. Это название отражается в списке индикаторов в меню слева, а также используется для вызова соответствующего индикатора в коде стратегий.
Следующие ключи используются для настройки входящих параметров при вызове индикаторов. В нашем случае используются 3 параметра: период, цвет, ID. В ключах ниже указаны массивы с тремя значениями, соответствующие этим параметрам. Ключ "desc" содержит произвольные названия параметров, описывающее их назначение или смысл.
Ключ "types" содержит типы данных параметров. Для каждого параметра могут быть одним их типов: "text" - для текста или произвольных данных, "number" - для числовых значений, "color" - для выбора цвета. Ключ "values" содержит значения параметров по умолчанию.
Каждый индикатор должен включать в себя параметр "ID", имеющий тип "number" и пустое значение по умолчанию. В этом случае при вызове индикатора значение будет назначено автоматически. Указывать конкретные значения этого параметра необходимо при описании стратегий для обращения к индикатору. Индикатор может содержать несколько параметров "ID", ели в нём используется несколько кривых для отрисовки.
Код индикатора должен находится в теле функции. Определение функции должно начинаться как function main(...)
. Использование имени функции "main" обязательно. В скобках указываются произвольные названия переменных в том количестве и в том порядке, который указан для параметров в JSON-настройке. В нашем случае указаны переменные: "period", "color", "id".
Рассмотрим построчно код индикатора.
period = parseInt(period);
Приводим переменную period в типу "int" во избежании проблем в вычислениях с этой переменной. Необходимо учитывать, что все значения переменных из формы при вызове индикатора, поступают в текстовом типе.
buff_curves[id] = [];
"buff_curves" - это служебный массив, использующийся для отрисовки индикаторов поверх свечного графика цен. В первом индексе массива указывается ID индикатора. Для того, чтобы понять принцип работы с этим массивом, рассмотрим правый участок графика со следующими значениями:
N | open | high | low | close |
0 | 178.61 | 178.63 | 177.25 | 177.55 |
1 | 178.31 | 178.8 | 178.18 | 178.56 |
2 | 178.51 | 178.61 | 177.82 | 178.32 |
3 | 178.96 | 179.13 | 178.4 | 178.51 |
4 | 178.02 | 179.15 | 177.15 | 178.92 |
5 | 177.63 | 178.4 | 177.2 | 178.02 |
6 | 179.52 | 179.7 | 177.14 | 177.64 |
7 | 180.93 | 181 | 179.01 | 179.52 |
При отрисовке графиков и индикаторов нумерация баров идёт справа налево. Самый последний бар на экране имеет нулевой индекс, несмотря на то, какой отображается период в истории.
Допустим, что массив buff_curves
в ходе вычислений принял следующие значения:
buff_curves[id] = [0 => 178.22, 1 => 178.5, 2 => 178.84, 3 => 179.26, 4 => 179.62, 5 => 179.91, 6 => 180.22, 7 => 180.71];
Тогда линия индикатора отрисуется по этим точкам следующим образом:

list_colors[id] = color;
Массив, который содержит цвета каждого индикатора для отрисовки. Может принимать значения стандартных названий цветов для CSS или кодов в виде: #000000
или #000
. В нашем случае значение цвета индикатора принимается выбором из формы.
var view = 90;
Переменная для оптимизации. Указывается количество свечей с правой части, для которых будет отрисован индикатор.
for (var i = 0; i < view; i++) {...}
Цикл вычислений значений индикатора для соответствующих баров, начиная с крайнего правого бара с индексом 0 в указанном количестве view
.
var sum = 0;
Объявление переменной для подсчёта суммы цен закрытия, приравнивание её значения к нулю.
for (var j = i; j < i + period; j++) ...
Для того, чтобы подсчитать среднее арифметическое за указанный период period
для текущего бара с индексом i
необходимо обратиться к барам, начиная с текущего до бара с индексом [i + period]
, не включая его. На рисунке ниже приведён пример, цены каких свечей нужно взять для расчёта, если текущий i = 7
, а period = 10
.

sum += close[j];
За каждую итерацию к переменной sum
прибавляется значение цены "close" свечи с индексом j
. Для обращения к значениям свечей доступны следующие служебные массивы: open
, high
, low
, close
, volume
, а также date
и time
.
sum /= period;
Итоговое значения суммы цен "close" sum
делится на значение периода. Теперь значение переменной sum
– это среднее арифметическое цен "close" за указанный период.
buff_curves[id][i] = sum;
В массив
buff_curves
записывается значение переменной
sum
. Первый индекс — ID индикатора, второй индекс – номер свечи с правого края.
После выполнения функции произойдёт отрисовка индикатора. Обращение к функции происходит при добавлении индикатора, изменения его переметров, перемещении по истории вручную или при работе робота.