
Gagasan utama dari strategi ini adalah menggunakan indikator Ratio OCHL Averager dari periode yang berbeda untuk membangun beberapa garis rata-rata, menghasilkan sinyal beli dan jual berdasarkan bentuk silang garis rata-rata. Ini dapat secara dinamis menangkap tren harga, cocok untuk perdagangan jangka pendek.
Strategi ini menggunakan dua indikator Ratio OCHL Averager dengan periode yang berbeda, sebagai garis cepat dan garis lambat masing-masing. Ratio OCHL Averager dengan rumus sebagai berikut:
b = abs(close-open)/(high - low)
c = min(max(b, 0), 1)
Ratio OCHL Averager = c*close + (1-c)*前一日Ratio OCHL Averager
Di mana b adalah rasio yang mewakili pergerakan harga pada hari itu, c adalah nilai b setelah pengolahan standar. Ratio OCHL Averager mengintegrasikan empat harga pembukaan, harga penutupan, harga tertinggi dan harga terendah untuk membangun garis rata-rata.
Strategi ini mengatur siklus garis cepat pendek, siklus garis lambat panjang. Ketika garis cepat melewati garis lambat, sinyal beli dihasilkan, sebaliknya ketika garis cepat melewati garis lambat, sinyal jual dihasilkan.
Indikator Ratio OCHL Averager mampu meluruskan data harga, memfilter kebisingan pasar secara efektif, dan membuat sinyal perdagangan lebih andal.
Dua garis sejajar yang bersilang dalam kombinasi dengan periode yang berbeda menentukan arah tren, dapat lebih baik menentukan awal tren baru.
Dengan menyesuaikan parameter siklus garis cepat dan lambat, dapat disesuaikan dengan kondisi pasar yang berbeda.
Strategi ini sederhana, intuitif, dan mudah dipahami.
Anda dapat mengatur standar stop loss secara fleksibel untuk mengontrol risiko.
Strategi crossover rata-rata mungkin menghasilkan lebih banyak sinyal palsu, yang perlu disaring dalam kombinasi dengan indikator teknis lainnya.
Periode parameter yang dipilih secara rasional diperlukan untuk garis cepat dan lambat. Pilihan parameter yang tidak tepat dapat mempengaruhi efektivitas strategi.
Strategi crossover dua rata-rata adalah strategi pelacakan tren, tidak cocok untuk situasi getaran, dan harus digunakan dalam situasi tren.
Stop loss perlu disesuaikan dengan tepat untuk mengurangi risiko kerugian, dan stop loss juga harus diatur secara wajar.
Anda dapat mempertimbangkan untuk melakukan filter sinyal dengan menggunakan indikator momentum dan lain-lain untuk meningkatkan kualitas sinyal. Misalnya MACD, KDJ, dll.
Kombinasi parameter siklus garis cepat dan lambat yang berbeda dapat diuji untuk mencari parameter optimal.
Stop loss dapat dioptimalkan berdasarkan hasil pengujian untuk menemukan pengaturan optimal.
Parameter penyesuaian dinamis dalam kondisi pasar tertentu dapat dipertimbangkan, seperti parameter siklus yang diperbesar saat bergejolak di pasar besar.
Strategi ini memiliki konsep yang jelas dan mudah dimengerti, dengan cara menentukan arah tren dengan kecepatan dan kecepatan rata-rata, merupakan strategi pelacakan dinamis yang cocok untuk perdagangan jangka pendek dan menengah. Ada banyak ruang untuk pengoptimalan, dan efek strategi dapat ditingkatkan lebih lanjut melalui penyesuaian parameter, pemfilteran sinyal, dan sebagainya. Secara keseluruhan, ini adalah strategi perdagangan tren yang fleksibel dan praktis.
/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="[XC] Adaptive Strategy V3 - Ratio OCHL Averager no repaint",shorttitle="R_OHCL", overlay=true, currency=currency.EUR,initial_capital=10000,
default_qty_value=100, default_qty_type=strategy.percent_of_equity , calc_on_every_tick=false, calc_on_order_fills=true)
// ╔═ SETTINGS ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
strategy_1 = input ( defval=true , type=input.bool , title="STRATEGY 1? —>" )
Recursive = input(false)
RES201 = "Min",RES202= "D",RES203 = "W",RES204 = "M"
//++ Resolution 1 ++
inp_resolution1 = input(600, minval=1, title="Resolution Line 1")
restype1 = input ( defval="Min" , type=input.string , title= "Resolution Line 1" , options=[ "Min","D","W","M"])
multiplier1 = restype1 == "Min" ? "" : restype1 == "D" ? "D" : restype1 == "W" ? "W" : "M"
resolution1 = tostring(inp_resolution1)+ multiplier1
//++ Resolution 2 ++
inp_resolution2 = input(1440, minval=1, title="Resolution Line 2")
restype2 = input ( defval="Min" , type=input.string , title= "Resolution Line 2" , options=["Min","D","W","M"])
multiplier2 = restype2 == "Min" ? "" : restype2 == "D" ? "D" : restype2 == "W" ? "W" : "M"
resolution2 = tostring(inp_resolution2)+ multiplier2
StopLoss = input(defval = 500 , title = "Stop Loss", minval = 0)
TakeProfit = input(defval = 2500 , title = "Take Profit", minval = 0)
// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit = TakeProfit >= 1 ? TakeProfit : na
useStopLoss = StopLoss >= 1 ? StopLoss : na
// ╔═ BACKTEST RANGE ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
line_breakBTR = input ( defval = true , type=input.bool , title="BACKTEST RANGE —" )
FromYear = input ( defval = 2019, title = "From Year", minval = 2017)
FromMonth = input ( defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay = input ( defval = 2, title = "From Day", minval = 1, maxval = 31)
//FromHour = input ( defval = 1, title = "From Hour", minval = 1, maxval = 24)
ToYear = input ( defval = 9999, title = "To Year", minval = 2017)
//ToHour = input ( defval = 0, title = "From Hour", minval = 0, maxval = 24)
ToMonth = input ( defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay = input ( defval = 1, title = "To Day", minval = 1, maxval = 31)
// === FUNCTION EXAMPLE ===
start = timestamp(syminfo.timezone, FromYear, FromMonth, FromDay, 0, 00) // backtest start window
finish = timestamp(syminfo.timezone, ToYear , ToMonth , ToDay , 0, 59) // backtest finish window
window() => time >= start and time <= finish ? true : false // create function "within window of time"
// ╔═ INDICATOR ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
// "Ratio OCHL Averager" -> alexgrover / tradingview.com/script/RGAtOI6h-Ratio-OCHL-Averager-An-Alternative-to-VWAP/
rochla( res,Recursive)=>
//Recursive = false
H = security(syminfo.tickerid,res,high[1],gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_on)
L = security(syminfo.tickerid,res,low[1] ,gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_on)
d = 0.
//----
a = Recursive ? nz(d[1],open) : open
b = abs(close-a)/(H - L)
c = b > 1 ? 1 : b
d := c*close+(1-c)*nz(d[1],close)
strat1_line1=rochla(resolution1,Recursive)
strat1_line2=rochla(resolution2,Recursive)
plot(strat1_line1, title="Ratio OCHL Averager 1", color=#DAA520,linewidth=2,transp=0)
plot(strat1_line2, title="Ratio OCHL Averager 2", color=#B22222,linewidth=2,transp=0)
// ╔═ STRATEGY 1 ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
trading_strat1_line1 = strategy_1 == 1 ? strat1_line1 : na
trading_strat1_line2 = strategy_1 == 1 ? strat1_line2 : na
longCross = crossunder (trading_strat1_line2, trading_strat1_line1) ? true : false
shortCross = crossover (trading_strat1_line2, trading_strat1_line1) ? true : false
plot( longCross ? trading_strat1_line1 : na , title = "Long" , color=color.aqua, style=plot.style_circles, linewidth=5, offset= 0)
plot( shortCross ? trading_strat1_line2 : na , title = "Short" , color=color.red , style=plot.style_circles, linewidth=5, offset= 0)
// ╔═ Backtest 1 ╗
//░░░░░░░░░░░░░░░░░ ╚════════════════════════════╝ ░░░░░░░░░░░░░░░░░░░░░░░░
strategy.exit("close",loss = useStopLoss, profit = useTakeProfit)
if longCross and window() and strategy_1 == 1
strategy.entry("Go Long", strategy.long)
if shortCross and window() and strategy_1 == 1
strategy.entry("Go Short", strategy.short)
//end