
この戦略は,二重RSI指標を使用し,長短二方向取引を行い,同時に均線システムと組み合わせてトレンドの方向を判断し,二重RSI定量化戦略に属します.この戦略は,まず,RSI指標を使用して多空信号を判断し,次に均線と組み合わせてトレンドの方向を判断し,多空を決定し,典型的なトレンドフォロー戦略に属します.
二重RSI量化戦略は,主に二時間周期RSI指標を取引信号判断のために使用する.戦略は,最初に2つのRSIパラメータを設定し,より長い周期が主取引判断として,より短い周期が補助フィルターとして使用する.より長い周期RSIラインの下では,セールラインを破るときに多信号を生じ,短い周期RSIライン上では,購入ラインを破るときに空調信号を生じ,二重RSI指標の長さのショートクロス取引機会を形成する.
偽信号をフィルターするために,戦略はまた,SMAとEMA平均を導入し,トレンド判断を行う.短期のSMAラインが長期EMAラインを穿越するときにのみ,RSIの多信号を考慮し,短期のSMAラインの下の長期EMAラインを穿越するときにのみ,RSIの空き信号を考慮し,双RSIの信号がトレンド方向に一致することを確認し,反トレンドの取引を避ける.
さらに,ストップ・ストップの論理を設定する. ポジション開設後,同時に2つの異なる数のストップ・ストップのカードを下し,ストップ・ストップの位置を設定する.
双RSI量化戦略には以下の利点があります.
双時間周期RSI指標は多空信号をより正確に判断できる.長短周期RSIのクロス組み合わせは,部分的な偽信号をフィルターして信号品質を向上させることができる.
均線システムは,大きなトレンドの方向を判断し,反トレンドの取引を避け,ほとんどのノイズ取引をフィルターし,勝利率を上げることができます.
柔軟なストップ・ストップ・メカニズムにより,異なるストップ設定により,より高い利益を得ることができ,また,リスクを制御するためにストップ・ストップすることもできます.
戦略的な取引の論理は,単純で明快で,容易に理解し,最適化され,量化トレーダーに学ぶのに適しています.
双RSIの定量化戦略にはいくつかの利点がありますが,以下のリスクがあります.
RSI指数自体は,波動やトレンドの逆転の判断に効果がないため,これらの市場での戦略の取引効果は良くない可能性があります.
均線システムは,小範囲のノイズをフィルタリングできるが,中間周期のトレンド変化の判断は不十分であり,トレンド転換点を逃す可能性がある.
ストップ・ロスの設定が不適切である場合,ストップ・ロスがあまりにも広いかストップ・ロスがあまりにも小さいことが起こり,戦略の効果が低下する.
大規模な空調や過剰空調は,損失の拡大につながる可能性があるため,ポジションの規模を制御する必要があります.
上記のリスクに対して,RSIパラメータを調整し,より高度なトレンドと逆転指標を導入し,ストップ・ストップ・ロスのロジックを最適化し,ポジションを制御することでリスクを軽減することができます.
双RSIの量化戦略は,以下の方向からさらに最適化できます.
異なるパラメータの組み合わせを試し,RSI周期パラメータを最適化して,最適な長短周期RSI指標の組み合わせを見つけます.
異なる平均線指標をテストし,MACDなどの指標を導入し,トレンドと逆転の機会を判断する.
ストップ・ストップ・ストップの戦略を最適化して,ストップ・ストップの柔軟性を高めるために,ストップ・ストップを追跡するストップまたは移動ストップを設定します.
ポジションコントロールモジュールを追加し,大周期トレンドの異なる段階で空白ポジションをコントロールする.
機械学習モデルの追加により,エントリーとエグジットの精度が向上する.
分析と最適化により,最適の取引品種とタイミングを特定する.
双RSI定量化戦略は全体として典型的なトレンド追跡戦略である.双RSI指標を判断する取引信号と均線システムフィルターノイズを融合した戦略的考え方は非常に古典的で実用的である.戦略にも一定の改善の余地があるが,全体的な運行ロジックは明確で,容易に理解し,最適化できる.これは,量化取引初心者の学習と実践に適した戦略である.Practice makes perfectの原則によって,この戦略を継続的に最適化して代することで,安定した取引結果を得ることができる.
/*backtest
start: 2023-11-07 00:00:00
end: 2023-11-14 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Growth Producer", overlay=true, initial_capital = 1000, currency = "USD", pyramiding = 2, commission_type=strategy.commission.percent, commission_value=0.07, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)
//Functions
Atr(p) =>
atr = 0.
Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
atr := nz(atr[1] + (Tr - atr[1])/p,Tr)
/// TREND
ribbon_period = input(19, "Period", step=1)
leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)
p1 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p2 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p1, p2, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)
// Relative volatility index
length = input(120,"RVI period", minval=1), src = close
len = 14
stddev = stdev(src, length)
upper = ema(change(src) <= 0 ? 0 : stddev, len)
lower = ema(change(src) > 0 ? 0 : stddev, len)
rvi = upper / (upper + lower) * 100
benchmark = input(35, "RVI benchmark", minval=10, maxval=100, step=0.1)
// Plot RVI
// h0 = hline(80, "Upper Band", color=#C0C0C0)
// h1 = hline(20, "Lower Band", color=#C0C0C0)
// fill(h0, h1, color=#996A15, title="Background")
// offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
// plot(rvi, title="RVI", color=#008000, offset = offset)
/// MFI input
mfi_source = hlc3
mfi_length = input(19, "MFI Length", minval=1)
mfi_lower = input(15, "MFI Lower level", minval=0, maxval=50)
mfi_upper = input(90, "MFI Higher level", minval=50, maxval=100)
// MFI
upper_s = sum(volume * (change(mfi_source) <= 0 ? 0 : mfi_source), mfi_length)
lower_s = sum(volume * (change(mfi_source) >= 0 ? 0 : mfi_source), mfi_length)
mf = rsi(upper_s, lower_s)
// mfp = plot(mf, color=color.new(color.gray,0), linewidth=1)
// top = hline(mfi_upper, color=color.new(color.gray, 100), linewidth=1, editable=false)
// bottom = hline(mfi_lower, color=color.new(color.gray,100), linewidth=1, editable=false)
// hline(0, color=color.new(color.black,100), editable=false)
// hline(100, color=color.new(color.black,100), editable=false)
// Breaches
// b_color = (mf > mfi_upper) ? color.new(color.red,70) : (mf < mfi_lower) ? color.new(color.green,60) : na
// bgcolor(HighlightBreaches ? b_color : na)
// fill(top, bottom, color=color.gray, transp=75)
// Initial inputs
Act_RSI_VWAP_long = input(true, "RSI VOLUME WEIGHTED AVERAGE PRICE LONG")
RSI_VWAP_length_long = input(16, "RSI-VWAP LENGTH LONG")
RSI_VWAP_overSold_long = input(13, "RSI-VWAP OVERSOLD LONG", type=input.float)
RSI_VWAP_overBought_long = input(68, "RSI-VWAP OVERBOUGHT LONG", type=input.float)
Act_RSI_VWAP_short = input(true, "RSI VOLUME WEIGHTED AVERAGE PRICE SHORT")
RSI_VWAP_length_short = input(14, "RSI-VWAP LENGTH SHORT")
RSI_VWAP_overSold_short = input(7, "RSI-VWAP OVERSOLD SHORT", type=input.float)
RSI_VWAP_overBought_short = input(68, "RSI-VWAP OVERBOUGHT SHORT", type=input.float)
// RSI with VWAP as source
RSI_VWAP_long = rsi(vwap(close), RSI_VWAP_length_long)
RSI_VWAP_short = rsi(vwap(close), RSI_VWAP_length_short)
// Plot Them Separately.
// Plotting LONG, Put overlay=false
// r=plot(RSI_VWAP_long, color = RSI_VWAP_long > RSI_VWAP_overBought_long ? color.red : RSI_VWAP_lnog < RSI_VWAP_overSold_long ? color.lime : color.blue, title="rsi", linewidth=2, style=plot.style_line)
// h1=plot(RSI_VWAP_overBought_long, color = color.gray, style=plot.style_stepline)
// h2=plot(RSI_VWAP_overSold_long, color = color.gray, style=plot.style_stepline)
// fill(r,h1, color = RSI_VWAP_long > RSI_VWAP_overBought_long ? color.red : na, transp = 60)
// fill(r,h2, color = RSI_VWAP_long < RSI_VWAP_overSold_long ? color.lime : na, transp = 60)
// Plotting SHORT, Put overlay=false
// r=plot(RSI_VWAP_short, color = RSI_VWAP_short > RSI_VWAP_overBought_short ? color.red : RSI_VWAP_short < RSI_VWAP_overSold_short ? color.lime : color.blue, title="rsi", linewidth=2, style=plot.style_line)
// h1=plot(RSI_VWAP_overBought_short, color = color.gray, style=plot.style_stepline)
// h2=plot(RSI_VWAP_overSold_short, color = color.gray, style=plot.style_stepline)
// fill(r,h1, color = RSI_VWAP_short > RSI_VWAP_overBought_short ? color.red : na, transp = 60)
// fill(r,h2, color = RSI_VWAP_short < RSI_VWAP_overSold_short ? color.lime : na, transp = 60)
/////// STRATEGY Take Profit / Stop Loss ////////
////// LONG //////
long_tp1_inp = input(3.3, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(15, title="Long Take Profit 1 Qty", step=1)
long_tp2_inp = input(12, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(100, title="Long Take Profit 2 Qty", step=1)
long_sl_inp = input(3.3, title='Long Stop Loss %', step=0.1)/100
long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)
long_stop_level = strategy.position_avg_price * (1 - long_sl_inp)
////// SHORT //////
short_tp1_inp = input(3.2, title='Short Take Profit 1 %', step=0.1)/100
short_tp1_qty = input(20, title="Short Take Profit 1 Qty", step=1)
short_tp2_inp = input(5.5, title='Short Take Profit 2%', step=0.1)/100
short_tp2_qty = input(100, title="Short Take Profit 2 Qty", step=1)
short_sl_inp = input(3.2, title='Short Stop Loss %', step=0.1)/100
short_take_level_1 = strategy.position_avg_price * (1 - short_tp1_inp)
short_take_level_2 = strategy.position_avg_price * (1 - short_tp2_inp)
short_stop_level = strategy.position_avg_price * (1 + short_sl_inp)
///Strategy_Conditions
/// LONG ///
entry_long =(crossover(RSI_VWAP_long, RSI_VWAP_overSold_long) and leadLine2<leadLine1) or (crossunder(mf,mfi_lower) and leadLine2<leadLine1)
entry_price_long=valuewhen(entry_long,close,0)
exit_long =crossunder(RSI_VWAP_long, RSI_VWAP_overBought_long)
/// SHORT ///
entry_short =crossunder(RSI_VWAP_short, RSI_VWAP_overBought_short) and leadLine2>leadLine1 or (crossover(mf,mfi_upper) and leadLine2>leadLine1)
entry_price_short=valuewhen(entry_short,close,0)
exit_short =crossover(RSI_VWAP_short, RSI_VWAP_overSold_short)
////// BACKTEST PERIOD ///////
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
testPeriod() => true
if testPeriod()
if strategy.position_size == 0 or strategy.position_size > 0 and rvi>benchmark
strategy.entry("long", true, when = entry_long, comment="Insert Enter Long Comment")
strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1, stop=long_stop_level)
strategy.exit("TP2","long", qty_percent=long_tp2_qty, limit=long_take_level_2, stop=long_stop_level)
strategy.close("long", when=exit_long, comment = "Insert Exit Long Comment")
if strategy.position_size == 0 or strategy.position_size < 0 and rvi>benchmark
strategy.entry("short", false, when = entry_short, comment="Insert Enter Short Comment")
strategy.exit("TP1","short", qty_percent=short_tp1_qty, limit=short_take_level_1, stop=short_stop_level)
strategy.exit("TP2","short", qty_percent=short_tp2_qty, limit=short_take_level_2, stop=short_stop_level)
strategy.close("short", when=exit_short, comment = "Insert Exit Short Comment")
// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")
// SHORT POSITION
plot(strategy.position_size < 0 ? short_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Short Take Profit")
plot(strategy.position_size < 0 ? short_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Short Take Profit")
plot(strategy.position_size < 0 ? short_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")