
이 전략은 동력 지표와 쌍방향 추적 지표의 사용과 결합하여 강세를 보이는 경향에서 브레이크 신호를 포착하여 트렌드 추적을 구현한다. 가격이 상향으로 돌파 할 때 더하고, 가격이 하향으로 돌파 할 때 공백을 만들며, 트렌드 추적 전략에 속한다.
HiLo 액티베터 지표를 사용하여 중간 가격을 계산합니다. 이 지표는 최고 가격과 최저 가격의 중간 지점을 중간 가격으로 사용합니다. 가격이 상승하면 중간 가격을 돌파 할 때 구매 신호를 발생시키고, 가격이 하락하면 중간 가격을 돌파 할 때 판매 신호를 발생시킵니다.
평균 트렌드 지수 ADX는 트렌드 강도를 판단하는 데 사용됩니다. ADX 값이 클수록 트렌드가 강하다는 것을 나타냅니다. 이 전략은 특정 하락값의 ADX를 사용하여 신호를 필터링하고, 트렌드가 충분히 강할 때만 신호를 생성합니다.
다방향 가이드 지표 DI+와 DI-는 각각 다중 헤드 강도와 빈 헤드 강도를 나타낸다. 이 전략은 동시에 특정 임계값의 DI+와 DI-와 함께 다중 헤드 및 빈 헤드의 강도를 확인하고, 잘못된 신호를 방지한다.
가격이 상향으로 중간값을 돌파할 때, ADX가 하락값보다 높고, DI+가 하락값보다 높을 때 구매 신호가 발생한다. 가격이 하향으로 중간값을 돌파할 때, ADX가 하락값보다 높고, DI-가 하락값보다 높을 때 판매 신호가 발생한다.
이 전략은 동력 지표와 트렌드 지표의 장점을 결합하여, 트렌드 개발의 초기 단계에서 가격의 돌파구를 포착하여 트렌드 실행을 밀도합니다. 동시에, 트렌드 필터 조건은 엄격하며, 통합 시 및 충격 시의 잘못된 신호를 피하는 데 도움이됩니다.
동력 지표를 단독으로 사용하는 것과 비교하여, 이 전략은 신호를 생성할 때 트렌드 강도에 대한 판단을 추가하여, 잘못된 신호를 줄일 수 있고, 수익을 얻을 확률을 높일 수 있다. 트렌드 추적 지표를 단독으로 사용하는 것과 비교하여, 이 전략은 돌파구를 통해 신호를 생성하여, 더 일찍 트렌드에 들어갈 수 있다.
전체적으로 보면, 전략은 트렌드를 잘 추적하고, 적시에 들어가고, 빠져나와, 진흙을 피할 수 있습니다. 동시에, 트렌드 반전의 손실을 줄일 수 있습니다.
이 전략에는 약간의 위프사우 위험이 있습니다. 즉, 가격에 약간의 회전이 발생할 수 있으므로 역전 신호가 발생할 수 있습니다. 또한 ADX와 DI를 사용하여 필터링 조건을 설정하면 초기 운영의 일부를 놓칠 수 있습니다.
휘프사우 위험을 줄이기 위해 HiLo 활성화기의 매개 변수를 적절히 조정하여 돌파폭을 증가시킬 수 있다. 더 많은 기회를 얻기 위해 ADX 및 DI의 절댓값 요구 사항을 줄일 수 있지만 신호 품질을 밸런스해야 한다.
또한, 사용자는 다양한 품종과 시장 환경의 파라미터 설정의 차이에 주의를 기울여야 한다. 일반적으로, 상품은 더 높은 마이너스를 설정해야 한다. 주식과 외환은 더 낮은 마이너스를 사용할 수 있다.
이 정책은 파라미터 설정을 조정하여 최적화 할 수 있습니다. 주요 최적화 방향은 다음과 같습니다:
HiLo 액티버터 사이클과 트리거의 폭을 조정하여 휘프사우 위험과 진입 시간을 균형 잡는다.
ADX 주기 및 값 요구 사항을 조정하여 신호 품질과 진입 주파수를 균형을 잡습니다.
각각 다중체와 공체 DI의 값을 조정하여 다중체와 공체 환경의 차이를 구분한다.
단위 손실을 제어하기 위해 스톱 손실 전략을 추가하고 스톱 손실 지점을 설정합니다.
다른 보조 지표와 결합하여 최적화하여 전략의 전반적인 안정성을 향상시킵니다.
이 전략은 동력 지표와 트렌드 지표를 종합적으로 고려하여 강력한 트렌드에서 구매 및 판매 신호를 생성한다. 그것은 순차적으로, 밀접한 트렌드의 특징을 가지고 있으며, 트렌드의 초기 기회를 잡기 위해 적합하다. 동시에, 그것은 또한 잘못된 신호와 whipsaw로 인한 손실을 줄일 수있는 특정 위험 제어 능력을 가지고 있습니다.
/*backtest
start: 2022-12-11 00:00:00
end: 2023-12-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("HiLo Activator with ADX", shorttitle="HASB_ADX", overlay=true)
// Parameters for the HiLo Activator
length_ha = input(14, title="HiLo Activator Period")
offset_ha = input(0, title="Offset")
trigger_ha = input(1, title="Trigger for Buy/Sell")
// Parameters for ADX
adx_length = input(14, title="ADX Period", minval=1)
adx_threshold = input(25, title="ADX Threshold")
di_threshold = input(50, title="DI Threshold")
// Parameter for choosing the number of candles for backtest
backtest_candles = input(1000, title="Number of Candles for Backtest", minval=1)
// Function to get backtest data
getBacktestData() =>
var float data = na
if bar_index >= backtest_candles
data := security(syminfo.tickerid, "D", close[backtest_candles])
data
// HiLo Activator calculations
ha = (highest(high, length_ha) + lowest(low, length_ha)) / 2
// ADX calculations
trh = high - high[1]
trl = low[1] - low
tr = max(trh, trl)
atr = sma(tr, adx_length)
plus_dm = high - high[1] > low[1] - low ? max(high - high[1], 0) : 0
minus_dm = low[1] - low > high - high[1] ? max(low[1] - low, 0) : 0
smoothed_plus_dm = sma(plus_dm, adx_length)
smoothed_minus_dm = sma(minus_dm, adx_length)
di_plus = 100 * (smoothed_plus_dm / atr)
di_minus = 100 * (smoothed_minus_dm / atr)
dx = 100 * abs(di_plus - di_minus) / (di_plus + di_minus)
adx = sma(dx, adx_length)
// Buy and Sell signals based on HiLo Activator and ADX
signalLong = crossover(close, ha) and adx > adx_threshold and di_plus > di_threshold
signalShort = crossunder(close, ha) and adx > adx_threshold and di_minus > di_threshold
// Plot HiLo Activator and ADX
plot(ha, color=color.blue, title="HiLo Activator")
plot(offset_ha, color=color.red, style=plot.style_histogram, title="Offset")
plot(adx, color=color.purple, title="ADX")
// Backtest strategy
strategy.entry("Buy", strategy.long, when = signalLong)
strategy.entry("Sell", strategy.short, when = signalShort)
strategy.close("Buy", when = signalShort)
strategy.close("Sell", when = signalLong)
// Accuracy percentage
var accuracy = 0.0
var totalTrades = 0
var winningTrades = 0
if (signalLong or signalShort)
totalTrades := totalTrades + 1
if (signalLong and (not na(signalLong[1]) and (not signalLong[1])))
winningTrades := winningTrades + 1
if (signalShort and (not na(signalShort[1]) and (not signalShort[1])))
winningTrades := winningTrades + 1
accuracy := totalTrades > 0 ? (winningTrades / totalTrades) * 100 : 0
// Plot accuracy percentage on the chart
plot(accuracy, title="Accuracy Percentage", color=color.purple, style=plot.style_histogram)