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