나선형 상향 돌파 이동 평균 전략


생성 날짜: 2024-01-15 11:45:23 마지막으로 수정됨: 2024-01-15 11:45:23
복사: 0 클릭수: 540
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

나선형 상향 돌파 이동 평균 전략

개요

이 전략은 스피럴 채널 지표와 격차 비율 지표를 통합하여 가격이 상궤도선과 평균선을 돌파할 때 구매 신호를 생성한다. 마찬가지로, 가격이 상궤도선과 평균선을 돌파할 때 판매 신호를 생성한다. 이 전략은 스피럴 채널을 통해 가격의 추세 방향을 판단하고 격차 비율 지표를 사용하여 가격 동력을 검출하여 두 지표가 동시에 확인되는 것을 기반으로 거래 신호를 생성하여 더 나은 승률을 얻는다.

전략 원칙

이 전략은 크게 두 가지 지표에 기반을 두고 있습니다.

  1. 스피럴 채널 (Spiral Channels): 상하 궤도선을 계산하여 가격의 트렌드 방향을 판단한다. 가격이 상하 궤도를 돌파할 때 상승하고, 하하 궤도를 돌파할 때 하락한다.

  2. 격차 비율 지표 ((ROC): 가격 가속성이 있는지 검출하여 가격 동력을 판단한다. ROC가 어떤 긍정적 인 값보다 크면 가격이 상승 가속도를 나타내고, 어떤 부정적인 값보다 작으면 가격이 하락 가속도를 나타냅니다.

스피럴 채널과 격차율 지표가 동시에 멀티 헤드 신호를 발산할 때 구매 신호가 발생한다. 즉, 가격은 동시에 경로를 돌파하고 상승 가속도의 징후를 보여준다. 판매 신호를 생성하는 논리도 비슷하다.

이러한 조합은 신호의 신뢰성을 높이고, 명확한 추세가 없는 경우에 맹목적으로 거래하는 것을 피할 수 있다.

전략적 이점

  1. 가격 추세와 동력을 종합적으로 판단하여, 신호는 신뢰성이 높고, 승률이 높다.

  2. 매개 변수 최적화를 통해 전략의 거래 빈도를 조정할 수 있다. 예를 들어, 격차율 지표의 매개 변수를 조정하여 포지션 개설의 민감도를 제어한다.

  3. 단편 손실을 제어하기 위해 스톱 손실을 사용합니다. 파라미터는 사용자 정의 할 수 있습니다.

  4. 재입학은 수익성을 높이기 위해 트렌드를 추적할 수 있습니다.

전략적 위험

  1. 이 경우, 거래의 일부 기회를 놓칠 수 있고, 수익성이 제한될 수 있습니다.

  2. 파격적인 전략은 감금되기 쉽다. 가격이 반전되면 큰 손실이 발생할 수 있다.

  3. 잘못된 매개 변수 설정으로 거래 신호가 너무 자주 또는 희박하게 발생할 수 있습니다.

  4. 고정 비율의 정지 손실은 더 큰 단독 손실의 발생을 완전히 피할 수 없습니다.

전략 최적화 방향

  1. 격차 비율 지표의 파라미터를 테스트하여 최적의 파라미터 조합을 찾습니다.

  2. 다양한 스톱로스 레벨을 테스트하고, 승패율과 승률을 균형을 잡는다.

  3. 다른 지표 필터를 추가하여 신호 품질을 향상시킵니다.

  4. 다양한 시장을 테스트하여 이 전략에 가장 적합한 품종을 찾아보세요.

  5. 전략의 최적화 포지션 관리, 다른 시장 조건에 따라 다른 포지션을 사용한다.

요약하다

이 전략은 스피럴 채널과 격차 비율 지표를 통합하여 가격의 추세와 동력을 판단하고 거래 신호의 질을 보장하면서 재입장 및 변수 최적화를 통해 수익을 유지하는 능력을 갖추고 있습니다. 고정된 비율의 스톱 로스를 기반으로 한 위험 관리가 추가로 최적화 될 수 있습니다.

전략 소스 코드
/*backtest
start: 2024-01-07 00:00:00
end: 2024-01-14 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SSL Chaikin BF 🚀", overlay=true, precision=2, 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

/////////////// Chaikin MF /////////////// 
_1 = input(false,  "═══════ Chaikin MF ═══════")
length = input(20, minval=1, title = "Chaikin SMA Length")
upperThreshold = input(0.04, step=0.01, title="Upper Threshold")
lowerThreshold = input(0.02, step=0.01, title="Lower Threshold")
ad = close==high and close==low or high==low ? 0 : ((2*close-low-high)/(high-low))*volume
mf = sum(ad, length) / sum(volume, length)

/////////////// SSL Channels /////////////// 
_2 = 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

///////////// Rate Of Change ///////////// 
_3 = input(false,  "══════ Rate of Change ══════")
source = close
roclength = input(13, "ROC Length",  minval=1)
pcntChange = input(4, "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))

///////////////  Strategy  /////////////// 
long = sslUp > sslDown and isMoving() or crossover(mf, upperThreshold)
short = sslUp < sslDown and isMoving() or crossunder(mf, lowerThreshold)

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]) 

//////////////// Stop loss /////////////// 
_4 = input(false,  "════════ Stop Loss ═══════")
sl_inp = input(2.0, title='Stop Loss %') / 100

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

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

/////////////// Plotting /////////////// 
p1 = plot(sslDown, linewidth = 1, color=color.red)
p2 = plot(sslUp, linewidth = 1, color=color.lime)
fill(p1, p2,  color = sslDown < sslUp ? color.lime : color.red, transp=80)
bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(crossover(mf, upperThreshold) ? color.blue : crossunder(mf, lowerThreshold) ? color.orange : na, transp=30)