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

5배 강한 이동 평균 전략

저자:차오장날짜: 2024-05-23 18:14:35
태그:EMAWMASMATMAVARWWMAZLEMATSF

img

전반적인 설명

퀸투플 강 이동 평균 전략은 여러 이동 평균을 기반으로 하는 거래 전략이다. 이 전략은 시장의 강력한 트렌드를 식별하기 위해 다른 시간 프레임과 유형의 5 개의 이동 평균을 사용합니다. 첫 번째 3 개의 이동 평균은 전략의 핵심 구성 요소이며, 주로 트렌드 식별 및 신호 생성에 사용됩니다. 4 번째와 5 번째 이동 평균은 주로 보조 판단 및 시각 분석에 사용됩니다.

이 전략은 다양한 시간 프레임과 유형의 이동 평균의 경향과 상대적 위치 관계를 종합적으로 고려함으로써 시장의 현재 트렌드 방향과 힘을 정확하게 결정할 수 있으며, 좋은 수익성을 달성하기 위해 트렌드 변화에 따라 위치를 적시에 조정할 수 있습니다.

전략 원칙

이 전략은 5개의 다른 시간 프레임과 유형의 이동 평균을 사용합니다.

  1. 레벨 1 이동 평균: 사용자 정의 가능한 디스플레이, 라벨, 데이터 소스, 시간 프레임, 길이, 라인 너비, 색상 및 타입
  2. 레벨 2 이동 평균: 사용자 정의 가능한 디스플레이, 라벨, 데이터 소스, 시간 프레임, 길이, 라인 너비, 색상 및 타입
  3. 레벨 3 이동 평균: 사용자 정의 가능한 디스플레이, 라벨, 데이터 소스, 시간 프레임, 길이, 라인 너비, 색상 및 타입
  4. 레벨 4 이동 평균: 주로 보조 판단, 사용자 정의 표시, 라벨, 데이터 소스, 시간 프레임, 길이, 라인 너비 및 색상을 위해 사용됩니다.
  5. 레벨 5 이동 평균: 주로 보조 판단, 사용자 정의 표시, 라벨, 데이터 소스, 시간 프레임, 길이, 라인 너비 및 색상을 위해 사용됩니다.

이 5개의 이동 평균의 유형은 SMA, EMA, WMA, TMA, VAR, WWMA, ZLEMA, TSF 및 기타 8가지 유형을 포함하여 유연하게 설정할 수 있습니다.

이 전략의 핵심 아이디어는 다른 시간 프레임과 유형의 이동 평균의 여러 트렌드 확인을 사용하여 트렌드 방향과 강도를 결정하는 것입니다.

  • 클로징 가격이 레벨 1, 2, 3 이동 평균보다 높으면, 긴 거래가 됩니다.
  • 클로징 가격이 레벨 1, 2, 3 이동 평균보다 낮을 때, 쇼트가 됩니다.
  • 긴 포지션을 보유할 때, 닫기 가격이 레벨 1 및 레벨 2 이동 평균 이하로 떨어지면 긴 포지션을 닫습니다.
  • 쇼트 포지션을 보유할 때, 종료 가격이 레벨 1 및 레벨 2 이동 평균보다 상승하면 쇼트를 닫습니다.

또한 이 전략은 현재 위치에 따라 촛불의 색을 표시합니다:

  • 긴 포지션을 유지하는 경우 촛불은 녹색입니다.
  • 쇼트 포지션을 유지하는 경우 촛불은 빨간색입니다.
  • 다른 경우, 촛불은 회색입니다.

전략적 장점

  1. 강한 트렌드 추적 능력: 이 전략은 트렌드를 결정하기 위해 여러 중장기 이동 평균의 조합을 사용하여 주요 시장 트렌드를 효과적으로 파악 할 수있는 강력한 트렌드 인식 능력을 사용합니다.
  2. 유연하게 조정 가능한 매개 변수 이 전략의 매개 변수는 유연하게 설정 될 수 있습니다. 이 매개 변수에는 이동 평균의 종류, 시간 프레임, 길이가 포함되며 다른 시장 특성과 투자자 선호도에 따라 최적화 될 수 있습니다.
  3. 다중 시장에 적응력. 이 전략의 추세 판단은 주로 가격 움직임 자체에 기반하고 시장에 대한 강력한 적응력을 가지고 있으며 주식, 선물, 외환, 암호화폐 등과 같은 여러 시장에서 사용할 수 있습니다.
  4. 명확하고 간단한 논리 이 전략의 핵심 논리는 너무 복잡한 수학적 모델을 필요로 하지 않고 간단하고 명확하고 이해하기 쉽고 구현하기 쉽습니다.

전략 위험

  1. 범위를 제한하는 시장에서 거래 위험을 씻으십시오. 이 전략은 일반적으로 범위를 제한하는 시장에서 수행되며 더 많은 소손실 거래를 경험할 수 있으며, 그 결과 순이익이 감소합니다.
  2. 매개 변수 최적화 위험. 이 전략은 많은 매개 변수를 사용합니다. 충분한 역사 데이터 백테스팅과 매개 변수 최적화가 수행되지 않으면 향후 라이브 거래에서 더 큰 마감으로 이어질 수 있습니다.
  3. 트렌드 역전 위험. 이 전략은 주로 트렌드 시장에 적합합니다. 시장 트렌드가 역전되면 이 전략은 원래 트렌드 방향으로 계속 거래하여 손실을 초래할 수 있습니다.

위의 위험을 줄이기 위해 다음 개선 사항은 고려 할 수 있습니다.

  1. 범위에 따른 시장 탐지 및 판단 논리를 추가하여 트렌드 없는 시장에서 거래 수를 줄이십시오.
  2. 이 전략에 대한 충분한 매개 변수 최적화 테스트를 수행하여 견고한 최적 매개 변수 조합을 찾습니다.
  3. 단일 거래의 최대 위험을 제어하기 위해 합리적인 스톱 로스 수준을 설정하십시오. 동시에 다른 지표 또는 신호를 사용하여 트렌드 반전을 확인하고 적시에 포지션을 조정 할 수 있습니다.

전략 최적화 방향

  1. 추세 판단의 정확성을 향상시키기 위해 MACD, DMI 등과 같은 추세 확인 지표를 더 많이 도입하십시오.
  2. 범위에 제한된 시장의 경우, 네트워크 거래와 같은 범위에 제한된 시장에 적응할 수 있는 운영 논리를 도입하는 것을 고려하십시오.
  3. 다른 시장 특성을 위해 적응력을 향상시키기 위해 전략의 매개 변수를 개별적으로 최적화하십시오.
  4. 이 전략을 다른 전략과 결합하는 것을 고려하십시오. 예를 들어 트렌드 전략 + 범주 전략, 트렌드 전략 + 역 트렌드 전략 등을 결합하여 전략의 안정성을 향상시킵니다.

요약

퀸터플 스트롱 이동 평균 전략은 여러 트렌드 확인을 기반으로 한 거래 전략이다. 다양한 시간 프레임과 유형의 이동 평균의 트렌드와 상대적 위치 관계를 포괄적으로 고려함으로써 현재 트렌드 방향과 시장의 강도를 비교적 정확하게 결정할 수 있으며 트렌드 변화에 따라 포지션을 적시에 조정할 수 있다. 전략 논리는 간단하고 명확하며 매개 변수는 유연하고 조정 가능하며 여러 시장에 적응할 수 있다. 그러나 일반적으로 인바운드 범위 시장에서 수행되며, 특정 매개 변수 최적화 위험과 트렌드 역전 위험도 있다. 앞으로 우리는 더 많은 지표를 도입하고, 매개 변수를 최적화하고, 범위 시장에 대한 운영 논리를 추가하고, 이 전략의 안정성과 수익성을 더욱 향상시키기 위해 다른 유형의 전략과 결합하는 것을 고려할 수 있다.


/*backtest
start: 2023-05-17 00:00:00
end: 2024-05-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Quintuple Strong Moving Average Strategy","QuisMa", overlay=true, margin_long=100, margin_short=100)

// 1
mav1_show = input.bool(true, 'Show Plot', group='Level 1 ', inline='mav1_0')
mav1_label = input.bool(true, 'Show Label', group='Level 1 ', inline='mav1_0')
mav1_source = input.source(close, '', group='Level 1 ', inline='mav1_1')
mav1_timeframe = input.timeframe('5', '', group='Level 1 ', inline='mav1_1')
mav1_length = input.int(50, 'Length', group='Level 1 ', inline='mav1_3')
mav1_size = input.int(2000, 'Size', minval=1, group='Level 1 ', inline='mav1_3')
mav1_width = input.int(2, '', minval=0, group='Level 1 ', inline='mav1_2')
mav1_color = input.color(color.new(#ffd000, 0), '', group='Level 1 ', inline='mav1_2')
mav1_type = input.string(title='Moving Average Type 1', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 2
mav2_show = input.bool(true, 'Show Plot', group='Level 2', inline='mav2_0')
mav2_label = input.bool(true, 'Show Label', group='Level 2', inline='mav2_0')
mav2_source = input.source(close, '', group='Level 2', inline='mav2_1')
mav2_timeframe = input.timeframe('30', '', group='Level 2', inline='mav2_1')
mav2_length = input.int(50, 'Length', group='Level 2', inline='mav2_3')
mav2_size = input.int(2000, 'Size', minval=1, group='Level 2', inline='mav2_3')
mav2_width = input.int(2, '', minval=0, group='Level 2', inline='mav2_2')
mav2_color = input.color(color.new(#ffd000, 0), '', group='Level 2', inline='mav2_2')
mav2_type = input.string(title='Moving Average Type 2', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 3
mav3_show = input.bool(true, 'Show Plot', group='Level 3', inline='mav3_0')
mav3_label = input.bool(true, 'Show Label', group='Level 3', inline='mav3_0')
mav3_source = input.source(close, '', group='Level 3', inline='mav3_1')
mav3_timeframe = input.timeframe('60', '', group='Level 3', inline='mav3_1')
mav3_length = input.int(50, 'Length', group='Level 3', inline='mav3_3')
mav3_size = input.int(2000, 'Size', minval=1, group='Level 3', inline='mav3_3')
mav3_width = input.int(2, '', minval=0, group='Level 3', inline='mav3_2')
mav3_color = input.color(color.new(#ffd000, 0), '', group='Level 3', inline='mav3_2')
mav3_type = input.string(title='Moving Average Type 3', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 4
mav4_show = input.bool(true, 'Show Plot', group='Level 4', inline='mav4_0')
mav4_label = input.bool(true, 'Show Label', group='Level 4', inline='mav4_0')
mav4_source = input.source(close, '', group='Level 4', inline='mav4_1')
mav4_timeframe = input.timeframe('480', '', group='Level 4', inline='mav4_1')
mav4_length = input.int(50, 'Length', group='Level 4', inline='mav4_3')
mav4_size = input.int(2000, 'Size', minval=1, group='Level 4', inline='mav4_3')
mav4_width = input.int(2, '', minval=0, group='Level 4', inline='mav4_2')
mav4_color = input.color(color.new(#ffd000, 0), '', group='Level 4', inline='mav4_2')
mav4_type = input.string(title='Moving Average Type 4', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 5
mav5_show = input.bool(true, 'Show Plot', group='Level 5', inline='mav5_0')
mav5_label = input.bool(true, 'Show Label', group='Level 5', inline='mav5_0')
mav5_source = input.source(close, '', group='Level 5', inline='mav5_1')
mav5_timeframe = input.timeframe('720', '', group='Level 5', inline='mav5_1')
mav5_length = input.int(50, 'Length', group='Level 5', inline='mav5_3')
mav5_size = input.int(2000, 'Size', minval=1, group='Level 5', inline='mav5_3')
mav5_width = input.int(2, '', minval=0, group='Level 5', inline='mav5_2')
mav5_color = input.color(color.new(#ffd000, 0), '', group='Level 5', inline='mav5_2')
mav5_type = input.string(title='Moving Average Type 5', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])


// FUNCTIONS {{{
candle_size_ms = time - time[1]  // milliseconds of a candle

timetostring(tms) =>
    d_ = math.floor(tms / 86400)
    h_ = math.floor((tms - d_ * 86400) / 3600)
    m_ = math.floor((tms - d_ * 86400 - h_ * 3600) / 60)
    s_ = math.floor(tms - d_ * 86400 - h_ * 3600 - m_ * 60)
    ret = d_ > 0 ? str.tostring(d_) + ' D ' : ''
    ret += (h_ > 0 ? str.tostring(h_) + ' H ' : '')
    ret += (m_ > 0 ? str.tostring(m_) + ' m ' : '')
    if d_ == 0
        ret += (s_ > 0 ? str.tostring(s_) + ' s ' : '')
        ret
    ret

tftostring(tf) =>
    tfa = str.split(tf, '')
    tfalast = array.get(tfa, array.size(tfa) - 1)
    tfalastIsNum = na(str.tonumber(tfalast)) ? false : true
    txt = tfalastIsNum ? timetostring(str.tonumber(tf) * 60) : tf
    txt

htfLabel(htfy, tf, col) =>
    txt = tftostring(tf)
    htftxt = 'ᐊ ' + txt
    htftip = 'HTF  [ ' + txt + ' ] ' + str.tostring(htfy, '#.##')
    label.new(x=time + candle_size_ms * 2, y=htfy, xloc=xloc.bar_time, yloc=yloc.price, color=color.new(color.black, 100), textcolor=col, style=label.style_label_left, size=size.normal, text=htftxt, tooltip=htftip)

// Moving Averages Functions {{{
Var_Func(src, length) =>
    valpha = 2 / (length + 1)
    vud1 = src > src[1] ? src - src[1] : 0
    vdd1 = src < src[1] ? src[1] - src : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD - vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR

Wwma_Func(src, length) =>
    wwalpha = 1 / length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
    WWMA

Zlema_Func(src, length) =>
    zxLag = length / 2 == math.round(length / 2) ? length / 2 : (length - 1) / 2
    zxEMAData = src + src - src[zxLag]
    ZLEMA = ta.ema(zxEMAData, length)
    ZLEMA

Tsf_Func(src, length) =>
    lrc = ta.linreg(src, length, 0)
    lrc1 = ta.linreg(src, length, 1)
    lrs = lrc - lrc1
    TSF = ta.linreg(src, length, 0) + lrs
    TSF

getMA(src, length, mav_type) =>
    ma = 0.0
    if mav_type == 'SMA'
        ma := ta.sma(src, length)
    if mav_type == 'EMA'
        ma := ta.ema(src, length)
    if mav_type == 'WMA'
        ma := ta.wma(src, length)
    if mav_type == 'TMA'
        ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
    if mav_type == 'VAR'
        ma := Var_Func(src, length)
    if mav_type == 'WWMA'
        ma := Wwma_Func(src, length)
    if mav_type == 'ZLEMA'
        ma := Zlema_Func(src, length)
    if mav_type == 'TSF'
        ma := Tsf_Func(src, length)
    ma

mav1 = request.security(syminfo.tickerid, mav1_timeframe, getMA(mav1_source, mav1_length, mav1_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav1_show ? mav1 : na, 'mav 1', color=mav1_color, linewidth=mav1_width, show_last=mav1_size)
var label mav1lbl = na
label.delete(mav1lbl)
mav1lbl := mav1_label ? htfLabel(mav1, mav1_timeframe, mav1_color) : na

mav2 = request.security(syminfo.tickerid, mav2_timeframe, getMA(mav2_source, mav2_length, mav2_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav2_show ? mav2 : na, 'mav 2', color=mav2_color, linewidth=mav2_width, show_last=mav2_size)
var label mav2lbl = na
label.delete(mav2lbl)
mav2lbl := mav2_label ? htfLabel(mav2, mav2_timeframe, mav2_color) : na

mav3 = request.security(syminfo.tickerid, mav3_timeframe, getMA(mav3_source, mav3_length, mav3_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav3_show ? mav3 : na, 'mav 3', color=mav3_color, linewidth=mav3_width, show_last=mav3_size)
var label mav3lbl = na
label.delete(mav3lbl)
mav3lbl := mav3_label ? htfLabel(mav3, mav3_timeframe, mav3_color) : na

mav4 = request.security(syminfo.tickerid, mav4_timeframe, getMA(mav4_source, mav4_length, mav4_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav4_show ? mav4 : na, 'mav 4', color=mav4_color, linewidth=mav4_width, show_last=mav4_size)
var label mav4lbl = na
label.delete(mav4lbl)
mav4lbl := mav4_label ? htfLabel(mav4, mav4_timeframe, mav4_color) : na

mav5 = request.security(syminfo.tickerid, mav5_timeframe, getMA(mav5_source, mav5_length, mav5_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav5_show ? mav5 : na, 'mav 5', color=mav5_color, linewidth=mav5_width, show_last=mav5_size)
var label mav5lbl = na
label.delete(mav5lbl)
mav5lbl := mav5_label ? htfLabel(mav5, mav5_timeframe, mav5_color) : na

// Alış ve Satış Koşulları
alisKosulu = close > mav1 and close > mav2 and close > mav3
satisKosulu = close < mav1 and close < mav2 and close < mav3

// Alış ve Satış Sinyalleri
if (alisKosulu and not satisKosulu)
    strategy.entry("Alış", strategy.long)
if (satisKosulu and not alisKosulu)
    strategy.entry("Satış", strategy.short)

// Pozisyonları Kapatma Koşulları
if (strategy.opentrades > 0)
    if (close < mav1 and close < mav2 and strategy.position_size > 0)
        strategy.close("Alış")
    if (close > mav1 and close > mav2 and strategy.position_size < 0)
        strategy.close("Satış")

// Mum Rengi Ayarlama
longKosul = strategy.opentrades > 0 and strategy.position_size > 0
shortKosul = strategy.opentrades > 0 and strategy.position_size < 0

barcolor(longKosul ? color.green : shortKosul ? color.red : color.gray)


관련

더 많은