TrippleMACD 이동평균 교차와 상대강도지수를 결합한 고빈도 암호화폐 거래 전략


생성 날짜: 2024-03-22 15:41:46 마지막으로 수정됨: 2024-03-22 15:41:46
복사: 0 클릭수: 705
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

TrippleMACD 이동평균 교차와 상대강도지수를 결합한 고빈도 암호화폐 거래 전략

개요

이 글은 TripleMACD 평균선 교차와 상대적으로 약한 지표 ((RSI)) 를 결합한 고주파 암호화폐 거래 전략에 대해 소개한다. 이 전략은 3개의 서로 다른 파라미터의 MACD 지표를 이용하고, 그들의 신호선을 평균화하며, RSI 지표와 결합하여 최적의 구매 및 판매 시점을 결정한다. 이 전략은 1분 시간 프레임의 자동 거래로 설계되어, 다중 거래만을 고려한다. 이 전략은 또한 선형 회귀를 사용하여 시장의 전체 수면 단계를 식별하고, 흔들림 상태에서 거래를 피한다.

전략 원칙

이 전략의 핵심은 3개의 다른 매커니즘의 MACD 지표를 사용하여 다른 시간 단위의 트렌드 신호를 포착하는 것입니다. 3개의 다른 매커니즘의 MACD 지표의 신호선을 평균으로 계산하면 잡음을 효과적으로 완화하고 더 신뢰할 수있는 거래 신호를 제공합니다. 동시에 RSI 지표는 다중 트렌드의 강도를 확인하는 데 사용됩니다.

또한, 이 전략은 선형 회귀를 사용하여 시장의 평준화 단계를 식별한다. 그래프 상의 하향 그림선과 엔티티의 비율을 계산하여 현재 시장이 평준화 상태에 있는지 판단할 수 있다. 상하향 그림선의 길이가 엔티티의 길이의 두 배 이상이라면 시장이 평준화 단계에 있다고 간주되며, 이 전략은 거래를 피한다.

우위 분석

  1. 다중 시간 스케일 분석: 이 전략은 세 개의 다른 매개 변수의 MACD 지표를 사용하여 다양한 시간 스케일의 트렌드 신호를 포착하여 거래의 정확성과 신뢰성을 향상시킵니다.

  2. 신호 평준화: 세 개의 MACD 지표의 신호선을 평균하여 잡음을 효과적으로 평준화하여 단일 지표가 생성 할 수있는 잘못된 신호를 피할 수 있습니다.

  3. 트렌드 확인: RSI 지표와 결합하여 다목적 트렌드의 강도를 확인하면 거래 신호의 신뢰성을 더욱 높일 수 있습니다.

  4. 정렬 식별: 선형 회귀를 사용하여 시장의 정렬 단계를 식별하여 불안정한 상황에서 거래를 피하고 전략의 위험을 줄일 수 있습니다.

  5. 자동화 거래: 이 전략은 1분 시간 프레임에 대한 자동화 거래를 위해 설계되었으며, 시장의 변화에 신속하게 반응하고 거래를 수행하여 거래 효율성을 높일 수 있습니다.

위험 분석

  1. 변수 최적화: 이 전략은 3개의 MACD 지표의 빠른 느린 선주기, RSI 지표의 주기 등과 같은 여러 변수를 포함합니다. 이러한 변수 선택은 전략 성능에 중요한 영향을 미치며, 변수 최적화가 적절하지 않으면 전략 성능이 떨어질 수 있습니다.

  2. 과도한 적합성 위험: 이 전략은 특정 역사적 데이터에 대해 잘 수행 할 수 있지만 실제 적용에서 시장 변화에 적응하지 못할 수 있으며, 전략의 실패로 이어질 수 있습니다.

  3. 검은 천둥 사건: 이 전략은 주로 기술적 지표에 기반하고, 몇몇 중요한 기본적 사건에 대한 반응이 부족할 수 있으며, 이는 극단적인 시장 환경에서 전략이 좋지 않은 결과를 초래할 수 있다.

최적화 방향

  1. 동적 변수 조정: 시장 상태의 변화에 따라, MACD 지표의 빠른 느린 선 주기, RSI 지표의 주기 등 전략의 각 변수를 동적으로 조정하여 다른 시장 환경에 적응합니다.

  2. 더 많은 지표를 추가: 기존의 MACD 및 RSI 지표를 기반으로, 거래 신호의 정확성과 신뢰성을 더욱 높이기 위해 브린 밴드, 이동 평균 등과 같은 다른 기술 지표를 추가하는 것이 고려 될 수 있습니다.

  3. 위험 관리 최적화: 전략에 더 나은 위험 관리 조치를 추가하여 전략의 전반적인 위험을 낮추기 위해 동적 중단, 포지션 관리 등

  4. 기계 학습 최적화: 신경 네트워크, 지원 벡터 기계 등과 같은 기계 학습 알고리즘을 사용하여 전략의 매개 변수 및 거래 규칙을 최적화하여 전략의 적응성과 안정성을 향상시킵니다.

요약하다

이 글은 TripleMACD 평행선 교차와 RSI 지표가 결합된 HFT 암호화폐 거래 전략에 대해 소개한다. 이 전략은 3개의 서로 다른 파라미터의 MACD 지표와 RSI 지표를 사용하여 신뢰할 수 있는 거래 신호를 생성하고, 선형 회귀를 사용하여 시장의 평형 단계를 식별하여 불안정한 상황에서 거래를 피한다. 이 전략의 장점은 다중 시간 단위의 신호 분석, 평형화, 트렌드 확인, 평형화, 인식 및 자동화 거래 등의 측면에 있다. 그러나 파라미터 최적화, 과조합 및 블랙 천둥 사건과 같은 위험도 존재한다.

전략 소스 코드
/*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)