商品期貨R-Breaker策略
阿新 • • 發佈:2021-08-11
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: #