
マルチミーティング・ホイング・ハンター戦略は,低時間枠取引用に設計された高度な定量化戦略であり,総合的なポイントベースの評価システムを採用し,最適化された技術指標,価格行動分析,および反転パターンの認識を組み合わせて正確な取引信号を生成する.この戦略の核心的な革新は,独特の二重評価のメカニズムを導入することにある.一方では,入場評価システムによって波動の底部を識別し,一方では,出場評価システムによって最適な出場時間を決定する.
この戦略は,特別の配置のMACD ([3,10,3]) とRSI ([21]) を含む,広範にリテストされた最適化された指標パラメータを利用し,標準配置よりも迅速な市場の変化に適応します. この戦略は,入場と出場の両方に少なくとも13ポイントの高得点のトレンジーを要求し,高信頼性の信号のみが取引を誘発することを保証します.
マルチミーティングの振動ハンター戦略の核心は,複数の技術条件を定量的に評価することによって取引のタイミングを決定する総合的評価システムである.入場評価システムは,以下の4つの主要な構成要素で構成されています.
RSI信号(最大5ポイント)
MACD信号(最高8点)
価格行動(最大4ポイント)
パターン認識(最高8点)
出場スコアシステムは,類似の重量システムを使用しているが,逆の基準で振動のトップを識別する.この戦略は,出場と出場の平均スコアが少なくとも13ポイントに達することを要求し,これは,偽信号の可能性を減らすために,高い確信度のある信号のみが実行されることを保証する.
戦略のもう1つの重要な要素は,その最適化された指標パラメータです.
これらのパラメータは,価格の急速な変動と高周波の変動を捉えるために,特別に最適化されています.
客観的な決定プロセスポイントベースの評価システムによって,この戦略は主観的な判断を排除し,明確な取引基準を提供します.この方法により,取引決定は感情ではなくデータに基づいて行われ,取引の規律が大きく向上します.
複数の認証メカニズム: 策略は複数の技術指標と価格パターンを同時に確認することを要求し,信号の信頼性を大幅に高めます.少なくとも13点の基準が満たされた場合にのみ取引が行われ,偽信号のリスクを低減します.
タイムセンシビリティの最適化戦略は,最適化されたMACD ((3,10,3) とRSI ((21)) のパラメータを使用することで,価格動力の変化を早期に捉え,市場騒音をフィルターし,より良い時間感性を提供します.
リスク管理の柔軟性戦略は,リスクに基づくストップと利益目標の計算を内蔵し,リスクと報酬の比率を 5:1 でデフォルトで採用し,取引に明確なリスク管理の枠組みを提供します. ダイナミックストップは,最近の変動の低点に基づいて,配置可能なバッファローズを持ち,リスク制御の柔軟性を高めます.
高可視化取引システム策略は,緑のラベル ((入場スコア≥10) と赤のラベル ((出場スコア≥10) を含むスコア表示システムと,取引の入場/出場を明確に表示するマークを提供しており,トレーダーがシステムの動作を明確に確認できます.
適応性が高い: 戦略のパラメータは最適化されているが,異なる市場環境と取引品種に応じて調整することができ,戦略を広く適用できるようにする.
リスクの分配戦略: 預金配分の100%をデフォルトで採用する.この集中投資は,単一の取引のリスクの値を増やす.市場の激しい変動や意外な事件が発生した場合,これは重要なアカウントの変動を引き起こす可能性があります.
市場条件に依存する:この戦略は,明らかな傾向と波動のある市場では最適ですが,高度に揺れ動いた横軸市場では効果が低下する可能性があります.異なる市場環境で慎重に使用し,パラメータの調整または取引を一時停止することを考慮する必要があります.
オーバーフィットリスクの最適化戦略のパラメータが最適化され,歴史データに過適合するリスクがある.将来の市場条件の変化は,戦略のパフォーマンスが反測結果より劣る可能性がある.戦略の有効性を維持するために,パラメータを定期的に再検証し,調整する必要があります.
多様性のない保護: 単一ポジション戦略として,多様性の保護が欠如し,特定の市場リスクが増加する. 実用的なアプリケーションでは,この戦略をより広範なポートフォリオの一部として考慮するか,多様性を高めるために多種多様な取引を導入する.
技術的な障害のリスク複雑な評価システムと多重な条件は,特定の市場環境,特に極端な市場条件下では機能しない可能性があります. 最大損失制限の設定や波動性フィルターの使用などの追加のリスク管理措置の導入が推奨されています.
適応パラメータを導入する:現在の戦略は,固定されたMACDとRSIのパラメータを使用し,市場の変動性またはトレンドの強さに基づく自己適応のパラメータを導入することを考えることができます.例えば,高度な変動性のある環境でMACDパラメータを自動的に調整したり,現在の市場の状況に応じてRSIの超売り/超買いレベルを調整したりして,異なる市場環境で戦略の適応性を向上させることができます.
統合価格関係分析:現在の戦略は主に価格行動と動量指標に基づいている.取引量分析を統合することで信号の質を向上させることができます.特に反転パターン確認では,取引量確認は追加の信頼性を提供することができます.取引量に関連する評価基準を追加することを考慮してください.
市場環境フィルターを追加: 市場環境の識別メカニズムを導入し,戦略に適さない市場条件で取引頻度を自動的に減らすか,パラメータを調整する.例えば,高度横断市場でのスコアスローガンを高め,または低波動性環境でのストップロスの範囲を小さくする.
資金管理システムの最適化:現在の戦略は100%のポジション配分を使用し,より複雑な資金管理システムを実現し,信号の強さ,市場の変動,または歴史的パフォーマンスの動態に基づいてポジションサイズを調整します.例えば,スコアが高くなるほど資金が配分されるか,連続した損失の後,ポジションサイズが減少する.
多時間枠分析統合: より高いタイムフレームのトレンド確認を加えることで入場信号の質を高めます.例えば,より高いタイムフレームのトレンド方向が一致するときにのみ取引を実行するか,主トレンドに従う取引により多くのポイントを割り当てます.
機械学習の最適化: 機械学習の方法を使用してスコア重みと値の最適化を検討する. 歴史的データを分析することで,特定の市場環境でどのシグナル組み合わせが最も有効かを決定し,スコアシステムをそれに合わせて調整することができます.
マルチミーティング・スイング・ハンター・ストラテジーは,複数の技術分析指標と価格行動特性を統合して,データ主導の取引意思決定システムを創造する包括的で体系的な低時間枠取引方法を表しています.この戦略の核心的な優位性は,客観的な複数の基準の評価方法であり,感情的な決定を効果的に排除し,異なる取引品種と市場環境に適応する十分な柔軟性を保持しています.
戦略は,最適化されたMACD ((3,10,3) とRSI ((21)) パラメータと,厳格な入場と出場条件を組み合わせて,市場の波動を効果的に捉えることができる,特に波動性の高い市場では. 戦略の実用性とユーザーフレンドリー性をさらに高めるために,リスク管理機能と可視化ツールが内蔵されています.
しかし,戦略には,高ポジション配分,市場条件依存性,最適化過適合の可能性を含む一定の制限とリスクがあります. 適応パラメータの導入,量価格関係分析の統合,市場環境フィルターの追加などの推奨された最適化方向を実行することにより,戦略の安定性と適応性をさらに向上させることができます.
経験豊富なトレーダーにとって,マルチミーティングの振動ハンター戦略は,低時間枠のトレンドを捕捉し,取引を振動させるための強力なフレームワークを提供します.その核心原理を理解し,特定のニーズに応じて調整することで,トレーダーは,この戦略を使用して,急速に変化する市場の中で高い確率の取引機会を見つけることができます.
/*backtest
start: 2024-06-30 00:00:00
end: 2025-06-28 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":50000000}]
*/
// ____ _ _______ _ _ _____
// / __ \ | | |__ __| | (_) | __ \
// | | | |_ _ __ _ _ __ | |_ | |_ __ __ _ __| |_ _ __ __ _ | |__) |
// | | | | | | |/ _` | '_ \| __| | | '__/ _` |/ _` | | '_ \ / _` | | ___/ '__/ _ \
// | |__| | |_| | (_| | | | | |_ | | | | (_| | (_| | | | | | (_| | | | | | | (_) |
// \___\_\\__,_|\__,_|_| |_|\__| |_|_| \__,_|\__,_|_|_| |_|\__, | |_| |_| \___/
// __/ |
// |___/
// Quant Trading Pro
//@version=6
strategy("Multi-Confluence Swing Hunter V1", overlay=true,
default_qty_type=strategy.percent_of_equity, default_qty_value=100,
commission_type=strategy.commission.percent, commission_value=0.1,
slippage=3, initial_capital=1000, margin_long=0, margin_short=0)
// === DESCRIPTION ===
// High-conviction swing bottom entry strategy using optimized MACD(3,10,3) and RSI(21)
// Entry: Point-based scoring system for swing bottoms (divergences, momentum, price action)
// Exit: Inverse scoring system for swing tops (no stop-loss, exit only on swing top signals)
// Position: Single position with 100% allocation, scores displayed only when ≥10 points
// Based on analysis showing 23.7% improvement over standard parameters
// === INPUT PARAMETERS ===
// Optimized Indicator Settings
macdFast = input.int(3, "MACD Fast Length", minval=1, maxval=50, group="Optimized Indicators")
macdSlow = input.int(10, "MACD Slow Length", minval=1, maxval=100, group="Optimized Indicators")
macdSignal = input.int(3, "MACD Signal Length", minval=1, maxval=50, group="Optimized Indicators")
rsiLength = input.int(21, "RSI Length", minval=2, maxval=100, group="Optimized Indicators")
// Entry Settings - Swing Bottom Scoring
minEntryScore = input.int(13, "Minimum Entry Score", minval=5, maxval=20, group="Entry Settings")
showEntryScores = input.bool(true, "Show Entry Scores (Above 10)", group="Entry Settings")
// Exit Settings - Swing Top Scoring (Inverse of Entry Criteria)
minExitScore = input.int(13, "Minimum Exit Score", minval=5, maxval=20, group="Exit Settings")
showExitScores = input.bool(true, "Show Exit Scores (Above 10)", group="Exit Settings")
// Price Action Settings
minLowerWickPercent = input.float(50.0, "Min Lower Wick %", minval=10.0, maxval=90.0, step=5.0, group="Price Action")
quickRecoveryPercent = input.float(0.3, "Quick Recovery %", minval=0.1, maxval=2.0, step=0.1, group="Price Action")
quickRecoveryBars = input.int(3, "Quick Recovery Bars", minval=1, maxval=10, group="Price Action")
// RSI Levels
rsiOversold = input.float(30.0, "RSI Oversold Level", minval=10.0, maxval=50.0, step=1.0, group="RSI Settings")
rsiExtremeOversold = input.float(25.0, "RSI Extreme Oversold", minval=10.0, maxval=40.0, step=1.0, group="RSI Settings")
rsiOverbought = input.float(70.0, "RSI Overbought Level", minval=50.0, maxval=90.0, step=1.0, group="RSI Settings")
rsiExtremeOverbought = input.float(75.0, "RSI Extreme Overbought", minval=60.0, maxval=90.0, step=1.0, group="RSI Settings")
// Reversal Signals Settings
reversalLookback = input.int(12, "Reversal Candle Lookback", minval=5, maxval=50, group="Reversal Signals")
reversalConfirm = input.int(3, "Reversal Confirm Within", minval=1, maxval=10, group="Reversal Signals")
useVolumeConfirmation = input.bool(false, "Use Volume Confirmation", group="Reversal Signals")
// Trade Management
allowShortTrades = input.bool(false, "Allow Short Trades?", group="Short Trades")
// Risk/Reward TP/SL Settings
useRiskReward = input.bool(true, "Use Risk/Reward TP/SL", group="Risk Management")
riskRewardRatio = input.float(5, "Risk/Reward Ratio", minval=1.0, maxval=5.0, step=0.1, group="Risk Management")
stopLossLookback = input.int(10, "Stop Loss Lookback Bars", minval=3, maxval=50, group="Risk Management")
stopLossBuffer = input.float(0.15, "Stop Loss Buffer %", minval=0.05, maxval=1.0, step=0.05, group="Risk Management")
// Advanced Settings
maxLookbackBars = input.int(8, "Divergence Lookback Bars", minval=3, maxval=20, group="Advanced")
// === 1️⃣ CALCULATIONS ===
// Optimized MACD Calculation
[macdLine, signalLine, macdHist] = ta.macd(close, macdFast, macdSlow, macdSignal)
// Optimized RSI Calculation
rsi = ta.rsi(close, rsiLength)
// Price Action Calculations
bodySize = math.abs(close - open)
lowerWick = math.min(open, close) - low
upperWick = high - math.max(open, close)
totalRange = high - low
lowerWickPercent = totalRange > 0 ? (lowerWick / totalRange) * 100 : 0
upperWickPercent = totalRange > 0 ? (upperWick / totalRange) * 100 : 0
bodyPercent = totalRange > 0 ? (bodySize / totalRange) * 100 : 0
// Reversal Signals Calculation
var int bullCandleScore = 0
var int bearCandleScore = 0
var bool bullReversalCandidate = false
var bool bearReversalCandidate = false
var float bullReversalLow = 0.0
var float bullReversalHigh = 0.0
var float bearReversalLow = 0.0
var float bearReversalHigh = 0.0
var bool bullSignalConfirmed = false
var bool bearSignalConfirmed = false
var int bullCandleCounter = 0
var int bearCandleCounter = 0
volumeIsHigh = volume > ta.sma(volume, 20)
// Reset scores
bullCandleScore := 0
bearCandleScore := 0
// Calculate reversal scores
if bar_index >= reversalLookback
for i = 0 to (reversalLookback - 1)
if close < low[i]
bullCandleScore += 1
if close > high[i]
bearCandleScore += 1
// Bear signal setup
if bearCandleScore == (reversalLookback - 1)
bearReversalCandidate := true
bearReversalLow := low
bearReversalHigh := high
bearSignalConfirmed := false
bearCandleCounter := 0
if bearReversalCandidate
bearCandleCounter += 1
if close > bearReversalHigh
bearReversalCandidate := false
bearCondition = bearReversalCandidate and close < bearReversalLow and not bearSignalConfirmed and bearCandleCounter <= (reversalConfirm + 1)
bearSignal = false
if bearCondition
bearSignalConfirmed := true
if not useVolumeConfirmation or volumeIsHigh
bearSignal := true
// Bull signal setup
if bullCandleScore == (reversalLookback - 1)
bullReversalCandidate := true
bullReversalLow := low
bullReversalHigh := high
bullSignalConfirmed := false
bullCandleCounter := 0
if bullReversalCandidate
bullCandleCounter += 1
if close < bullReversalLow
bullReversalCandidate := false
bullCondition = bullReversalCandidate and close > bullReversalHigh and not bullSignalConfirmed and bullCandleCounter <= (reversalConfirm + 1)
bullSignal = false
if bullCondition
bullSignalConfirmed := true
if not useVolumeConfirmation or volumeIsHigh
bullSignal := true
// === 2️⃣ ENTRY & EXIT LOGIC ===
// Helper Functions for Divergence Detection
findLowerLow(lookback) =>
var float lowestPrice = na
var int lowestIndex = na
if bar_index >= lookback
lowestPrice := low
lowestIndex := bar_index
for i = 1 to lookback
if low[i] < lowestPrice
lowestPrice := low[i]
lowestIndex := bar_index - i
[lowestPrice, lowestIndex]
findHigherHigh(lookback) =>
var float highestPrice = na
var int highestIndex = na
if bar_index >= lookback
highestPrice := high
highestIndex := bar_index
for i = 1 to lookback
if high[i] > highestPrice
highestPrice := high[i]
highestIndex := bar_index - i
[highestPrice, highestIndex]
// SWING BOTTOM SCORING SYSTEM
// 1. RSI Signals
rsiOversoldSignal = rsi < rsiOversold
rsiExtremeOversoldSignal = rsi < rsiExtremeOversold
rsiTurningUp = rsi > rsi[1]
// RSI Bullish Divergence
[prevLowPrice, prevLowIndex] = findLowerLow(maxLookbackBars)
rsiBullishDivergence = false
if not na(prevLowPrice) and not na(prevLowIndex) and bar_index > prevLowIndex
prevRSI = rsi[bar_index - prevLowIndex]
if low < prevLowPrice and rsi > prevRSI and not na(prevRSI)
rsiBullishDivergence := true
// 2. MACD Signals
macdNegative = macdLine < 0
macdTurningUp = macdLine > macdLine[1]
macdHistImproving = macdHist > macdHist[1]
// MACD Bullish Divergence
macdBullishDivergence = false
if not na(prevLowPrice) and not na(prevLowIndex) and bar_index > prevLowIndex
prevMACD = macdLine[bar_index - prevLowIndex]
if low < prevLowPrice and macdLine > prevMACD and not na(prevMACD)
macdBullishDivergence := true
// 3. Price Action Signals
longLowerWick = lowerWickPercent > minLowerWickPercent
smallBody = bodyPercent < 30.0
bullishClose = close > open
// 4. Quick Recovery Check
quickRecovery = false
if bar_index >= quickRecoveryBars
recoveryTarget = close * (1 + quickRecoveryPercent / 100)
for i = 1 to quickRecoveryBars
if high[i] > recoveryTarget
quickRecovery := true
break
// ENTRY SCORE CALCULATION
entryScore = 0
entryScore := entryScore + (rsiOversoldSignal ? 2 : 0)
entryScore := entryScore + (rsiExtremeOversoldSignal ? 2 : 0)
entryScore := entryScore + (rsiBullishDivergence ? 4 : 0)
entryScore := entryScore + (rsiTurningUp ? 1 : 0)
entryScore := entryScore + (macdNegative ? 1 : 0)
entryScore := entryScore + (macdTurningUp ? 2 : 0)
entryScore := entryScore + (macdHistImproving ? 2 : 0)
entryScore := entryScore + (macdBullishDivergence ? 3 : 0)
entryScore := entryScore + (longLowerWick ? 2 : 0)
entryScore := entryScore + (smallBody ? 1 : 0)
entryScore := entryScore + (bullishClose ? 1 : 0)
entryScore := entryScore + (quickRecovery ? 2 : 0)
entryScore := entryScore + (bullSignal ? 4 : 0) // Green reversal signal +4
// SWING TOP SCORING SYSTEM (for exits)
// 1. RSI Exit Signals
rsiOverboughtSignal = rsi > rsiOverbought
rsiExtremeOverboughtSignal = rsi > rsiExtremeOverbought
rsiTurningDown = rsi < rsi[1]
// RSI Bearish Divergence
[prevHighPrice, prevHighIndex] = findHigherHigh(maxLookbackBars)
rsiBearishDivergence = false
if not na(prevHighPrice) and not na(prevHighIndex) and bar_index > prevHighIndex
prevRSIHigh = rsi[bar_index - prevHighIndex]
if high > prevHighPrice and rsi < prevRSIHigh and not na(prevRSIHigh)
rsiBearishDivergence := true
// 2. MACD Exit Signals
macdPositive = macdLine > 0
macdTurningDown = macdLine < macdLine[1]
macdHistDeclining = macdHist < macdHist[1]
// MACD Bearish Divergence
macdBearishDivergence = false
if not na(prevHighPrice) and not na(prevHighIndex) and bar_index > prevHighIndex
prevMACDHigh = macdLine[bar_index - prevHighIndex]
if high > prevHighPrice and macdLine < prevMACDHigh and not na(prevMACDHigh)
macdBearishDivergence := true
// 3. Price Action Exit Signals
longUpperWick = upperWickPercent > minLowerWickPercent
bearishClose = close < open
// EXIT SCORE CALCULATION
exitScore = 0
exitScore := exitScore + (rsiOverboughtSignal ? 2 : 0)
exitScore := exitScore + (rsiExtremeOverboughtSignal ? 2 : 0)
exitScore := exitScore + (rsiBearishDivergence ? 4 : 0)
exitScore := exitScore + (rsiTurningDown ? 1 : 0)
exitScore := exitScore + (macdPositive ? 1 : 0)
exitScore := exitScore + (macdTurningDown ? 2 : 0)
exitScore := exitScore + (macdHistDeclining ? 2 : 0)
exitScore := exitScore + (macdBearishDivergence ? 3 : 0)
exitScore := exitScore + (longUpperWick ? 2 : 0)
exitScore := exitScore + (bearishClose ? 1 : 0)
exitScore := exitScore + (bearSignal ? 1 : 0) // Red reversal signal +1
// SIGNAL CONDITIONS
longCondition = entryScore >= minEntryScore and barstate.isconfirmed
exitCondition = exitScore >= minExitScore and barstate.isconfirmed
// === TP/SL LEVELS (Clean Logic) ===
var float stopLossLevel = na
var float takeProfitLevel = na
var bool tpslSet = false
// Clear levels when no position
if strategy.position_size == 0
stopLossLevel := na
takeProfitLevel := na
tpslSet := false
// Calculate TP/SL levels ONCE when position is opened
if strategy.position_size > 0 and strategy.position_size[1] == 0 and useRiskReward and not tpslSet
// Find recent low for stop loss
recentLow = low
for i = 1 to stopLossLookback
if low[i] < recentLow
recentLow := low[i]
// Set levels using actual entry price
entryPrice = strategy.opentrades.entry_price(0)
stopLossLevel := recentLow * (1 - stopLossBuffer / 100) // Configurable buffer below recent low
riskAmount = entryPrice - stopLossLevel
takeProfitLevel := entryPrice + (riskAmount * riskRewardRatio)
tpslSet := true
// === 3️⃣ TRADE EXECUTIONS ===
// Long Entry - Single Position Only
if longCondition and strategy.position_size == 0
strategy.entry("Long", strategy.long, comment="Entry Score: " + str.tostring(entryScore))
// Set TP/SL ONLY ONCE per trade (when levels are calculated and not yet set)
if strategy.position_size > 0 and useRiskReward and tpslSet and not na(stopLossLevel) and not na(takeProfitLevel)
strategy.exit("TP/SL", "Long", stop=stopLossLevel, limit=takeProfitLevel)
// Long Exit - Close Position on Swing Top Signal (Only when NOT using TP/SL)
if exitCondition and strategy.position_size > 0 and not useRiskReward
strategy.close("Long", comment="Exit Score: " + str.tostring(exitScore))
// === 4️⃣ VISUALIZATIONS ===
// Entry Score Display (Only When Score ≥ 10) - Shows on ALL qualifying bars
if showEntryScores and entryScore >= 10 and barstate.isconfirmed
label.new(bar_index, low,
text=str.tostring(entryScore),
yloc=yloc.belowbar,
color=na,
style=label.style_label_up,
textcolor=color.green,
size=size.small)
// Exit Score Display (Only When Score ≥ 10) - Shows on ALL qualifying bars
if showExitScores and exitScore >= 10 and barstate.isconfirmed
label.new(bar_index, high,
text=str.tostring(exitScore),
yloc=yloc.abovebar,
color=na,
style=label.style_label_down,
textcolor=color.red,
size=size.small)
// Large Trade Entry Triangle (Only when actually entering a position) - Using plotshape to avoid label limits
plotshape(longCondition and strategy.position_size == 0, title="Trade Entry", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.normal, text="BUY")
// Large Trade Exit Triangle (Only when actually exiting a position) - Using plotshape to avoid label limits
plotshape(exitCondition and strategy.position_size > 0, title="Trade Exit", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.normal, text="SELL")
// Reversal Signal Triangles
plotshape(bullSignal, title="Bull Reversal", location=location.belowbar,
color=color.lime, style=shape.triangleup, size=size.tiny)
plotshape(bearSignal, title="Bear Reversal", location=location.abovebar,
color=color.red, style=shape.triangledown, size=size.tiny)
// === TP/SL LEVEL PLOTS ===
plot(strategy.position_size > 0 and useRiskReward ? stopLossLevel : na, title="Stop Loss", color=color.red, linewidth=2, style=plot.style_linebr)
plot(strategy.position_size > 0 and useRiskReward ? takeProfitLevel : na, title="Take Profit", color=color.green, linewidth=2, style=plot.style_linebr)
// MACD and RSI Plots (in separate panes)
macdPlot = plot(macdLine, title="MACD Line", color=color.blue, display=display.none)
signalPlot = plot(signalLine, title="Signal Line", color=color.red, display=display.none)
histPlot = plot(macdHist, title="MACD Histogram", color=color.gray, style=plot.style_histogram, display=display.none)
rsiPlot = plot(rsi, title="RSI", color=color.purple, display=display.none)
rsiOverboughtLine = hline(rsiOverbought, title="RSI Overbought", color=color.red, linestyle=hline.style_dashed, display=display.none)
rsiOversoldLine = hline(rsiOversold, title="RSI Oversold", color=color.green, linestyle=hline.style_dashed, display=display.none)