
Artikel ini membentangkan strategi perdagangan cryptocurrency frekuensi tinggi berdasarkan TrippleMACD rata-rata silang dengan indikator yang agak kuat ((RSI)). Strategi ini menggunakan tiga set indikator MACD dengan parameter yang berbeza dan rata-rata garis isyarat mereka, sambil menggabungkan indikator RSI untuk menentukan masa pembelian dan penjualan yang terbaik. Strategi ini direka untuk perdagangan automatik pada bingkai masa 1 minit, hanya mempertimbangkan perdagangan berbilang kepala.
Inti strategi ini adalah menggunakan tiga set penunjuk MACD dengan parameter yang berbeza untuk menangkap isyarat trend pada skala masa yang berbeza. Dengan membuat purata pada garis isyarat tiga set penunjuk MACD, bunyi bising dapat diatasi dengan berkesan dan memberikan isyarat perdagangan yang lebih dipercayai. Pada masa yang sama, penunjuk RSI digunakan untuk mengesahkan kekuatan trend multihead.
Selain itu, strategi ini juga menggunakan kemunduran linear untuk mengenal pasti tahap penutupan pasaran. Dengan mengira nisbah garis bawah yang terdapat pada carta, anda dapat menentukan sama ada pasaran semasa berada dalam keadaan penutupan. Jika panjang garis atas dan bawah lebih dari dua kali ganda daripada panjang entiti, anda menganggap pasaran berada dalam tahap penutupan, dan strategi ini akan mengelakkan perdagangan.
Analisis pelbagai skala masa: Dengan menggunakan tiga set penunjuk MACD dengan parameter yang berbeza, strategi ini dapat menangkap isyarat trend pada skala masa yang berbeza, meningkatkan ketepatan dan kebolehpercayaan perdagangan.
Pelancaran isyarat: dengan rata-rata garis isyarat tiga kumpulan penunjuk MACD, bunyi bising dapat dihaluskan dengan berkesan, mengelakkan isyarat yang menyesatkan yang mungkin dihasilkan oleh satu penunjuk.
Pengesahan Trend: Pengesahan kekuatan trend berbilang arah yang digabungkan dengan RSI dapat meningkatkan lagi kebolehpercayaan isyarat perdagangan.
Pengenalan penumpuan: Menggunakan pengembalian linear untuk mengenal pasti tahap penumpuan pasaran, yang dapat mengelakkan perdagangan dalam keadaan yang bergolak, mengurangkan risiko strategi.
Perdagangan automatik: Strategi ini direka untuk perdagangan automatik dalam jangka masa 1 minit, yang dapat bertindak balas dengan cepat terhadap perubahan pasaran dan melaksanakan perdagangan, meningkatkan kecekapan perdagangan.
Pengoptimuman parameter: Strategi ini melibatkan beberapa parameter, seperti kitaran garis cepat dan lambat tiga kumpulan penunjuk MACD, kitaran penunjuk RSI, dan lain-lain. Pilihan parameter ini mempunyai kesan penting terhadap prestasi strategi, dan jika parameter tidak dioptimumkan dengan betul, ia boleh menyebabkan penurunan prestasi strategi.
Risiko overfit: Strategi mungkin berfungsi dengan baik pada data sejarah tertentu, tetapi mungkin tidak dapat menyesuaikan diri dengan perubahan pasaran dalam aplikasi sebenar, menyebabkan strategi tidak berfungsi.
Kejadian Black Swan: Strategi ini adalah berdasarkan kepada indikator teknikal dan mungkin kurang responsif terhadap beberapa peristiwa asas yang penting, yang boleh menyebabkan strategi tidak berfungsi dengan baik dalam keadaan pasaran yang melampau.
Penyesuaian parameter dinamik: mengikut perubahan keadaan pasaran, parameter dalam strategi penyesuaian dinamik, seperti kitaran garis laju MACD, kitaran RSI, dan sebagainya, untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.
Tambah lebih banyak petunjuk: Di atas asas MACD dan RSI yang sedia ada, penambahan petunjuk teknikal lain seperti Brinks, Moving Averages dan lain-lain boleh dipertimbangkan untuk meningkatkan lagi ketepatan dan kebolehpercayaan isyarat perdagangan.
Pengurusan risiko yang dioptimumkan: Menambah langkah-langkah pengurusan risiko yang lebih baik dalam strategi, seperti hentian dinamik, pengurusan kedudukan, dan sebagainya, untuk mengurangkan risiko keseluruhan strategi.
Pengoptimuman Pembelajaran Mesin: Menggunakan algoritma pembelajaran mesin, seperti rangkaian saraf, mesin vektor sokongan, dan lain-lain, untuk mengoptimumkan parameter strategi dan peraturan perdagangan, meningkatkan kemampuan beradaptasi dan ketahanan strategi.
Artikel ini memperkenalkan strategi perdagangan cryptocurrency frekuensi tinggi yang berasaskan TripleMACD rata-rata silang dengan RSI. Strategi ini menggunakan tiga set parameter yang berbeza dari MACD dan RSI untuk menghasilkan isyarat perdagangan yang boleh dipercayai, sambil menggunakan kemunduran linear untuk mengenal pasti tahap penyesuaian pasaran, untuk mengelakkan perdagangan dalam keadaan yang bergolak.
/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
//indicator("Triplle",shorttitle="Triplle MACD", overlay=true, scale = scale.none)
//indicator("Triplle","TrippleMACD",true)
strategy(title="TrippleMACD", shorttitle="TrippleMACD + RSI strategy", format=format.price, precision=4, overlay=true)
// RSI
ma(source, length, type) =>
switch type
"SMA" => ta.sma(source, length)
"Bollinger Bands" => ta.sma(source, length)
"EMA" => ta.ema(source, length)
"SMMA (RMA)" => ta.rma(source, length)
"WMA" => ta.wma(source, length)
"VWMA" => ta.vwma(source, length)
rsiLengthInput = input.int(14, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(14, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")
showDivergence = input.bool(false, title="Show Divergence", group="RSI Settings")
up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
rsiMA = ma(rsi, maLengthInput, maTypeInput)
isBB = maTypeInput == "Bollinger Bands"
//rsiPlot = plot(rsi, "RSI", color=#7E57C2)
//plot(rsiMA, "RSI-based MA", color=color.yellow)
//rsiUpperBand = hline(70, "RSI Upper Band", color=#787B86)
//midline = hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
//rsiLowerBand = hline(30, "RSI Lower Band", color=#787B86)
//fill(rsiUpperBand, rsiLowerBand, color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")
bbUpperBand = plot(isBB ? rsiMA + ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Upper Bollinger Band", color=color.green)
bbLowerBand = plot(isBB ? rsiMA - ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Lower Bollinger Band", color=color.green)
//fill(bbUpperBand, bbLowerBand, color= isBB ? color.new(color.green, 90) : na, title="Bollinger Bands Background Fill")
//midLinePlot = plot(50, color = na, editable = false, display = display.none)
//fill(rsiPlot, midLinePlot, 100, 70, top_color = color.new(color.green, 0), bottom_color = color.new(color.green, 100), title = "Overbought Gradient Fill")
//fill(rsiPlot, midLinePlot, 30, 0, top_color = color.new(color.red, 100), bottom_color = color.new(color.red, 0), title = "Oversold Gradient Fill")
// Divergence
lookbackRight = 5
lookbackLeft = 5
rangeUpper = 60
rangeLower = 5
bearColor = color.red
bullColor = color.green
textColor = color.white
noneColor = color.new(color.white, 100)
plFound = na(ta.pivotlow(rsi, lookbackLeft, lookbackRight)) ? false : true
phFound = na(ta.pivothigh(rsi, lookbackLeft, lookbackRight)) ? false : true
_inRange(cond) =>
bars = ta.barssince(cond == true)
rangeLower <= bars and bars <= rangeUpper
//------------------------------------------------------------------------------
// Regular Bullish
// rsi: Higher Low
rsiHL = rsi[lookbackRight] > ta.valuewhen(plFound, rsi[lookbackRight], 1) and _inRange(plFound[1])
// Price: Lower Low
priceLL = low[lookbackRight] < ta.valuewhen(plFound, low[lookbackRight], 1)
bullCondAlert = priceLL and rsiHL and plFound
bullCond = showDivergence and bullCondAlert
// plot(
// plFound ? rsi[lookbackRight] : na,
// offset=-lookbackRight,
// title="Regular Bullish",
// linewidth=2,
// color=(bullCond ? bullColor : noneColor)
// )
// plotshape(
// bullCond ? rsi[lookbackRight] : na,
// offset=-lookbackRight,
// title="Regular Bullish Label",
// text=" Bull ",
// style=shape.labelup,
// location=location.absolute,
// color=bullColor,
// textcolor=textColor
// )
//------------------------------------------------------------------------------
// Regular Bearish
// rsi: Lower High
rsiLH = rsi[lookbackRight] < ta.valuewhen(phFound, rsi[lookbackRight], 1) and _inRange(phFound[1])
// Price: Higher High
priceHH = high[lookbackRight] > ta.valuewhen(phFound, high[lookbackRight], 1)
bearCondAlert = priceHH and rsiLH and phFound
bearCond = showDivergence and bearCondAlert
// plot(
// phFound ? rsi[lookbackRight] : na,
// offset=-lookbackRight,
// title="Regular Bearish",
// linewidth=2,
// color=(bearCond ? bearColor : noneColor)
// )
// plotshape(
// bearCond ? rsi[lookbackRight] : na,
// offset=-lookbackRight,
// title="Regular Bearish Label",
// text=" Bear ",
// style=shape.labeldown,
// location=location.absolute,
// color=bearColor,
// textcolor=textColor
// )
// END RSI
// Getting inputs
stopLuse = input(1.040)
fast_length = input(title = "Fast Length", defval = 5)
slow_length = input(title = "Slow Length", defval = 8)
fast_length2 = input(title = "Fast Length2", defval = 13)
slow_length2 = input(title = "Slow Length2", defval = 21)
fast_length3 = input(title = "Fast Length3", defval = 34)
slow_length3 = input(title = "Slow Length3", defval = 144)
fast_length4 = input(title = "Fast Length3", defval = 68)
slow_length4 = input(title = "Slow Length3", defval = 288)
src = input(title = "Source", defval = close)
signal_length2 = input.int(title="Signal Smoothing", minval = 1, maxval = 200, defval = 11)
signal_length = input.int(title = "Signal Smoothing", minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title = "Oscillator MA Type", defval = "EMA", options = ["SMA", "EMA"])
sma_signal = input.string(title = "Signal Line MA Type", defval = "EMA", options = ["SMA", "EMA"])
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
fast_ma2 = sma_source == "SMA2" ? ta.sma(src, fast_length2) : ta.ema(src, fast_length2)
slow_ma2 = sma_source == "SMA2" ? ta.sma(src, slow_length2) : ta.ema(src, slow_length2)
fast_ma3 = sma_source == "SMA3" ? ta.sma(src, fast_length3) : ta.ema(src, fast_length3)
slow_ma3 = sma_source == "SMA3" ? ta.sma(src, slow_length3) : ta.ema(src, slow_length3)
fast_ma4 = sma_source == "SMA3" ? ta.sma(src, fast_length3) : ta.ema(src, fast_length3)
slow_ma4 = sma_source == "SMA3" ? ta.sma(src, slow_length3) : ta.ema(src, slow_length3)
macd = fast_ma - slow_ma
macd2 = fast_ma2 - slow_ma2
macd3 = fast_ma3 - slow_ma3
macd4 = fast_ma4 - slow_ma4
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
signal2 = sma_signal == "SMA" ? ta.sma(macd2, signal_length) : ta.ema(macd2, signal_length)
signal3 = sma_signal == "SMA" ? ta.sma(macd3, signal_length) : ta.ema(macd3, signal_length)
signal4 = sma_signal == "SMA" ? ta.sma(macd4, signal_length) : ta.ema(macd4, signal_length)
//hist = (macd + macd2 + macd3)/1 - (signal + signal2 + signal3)/1
hist = (macd + macd2 + macd3 + macd4)/4 - (signal + signal2 + signal3 + signal4)/4
signal5 = (signal + signal2 + signal3)/3
sma_signal2 = input.bool(title="Simple MA (Signal Line)", defval=true)
lin_reg = input.bool(title="Lin Reg", defval=true)
linreg_length = input.int(title="Linear Regression Length", minval = 1, maxval = 200, defval = 11)
bopen = lin_reg ? ta.linreg(open, linreg_length, 0) : open
bhigh = lin_reg ? ta.linreg(high, linreg_length, 0) : high
blow = lin_reg ? ta.linreg(low, linreg_length, 0) : low
bclose = lin_reg ? ta.linreg(close, linreg_length, 0) : close
shadow = (bhigh - bclose) + (bopen - blow)
body = bclose - bopen
perc = (shadow/body)
cond2 = perc >=2 and bclose+bclose[1]/2 > bopen+bopen[1]/2
r = bopen < bclose
//signal5 = sma_signal2 ? ta.sma(bclose, signal_length) : ta.ema(bclose, signal_length)
plotcandle(r ? bopen : na, r ? bhigh : na, r ? blow: na, r ? bclose : na, title="LinReg Candles", color= color.green, wickcolor=color.green, bordercolor=color.green, editable= true)
plotcandle(r ? na : bopen, r ? na : bhigh, r ? na : blow, r ? na : bclose, title="LinReg Candles", color=color.red, wickcolor=color.red, bordercolor=color.red, editable= true)
//alertcondition(hist[1] >= 0 and hist < 0, title = 'Rising to falling', message = 'The MACD histogram switched from a rising to falling state')
//alertcondition(hist[1] <= 0 and hist > 0, title = 'Falling to rising', message = 'The MACD histogram switched from a falling to rising state')
green = hist >= 0 ? (hist[1] < hist ? "G" : "GL") : (hist[1] < hist ? "RL" : "R")
Buy = green == "G" and green[1] != "G" and green[1] != "GL" and bopen < bclose and rsi < 55.0 //and not cond2
//StopBuy = (green == "R" or green == "RL" or green == "RL") and bopen > bclose and bopen[1] < bclose[1]
StopBuy = bopen > bclose and bopen[1] < bclose[1] and (green == "G" or green == "GL" or green == "R") and bopen[2] < bclose[2] and bopen[3] < bclose[3]
hists = close[3] < close[2] and close[2] < close[1]
//Buy = green == "RL" and hist[0] > -0.07 and hist[0] < 0.00 and rsi < 55.0 and hists
//StopBuy = green == "GL" or green == "R"
alertcondition(Buy, "Long","Покупка в лонг")
alertcondition(StopBuy, "StopLong","Закрытие сделки")
//hline(0, "Zero Line", color = color.new(#787B86, 50))
plot(hist + (close - (close * 0.03)), title = "Histogram", style = plot.style_line, color = (hist >= 0 ? (hist[1] < hist ? #26A69A : #B2DFDB) : (hist[1] < hist ? #FFCDD2 : #FF5252)))
plotshape(Buy ? low : na, 'Buy', shape.labelup, location.belowbar , color=color.new(#0abe40, 50), size=size.small, offset=0)
plotshape(StopBuy ? low : na, 'Buy', shape.cross, location.abovebar , color=color.new(#be0a0a, 50), size=size.small, offset=0)
plot(macd4 + (close - (close * 0.01)), title = "MACD", color = #2962FF)
plot(signal5 + (close - (close * 0.01)), title = "Signal", color = #FF6D00)
plotchar(cond2 , char='↓', color = color.rgb(0, 230, 119), text = "-")
if (Buy)
strategy.entry("long", strategy.long)
// if (startShortTrade)
// strategy.entry("short", strategy.short)
profitTarget = strategy.position_avg_price * stopLuse
strategy.exit("Take Profit", "long", limit=profitTarget)
// strategy.exit("Take Profit", "short", limit=profitTarget)