
移動平均と相対的に弱い指標戦略 (Moving Average Relative Strength Index Strategy) は,移動平均と相対的に強い指標を同時に取引信号として利用する量化取引戦略である.この戦略は,価格の移動平均と相対的に強い指標の数値を比較して取引信号を生成し,市場動向の機会を捕捉する.
この戦略は主に2つの指標に基づいています.
この戦略の核心的な論理は:
RSI指標ラインが移動平均線より低いときは,超売り区域であり,株価が過小評価され,買取シグナルが生じます.RSI指標ラインが移動平均線より高いときは,超買い区域であり,株価が過小評価され,売出シグナルが生じます.
つまり,移動平均は,ある程度,株式の公正価値を反映し,RSIは,株式の現在の強弱な状態を表しています.RSIは,移動平均より高くまたは低く,逆転の機会があることを意味します.
具体的には,この戦略は以下のステップで取引シグナルを生成します.
この戦略は,移動平均のトレンド判断と,RSI指標の超買い超売り判断を組み合わせて,異なる指標の優位性を総合的に利用し,市場の転換点を効果的に判断することができます.
主要な優位性は以下の通りです.
この戦略にはいくつかのリスクがあります.
リスクの管理のために,以下の方法で最適化できます.
この戦略は,次の方向にも改善できます.
パラメータ最適化,指標最適化,リスク管理最適化などの方法で,この戦略の安定性と収益性を向上させることができます.
移動平均と相対的に強い指標戦略は,価格傾向判断と超買い超売り判断を同時に利用することで,市場の転換点を効果的に判断し,逆転の機会を掴むことができます. この戦略は,シンプルで実用的で,リスクが制御可能であり,実用的な量化取引戦略です. 継続的な最適化により,より優れた効果を得ることができます.
/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-24 06:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
strategy(title = "RSI versus SMA", shorttitle = "RSI vs SMA", overlay = false, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, currency = currency.GBP)
// Revision: 1
// Author: @JayRogers
//
// *** USE AT YOUR OWN RISK ***
// - Nothing is perfect, and all decisions by you are on your own head. And stuff.
//
// Description:
// - It's RSI versus a Simple Moving Average.. Not sure it really needs much more description.
// - Should not repaint - Automatically offsets by 1 bar if anything other than "open" selected as RSI source.
// === INPUTS ===
// rsi
rsiSource = input(defval = open, title = "RSI Source")
rsiLength = input(defval = 8, title = "RSI Length", minval = 1)
// sma
maLength = input(defval = 34, title = "MA Period", minval = 1)
// invert trade direction
tradeInvert = input(defval = false, title = "Invert Trade Direction?")
// risk management
useStop = input(defval = false, title = "Use Initial Stop Loss?")
slPoints = input(defval = 25, title = "Initial Stop Loss Points", minval = 1)
useTS = input(defval = true, title = "Use Trailing Stop?")
tslPoints = input(defval = 120, title = "Trail Points", minval = 1)
useTSO = input(defval = false, title = "Use Offset For Trailing Stop?")
tslOffset = input(defval = 20, title = "Trail Offset Points", minval = 1)
// === /INPUTS ===
// === BASE FUNCTIONS ===
// delay for direction change actions
switchDelay(exp, len) =>
average = len >= 2 ? sum(exp, len) / len : exp[1]
up = exp > average
down = exp < average
state = up ? true : down ? false : up[1]
// === /BASE FUNCTIONS ===
// === SERIES and VAR ===
// rsi
shunt = rsiSource == open ? 0 : 1
rsiUp = rma(max(change(rsiSource[shunt]), 0), rsiLength)
rsiDown = rma(-min(change(rsiSource[shunt]), 0), rsiLength)
rsi = (rsiDown == 0 ? 100 : rsiUp == 0 ? 0 : 100 - (100 / (1 + rsiUp / rsiDown))) - 50 // shifted 50 points to make 0 median
// sma of rsi
rsiMa = sma(rsi, maLength)
// self explanatory..
tradeDirection = tradeInvert ? 0 <= rsiMa ? true : false : 0 >= rsiMa ? true : false
// === /SERIES ===
// === PLOTTING ===
barcolor(color = tradeDirection ? green : red, title = "Bar Colours")
// hlines
medianLine = hline(0, title = 'Median', color = #996600, linewidth = 1)
limitUp = hline(25, title = 'Limit Up', color = silver, linewidth = 1)
limitDown = hline(-25, title = 'Limit Down', color = silver, linewidth = 1)
// rsi and ma
rsiLine = plot(rsi, title = 'RSI', color = purple, linewidth = 2, style = line, transp = 50)
areaLine = plot(rsiMa, title = 'Area MA', color = silver, linewidth = 1, style = area, transp = 70)
// === /PLOTTING ===
goLong() => not tradeDirection[1] and tradeDirection
killLong() => tradeDirection[1] and not tradeDirection
strategy.entry(id = "Buy", long = true, when = goLong())
strategy.close(id = "Buy", when = killLong())
goShort() => tradeDirection[1] and not tradeDirection
killShort() => not tradeDirection[1] and tradeDirection
strategy.entry(id = "Sell", long = false, when = goShort())
strategy.close(id = "Sell", when = killShort())
if (useStop)
strategy.exit("XSL", from_entry = "Buy", loss = slPoints)
strategy.exit("XSS", from_entry = "Sell", loss = slPoints)
// if we're using the trailing stop
if (useTS and useTSO) // with offset
strategy.exit("XSL", from_entry = "Buy", trail_points = tslPoints, trail_offset = tslOffset)
strategy.exit("XSS", from_entry = "Sell", trail_points = tslPoints, trail_offset = tslOffset)
if (useTS and not useTSO) // without offset
strategy.exit("XSL", from_entry = "Buy", trail_points = tslPoints)
strategy.exit("XSS", from_entry = "Sell", trail_points = tslPoints)