
이 전략은 MADEFlex이라고 불리며, 전체적으로 MADEFlex이라고 불리며, 이동 평균 봉투와 평균 실제 범위 후속 손실을 기반으로 하는 유연한 양적 거래 전략이다. 이 전략은 이동 평균 봉투 지표와 평균 실제 범위 후속 손실 메커니즘을 결합하여 유연하고 제어 가능한 양적 거래 솔루션을 구현한다.
이 전략의 핵심은 이동 평균 라인 봉투 (MADE) 지표이다. MADE 지표는 퍼센티지 인자를 적용한 지수 이동 평균 (EMA) 를 곱하여 형성한다. 가격이 궤도를 돌파할 때, 판매 신호를 생성한다. 가격이 궤도를 돌파할 때, 구매 신호를 생성한다. 이 전략은 MADE 지표와 평균 실제 범위를 결합한다.
구체적으로, MADE 지표에는 3개의 파라미터가 포함된다: 주기Period, 상도비율 perAb, 하도비율 perBl. 주기Period는 EMA의 주기 길이를 결정한다. 상도비율의 EMA의 폭은 퍼센트 인자를 통해 제어된다. ATR 후속 손실 부분은 주로 ATR 주기 nATRPeriod 및 ATR 곱 nATRMultip를 통해 설정된다. 가격이 상위 K 선의 스톱 라인을 초과할 때, 스톱 라인을 가격으로 조정하여 고정된 ATR 손실을 줄이고, 가격이 상위 K 선의 스톱 라인을 가격으로 조정하여 고정된 ATR 손실을 더한다.
최종적으로 MADE 지표 신호와 ATR 후속 중지 조건 필터링을 결합하여 구매 및 판매 신호를 생성한다. 역전 거래 입력 스위치 reverse를 통해 역전 작동을 구현할 수 있다.
MADEFlex 전략은 다음과 같은 장점을 가지고 있습니다.
지표 신호와 차단 메커니즘을 결합하면 더욱 안정적이다. MADE 지표 자체는 잘못된 신호를 발생시킬 수 있다. ATR 추적 차단과 결합하면 일부 소음을 효과적으로 필터링 할 수 있다.
조정 가능한 매개 변수 풍부, 제어 유연. MADE 지표의 매개 변수와 ATR 매개 변수를 조정할 수 있으며, 신호의 양과 품질을 제어할 수 있다.
역전도 지원. 역전도 스위치를 통해 역전도 거래가 가능하며, 전략 사용 시나리오가 풍부하다.
시각화 스톱터 직관적. 스톱터 라인을 그리며, 직관적으로 스톱터 효과를 판단한다.
MADEFlex 전략에는 다음과 같은 위험도 있습니다.
MADE 지표 파라미터가 부적절하면 많은 오류 신호가 발생할 수 있다. 적절한 파라미터를 결정하기 위해 신중한 테스트가 필요합니다.
ATR을 너무 느슨하게 멈추는 것은 손실 기회를 놓칠 수 있다. 적절한 ATR 배수를 결정하는 테스트가 권장된다.
리버스 조작은 위험하다. 특히 높은 변동 시, 리버스 조작은 손실 위험을 증가시킬 수 있다. 신중하게 사용해야 한다.
정지 보호가 없는 경우 더 큰 손실이 발생할 수 있습니다. 극단적인 경우에는 정지 보호가 없는 경우 더 큰 손실이 발생할 수 있습니다.
MADEFlex 전략은 다음과 같은 방향으로 최적화할 수 있습니다:
MADE 파라미터를 최적화하여 신호 품질을 향상시킵니다. 다른 주기, 퍼센트 파라미터를 테스트하여 더 신뢰할 수있는 파라미터 조합을 찾을 수 있습니다.
ATR 중지 변수를 최적화하여 더 나은 중지 효과를 달성하십시오. ATR 주기 및 ATR 배수를 테스트하여 더 적절한 조합을 결정할 수 있습니다.
다른 필터링 조건을 추가하여 잘못된 신호를 더욱 줄여줍니다. 예를 들어, 변동률 지표와 결합하여 더 많은 필터링 신호를 제공합니다.
추가한 스톱 전략, 수익이 일정 수준에 도달하면 스톱 철수. 수익을 잠금화하고 위험을 제어할 수 있다.
기계 학습 방법과 결합한 동적 최적화 파라미터. 강화 학습과 같은 방법을 사용하여 실시간 최적화 파라미터, 전략을 더 탄력하게 만든다.
MADEFlex 전략은 이동 평균 봉투 지표의 거래 신호와 평균 실제 범위 추적 손실 방법을 성공적으로 결합했다. 조정 가능한 매개 변수를 통해 유연하고 제어 가능한 양적 거래 솔루션을 구현했다. 이 전략은 신뢰성이 높고, 제어 능력이 강하며, 일정 양적 기반의 사용자 사용과 최적화에 적합하다. 추가 최적화하면 더욱 눈에 띄는 전략 성과를 낼 수 있다.
/*backtest
start: 2022-12-01 00:00:00
end: 2023-12-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
////////////////////////////////////////////////////////////
// Copyright by HPotter v1.0 27/09/2022
// Moving Average Displaced Envelope. These envelopes are calculated
// by multiplying percentage factors with their displaced expotential
// moving average (EMA) core.
// How To Trade Using:
// Adjust the envelopes percentage factors to control the quantity and
// quality of the signals. If a previous high goes above the envelope
// a sell signal is generated. Conversely, if the previous low goes below
// the envelope a buy signal is given.
//
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort
// The related article is copyrighted material from Stocks & Commodities Jun 2009
//
// ATR TS used by filter for MADE signals.
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
strategy(title='Moving Average Displaced Envelope & ATRTS', shorttitle='MADE+ATR', overlay=true)
tradeDirection = input.string('Both', title='Trade Direction', options=['Both', 'Long', 'Short'])
Price = input(title='Source', defval=close)
Period = input.int(defval=9, minval=1)
perAb = input.float(title='Percent above', defval=.5, minval=0.01, step=0.1)
perBl = input.float(title='Percent below', defval=.5, minval=0.01, step=0.1)
disp = input.int(title='Displacement', defval=13, minval=1)
nATRPeriod = input(15)
nATRMultip = input(2)
useATR = input(false, title='ATR Filter')
reverse = input(false, title='Trade reverse')
longAllowed = tradeDirection == 'Long' or tradeDirection == 'Both'
shortAllowed = tradeDirection == 'Short' or tradeDirection == 'Both'
pos = 0
sEMA = ta.ema(Price, Period)
top = sEMA[disp] * ((100 + perAb) / 100)
bott = sEMA[disp] * ((100 - perBl) / 100)
xATR = ta.atr(nATRPeriod)
xHHs =ta.sma(ta.highest(nATRPeriod), nATRPeriod)
xLLs =ta.sma(ta.lowest(nATRPeriod),nATRPeriod)
nSpread = (xHHs - xLLs) / 2
nLoss = nATRMultip * xATR
var xATRTrailingStop = 0.0
xATRTrailingStop := close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), close - nLoss) :
close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), close + nLoss) :
close > nz(xATRTrailingStop[1], 0) ? close - nLoss : close + nLoss
ATRLong = close > xATRTrailingStop ? true : false
ATRShort = close < xATRTrailingStop ? true : false
iff_1 = close > top ? 1 : pos[1]
pos := close < bott ? -1 : iff_1
iff_2 = reverse and pos == -1 ? 1 : pos
possig = reverse and pos == 1 ? -1 : iff_2
clr = strategy.position_size
if possig == 1
if longAllowed and ATRLong
strategy.entry('Long', strategy.long)
else
if ATRLong or strategy.position_size > 0
strategy.close_all()
if possig == -1
if shortAllowed and ATRShort
strategy.entry('Short', strategy.short)
else
if ATRShort or strategy.position_size < 0
strategy.close_all()
if possig == 0
strategy.close_all()
plot(xATRTrailingStop[1], color=color.blue, title='ATR Trailing Stop')
barcolor(clr < 0 ? #b50404 : clr > 0 ? #079605 : #0536b3)