Chiến lược này đánh giá việc chuyển đổi chu kỳ tăng và giảm bằng cách tính toán tỷ lệ thay đổi thay đổi khối lượng, thuộc về các chiến lược chênh lệch khối lượng-giá. Nó kết hợp chỉ số động lực của khối lượng và Bollinger Bands của giá để xác định ảnh hưởng hàng đầu của thay đổi khối lượng đối với giá và nắm bắt các điểm chuyển đổi của xu hướng.
Tính toán tỷ lệ thay đổi thay đổi khối lượng (tỷ lệ thay đổi chỉ số chênh lệch khối lượng), để có được kết quả chỉ số dựa trên động lượng khối lượng.
Tính toán Bollinger Bands của n kết quả để có được bbr đại diện cho độ lệch chuẩn của động lượng khối lượng.
Tính toán Bollinger Bands của giá đóng để có được bbr1 đại diện cho độ lệch chuẩn của giá.
Tính toán sự khác biệt hist giữa hai, đó là độ lệch chuẩn của động lượng khối lượng trừ đi độ lệch chuẩn của giá, như chỉ số cuối cùng.
Khi hist vượt trên 0, đó là tín hiệu nhập ngắn, và khi vượt dưới 0, đó là tín hiệu nhập dài.
Khi khối lượng đảo ngược trong khi giá chưa đảo ngược, hist sẽ vượt qua trên hoặc dưới 0, tạo ra các tín hiệu giao dịch. Nó có thể dự đoán các bước ngoặt của xu hướng giá trước.
Chiến lược này là một chiến lược chênh lệch giá khối lượng dựa trên tỷ lệ thay đổi khối lượng, có thể phản ánh các điểm chuyển đổi của xu hướng giá trước.
Tính toán tỷ lệ thay đổi thay đổi khối lượng khuếch đại tác động hàng đầu của thay đổi khối lượng đối với giá, dẫn đến hiệu suất giao dịch tốt hơn.
Kết hợp các chỉ số động lượng khối lượng với Bollinger Bands của giá làm cho tín hiệu giao dịch đáng tin cậy hơn.
Sử dụng trượt hàm số ba trên dữ liệu Hist làm cho tín hiệu chính xác và mượt mà hơn.
Thiết lập các dòng mua quá mức / bán quá mức và lệnh dừng lỗ dài / ngắn / lấy lợi nhuận giúp kiểm soát rủi ro một cách hiệu quả.
Nhiều thông số có thể tùy chỉnh như chiều dài Bollinger Bands, nhân độ lệch chuẩn và các yếu tố làm mịn Hist cho phép tối ưu hóa chiến lược.
Dữ liệu khối lượng có thể không phản ánh thực sự giao dịch thị trường và có thể bị thao túng.
Sự khác biệt giá khối lượng có thể không tồn tại và giá có thể phá vỡ mà không đảo ngược.
Cài đặt tham số không chính xác có thể gây ra giao dịch quá mức hoặc tín hiệu không chính xác.
Cẩn thận với tín hiệu sai từ dữ liệu âm lượng bất thường.
Các tín hiệu đảo ngược nên được tránh khi xu hướng mạnh.
Các rủi ro có thể được giảm thiểu bằng cách tối ưu hóa các tham số, thêm các bộ lọc khác và thiết lập dừng lỗ / lấy lợi nhuận.
Tối ưu hóa các thông số Bollinger Bands cho các tín hiệu ổn định hơn.
Thêm bộ lọc xu hướng để tránh giao dịch chống lại xu hướng.
Bao gồm các chỉ số khác như MACD để xác nhận tín hiệu.
Sử dụng AI để tự động tối ưu hóa các thông số thích nghi.
Thêm stop loss / take profit năng động để tối ưu hóa quản lý rủi ro.
Áp dụng máy học để xác định tỷ lệ thành công của sự khác biệt khối lượng-giá cho chất lượng tín hiệu cao hơn.
Chiến lược này khuếch đại tác động dẫn đầu của thay đổi khối lượng trên giá bằng cách tính toán tỷ lệ thay đổi khối lượng, cho phép phát hiện sớm các điểm chuyển hướng xu hướng. So với chỉ số khối lượng duy nhất, nó có độ tin cậy và độ chính xác cao hơn. Nhưng các rủi ro như thao túng khối lượng và đột phá chênh lệch nên được phòng ngừa thông qua tối ưu hóa tham số, bộ lọc chỉ số vv. Trong tương lai, AI có thể được tận dụng để tối ưu hóa tham số thích nghi để cải thiện thêm sự ổn định và lợi nhuận của chiến lược.
/*backtest start: 2022-10-23 00:00:00 end: 2023-10-29 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © tathal and special thanks to oakwhiz for his porting of my custom volume indicator //@version=5 strategy('Volume Difference Delta Cycle Oscillator', 'VDDC Osc', default_qty_type=strategy.percent_of_equity, default_qty_value=100, max_bars_back=5000) startDate = input.int(title='Start Date', defval=1, minval=1, maxval=31) startMonth = input.int(title='Start Month', defval=1, minval=1, maxval=12) startYear = input.int(title='Start Year', defval=2010, minval=1800, maxval=2100) endDate = input.int(title='End Date', defval=31, minval=1, maxval=31) endMonth = input.int(title='End Month', defval=12, minval=1, maxval=12) endYear = input.int(title='End Year', defval=2021, minval=1800, maxval=2100) // Normalize Function normalize(_src, _min, _max) => // Normalizes series with unknown min/max using historical min/max. // _src : series to rescale. // _min, _min: min/max values of rescaled series. var _historicMin = 10e10 var _historicMax = -10e10 _historicMin := math.min(nz(_src, _historicMin), _historicMin) _historicMax := math.max(nz(_src, _historicMax), _historicMax) _min + (_max - _min) * (_src - _historicMin) / math.max(_historicMax - _historicMin, 10e-10) // STEP 2: // Look if the close time of the current bar // falls inside the date range inDateRange = true // Stop loss & Take Profit Section l_sl_inp = input(2.0, title='Long Stop Loss %') / 100 l_tp_inp = input(4.0, title='Long Take Profit %') / 100 l_stop_level = strategy.position_avg_price * (1 - l_sl_inp) l_take_level = strategy.position_avg_price * (1 + l_tp_inp) s_sl_inp = input(2.0, title='Short Stop Loss %') / 100 s_tp_inp = input(4.0, title='Short Take Profit %') / 100 s_stop_level = strategy.position_avg_price * (1 + s_sl_inp) s_take_level = strategy.position_avg_price * (1 - s_tp_inp) src = close // Volume Differnce Indicator Delta float change_src = ta.change(src) float i_obv = ta.cum(change_src > 0 ? volume : change_src < 0 ? -volume : 0 * volume) float i_pvt = ta.pvt float result = ta.change(i_obv - i_pvt) float nresult = ta.ema(normalize(result, -1, 1), 20) // Volume Differnce Indicator Delta %B length = input.int(20, minval=1, title='Volume Bands Length') mult = input.float(2.0, minval=0.001, maxval=50, title='Volume Bands StdDev') basis = ta.ema(nresult, length) dev = mult * ta.stdev(nresult, length) upper = basis + dev lower = basis - dev bbr = (nresult - lower) / (upper - lower) // Normal %B, Based on close l1 = input.int(20, minval=1, title='Bollinger Bands Length') src2 = close mult1 = input.float(2.0, minval=0.001, maxval=50, title='Bollinger Bands StdDev') basis1 = ta.sma(src2, l1) dev1 = mult1 * ta.stdev(src2, l1) upper1 = basis1 + dev1 lower1 = basis1 - dev1 bbr1 = (src - lower1) / (upper1 - lower1) /// Final Output Line hist = ta.ema(ta.ema(ta.ema(bbr1 - bbr, input(2, title='Hist Smoothing Factor #1')), input(2, title='Hist Smoothing Factor #2')), input(2, title='Hist Smoothing Factor #3')) /// Overbought / Oversold Line Creation oversold = input(-.1) overbought = input(.4) hline(oversold, linewidth=2, color=color.new(#81c784, 62)) hline(overbought, linewidth=2, color=color.new(#c2185b, 38)) /// Long & Short Conditions short = hist > overbought long = hist < oversold /// Colors & Plotting histColor = hist >= 0 ? hist[1] < hist ? #26A69A : #B2DFDB : hist[1] < hist ? #FFCDD2 : #EF5350 plot(hist, title='Histogram', style=plot.style_columns, color=color.new(histColor, 0)) CrossBgColor = long ? color.new(#81c784, 62) : short ? color.new(#c2185b, 38) : na bgcolor(color.new(CrossBgColor, 90)) /// Strategy Methodology if inDateRange strategy.entry('long', strategy.long, when=long, stop=l_stop_level, limit=l_take_level) if inDateRange and strategy.position_size > 0 strategy.close_all(when=short) if inDateRange strategy.entry('short', strategy.short, when=short, stop=s_stop_level, limit=s_take_level) if inDateRange and strategy.position_size < 0 strategy.close_all(when=long)