
이 글은 “Kyrie Crossover @zaytrade”라는 수량 거래 전략에 대해 소개한다. 이 전략은 양평선 교차와 다중 시간 주기 DMI 지표를 결합하여 시장 추세를 포착하여 거래 결정을 내린다. 전략의 핵심은 단기평선 ((10주기 EMA) 와 장기평선 ((323주기 EMA) 의 교차 신호를 이용하는 동시에 5분, 15분, 30분 및 1시간과 같은 여러 시간 주기 DMI 지표를 결합하여 추세의 방향과 강도를 확인하는 것이다.
이 전략의 원칙은 다음과 같은 부분으로 나눌 수 있습니다.
이중 평행선 교차:전략은 단기 EMA ((10주기) 와 장기 EMA ((323주기) 를 사용하여 시장의 추세를 포착한다. 단기 EMA 위에 장기 EMA를 밟으면 잠재적인 거래 기회를 나타냅니다. 단기 EMA 아래에 장기 EMA를 밟으면 잠재적인 거래 기회를 나타냅니다. 이러한 평행선 교차 방식은 시장의 전환점과 추세 방향을 효과적으로 식별 할 수 있습니다.
다중 시간 주기 DMI 지표:트렌드의 방향과 강도를 추가로 확인하기 위해, 전략은 여러 시간 주기 DMI 지표를 사용합니다. DMI 지표는 ADX ((평균 방향 지표), + DI ((상향 방향 지표) 및 -DI ((하향 방향 지표) 로 구성되어 있습니다. + DI와 -DI의 상대적 강도를 비교하여 현재 트렌드가 호불호가 있는지 판단 할 수 있습니다. 전략은 DMI 지표를 5 분, 15 분, 30 분 및 1 시간 등의 여러 시간 주기에서 계산하여 더 포괄적인 트렌드 정보를 얻을 수 있습니다.
트렌드가 확인되었습니다:전략은 평평선 교차 신호와 다중 시간 주기 DMI 지표를 종합적으로 고려하여 트렌드를 확인한다. 평평선 교차 신호와 DMI 지표의 트렌드 방향이 일치할 때 전략은 그에 따른 거래 신호를 생성한다. 예를 들어, 단기 EMA가 장기 EMA를 가로지르고 여러 시간 주기 DMI 지표가 모두 부진하는 경향을 보일 때 전략은 다중 신호를 생성한다.
위험 관리:전략은 위험 비율에 기반한 포지션 관리 방법을 사용합니다.riskPercentageEMA매 거래의 위험 지점을 제어하는 매개 변수. 또한, 전략은 잠재적인 손실을 제한하기 위해 스톱 로스를 사용합니다.
시장의 흐름을 파악하기 위해서:이중 평행선 교차와 다중 시간 주기의 DMI 지표를 결합하여 전략은 시장의 주요 추세를 효과적으로 캡처 할 수 있습니다. 이 방법은 거래자가 시장의 큰 방향에 부합하도록 도와 거래 성공 가능성을 높일 수 있습니다.
다중 시간 주기 확인:전략은 5분, 15분, 30분, 1시간을 포함한 여러 시간 주기 상에 DMI 지표를 계산한다. 이러한 다중 시간 주기 분석 방법은 더 포괄적이고 신뢰할 수 있는 트렌드 확인 신호를 제공하고, 가짜 신호의 발생을 줄일 수 있다.
유연한 변수 설정:전략은 단기 EMA 주기, 장기 EMA 주기, ADX 부드러운 주기, DI 길이는 등 여러 조정 가능한 매개 변수를 제공합니다. 사용자는 자신의 거래 스타일과 시장 특성에 따라 이러한 매개 변수를 최적화하여 더 나은 거래 성능을 얻을 수 있습니다.
위험 관리:전략은 리스크 비율에 기반한 포지션 관리 방법을 내장하고 사용자가 설정하여riskPercentageEMA매 거래의 위험 경계를 제어하는 매개 변수. 또한, 전략은 잠재적인 손실을 제한하기 위해 손해제어를 사용하며, 위험 관리의 효과를 높인다.
변수 최적화:전략의 성능은 크게 매개 변수 선택에 달려 있다. 부적절한 매개 변수 설정은 전략의 부적절한 성능을 초래할 수 있으며, 심지어 큰 회수까지 초래할 수 있다. 따라서 실제 응용에서는 매개 변수를 최적화하고 테스트하여 현재 시장 조건에 적합한 최적의 매개 변수 조합을 찾아내야 한다.
트렌드 지연:전략은 평균선 교차와 DMI 지표에 의존하여 트렌드를 확인하기 때문에 시장이 빠르게 변화하는 상황에서 신호의 발생에는 지연이 있을 수 있습니다. 이것은 전략이 초기 트렌드 기회를 놓칠 수 있음을 의미하거나 트렌드가 반전 된 후에 신호가 발생 할 수 있음을 의미합니다.
시장의 흔들림:흔들리는 시장에서 가격의 변동은 빈번한 평행선 교차와 DMI 지표의 변화를 초래할 수 있다. 이것은 전략이 더 많은 거래 신호를 생성하고 거래 비용과 회수 위험을 증가시킬 수 있다. 따라서 흔들리는 시장에서 전략의 성능은 영향을 받을 수 있다.
검은 천둥 사건:전략은 역사적인 데이터와 통계적 모델에 기초하고 있으며, 블랙 스 사건과 같은 일부 극단적인 시장 사건에 대해 전략이 적절한 시간 내에 제대로 대응하지 못할 수 있습니다. 이것은 전략이 이러한 특별한 상황에서 큰 손실을 입을 수 있습니다.
동적 변수 조정:시장의 변동성과 트렌드 강도에 따라 전략의 매개 변수를 적절하게 조정하는 동적 변수 조정 메커니즘을 도입하는 것을 고려할 수 있습니다. 이것은 전략이 다른 시장 환경에 더 잘 적응하고 전략의 안정성을 높이는 데 도움이 될 수 있습니다.
다인자 확인:평균선 교차와 DMI 지표 이외에, 다른 기술적 지표 또는 기본 요소를 도입하여 추세를 추가로 확인 할 수 있습니다. 예를 들어, 거래량, 변동률, 시장 감정과 같은 지표가 결합되어 더 신뢰할 수있는 거래 신호를 얻을 수 있습니다.
스탠드 로즈 최적화:스톱 스톱 손실의 위치를 최적화 할 수 있습니다. 예를 들어, 이동 스톱, 동적 스톱 등의 방법을 적용하십시오. 이것은 잠재적인 손실을 제한하면서 이익을 더 잘 보호하는 전략을 도울 수 있습니다.
포지션 관리:더 고급 포지션 관리 방법, 예를 들어 케일리 공식, 고정 비율 투자 등이 도입 될 수 있습니다. 이것은 전략이 다양한 시장 환경에서 포지션을 동적으로 조정하고, 자금 활용 효율성과 위험 제어 능력을 향상시킬 수 있습니다.
기계학습 최적화:기계 학습 알고리즘을 전략과 결합하여 역사 데이터의 학습과 패턴을 인식하여 전략의 파라미터 선택 및 신호 생성을 최적화 할 수 있습니다. 이것은 전략의 적응성과 안정성을 높여 시장의 변화에 자동으로 적응하는 데 도움이 될 수 있습니다.
이 글은 양평선 교차와 다중 시간 주기 DMI 지표에 기반한 정량화 거래 전략을 소개한다. 이 전략은 시장 추세를 포착하여 거래 결정을 내리고 잠재적인 손실을 제어하기 위해 위험 관리 조치를 취한다. 이 전략의 장점은 시장의 주요 추세를 효과적으로 식별하고 여러 시간 주기 확인을 통해 신호의 신뢰성을 높일 수 있다는 것이다. 그러나 전략에는 동적 변수 조정, 다중 인자 확인, 스톱 손실, 포지션 관리 및 기계 학습 방법 등을 도입하는 것을 고려할 수 있다.
/*backtest
start: 2023-03-16 00:00:00
end: 2024-03-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Kyrie Crossover @zaytrade ", overlay=true, calc_on_every_tick=true)
// Input parameters for EMA
shortTermEMA = input.int(9, title="Short-Term EMA Period")
longTermEMA = input.int(21, title="Long-Term EMA Period")
riskPercentageEMA = input.float(1, title="Risk Percentage EMA", minval=0.1, maxval=5, step=0.1)
// Calculate EMAs
emaShort = ta.ema(close, shortTermEMA)
emaLong = ta.ema(close, longTermEMA)
// EMA Crossover Strategy
longConditionEMA = ta.crossover(emaShort, emaLong)
shortConditionEMA = ta.crossunder(emaShort, emaLong)
// Input parameters for DMI
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
// DMI Logic
dirmov(len) =>
up = ta.change(high)
down = -ta.change(low)
truerange = ta.tr
plus = fixnan(100 * ta.rma((up > down ? up : 0), len) / truerange)
minus = fixnan(100 * ta.rma((down > up ? down : 0), len) / truerange)
[plus, minus]
adx(dilen, adxlen) =>
[plus, minus] = dirmov(dilen)
sum = plus + minus
adxValue = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
[adxValue, plus, minus]
// Function to get trend and strength for a given timeframe
getTrendAndStrength(_source, _dilen, _adxlen) =>
[adxValue, up, down] = adx(_dilen, _adxlen)
var string trendIndication = ""
var string trendStrength = ""
if (up > down) or ((up > down) and (up > down) and (up > adxValue)) // Bullish condition
trendIndication := "Bullish"
trendStrength := "Strengthening"
else if (down > up) or ((down > up) and (down > up) and (down > adxValue)) // Bearish condition
trendIndication := "Bearish"
trendStrength := "Weakening"
else
trendIndication := "No Clear Trend"
trendStrength := "Sideways"
[trendIndication, trendStrength]
// Get trend and strength for selected timeframes
[tf1_trend, tf1_strength] = request.security(syminfo.tickerid, "5", getTrendAndStrength(close, dilen, adxlen))
[tf2_trend, tf2_strength] = request.security(syminfo.tickerid, "15", getTrendAndStrength(close, dilen, adxlen))
[tf3_trend, tf3_strength] = request.security(syminfo.tickerid, "30", getTrendAndStrength(close, dilen, adxlen))
[tf4_trend, tf4_strength] = request.security(syminfo.tickerid, "60", getTrendAndStrength(close, dilen, adxlen))
[current_trend, _] = getTrendAndStrength(close, dilen, adxlen)
// Define colors based on trend indication
tf1_color = tf1_trend == "Bullish" ? color.green : (tf1_trend == "Bearish" ? color.red : color.white)
tf2_color = tf2_trend == "Bullish" ? color.green : (tf2_trend == "Bearish" ? color.red : color.white)
tf3_color = tf3_trend == "Bullish" ? color.green : (tf3_trend == "Bearish" ? color.red : color.white)
tf4_color = tf4_trend == "Bullish" ? color.green : (tf4_trend == "Bearish" ? color.red : color.white)
current_color = current_trend == "Bullish" ? color.green : (current_trend == "Bearish" ? color.red : color.white)
// Create and fill the enhanced table for DMI
var table dmiTable = na
if (barstate.islast)
dmiTable := table.new(position.top_right, 6, 1)
table.cell(dmiTable, 0, 0, "DMI Metrics", bgcolor=color.new(color.black, 90), width=15, height=4, text_color=color.white)
table.cell(dmiTable, 1, 0, "5m Trend: " + tf1_trend, bgcolor=tf1_color, width=15, height=4, text_color=color.white)
table.cell(dmiTable, 2, 0, "15m Trend: " + tf2_trend, bgcolor=tf2_color, width=15, height=4, text_color=color.white)
table.cell(dmiTable, 3, 0, "30m Trend: " + tf3_trend, bgcolor=tf3_color, width=15, height=4, text_color=color.white)
table.cell(dmiTable, 4, 0, "1h Trend: " + tf4_trend, bgcolor=tf4_color, width=15, height=4, text_color=color.white)
table.cell(dmiTable, 5, 0, "Current Trend: " + current_trend, bgcolor=current_color, width=15, height=4, text_color=color.white)
// Strategy logic
if (longConditionEMA)
strategy.entry("Long", strategy.long)
if (shortConditionEMA)
strategy.entry("Short", strategy.short)