RSI の逆転 取引 戦略

作者: リン・ハーンチャオチャン開催日:2024年1月30日17時06分45秒
タグ:

img

概要

この戦略は,RSI指標を使用して,過剰購入ゾーンでの下落クロスオーバーでショート,過剰販売ゾーンでの上昇クロスオーバーでロングをするために,過剰購入および過剰売却市場の条件を特定する.これは指標に基づいた逆転取引戦略である.この戦略は,トレンドトレーリングストップと固定得益/ストップ損失を組み込み,取引リスクを効果的に制御する.

戦略の論理

この戦略の取引信号は,RSI指標の上昇/下落クロスオーバーに基づいて生成される.RSI指標は,通常,30をオーバーセールライン,70をオーバー購入ラインとして使用する.RSIラインがオーバーセールラインを越えると,購入信号が生成される.RSIラインがオーバーセールラインを下回ると,販売信号が生成される.この論理に基づいて,戦略はオーバーセールとオーバーセールゾーンを特定し,対応するロング/ショート信号を生成する.

ストップ・ロスは,ストップ・ロスのように,ストップ・ロスの値から一定の割合を離して,ストップ・ロスを継続的に更新することで,ストップ・ロスを利用する.また,目標利益に達または最大損失を超えるとポジションを閉じる固定取利益とストップ・ロスのレベルもあります.この組み合わせは,取引リスクを効果的に制御することができます.

利点分析

この戦略の利点は以下の通りです.

  1. RSI を使って過買い/過売りレベルを特定することは,市場のターニングポイントを信頼的に把握するための成熟した取引技術です.

  2. 上昇/下落のクロスオーバーを使用すると 誤った信号が検出され 取引がより信頼性が高まります

  3. トレンドフォローストップはできるだけ利益を固定し,同時に取引ごとに損失を抑えるための迅速なストップアウトがあります.

  4. 固定TP/SLレベルは,取引リスクを効果的に制御します.

  5. シンプルで明快な論理で 簡単に理解し 実行し 初心者にも適しています

リスク分析

この戦略のリスクは以下のとおりです.

  1. RSI信号は誤りになり パターン障害の危険性が高く ストップ・ロスのトリガーになります

  2. 固定TP/SLは市場の変動に適応できず,利益を短縮したり,損失を許す可能性があります.

  3. 利回りは高値/低値だけを追っているし 利回りは過度に激しくなるかもしれない

  4. パラメーターとして過度に適合するリスクは,過去のデータだけで最適化できます.

  5. 取引の頻度が高いため 取引コストとスライドが増加します

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

戦略を改善する方法:

  1. 最良の結果のために RSI パラメータを最適化します

  2. 信号の精度を高めるためにフィルター指標を追加します.

  3. 市場変動に基づいて適応停止/利益.

  4. 取引コストを減らすために 取引頻度を制限する.

  5. 取引ごとに損失を制限するためにポジションサイズを追加します.

  6. バックテストは安定性をテストするより長い時間枠です

結論

概要すると,これは,過剰購入/過剰売却を識別するためにRSIを使用する典型的な逆転戦略であり,ブル/ベアクロスオーバーがシグナルである.トレンドトラッキングストップと固定TP/SLはリスクを管理する.論理は単純で実行が簡単で,初心者にとって適しています.しかし,偽信号や曲線フィッティングなどのリスクは,ライブ取引の前にさらなる検証と最適化によって対処する必要があります.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// LOVE JOY PEACE PATIENCE KINDNESS GOODNESS FAITHFULNESS GENTLENESS SELF-CONTROL 
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// Author: © JoshuaMcGowan
// Taken from https://www.tradingview.com/script/GbZGYi6l-Adding-some-essential-components-to-a-prebuilt-RSI-strategy/
// Just updated to compile in version 4. 

//@version=4

strategy("Adding some essential components to a prebuilt RSI strategy", overlay=true)

/////////////// Component Code Start ///////////////

testStartYear = input(2011, "Backtest Start Year") 
testStartMonth = input(8, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2100, "Backtest Stop Year")
testStopMonth = input(9, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
// testStopDay = testStartDay + 1
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
    
/////////////// Component Code Stop ///////////////

// Replace RSI Component, Long/Short, and Long Signal/Short Signal conditions with your trade setup components.
///////////// RSI component /////////////

length = input( 14 )
overSold = input( 30 )
overBought = input( 70 )
price = close

vrsi = rsi(price, length)
notna = not na(vrsi)

/////////////// STRATEGY ///////////////

ts = input(99999, "Trailing Stop") / 100
tp = input(99999, "Take Profit") / 100
sl = input(99999, "Stop Loss") / 100

// Update this with your setup. 
long = notna and crossover(vrsi, overSold)
short = notna and crossunder(vrsi, overBought)

last_long = 0
last_short = 0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

// Update this to reflect your setup. 
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

float last_open_long_signal = 0
float last_open_short_signal = 0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0
last_short_signal = 0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

float last_high = 0
float last_low = 0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

long_ts = not na(last_high) and high <= (last_high - ts) //and high >= last_open_long_signal
short_ts = not na(last_low) and low >= (last_low + ts) //and low <= last_open_short_signal

long_tp = high >= (last_open_long_signal + tp)
short_tp = low <= (last_open_short_signal - tp)

long_sl = low <= (last_open_long_signal - sl)
short_sl = high >= (last_open_short_signal + sl)

leverage = input(200, "Leverage")
long_call = last_open_long_signal - (0.8 + 0.2 * (1/leverage)) / leverage * last_open_long_signal
short_call = last_open_short_signal + (0.78 + 0.2 * (1/leverage)) / leverage * last_open_short_signal
long_call_signal = low <= long_call
short_call_signal = high >= short_call

if testPeriod()
    strategy.entry("Long", strategy.long, when=long_signal)
    strategy.entry("Short", strategy.short, when=short_signal)

    // plot(long_call, color=color.red)
    // plot(short_call, color=color.green)
    strategy.close("Long", when=long_call_signal)
    strategy.close("Short", when=short_call_signal)
    strategy.close("Long", when=long_tp)
    strategy.close("Short", when=short_tp)
    strategy.close("Long", when=long_sl)
    strategy.close("Short", when=short_sl)
    strategy.close("Long", when=long_ts)
    strategy.close("Short", when=short_ts)







もっと