
Idea utama strategi ini adalah untuk membina pelbagai garis rata menggunakan Ratio OCHL Averager indikator dari pelbagai kitaran, menghasilkan isyarat beli dan jual berdasarkan bentuk silang garis rata. Ia dapat menangkap trend harga secara dinamik, sesuai untuk perdagangan jangka pendek dan sederhana.
Strategi ini menggunakan Ratio OCHL Averager dua tempoh yang berbeza, sebagai garisan cepat dan garisan perlahan. Formula untuk Ratio OCHL Averager adalah seperti 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 nisbah yang mewakili pergerakan harga pada hari itu, dan c adalah nilai b selepas ia diproses secara standard. Ratio OCHL Averager menunjukkan gabungan empat harga pembukaan, harga penutupan, harga tertinggi dan harga terendah untuk membina garis rata-rata.
Strategi ini menetapkan kitaran garis cepat pendek, kitaran garis perlahan panjang. Apabila garis cepat melintasi garis perlahan menghasilkan isyarat beli, sebaliknya apabila garis cepat melintasi garis perlahan menghasilkan isyarat jual. Menggunakan prinsip persilangan garis rata untuk menangkap trend.
Indikator Ratio OCHL Averager dapat meluruskan data harga, menapis bunyi pasaran dengan berkesan, dan menjadikan isyarat perdagangan lebih dipercayai.
Persaingan dua garis sejajar yang digabungkan dengan tempoh yang berbeza untuk menentukan arah trend, lebih baik untuk menentukan permulaan trend baru.
Dengan menyesuaikan parameter kitaran garis pantas dan lambat, ia boleh disesuaikan dengan keadaan pasaran yang berbeza.
Strategi ini mudah difahami dan mudah diimplementasikan.
Anda boleh menyesuaikan standard penghentian kerosakan secara fleksibel untuk mengawal risiko.
Strategi penyeberangan rata-rata mungkin menghasilkan lebih banyak isyarat palsu, yang memerlukan penapisan dalam kombinasi dengan petunjuk teknikal lain.
Perlu memilih parameter kitaran yang tepat untuk garis cepat dan lambat, pilihan parameter yang salah boleh mempengaruhi kesan strategi.
Strategi silang dua garis sejajar adalah strategi mengikuti trend, tidak sesuai untuk keadaan gegaran, dan harus digunakan dalam keadaan trend.
Perlu menyesuaikan titik-titik hentian untuk mengurangkan risiko kerugian, dan titik-titik hentian perlu ditetapkan dengan munasabah.
Anda boleh mempertimbangkan untuk memfilterkan isyarat dengan penunjuk momentum dan sebagainya untuk meningkatkan kualiti isyarat. Contohnya MACD, KDJ dan sebagainya.
Anda boleh menguji pelbagai kombinasi parameter kitaran garis pantas dan garis perlahan untuk mencari parameter yang optimum.
Anda boleh mengoptimumkan titik henti rugi anda berdasarkan hasil tinjauan semula untuk mencari tetapan terbaik.
Parameter penyesuaian dinamik dalam keadaan pasaran tertentu boleh dipertimbangkan, seperti parameter kitaran yang meningkat semasa pergerakan pasaran besar.
Strategi ini mudah difahami, dengan arah trend yang dinilai dengan cepat dan perlahan. Ia adalah strategi pengesanan dinamik yang sesuai untuk perdagangan jangka pendek dan sederhana.
/*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