3개 이동 평균 골든 크로스 트레이딩 전략


생성 날짜: 2024-01-16 18:18:02 마지막으로 수정됨: 2024-01-16 18:18:02
복사: 0 클릭수: 724
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

3개 이동 평균 골든 크로스 트레이딩 전략

개요

삼평선 골드 크로스 트레이딩 전략은 전형적인 기술적 분석 전략이다. 이 전략은 동시적으로 3개의 서로 다른 시간 길이의 이동 평균을 사용하여 추세를 포착하여 저위험 거래를 가능하게 한다. 단기 이동 평균 상에서 중기 이동 평균을 통과하고 중기 이동 평균이 장기 이동 평균보다 높을 때 구매 신호를 발생시키고, 단기 이동 평균 아래에서 중기 이동 평균을 통과하고 중기 이동 평균이 장기 이동 평균보다 낮을 때 판매 신호를 발생시킨다.

전략 원칙

삼평선 골든 크로스 전략은 주로 3개의 이동 평균을 의존하여 트렌드 방향을 판단한다. 단기 이동 평균은 가격 변화에 민감하게 반응한다. 중기 이동 평균은 보다 명확한 트렌드 판단을 제공한다. 장기 이동 평균은 시장 소음을 필터링하여 장기 트렌드 방향을 결정한다.

단기 이동 평균 상에서 중기 이동 평균을 통과할 때, 가격이 상향으로 돌파되기 시작한다는 것을 나타냅니다. 이 시점에서는 중기 이동 평균이 장기 이동 평균보다 높다면, 현재는 부진 상태임을 나타냅니다. 따라서 이 시점에는 구매 신호가 발생한다.

대조적으로, 단기 이동 평균이 중기 이동 평균 아래로 통과할 때, 가격이 하향으로 돌파하기 시작한다는 것을 나타냅니다. 이 시점에 중기 이동 평균이 장기 이동 평균보다 낮다면, 현재는 하향에 있다는 것을 나타냅니다. 따라서 이 시점에 판매 신호가 발생한다.

이 전략은 동시에 스톱로스 스 라인을 설정한다. 거래 후, 설정된 스톱로스 스 비율에 따라 스톱로스 및 스톱 가격을 계산한다. 가격이 스톱로스 또는 스톱로스 라인을 만지면, 포지션을 청산한다.

전략적 이점

  • 세 개의 이동 평균을 사용하여 동향을 판단하여 판단의 정확도를 높여줍니다.
  • 단편 거래의 위험을 효과적으로 제어할 수 있는 스톱로스 스톱을 설정합니다.
  • 사용자 정의 이동 평균 변수, 다른 품종에 적용
  • 선택 가능한 7가지의 다른 유형의 이동 평균, 풍부한 전략 유형

전략적 위험과 해결 방법

  • 삼각선이 서로 조화를 이루면 잘못된 신호가 발생할 수 있습니다.

해결 방법: 잘못된 신호를 방지하기 위해 이동 평균 변수를 적절하게 조정합니다.

  • 과도한 Stop Loss Stop ratio를 설정합니다.

해결 방법: 너무 크거나 너무 작지 않은 Stop Loss Stop ratio를 적절하게 조정하십시오.

  • 변수가 잘못 설정되어 거래 빈도가 너무 높거나 너무 낮습니다.

해결 방법: 다양한 변수를 테스트하여 최적의 변수 조합을 찾습니다.

전략 최적화 방향

삼평선 황금 교차 전략은 다음과 같은 측면에서 최적화될 수 있다:

  • 다양한 종류의, 다양한 길이의 변수를 테스트하여 최적의 변수를 찾습니다.

최적의 거래 효과를 얻기 위해 다양한 길이 또는 다양한 유형의 이동 평균 조합을 테스트 할 수 있습니다.

  • 다른 기술 지표 필터링 신호를 추가

전략에 KDJ, MACD 등과 같은 다른 지표를 추가하여 다중 요소 검증을 수행하고 오류 신호를 필터링 할 수 있습니다.

  • 다양한 품종 특성에 따라 선택 파라미트

높은 파동의 품종을 위해 이동 평균 주기를 단축할 수 있고, 낮은 파동의 품종을 위해 이동 평균 주기를 늘릴 수 있다.

  • 최적의 변수 조합을 찾기 위한 기계 학습 방법

알고리즘으로 자동으로 매개 변수 공간을 탐색하여 최적의 매개 변수를 빠르게 찾습니다.

요약하다

삼평선 골든 크로스 전략은 전체적으로 간단하고 실용적인 트렌드 추적 전략이다. 그것은 동시적으로 3개의 이동 평균을 사용하여 트렌드 방향을 잡으며, 스톱 스톱 리스크를 설정하여 안정적인 수익을 얻을 수 있다. 파라미터를 최적화하고 다른 기술 지표를 추가함으로써 전략의 효과를 더욱 높일 수 있다.

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