OBV EMA Crossover Trend Theo chiến lược

Tác giả:ChaoZhang, Ngày: 2024-02-20 15:35:08
Tags:

img

Tổng quan

Chiến lược này sử dụng sự chéo chéo của hai đường EMA của chỉ số OBV để xác định xu hướng của OBV, và có các vị trí dài / ngắn theo hướng xu hướng. Chỉ số OBV có thể phản ánh mối quan hệ giữa giá và khối lượng rõ ràng hơn và đánh giá ý định của những người tham gia thị trường, vì vậy nó có thể được sử dụng để nắm bắt xu hướng thị trường. Chiến lược này kết hợp sự làm mịn của chỉ số của đường trung bình động, có thể lọc hiệu quả tiếng ồn thị trường và nắm bắt xu hướng chính.

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

Chiến lược này chủ yếu sử dụng liệu OBV có đang trong xu hướng tăng để xác định thời gian nhập cảnh dài. Cụ thể, nó tính toán EMA 6 ngày và EMA 24 ngày của OBV. Khi EMA 6 ngày vượt qua EMA 24 ngày, một tín hiệu dài được tạo ra. Tương tự, khi EMA 6 ngày vượt qua dưới EMA 24 ngày, một tín hiệu ngắn được tạo ra. Ngoài ra, chiến lược cũng đặt mức dừng lỗ 3%.

Chìa khóa để đánh giá xu hướng của chiến lược nằm trong chỉ số OBV. Chỉ số OBV phản ánh ý định tập thể của tiền lớn và có thể phản ánh hiệu quả thái độ của những người tham gia thị trường. Kết hợp với xử lý đường trung bình động, một số tiếng ồn có thể được lọc ra để làm cho tín hiệu rõ ràng và đáng tin cậy hơn. Chiến lược sử dụng các đường EMA nhanh và đường EMA chậm để xây dựng các tín hiệu giao dịch, có thể làm mịn dữ liệu giá và cũng nắm bắt sự thay đổi xu hướng một cách nhạy cảm hơn.

Phân tích lợi thế

Chiến lược có những lợi thế sau:

  1. Chỉ số OBV dựa trên khối lượng giao dịch có thể đánh giá rõ ý định của những người tham gia thị trường, và tín hiệu đáng tin cậy hơn.

  2. Việc xử lý đường EMA kép có thể lọc ra một số tiếng ồn để làm cho tín hiệu rõ ràng hơn.

  3. Sự kết hợp giữa các đường EMA nhanh và chậm có thể tính đến cả việc làm mịn mượt giá và nắm bắt các thay đổi xu hướng.

  4. Hoạt động chiến lược đơn giản và dễ thực hiện.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Chỉ số OBV có thể phát ra các tín hiệu sai ở một thời điểm nào đó, khi đó chiến lược có thể bị tổn thất.

  2. Trong giao dịch bạo lực, đường EMA có hiệu ứng chậm, có thể bỏ lỡ điểm nhập khẩu tối ưu.

  3. Cài đặt dừng lỗ cố định có thể quá cứng nhắc để thích nghi với những thay đổi của thị trường.

Các biện pháp đối phó:

  1. Xác nhận với các chỉ số khác để tránh tín hiệu sai.

  2. Tối ưu hóa cài đặt tham số để làm cho đường EMA nhạy cảm hơn.

  3. Thiết lập stop loss động.

Hướng tối ưu hóa

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Tối ưu hóa sự kết hợp các tham số EMA để tìm các tham số trung bình động phù hợp hơn.

  2. Tăng các chỉ số khác để xác nhận tín hiệu, chẳng hạn như MACD, RSI, vv, để cải thiện độ chính xác tín hiệu.

  3. Thiết lập stop loss động, có thể điều chỉnh điểm stop loss trong thời gian thực theo biến động thị trường.

  4. Tối ưu hóa kết hợp tham số để tìm kết hợp tham số tốt nhất.

Kết luận

Nói chung, chiến lược này là một chiến lược theo xu hướng tương đối đơn giản và đáng tin cậy. Nó kết hợp chỉ số OBV và đường EMA kép để đánh giá xu hướng. Những lợi thế là hoạt động đơn giản, tín hiệu rõ ràng và khả năng theo dõi xu hướng hiệu quả. Những nhược điểm là có thể có tín hiệu sai và chậm xử lý đường EMA. Tối ưu hóa với các chỉ số khác có thể đạt được kết quả tốt hơn.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("OBV EMA X 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

/////////////// OBV /////////////// 
src = close
atr = atr(input(title="ATR Period", defval=3, minval=1))
atrmult = input(title="ATR Mult", defval=1, minval=0)
obv = cum(change(src) > 0 ? volume * (volume / atr) : change(src) < 0 ? -volume * (volume / atr) : 0 * volume / atr)
e1 = ema(obv, input(24))
e2 = ema(obv, input(6))

///////////////  Strategy  /////////////// 
long = crossover(e2, e1)
short = crossunder(e2, e1)

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 /////////////// 
sl_inp = input(3.0, title='Stop Loss %') / 100
tp_inp = input(5000.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)

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 /////////////// 
plot(e1, color = e1 > e1[1] ? color.lime : e1 < e1[1] ? color.red : color.white, linewidth = 2, offset = 0)
plot(e2, color = e2 > e2[1] ? color.lime : e2 < e2[1] ? color.red : color.white, linewidth = 1)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)

Thêm nữa