Strategi R-Breaker telah dibangunkan oleh Richard Saidenberg dan diterbitkan pada tahun 1994. Ia telah dipilih sebagai salah satu daripada sepuluh strategi perdagangan yang paling menguntungkan oleh majalah
Secara ringkasnya, strategi R-Breaker adalah strategi sokongan dan rintangan harga. Ia mengira tujuh harga berdasarkan harga tertinggi, terendah dan penutupan semalam: harga pusat (pivot) dan tiga tahap sokongan (s1 s2, s3), tiga tahap rintangan (r1, r2, r3). Kemudian mengikut hubungan kedudukan antara harga semasa dan tahap sokongan dan rintangan ini, untuk membentuk keadaan pencetus untuk membeli dan menjual, dan melalui penyesuaian algoritma tertentu, sesuaikan jarak antara tujuh harga ini, ubah nilai pencetus urus niaga.
Harga beli pecah (tahap rintangan r3) = harga tertinggi semalam + 2 * (harga pusat - harga terendah semalam) / 2
Harga jualan yang diperhatikan (tahap rintangan r2) = harga pusat + (harga tertinggi semalam - harga terendah semalam)
Harga jual terbalik (tahap rintangan r1) = 2 * Harga pusat - harga terendah semalam
Harga pusat (pivot) = (harga tertinggi semalam + harga penutupan semalam + harga terendah semalam) / 3
Harga beli terbalik (tahap sokongan s1) = 2 * Harga pusat - harga tertinggi semalam
Harga pembelian yang diperhatikan (tahap sokongan s2) = harga pusat - (harga tertinggi semalam - harga terendah semalam)
Harga jualan pecah (tahap sokongan s3) = harga terendah semalam - 2 * (harga tertinggi semalam - harga pusat)
Dari sini kita dapat melihat bahawa strategi R-Breaker menarik garis harga seperti grid berdasarkan harga semalam, dan mengemas kini garis harga ini sekali sehari. Dalam analisis teknikal, tahap sokongan dan rintangan, dan peranan keduanya dapat ditukar satu sama lain. Apabila harga berjaya memecahkan tahap rintangan, tahap rintangan menjadi tahap sokongan; apabila harga berjaya memecahkan tahap sokongan, tahap sokongan menjadi tahap rintangan.
Dalam perdagangan sebenar, tahap sokongan dan rintangan ini menunjukkan kepada peniaga arah pembukaan dan penutupan kedudukan dan titik perdagangan yang tepat. Pedagang dengan syarat pembukaan dan penutupan tertentu dapat menyesuaikan dengan fleksibel mengikut harga intraday, harga pusat, tahap rintangan, dan tahap sokongan, dan juga boleh menguruskan kedudukan berdasarkan garis harga grid ini.
Kemudian, mari kita lihat bagaimana strategi R-Breaker menggunakan tahap sokongan dan rintangan ini. Logiknya sama sekali tidak rumit. Jika tidak ada kedudukan pegangan, masukkan mod trend. Apabila harga lebih besar daripada harga pembelian terobosan, buka kedudukan panjang; apabila harga kurang daripada harga penjualan terobosan, buka kedudukan pendek.
Posisi panjang terbuka: jika tidak ada kedudukan pegangan dan harga lebih tinggi daripada harga pembelian terobosan
Posisi pendek terbuka: jika tidak ada kedudukan pegangan dan harga adalah lebih rendah daripada harga jualan terobosan
tutup kedudukan panjang: jika anda memegang kedudukan panjang, dan harga tertinggi hari ini adalah lebih besar daripada harga jualan pemerhatian dan harga adalah lebih rendah daripada harga jualan terbalik
close short position: jika anda memegang kedudukan pendek, dan harga terendah hari ini adalah lebih rendah daripada harga pembelian yang diperhatikan dan harga lebih besar daripada harga pembelian terbalik
kedudukan panjang terbuka: jika anda memegang kedudukan pendek, dan harga terendah hari ini adalah kurang daripada harga pembelian pemerhatian dan harga adalah lebih besar daripada harga pembelian terbalik
kedudukan pendek terbuka: jika anda memegang kedudukan panjang, dan harga tertinggi hari ini adalah lebih besar daripada harga jualan pemerhatian dan harga adalah lebih rendah daripada harga jualan terbalik
Posisi panjang ditutup: jika kedudukan panjang dipegang dan harga adalah lebih rendah daripada harga jualan terobosan
Posisi pendek yang ditutup: jika kedudukan pendek dipegang dan harga lebih tinggi daripada harga pembelian terobosan
Jika terdapat kedudukan memegang, ia memasuki mod pembalikan. Apabila terdapat kedudukan memegang panjang, dan harga tertinggi pada hari itu lebih besar daripada harga jualan pemerhatian, dan harga jatuh di bawah harga jualan terbalik, kedudukan panjang akan ditutup dan kedudukan pendek akan dibuka secara serentak. Apabila memegang kedudukan pendek, dan harga terendah hari ini adalah kurang daripada harga pembelian pemerhatian, dan harga memecahkan harga pembelian terbalik, kedudukan pendek akan ditutup dan kedudukan panjang akan dibuka.
'''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
Strategi lengkap telah diterbitkan di platform FMZ (FMZ.COM), klik pautan di bawah untuk menyalin secara langsung, dan anda boleh backtest tanpa konfigurasi:https://www.fmz.com/strategy/187009
Strategi R-Breaker popular kerana ia bukan semata-mata strategi pengesanan trend, tetapi merupakan strategi gabungan untuk memperoleh kedua-dua pendapatan trend alpha dan alpha terbalik. Strategi dalam artikel ini hanya untuk demonstrasi, tanpa mengoptimumkan parameter dan varieti yang sesuai. Di samping itu, strategi lengkap juga mesti merangkumi fungsi stop loss, dan rakan-rakan yang berminat dapat memperbaikinya.