삼각형 이동 평균 크로스오버 거래 전략

저자:차오장, 날짜: 2024-01-16 18:18:02
태그:

img

전반적인 설명

삼각형 이동 평균 (TMA) 크로스오버 거래 전략은 전형적인 기술 분석 전략이다. 트렌드를 파악하고 저위험 거래를 구현하기 위해 서로 다른 시간 길이의 이동 평균 라인을 세 개 사용합니다. 단기 이동 평균이 중기 이동 평균을 상향으로 넘어서고 중기 이동 평균이 장기 이동 평균보다 높을 때 구매 신호가 생성됩니다. 단기 이동 평균이 중기 이동 평균 아래로 넘어가고 중기 이동 평균이 장기 이동 평균 아래로 넘어가면 판매 신호가 생성됩니다.

전략 논리

TMA 전략은 주로 트렌드 방향을 결정하기 위해 세 개의 이동 평균 라인에 의존합니다. 단기 이동 평균은 가격 변화에 민감하게 반응합니다. 중기 이동 평균은 트렌드에 대한 더 명확한 판단을 제공합니다. 장기 이동 평균은 시장 소음을 필터링하고 장기 트렌드 방향을 결정합니다.

단기 이동 평균이 중기 이동 평균을 상향으로 넘으면 가격이 상향으로 돌기 시작했다는 것을 나타냅니다. 이 시점에서 중기 이동 평균이 장기 이동 평균보다 높으면 현재 시장이 상승 추세에 있음을 의미합니다. 따라서 여기에서 구매 신호가 생성됩니다.

반대로, 단기 이동 평균이 중기 이동 평균 아래를 넘으면 가격이 하향적으로 돌파하기 시작했다는 것을 나타냅니다. 이 시점에서 중기 이동 평균이 장기 이동 평균 아래라면 현재 시장이 하향 추세에 있음을 의미합니다. 결과적으로 판매 신호가 생성됩니다.

이 전략은 또한 스톱 로스 및 테이크 노프 라인을 설정합니다. 거래를 입력 한 후, 스톱 로스 및 테이크 노프 가격은 비율 설정에 따라 계산됩니다. 가격이 어느 라인에 닿으면 포지션은 종료됩니다.

이점 분석

  • 판단 정확성 을 향상 시키기 위해 이동 평균 3 개 를 함께 사용
  • 거래 리스크를 효과적으로 제어하기 위해 스톱 로스 및 리프트를 설정합니다
  • 각종 제품에 적합한 조정 가능한 이동 평균 매개 변수
  • 이동평균 유형, 다각화된 전략 유형에 대한 7가지 옵션

위험 분석 및 해결책

  • 3개의 MA가 통합할 때 잘못된 신호

    해결책: 잘못된 신호를 피하기 위해 MA 매개 변수를 적절히 조정합니다.

  • 너무 공격적인 스톱 손실/이익 취득 비율

    해결책: 미세한 비율; 너무 크거나 너무 작을 수 없습니다.

  • 부적절한 매개 변수 설정으로 거래가 너무 많거나 너무 적습니다.

    솔루션: 최적을 찾기 위해 다른 매개 변수 조합을 테스트

최적화 방향

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

  • 최적을 찾기 위해 다른 유형과 길이 조합을 테스트

    가장 좋은 결과를 얻기 위해 다른 MA 길이 또는 유형 조합을 테스트하십시오.

  • 신호 필터로 다른 기술 지표를 추가합니다.

    다중 인자 검증을 위해 KDJ, MACD 등과 같은 지표를 추가합니다.

  • 제품 특성에 기초한 매개 변수를 선택

    휘발성 상품의 MA 기간을 단축하고, 안정적인 상품의 MA 기간을 연장합니다.

  • 최적의 매개 변수를 찾기 위해 기계 학습을 활용

    자동 매개 변수를 빠르게 최적의 위치를 검색

결론

TMA 크로스오버 전략은 전반적으로 트렌드를 따르는 전략으로 사용하기 쉽다. 트렌드를 파악하고 위험을 제어하기 위해 스톱 로스/테이크 노프트를 설정하여 안정적인 이익을 가능하게 한다. 파라미터 최적화와 추가 기술 지표를 통합함으로써 추가 개선이 가능하다. 결론적으로, 이 전략은 안정적인 이익을 추구하는 투자자에게 적합하다.


/*backtest
start: 2024-01-08 00:00:00
end: 2024-01-15 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Kozlod - 3 MA strategy with SL/PT", shorttitle="kozlod_3ma", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 5)

// 
// author: Kozlod
// date: 2018-03-25
// 

////////////
// INPUTS //
////////////

ma_type        = input(title = "MA Type",            defval = "SMA", options = ['SMA', 'EMA', 'WMA', 'VWMA', 'HMA', 'SMMA', 'DEMA'])
short_ma_len   = input(title = "Short MA Length",    defval = 5,     minval = 1)
short_ma_src   = input(title = "Short MA Source",    defval = close)
medium_ma_len  = input(title = "Medium MA Length",   defval = 20,    minval = 2)
medium_ma_src  = input(title = "Medium MA Source",   defval = close)
long_ma_len    = input(title = "Long MA Length",     defval = 100,   minval = 3)
long_ma_src    = input(title = "Long MA Source",     defval = close)

sl_lev_perc    = input(title = "SL Level % (0 - Off)", type = float,   defval = 0,  minval = 0, step = 0.01)
pt_lev_perc    = input(title = "PT Level % (0 - Off)", type = float,   defval = 0,  minval = 0, step = 0.01)

// Set initial values to 0
short_ma  = 0.0
long_ma   = 0.0
medium_ma = 0.0

// Simple Moving Average (SMA)
if ma_type == 'SMA' 
    short_ma  := sma(short_ma_src,  short_ma_len)
    medium_ma := sma(medium_ma_src, medium_ma_len)
    long_ma   := sma(long_ma_src,   long_ma_len)

// Exponential Moving Average (EMA)
if ma_type == 'EMA'
    short_ma  := ema(short_ma_src,  short_ma_len)
    medium_ma := ema(medium_ma_src, medium_ma_len)
    long_ma   := ema(long_ma_src,   long_ma_len)

// Weighted Moving Average (WMA)
if ma_type == 'WMA'
    short_ma  := wma(short_ma_src,  short_ma_len)
    medium_ma := wma(medium_ma_src, medium_ma_len)
    long_ma   := wma(long_ma_src,   long_ma_len)

// Hull Moving Average (HMA)
if ma_type == 'HMA'
    short_ma  := wma(2*wma(short_ma_src,  short_ma_len  / 2) - wma(short_ma_src,  short_ma_len),  round(sqrt(short_ma_len)))
    medium_ma := wma(2*wma(medium_ma_src, medium_ma_len / 2) - wma(medium_ma_src, medium_ma_len), round(sqrt(medium_ma_len)))
    long_ma   := wma(2*wma(long_ma_src,   long_ma_len   / 2) - wma(long_ma_src,   long_ma_len),   round(sqrt(long_ma_len)))

// Volume-weighted Moving Average (VWMA)
if ma_type == 'VWMA'
    short_ma  := vwma(short_ma_src,  short_ma_len)
    medium_ma := vwma(medium_ma_src, medium_ma_len)
    long_ma   := vwma(long_ma_src,   long_ma_len)

// Smoothed Moving Average (SMMA)    
if ma_type == 'SMMA'
    short_ma  := na(short_ma[1])  ? sma(short_ma_src, short_ma_len)   : (short_ma[1]  * (short_ma_len  - 1) + short_ma_src)  / short_ma_len
    medium_ma := na(medium_ma[1]) ? sma(medium_ma_src, medium_ma_len) : (medium_ma[1] * (medium_ma_len - 1) + medium_ma_src) / medium_ma_len
    long_ma   := na(long_ma[1])   ? sma(long_ma_src,  long_ma_len)    : (long_ma[1]   * (long_ma_len   - 1) + long_ma_src)   / long_ma_len

// Double Exponential Moving Average (DEMA)
if ma_type == 'DEMA'
    e1_short  = ema(short_ma_src , short_ma_len)
    e1_medium = ema(medium_ma_src, medium_ma_len)
    e1_long   = ema(long_ma_src,   long_ma_len)
    
    short_ma  := 2 * e1_short  - ema(e1_short,  short_ma_len)
    medium_ma := 2 * e1_medium - ema(e1_medium, medium_ma_len)
    long_ma   := 2 * e1_long   - ema(e1_long,   long_ma_len)

/////////////
// SIGNALS //
/////////////

long_signal  = crossover( short_ma, medium_ma) and medium_ma > long_ma
short_signal = crossunder(short_ma, medium_ma) and medium_ma < long_ma

// Calculate PT/SL levels 
// Initial values 
last_signal    = 0
prev_tr_price  = 0.0
pt_level       = 0.0
sl_level       = 0.0

// Calculate previous trade price
prev_tr_price := (long_signal[1] and nz(last_signal[2]) != 1) or (short_signal[1] and nz(last_signal[2]) != -1) ? open : nz(last_signal[1]) != 0 ? prev_tr_price[1] : na

// Calculate SL/PT levels 
pt_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 + pt_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 - pt_lev_perc / 100)  : na
sl_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 - sl_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 + sl_lev_perc / 100)  : na

// Calculate if price hit sl/pt 
long_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) ==  1 and close >= pt_level
long_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) ==  1 and close <= sl_level

short_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) ==  -1 and close <= pt_level
short_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) ==  -1 and close >= sl_level

// What is last active trade? 
last_signal := long_signal ? 1 : short_signal ? -1 : long_hit_pt or long_hit_sl or short_hit_pt or short_hit_sl ? 0 : nz(last_signal[1])

//////////////
// PLOTTING //
//////////////

// Plot MAs
plot(short_ma,  color = red,    linewidth = 2)
plot(medium_ma, color = green,  linewidth = 2)
plot(long_ma,   color = yellow, linewidth = 2)


// Plot Levels 
plotshape(prev_tr_price, style = shape.cross, color = gray, location  = location.absolute, size = size.small)


plotshape(sl_lev_perc > 0 ? sl_level : na, style = shape.cross, color = red,   location  = location.absolute, size = size.small)
plotshape(pt_lev_perc > 0 ? pt_level : na, style = shape.cross, color = green, location  = location.absolute, size = size.small)

//////////////
// STRATEGY //
//////////////

strategy.entry("long",  true,  when = long_signal)
strategy.entry("short", false, when = short_signal)

strategy.close("long",  when = long_hit_pt  or long_hit_sl)
strategy.close("short", when = short_hit_pt or short_hit_sl)

더 많은