중앙 중력 채널 추세 추종 전략


생성 날짜: 2023-09-19 21:30:23 마지막으로 수정됨: 2023-09-19 21:30:23
복사: 0 클릭수: 747
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 중력 중심 지표와 SSL 통로 지표를 결합하여 가격 트렌드의 판단과 돌파구 추적을 구현하며, 트렌드 추적 유형 전략에 속한다. 동시에 동적 ATR 상실을 결합하여 위험을 제어한다.

전략 원칙

  1. 컴퓨팅 센터 중력 지표, 상반도와 하반도는 각각 가격 상승과 하락의 트렌드 경계이다.

  2. SSL 통로 지표를 계산합니다. 통로의 내부는 평형 영역이고 통로의 외부는 경향 방향입니다.

  3. 가격이 상궤 또는 통로를 뚫을 때 상승 추세로 판단하고 더 많은 것을 한다. 가격이 하궤 또는 통로를 뚫을 때 하향 추세로 판단하고 더 많은 것을 한다.

  4. 포지션을 보유할 때 동적 ATR 스톱로스를 사용하여 스톱로스를 추적하여 손실이 확대되는 것을 피하십시오.

  5. 실제 거래 신호를 생성하기 위해 재검토 기간을 결합합니다.

이 전략은 동시에 두 개의 지표를 사용하여 트렌드 방향을 판단합니다. 하나는 돌파구를 판단하기 위해, 하나는 트렌드를 확인하기 위해 사용되며, 두 가지의 조합은 판단 정확도를 향상시킬 수 있습니다. 동적 스톱은 시장의 변동 정도에 따라 스톱 위치를 조정할 수 있으며, 매우 실용적인 위험 제어 수단입니다.

우위 분석

  1. 두 가지 지표의 동시적 추세를 이용하면 정확도를 높일 수 있다.

  2. 중심 중력 지표는 트렌드 변화에 민감하고, SSL 통로는 트렌드 방향을 판단 cleared。

  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)