Фьючерсы на сырьевые товары Стратегия R-Breaker

Автор:Доброта, Создано: 2020-06-02 08:57:10, Обновлено: 2023-11-02 19:52:44

img

Резюме

Стратегия R-Breaker была разработана Ричардом Сайденбергом и опубликована в 1994 году. Она была выбрана одной из десяти самых прибыльных торговых стратегий журналом Futures Truth в Соединенных Штатах в течение 15 лет подряд. По сравнению с другими стратегиями, R-Breaker является торговой стратегией, которая сочетает в себе тренд и обратный тренд.

Сопротивление и поддержка

Проще говоря, стратегия R-Breaker - это стратегия ценовой поддержки и сопротивления. Она рассчитывает семь цен на основе вчерашних самых высоких, самых низких и закрывающих цен: центральную цену (пиvot) и три уровня поддержки (s1 s2, s3), три уровня сопротивления (r1, r2, r3). Затем в соответствии с позиционной связью между текущей ценой и этими уровнями поддержки и сопротивления, чтобы сформировать триггерные условия для покупки и продажи, и посредством определенной корректировки алгоритма, скорректировать расстояние между этими семью ценами, далее изменять триггерное значение сделки.

  • Прорыв покупательной цены (уровень сопротивления r3) = вчерашняя самая высокая цена + 2 * (центральная цена - вчерашняя самая низкая цена) / 2

  • Наблюдение за продажной ценой (уровень сопротивления r2) = центральная цена + (вчерашняя самая высокая цена - вчерашняя самая низкая цена)

  • Обратная цена продажи (уровень сопротивления r1) = 2 * Центрная цена - вчерашняя самая низкая цена

  • Центральная цена (основной) = (вчерашняя высокая цена + вчерашняя закрывающая цена + вчерашняя нижняя цена) / 3

  • Обратная цена покупки (уровень поддержки 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 заключается в том, что она не является исключительно стратегией отслеживания тренда, а составной стратегией для получения как альфа-прибыли от тренда, так и обратного альфа-прибыли. Стратегия в этой статье предназначена только для демонстрации, без оптимизации соответствующих параметров и разновидностей. Кроме того, полная стратегия также должна включать функцию остановки потери, и заинтересованные друзья могут улучшить ее.


Связанные

Больше