5배 강한 이동평균 전략

EMA WMA SMA TMA VAR WWMA ZLEMA TSF
생성 날짜: 2024-05-23 18:14:35 마지막으로 수정됨: 2024-05-23 18:14:35
복사: 3 클릭수: 575
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

5배 강한 이동평균 전략

개요

다섯 가지의 힘의 이동 평균 전략은 여러 이동 평균을 기반으로 한 거래 전략이다. 이 전략은 시장의 강력한 추세를 식별하기 위해 5 개의 다른 주기 및 유형의 이동 평균을 사용합니다. 이 중 첫 번째 3 개의 이동 평균은 전략의 핵심 구성 요소이며, 주로 트렌드 식별 및 신호 생성에 사용됩니다.

다양한 주기 및 유형의 이동 평균의 움직임과 상대적인 위치 관계를 종합적으로 고려함으로써, 이 전략은 시장의 현재 트렌드 방향과 강도를 보다 정확하게 판단할 수 있으며, 트렌드의 변화에 따라 포지션을 적시에 조정하여 더 나은 수익 효과를 얻을 수 있다.

전략 원칙

이 전략은 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층 이동 평균을 뚫면, 공백한다.

또한, 이 전략은 K선 색을 현재 포지션 방향에 따라 표시합니다:

  • K 라인은 초록색으로 표시됩니다.
  • K 라인은 적색으로 표시됩니다.
  • 다른 경우, K선은 회색으로 표시된다.

전략적 이점

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

전략적 위험

  1. 위기 시장의 청산 위험. 이 전략은 위기 시장에서 일반적으로 수행되며, 소액 손실 거래가 더 많이 발생할 수 있으며, 이로 인해 순이익이 감소한다.
  2. 변수 최적화 위험. 이 전략은 더 많은 변수를 채택하고 있으며, 충분한 역사 데이터 재검토와 변수 최적화가 수행되지 않으면 미래의 실장 거래에서 더 큰 회수를 겪을 수 있습니다.
  3. 트렌드 반전 위험. 이 전략은 주로 트렌드 상황에 적용되며, 시장 추세가 반전되면 이 전략은 원래의 트렌드 방향에 따라 계속 거래하여 손실을 초래할 수 있다.

위와 같은 위험을 줄이기 위해, 다음 개선 조치를 고려할 수 있습니다.

  1. 트렌드가 아닌 상황에서 거래의 수를 줄이기 위해 변동시장 탐지 및 판단 논리에 참여하십시오.
  2. 이 전략에 대한 충분한 변수 최적화 테스트를 수행하여 안정적인 최적의 변수 조합을 찾습니다.
  3. 합리적인 스톱로스를 설정하여 단편 거래의 최대 위험을 제어하십시오. 동시에, 다른 지표 또는 신호를 통해 트렌드 반전을 확인하고 적시에 포지션을 조정할 수 있습니다.

전략 최적화 방향

  1. 추세를 확인하는 MACD, DMI 등과 같은 더 많은 지표를 도입하여 추세를 판단하는 정확도를 향상시킵니다.
  2. 격자 거래와 같은 격자 시장의 경우, 격자 상황에 적응할 수 있는 운영 논리를 도입하는 것을 고려할 수 있습니다.
  3. 다양한 시장 특성에 맞게 전략의 매개 변수를 개별적으로 최적화하여 적응력을 높일 수 있다.
  4. 이 전략을 다른 전략과 조합하는 것을 고려할 수 있습니다. 예를 들어, 트렌드 전략 + 충격 전략의 조합, 트렌드 전략 + 역동 전략의 조합 등이 전략의 안정성을 높일 수 있습니다.

요약하다

5강 이동 평균 전략은 다중 트렌드 확인을 기반으로 한 거래 전략으로, 여러 주기 및 유형의 이동 평균 움직임을 종합적으로 고려하여 시장의 현재 트렌드 방향과 강도를 비교적으로 정확하게 판단하고, 트렌드 변화에 따라 포지션을 적시에 조정할 수 있습니다. 이 전략의 논리는 간단하고 명확하며, 매개 변수는 유연하게 조정되며, 여러 시장에 적합하지만, 흔들리는 시장에서 일반적으로 나타나며, 특정 매개 변수 최적화 위험과 트렌드 전환 위험이 있습니다.

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