Chiến lược thịnh hành dựa trên tỷ lệ khối lượng


Ngày tạo: 2023-09-14 19:53:55 sửa đổi lần cuối: 2023-09-14 19:53:55
sao chép: 3 Số nhấp chuột: 713
1
tập trung vào
1617
Người theo dõi

Bài viết này sẽ giới thiệu chi tiết về một chiến lược định lượng dựa trên tỷ lệ giao dịch để xác định xu hướng. Chiến lược này tạo ra tín hiệu mua và bán bằng cách tính toán đường trung bình giao dịch không gian.

A. Nguyên tắc chiến lược

Chỉ số trung tâm của chiến lược là lượng giao dịch không gian. Các bước tính toán cụ thể như sau:

  1. Tính toán khối lượng giao dịch trong ngày (Volume)

  2. Nếu K là đa đầu, thì giao dịch được ghi là Bull Volume.

  3. Khi K là đầu trống, giao dịch sẽ được ghi là giao dịch trên mặt trống (Bear Volume).

  4. Tính trung bình chuyển động của giao dịch đa phương và không phương.

  5. Một tín hiệu mua được tạo ra khi một số phương tiện di chuyển trên đường trung bình di chuyển trên đường trung bình di chuyển trên đường trung bình di chuyển; ngược lại, một tín hiệu bán được tạo ra.

  6. Nó cũng có thể được lọc thông qua các chỉ số về tỷ lệ thay đổi giá, và chỉ giao dịch khi có xu hướng rõ ràng về giá.

  7. Cài đặt điểm dừng lỗ theo tín hiệu để khóa lợi nhuận.

Bằng cách này, định hướng xu hướng bằng tỷ lệ trống của khối lượng giao dịch, sau đó hỗ trợ lọc bằng chỉ số tỷ lệ thay đổi giá, có thể cải thiện chất lượng tín hiệu. Thiết lập dừng lỗ cũng giúp mỗi giao dịch có thể kiểm soát được.

2 - Lợi thế chiến lược

Lợi thế lớn nhất của chiến lược này là sử dụng khối lượng giao dịch để xác định xu hướng, đây là một trong những phương pháp xác định xu hướng cơ bản nhất. khối lượng giao dịch có thể phản ánh hành vi của người tham gia thị trường.

Ngoài ra, chỉ số khối lượng giao dịch cũng có thể phản ánh các tín hiệu đột phá trước, nhạy cảm hơn. So với chỉ số giá, nó có thể nắm bắt được sự thay đổi xu hướng sớm hơn.

Cuối cùng, việc lọc kết hợp với chỉ số biến động giá cũng cải thiện chất lượng tín hiệu.

Ba, rủi ro tiềm ẩn

Mặc dù chiến lược này có một số lợi thế, nhưng cũng có những rủi ro cần lưu ý trong môi trường thực tế:

Đầu tiên, hãy cẩn thận thiết lập các tham số chỉ số giao dịch để tránh các tín hiệu sai.

Thứ hai, chỉ dựa vào một chỉ số dễ bị phá vỡ bởi giá bị vô hiệu hóa.

Cuối cùng, thiết lập dừng lỗ quá gần có thể dẫn đến nguy cơ phá vỡ dừng lỗ.

Bốn nội dung, tóm tắt

Bài viết này mô tả chi tiết một chiến lược định lượng sử dụng xu hướng phán đoán tỷ lệ giao dịch. Nó có thể tạo ra tín hiệu giao dịch bằng cách tính toán đường trung bình giao dịch nhiều không. Chiến lược này có một số ưu tiên, nhưng cũng cần được xác minh với các chỉ số khác. Ngoài ra, thiết lập tham số thích hợp và quản lý tài chính nghiêm ngặt cũng là chìa khóa cho tính khả thi của nó.

Mã nguồn chiến lược
/*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)