1. 程式人生 > 其它 >商品期貨R-Breaker策略

商品期貨R-Breaker策略


R-Breaker策略由Richard Saidenberg開發,並於1994年公佈於世。在之後連續十五年被美國《Futures Truth》雜誌評選為前十大最賺錢的交易策略之一。與其他策略相比,R-Breaker是趨勢與反轉相結合的交易策略。不僅可以捕捉趨勢行情獲得大利潤,還可以在行情反轉的時候,及時主動止盈並順勢反手。

簡單的說,R-Breaker策略就是一個支撐位和阻力位策略,它根據昨日的最高價、最低價和收盤價,計算出七個價格:一箇中心價(pivot)、三個支撐位(s1、s2、s3)、三個阻力位(r1r2、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秒
各類量化機器人系統開發:17166570329