이 전략은 빠른 EMA 선과 느린 EMA 선의 교차를 구매 및 판매 신호로 사용하고 평행선 교차에 따라 자동 거래를 구현한다. 빠른 EMA 선은 밀착 가격 변동, 느린 EMA 선은 평평 가격 변동을 구현한다. 빠른 EMA 선이 하향 방향에서 느린 EMA 선을 통과하면 구매 신호가 발생하고 빠른 EMA 선이 상향 방향에서 느린 EMA 선을 넘어서는 경우 판매 신호가 발생한다. 이 전략은 유연하게 조정할 수 있으며, 빠른 EMA의 매개 변수를 조정하여 구매 및 판매 신호의 지점을 사용자 정의 할 수 있다.
이 전략은 주로 빠른 EMA 라인과 느린 EMA 라인을 계산하고 두 평행선의 관계를 비교하여 거래 신호를 생성한다.
먼저, 입력 변수에서 빠른 EMA의 주기emaFast를 1으로 설정하여 빠른 EMA가 가격 변화를 밀착시킬 수 있다. 동시에 느린 EMA의 주기emaSlowBuy를 구매 신호를 생성하고, emaSlowSell를 판매 신호를 생성하기 위해 설정한다.
그 다음, 입력된 주기에 따라, 빠른 EMA와 느린 EMA를 계산한다. 빠른 EMA는 1의 고정 주기이며, 가격과 밀접한 관계를 유지한다. 느린 EMA는 가격 데이터를 평형화하기 위해 조정 가능한 파라미터이다.
다음으로, 빠른 EMA와 느린 EMA의 크기의 관계를 비교하여 교차 상황을 판단한다. 빠른 EMA가 아래쪽에서 느린 EMA를 통과하면 금색 포크가 발생하여 구매 조건을 충족한다. 빠른 EMA가 위쪽에서 느린 EMA를 무너뜨리면 사각지대가 발생하여 판매 조건을 충족한다.
마지막으로, 구매 및 판매 조건이 충족되면, 해당 상장 및 상장 지시 사항을 실행하여 거래를 완료하십시오. 동시에, 현재 시간이 재검토 시간 범위 내에 있는지 확인하여 날짜 범위를 초과하는 잘못된 거래를 피하십시오.
위험에 대해 다음과 같은 최적화 조치를 고려할 수 있습니다.
다른 지표와 결합하여 EMA 교차 신호를 필터링하여 잘못된 신호를 방지합니다.
시장의 변동에 따라 EMA 파라미터를 조정하여 거래 빈도를 낮추는 것
더 많은 상쇄 및 차단 고려, 위험 통제
빠른 EMA의 주기를 최적화하여 특정 시장 조건에 더 적합한 매개 변수를 적용합니다.
트렌드 판단을 높이고, 불안한 시장의 과도한 거래를 피하십시오.
이 전략은 다음과 같은 방향으로 더 개선될 수 있습니다.
다양한 emaFast 및 emaSlow 파라미터를 거쳐, 단계적 최적화 또는 무작위적 최적화 방법을 사용하여, 역사 데이터 재검토에서 가장 잘하는 파라미터 조합을 찾을 수 있다.
예를 들어 MACD, KDJ, 브린 밴드 등의 지표가 결합되어 EMA 교차가 잘못된 신호를 발생하지 않도록 할 수 있다.
평균 실제 파도와 같은 지표들을 계산하여 강하고 약한 흐름을 판단하고, 흔들리는 시장에 빠지지 않도록하십시오.
손실 위험을 통제하기 위한 최적의 스톱포트를 연구하고, 수익을 극대화하기 위한 합리적인 스톱포트를 결정한다.
빠른 EMA 조합 뿐만 아니라, 더 나은 변수를 찾기 위해 쌍 EMA, 삼 EMA 또는 다중 EMA 조합을 테스트 할 수 있습니다.
유동성이 강한 시장에서는 EMA 주기를 적절히 가속시킬 수 있고, 흔들리는 시장에서는 EMA 주기를 느리게 할 수 있다.
이 EMA 교차 전략의 전체적인 생각은 명확하고 이해하기 쉽으며,成熟한 기술 지표를 사용하여 매매 시점을 판단한다. 전략은 사용자 정의성이 강하며, EMA 매개 변수를 조정하여 최적화하여 다양한 시장 환경에 맞게 거래 전략을 수립할 수 있다. 그러나 EMA 신호는 지연성이 있으며, 최적의 매개 변수 조합을 찾기 위해 반복 테스트가 필요합니다. 또한, 위험에 맞게 최적화하고, 다른 지표와 결합하여 신호 검증을 수행하고, 손해 중지 방식을 최적화하여 회수 철수를 줄이고 수익성을 향상시킵니다.
/*backtest
start: 2023-10-10 00:00:00
end: 2023-11-09 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(
"EMA Cross Strategy with Custom Buy/Sell Conditions",
overlay=true
)
// INPUT:
// Options to enter fast Exponential Moving Average (EMA) value
emaFast = 1
// Options to enter slow EMAs for buy and sell signals
slowEMABuy = input(title="Slow EMA for Buy Signals", defval=20, minval=1, maxval=9999)
slowEMASell = input(title="Slow EMA for Sell Signals", defval=30, minval=1, maxval=9999)
// Option to select trade directions
tradeDirection = input(title="Trade Direction", options=["Long", "Short", "Both"], defval="Both")
// Options that configure the backtest date range
startDate = input(title="Start Date", type=input.time, defval=timestamp("01 Jan 2018 00:00"))
endDate = input(title="End Date", type=input.time, defval=timestamp("31 Dec 2025 23:59"))
// CALCULATIONS:
// Use a fixed fast EMA of 1 and calculate slow EMAs for buy and sell signals
fastEMA = ema(close, emaFast)
slowEMABuyValue = ema(close, slowEMABuy)
slowEMASellValue = ema(close, slowEMASell)
// PLOT:
// Draw the EMA lines on the chart
plot(series=fastEMA, color=color.orange, linewidth=2)
plot(series=slowEMABuyValue, color=color.blue, linewidth=2, title="Slow EMA for Buy Signals")
plot(series=slowEMASellValue, color=color.red, linewidth=2, title="Slow EMA for Sell Signals")
// CONDITIONS:
// Check if the close time of the current bar falls inside the date range
inDateRange = true
// Translate input into trading conditions for buy and sell signals
buyCondition = crossunder(slowEMABuyValue, fastEMA)
sellCondition = crossover(slowEMASellValue, fastEMA)
// Translate input into overall trading conditions
longOK = (tradeDirection == "Long") or (tradeDirection == "Both")
shortOK = (tradeDirection == "Short") or (tradeDirection == "Both")
// ORDERS:
// Submit entry (or reverse) orders based on buy and sell conditions
if (buyCondition and inDateRange)
strategy.entry("Buy", strategy.long)
if (sellCondition and inDateRange)
strategy.close("Buy")
// Submit exit orders based on opposite trade conditions
if (strategy.position_size > 0 and sellCondition)
strategy.close("Sell")
if (strategy.position_size < 0 and buyCondition)
strategy.close("Sell")