
이 전략은 빠른 라인 EMA와 느린 라인 EMA를 계산하고 두 가지의 크기와 관계를 비교하여 쌍 EMA의 골드 포크와 데드 포크 거래 신호를 구현하는 경향 추적 전략에 속한다. 빠른 라인 상에서 느린 라인을 통과 할 때 구매 신호를 생성하고 빠른 라인 아래에서 느린 라인을 통과 할 때 판매 신호를 생성하면 간단한 경향 추적 전략을 구현한다.
이 전략의 핵심 논리는 다음과 같습니다.
빠른 라인 EMA와 느린 라인 EMA를 계산한다: fastInput의 긴 라인 EMA와 slowInput의 긴 라인 EMA를 ta.ema() 함수를 통해 계산한다.
재검토 시간 범위를 설정: useDateFilter 변수를 통해 재검토 시간, backtestStartDate 및 backtestEndDate를 설정하여 재검토 시작 및 종료 시간을 설정하십시오.
거래 신호를 생성한다: ta.crossover ((() 와 ta.crossunder ((() 함수를 통해 빠른 라인 EMA와 느린 라인 EMA의 크기의 관계를 비교한다. 빠른 라인 상에서 느린 라인을 통과할 때 구매 신호를 생성하고, 빠른 라인 아래에서 느린 라인을 통과할 때 판매 신호를 생성한다.
처리 시간 범위를 벗어난 주문: 재검토 시간 범위를 벗어난 주문을 취소하고 모든 포지션을 평행합니다.
이동 평균을 그리기: 차트에 빠른 라인 EMA와 느린 라인 EMA의 이동 평균을 그리기.
이것은 매우 간단한 트렌드 추적 전략으로 다음과 같은 장점이 있습니다.
전략적 논리는 간단하고 이해하기 쉽고 실행이 쉽다.
EMA는 가격 데이터를 매끄럽게 만들어 거래의 소음을 줄일 수 있습니다.
사용자 정의 EMA 주기 파라미터, 다른 시장 환경에 적응.
특정 시간 범위를 대상으로 테스트를 수행할 수 있는 리테크 시간 범위를 조정할 수 있습니다.
다른 지표와 결합하여 최적화 가능한 입출장 조건.
이 전략에는 몇 가지 위험도 있습니다.
이중 EMA 전략은 시장의 변화에 대해 유연하게 대응할 수 없습니다.
자주 거래되고 반복되는 거래의 위험이 있습니다
EMA 파라미터를 잘못 설정하면 거래 신호 오류가 발생할 수 있다.
부적절한 회수 시간 범위로 인해 과도한 적합성이 발생할 수 있습니다.
어쩔 수 없는 철수와 손실의 위험이 있습니다.
매개 변수 최적화, 적절한 필터 변동, 스톱 손실 설정 등의 방법으로 위험을 제어할 수 있다.
이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.
EMA 주기 변수를 최적화하여 최적의 변수 조합을 선택한다.
다른 지표들을 필터링하여 불필요한 거래를 피하십시오.
단편적 손실을 통제하기 위한 손실을 막는 전략을 강화한다.
트렌드, 변동성 등의 필터와 결합하여 거래 빈도를 줄일 수 있습니다.
다양한 품종 계약을 테스트하여 최적의 전략을 적용할 대상자를 찾습니다.
슬라이드 포인트, 수수료 등의 비용 통제를 통해 재검토가 더 현실적으로 이루어집니다.
이 전략은 전체적으로 매우 간단한 이중 EMA 골드 포크 (金叉死叉) 전략으로, 논리는 명확하고 이해하기 쉽으며, 빠른 느린 EMA 비교를 통해 거래 신호를 생성한다. 이 전략의 장점은 구현이 간단하지만, 과잉 최적화를 유발하는 빈번한 거래와 같은 몇 가지 문제도 있다. 다음 단계는 매개 변수 최적화, 위험 제어 등의 측면에서 개선할 수 있으며, 전략을 더 안정하고 실용화 할 수 있다.
/*backtest
start: 2022-11-06 00:00:00
end: 2023-11-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("MollyETF_EMA_Crossover", overlay = true, initial_capital = 100000, default_qty_value=100, default_qty_type=strategy.percent_of_equity)
fastInput = input( 10, "Fast EMA")
slowInput = input( 21, "Slow EMA")
// Calculate two moving averages with different lengths.
float fastMA = ta.ema(close, fastInput)
float slowMA = ta.ema(close, slowInput)
// STEP 1. Create inputs that configure the backtest's date range
useDateFilter = input.bool(true, title="Filter Date Range of Backtest",
group="Backtest Time Period")
backtestStartDate = input(timestamp("1 Jan 2018"),
title="Start Date", group="Backtest Time Period",
tooltip="This start date is in the time zone of the exchange " +
"where the chart's instrument trades. It doesn't use the time " +
"zone of the chart or of your computer.")
backtestEndDate = input(timestamp("7 Sep 2023"),
title="End Date", group="Backtest Time Period",
tooltip="This end date is in the time zone of the exchange " +
"where the chart's instrument trades. It doesn't use the time " +
"zone of the chart or of your computer.")
// STEP 2. See if current bar falls inside the date range
inTradeWindow = true
// STEP 3. Include the date filter with the entry order conditions
// Enter a long position when `fastMA` crosses over `slowMA`.
if inTradeWindow and ta.crossover(fastMA, slowMA)
strategy.entry("buy", strategy.long)
// Enter a short position when `fastMA` crosses under `slowMA`.
if inTradeWindow and ta.crossunder(fastMA, slowMA)
strategy.close_all(comment="sell")
// STEP 4. With the backtest date range over, exit all open
// trades and cancel all unfilled pending orders
if not inTradeWindow and inTradeWindow[1]
strategy.cancel_all()
strategy.close_all(comment="Date Range Exit")
// Plot the moving averages.
plot(fastMA, "Fast MA", color.aqua)
plot(slowMA, "Slow MA", color.orange)