R-Breaker戦略は,リチャード・サイデンバーグによって開発され,1994年に発表された.米国"Futures Truth"誌によって15年連続で最も収益性の高い取引戦略のトップ10に選ばれました.他の戦略と比較して,R-Breakerはトレンドとトレンド逆転を組み合わせる取引戦略です.大きな利益を得るためにトレンド市場を捕獲できるだけでなく,市場のトレンドが逆転すると,利益を得るためにイニシアティブを取ることができ,トレンド逆転を追跡することができます.
簡単に言うと,R-Breaker戦略は価格サポートとレジスタンス戦略です.昨日の最高値,最低値,閉値に基づいて7つの価格を計算します:中央価格 (ピボット) と3つのサポートレベル (s1 s2, s3),3つのレジスタンスレベル (r1, r2, r3). 次に,現在の価格とこれらのサポートとレジスタンスレベルとの位置関係に応じて,購入と販売のためのトリガー条件を形成し,あるアルゴリズム調整を通じて,これらの7つの価格間の距離を調整し,トランザクションのトリガー値をさらに変更します.
割引価格 (レジスタンスレベル r3) = 昨日の最高価格+2 * (中央価格 - 昨日の最低価格) /2
販売価格の観測 (レジスタンスレベル r2) = 中央価格 + (昨日の最高価格 - 昨日の最低価格)
逆売り価格 (レジスタンスレベル r1) = 2 * 中央価格 - 昨日の最低価格
中央価格 (ピボット) = (昨日の最高価格+昨日の閉値+昨日の最低価格) /3
逆購買価格 (サポートレベルs1) = 2 * 中央価格 - 昨日の最高価格
購入価格の観察 (サポートレベルs2) = 中央価格 - (昨日の最高価格 - 昨日の最低価格)
割引値 (サポートレベルs3) = 昨日の最低値 - 2 * (昨日の最高値 - 中央値)
このことから,R-Breaker戦略は,昨日の価格に基づいてグリッドのような価格ラインを描き,これらの価格ラインを1日1回更新することを見ることができます.技術分析では,サポートとレジスタンスレベル,および両者の役割は互いに変換することができます.価格がレジスタンスレベルを成功裏に破ると,レジスタンスレベルがサポートレベルになります.価格がサポートレベルを成功裏に破ると,サポートレベルがレジスタンスレベルになります.
実際の取引では,これらのサポートレベルとレジスタンスレベルは,トレーダーにオープンと閉鎖ポジションの方向と正確な取引ポイントを指示します. 特定の開閉条件を持つトレーダーは,日内価格,中央価格,レジスタンスレベル,サポートレベルに応じて柔軟にカスタマイズすることができ,またこれらのグリッド価格ラインに基づいてポジションを管理することができます.
次に,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"}]
'''
# 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
FMZのプラットフォームで公開されています (FMZ.COM設定なしでバックテストすることができます:https://www.fmz.com/strategy/187009
R-Breaker戦略が人気がある理由は,純粋にトレンド追跡戦略ではなく,トレンドアルファと逆アルファの両方の収益を得るための複合戦略である.この記事の戦略は,適切なパラメータと多様性を最適化することなく,デモのみである.さらに,完全な戦略にはストップ損失機能も含まれ,興味のある友人はそれを改善することができます.