一、摘要
R-Breaker策略由Richard Saidenberg開發,並於1994年公布於世。在之后連續十五年被美國《Futures Truth》雜志評選為前十大最賺錢的交易策略之一。與其他策略相比,R-Breaker是趨勢與反轉相結合的交易策略。不僅可以捕捉趨勢行情獲得大利潤,還可以在行情反轉的時候,及時主動止盈並順勢反手。
二、阻力位與支撐位
簡單的說,R-Breaker策略就是一個支撐位和阻力位策略,它根據昨日的最高價、最低價和收盤價,計算出七個價格:一個中心價(pivot)、三個支撐位(s1、s2、s3)、三個阻力位(r1、r2、r3)。然后根據當前價格與這些支撐位和阻力位的位置關系,以形成買賣的觸發條件,並且通過一定的算法調整,調節這七個價格之間的距離,進一步改變交易的觸發值。
- 突破買入價(阻力位r3) = 昨日最高價 + 2 *(中心價 - 昨日最低價)2
- 觀察賣出價(阻力位r2) = 中心價 +(昨日最高價-昨日最低價)
- 反轉賣出價(阻力位r1) = 2 * 中心價 - 昨日最低價
- 中心價(pivot) =(昨日最高價 + 昨日收盤價 + 昨日最低價)/ 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"}] ''' # 策略主函數 def onTick(): # 獲取數據 exchange.SetContractType(contract_type) # 訂閱期貨品種 bars_arr =exchange.GetRecords(PERIOD_D1) # 獲取日K線數組 if len(bars_arr) < 2: # 如果K線數量小於2根 return yesterday_open = bars_arr[-2]['Open'] # 昨日開盤價 yesterday_high = bars_arr[-2]['High'] # 昨日最高價 yesterday_low = bars_arr[-2]['Low'] # 昨日最低價 yesterday_close = bars_arr[-2]['Close'] # 昨日收盤價 # 計算 pivot = (yesterday_high + yesterday_close + yesterday_low) / 3 # 樞軸點 r1 = 2 * pivot - yesterday_low # 阻力位1 r2 = pivot + (yesterday_high - yesterday_low) # 阻力位2 r3 = yesterday_high + 2 * (pivot - yesterday_low) # 阻力位3 s1 = 2 * pivot - yesterday_high # 支撐位1 s2 = pivot - (yesterday_high - yesterday_low) # 支撐位2 s3 = yesterday_low - 2 * (yesterday_high - pivot) # 支撐位3 today_high = bars_arr[-1]['High'] # 今日最高價 today_low = bars_arr[-1]['Low'] # 今日最低價 current_price = _C(exchange.GetTicker).Last #當前價格 # 獲取持倉 position_arr = _C(exchange.GetPosition) # 獲取持倉數組 if len(position_arr) > 0: # 如果持倉數組長度大於0 for i in position_arr: if i['ContractType'] == contract_type: # 如果持倉品種等於訂閱品種 if i['Type'] % 2 == 0: # 如果是多單 position = i['Amount'] # 賦值持倉數量為正數 else: position = -i['Amount'] # 賦值持倉數量為負數 profit = i['Profit'] # 獲取持倉盈虧 else: position = 0 # 賦值持倉數量為0 profit = 0 # 賦值持倉盈虧為0 if position == 0: # 如果無持倉 if current_price > r3: # 如果當前價格大於阻力位3 exchange.SetDirection("buy") # 設置交易方向和類型 exchange.Buy(current_price + 1, 1) # 開多單 if current_price < s3: # 如果當前價格小於支撐位3 exchange.SetDirection("sell") # 設置交易方向和類型 exchange.Sell(current_price - 1, 1) # 開空單 if position > 0: # 如果持有多單 if today_high > r2 and current_price < r1 or current_price < s3: # 如果今日最高價大於阻力位2,並且當前價格小於阻力位1 exchange.SetDirection("closebuy") # 設置交易方向和類型 exchange.Sell(current_price - 1, 1) # 平多單 exchange.SetDirection("sell") # 設置交易方向和類型 exchange.Sell(current_price - 1, 1) # 反手開空單 if position < 0: # 如果持有空單 if today_low < s2 and current_price > s1 or current_price > r3: # 如果今日最低價小於支撐位2,並且當前價格大於支撐位1 exchange.SetDirection("closesell") # 設置交易方向和類型 exchange.Buy(current_price + 1, 1) # 平空單 exchange.SetDirection("buy") # 設置交易方向和類型 exchange.Buy(current_price + 1, 1) # 反手開多單 # 程序主函數 def main(): while True: # 循環 onTick() # 執行策略主函數 Sleep(1000) # 休眠1秒
五、復制完整策略
完整策略已經發布到發明者量化(FMZ.COM)中,點擊下面鏈接直接復制,無需配置即可回測:
https://www.fmz.com/strategy/187009
六、總結
R-Breaker策略之所以流行,關鍵在於它並不是純粹到趨勢跟蹤類策略,而是以復合型策略同時賺取趨勢的alpha和反轉的alpha收益。本文的策略只是作為演示,沒有優化合適的參數和品種,另外完整的策略也必須包含止損功能,感興趣的朋友可以加以改進。