Xu hướng theo chiến lược dựa trên tỷ lệ khối lượng

Tác giả:ChaoZhang, Ngày: 2023-09-14 19:53:55
Tags:

Bài viết này giải thích chi tiết một xu hướng định lượng theo chiến lược dựa trên phân tích tỷ lệ khối lượng. Nó tạo ra tín hiệu mua và bán bằng cách tính toán trung bình động của khối lượng tăng và giảm.

I. Chiến lược logic

Chỉ số cốt lõi của chiến lược này là khối lượng tăng và giảm.

  1. Tính toán tổng khối lượng hàng ngày.

  2. Nhãn khối lượng như khối lượng bò khi thanh hàng ngày đóng lại, và khối lượng gấu khi đóng xuống.

  3. Tính toán trung bình động riêng biệt cho khối lượng bò và gấu.

  4. Một tín hiệu mua được tạo ra khi MA khối lượng tăng vượt qua MA khối lượng giảm, và ngược lại.

  5. Chỉ số tỷ lệ thay đổi giá cũng được sử dụng như một bộ lọc, chỉ thực hiện giao dịch khi có xu hướng rõ ràng.

  6. Thiết lập dừng lỗ và lấy lợi nhuận dựa trên các tín hiệu để khóa lợi nhuận.

Bằng cách đánh giá hướng xu hướng thông qua tỷ lệ khối lượng, và lọc với tỷ lệ thay đổi giá, chất lượng tín hiệu có thể được cải thiện.

II. Lợi thế của Chiến lược

Ưu điểm lớn nhất của chiến lược này là sử dụng khối lượng để xác định hướng xu hướng, đó là một trong những phương pháp theo xu hướng cơ bản nhất.

Ngoài ra, các chỉ số khối lượng có thể phản ánh sớm các tín hiệu đột phá, tương đối nhạy cảm.

Cuối cùng, lọc theo tỷ lệ thay đổi giá cũng cải thiện chất lượng tín hiệu.

III. Các rủi ro tiềm ẩn

Mặc dù chiến lược có lợi thế, các rủi ro sau đây nên được xem xét cho giao dịch trực tiếp:

Thứ nhất, các tham số cho các chỉ số khối lượng cần phải được thiết lập một cách thận trọng để tránh các tín hiệu sai.

Thứ hai, dựa vào một chỉ số duy nhất làm cho nó dễ bị vô hiệu hóa giá.

Cuối cùng, dừng lỗ đặt quá gần có nguy cơ dừng lại sớm.

IV. Tóm tắt

Tóm lại, bài viết này đã giải thích một chiến lược định lượng bằng cách sử dụng tỷ lệ khối lượng để xác định xu hướng. Nó tạo ra tín hiệu giao dịch bằng cách tính toán trung bình động của khối lượng tăng và giảm. Chiến lược có một mức độ dẫn và nhạy cảm nhất định, nhưng cần được kết hợp với các chỉ số khác để xác minh. Ngoài ra, điều chỉnh tham số đúng và quản lý tiền bạc thận trọng cũng là chìa khóa cho khả năng tồn tại của nó. Nhìn chung, nó cung cấp một cách tiếp cận độc đáo sử dụng khối lượng để phân tích xu hướng, nhưng đòi hỏi phải cải thiện thêm.


/*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)

Thêm nữa