相対体指数クロスオーバー戦略

作者: リン・ハーンチャオチャン,日付: 2023年10月18日 11:16:53
タグ:

img

概要

この戦略は,主に,自動取引のためのストップ・ロストと得益とともに,トレンドを決定するために,日々のキャンドルストイックの相対ボディ比 (RB) の移動平均クロスオーバー信号を使用する.戦略名における"相対ボディ強度"は,日々のキャンドルストイックの相対ボディ強さの移動平均を指す.

戦略の論理

この戦略は,VitelotのRBI指標に基づいており,日々のキャンドルスタイルの相対体比 (RB) の移動平均を計算する.RBは以下のように計算される.

この式は,上昇するキャンドルの実際の体とキャンドルの全長の比率を計算し,ポジティブな値と下落するキャンドルのマイナスの値を取ります. RBは -1 から 1 までの範囲です.

RBIインジケーターは,RBの移動平均値を活用してノイズをフィルタリングし,市場のトレンドの本質を把握する.RBIが信号線を横切ると購入信号が生成され,以下を横切ると販売信号が生成される.

不確実な上昇期間の誤った信号を避けるため,ストラテジーは,ロングポジションの真の買い信号を生成する前に,閉じる価格が13期 EMAを超えるかどうかをチェックします.同様に,閉じる価格が13期 EMA以下の場合にのみショートポジションが実行されます.

この戦略では,リスクを制御し利益をロックするためにストップ・ロスを実施し,利益を取ります. ポジションを開いた後,利益は設定ポイントに基づいて追跡され,ポイントで固定ストップ・ロスはあります.

利点分析

  • RBIは大きな騒音をフィルターで排除し,市場傾向の特徴を把握し,様々な市場からの誤った信号を回避します.

  • 移動平均フィルターを使用することで,不確実な上昇期間に誤った信号を効果的に回避し,ショートからの損失を減らすことができます.

  • ストップ・ロストと/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または/または

  • この戦略はパラメータが少ないし 簡単に理解し 自動取引に適しています

リスク分析

  • この戦略は RBI にのみ依存しており 指標からの誤った信号は失敗につながる可能性があります

  • 指標のパラメータ調節が不十分であれば,取引信号の質も悪化する可能性があります.

  • 特定の市場条件下では 損失を完全に回避できる技術指標はない.

  • ストップ・ロスの設定が狭すぎると,ストップ・アウトが頻繁すぎたり,幅が広すぎると,単一のポジションで大きな損失が生じる可能性があります.

  • 引き上げの管理が不十分なら 口座の消去リスクが生じます

オプティマイゼーションの方向性

  • RBI パラメータを最適化するために,異なるパラメータ組み合わせをテストすることができます.

  • 信号のフィルタリングと質の改善のために追加の指標を追加できます

  • 機械学習はストップ・ロストと取利益パラメータを訓練し最適化するために使用できます

  • リスク管理戦略が追加され,全体的なポジションサイズとリスク露出を制御できます.

  • オーバーナイト・ホールディングや短期・スカルピングなど 異なる保有期間も検討できる.

結論

一般的に,これは比較的シンプルで直接的なトレンドフォロー戦略である.これはトレンド方向を決定するためにRBIクロスオーバーを使用し,追加のフィルターとストップ・ロスト/テイク・プロフィートを使用してリスクを制御し,さまざまな市場からの誤った信号を効果的に回避する.しかし,技術指標はリスクを完全に回避することはできません.パラメータ最適化,リスク管理などの継続的な改善は,長期にわたる安定した過剰収益のために依然として必要である.論理は明確で理解が容易で,自動取引に適しています.これは非常に実践的なトレンドフォロー戦略です.


/*backtest
start: 2022-10-11 00:00:00
end: 2023-10-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("RBI Backtest /w TSSL", shorttitle="RBI Strategy", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 10000, slippage = 5)
// RBI:
//  The EMA of the relative body (RB) of Japanese candles is evaluated.
//  The RB of a candle (my definition) is simply the ratio of the body with respect to its full length
//  and taken positive for bull candles and negative for bear candles:
//      e.g. a bull "marubozo" has RB=1 a bear "marubozo" has RB=-1;
//      a "doji" has RB=0.
//  This simple indicator grasps the essence of the market by filtering out a great deal of noise.
//
//  A flag can be selected to calculate its very basic binary version, where a bull candle counts as a one
//  and a bear candle counts as a minus one.
//
//  Enter (or exit) the market when the signal line crosses the base line.
//  When the market is choppy we have a kind of alternating bear and bull candles so that
//  RBI is FLAT and usually close to zero. 
//  Therefore avoid entering the market when RBI is FLAT and INSIDE the Exclusion level.
//  The exclusion level is to be set by hand: go back in history and check when market was choppy; a good
//  way to set it is to frame the oscillations of RBI whe price was choppy.
//
//  RBI is more effective when an EMA of price is used as filtering. I found EMA(13) to be
//  a decent filter: go long when base crosses signal upwards AND closing price is above EMA(13);
//  same concept for going short.
//
//  As any other indicator, use it with responsibility: THERE CAN'T BE A SINGLE MAGIC INDICATOR winning
//  all trades.
//
//  Above all, have fun.
//
// Vitelot/Yanez/Vts March 31, 2019

par1 = input(5, title="MA1 Period")
par2 = input(5, title="Signal Period")
exclusion = input(0.2, title="Exclusion level")

useBin = input(false, title="Calculate the binary version")

treshold_long = input(0, title="Treshold Long")
treshold_short = input(0, title="Treshold Short")

fixedSL = input(title="SL Activation", defval=300)
trailSL = input(title="SL Trigger", defval=1)
fixedTP = input(title="TP Activation", defval=120)
trailTP = input(title="TP Trigger", defval=1)

FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 19, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
startTimeOk()  => true // create function "within window of time" if statement true

ynSimple(t) =>
    s = (close>open)? 1: -1
    ema(sum(s,t),t)

ynRel(t) =>
    s = (close-open)/(high-low)
    ema(sum(s,t),t)

yn = useBin? ynSimple(par1): ynRel(par1) 
sig = ema(yn,par2)


plot(yn, color=aqua, title="RBI", linewidth=3, transp=0)
plot(sig, color=orange, title="Signal", linewidth=2, transp=0)

hline(0, color=white, title="Zero level", editable=false)
hline(exclusion, color=yellow, title="Exclusion level +", editable=true, linestyle=line)
hline( 0-exclusion, color=yellow, title="Exclusion level -", editable=true, linestyle=line)

long = crossover(yn,sig) and yn < treshold_long
short = crossover(sig,yn)  and yn > treshold_short

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry("Long", strategy.long, when= long and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) 
strategy.exit("Exit", when= short)
// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry("Short", strategy.short, when= short and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= long)


もっと