이 전략은 트렌드 다음 전략에 속하는 빠른 EMA 라인의 크로스오버와 크로스오더를 기반으로 거래 신호를 생성합니다. 빠른 EMA가 느린 EMA를 넘을 때 구매하고 빠른 EMA가 느린 EMA를 넘을 때 판매하여 간단한 트렌드 추적 전략을 구현합니다.
이 전략의 핵심 논리는 주로 다음과 같은 부분을 포함합니다.
빠른 EMA와 느린 EMA를 계산하십시오: 길이의 빠른 EMA와 길이의 느린 EMA를 계산하기 위해 ta.ema(를 사용하십시오.
백테스트 시간 범위를 설정: useDateFilter를 사용하여 백테스트 시간 범위를 필터하는지 여부를 설정하고, 백테스트 시작 날짜와 백테스트 종료 날짜를 사용하여 시작 및 종료 시간을 설정합니다.
트레이딩 신호를 생성: 빠른 EMA가 느린 EMA를 넘을 때 구매 신호를 생성하고 빠른 EMA가 느린 EMA를 넘을 때 판매 신호를 생성하여 빠른 EMA와 느린 EMA를 비교하기 위해 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)