export class Main extends Indicator {
// создаём и экспортируем класс с именем Main - дочерний класс (наследующий свойства) предопределенного класса Indicator, который в свою очередь является дочерним для предопределенного класса mScript.
// constructor создаёт и инициализирует объекты, необходимые для работы индикатора
constructor() {
// "В конструкторе ключевое слово super используется как функция, вызывающая родительский конструктор. Её необходимо вызвать до первого обращения к ключевому слову this в теле конструктора."
super();
// Задаём свойства индикатора [// mtrader7.com/docs/Terminal/mScript/JavaScript/v1/mScript/setProperty]
this.setProperty(Property.SeparateWindow, true); // Данные индикатора отображаются в отдельном окне? true = да;
this.setProperty(Property.ShortName, "A/D"); // Отображаемое имя индикатора = A/D
//Добавим в диалоговое окно иницализации индикатора запрос о типе используемой цены (PriceType) - Bid или Ask
// mtrader7.com/docs/Terminal/mScript/JavaScript/v1/mScript/addInput
this.addInput("Тип цены", InputType.PriceType, PriceType.Bid);
this.buffers = {
// создаём необходимые для работы буферы mtrader7.com/docs/Terminal/mScript/JavaScript/v1/mScript/addBuffer
ExtMapBuffer1 : this.addBuffer(), // ; буфер в данном индикаторе один
};
} // конец метода constructor
onInit() { // Процедура Инициализации индикатора, исполняется немедленно после загрузки клиентским терминалом
this.buffers.ExtMapBuffer1 //инициализация буфера значений индикатора
.setShape(Shape.Line) // задаём вид графика - линия
.setColor(Color.LightSeaGreen) // цвет линии по умолчанию; в диалоговом окне можно будет выбрать другой
;
} // конец функции onInit
async onUpdate() { // onUpdate - стандартная функция, исполняемая каждый раз при поступлении нового тика по символу, для которого рассчитывается индикатор
const {PriceType} = this.getInputs(), // получить ранее запрошенный тип цены и сохранить его в виде константы PriceType
{ExtMapBuffer1} = this.buffers, // получить накопленные данные буфера
// запросить из терминала данные High, Low, Close, Volume для всех баров и дождаться заполнения соответствующих массивов
// mtrader7.com/ru/docs/Terminal/mScript/JavaScript/v1/Bar/load
{
High,
Low,
Close,
Volume
} = await Bar.load([ // await - исполнение программы приостанавливается до получения всех данных
Bar.Mode.High,
Bar.Mode.Low,
Bar.Mode.Close,
Bar.Mode.Volume,
], PriceType), // для соответствующего типа цены
barSize = Close.length; // barSize = количеству элементов массива Close
// let - объявление переменных, действительных только в пределах данного блока программы
let i, h, l, c,
countedBars = Bar.counted(); // countedBars = количеству баров, не подвергшихся изменению с момента последнего запуска индикатора
i = barSize - countedBars - 1; // задать количество итераций цикла
// Оператор while создает цикл, выполняющий заданный набор инструкций, пока истинно проверяемое условие. Логическое значение условия вычисляется перед исполнением тела цикла."
// developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/while
while (i >= 0) { // цикл по i от начала данных к концу - до последнего (текущего, нулевого) бара
// сохранить во временных переменных значения массивов High, Low и Close для текущего бара (с индексом i)
h = High[i];
l = Low[i];
c = Close[i];
// вычисляем значение буфера - координаты Y линии индикатора
ExtMapBuffer1.set(i, ((c - l) - (h - c))); // установить значение i-го элемента равным (Close[i] - Low[i]) - ( High[i] - Close[i]) mtrader7.com/ru/docs/Terminal/mScript/JavaScript/v1/Buffer/set
if (ExtMapBuffer1.get(i) !== 0) { // если теперь значение ExtMapBuffer1[i] не равно 0; // mtrader7.com/ru/docs/Terminal/mScript/JavaScript/v1/Buffer/get
let diff = h - l; // High[i] - Low[i]
if (0 === diff) { // если полученная разность diff равна нулю
ExtMapBuffer1.set(i, 0); // установить значение i-го элемента буфера = 0
}
else { // если полученная разность diff не равна нулю
ExtMapBuffer1.set(i, (ExtMapBuffer1.get(i)/diff));
ExtMapBuffer1.set(i, (ExtMapBuffer1.get(i) * Volume[i]));
} // конец if (0 === diff)
} // конец if (ExtMapBuffer1.get(i) !== 0)
if (i < barSize - 1) { // если это не самый первый бар (для которого нет предыдущего бара i+1)
ExtMapBuffer1.set(i, (ExtMapBuffer1.get(i) + ExtMapBuffer1.get((i + 1)))); // установить окончательное значение буфера индикатора
} // конец if
i--; // уменьшить на единицу количество оставшихся итераций цикла
} // конец цикла while
} конец функции onUpdate()
} // конец кода индикатора