Создание индикатора Accumulation Distribution

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()
} // конец кода индикатора