부피 비율에 기초한 전략을 따르는 경향

저자:차오장, 날짜: 2023-09-14 19:53:55
태그:

이 문서에서는 볼륨 비율 분석을 기반으로 한 양적 추세에 따른 전략을 상세히 설명합니다. 올림 및 하림 볼륨의 이동 평균을 계산하여 구매 및 판매 신호를 생성합니다.

I. 전략 논리

이 전략의 핵심 지표는 상승률과 하락률입니다. 구체적인 계산 단계는 다음과 같습니다.

  1. 일일 총 부피를 계산합니다.

  2. 일간 바가 닫히면 볼 볼륨으로 표기하고, 닫히면 베어 볼륨으로 표기합니다.

  3. 황소와 곰 양을 분리하여 이동 평균을 계산합니다.

  4. 구매 신호는 황소 매출액의 MA가 곰 매출액의 MA를 넘어서면 생성되며 그 반대의 경우입니다.

  5. 가격 변화 지표도 필터로 사용되며 명확한 추세가 존재하는 경우에만 거래를합니다.

  6. 손해를 멈추고 수익을 취하기 위해 신호를 기반으로 수익을 설정합니다.

부피 비율을 통해 트렌드 방향을 판단하고 가격 변화율로 필터링함으로써 신호 품질을 향상시킬 수 있습니다. 중지 손실 및 수익은 거래 당 제어 가능한 이익과 손실을 보장합니다.

II. 전략의 장점

이 전략의 가장 큰 장점은 트렌드 방향을 결정하기 위해 볼륨을 사용하는 것입니다. 이는 가장 기본적인 트렌드 추후 방법 중 하나입니다. 볼륨은 시장 참여자의 행동을 반영합니다.

또한, 부피 지표는 비교적 민감하기 때문에 초기 브레이크업 신호를 반영 할 수 있습니다. 가격 지표만을 사용하는 것과 비교하면 트렌드 반전을 더 일찍 파악 할 수 있습니다.

마지막으로, 가격 변화율에 따른 필터링은 또한 신호 품질을 향상시킵니다.

III. 잠재적 위험

이 전략은 장점을 가지고 있지만, 라이브 거래에서 다음과 같은 위험을 고려해야 합니다.

첫째, 부피 지표의 매개 변수는 잘못된 신호를 피하기 위해 신중하게 설정되어야 합니다.

둘째, 하나의 지표에만 의존하는 것은 가격 무효화에 민감하게 작용합니다. 다른 지표가 확인을 위해 결합되어야합니다.

마지막으로, 너무 가까운 스톱 로스를 설정하면 조기에 중단될 위험이 있습니다.

IV. 요약

요약하자면,이 기사는 트렌드를 결정하기 위해 볼륨 비율을 사용하는 양적 전략을 설명했습니다. 상승 및 하락 볼륨의 이동 평균을 계산하여 거래 신호를 생성합니다. 전략은 일정 수준의 리드 및 민감성을 가지고 있지만 검증을 위해 다른 지표와 결합해야합니다. 또한 적절한 매개 변수 조정 및 신중한 돈 관리도 실행 가능성의 핵심입니다. 전반적으로 트렌드 분석에 볼륨을 사용하는 독특한 접근 방식을 제공하지만 추가 개선이 필요합니다.


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

//@version=4
// Based on Volume Flow v3 indicator by oh92
strategy("Volume Flow BF", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
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
    
maType =    input(title="Moving Average Type", options=["Simple", "Exponential", "Double Exponential"], defval="Simple")
length =    input(6, title="MA Length")
x      =    input(3.1, title="Factor For Breakout Candle")

// Basic Volume Calcs //
vol  =  volume
bull =  close>open?vol:0 
bear =  open>close?vol:0

// Double EMA Function //
dema(src, len) => (2 * ema(src, len) - ema(ema(src, len), len))

// BULL Moving Average Calculation
bullma = maType == "Exponential" ?        ema(bull, length) :
         maType == "Double Exponential" ? dema(bull, length) :
         sma(bull, length)

// BEAR Moving Average Calculation //
bearma = maType == "Exponential" ?        ema(bear, length) :
         maType == "Double Exponential" ? dema(bear, length) :
         sma(bear, length)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(12, minval=1)
pcntChange = input(2, 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 = bullma > bearma and isMoving()
short = bullma < bearma 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])
sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(900.0, title='Take Profit %') / 100 
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp) 

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

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("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("Short Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
    
///////////// Plotting /////////////
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) 
plot(bullma, color=color.lime, linewidth=1, transp=0, title="Bull MA", transp=10)
plot(bearma, color=color.red, linewidth=1, transp=0, title="Bear MA", transp=10)

더 많은