평균 반전 봉투 이동 평균 전략

저자:차오장, 날짜: 2023-12-04 16:12:39
태그:

img

전반적인 설명

평균 반전 앙플로프 이동 평균 전략 (Mean Reversion Envelope Moving Average Strategy) 은 이동 평균에 기반한 평균 반전 거래 전략이다. 이 전략은 기본 계산으로 이중 기하급수적인 이동 평균 (DEMA) 을 사용하여 그 위와 아래의 여러 봉투를 추가한다. 가격이 봉투 대역에 닿을 때 방향에 따라 긴 또는 짧은 포지션을 개척한다. 가격이 이동 평균으로 회귀할 때 모든 포지션을 닫는다.

전략 논리

이 전략은 기본 지표로 이중 기하급수적 이동 평균 (DEMA) 을 사용하며, 이는 최근 가격 변화에 더 민감한 이동 평균이다. DEMA 위와 아래에는 여러 가격 대역이 추가되어 봉투 영역을 형성한다. 봉투의 범위는 사용자에 의해 설정되며, 각 대역 사이에 고정된 비율 간격이 있다.

가격 상승과 상위 봉투 대역에 접근 할 때 전략은 짧은 포지션을 개척합니다. 가격이 하락하고 하위 봉투 대역에 도달 할 때 긴 포지션을 개척합니다. 새로운 가격 대역에 도달 할 때마다 새로운 포지션을 추가합니다. 가격이 이동 평균에 가깝게 회귀 할 때 모든 포지션은 종료됩니다.

봉투 대역으로 과도한 가격 변동을 포착하고 반전으로부터 이익을 얻음으로써 이 전략은 낮은 가격으로 구매하고 높은 가격으로 판매하는 것을 목표로합니다. 비트코인 같은 암호화폐와 같은 명백한 평균 회귀 경향을 가진 시장 순환에 적합합니다.

장점

  • 트렌드 반전을 감지하기 위해 단기 가격 변화에 민감한 이중 기하급수적 이동 평균을 사용합니다.
  • 이동평균을 둘러싼 봉투 대역은 가격 반전을 정확하게 파악할 수 있습니다.
  • 자본 효율을 완전히 활용하여 대량으로 포지션을 개설합니다.
  • 시장 변화에 적응하기 위해 수익을 얻은 후 빠르게 방향을 바꾸십시오.
  • 매개 변수는 자유롭게 최적화 될 수 있습니다.

위험성

  • 시장의 강력한 트렌드에서 이익을 얻을 수 없습니다.
  • 부적절한 매개 변수는 과잉 거래로 이어질 수 있습니다.
  • 상대적으로 안정적인 시장이 필요하고, 매우 변동적인 환경에 적합하지 않습니다.
  • 너무 좁은 봉투는 입장이 불가능할 수 있습니다.

감수성을 높이기 위해 적당하게 포괄 범위를 확장하고 다른 시장 주기에 맞게 이동 평균 길이를 조정함으로써 위험을 줄일 수 있습니다.

최적화 방향

이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.

  1. 다른 이동 평균 알고리즘을 테스트합니다.

  2. 이동 평균 길이 매개 변수를 조정하여 단기 변동에 더 잘 적응합니다.

  3. 다른 비율 설정을 테스트하여 프 매개 변수를 최적화합니다.

  4. 단일 거래 손실을 제한하기 위해 후속 스톱 손실과 같은 스톱 손실 방법을 추가하십시오.

  5. 비합리 시장에 유효하지 않은 입시를 피하기 위해 다른 지표와 함께 필터링 조건을 추가합니다.

결론

평균 회전 봉투 이동 평균 전략은 이동 평균 주위에 가격 채널을 구축함으로써 평균 회전 기회를 효과적으로 포착합니다. 매개 변수 조정을 통해 다양한 시장 환경에 유연하게 적응 할 수 있습니다. 상대적으로 낮은 거래 비용과 높은 수익률으로, 이것은 권장되는 양적 거래 전략입니다.


/*backtest
start: 2022-11-27 00:00:00
end: 2023-12-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Mean Reversion - Envelope Strategy", overlay=true )

// ----------------------- DESCRIPTION -----------------------
// THIS SCRIPT IS A MEAN REVERSION SYSTEM THAT USES A MOVING AVERAGE AS BASE CALCULATION AND A % OF THIS MOVING AVERAGE TO CALCULATE THE ENVELOPE
// BY DEFAULT, THE SYSTEM WILL PLACE LONG ORDERS ON THE MOVING AVERAGE -5% PER ENVELOPE COUNT (5%, 10% AND SO ON...)
// YOU CAN ENABLE THE SHORT ORDERS THAT WILL FOLLOW THE SAME LOGIC ON THE OPPOSITE SIDE
// THE SYSTEM WILL CLOSE EVERY ONGOING TRADE WHEN THE PRICE RETURNS TO THE MEAN

// ---------------------------------------------
// ---------------- SETTINGS -------------------
src = input(close, "Moving Average Source", group = "Moving Average")
ma_window = input.int(5, "Moving Average Window", step = 1, group = "Moving Average")
ma_type = input.string('4. DEMA', "Moving Average Type", options=['1. SMA', '2. EMA', '3. RMA', '4. DEMA'], group = "Moving Average")
enveloppe_step = input.float(0.05, "Delta Per Enveloppe", step = 0.01, group = "Envelope")
envelope_count = input.int(5, "Envelope count", options = [1, 2, 3, 4, 5], group = "Envelope")
use_longs = input.bool(true, 'Use Long Orders ?', group = "Orders") 
use_short = input.bool(false, 'Use Short Orders ?', group = "Orders")


// ---------------------------------------------
// -------------- INDICATORS -------------------
ma_funct() =>
    if(ma_type == '1. SMA') 
        ta.sma(src, ma_window)
    if(ma_type == '2. EMA') 
        ta.ema(src, ma_window)
    if(ma_type == '3. RMA') 
        ta.rma(src, ma_window)
    if(ma_type == '4. DEMA') 
        2 * ta.ema(src, ma_window) - ta.ema(ta.ema(src, ma_window), ma_window)

ma_base = ma_funct()

ma_high_1 = envelope_count > 0 ? ma_base * (1 + enveloppe_step) : na
ma_high_2 = envelope_count > 1 ? ma_base * (1 + enveloppe_step * 2) : na
ma_high_3 = envelope_count > 2 ? ma_base * (1 + enveloppe_step * 3) : na
ma_high_4 = envelope_count > 3 ? ma_base * (1 + enveloppe_step * 4) : na
ma_high_5 = envelope_count > 4 ? ma_base * (1 + enveloppe_step * 5) : na

ma_low_1 = envelope_count > 0 ? ma_base * (1 - enveloppe_step) : na
ma_low_2 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 2) : na
ma_low_3 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 3) : na
ma_low_4 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 4) : na
ma_low_5 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 5) : na


// ---------------------------------------------
// --------------- STRATEGY --------------------
if use_longs
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('long 1', strategy.long, limit=ma_low_1, qty=(strategy.equity / ma_low_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('long 2', strategy.long, limit=ma_low_2, qty=(strategy.equity / ma_low_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('long 3', strategy.long, limit=ma_low_3, qty=(strategy.equity / ma_low_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('long 4', strategy.long, limit=ma_low_4, qty=(strategy.equity / ma_low_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('long 5', strategy.long, limit=ma_low_5, qty=(strategy.equity / ma_low_5) * (1 / envelope_count))


if use_short
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('short 1', strategy.short, limit=ma_high_1, qty=(strategy.equity / ma_high_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('short 2', strategy.short, limit=ma_high_2, qty=(strategy.equity / ma_high_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('short 3', strategy.short, limit=ma_high_3, qty=(strategy.equity / ma_high_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('short 4', strategy.short, limit=ma_high_4, qty=(strategy.equity / ma_high_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('short 5', strategy.short, limit=ma_high_5, qty=(strategy.equity / ma_high_5) * (1 / envelope_count))

strategy.exit('close', limit=ma_base)


// ---------------------------------------------
// ------------------ PLOT ---------------------
ma_base_plot = plot(ma_base, title = "Base MA", color = color.orange, linewidth = 3, offset = 1)

ma_high_1_plot = plot(ma_high_1, title = "MA high 1", color = color.red, offset = 1)
ma_high_2_plot = plot(ma_high_2, title = "MA high 2", color = color.red, offset = 1)
ma_high_3_plot = plot(ma_high_3, title = "MA high 3", color = color.red, offset = 1)
ma_high_4_plot = plot(ma_high_4, title = "MA high 4", color = color.red, offset = 1)
ma_high_5_plot = plot(ma_high_5, title = "MA high 5", color = color.red, offset = 1)

ma_low_1_plot = plot(ma_low_1, title = "MA low 1", color = color.green, offset = 1)
ma_low_2_plot = plot(ma_low_2, title = "MA low 2", color = color.green, offset = 1)
ma_low_3_plot = plot(ma_low_3, title = "MA low 3", color = color.green, offset = 1)
ma_low_4_plot = plot(ma_low_4, title = "MA low 4", color = color.green, offset = 1)
ma_low_5_plot = plot(ma_low_5, title = "MA low 5", color = color.green, offset = 1)


더 많은