Как реализовать стратегическую торговлю на языке JavaScript
В предыдущей статье мы представили фундаментальные знания, которые при использовании JavaScript для написания программы, включая основную грамматику и материалы.
Болинджерская полоса - один из наиболее часто используемых технических индикаторов, изобретенный Джоном Болинджером в 1980-х годах.
Метод расчета состоит в том, чтобы использовать статистический принцип, сначала рассчитать
Из-за концепции стандартного отклонения ширина полосы Боллинджера динамически корректируется на основе недавних колебаний цен. Когда колебания малы, полосы Боллинджера будут более узкими; в противном случае колебания будут больше, а полосы Боллинджера будут шире. Когда канал 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
}
}
Боллингерские полосы используются различными способами и могут использоваться в одиночку или в сочетании с другими индикаторами.
Если цена снова возвращается на средний рельс полосы Боллинджера после открытия длинной позиции, мы считаем, что сила покупательной силы ослабевает, или сила продажной силы укрепляется, поэтому именно здесь вступает сигнал закрытия позиции.
Открытая длинная позиция: если нет позиции, и цена закрытия больше верхней рельсы.
Краткая позиция: если нет позиции, а цена закрытия ниже нижней рельсы.
Закрыть длинную позицию: если держать длинную позицию, и цена закрытия меньше средней рельсы,
Закрыть короткую позицию: если держать короткую позицию, и цена закрытия больше средней рельсы,
Для достижения стратегии, сначала мы должны рассмотреть, какие данные нам нужны? через какой API получить? затем, как рассчитать логику торговли? наконец, каким образом разместить заказ? давайте реализуем его шаг за шагом:
Фреймворк так называемой стратегии CTA - это набор стандартных фреймворков, официально разработанных FMZ Quant. Используя этот фреймворк, вы можете игнорировать тривиальную проблему программирования и сосредоточиться непосредственно на логике программирования. Например, если вы не используете этот фреймворк, вам нужно будет рассмотреть вопрос о смене цены заказа, типа заказа, снятия заказов и так далее.
function main() {
$.CTA("this_week", function(st) {
// write your strategy here
})
}
Выше приведены рамки стратегии CTA с использованием инструмента FMZ Quant. Это фиксированный формат кода, и весь код логики торговли начинается с строки 3.
Обратите внимание, что код торговой разновидности выше
Подумайте об этом, какие данные нам нужны? из нашей стратегии логики торговли, мы сначала должны получить текущее состояние позиции, а затем сравнить цену закрытия с индикатором Болинджерской полосы верхних, средних и нижних рельсов.
Первый - получить массив данных 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).
Поскольку это внутридневная стратегия, нам нужно закрыть все позиции до определенного времени ((большинство крипто-торговых бирж обычно открыты 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
})
}
С помощью вышеперечисленных данных мы можем написать логику торговли и часть размещения ордера сейчас. Это также очень просто, наиболее часто используется заявление
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 представляют собой часть кодирования логики торговли и размещения ордеров.
Возьмем, к примеру, открытую длинную позицию. Это заявление
Вы можете обнаружить, что эти строки имеют " 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.
})
}
Есть две вещи, которые нужно знать:
Попробуйте (но не обязательно) написать логику стратегии по мере установления текущего условия K-линии, а затем разместить заказ на следующей k-линии. Или установлено предыдущее условие k-линии, размещая заказы на текущей k-линии, таким образом, результат бэкстеста и реальная производительность рынка не сильно отличаются.
В общем, логика закрытия позиции должна быть написана перед логикой открытия позиции. Целью этого является попытка сделать логику стратегии соответствующей вашим ожиданиям. Например, если логика стратегии просто отвечает ситуации, когда ей нужно делать противоположное направление торговли после закрытия позиции, правило такого рода ситуации заключается в том, чтобы сначала закрыть позицию, а затем открыть новую позицию. Если мы напишем логику закрытия позиции перед логикой открытия позиции, она будет идеально выполнять это правило.
Выше мы узнали каждый шаг разработки полной внутридневной количественной стратегии торговли, включая: введение стратегии, метод расчета индикатора Боллинджера, логику стратегии, условия торговли, реализацию кода стратегии и т. д. Благодаря этому сценарию стратегии мы не только знакомы с методами программирования инструментов FMZ Quant, но и можем создать некоторые другие стратегии, которые адаптированы в соответствии с этим шаблоном.
Если мы запишем опыт или систему, используемую в субъективной торговле до написания количественной стратегии, а затем переведем ее в код один за другим, вы обнаружите, что написание количественной стратегии будет намного проще.
При разработке количественной стратегии торговли, если только можно выбрать один язык программирования, без колебаний, это должен быть Python. От получения данных до бэкстестинга, даже части размещения заказов, Python охватывает всю бизнес-цепочку. В области финансовых количественных инвестиций Python занимает чрезвычайно важное положение, следующий раздел курса мы начнем изучать язык Python.
Постарайтесь использовать знания в этом разделе для реализации стратегии двойной скользящей средней.
Попробуйте реализовать стратегию индикатора KDJ с использованием языка JavaScript на платформе FMZ Quant.