RSI 平均逆転価格変動戦略

作者: リン・ハーンチャオチャン, 日付: 2023-09-26 19:55:03
タグ:

概要

この戦略は,RSI指標を用いて過剰販売の機会を特定し,価格が下がると,段階的にコストベースを下げ,長期的利益を達成するために,バッチでポジションを取ります.また,リスクの管理を進めるDCAメカニズムも組み込みます.

戦略の論理

この戦略は,まずRSI指標を計算し,市場が過売れているかどうかを判断する.RSIが30を下回ると,過売機会をシグナルします.この場合,価格が100期移動平均値を下回ると,ロングポジションが開かれます.

ポジションを開いた後,戦略は,現在の価格の98%,97%,95%,95%,90%,84%および70%で6つの平均逆転価格レベルを設定します.価格がこれらのレベルに達すると,より多くのポジションが追加されます.常に平均を下回ることで,ポジションのコストベースを低下させることができます.

また,ポジションの平均価格が計算されます. 価格が平均価格より5%以上上昇すると,利益占いは始まります. また,価格が平均価格の5%の利益占いの価格を超えて上昇し続けると,すべてのポジションが閉鎖されます.

最後に,DCAメカニズムは戦略に組み込まれます.毎週月曜日,オープンポジションがあり,価格が平均価格を下回ると,固定額がポジションに追加されます.これはコストベースをさらに削減します.

利点分析

この戦略の最大の利点は,リスク制御のためのダウン平均とDCAメカニズムの使用です.特に:

  1. バッチでポジションを取ると 開始リスクが多様化され 最低点を見逃すことは避けられます

  2. 複数の平均回転価格レベルを設定することで,コストベースが徐々に低下し,下向きのリスクが管理されます.

  3. 平均ポジション価格を計算することで リースしたときに 適時に利益を得たり 利益を固定したりできます

  4. DCAの適用はコストベースをさらに削減し,リスクを制御します.

  5. RSIインジケーターを使用すると トップでポジションを開くことは防げます

  6. 移動平均のフィルターは逆転取引を避ける.

リスク分析

この戦略にはいくつかのリスクもあります:

  1. 戦略は市場の逆転点を決定することはできない.長期間の市場底期における長期的ロングポジションは損失を増加させる.

  2. 単一の取引損失を効果的に制御するストップ損失メカニズムは存在しない.

  3. 市場が急激に崩れ落ちると 激増する可能性があります

  4. DCAはタイミングリスクを持ち,最低点でのポジション開設を保証するものではありません.

可能な解決策:

  1. 市場構造を判断するために RSI にのみ頼るのではなく,他の指標を組み込む.

  2. 移動または段階的なストップ損失を追加します.

  3. ポジションの追加数を制限する

  4. DCA入力ロジックを 安定したメカニズムに最適化する

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

戦略は以下の方法で改善できます.

  1. 平均逆転アルゴリズムを より科学的アプローチに最適化します

  2. トレイリング・ストップや層次の利益採取などの利益採取メカニズムを強化する.

  3. ストップ・ロスを追加して 単一の取引リスクを制御します

  4. 市場構造分析のための他の指標を単にRSIではなく 組み込む.

  5. DCA ロジックを最適化して 固定時間エントリーリスクを回避する

  6. ポジションサイズを追加して ポジションの総サイズを最適化します

  7. パラメータを市場統計特性に合わせて最適化する.

  8. 異なる市場体制に適応するためにスイッチングロジックを追加します.

結論

概要すると,これは長期投資戦略で,RSIをタイミングと低コストベースに複数のエントリで平均を下げるために利用している.現在の不安定な仮想通貨市場では,変動期間中にポジションコストを管理するのに適しています.また,戦略がより複雑な環境で繁栄できるように,市場分析とリスク管理のためのより多くの指標を組み込むためのメカニズムを改善する余地があります.


/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
//@version=4
// © A3Sh

// RSI Strategy that buys the dips, works with Price Averaging and has a Dollar Cost Average option.
// When the price drops below specified percentages of the price (6 PA layers), new entries are openend to average the price of the assets.
// Open entries are closed by a specified take profit.
// Entries can be reopened, after closing and consequently crossing a PA layer again.
// The idea is to lower the average position price to a point that when the market rises, the current price crosses over the average position price.
// When the current price crosses the average position size and reaches the specified take profit, all entries are closed at once.
// In case the market drops significantly, there is an option to activate DCA to lower the average price further.

// RSI code adapted from the Optimized RSI Buy the Dips strategy, by Coinrule
// https://www.tradingview.com/script/Pm1WAtyI-Optimized-RSI-Strategy-Buy-The-Dips-by-Coinrule/
// Pyramiding entries code adapted from Pyramiding Entries on Early Trends startegy, by Coinrule
// https://www.tradingview.com/script/7NNJ0sXB-Pyramiding-Entries-On-Early-Trends-by-Coinrule/
// Plot entry layers code adapted from HOWTO Plot Entry Price by vitvlkv
// https://www.tradingview.com/script/bHTnipgY-HOWTO-Plot-Entry-Price/
// Buy every week code based on the following question in Stack Overflow
// https://stackoverflow.com/questions/59870411/in-pine-script-how-can-you-do-something-once-per-day-or-keep-track-if-somethin


strategy(title = "RSI+PA+DCA", pyramiding = 16, overlay = true, initial_capital = 400, default_qty_type = strategy.percent_of_equity, default_qty_value = 15, commission_type = strategy.commission.percent, commission_value = 0.075)

port = input(15, title = "Portfolio %", type = input.float, step = 0.1, minval = 0.1, maxval = 100)
q = (strategy.equity / 100 * port) / open

// Long position entry layers. Percentage from the entry price of the the first long
PositionInputs = input("++++", title = "+++++ Long Positions VA Layers +++++")

ps2 = input(2,  title = "2nd Long Entry %", step = 0.1)
ps3 = input(3,  title = "3rd Long Entry %", step = 0.1)
ps4 = input(5,  title = "4th Long Entry %", step = 0.1)
ps5 = input(10, title = "5th Long Entry %", step = 0.1)
ps6 = input(16, title = "6th Long Entry %", step = 0.1)


// Calculate Moving Averages
maInput = input("++++", title = "+++++ Moving Average Filter +++++")

plotMA = input(title = "Plot Moving Average", defval = false)
movingaverage_signal = sma(close, input(100))
plot (plotMA ? movingaverage_signal : na, color = color.white)

// RSI inputs and calculations
rsiInput = input( "++++", title = "+++++ RSI Inputs +++++" )

length =     input( 14 )
overSold =   input( 30, title = "oversold, entry trigger long position" )
overBought = input( 70, title = "overbought, has no specific function")
price = close
vrsi = rsi(price, length)

// Long trigger (co)
co = crossover(vrsi, overSold) and close < movingaverage_signal

// Take profit
takeprofit = input("++++", title = "+++++ Take Profit +++++")

ProfitTarget_Percent = input(5)


// Store values to create and plot the different DCA layers
long1 = valuewhen(co, close, 0)
long2 = valuewhen(co, close - (close / 100 * ps2), 0)
long3 = valuewhen(co, close - (close / 100 * ps3), 0)
long4 = valuewhen(co, close - (close / 100 * ps4), 0)
long5 = valuewhen(co, close - (close / 100 * ps5), 0)
long6 = valuewhen(co, close - (close / 100 * ps6), 0)

eps1 = 0.00
eps1 := na(eps1[1]) ? na : eps1[1]

eps2 = 0.00
eps2 := na(eps2[1]) ? na : eps2[1]

eps3 = 0.00
eps3 := na(eps3[1]) ? na : eps3[1]

eps4 = 0.00
eps4 := na(eps4[1]) ? na : eps4[1]

eps5 = 0.00
eps5 := na(eps5[1]) ? na : eps5[1]

eps6 = 0.00
eps6 := na(eps6[1]) ? na : eps6[1]

plot (strategy.position_size > 0 ? eps1 : na, title = "Long entry 1", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps2 : na, title = "Long entry 2", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps3 : na, title = "Long entry 3", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps4 : na, title = "Long entry 4", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps5 : na, title = "Long entry 5", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps6 : na, title = "Long entry 6", style = plot.style_linebr)


// Plot position average price
plot (strategy.position_avg_price, title = "Average price", style = plot.style_linebr, color = color.red, linewidth = 2)


// Take profit and exit all on take profit above position average price
tpv = strategy.position_avg_price + (strategy.position_avg_price / 100 * ProfitTarget_Percent)

tpl1 = close < tpv ? eps1 + close * (ProfitTarget_Percent / 100) : tpv
tpl2 = close < tpv ? eps2 + close * (ProfitTarget_Percent / 100) : tpv
tpl3 = close < tpv ? eps3 + close * (ProfitTarget_Percent / 100) : tpv
tpl4 = close < tpv ? eps4 + close * (ProfitTarget_Percent / 100) : tpv
tpl5 = close < tpv ? eps5 + close * (ProfitTarget_Percent / 100) : tpv
tpl6 = close < tpv ? eps6 + close * (ProfitTarget_Percent / 100) : tpv


// Open DCA order once at the start of the week
dcaWeek = input("++++", title = "+++++ Open DCA order once every week +++++")

newWeek = change(time("W"))
dcatime = input(title = "Buy a fixed amount every Monday", defval = false)
fixedAmount = input(40, title = "Fixed amount currency for DCA orders", step = 0.1)
dcaq = fixedAmount / open
plotchar (dcatime ? newWeek : na, "buy at Week start", "▼", location.top, size = size.tiny, color = color.white)
bgcolor (dcatime and newWeek ? color.white : na, transp = 50)

// Submit entry orders
if (co and strategy.opentrades == 0)
    eps1 := long1
    eps2 := long2
    eps3 := long3
    eps4 := long4
    eps5 := long5
    eps6 := long6

    strategy.entry("Long1", strategy.long, q)

if (strategy.opentrades == 1)
    strategy.entry("Long2", strategy.long, q, limit = eps2)

    
if (strategy.opentrades == 2)
    strategy.entry("Long3", strategy.long, q, limit = eps3)


if (strategy.opentrades == 3)
    strategy.entry("Long4", strategy.long, q, limit = eps4)


if (strategy.opentrades == 4)
    strategy.entry("Long5", strategy.long, q, limit = eps5)

    
if (strategy.opentrades == 5) 
    strategy.entry("Long6", strategy.long, q, limit = eps6)
    
// Submit Weekly DCA order, only when price is below position average price and when a position is open
if (dcatime and newWeek and strategy.position_size > 0 and close < strategy.position_avg_price) 
    strategy.entry("DCA", strategy.long, dcaq)


// Exit orders
if (strategy.position_size > 0)
    strategy.exit(id = "Exit 1", from_entry = "Long1", limit = tpl1)
    strategy.exit(id = "Exit 2", from_entry = "Long2", limit = tpl2)
    strategy.exit(id = "Exit 3", from_entry = "Long3", limit = tpl3)
    strategy.exit(id = "Exit 4", from_entry = "Long4", limit = tpl4)
    strategy.exit(id = "Exit 5", from_entry = "Long5", limit = tpl5)
    strategy.exit(id = "Exit 6", from_entry = "Long6", limit = tpl6)
    strategy.exit(id = "Exit DCA", from_entry = "DCA", limit = tpv)
 

// Make sure that all open limit orders are canceled after exiting all the positions 
longClose = strategy.position_size[1] > 0 and strategy.position_size == 0 ? 1 : 0   
if longClose
    strategy.cancel_all()





もっと