Стратегия R-Breaker была разработана Ричардом Сайденбергом и опубликована в 1994 году. Она была выбрана одной из десяти самых прибыльных торговых стратегий журналом
Проще говоря, стратегия R-Breaker - это стратегия ценовой поддержки и сопротивления. Она рассчитывает семь цен на основе вчерашних самых высоких, самых низких и закрывающих цен: центральную цену (пиvot) и три уровня поддержки (s1 s2, s3), три уровня сопротивления (r1, r2, r3). Затем в соответствии с позиционной связью между текущей ценой и этими уровнями поддержки и сопротивления, чтобы сформировать триггерные условия для покупки и продажи, и посредством определенной корректировки алгоритма, скорректировать расстояние между этими семью ценами, далее изменять триггерное значение сделки.
Прорыв покупательной цены (уровень сопротивления r3) = вчерашняя самая высокая цена + 2 * (центральная цена - вчерашняя самая низкая цена) / 2
Наблюдение за продажной ценой (уровень сопротивления r2) = центральная цена + (вчерашняя самая высокая цена - вчерашняя самая низкая цена)
Обратная цена продажи (уровень сопротивления r1) = 2 * Центрная цена - вчерашняя самая низкая цена
Центральная цена (основной) = (вчерашняя
Обратная цена покупки (уровень поддержки s1) = 2 * Центральная цена - вчерашняя
Наблюдение за ценой покупки (уровень поддержки s2) = центральная цена - (вчерашняя самая высокая цена - вчерашняя самая низкая цена)
Проходная цена продажи (уровень поддержки s3) = вчерашняя самая низкая цена - 2 * (вчерашняя самая высокая цена - средняя цена)
Из этого мы можем увидеть, что стратегия R-Breaker рисует сетку, похожую на ценовую линию, основанную на цене вчерашнего дня, и обновляет эти ценовые линии один раз в день. В техническом анализе уровни поддержки и сопротивления и роль обоих могут быть конвертированы друг в друга. Когда цена успешно преодолевает уровень сопротивления, уровень сопротивления становится уровнем поддержки; когда цена успешно преодолевает уровень поддержки, уровень поддержки становится уровнем сопротивления.
При фактической торговле эти уровни поддержки и сопротивления указывают трейдеру направление открытия и закрытия позиций и точные точки торговли.
Далее, давайте посмотрим, как стратегия R-Breaker использует эти уровни поддержки и сопротивления. Ее логика совсем не сложна. Если нет держательной позиции, введите трендный режим. Когда цена больше покупной цены прорыва, откройте длинную позицию; когда цена меньше продажной цены прорыва, откройте короткую позицию.
открытая длинная позиция: если нет держащей позиции, а цена выше цены покупки прорыва
открытая короткая позиция: если нет позиции удержания и цена ниже цены прорыва
закрыть длинную позицию: если вы держите длинную позицию, и самая высокая цена дня больше наблюдаемой цены продажи, а цена меньше обратной цены продажи.
закрыть короткую позицию: если вы держите короткую позицию, и самая низкая цена дня меньше, чем наблюдаемая цена покупки, а цена больше, чем обратная цена покупки
открытая длинная позиция: если вы держите короткую позицию, и самая низкая цена дня меньше наблюдаемой покупной цены, а цена больше обратной покупной цены
Открыть короткую позицию: если вы держите длинную позицию, и самая высокая цена дня больше наблюдаемой цены продажи, а цена меньше обратной цены продажи.
закрытие длинной позиции: если длинные позиции удерживаются и цена ниже цены прорыва
закрытие короткой позиции: если удерживается короткая позиция и цена превышает цену покупки прорыва;
Если удерживаются позиции, он входит в режим обратного движения. Когда удерживаются длинные позиции, и самая высокая цена в день больше, чем наблюдаемая цена продажи, и цена падает ниже обратной цены продажи, длинная позиция будет закрыта, а короткая позиция будет открыта синхронно. Когда удерживаются короткие позиции, и самая низкая цена дня меньше, чем наблюдаемая цена покупки, и цена проходит через обратную цену покупки, короткая позиция будет закрыта, а длинная позиция будет открыта.
'''backtest
start: 2019-01-01 00:00:00
end: 2020-01-01 00:00:00
period: 5m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''
# Strategy main function
def onTick():
# retrieve data
exchange.SetContractType(contract_type) # Subscribe to futures products
bars_arr = exchange.GetRecords(PERIOD_D1) # Get daily K line array
if len(bars_arr) < 2: # If the number of K lines is less than 2
return
yesterday_open = bars_arr[-2]['Open'] # Yesterday's opening price
yesterday_high = bars_arr[-2]['High'] # Yesterday's highest price
yesterday_low = bars_arr[-2]['Low'] # Yesterday's lowest price
yesterday_close = bars_arr[-2]['Close'] # Yesterday's closing price
# Calculation
pivot = (yesterday_high + yesterday_close + yesterday_low) / 3 # Pivot point
r1 = 2 * pivot - yesterday_low # Resistance level 1
r2 = pivot + (yesterday_high - yesterday_low) # Resistance level 2
r3 = yesterday_high + 2 * (pivot - yesterday_low) # Resistance level 3
s1 = 2 * pivot - yesterday_high # Support level 1
s2 = pivot - (yesterday_high - yesterday_low) # Support level 2
s3 = yesterday_low - 2 * (yesterday_high - pivot) # Support level 3
today_high = bars_arr[-1]['High'] # Today's highest price
today_low = bars_arr[-1]['Low'] # Today's lowest price
current_price = _C(exchange.GetTicker).Last # Current price
# Get positions
position_arr = _C(exchange.GetPosition) # Get array of positions
if len(position_arr) > 0: # If the position array length is greater than 0
for i in position_arr:
if i['ContractType'] == contract_type: # If the position variety equals the subscription variety
if i['Type'] % 2 == 0: # If it is long position
position = i['Amount'] # The number of assigned positions is positive
else:
position = -i['Amount'] # The number of assigned positions is negative
profit = i['Profit'] # Get position profit and loss
else:
position = 0 # The number of assigned positions is 0
profit = 0 # The value of the assigned position is 0
if position == 0: # If there is no position
if current_price > r3: # If the current price is greater than Resistance level 3
exchange.SetDirection("buy") # Set transaction direction and type
exchange.Buy(current_price + 1, 1) # open long position
if current_price < s3: # If the current price is less than Support level 3
exchange.SetDirection("sell") # Set transaction direction and type
exchange.Sell(current_price - 1, 1) # open short position
if position > 0: # if holding long position
if today_high > r2 and current_price < r1 or current_price < s3: # If today's highest price is greater than Resistance level 2, and the current price is less than Resistance level 1
exchange.SetDirection("closebuy") # Set transaction direction and type
exchange.Sell(current_price - 1, 1) # close long position
exchange.SetDirection("sell") # Set transaction direction and type
exchange.Sell(current_price - 1, 1) # open short position
if position < 0: # if holding short position
if today_low < s2 and current_price > s1 or current_price > r3: # If today's lowest price is less than Support level 2, and the current price is greater than Support level 1
exchange.SetDirection("closesell") # Set transaction direction and type
exchange.Buy(current_price + 1, 1) # close short position
exchange.SetDirection("buy") # Set transaction direction and type
exchange.Buy(current_price + 1, 1) # open long position
# Program main function
def main():
while True: # loop
onTick() # Execution strategy main function
Sleep(1000) # Sleep for 1 second
Полная стратегия опубликована на платформе FMZ (FMZ.COM), нажмите на ссылку ниже, чтобы скопировать его напрямую, и вы можете сделать обратный тест без настройки:https://www.fmz.com/strategy/187009
Причина популярности стратегии R-Breaker заключается в том, что она не является исключительно стратегией отслеживания тренда, а составной стратегией для получения как альфа-прибыли от тренда, так и обратного альфа-прибыли. Стратегия в этой статье предназначена только для демонстрации, без оптимизации соответствующих параметров и разновидностей. Кроме того, полная стратегия также должна включать функцию остановки потери, и заинтересованные друзья могут улучшить ее.