리소스 로딩... 로딩...

다중 지표 동적 거래 전략

저자:차오장, 날짜: 2024-07-30 17:29:59
태그:EMARSISMATPSL

img

전반적인 설명

이 전략은 여러 가지 기술적 지표에 기반한 포괄적인 거래 시스템으로, 주로 기하급수적인 이동 평균 (EMA), 상대적 강도 지수 (RSI), 거래량을 활용하여 거래 신호를 생성하고 포지션을 관리합니다. 이 전략은 EMA 크로스오버를 통해 시장 추세를 결정하고, RSI 지표를 사용하여 과잉 구매 및 과잉 판매 조건을 판단하고, 신호 강도를 확인하기 위해 거래량을 결합합니다. 또한, 이 전략에는 역동적 인 이윤 취득 및 스톱-손실 메커니즘과 위험 통제 및 거래 성과를 최적화하기위한 고정 보유 시간 제한이 포함됩니다.

전략 원칙

  1. 무역 신호 생성:

    • 긴 진입: EMA34가 EMA89를 넘고 RSI는 30보다 크다
    • 짧은 입점: EMA34가 EMA89 아래로 넘어가고 RSI는 70보다 낮습니다.
  2. 동적 취득 및 중지 손실:

    • 트레이딩 볼륨이 지난 20개의 촛불의 평균 볼륨의 3배 이상일 때 수익을 취하고 손해를 멈추는 가격을 업데이트합니다.
    • 높은 부피가 발생했을 때 결제 가격으로 수익을 취하고 손실을 멈추는 가격을 설정합니다.
  3. 고정된 대기 시간:

    • 이윤이나 손실에 관계없이 15개의 촛불이 지나면 포지션 폐쇄를 강요합니다.
  4. EMA 스톱 로스:

    • 동적 스톱 로스 라인으로 EMA34를 사용합니다.
  5. 부피 확인:

    • 신호 강도를 확인하고 수익을 취하고 손실을 멈추는 가격을 업데이트하기 위해 높은 볼륨 조건을 사용합니다.

전략적 장점

  1. 멀티 지표 시너지: EMA, RSI 및 볼륨을 통합하여 포괄적인 시장 분석을 수행하여 신호 신뢰성을 향상시킵니다.

  2. 동적 리스크 관리: 다른 시장 환경에 적응하여 시장 변동성에 따라 실시간으로 수익을 취하고 손실을 멈추는 것을 조정합니다.

  3. 고정 보유 시간: 각 거래에 대한 노출 시간을 제어하여 장기 보유와 관련된 위험을 피합니다.

  4. EMA 동적 스톱 로스: 동적 지원 및 저항으로 이동 평균을 활용하여 보다 유연한 스톱 로스 보호를 제공합니다.

  5. 볼륨 확인: 신호 강도를 확인하기 위해 볼륨 브레이크를 사용하여 거래 정확도를 높입니다.

  6. 시각 보조: 차트에서 구매/판매 신호와 주요 가격 수준을 설명하여 분석 및 의사결정을 촉진합니다.

전략 위험

  1. 불투명한 시장 위험: EMA 크로스오버는 변동적이고 변동적인 시장에서 빈번한 잘못된 신호를 일으킬 수 있습니다.

  2. 고정된 RSI 문턱: 설정된 RSI 문턱은 모든 시장 조건에 적합하지 않을 수 있습니다.

  3. 용량 경격 감수성: 3배 평균 용량 경계는 너무 높거나 낮을 수 있으므로 특정 시장에 대한 조정이 필요합니다.

  4. 고정 보유 시간 제한: 15 촛불 고정 폐쇄 시간은 유리한 거래를 조기에 종료 할 수 있습니다.

  5. 이윤을 취하고 손실을 멈추는 가격 설정: 이윤을 취하고 손실을 멈추는 경우 높은 부피 발생 시 폐쇄 가격을 사용하는 것이 최적이 아닐 수 있습니다.

전략 최적화 방향

  1. 동적 RSI 임계: 시장 변동성에 따라 자동으로 RSI 과잉 구매/ 과잉 판매 임계치를 조정합니다.

  2. 부피 임계치를 최적화: 역사적인 데이터에 기초하여 부피 파업 곱셈을 동적으로 조정할 수 있는 적응 메커니즘을 도입합니다.

  3. 보유 시간 관리를 개선합니다. 트렌드 강도와 수익성에 따라 최대 보유 시간을 동적으로 조정합니다.

  4. 수익을 취하고 손실을 멈추는 설정을 개선하십시오: 시장 변동성에 따라 수익을 취하고 손실을 멈추는 가격을 동적으로 설정하기 위해 ATR 지표를 통합하는 것을 고려하십시오.

  5. 트렌드 필터 추가: 주요 트렌드에 반대되는 거래를 피하기 위해 장기 EMA 또는 트렌드 지표를 도입하십시오.

  6. 가격 행동 분석을 통합: 입출격 정밀도를 향상시키기 위해 촛불 패턴과 지원 / 저항 수준을 결합하십시오.

  7. 유출 통제를 고려하십시오: 최대 유출 제한을 설정하여 특정 유출 수준이 달성되면 포지션을 폐쇄하도록 강요합니다.

요약

이 다중 지표 동적 거래 전략은 EMA, RSI 및 볼륨을 결합하여 포괄적 인 거래 시스템을 만듭니다. 시장 추세를 포착 할뿐만 아니라 동적 인 이익/손실 중지 및 고정 보유 시간으로 위험을 관리합니다. 전략의 강점은 다차원 분석 및 유연한 위험 관리에 있습니다. 그러나 변화하는 시장 환경의 과제에도 직면합니다. RSI 임계, 볼륨 판단 기준, 보유 시간 관리 및 수익/손실 중지 설정을 더 최적화함으로써이 전략은 다양한 시장 조건에서 더 나은 성과를 낼 가능성이 있습니다. 궁극적으로이 전략은 거래자에게 개인 거래 스타일과 시장 특성에 따라 사용자 정의 및 개선 할 수있는 신뢰할 수있는 프레임워크를 제공합니다.


/*backtest
start: 2024-06-29 00:00:00
end: 2024-07-29 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("EMA & RSI Strategy", overlay=true)

// Install indicators
ema34 = ta.ema(close, 34)
ema89 = ta.ema(close, 89)
ema54 = ta.ema(close, 54)
ema150 = ta.ema(close, 150)
rsi = ta.rsi(close, 14)

// Draw indicator
plot(ema34, color=color.red, title="EMA 34")
plot(ema89, color=color.blue, title="EMA 89")
//plot(ema54, color=color.green, title="EMA 54")
//plot(ema150, color=color.yellow, title="EMA 150")
hline(50, "RSI 50", color=color.gray)
plot(rsi, title="RSI", color=color.orange, linewidth=2, offset=-1)

// condition long or short
longCondition = ta.crossover(ema34, ema89) and rsi > 30
shortCondition = ta.crossunder(ema34, ema89) and rsi < 70

// Add strategy long
if (longCondition)
    strategy.entry("Long", strategy.long)

// Add strategy short
if (shortCondition)
    strategy.entry("Short", strategy.short)

// Calculate the average volume of previous candles
length = 20 // Number of candles to calculate average volume
avgVolume = ta.sma(volume, length)
highVolumeCondition = volume > 3 * avgVolume

// Determine take profit and stop loss prices when there is high volume
var float takeProfitPriceLong = na
var float stopLossPriceLong = na
var float takeProfitPriceShort = na
var float stopLossPriceShort = na

if (longCondition)
    takeProfitPriceLong := na
    stopLossPriceLong := na

if (shortCondition)
    takeProfitPriceShort := na
    stopLossPriceShort := na

// Update take profit and stop loss prices when volume is high
if (strategy.opentrades.entry_id(0) == "Long" and highVolumeCondition)
    takeProfitPriceLong := close
    stopLossPriceLong := close

if (strategy.opentrades.entry_id(0) == "Short" and highVolumeCondition)
    takeProfitPriceShort := close
    stopLossPriceShort := close

// Execute exit orders for buy and sell orders when there is high volume
if (not na(takeProfitPriceLong))
    strategy.exit("Take Profit Long", from_entry="Long", limit=takeProfitPriceLong, stop=stopLossPriceLong)

if (not na(takeProfitPriceShort))
    strategy.exit("Take Profit Short", from_entry="Short", limit=takeProfitPriceShort, stop=stopLossPriceShort)

// Track the number of candles since the order was opened
var int barsSinceEntryLong = na
var int barsSinceEntryShort = na
var bool longPositionClosed = false
var bool shortPositionClosed = false

if (longCondition)
    barsSinceEntryLong := 0
    longPositionClosed := false
if (shortCondition)
    barsSinceEntryShort := 0
    shortPositionClosed := false

if (strategy.opentrades.entry_id(0) == "Long")
    barsSinceEntryLong := barsSinceEntryLong + 1

if (strategy.opentrades.entry_id(0) == "Short")
    barsSinceEntryShort := barsSinceEntryShort + 1

// Check the conditions to close the order at the 15th candle
if (strategy.opentrades.entry_id(0) == "Long" and barsSinceEntryLong >= 15 and not longPositionClosed)
    strategy.close("Long")
    longPositionClosed := true

if (strategy.opentrades.entry_id(0) == "Short" and barsSinceEntryShort >= 15 and not shortPositionClosed)
    strategy.close("Short")
    shortPositionClosed := true

// Thêm stop loss theo EMA34
if (strategy.opentrades.entry_id(0) == "Long")
    strategy.exit("Stop Loss Long", from_entry="Long", stop=ema34)
if (strategy.opentrades.entry_id(0) == "Short")
    strategy.exit("Stop Loss Short", from_entry="Short", stop=ema34)

// Displays buy/sell signals and price levels on the chart
plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.labelup, text="BUY")
plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL")

// Displays take profit and stop loss prices on the chart
// var line takeProfitLineLong = na
// var line stopLossLineLong = na
// var line takeProfitLineShort = na
// var line stopLossLineShort = na

// if (not na(takeProfitPriceLong)) 
//     if na(takeProfitLineLong)
//         takeProfitLineLong := line.new(x1=bar_index, y1=takeProfitPriceLong, x2=bar_index + 1, y2=takeProfitPriceLong, color=color.blue, width=1, style=line.style_dashed)
//     else
//         line.set_xy1(takeProfitLineLong, x=bar_index, y=takeProfitPriceLong)
//         line.set_xy2(takeProfitLineLong, x=bar_index + 1, y=takeProfitPriceLong)

// if (not na(stopLossPriceLong)) 
//     if na(stopLossLineLong)
//         stopLossLineLong := line.new(x1=bar_index, y1=stopLossPriceLong, x2=bar_index + 1, y2=stopLossPriceLong, color=color.red, width=1, style=line.style_dashed)
//     else
//         line.set_xy1(stopLossLineLong, x=bar_index, y=stopLossPriceLong)
//         line.set_xy2(stopLossLineLong, x=bar_index + 1, y=stopLossPriceLong)

// if (not na(takeProfitPriceShort)) 
//     if na(takeProfitLineShort)
//         takeProfitLineShort := line.new(x1=bar_index, y1=takeProfitPriceShort, x2=bar_index + 1, y2=takeProfitPriceShort, color=color.blue, width=1, style=line.style_dashed)
//     else
//         line.set_xy1(takeProfitLineShort, x=bar_index, y=takeProfitPriceShort)
//         line.set_xy2(takeProfitLineShort, x=bar_index + 1, y=takeProfitPriceShort)

// if (not na(stopLossPriceShort)) 
//     if na(stopLossLineShort)
//         stopLossLineShort := line.new(x1=bar_index, y1=stopLossPriceShort, x2=bar_index + 1, y2=stopLossPriceShort, color=color.red, width=1, style=line.style_dashed)
//     else
//         line.set_xy1(stopLossLineShort, x=bar_index, y=stopLossPriceShort)
//         line.set_xy2(stopLossLineShort, x=bar_index + 1, y=stopLossPriceShort)

// // Shows annotations for take profit and stop loss prices
// if (not na(takeProfitPriceLong))
//     label.new(x=bar_index, y=takeProfitPriceLong, text="TP Long", style=label.style_label_down, color=color.blue, textcolor=color.white)
// if (not na(stopLossPriceLong))
//     label.new(x=bar_index, y=stopLossPriceLong, text="SL Long", style=label.style_label_up, color=color.red, textcolor=color.white)
// if (not na(takeProfitPriceShort))
//     label.new(x=bar_index, y=takeProfitPriceShort, text="TP Short", style=label.style_label_up, color=color.blue, textcolor=color.white)
// if (not na(stopLossPriceShort))
//     label.new(x=bar_index, y=stopLossPriceShort, text="SL Short", style=label.style_label_down, color=color.red, textcolor=color.white)


관련

더 많은