
Chiến lược này sử dụng khoảng trung bình hai EMA để đánh giá xu hướng đa luồng của chỉ số OBV, theo hướng xu hướng. Trong đó, chỉ số OBV có thể phản ánh rõ ràng hơn mối quan hệ giữa giá và khối lượng giao dịch, đánh giá ý chí của người tham gia thị trường, do đó 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 với xử lý trơn tru chỉ số của đường trung bình di chuyển, có thể loại bỏ tiếng ồn thị trường một cách hiệu quả và nắm bắt xu hướng chính.
Chiến lược này chủ yếu dựa trên chỉ số OBV có xu hướng tăng hay không để đánh giá thời gian đầu vào nhiều đầu. Cụ thể, tính toán EMA 6 ngày và EMA 24 ngày của OBV, tạo ra tín hiệu nhiều đầu khi vượt qua EMA 24 ngày trên EMA 6 ngày. Tương tự, tạo ra tín hiệu đầu trống khi vượt qua EMA 24 ngày dưới EMA 6 ngày. Ngoài ra, chiến lược cũng đặt mức dừng lỗ 3%.
Điều quan trọng trong việc đánh giá xu hướng của chiến lược này là các chỉ số OBV. Các chỉ số OBV thể hiện ý chí tập thể của các quỹ lớn, có thể phản ánh hiệu quả thái độ của người tham gia thị trường. Kết hợp với xử lý moving average, có thể loại bỏ một số tiếng ồn, làm cho tín hiệu rõ ràng hơn và đáng tin cậy hơn. Chiến lược sử dụng đường EMA nhanh và đường EMA chậm để xây dựng tín hiệu giao dịch, có thể làm mịn dữ liệu giá cả, đồng thời có thể nắm bắt sự thay đổi xu hướng một cách nhạy cảm hơn.
Chiến lược này có một số lợi thế:
Chỉ số OBV dựa trên khối lượng giao dịch có thể đánh giá rõ ràng ý định của người tham gia thị trường, tín hiệu đáng tin cậy hơn.
Phương pháp xử lý đồng nhất EMA kép có thể loại bỏ một phần tiếng ồn, làm cho tín hiệu rõ ràng hơn.
Sử dụng kết hợp đường EMA nhanh chậm có thể đồng thời làm mịn giá và bắt được xu hướng thay đổi.
Chiến lược hoạt động đơn giản và dễ thực hiện.
Chiến lược này cũng có một số rủi ro:
Chỉ số OBV có thể phát ra tín hiệu sai khi chiến lược có thể thua lỗ.
Trong trường hợp khắc nghiệt, EMA có thể bị chậm trễ và bỏ lỡ các điểm đến tối ưu.
Cài đặt dừng lỗ cố định có thể quá cứng nhắc và không thể thích ứng với sự thay đổi của thị trường.
Phản ứng:
Kết hợp với các chỉ số khác để xác nhận và tránh các tín hiệu sai.
Thiết lập tham số tối ưu hóa để làm cho đường EMA nhạy hơn.
Thiết lập dừng động.
Chiến lược này có thể được tối ưu hóa theo các hướng sau:
Tối ưu hóa các tham số EMA để tìm các tham số đường trung bình phù hợp hơn.
Thêm các chỉ số khác để xác nhận tín hiệu, chẳng hạn như MACD, RSI, v.v. để tăng độ chính xác tín hiệu.
Thiết lập dừng động, có thể điều chỉnh điểm dừng theo biến động thị trường trong thời gian thực.
Tối ưu hóa các tham số để tìm các tham số tốt nhất.
Chiến lược này nói chung là một chiến lược theo dõi xu hướng đơn giản và đáng tin cậy hơn. Nó kết hợp các chỉ số OBV và đường thẳng hai EMA để thực hiện phán đoán về xu hướng. Ưu điểm là hoạt động đơn giản, tín hiệu rõ ràng, có thể theo dõi xu hướng một cách hiệu quả; Nhược điểm là có thể có tín hiệu sai và xử lý đường EMA bị chậm trễ.
/*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)