A estratégia R-Breaker foi desenvolvida por Richard Saidenberg e publicada em 1994. Foi selecionada como uma das dez estratégias de negociação mais lucrativas pela revista
Simplificando, a estratégia R-Breaker é uma estratégia de suporte e resistência de preços. Ela calcula sete preços com base nos preços mais altos, mais baixos e de fechamento de ontem: um preço central (pivot) e três níveis de suporte (s1 s2, s3), três níveis de resistência (r1, r2, r3). Em seguida, de acordo com a relação posicional entre o preço atual e esses níveis de suporte e resistência, para formar as condições de gatilho para compra e venda, e através de um certo ajuste de algoritmo, ajuste a distância entre esses sete preços, altere ainda mais o valor de gatilho da transação.
Preço de compra de ruptura (nível de resistência r3) = preço mais alto de ontem + 2 * (preço central - preço mais baixo de ontem) / 2
Observação do preço de venda (nível de resistência r2) = preço central + (preço mais alto de ontem - preço mais baixo de ontem)
Preço de venda inverso (nível de resistência r1) = 2 * Preço central - preço mais baixo de ontem
Preço central (pivô) = (preço mais elevado de ontem + preço de encerramento de ontem + preço mais baixo de ontem) / 3
Preço de compra inverso (nível de apoio s1) = 2 * Preço central - preço mais elevado de ontem
Observação do preço de compra (nível de apoio s2) = preço central - (preço mais alto de ontem - preço mais baixo de ontem)
Preço de venda de ruptura (nível de suporte s3) = preço mais baixo de ontem - 2 * (preço mais alto de ontem - preço central)
A partir disso, podemos ver que a estratégia R-Breaker desenha uma linha de preço semelhante a uma grade com base no preço de ontem e atualiza essas linhas de preço uma vez por dia. Na análise técnica, os níveis de suporte e resistência e o papel dos dois podem ser convertidos um no outro. Quando o preço quebra com sucesso o nível de resistência, o nível de resistência se torna o nível de suporte; quando o preço quebra com sucesso o nível de suporte, o nível de suporte se torna o nível de resistência.
Na negociação real, esses níveis de suporte e resistência indicam ao comerciante a direção das posições de abertura e fechamento e os pontos de negociação precisos.
Em seguida, vamos ver como a estratégia R-Breaker usa esses níveis de suporte e resistência. Sua lógica não é complicada. Se não houver posição de retenção, entre no modo de tendência. Quando o preço for maior que o preço de compra de ruptura, abra a posição longa; quando o preço for menor que o preço de venda de ruptura, abra a posição curta.
posição longa aberta: se não houver posição de detenção e o preço for superior ao preço de compra de ruptura
posição curta aberta: se não houver posição de detenção e o preço for inferior ao preço de venda de ruptura
Fechar posição longa: se mantiver uma posição longa e o preço mais elevado do dia for superior ao preço de venda observado e o preço for inferior ao preço de venda inverso
posição curta de fechamento: se mantiver uma posição curta e o preço mais baixo do dia for inferior ao preço de compra observado e o preço for superior ao preço de compra inverso
posição longa aberta: se você mantiver uma posição curta e o preço mais baixo do dia for inferior ao preço de compra observado e o preço for superior ao preço de compra inverso
posição curta aberta: se você detém uma posição longa, e o preço mais alto do dia é maior do que o preço de venda observado e o preço é menor do que o preço de venda inverso
Fechar posição longa: se as posições longas forem mantidas e o preço for inferior ao preço de venda de ruptura
posição curta fechada: se a posição curta for mantida e o preço for superior ao preço de compra de ruptura
Se houver posições de detenção, ele entra no modo de reversão. Quando há posições de detenção longas, e o preço mais alto no dia é maior que o preço de venda de observação, e o preço cai abaixo do preço de venda inverso, a posição longa será fechada e a posição curta será aberta sincronicamente. Quando se mantém posições curtas, e o preço mais baixo do dia é menor que o preço de compra de observação, e o preço quebra o preço de compra inverso, a posição curta será fechada e a posição longa será aberta.
'''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
A estratégia completa foi publicada na plataforma FMZ (FMZ.COM), clique no link abaixo para copiá-lo diretamente, e você pode backtest sem configuração:https://www.fmz.com/strategy/187009
A razão pela qual a estratégia R-Breaker é popular é que não é puramente uma estratégia de rastreamento de tendências, mas uma estratégia composta para ganhar renda tanto em alfa de tendência quanto em alfa inversa. A estratégia neste artigo é apenas para demonstração, sem otimizar os parâmetros e variedades apropriados. Além disso, a estratégia completa também deve incluir a função stop loss, e amigos interessados podem melhorá-la.