
이 전략은 쌍 지수 이동 평균 (Dual Exponential Moving Average, DEMA) 과 띠 통과 필터 (Bandpass Filter, BPF) 를 조합하여 구매와 과매매의 두 개의 필터를 뚫고 안정적인 거래 신호를 형성하여 수익을 극대화합니다.
이 전략은 다음의 두 가지 세부 전략으로 구성됩니다.
2일과 20일 쌍수 지수 이동 평균을 사용하여 금포의 구매 및 사다리의 판매 신호를 형성한다. 이 지표는 가격의 일부 잡음을 필터링하여 트렌드를 발견하는 데 도움이 된다.
BPF 지표는 수학적 변형을 결합하여 가격의 순환 회전을 감지하고, 특정 주기 내의 과매매 지역을 형성하여 거래 신호를 발산합니다. 이 전략은 20 일 주기로 설정되어 0.5의 정규화 변수입니다.
이 둘을 결합하여 동방향 다중 하위권 신호가 나타나면, 트렌드 및 주기적 요소가 모두 검증되어 신뢰도가 높으며, 더 안정적인 입점과 퇴출점을 생성한다.
이 전략의 가장 큰 장점은 이중 지표 필터링으로 신호를 더 안정적이고 신뢰할 수 있습니다. DEMA는 가격을 평평하게하고, 트렌드 방향을 식별합니다. BPF는 사이클 특성을 식별하고, 오버 바이 오버 셀 영역을 결정합니다. 둘의 교차 검증은 가격 잡음과 주기 조정으로 인한 잘못된 신호의 가능성을 크게 줄일 수 있습니다.
또한, 전략 자체는 거래 빈도가 높지 않으며, 과도한 거래로 인한 자본과 수수료 손실을 방지한다. 포지션 보유 시간은 중·장선으로 주류하고, 무작위적인 변동의 영향을 피하는 데 도움이 된다.
이 전략의 가장 큰 위험은 시장 상태를 잘못 판단하는 것이다. 흔들리는 상황에서 잘못된 신호가 발생하기 쉽다. 추세가 역전될 때, 중지 손실이 더 커질 수 있다. 또한, 매개 변수 설정 문제는 전략의 성과에 큰 영향을 미치게 된다.
이러한 위험에는 지표 매개 변수를 최적화하고, 스톱로스 스톱을 설정하고, 다른 지표와 결합하여 제어 및 개선 할 수 있습니다. 시장이 흔들림과 전환 단계에 진입했다고 판단 할 때, 불리한 상황의 방해를 피하기 위해 일시 중단 전략을 고려 할 수 있습니다.
이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.
시간주기 최적화. 다양한 DEMA와 BPF 파라미터 설정을 테스트하여 최적의 주기 조합을 결정한다.
스톱로스 스을 늘리십시오. 손실이 확대되는 것을 방지하기 위해 합리적인 스톱로스 스을 설정하십시오. 적절한 스톱로스는 수익의 일부를 잠금합니다.
Volume, MACD 등과 같은 다른 지표 필터링을 추가하여, 신호가 많은 하락 도박에 의해 오해되는 것을 피하십시오.
매개 변수 적응 최적화 DEMA와 BPF의 매개 변수가 최신 시장 상태에 따라 동적으로 조정될 수 있도록 하여 지표의 실시간성을 보장한다.
이 전략은 이중 EMA와 BPF 두 지표의 장점을 통합하고, 이중 필터링으로 신호 품질을 향상시키고, 안정적인 중장선 수익을 추구한다. 위험은 주로 시장 상태 판단 오류와 파라미터 설정이 부적절하다. 다중 지표 검증, 동적으로 최적화 파라미터 등을 통해 전략이 더 탄력적이고 적응성이 있으며, 비용 대비 더 높을 수 있다.
/*backtest
start: 2023-01-10 00:00:00
end: 2024-01-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
////////////////////////////////////////////////////////////
// Copyright by HPotter v1.0 05/04/2022
// This is combo strategies for get a cumulative signal.
//
// First strategy
// This indicator plots 2/20 exponential moving average. For the Mov
// Avg X 2/20 Indicator, the EMA bar will be painted when the Alert criteria is met.
//
// Second strategy
// The related article is copyrighted material from
// Stocks & Commodities Mar 2010
//
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
EMA20(Length) =>
pos = 0.0
xPrice = close
xXA = ta.ema(xPrice, Length)
nHH = math.max(high, high[1])
nLL = math.min(low, low[1])
nXS = nLL > xXA or nHH < xXA ? nLL : nHH
iff_1 = nXS < close[1] ? 1 : nz(pos[1], 0)
pos := nXS > close[1] ? -1 : iff_1
pos
BPF(Length,Delta,SellZone,BuyZone) =>
pos = 0.0
xPrice = hl2
beta = math.cos(3.14 * (360 / Length) / 180)
gamma = 1 / math.cos(3.14 * (720 * Delta / Length) / 180)
alpha = gamma - math.sqrt(gamma * gamma - 1)
BP = 0.0
BP := 0.5 * (1 - alpha) * (xPrice - xPrice[2]) + beta * (1 + alpha) * nz(BP[1]) - alpha * nz(BP[2])
pos:= BP > SellZone ? 1 :
BP <= BuyZone? -1 : nz(pos[1], 0)
pos
strategy(title='Combo 2/20 EMA & Bandpass Filter', shorttitle='Combo', overlay=true)
var I1 = '●═════ 2/20 EMA ═════●'
Length = input.int(14, minval=1, group=I1)
var I2 = '●═════ Bandpass Filter ═════●'
LengthBPF = input.int(20, minval=1, group=I2)
Delta = input(0.5, group=I2)
SellZone = input.float(5, step = 0.01, group=I2)
BuyZone = input.float(-5, step = 0.01, group=I2)
var misc = '●═════ MISC ═════●'
reverse = input.bool(false, title='Trade reverse', group=misc)
var timePeriodHeader = '●═════ Time Start ═════●'
d = input.int(1, title='From Day', minval=1, maxval=31, group=timePeriodHeader)
m = input.int(1, title='From Month', minval=1, maxval=12, group=timePeriodHeader)
y = input.int(2005, title='From Year', minval=0, group=timePeriodHeader)
StartTrade = time > timestamp(y, m, d, 00, 00) ? true : false
posEMA20 = EMA20(Length)
prePosBPF = BPF(LengthBPF,Delta,SellZone,BuyZone)
iff_1 = posEMA20 == -1 and prePosBPF == -1 and StartTrade ? -1 : 0
pos = posEMA20 == 1 and prePosBPF == 1 and StartTrade ? 1 : iff_1
iff_2 = reverse and pos == -1 ? 1 : pos
possig = reverse and pos == 1 ? -1 : iff_2
if possig == 1
strategy.entry('Long', strategy.long)
if possig == -1
strategy.entry('Short', strategy.short)
if possig == 0
strategy.close_all()
barcolor(possig == -1 ? #b50404 : possig == 1 ? #079605 : #0536b3)