4.2 Как реализовать стратегическую торговлю на языке JavaScript

Автор:Доброта, Создано: 2019-04-27 11:53:15, Обновлено:

Резюме

В предыдущей статье мы представили фундаментальные знания, которые при использовании JavaScript для написания программы, включая основную грамматику и материалы.

Введение стратегии

Болинджерская полоса - один из наиболее часто используемых технических индикаторов, изобретенный Джоном Болинджером в 1980-х годах.

Метод расчета состоит в том, чтобы использовать статистический принцип, сначала рассчитать стандартное отклонение цены за определенный период времени, а затем добавить или вычесть 2 раза стандартное отклонение скользящей средней, чтобы найти доверенный интервал цены.

img

Из-за концепции стандартного отклонения ширина полосы Боллинджера динамически корректируется на основе недавних колебаний цен. Когда колебания малы, полосы Боллинджера будут более узкими; в противном случае колебания будут больше, а полосы Боллинджера будут шире. Когда канал BOLL меняется от узкого к широкому, цена постепенно возвращается к среднему. Когда канал BOLL меняется от широкого к узкому, это означает, что рыночная цена начинает меняться. Если цена пересекает верхний рельс, это означает, что покупательная способность повышается. Если цена снижается через нижний рельс, это указывает на то, что продажная способность повышается.

Метод расчета индикатора полосы Боллинджера

Среди всех технических показателей метод расчета полосы Боллинджера является одним из самых сложных, который вводит в статистику понятие стандартного отклонения, включая расчет средней траектории (MB ), верхней траектории (UP ) и нижней траектории (DN ).

  • Средняя рельса = простая скользящая средняя за N временных периодов

  • Верхняя рельса = средняя рельса + стандартное отклонение временного периода K × N

  • Нижняя рельса = средняя рельса − стандартное отклонение временного периода K × N

function main( ) { // program entry
    while (true) { // enter the loop
        exchange.SetContactType('this_week'); // set contact type
        var records = exchange.GetRecods(); // get the k line array
        var boll = TA.B0LL(records, 50); // get the 50-cycle BOLL indicator array
        var top = boll[0]; // get the upper-rail BOLL indicator array
        var ma = boll[l]; // get the middle-rail BOLL indicator array
        var bottom = boll[2]; // get the lower-rail BOLL indicator array
        Log(top); // print the upper-rail BOLL indicator array to the log
        Log(ma); // print the middle-rail BOLL indicator array to the log
        Log(bottom);// print the lower-rail BOLL indicator array to the log
    }
}

Логика стратегии

Боллингерские полосы используются различными способами и могут использоваться в одиночку или в сочетании с другими индикаторами.

img

Если цена снова возвращается на средний рельс полосы Боллинджера после открытия длинной позиции, мы считаем, что сила покупательной силы ослабевает, или сила продажной силы укрепляется, поэтому именно здесь вступает сигнал закрытия позиции.

Условия торговли

  • Открытая длинная позиция: если нет позиции, и цена закрытия больше верхней рельсы.

  • Краткая позиция: если нет позиции, а цена закрытия ниже нижней рельсы.

  • Закрыть длинную позицию: если держать длинную позицию, и цена закрытия меньше средней рельсы,

  • Закрыть короткую позицию: если держать короткую позицию, и цена закрытия больше средней рельсы,

Внедрение кодекса стратегии

Для достижения стратегии, сначала мы должны рассмотреть, какие данные нам нужны? через какой API получить? затем, как рассчитать логику торговли? наконец, каким образом разместить заказ? давайте реализуем его шаг за шагом:

Шаг 1: Используйте рамки стратегии CTA

Фреймворк так называемой стратегии CTA - это набор стандартных фреймворков, официально разработанных FMZ Quant. Используя этот фреймворк, вы можете игнорировать тривиальную проблему программирования и сосредоточиться непосредственно на логике программирования. Например, если вы не используете этот фреймворк, вам нужно будет рассмотреть вопрос о смене цены заказа, типа заказа, снятия заказов и так далее.

function main() {
    $.CTA("this_week", function(st) {
        // write your strategy here
    })
}

Выше приведены рамки стратегии CTA с использованием инструмента FMZ Quant. Это фиксированный формат кода, и весь код логики торговли начинается с строки 3.

Обратите внимание, что код торговой разновидности выше this_week, что означает, что он представляет собой использование еженедельной k-линии, торгующие данные с использованием еженедельных данных.

Шаг 2: Получить все виды данных

Подумайте об этом, какие данные нам нужны? из нашей стратегии логики торговли, мы сначала должны получить текущее состояние позиции, а затем сравнить цену закрытия с индикатором Болинджерской полосы верхних, средних и нижних рельсов.

  • Получить данные по линии К

Первый - получить массив данных K-линии и предыдущую цену закрытия K-линии, с помощью массива K-линии мы можем вычислить индикатор Болинджерской полосы. его можно написать так:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

    })
}

Как показано выше:

Строка 4: получите массив линий K, который является фиксированным форматом.

Строка 5: фильтруйте длину линии K, поскольку параметр для расчета индикатора Болинджерской полосы равен 20, когда линия K меньше 20, невозможно рассчитать индикатор Болинджерской полосы.

Строка 6 : Из полученного массива K-линий сначала получаем объект предыдущей K-линии, а затем получаем цену закрытия из этого объекта. Получение предпоследнего элемента в этом массиве, который является длиной этого массива минус 2 ((r[r.length - 2]).

Элементы массива K-линии - это все объекты, объект содержит цену открытия, самую высокую, самую низкую и цену закрытия; также объем торговли и время.

Например, чтобы получить цену закрытия, просто добавьте ". " после имени атрибута (r[r.length - 2].Close).

  • Получить данные о времени линии K

Поскольку это внутридневная стратегия, нам нужно закрыть все позиции до определенного времени ((большинство крипто-торговых бирж обычно открыты 24/7), поэтому мы должны судить, близка ли текущая линия K к этому определенному времени, когда мы должны остановить торговлю или сделать перерыв. Если она близка к этому времени закрытия линия K, закрыть все позиции. Если нет, продолжать стратегию.

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours
    })
}

Как показано выше:

Строка 8: получите объекты атрибута часовой метки строки K, а затем создайте объект времени ((new Date (timestamp)).

Строка 9: Вычислить часы и минуты в соответствии с объектом времени, и определить, если время текущей линии K 14:45.

  • Получить данные о положении

Информация о позиции является очень важным условием количественной торговой стратегии. При установлении условий торговли необходимо судить о необходимости размещения ордера по статусу позиции и количеству позиций. Например, при установлении условий для открытия длинных позиций, если есть позиции удержания, не размещайте заказ; если нет позиции удержания, размещайте заказ. так:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

    })
}

Как показано выше:

Строка 11: Получить текущий статус позиции. Если есть длинная позиция, значение равняется 1; если есть короткая позиция, значение равняется -1; если нет позиции, значение равняется 0.

  • Получить данные по Болинджерской полосе

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

порядок получения значения таков: сначала получить указанный массив в массиве, а затем получить указанный элемент из указанного массива, как показано ниже:

var arr = [[100, 200, 300],[10,20,30],[1,2,3]]; // this is a two-dimensional array
var test = arr[0]; //first obtain the specified array in the array and assign the value to variable "test"
var demo1 = test[0]; //then get a value from the test array
demo1; // the result is : 100

var demo2 = arr[0][0]; // you also can write like this
demo2; // the result is the same : 100

Ниже, с 13 по 19 строки получают верхнюю, среднюю и нижнюю рельсовую часть кодирования полосы Боллинджера, где в строке 13 используется инструмент FMZ Quant API, который может напрямую получить доступ к массиву полос Боллинджера; строка 14 по строку 16 получают двумерный массив соответственно для верхней, средней и нижней рельсовой массив; строка 17 по строку 19 получают значение, указанное из верхней, средней и нижней рельсовой массив.

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2];  // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value

    })
}

Шаг 3: размещение заказов и торговля

С помощью вышеперечисленных данных мы можем написать логику торговли и часть размещения ордера сейчас. Это также очень просто, наиболее часто используется заявление if, которое может быть описано так: если условие 1 и условие 2 истинны, разместите ордер; если условие 3 или условие 4 истинны, разместите ордер. Как показано ниже:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2]; // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value

        if (mp == 1 && (close < midPrice || isClose)) return -1; // if holding long position, and the closing price is less than the mid-rail, or the current time is 14:45, closing long position.
        if (mp == -1 && (close > midPrice || isClose)) return 1; // if holding short position, and the closing price is greater than the mid-rail, or the current time is 14:45, closing short position.
        if (mp == 0 && close > upPrice && !isClose) return 1; // if there are no holding position, and the closing price is greater than the upper-rail, or the current time is not 14:45, open long position.
        if (mp == 0 && close < downPrice && !isClose) return -1;// if there are no holding position, and the closing price is less than the lower-rail, or the current time is not 14:45, open short position.

    })
}

На рисунке выше строки 21 - 24 представляют собой часть кодирования логики торговли и размещения ордеров.

Возьмем, к примеру, открытую длинную позицию. Это заявление if. Если в этом заявлении выполняется только одна строка кода, можно опустить запятые " {} ". Заявление переводится в текст, что означает: если текущая позиция равна 0, цена закрытия больше верхней рельсы, а время k-линии не равняется 14:45, то " return 1 "

Вы можете обнаружить, что эти строки имеют " return 1 " и " return -1 ", что является фиксированным форматом, что означает: если это направление покупки, напишите " return 1 "; если это направление продажи, напишите " return -1 ". открытие длинной позиции и закрытие короткой позиции все направление покупки, поэтому напишите return 1; и наоборот.

Полный код стратегии

На этом этапе написан полный код стратегии. Если торговые рамки, торговые данные, логика торговли и размещение ордера написаны отдельно, это очень просто?

function main() {
    $.CTA("this_week", function(st) {
        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price
        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours
        var mp = st.position.amount; // get the holding position information
        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2]; // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value
        if (mp == 1 && (close < midPrice || isClose)) return -1; // if holding long position, and the closing price is less than the mid-rail, or the current time is 14:45, closing long position.
        if (mp == -1 && (close > midPrice || isClose)) return 1; // if holding short position, and the closing price is greater than the mid-rail, or the current time is 14:45, closing short position.
        if (mp == 0 && close > upPrice && !isClose) return 1; // if there are no holding position, and the closing price is greater than the upper-rail, or the current time is not 14:45, open long position.
        if (mp == 0 && close < downPrice && !isClose) return -1;// if there are no holding position, and the closing price is less than the lower-rail, or the current time is not 14:45, open short position.
    })
}

Есть две вещи, которые нужно знать:

  1. Попробуйте (но не обязательно) написать логику стратегии по мере установления текущего условия K-линии, а затем разместить заказ на следующей k-линии. Или установлено предыдущее условие k-линии, размещая заказы на текущей k-линии, таким образом, результат бэкстеста и реальная производительность рынка не сильно отличаются.

  2. В общем, логика закрытия позиции должна быть написана перед логикой открытия позиции. Целью этого является попытка сделать логику стратегии соответствующей вашим ожиданиям. Например, если логика стратегии просто отвечает ситуации, когда ей нужно делать противоположное направление торговли после закрытия позиции, правило такого рода ситуации заключается в том, чтобы сначала закрыть позицию, а затем открыть новую позицию. Если мы напишем логику закрытия позиции перед логикой открытия позиции, она будет идеально выполнять это правило.

Подводя итог

Выше мы узнали каждый шаг разработки полной внутридневной количественной стратегии торговли, включая: введение стратегии, метод расчета индикатора Боллинджера, логику стратегии, условия торговли, реализацию кода стратегии и т. д. Благодаря этому сценарию стратегии мы не только знакомы с методами программирования инструментов FMZ Quant, но и можем создать некоторые другие стратегии, которые адаптированы в соответствии с этим шаблоном.

Если мы запишем опыт или систему, используемую в субъективной торговле до написания количественной стратегии, а затем переведем ее в код один за другим, вы обнаружите, что написание количественной стратегии будет намного проще.

Следующее сообщение

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

Послешкольные занятия

  1. Постарайтесь использовать знания в этом разделе для реализации стратегии двойной скользящей средней.

  2. Попробуйте реализовать стратегию индикатора KDJ с использованием языка JavaScript на платформе FMZ Quant.


Больше