Разработка индикаторов


В качестве языка разработки продукта был выбран c#, соответственно не было нужды городить какой-то свой язык под индикаторы. Если у вас есть достаточный опыт использования этого языка, разработка будет простой и интуитивной. Даже если вы - не программист, либо этот язык вам не знаком, будет легко найти разработчика.

Я постарался сделать разработку максимально простой. Не требуются никакие дополнительные библиотеки или зависимости. Даже компилировать ничего не нужно - достаточно "скормить" программе исходный код индикатора. Его, к слову, можно редактировать даже в простейшем текстовом редакторе.

Для удобства разработки, конечно, стоит использовать какой-нибудь специализированный редактор по своему вкусу. Что-нибудь с подсветкой синтаксиса и автоматическим определением ошибок. Подобных редакторов - масса, поэтому я даже не стал заморачиваться со встраиванием среды разработки. Исходный код всегда открывается средствами операционной системы в любом редакторе, ассоциированном с расширением файла индикатора.

К слову, расширение у файла с исходным кодом индикатора может быть любым. Это - удобно, если вам захочется редактировать индикаторы в каком-то нестандартном редакторе.

Откройте исходный код примеров пользовательских индикаторов.

    
    [Indicator(Name = "Simple Moving Average", SeparateChart = false)]
    public class SimpleMovingAverage : Indicator
    {
        /// ==================================================================
        /// ============================ inputs ==============================
        /// ==================================================================
        [Input(Name = "Period", MinValue = 1)]
        public int Period = 50;

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

У каждого индикатора также есть атрибут Indicator с его "человеческим" названием, флагом открытия его в отдельном графике и дополнительными параметрами вроде фиксированного максимума/минимума и уровней.

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

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

        /// ==================================================================
        /// ============================ outputs ==============================
        /// ==================================================================

        [Output(Name = "Moving Average", Type = OutputTypes.Curve, Color = "#FF0000", Thickness = 1, Style = LineStyles.Solid)]
        public double[] MovingAverage;

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

           
        public void Calculate()
        {
            for (int i = Period; i < Bars.Length; i++)
                MovingAverage[i] = Calculate(i);
        }

При каждом вызове этой функции вы получаете следующее состояние:

  1. Bars заполнен массивом баров в несколько раз большим, чем видимый, чтобы корректно рассчитывать скользящие средние и прочие индикаторы с задержкой
  2. Ticks заполнен массивом из последних 100 тиков
  3. Все выходные массивы установлены в размер входных, они также заполнены индикатором пустого значения, то есть достаточно лишь выставить только те точки, где значения есть

Для удобства отладки перезагрузка индикатора выполняется кнопкой F5. Достаточно отредактировать текст, переключиться в Симулятор и нажать эту кнопку. Новый исходный код будет автоматически загружен, скомпилирован и запущен.

К слову, расположение исходного кода можно указать в настройках индикатора, если вам удобно хранить и редактировать его в другом месте.

Если в процессе компиляции или исполнения возникает ошибка, она выводится непосредственно на график в максимально подробном варианте, со стеком вызова и номерами строк. Поправьте код и нажмите F5 снова для обновления.

Не стесняйтесь задавать вопросы в службу поддержки, если возникают сложности с разработкой - всегда поможем!