이 전략은 거래에 이동 평균의 교차 원칙에 기반합니다. 두 개의 이동 평균을 사용하여 단기 이동 평균이 아래에서 장기 이동 평균을 넘을 때 구매 신호를 생성합니다. 가격이 다른 이동 평균보다 낮을 때 판매 신호가 생성됩니다. 이 전략은 트렌딩 시장에 적합하며 소음 거래를 효과적으로 필터링하고 주요 트렌드를 포착 할 수 있습니다.
이 전략은 사용자가 사용자 지정할 수 있는 단기 및 장기 이동 평균 기간, 출구 이동 평균 기간 및 이동 평균 계산 방법을 사용합니다.
단기 이동 평균이 아래로부터의 장기 이동 평균을 넘을 때 구매 신호가 생성됩니다. 이것은 단기 트렌드가 상승 추세로 전환되어 구매 할 수 있음을 나타냅니다.
닫기 가격이 출구 이동 평균 이하로 떨어지면 판매 신호가 생성됩니다. 이것은 트렌드 반전을 나타냅니다. 그래서 우리는 입장을 종료해야합니다.
따라서 전략의 거래 신호는 단기 및 장기 이동 평균의 교차와 종료 가격과 출구 이동 평균 사이의 관계에서 나옵니다.
이 전략의 장점은 다음과 같습니다.
간단하고 쉽게 실행할 수 있습니다.
사용자 정의 가능한 매개 변수는 다른 시장 조건에 맞습니다.
이동평균은 소음을 필터링하고 주요 추세를 파악합니다.
추세, 지원/저항과 같은 다른 기술 지표를 추가로 최적화 할 수 있습니다.
통제 가능한 리스크/상금 비율, 스톱 로스 메커니즘
위험은 다음과 같습니다.
트렌드가 아닌 통합 시장에서 잘못된 신호에 취약합니다.
부적절한 매개 변수 설정으로 인해 트렌드가 누락되거나 유효하지 않은 거래가 너무 많을 수 있습니다.
잘못된 스톱 로스 투입이 손실을 증가시킬 수 있습니다.
실패한 탈출은 손실을 초래할 수 있습니다.
매개 변수들은 시장 변화에 맞춰 적시에 조정되어야 합니다.
솔루션은 매개 변수를 최적화하고, 다른 필터를 통합하고, 스톱을 조정하고, 거래 전에 트렌드 확인을 기다립니다.
이 전략은 다음과 같이 개선될 수 있습니다.
트렌드 결정 메커니즘을 개발하고 트렌드 확인 후만 거래합니다.
부피나 변동성 같은 필터를 필터 신호에 추가합니다.
이동 평균 기간의 동적 최적화
트레일링 스톱을 사용하도록 스톱 손실 메커니즘을 최적화합니다.
지원/저항 및 다른 지표를 포함하여 신호를 더 확인합니다.
다른 제품과 시간 프레임에 따라 매개 변수를 조정합니다.
전체적으로이 이동 평균 크로스오버 전략은 단순하고 실용적인 트렌드 다음 시스템입니다. 매개 변수를 조정하여 시장 조건에 조정하고 트렌드 시장의 주요 트렌드 방향을 잡을 수 있습니다. 그러나 트렌드 잘못된 식별과 같은 위험이 주목되어야하며 변화하는 시장에 적응하기 위해 지속적인 최적화가 필요합니다. 일반적으로이 전략은 좋은 생존력을 가지고 있습니다.
/*backtest start: 2022-10-30 00:00:00 end: 2023-11-05 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © TwoChiefs //@version=4 strategy("John EMA Crossover Strategy", overlay=true) //////////////////////////////////////////////////////////////////////////////// // BACKTESTING RANGE // From Date Inputs fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) fromYear = input(defval = 2020, title = "From Year", minval = 1970) // To Date Inputs toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) toYear = input(defval = 2021, title = "To Year", minval = 1970) // Calculate start/end date and time condition startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) time_cond = true //////////////////////////////////////////////////////////////////////////////// //CREATE USER-INPUT VARIABLES periodShort = input(13, minval=1, title="Enter Period for Short Moving Average") smoothingShort = input(title="Choose Smoothing Type for Short Moving Average", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "LSMA"]) periodLong = input(48, minval=1, title="Enter Period for Long Moving Average") smoothingLong = input(title="Choose Smoothing Type for Long Moving Average", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "LSMA"]) periodExit = input(30, minval=1, title="Enter Period for Exit Moving Average") smoothingExit = input(title="Choose Smoothing Type for Exit Moving Average", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "LSMA"]) src1 = close pivot = (high + low + close) / 3 //MA CALCULATION FUNCTION ma(smoothing, src, length) => if smoothing == "RMA" rma(src, length) else if smoothing == "SMA" sma(src, length) else if smoothing == "EMA" ema(src, length) else if smoothing == "WMA" wma(src, length) else if smoothing == "VWMA" vwma(src, length) else if smoothing == "SMMA" na(src[1]) ? sma(src, length) : (src[1] * (length - 1) + src) / length else if smoothing == "HullMA" wma(2 * wma(src, length / 2) - wma(src, length), round(sqrt(length))) //ASSIGN A MOVING AVERAGE RESULT TO A VARIABLE shortMA=ma(smoothingShort, pivot, periodShort) longMA=ma(smoothingLong, pivot, periodLong) exitMA=ma(smoothingExit, pivot, periodExit) //PLOT THOSE VARIABLES plot(shortMA, linewidth=4, color=color.yellow,title="The Short Moving Average") plot(longMA, linewidth=4, color=color.blue,title="The Long Moving Average") plot(exitMA, linewidth=1, color=color.red,title="The Exit CrossUnder Moving Average") //BUY STRATEGY buy = crossover(shortMA,longMA) ? true : na exit = crossunder(close,exitMA) ? true : na strategy.entry("long",true,when=buy and time_cond) strategy.close("long",when=exit and time_cond) if (not time_cond) strategy.close_all()