Chỉ số giá khối lượng Chiến lược giao dịch cân bằng

Tác giả:ChaoZhang, Ngày: 2023-11-24 14:35:13
Tags:

img

Tổng quan

Chiến lược này là một chiến lược giao dịch chỉ số giá khối lượng nhiều khung thời gian. Nó sử dụng toàn diện chỉ số sức mạnh tương đối (RSI), phạm vi trung bình thực (ATR), trung bình di chuyển đơn giản (SMA) và điều kiện giá khối lượng tùy chỉnh để xác định các tín hiệu dài tiềm năng. Khi một số tín hiệu bán quá mức, chéo giá khối lượng, đột phá giá và các điều kiện nhập cảnh khác được đáp ứng, chiến lược này sẽ thiết lập các vị trí dài. Nó cũng thiết lập mức dừng lỗ và lấy lợi nhuận để kiểm soát tỷ lệ rủi ro-lợi nhuận cho mỗi giao dịch.

Chiến lược logic

Các điểm chính của chiến lược này là:

  1. Khi chỉ số RSI thấp hơn mức bán quá mức và vẫn bán quá mức trong 10 thanh gần đây, nó được coi là tín hiệu bán quá mức
  2. Nhiều tập hợp các điều kiện giá khối lượng được xác định, và tất cả các điều kiện này cần phải được đáp ứng cùng một lúc để kích hoạt tín hiệu giá khối lượng dài
  3. Khi giá đóng phá vỡ trên SMA 13 giai đoạn, nó được coi là tín hiệu phá vỡ giá
  4. Thời gian ATR nhỏ là thấp hơn so với thời gian ATR lớn cũng là một tín hiệu dài góp phần
  5. Chiến lược kết hợp tất cả các tín hiệu trên để đưa ra quyết định đầu tư dài cuối cùng

Cụ thể, chiến lược này thiết lập các thông số dài và quá bán cho chỉ số RSI và tính toán các giá trị RSI dựa trên các thông số này.

Ngoài ra, chiến lược xác định 3 ngưỡng khối lượng và thiết lập nhiều bộ điều kiện giá khối lượng dựa trên dữ liệu từ các khung thời gian khác nhau. Ví dụ, giá trị khối lượng của giai đoạn 90 lớn hơn 1,5 lần so với giai đoạn 49. Khi tất cả các điều kiện giá khối lượng này được đáp ứng cùng một lúc, chỉ số giá khối lượng tạo ra tín hiệu dài.

Về khía cạnh giá, chiến lược tính toán SMA 13 giai đoạn và đếm số thanh kể từ khi giá phá vỡ trên SMA. Khi giá phá vỡ trên SMA và số thanh sau khi phá vỡ ít hơn 5, nó được coi là tín hiệu phá vỡ giá.

Đối với các thông số thời gian ATR, chiến lược này chỉ định một khoảng thời gian nhỏ là 5 và một khoảng thời gian lớn là 14 cho ATR. Khi khoảng thời gian nhỏ ATR thấp hơn khoảng thời gian lớn ATR, nó báo hiệu rằng biến động thị trường đang tăng tốc giảm và góp phần vào tín hiệu dài.

Cuối cùng, chiến lược này tính đến tất cả các tiêu chí nhập cảnh trên, bao gồm các chỉ số bán quá mức, giá khối lượng, giá đột phá và ATR. Khi tất cả các điều kiện này được đáp ứng cùng một lúc, tín hiệu dài cuối cùng được kích hoạt và một vị trí dài được thiết lập.

Ưu điểm

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

  1. Bằng cách đánh giá nhiều bộ dữ liệu giá khối lượng trên các khung thời gian khác nhau thay vì chỉ một khung thời gian duy nhất, chiến lược có thể đánh giá sự tập trung của khối lượng giao dịch chính xác hơn.

  2. Cơ chế xác nhận ba lần bán quá mức + giá khối lượng + giá đột phá đảm bảo các tín hiệu đầu vào đáng tin cậy. Điều kiện bán quá mức cung cấp thời gian cơ bản cho các mục nhập, trong khi các xác nhận bổ sung từ chỉ số giá khối lượng và giá đảm bảo độ tin cậy của các tín hiệu dài.

  3. Cơ chế dừng lỗ và lấy lợi nhuận kiểm soát chặt chẽ rủi ro cho mỗi giao dịch. Các thông số dừng lỗ và lấy lợi nhuận có thể được điều chỉnh dựa trên sự thèm rủi ro cá nhân để tối đa hóa lợi nhuận trong khi kiểm soát rủi ro cho mỗi giao dịch một cách hợp lý.

  4. Tích hợp nhiều chỉ số làm tăng độ bền. Ngay cả khi một số chỉ số thất bại hoặc không hoạt động tốt, chiến lược vẫn có thể dựa vào các chỉ số khác để đánh giá và đảm bảo một mức độ phục hồi nhất định.

Rủi ro và biện pháp đối phó

Ngoài ra còn có một số rủi ro với chiến lược này:

  1. Rủi ro cấu hình tham số. Các thiết lập tham số của các chỉ số trực tiếp ảnh hưởng đến phán đoán, và các tham số không phù hợp có thể dẫn đến sự thiên vị trong tín hiệu giao dịch. Các giá trị tham số hợp lý cần được xác nhận cẩn thận.

  2. Tiềm năng lợi nhuận hạn chế: Là một chiến lược tích hợp nhiều chỉ số để đánh giá tập thể, các tín hiệu của nó có xu hướng bảo thủ hơn với tương đối ít giao dịch mỗi đơn vị thời gian, do đó tiềm năng lợi nhuận có một số hạn chế.

  3. Rủi ro chênh lệch chỉ số: Khi một số chỉ số đưa ra tín hiệu dài trong khi những chỉ số khác đưa ra tín hiệu ngắn, chiến lược không thể xác định quyết định tối ưu. Sự chênh lệch tiềm ẩn giữa các chỉ số cần được xác định và giải quyết trước.

Hướng dẫn tối ưu hóa

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

  1. Kết hợp các mô hình học máy để hỗ trợ phán đoán. Các mô hình có thể được đào tạo về các tính năng giá khối lượng và biến động để điều chỉnh năng động các tham số được xác định bằng tay.

  2. Cải thiện sự tinh vi của các chiến lược lấy lợi nhuận, chẳng hạn như dừng lấy lợi nhuận, lấy lợi nhuận một phần, v.v. để tăng thêm lợi nhuận cho mỗi giao dịch trong khi ngăn ngừa mất lợi nhuận.

  3. Đánh giá kết hợp dữ liệu sổ lệnh. Ngoài dữ liệu biểu đồ giá & khối lượng, dữ liệu sổ lệnh cũng tiết lộ thông tin phân phối thanh khoản sâu để cung cấp các tín hiệu tham chiếu bổ sung.

  4. Kết hợp thử nghiệm với các chỉ số khác. Chiến lược này chủ yếu sử dụng các chỉ số như RSI, ATR và SMA. Các chỉ số khác như Bollinger Bands và KDJ cũng có thể được kết hợp để đa dạng hóa và tối ưu hóa các nguồn tín hiệu giao dịch.

Kết luận

Chiến lược này sử dụng sự kết hợp của các chỉ số bao gồm RSI, ATR, SMA và các điều kiện giá khối lượng tùy chỉnh để xác định các cơ hội đầu vào dài tiềm năng. Nó có những lợi thế như đánh giá giá khối lượng nhiều khung thời gian, cơ chế xác nhận ba lần và kiểm soát rủi ro dừng lỗ / lấy lợi nhuận. Tuy nhiên, cũng cần lưu ý các rủi ro như cấu hình tham số, tiềm năng lợi nhuận hạn chế. Trong tương lai, chiến lược này có thể được tăng cường hơn nữa thông qua tăng cường học máy, thiết kế lấy lợi nhuận tinh vi hơn, kết hợp dữ liệu sổ đơn đặt hàng cũng như kết hợp chỉ số mở rộng.


/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © Kimply_Tr
//@version=5

// Strategy settings and parameters
strategy(title='Volume ValueWhen Velocity', overlay=true)

// Define the stop-loss and take-profit percentages for the long strategy
long_stoploss_value = input.float(defval=3, title='Stop-Loss (SL) %', minval=0, group='▶ Stop Loss/Take Profit => Long-Strategy', inline='2')
long_stoploss_percentage = close * (long_stoploss_value / 100) / syminfo.mintick  // Calculate long stop-loss percentage
long_takeprofit_value = input.float(defval=2, title='Take-Profit (TP) %', minval=0, group='▶ Stop Loss/Take Profit => Long-Strategy', inline='2')
long_takeprofit_percentage = close * (long_takeprofit_value / 100) / syminfo.mintick  // Calculate long take-profit percentage

// Define parameters related to ValueWhen occurrences
occurrence_ValueWhen_1 = input.int(title='occurrence_ValueWhen_1', defval=1, maxval=100, step=1, group="▶ ValueWhen",tooltip ="Its value must be smaller than (occurrence_ValueWhen_2)")  
occurrence_ValueWhen_2 = input.int(title='occurrence_ValueWhen_2', defval=5, maxval=100, step=1, group="▶ ValueWhen" ,tooltip="Its value must be greater than (occurrence_ValueWhen_1)")
distance_value=input.int(title='distance_value_occurrence', defval=170, maxval=5000, step=1, group="▶ ValueWhen" ,tooltip="It indicates the minimum distance between the occurrences of 1 and 2, i.e. the difference between the occurrences of 1 and 2 is greater than (distance_value_occurrence)")

// Define RSI-related parameters
rsi_over_sold = input.int(defval=60, minval=1, title='Oversold Level', group='▶ RSI',inline ='2')  // Input for oversold level in RSI
rsi_length = input.int(defval=40, minval=1, title='RSI Length', group='▶ RSI',inline ='2')  // Input for RSI length
rsi = ta.rsi(close, rsi_length)  // Calculate RSI

// Define volume thresholds
volume_threshold1 = input.float(title='volume_threshold_1', defval=0.5, maxval=10, step=0.1, group="▶ Volume")  
volume_threshold2 = input.float(title='volume_threshold_2', defval=0.4, maxval=10, step=0.1, group="▶ Volume")  
volume_threshold3 = input.float(title='volume_threshold_3', defval=0.62, maxval=10, step=0.1, group="▶ Volume")  

// ATR (Average True Range)
// Define ATR parameters
atr_small = input.int(title='ATR_Small', defval=5, maxval=500, step=1, group="▶ Atr",inline ='2') 
atr_big = input.int(title='ATR_Big ', defval=14, maxval=500, step=1, group="▶ Atr",inline ='2') 

atr_value3 = ta.atr(15)  // Calculate ATR value 3
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Date Range
// Define the date range for back-testing
start_date = input.int(title='Start Day', defval=1, minval=1, maxval=31, group='▶ Time-Period for Back-Testing', inline='1')  // Input for start day
end_date = input.int(title='until Day', defval=1, minval=1, maxval=31, group='▶ Time-Period for Back-Testing', inline='1')  // Input for end day
start_month = input.int(title='Start Month', defval=7, minval=1, maxval=12, group='▶ Time-Period for Back-Testing', inline='2')  // Input for start month
end_month = input.int(title='until Month', defval=1, minval=1, maxval=12, group='▶ Time-Period for Back-Testing', inline='2')  // Input for end month
start_year = input.int(title='Start Year', defval=2022, minval=1800, maxval=3000, group='▶ Time-Period for Back-Testing', inline='3')  // Input for start year
end_year = input.int(title='until Year', defval=2077, minval=1800, maxval=3000, group='▶ Time-Period for Back-Testing', inline='3')  // Input for end year
in_date_range = time >= timestamp(syminfo.timezone, start_year, start_month, start_date, 0, 0) and time < timestamp(syminfo.timezone, end_year, end_month, end_date, 0, 0)  // Check if the current time is within the specified date range
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
was_over_sold = ta.barssince(rsi <= rsi_over_sold) <= 10  // Check if RSI was oversold in the last 10 bars
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
getVolume(symbol, bar) =>
    request.security(syminfo.tickerid, "D", volume)[bar]  // Function to get volume data for a specific symbol and bar

getVolume2(symbol, bar) =>
    request.security(syminfo.tickerid, "39", volume)[bar]  // Function to get volume data for a specific symbol and bar 2
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

firstCandleColor1 = request.security(syminfo.tickerid, "D", close[2] > open[1] ? 1 : 0)
firstCandleColor2 = request.security(syminfo.tickerid, "1", close[2] > open[0] ? 1 : 0)
firstCandleColor3 = request.security(syminfo.tickerid, "W", close[1] > open[1] ? 1 : 0)

firstCandleColor= ((firstCandleColor1+firstCandleColor2)) > firstCandleColor3 ? 1 : 0

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sma = ta.sma(close, 13)  // Calculate the simple moving average (SMA) of the close price over 13 periods
numCandles = ta.barssince(close > sma)  // Count the number of candles since the close price crossed above the SMA
atr1=request.security(syminfo.tickerid, "30", ta.atr(atr_small)<ta.atr(atr_big))  // Get the ATR value for the specific security and timeframe (30 minutes) and check if ATR_small is less than ATR_big

prevClose = ta.valuewhen(close > sma, close, occurrence_ValueWhen_1)  // Get the close price when it first crosses above the SMA based on occurrence_ValueWhen_1
prevCloseBarsAgo = ta.valuewhen(close > sma, close, occurrence_ValueWhen_2)  // Get the close price when it first crosses above the SMA based on occurrence_ValueWhen_2
prevCloseChange =  (prevCloseBarsAgo - prevClose )  // Calculate the change in the close price between the occurrences of crossing above the SMA

atrval=(atr_value3>140) or (atr_value3 < 123)  // Check if atr_value3 is either greater than 140 or less than 123

Condition =  getVolume(syminfo.tickerid, 90) > volume_threshold1 * getVolume(syminfo.tickerid, 49)   and getVolume(syminfo.tickerid, 110) > volume_threshold3 * getVolume(syminfo.tickerid, 49)  and getVolume2(syminfo.tickerid, 30) > volume_threshold2 * getVolume2(syminfo.tickerid, 55) and getVolume2(syminfo.tickerid, 7) > volume_threshold2 * getVolume2(syminfo.tickerid, 3)  // Check multiple volume conditions

buy_signal=Condition  and atrval and firstCandleColor==0 and  was_over_sold and  prevCloseChange> distance_value and atr1 and  numCandles<5  // Determine if the buy signal is generated based on various conditions

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Long Strategy
// Enter long position if the buy signal conditions are met and within the specified date range
if buy_signal and in_date_range
    strategy.entry('Long', strategy.long, alert_message='Open Long Position')  // Enter long position
    strategy.exit('Long SL/TP', from_entry='Long', loss=long_stoploss_percentage, profit=long_takeprofit_percentage, alert_message='Your SL/TP-Limit for the Long-Strategy has been activated.')  // Exit long position with stop-loss and take-profit




Thêm nữa