다중 지표 조정 볼린저 밴드-피보나치-MACD-RSI 지능형 거래 전략

BB MACD RSI FIB SMA EMA SMMA WMA VWMA
생성 날짜: 2024-12-12 17:20:26 마지막으로 수정됨: 2024-12-12 17:20:26
복사: 1 클릭수: 502
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

다중 지표 조정 볼린저 밴드-피보나치-MACD-RSI 지능형 거래 전략

개요

이 전략은 브린 띠, 피보나치 회수, MACD 및 RSI 등 여러 기술 지표를 결합한 통합 거래 시스템이다. 전략은 여러 지표의 연동으로, 다양한 시장 조건에서 거래 기회를 포착하고, 최대 이익 막대 방법을 적용하여 위험을 제어한다. 시스템은 모듈화된 디자인을 채택하고, 각 지표의 매개 변수가 유연하게 조정될 수 있으며, 강한 적응성과 실용성을 가지고 있다.

전략 원칙

전략은 4개의 주요 기술 지표를 사용하여 거래 신호를 생성합니다.

  1. 브린 띠 신호: 가격이 하향 궤도를 돌파하면 다중 신호가 발생하고, 상향 궤도를 돌파하면 공백 신호가 발생
  2. 피보나치 신호: 가격이 0-23.6%의 범위에서 더 많은 신호를 생성하고 61.8-100%의 범위에서 더 많은 신호를 생성합니다.
  3. MACD 신호: MACD 라인을 넘어서서 신호 라인을 생성하여 다중 신호를 생성하고, 아래로 넘어서서 공백 신호를 생성
  4. RSI 신호: RSI는 오버셀 라인보다 낮으면 더 많은 신호를 생성하고 오버빌 라인보다 높으면 더 적은 신호를 생성합니다. 어떤 지표가 신호를 생성할 때, 시스템은 즉시 거래를 시작한다. 동시에, 전략은 최대 수익을 중지하는 방법을 적용하고, 사전 설정된 수익 목표를 달성하거나 중지 손실을 유발할 때 자동으로 포지션을 평정한다.

전략적 이점

  1. 다중 지표 연동: 여러 기술 지표를 통합하여 신호 신뢰도를 높인다.
  2. 유연성: 각 지표의 매개 변수는 시장 상황에 따라 유연하게 조정할 수 있습니다.
  3. 리스크 관리가 완성된 방법: 최대 수익 스톱과 고정 스톱 손실을 결합한 방법
  4. 잘 적응: 전략은 다른 시장 주기와 변동 조건에 적응할 수 있습니다.
  5. 실행 효율성: 코드 구조가 명확하고, 연산 부하가 적당하다

전략적 위험

  1. 신호 중복: 여러 지표가 동시에 신호를 생성하여 과도한 거래가 발생할 수 있습니다.
  2. 매개 변수 민감성: 다른 매개 변수 조합은 현저하게 다른 효과를 가져올 수 있다
  3. 시장 적응성: 특정 시장 조건에서 좋지 않은 성과를 낼 수 있습니다.
  4. 슬라이 포인트 영향: 하이프 트레이딩이 슬라이 포인트 영향을 받을 수 있다.
  5. 자금 관리: 위험을 통제하기 위해 합리적인 포지션을 설정해야 합니다

전략 최적화 방향

  1. 신호 무게: 다양한 지표에 무게를 설정하여 신호 품질을 향상
  2. 시장 환경 인식: 시장 환경 인식 모듈을 추가하여 다른 시장에 따라 전략을 조정합니다.
  3. 동적 변수: 적응 변수 조정 장치를 도입
  4. 거래 비용: 비용을 줄이기 위해 거래 빈도를 최적화하십시오.
  5. 신호 필터링: 추가 필터링 조건을 추가하여 잘못된 신호를 줄인다.

요약하다

이 전략은 다중 지표 협동으로 전략의 안정성을 보장하면서 거래 효율을 높인다. 약간의 위험이 있지만, 합리적인 위험 제어와 지속적인 최적화를 통해 전략은 더 나은 실용적 가치를 가지고 있다. 실제 거래 전에 충분한 피드백과 변수 최적화를 수행하는 것이 좋습니다.

전략 소스 코드
/*backtest
start: 2024-12-04 00:00:00
end: 2024-12-11 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Demo GPT Bollinger, Fibonacci, MACD & RSI with Max Profit Exit", overlay=true)

// === User Inputs for Bollinger Bands ===
length_bb = input.int(20, minval=1, title="Bollinger Bands Length")
maType_bb = input.string("SMA", title="Bollinger Bands MA Type", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
src_bb = input(close, title="Bollinger Bands Source")
mult_bb = input.float(2.0, minval=0.001, maxval=50, title="Bollinger Bands StdDev")
offset_bb = input.int(0, title="Bollinger Bands Offset", minval=-500, maxval=500)

// === User Inputs for Fibonacci Levels ===
lookback_fib = input.int(50, minval=1, title="Fibonacci Lookback Period")

// === User Inputs for MACD ===
macd_fast = input.int(12, minval=1, title="MACD Fast Length")
macd_slow = input.int(26, minval=1, title="MACD Slow Length")
macd_signal = input.int(9, minval=1, title="MACD Signal Length")

// === User Inputs for RSI ===
rsi_length = input.int(14, title="RSI Length")
rsi_overbought = input.int(70, title="RSI Overbought Level")
rsi_oversold = input.int(30, title="RSI Oversold Level")

// === Start and End Date Inputs ===
start_date = input(timestamp("2023-01-01 00:00:00"), title="Start Date")
end_date = input(timestamp("2069-12-31 23:59:59"), title="End Date")

// === Moving Average Function ===
ma(source, length, _type) =>
    switch _type
        "SMA" => 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)

// === Bollinger Bands Calculation ===
basis_bb = ma(src_bb, length_bb, maType_bb)
dev_bb = mult_bb * ta.stdev(src_bb, length_bb)
upper_bb = basis_bb + dev_bb
lower_bb = basis_bb - dev_bb

// === Fibonacci Levels Calculation ===
highest_price = ta.highest(high, lookback_fib)
lowest_price = ta.lowest(low, lookback_fib)

fib_0 = lowest_price
fib_23 = lowest_price + 0.236 * (highest_price - lowest_price)
fib_38 = lowest_price + 0.382 * (highest_price - lowest_price)
fib_50 = lowest_price + 0.5 * (highest_price - lowest_price)
fib_61 = lowest_price + 0.618 * (highest_price - lowest_price)
fib_100 = highest_price

// === MACD Calculation ===
[macd_line, signal_line, _] = ta.macd(close, macd_fast, macd_slow, macd_signal)

// === RSI Calculation ===
rsi = ta.rsi(close, rsi_length)

// === Plotting for Reference ===
plot(basis_bb, "Bollinger Basis", color=color.blue, offset=offset_bb)
p1_bb = plot(upper_bb, "Bollinger Upper", color=color.red, offset=offset_bb)
p2_bb = plot(lower_bb, "Bollinger Lower", color=color.green, offset=offset_bb)
fill(p1_bb, p2_bb, title="Bollinger Bands Background", color=color.rgb(33, 150, 243, 95))

plot(fib_0, "Fib 0%", color=color.gray)
plot(fib_23, "Fib 23.6%", color=color.yellow)
plot(fib_38, "Fib 38.2%", color=color.orange)
plot(fib_50, "Fib 50%", color=color.blue)
plot(fib_61, "Fib 61.8%", color=color.green)
plot(fib_100, "Fib 100%", color=color.red)

hline(0, "MACD Zero Line", color=color.gray)
plot(macd_line, "MACD Line", color=color.blue)
plot(signal_line, "Signal Line", color=color.orange)

hline(rsi_overbought, "RSI Overbought", color=color.red)
hline(rsi_oversold, "RSI Oversold", color=color.green)
plot(rsi, "RSI", color=color.blue)

// === Combined Trading Logic ===
// Bollinger Bands Signals
long_bb = ta.crossover(close, lower_bb)
short_bb = ta.crossunder(close, upper_bb)

// Fibonacci Signals
long_fib = close <= fib_23 and close >= fib_0
short_fib = close >= fib_61 and close <= fib_100

// MACD Signals
long_macd = ta.crossover(macd_line, signal_line)
short_macd = ta.crossunder(macd_line, signal_line)

// RSI Signals
long_rsi = rsi < rsi_oversold
short_rsi = rsi > rsi_overbought

// Combined Long and Short Conditions
long_condition = (long_bb or long_fib or long_macd or long_rsi) 
short_condition = (short_bb or short_fib or short_macd or short_rsi) 
// === Max Profit Exit Logic ===
// Define the maximum profit exit percentage
take_profit_percentage = input.float(5.0, title="Take Profit (%)", minval=0.1, maxval=100) / 100
stop_loss_percentage = input.float(2.0, title="Stop Loss (%)", minval=0.1, maxval=100) / 100

// Track the highest price during the trade
var float max_profit_price = na
if (strategy.opentrades > 0)
    max_profit_price := na(max_profit_price) ? strategy.opentrades.entry_price(0) : math.max(max_profit_price, high)

// Calculate the take profit and stop loss levels based on the max profit price
take_profit_level = max_profit_price * (1 + take_profit_percentage)
stop_loss_level = max_profit_price * (1 - stop_loss_percentage)

// Exit the trade if the take profit or stop loss level is hit
if (strategy.opentrades > 0)
    if (close >= take_profit_level)
        strategy.exit("Take Profit", from_entry="Long", limit=take_profit_level)
    if (close <= stop_loss_level)
        strategy.exit("Stop Loss", from_entry="Long", stop=stop_loss_level)

if (strategy.opentrades > 0)
    if (close <= take_profit_level)
        strategy.exit("Take Profit", from_entry="Short", limit=take_profit_level)
    if (close >= stop_loss_level)
        strategy.exit("Stop Loss", from_entry="Short", stop=stop_loss_level)

// === Execute Trades ===
if (long_condition)
    strategy.entry("Long", strategy.long, when=not na(long_condition))

if (short_condition)
    strategy.entry("Short", strategy.short, when=not na(short_condition))