Artikel ini akan menjelaskan strategi untuk melakukan perdagangan kuantitatif berdasarkan penilaian dinamika tren. Strategi ini menggunakan indikator yang komprehensif untuk menilai dinamika harga seperti garis rata-rata, MACD, RSI, dan lain-lain untuk menangkap peluang tren garis tengah dan panjang.
Indikator penilaian utama dari strategi ini meliputi:
EMA adalah garis rata-rata yang menentukan tren harga dalam periode yang berbeda.
MACD, untuk melihat apakah ada perubahan momentum jangka pendek;
RSI, untuk melihat apakah ada overbought atau oversold;
ATR, menghitung stop loss dan posisi stop
Ini mengintegrasikan indikator-indikator ini untuk menilai apakah harga mengalami terobosan yang kuat dan berkelanjutan, dan menentukan apakah tren dimulai, membentuk sinyal perdagangan.
Ketika EMA jangka pendek berbalik beberapa kali, maka akan dianggap sebagai konsolidasi, dan hanya akan masuk jika melewati EMA jangka panjang.
MACDIimplement momentum change judgement, RSI avoid back to top touch bottom. ATR set stop loss stop brake control single risk.
Kedua, keunggulan strategi
Keuntungan terbesar dari strategi ini adalah bahwa indikator saling melengkapi, sehingga dapat secara efektif mengindikasikan dimulainya tren garis tengah dan panjang.
Keuntungan lain adalah pengaturan Stop Loss Stop, yang dapat mengunci tren untuk mendapatkan keuntungan dan mengendalikan risiko.
Terakhir, EMA bertingkat secara periodik, yang dapat masuk ke tren dengan intensitas yang berbeda.
Ketiga, potensi risiko
Namun, strategi ini juga memiliki risiko:
Pertama-tama, mungkin ada keterlambatan dalam penilaian tren, kemungkinan adanya bocoran.
Kedua, stop loss terlalu radikal untuk menghadapi risiko yang ditanamkan.
Akhirnya, untuk melepaskan diri dari tekanan, perlu persiapan psikologis.
Empat isi, ringkasan
Artikel ini menjelaskan strategi kuantitatif berdasarkan penilaian dinamika tren. Ini menggunakan indikator seperti garis rata-rata, MACD, RSI untuk menentukan arah tren. Dengan parameter yang dioptimalkan, risiko dapat dikontrol, dan keuntungan yang stabil dapat diperoleh.
/*backtest
start: 2023-08-14 00:00:00
end: 2023-08-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("QuantCat Mom Finder Strateg (1H)", overlay=true)
//Series to sum the amount of crosses in EMA for sideways trend/noise filtering
//can change EMA lengths, can change to SMA's/WMA's e.t.c
lookback_value = 60
minMA = 20
midMA = 40
maxMA = 60
ema25_crossover = (crossover(close, ema(close, minMA))) == true ? 1 : 0
ema25_crossover_sum = sum(ema25_crossover, lookback_value) ///potentially change lookback value to alter results
ema50_crossover = (crossover(close, ema(close, midMA))) == true ? 1 : 0
ema50_crossover_sum = sum(ema50_crossover, lookback_value) ///potentially change lookback value to alter results
ema75_crossover = (crossover(close, ema(close, maxMA))) == true ? 1 : 0
ema75_crossover_sum = sum(ema75_crossover, lookback_value) ///potentially change lookback value to alter results
ema25_crossunder = (crossunder(close, ema(close, minMA))) == true ? 1 : 0
ema25_crossunder_sum = sum(ema25_crossunder, lookback_value) ///potentially change lookback value to alter results
ema50_crossunder = (crossunder(close, ema(close, midMA))) == true ? 1 : 0
ema50_crossunder_sum = sum(ema50_crossunder, lookback_value) ///potentially change lookback value to alter results
ema75_crossunder = (crossunder(close, ema(close, maxMA))) == true ? 1 : 0
ema75_crossunder_sum = sum(ema75_crossunder, lookback_value) ///potentially change lookback value to alter results4
//Boolean series declaration
//can change amount of times crossed over the EMA verification to stop sideways trend filtering (3)
maxNoCross=2
macdmidlinebull=-0.5
macdmidlinebear=0.5
[macdLine, signalLine, histLine] = macd(close, 12, 26, 9)
//---------------
//Series Creation
bullishMacd = (macdLine > signalLine) and (macdLine > macdmidlinebull) ? true : false
bearishMacd = (macdLine < signalLine) and (macdLine < macdmidlinebear) ? true : false
bullRsiMin = 50 //53 initial values
bullRsiMax = 60 //61
bearRsiMin = 40 //39
bearRsiMax = 50 //47
basicBullCross25bool = ((ema25_crossover_sum < ema50_crossover_sum)
and (ema25_crossover_sum < ema75_crossover_sum)
and (ema25_crossover_sum < maxNoCross)
and crossover(close, ema(close, minMA)) and (rsi(close, 14) > bullRsiMin)
and (rsi(close, 14) < bullRsiMax) and (bullishMacd == true)) ? true : false
basicBullCross50bool = ((ema50_crossover_sum < ema25_crossover_sum)
and (ema50_crossover_sum < ema75_crossover_sum)
and (ema50_crossover_sum < maxNoCross)
and crossover(close, ema(close, midMA)) and (rsi(close, 14) > bullRsiMin)
and (basicBullCross25bool == false)
and (rsi(close, 14) < bullRsiMax) and (bullishMacd == true)) ? true : false
basicBullCross75bool = ((ema75_crossover_sum < ema25_crossover_sum)
and (ema75_crossover_sum < ema50_crossover_sum)
and (ema75_crossover_sum < maxNoCross)
and crossover(close, ema(close, maxMA)) and (rsi(close, 14) > bullRsiMin)
and (basicBullCross25bool == false) and (basicBullCross50bool == false)
and (rsi(close, 14) < bullRsiMax) and (bullishMacd == true)) ? true : false
basicBearCross25bool = ((ema25_crossunder_sum < ema50_crossunder_sum)
and (ema25_crossunder_sum < ema75_crossunder_sum)
and (ema25_crossunder_sum < maxNoCross)
and crossunder(close, ema(close, minMA)) and (rsi(close, 14) <bearRsiMax)
and (rsi(close, 14) > bearRsiMin) and (bearishMacd == true)) ? true : false
basicBearCross50bool = ((ema50_crossunder_sum < ema25_crossunder_sum)
and (ema50_crossunder_sum < ema75_crossover_sum)
and (ema50_crossunder_sum < maxNoCross)
and crossunder(close, ema(close, midMA)) and (rsi(close, 14) < bearRsiMax)
and (basicBearCross25bool == false)
and (rsi(close, 14) > bearRsiMin) and (bearishMacd == true)) ? true : false
basicBearCross75bool = ((ema75_crossunder_sum < ema25_crossunder_sum)
and (ema75_crossunder_sum < ema50_crossunder_sum)
and (ema75_crossunder_sum < maxNoCross)
and crossunder(close, ema(close, maxMA)) and (rsi(close, 14) < bearRsiMax)
and (basicBearCross25bool == false) and (basicBearCross50bool == false)
and (rsi(close, 14) > bearRsiMin) and (bearishMacd == true)) ? true : false
//STRATEGY
//can change lookback input on ATR
atrLkb = input(14, minval=1, title='ATR Stop Period')
atrRes = input("D", title='ATR Resolution')
atr = security(syminfo.tickerid, atrRes, atr(atrLkb))
longCondition = (basicBullCross25bool or basicBullCross50bool or basicBullCross75bool) == true
if (longCondition)
strategy.entry("Long", strategy.long)
shortCondition = (basicBearCross25bool or basicBearCross50bool or basicBearCross75bool) == true
if (shortCondition)
strategy.entry("Short", strategy.short)
// Calc ATR Stops
// can change atr multiplier to affect stop distance/tp distance, and change "close" to ema values- could try ema 50
stopMult = 0.6 //0.6 is optimal
longStop = na
longStop := shortCondition ? na : longCondition and strategy.position_size <=0 ? close - (atr * stopMult) : longStop[1]
shortStop = na
shortStop := longCondition ? na : shortCondition and strategy.position_size >=0 ? close + (atr * stopMult) : shortStop[1]
//Calc ATR Target
targetMult = 2.2 //2.2 is optimal for crypto x/btc pairs
longTarget = na
longTarget := shortCondition ? na : longCondition and strategy.position_size <=0 ? close + (atr*targetMult) : longTarget[1]
shortTarget = na
shortTarget := longCondition ? na : shortCondition and strategy.position_size >=0 ? close - (atr*targetMult) : shortTarget[1]
// Place the exits
strategy.exit("Long ATR Stop", "Long", stop=longStop, limit=longTarget)
strategy.exit("Short ATR Stop", "Short", stop=shortStop, limit=shortTarget)
//Bar color series
longColour = longCondition ? lime : na
shortColour = shortCondition ? red : na
// Plot the stoplosses and targets
plot(longStop, style=linebr, color=red, linewidth=2, title='Long ATR Stop')
plot(shortStop, style=linebr, color=red, linewidth=2, title='Short ATR Stop')
plot(longTarget, style=linebr, linewidth=2, color=lime, title='Long ATR Target')
plot(shortTarget, linewidth=2, style=linebr, color=lime, title='Long ATR Target')
barcolor(color=longColour)
barcolor(color=shortColour)
alertcondition(((basicBullCross25bool or basicBullCross50bool or basicBullCross75bool)==true), title='Long Entry', message='Bullish Momentum Change!')
alertcondition(((basicBearCross25bool or basicBearCross50bool or basicBearCross75bool)==true), title='Short Entry', message='Bearish Momentum Change!')