중력 중심 SSL 채널 트렌드 전략에 따라

저자:차오장, 날짜: 2023-09-19 21:30:23
태그:

전반적인 설명

이 전략은 중력 중심 지표와 SSL 채널 지표를 결합하여 트렌드 다음 전략 범주에 속하는 가격 추세를 결정하고 브레이크오트를 추적합니다. 또한 위험을 제어하기 위해 동적 ATR 스톱 로스를 사용합니다.

전략 논리

  1. 중력 중심 지표를 계산합니다. 상부와 하부 띠가 상승과 하락 트렌드의 한계입니다.

  2. SSL 채널 지표를 계산, 내부는 범위, 외부는 트렌드 방향입니다.

  3. 가격이 상위 밴드 또는 채널을 깨면 상승 추세를 결정하고 길게 가십시오. 가격이 하위 밴드 또는 채널을 깨면 하락 추세를 결정하고 짧게 가십시오.

  4. 동적 ATR 스톱 손실을 사용하여 스톱 손실 수준을 추적하고 증대 손실을 피합니다.

  5. 실제 거래 신호를 생성하기 위해 백테스트 기간과 결합합니다.

이 전략은 트렌드를 결정하기 위해 두 개의 지표를 사용하며, 하나는 브레이크오웃을 감지하고 하나는 트렌드를 확인하기 위해, 그것들을 결합하면 정확도를 향상시킬 수 있습니다. 동적 스톱 로스는 시장 변동성에 따라 조정되며 매우 실용적인 위험 관리 방법입니다.

이점 분석

  1. 두 가지 지표를 이용하면 추세를 파악하는 정확도가 향상됩니다.

  2. 중력의 중심은 트렌드 변화에 민감하며 SSL 채널은 트렌드 방향을 명확히 정의합니다.

  3. 동적 ATR 스톱 로스는 시장 변동성에 따라 유연하게 조정됩니다.

  4. 간단하고 명확한 전략 규칙, 이해하기 쉽고 실행하기 쉽습니다.

  5. 파라미터에 대한 큰 최적화 공간, 다른 시장에 맞게 조정할 수 있습니다.

  6. 전략 성능을 확인하기 위한 백테스트 기능을 완료합니다.

위험 분석

  1. 중력 센터와 SSL 모두 일부 경우 오류가 발생할 수 있으며 잘못된 신호로 이어질 수 있습니다. 확인을 위해 다른 지표를 추가 할 수 있습니다.

  2. 동적 스톱 손실은 너무 공격적이어서 스톱 손실 범위가 느려질 수 있습니다.

  3. 부적절한 백테스트 기간 선택은 나쁜 전략 결과를 초래할 수 있습니다. 다른 시장 단계에서 백테스트가 필요합니다.

  4. 무역 비용의 영향을 충분히 고려해야 합니다.

최적화 방향

  1. 최적의 쌍을 찾기 위해 다른 매개 변수 조합을 테스트합니다.

  2. 동적 스톱 로스 ATR 기간 및 곱셈 매개 변수를 최적화합니다.

  3. 신호 필터링을 위한 다른 지표, 예를 들어 MACD, KDJ를 소개합니다.

  4. 트렌드 방향 예측을 돕기 위해 기계 학습 모델을 추가합니다.

  5. 자금 관리를 최적화하고, 포지션 크기를 정하는 규칙

  6. 특정 제품에 대한 세밀한 조정 매개 변수

요약

이 전략은 트렌드를 결정하기 위해 중력 센터와 SSL 채널을 결합하고 위험을 제어하기 위해 동적 ATR 스톱 로스를 사용합니다. 이는 트렌드를 따르는 전략으로 실행 가능합니다. 파라미터 최적화, 다른 지표 및 기계 학습 등을 도입하여 추가 개선이 가능합니다. 전반적으로 이것은 매우 실용적이고 확장 가능한 전략이며 알고리즘 거래에 귀중한 참조로 사용됩니다.


/*backtest
start: 2023-08-19 00:00:00
end: 2023-09-13 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Thanks to HPotter for the original code for Center of Gravity Backtest
strategy("CoG SSL BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_0 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

/////////////// SSL Channels /////////////// 
_1 = input(false,  "═════════ SSL ══════════")
len1=input(title="SMA Length 1", defval=12)
len2=input(title="SMA Length 2", defval=13)

smaHigh = sma(high, len1)
smaLow = sma(low, len2)

Hlv = 0
Hlv := close > smaHigh ? 1 : close < smaLow ? -1 : Hlv[1]
sslDown = Hlv < 0 ? smaHigh : smaLow
sslUp = Hlv < 0 ? smaLow : smaHigh

///////////// Center of Gravity /////////////
_2 = input(false,  "═════════ CoG ══════════")
Length = input(25, minval=1)
m = input(5, minval=0)
Percent = input(6, minval=0, title="COG %")

xLG = linreg(close, Length, m)
xLG1r = xLG + ((close * Percent) / 100)
xLG1s = xLG - ((close * Percent) / 100)

pos = 0.0
pos := iff(close > xLG1r, 1, iff(close < xLG1s, -1, nz(pos[1], 0))) 
possig = iff(pos == 1, 1, iff(pos == -1, -1, pos))

///////////// Rate Of Change ///////////// 
_3 = input(false,  "══════ Rate of Change ══════")
source = close
roclength = input(2, "ROC Length",  minval=1)
pcntChange = input(10, "ROC % Change", minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Srategy ///////////////
long = possig == 1 or (sslUp > sslDown and isMoving())
short = possig == -1 or (sslUp < sslDown and isMoving())

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Dynamic ATR Stop Losses ///////////////
_4 = input(false,  "════════ Stop Loss ═══════")
atrLkb = input(1, minval=1, title='ATR Stop Period')
atrMult = input(2, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop = 0.0
longStop :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1]
shortStop = 0.0
shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1]

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("L",  strategy.long, when=long)
    strategy.entry("S", strategy.short, when=short)
    strategy.exit("L SL", "L", stop=longStop, when=since_longEntry > 0)
    strategy.exit("S SL", "S", stop=shortStop, when=since_shortEntry > 0)

/////////////// Plotting ///////////////
p1 = plot(sslDown, linewidth = 1, color=color.red, title="SSL down")
p2 = plot(sslUp, linewidth = 1, color=color.lime, title="SSL up")
fill(p1, p2,  color = not isMoving() ? color.white : sslDown < sslUp ? color.lime : color.red, transp=80)
plot(xLG1r, color=color.lime, title="LG1r")
plot(xLG1s, color=color.red, title="LG1s")
plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=1)
plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=1)
bgcolor(long ? color.green : short ? color.red : not isMoving() ? color.white : na, transp=80)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)

더 많은