Crocodile line: Python версия

Сводка

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

Что такое Crocodile line

Крокодиловая линия на самом деле представляет собой три специальные скользящие средние, которые соответствуют подбородку синей линии, зубьям красной линии и верхней губе зеленой линии. Подбородок представляет собой 13-периодную скользящую среднюю и движется на 8 баров в будущем. Зуб представляет собой 8-периодную скользящую среднюю и движется на 5 баров в будущем. Верхняя губа представляет собой 5-периодную скользящую среднюю и движется на 3 бара в будущем.

Принцип Crocodile line

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

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

Формула расчета Crocodile line

Верхняя губа = REF(SMA(VAR1,5,1),3)
Зубы = REF(SMA(VAR1,8,1),5)
Подбородок = REF(SMA(VAR1,13,1)

Состав стратегии крокодила

Шаг 1: Напишите структуру стратегии

# Основная функция
стратегии def onTick():
pass

# Запись
программы def main ():
в то время как True: # Войти в режим бесконечного
цикла onTick() # выполнить стратегию основной функции
Sleep(1000) # sleep в течение 1 секунды

FMZ использует режим опроса, один является функцией onTick, а другой является основной функцией, в которой функция onTick выполняется в бесконечном цикле в основной функции.

Шаг 2: Импорт библиотеки Python

импорт талиб
импорт numpy как np

Функция SMA используется в нашей стратегии. СМА — среднее арифметическое. В библиотеке talib уже есть готовые функции SMA, поэтому напрямую импортируйте библиотеку talib Python, а затем вызовите ее напрямую. Потому что при вызове этой функции вам нужно передать параметры формата numpy, поэтому нам нужно использовать импорт для импорта этих двух библиотек Python в начале стратегии.

Шаг 3: Преобразование данных массива K-line

# Преобразование массива K-line в массив с самой высокой ценой, самой низкой ценой и ценой закрытия для преобразования в numpy.array
def get_data(bars):
arr = []
для i в барах:
arr.append(i['Close'])
return arr

Здесь мы создали get_data функцию, целью которой является обработка обычного массива K-line в данные формата numpy. Входным параметром является массив K-line, а выходным результатом являются обработанные данные в формате numpy.

Шаг 4: Получение данных о местоположении

# Получить количество позиций
def get_position ():
# Получить позицию позиции
= 0 # Количество назначенных позиций равно 0
position_arr = _C (обмен. GetPosition) # Получить массив позиций
, если len (position_arr)> 0: # Если длина массива позиций больше 0
для i в position_arr:
если i ['ContractType'] == 'rb000': # Если символ позиции равен символу
подписки, если i ['Type']% 2 == 0 : # Если это длинная позиция
= i ['Сумма'] # Присвоение положительного числа позиций
else:
позиция = -i ['Сумма'] # Присвоение отрицательного числа позиций возврата позиции

Статус позиции включает в себя логику стратегии. В наших первых десяти уроках всегда использовались виртуальные позиции, но в реальной торговой среде лучше всего использовать функцию GetPosition для получения реальной информации о позиции, в том числе: направление позиции, прибыль и убыток позиции, количество позиций и т. Д.

Шаг 5: Получение данных

обмен. SetContractType('rb000') # Подписаться на фьючерсные разновидности
bars_arr = биржа. GetRecords() # Получить массив
строк K, если len(bars_arr) < 22: # Если число строк K меньше 22
, верните

Перед получением данных необходимо сначала использовать функцию SetContractType для подписки на соответствующие разновидности фьючерсов. FMZ поддерживает все китайские разновидности товарных фьючерсов. После подписки на фьючерсный символ можно использовать функцию GetRecords для получения данных K-line, которая возвращает массив.

Шаг 6: Вычисление данных

np_arr = np.array (get_data (bars_arr)) # Конвертировать диапазон
цен закрытия sma13 = talib.SMA (np_arr, 130) [-9] # chin
sma8 = talib.SMA (np_arr, 80) [-6] # зубья
sma5 = talib.SMA (np_arr, 50) [-4] # current_price верхней губы
= bars_arr [-1] ['Close' ] # последняя цена

Перед вычислением SMA с помощью библиотеки talib необходимо использовать библиотеку numpy для обработки обычного массива K-line в данные numpy. Затем получите подбородок, зубы и верхнюю губу крокодила по отдельности. Кроме того, при выставлении ордера необходимо передать параметр price, чтобы мы могли использовать цену закрытия в массиве K-line.

Шаг 7: Разместите order

position = get_position ()
if position == 0: # Если нет позиции
, если current_price> sma5: # Если текущая цена больше, чем биржа верхней губы
. SetDirection ("купить") # Задайте направление торговли и тип
биржи. Купить (current_price + 1, 1) # открыть ордер
на длинную позицию, если current_price <sma13: # Если текущая цена меньше биржи подбородка
. SetDirection ("sell") # Задайте направление торговли и тип
биржи. Sell (current_price-1, 1) # открыть короткую позицию,

если позиция> 0: # Если у вас есть длинные позиции
, если current_price <sma8: # Если текущая цена меньше зубы
биржи. SetDirection ("closebuy") # Задайте направление торговли и тип
биржи. Sell (current_price-1, 1) # закрыть длинную позицию

, если позиция <0: # Если у вас короткая позиция
, если current_price> sma8: # Если текущая цена больше, чем зубная
биржа. SetDirection ("closesell") # Задайте направление торговли и тип
биржи. Купить (current_price + 1, 1) # закрыть короткую позицию

Перед размещением ордера необходимо получить актуальную позицию. Функция get_position, которую мы определили ранее, вернет фактическое количество позиций. Если текущая позиция длинная, она вернет положительное число. Если текущая позиция короткая, она вернет отрицательное число. Если позиция отсутствует, возвращает значение 0. Наконец, функции покупки и продажи используются для выставления ордеров в соответствии с приведенной выше торговой логикой, но перед этим также необходимо задать направление и тип торговли.

Полная стратегия

'' 'backtest
start: 2019-01-01 00:00:00
end: 2020-01-01 00:00:00
Period: 1h
обменов: [{"eid": "Futures_CTP", "currency": "FUTURES"}]
'' '

import talib
import numpy as np


# Преобразуйте массив K-line в массив с самой высокой ценой, самой низкой ценой и ценой закрытия, используемой для конвертации в данные
типа numpy.array get_ данные (бары):
arr = []
для i в барах:
arr.append (i ['Close'])
return arr


# Получить количество позиций
def get_position ():
# Получить позицию
= 0 # Количество присвоенных позиций равно 0
position_arr = _C (обмен. GetPosition) # Получить массив позиций
, если len (position_arr)> 0: # Если длина массива позиций больше 0
для i в position_arr:
если i ['ContractType'] == 'rb000': # Если символ позиции равен символу
подписки, если i ['Type']% 2 == 0 : # Если это длинная
позиция = i ['Сумма'] # Назначить положительное количество позиций
else:
позиция = -i ['Сумма'] # Назначить отрицательное количество позиций возврата позиции


# Основная функция
стратегии def onTick ():
# извлечь данные
обмен. SetContractType ('rb000') # Подписаться на фьючерсные разновидности
bars_arr = биржа. GetRecords () # Получить массив
строк K, если len (bars_arr) <22: # Если количество строк K меньше 22
, return

# Вычисление
np_arr = np.array (get_data (bars_arr)) # Преобразование диапазона
цен закрытия sma13 = talib. СМА (np_arr, 130) [-9] # подбородок
sma8 = талиб. СМА (np_arr, 80) [-6] # зубов
sma5 = талиб. SMA (np_arr, 50) [-4] # верхняя губа
current_price = bars_arr [-1] ['Close'] # последняя ценовая

позиция = get_position ()
если позиция == 0: # Если нет позиции
, если current_price> sma5: # Если текущая цена больше, чем биржа верхней губы
. SetDirection ("купить") # Задайте направление торговли и тип
биржи. Купить (current_price + 1, 1) # открыть длинную позицию,
если current_price <sma13: # Если текущая цена меньше биржи подбородка
. SetDirection ("sell") # Задайте направление торговли и тип
биржи. Sell (current_price-1, 1) # открыть короткую позицию ордера

, если позиция> 0: # Если у вас есть длинные позиции
, если current_price <sma8: # Если текущая цена меньше зубной
биржи. SetDirection ("closebuy") # Задайте направление торговли и тип
биржи. Sell (current_price-1, 1) # закрыть длинную позицию

, если позиция <0: # Если у вас короткие позиции
, если current_price> sma8: # Если текущая цена больше зубной
биржи. SetDirection ("closesell") # Задайте направление торговли и тип
биржи. Купить (current_price + 1, 1) # закрыть короткую позицию


# Программа основная функция
def main ():
в то время как True: # loop
onTick () # стратегия выполнения основной функции
Sleep (1000) # sleep в течение 1 секунды

Непосредственно щелкните ссылку ниже, чтобы скопировать полную стратегию без настройки:
https://www.fmz.com/strategy/199025

Самая большая роль правила торговли крокодилами заключается в том, чтобы помочь нам поддерживать то же направление, что и рынок при торговле, независимо от того, как меняется текущая рыночная цена, и продолжать получать прибыль до тех пор, пока не появится рынок консолидации. Крокодиловая линия может хорошо использоваться с другими индикаторами MACD и KDJ.

Источник