В предыдущей статье мы узнали о знакомстве с языком Python, базовом синтаксисе, структуре стратегии и многом другом. Хотя содержание было скучным, но это непременный навык в разработке вашей торговой стратегии. В этой статье мы продолжим путь Python с простой стратегией, шаг за шагом, чтобы помочь вам достичь осуществимой количественной торговой стратегии.
Среди многих торговых стратегий, стратегия канала Дончиана должна быть одной из самых классических прорывных стратегий. Она стала известной с 1970 года. В то время компания специализировалась на симуляционных тестах и исследованиях основных программных торговых стратегий.
Позже, в Соединенных Штатах, состоялись знаменитые тренинги трейдеров-черепах, которые имели большой успех в истории торговли ценными бумагами.
Прорывная стратегия торговли адаптирована к относительно плавному тренду торговых сортов. Наиболее распространенным способом прорыва является использование относительной позиционной связи между ценовой поддержкой и сопротивлением для определения конкретной торговой позиции.
Дончианский канал является ориентированным на тренд индикатором, и его внешний вид и сигнал несколько похожи на индикатор полосы Боллинджера. Однако его ценовой канал построен в соответствии с самыми высокими и самыми низкими ценами в определенный период. Например: верхняя рельса рассчитывается по самой последней 50 к-линии
как показано выше: этот индикатор с кривой, состоящей из трех разных цветов, по умолчанию устанавливает самую высокую и самую низкую цену в цикле 20, чтобы отобразить волатильность цен. Он будет показывать меньшую волатильность, когда цена находится в узком канале, и наоборот.
Если цены поднимаются выше верхней рельсы, появляется сигнал покупки; наоборот, если цена падает ниже нижней рельсы, появляется сигнал продажи. Поскольку верхние и нижние рельсы, которые рассчитываются с использованием самой низкой и самой высокой цены, поэтому при нормальных обстоятельствах цена не прорвется через рельсы, она будет двигаться вместе с рельсами или прыгать внутри канала.
На платформе FMZ Quant, вычисление Дончианского канала простое, вы можно просто получить доступ к самой высокой или самой низкой цене в данном цикле, как показано ниже: 5-я строка - получить самую высокую цену из 50 циклов, 6-я строка - получить самую низкую цену из 50 циклов.
def main(): # program entry
exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
while True: # enter the loop
records = exchange.GetRecords() # get the k line array
upper = TA.Highest(record, 50, 'high') # get the highest price of 50 cycles
lower = TA.Lowest(record, 50, 'low') # get the lowest price of 50 cycles
middle = (upper + lower) / 2 # calculate the average value of upper and lower rails
Log("upper rail: ", upper) # print the upper rail value in the log
Log("lower rail: ", lower) # print the lower rail value in the log
Log("middle rail: ", middle) # print the middle rail value in the log
Существует много способов использования канала Дончиана, который можно использовать в одиночку или в сочетании с другими индикаторами. В этом разделе мы будем использовать его самым простым способом. То есть: когда цены прорываются через верхнюю рельсу, что означает, что она прорывается выше линии давления, покупательная способность сильна, она сформировала волну растущей энергии, генерируется сигнал покупки; когда цена прорывается ниже нижней рельсы, что означает, что она прорывается ниже линии поддержки, генерируется сигнал продажи.
Если цена снова опускается обратно на средний рельс канала после открытия длинной позиции, мы считаем, что сила покупательной способности ослабевает, или сила продажной способности укрепляется, и сигнал открытия короткой позиции генерируется; тот же принцип применяется к открытию короткой позиции
Открытая длинная позиция: если нет удерживаемой позиции, а цена закрытия выше верхней рельсы
Открытая короткая позиция: если нет позиции, удерживаемой, и цена закрытия ниже нижней рельсы
Закрытие длинной позиции: если в настоящее время держите длинную позицию, и цена закрытия ниже средней рельсы
Закрытие короткой позиции: если в настоящее время удерживается короткая позиция, и цена закрытия больше средней рельсы
Первым шагом в реализации стратегии является получение данных, потому что данные являются необходимой частью торговой стратегии.
Следующим шагом является вычисление логики торговли на основе этих данных; последний шаг заключается в торговле в соответствии с логикой. шаги следующие:
Вы можете думать о библиотеке торгового класса как о функциональном модуле. Преимущество использования библиотеки торгового класса заключается в том, что она позволяет сосредоточиться на написании логики стратегии. Например, когда мы используем библиотеку торгового класса, чтобы открыть или закрыть позицию, мы можем напрямую использовать интерфейс API в библиотеке торгового класса; но если мы не используем библиотеку торгового класса, нам нужно получить рыночную цену при открытии позиции. Необходимо рассмотреть вопрос о неисполненных ордерах и вопрос о выводе ордеров и так далее.
def main();
wile true:
obj = ext.NewPositionManager() # using the trading class library
# followed by strategy logic and placing order part
Вышеприведенная часть кодирования представляет собой рамку стратегии CTA с использованием инструмента FMZ Quant. Это фиксированный формат кодирования, и весь логический код торговли начнётся с строки 4. Никаких других изменений в другом месте не требуется.
Подумайте об этом, какие данные нам нужны? из нашей стратегии логики торговли, мы сначала должны получить текущее состояние позиции, а затем сравнить цену закрытия с индикатором Болинджерской полосы верхних, средних и нижних рельсов.
Первое - получить массив данных K-линии и текущую цену закрытия K-линии, с помощью массива K-линии мы можем вычислить период N цикла наивысшей и самой низкой цены через интерфейс API. его можно написать так:
def main(): # main function
exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
while True: # enter the loop
records = exchange.GetRecords() # get the k line array
if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
close = records[len(records) - 1].Close # get the closing price of the latest k-line
Как показано выше:
Строка 4: получите массив линий K, который является фиксированным форматом.
Строка 5: фильтруйте длину K-линии, потому что параметр для расчета показателя канала Дончиана равен 50, когда количество K-линий меньше 50, это невозможно вычислить. Так что здесь нам нужно фильтровать число K-линии. Если количество K-линий меньше 50, он пропустит текущую петлю и продолжит ждать следующей K-линии.
Строка 6: Мы используем код " records [ len (records) - 1] " для получения последних данных массива K-линий, которые являются последними данными K-линий. Эти данные являются объектом, который содержит: цену открытия, самую высокую, самую низкую и закрывающую цену, а также объем торговли, время и другие данные, так как это объект, поэтому мы просто используем
Информация о позиции является очень важным условием в количественной стратегии торговли. Когда условия торговли устанавливаются, необходимо судить о том, стоит ли размещать ордер по статусу позиции и количеству позиций. Например, когда устанавливаются условия для открытия длинных позиций, если есть позиции хранения, не размещайте ордер; если нет позиций хранения, размещайте ордер. На этот раз мы напрямую инкапсулируем информацию о позиции в функцию, мы можем просто вызвать эту функцию, чтобы использовать ее. вот так:
# get the position information function
def mp():
positions = exchange.GetPosition() # get the holding position array
if len(position) == 0: # if the holding position array is 0
return 0 # meaning currently has no position holding, return 0
for i in range(len(position)): # Traversing the position array
if (position[i]['Type'] == PD_LONG):
return 1 # if there are long position holding, return 1
elif (position[i]['Type'] == PD_SHORT):
return -1 # if there are short position holding, return -1
def main(): # main function
exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
while True: # enter the loop
records = exchange.GetRecords() # get the k line array
if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
close = records[len(records) - 1].Close # get the closing price of the latest k-line
position = mp() # get the position information function
Как показано выше:
Это функция, которая получает информацию о позиции. Если есть длинная позиция, значение равняется 1; если есть короткая позиция, значение равняется -1; если нет позиции, значение равняется 0.
Строка 2: Создать функцию с именем
Строка 3: Получите массив позиций, который является фиксированным форматом.
Если длина массива равна 0, это означает, что у него нет позиции, возвращает 0.
Строка 6 : Используя петлю for, начиная пересекать этот массив, следующая логика очень проста, если он держит длинную позицию, возвращает 1 ; если он держит короткую позицию, возвращает -1.
Строка 18: Вызвать функцию информации о положении
В FMZ Quant количественный торговый инструмент, вы можете напрямую использовать функции " TA.Highest " и " TA.Lowest " без необходимости писать свои собственные логические вычисления. И
# get the position information function
def mp():
positions = exchange.GetPosition() # get the holding position array
if len(position) == 0: # if the holding position array is 0
return 0 # meaning currently has no position holding, return 0
for i in range(len(position)): # Traversing the position array
if (position[i]['Type'] == PD_LONG):
return 1 # if there are long position holding, return 1
elif (position[i]['Type'] == PD_SHORT):
return -1 # if there are short position holding, return -1
def main(): # main function
exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
while True: # enter the loop
records = exchange.GetRecords() # get the k line array
if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
close = records[len(records) - 1].Close # get the closing price of the latest k-line
position = mp() # get the position information function
upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail
Как показано выше:
Строка 19: вызовите функцию
Строка 20: вызовите функцию
Строка 21: вычислить среднее значение верхней и нижней рельсы согласно самой высокой и самой низкой цене за 50 циклов
С помощью вышеперечисленных данных мы можем написать логику торговли и часть размещения ордера сейчас. Это также очень просто, наиболее часто используется заявление
# get the position information function
def mp():
positions = exchange.GetPosition() # get the holding position array
if len(position) == 0: # if the holding position array is 0
return 0 # meaning currently has no position holding, return 0
for i in range(len(position)): # Traversing the position array
if (position[i]['Type'] == PD_LONG):
return 1 # if there are long position holding, return 1
elif (position[i]['Type'] == PD_SHORT):
return -1 # if there are short position holding, return -1
def main(): # main function
exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
while True: # enter the loop
records = exchange.GetRecords() # get the k line array
if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
close = records[len(records) - 1].Close # get the closing price of the latest k-line
position = mp() # get the position information function
upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail
obj = ext.NewPositionManager() # using the trading class library
if position > 0 and close < middle: # If currently holding long position, and the closing price is less than the middle rail
obj.CoverAll() # close all position
if position < 0 and close > middle: # If currently holding short position, and the closing price is greater than the middle rail
obj.CoverAll() # close all position
if position == 0: # if currently holding no position
if close > upper: # if the closing price is greater than the middle rail
obj.OpenLong("this_week", 1) # open long position
elif close < lower: # if the closing price is less than the middle rail
obj.OpenShort("this_week", 1) # open short position
Как показано выше:
Строка 22: Используя библиотеку торговых классов, это фиксированный формат
Строки 23, 24 : Это заявление о закрытии длинной позиции, которое использует операторы сравнения и логические операторы, которые мы узнали ранее, что означает, что если текущее владение является длинной позицией, и цена закрытия меньше средней рельсы, закрыть все позиции.
Строки 25, 26 : Это заявление о закрытии короткой позиции, которое использует операторы сравнения и логических операторов, которые мы узнали ранее, что означает, что если текущий ордер является короткой позицией, и цена закрытия больше средней рельсы, закрыть все позиции.
Строка 27: Определить текущее состояние позиции.
Строки 28, 29: Определить, является ли цена закрытия выше верхней рельсы.
Строки 30, 31: Определить, является ли цена закрытия ниже нижней рельсы. Если цена закрытия падает ниже нижней рельсы, открыть короткую позицию.
Выше мы узнали каждый шаг разработки полной количественной торговой стратегии с использованием Python, включая: введение стратегии, метод расчета канала Дончиана, логику стратегии, условия торговли, реализацию кода стратегии и т. Д. Этот раздел является простой стратегией.
В разработке количественных торговых стратегий, с точки зрения скорости выполнения языка программирования, какой из них самый быстрый? это должен быть C ++. Особенно в области финансовых производных и высокочастотного трейдинга. C ++ уникален по специфике языка и имеет преимущества в численных расчетах. По сравнению с JavaScript и Python, его скорость может быть увеличена на несколько порядков величины. Если вы хотите пойти в область финансовых производных или высокочастотного трейдинга в будущем. Это будет курс, который вы не должны пропустить.
Начинайте с основ и реализуйте стратегию этого раздела.
Попробуйте добавить в стратегию в этом разделе индикатор скользящей средней, чтобы уменьшить частоту торговли.