
삼평선 골드 크로스 트레이딩 전략은 전형적인 기술적 분석 전략이다. 이 전략은 동시적으로 3개의 서로 다른 시간 길이의 이동 평균을 사용하여 추세를 포착하여 저위험 거래를 가능하게 한다. 단기 이동 평균 상에서 중기 이동 평균을 통과하고 중기 이동 평균이 장기 이동 평균보다 높을 때 구매 신호를 발생시키고, 단기 이동 평균 아래에서 중기 이동 평균을 통과하고 중기 이동 평균이 장기 이동 평균보다 낮을 때 판매 신호를 발생시킨다.
삼평선 골든 크로스 전략은 주로 3개의 이동 평균을 의존하여 트렌드 방향을 판단한다. 단기 이동 평균은 가격 변화에 민감하게 반응한다. 중기 이동 평균은 보다 명확한 트렌드 판단을 제공한다. 장기 이동 평균은 시장 소음을 필터링하여 장기 트렌드 방향을 결정한다.
단기 이동 평균 상에서 중기 이동 평균을 통과할 때, 가격이 상향으로 돌파되기 시작한다는 것을 나타냅니다. 이 시점에서는 중기 이동 평균이 장기 이동 평균보다 높다면, 현재는 부진 상태임을 나타냅니다. 따라서 이 시점에는 구매 신호가 발생한다.
대조적으로, 단기 이동 평균이 중기 이동 평균 아래로 통과할 때, 가격이 하향으로 돌파하기 시작한다는 것을 나타냅니다. 이 시점에 중기 이동 평균이 장기 이동 평균보다 낮다면, 현재는 하향에 있다는 것을 나타냅니다. 따라서 이 시점에 판매 신호가 발생한다.
이 전략은 동시에 스톱로스 스 라인을 설정한다. 거래 후, 설정된 스톱로스 스 비율에 따라 스톱로스 및 스톱 가격을 계산한다. 가격이 스톱로스 또는 스톱로스 라인을 만지면, 포지션을 청산한다.
해결 방법: 잘못된 신호를 방지하기 위해 이동 평균 변수를 적절하게 조정합니다.
해결 방법: 너무 크거나 너무 작지 않은 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)