Chiến lược giao dịch cân bằng dài-ngắn dựa trên các chỉ báo khối lượng và giá


Ngày tạo: 2023-11-24 14:35:13 sửa đổi lần cuối: 2023-11-24 14:35:13
sao chép: 0 Số nhấp chuột: 649
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch cân bằng dài-ngắn dựa trên các chỉ báo khối lượng và giá

Tổng quan

Chiến lược này là một chiến lược giao dịch chỉ số giá trị của nhiều khung thời gian. Nó sử dụng tổng hợp chỉ số tương đối mạnh yếu (RSI), đường sóng thực trung bình (ATR), đường trung bình di chuyển đơn giản (SMA) và điều kiện giá tùy chỉnh để xác định các tín hiệu giao dịch tiềm năng. Chiến lược này sẽ thiết lập giao dịch khi đáp ứng các điều kiện nhất định như bán quá mức, giao dịch chỉ số giá trị, phá vỡ giá.

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

Chiến lược này dựa trên một số điểm chính sau:

  1. RSI được coi là một tín hiệu bán tháo khi nó nằm dưới đường bán tháo và liên tục ở trạng thái bán tháo trong 10 đường K gần nhất
  2. Định nghĩa nhiều điều kiện giá trị, cần đáp ứng các điều kiện giá trị đồng thời để coi chỉ số giá trị phát ra nhiều tín hiệu
  3. Khi giá đóng cửa phá vỡ SMA 13 chu kỳ từ dưới lên, được coi là tín hiệu phá vỡ giá
  4. Chu kỳ nhỏ ATR thấp hơn chu kỳ lớn cũng là tín hiệu đẩy
  5. Kết hợp nhiều tín hiệu trên để tạo ra nhiều quyết định cuối cùng

Cụ thể, chiến lược này đặt các tham số đường dài và đường bán tháo cho chỉ số RSI và tính toán giá trị RSI dựa trên các tham số này. Khi chỉ số RSI nằm dưới đường bán tháo nhiều đường K liên tiếp, sẽ tạo ra tín hiệu bán tháo.

Ngoài ra, chiến lược này xác định 3 mức giảm giá trị giao dịch và đặt nhiều nhóm điều kiện giá trị dựa trên dữ liệu từ các chu kỳ thời gian khác nhau. Ví dụ: giá trị 90 chu kỳ lớn hơn 1,5 lần so với giá trị 49 chu kỳ. Khi các điều kiện giá trị này được đáp ứng cùng một lúc, tín hiệu làm nhiều của chỉ số giá trị sẽ được phát ra.

Về giá cả, chiến lược này tính toán các chỉ số SMA 13 chu kỳ và thống kê số lượng đường K kể từ khi giá phá vỡ SMA. Khi giá phá vỡ SMA từ dưới lên và số lượng đường K sau khi phá vỡ là ít hơn 5, thì nó được coi là tín hiệu phá vỡ giá.

Đối với tham số ATR chu kỳ, chiến lược chỉ định ATR của chu kỳ nhỏ 5 và chu kỳ lớn 14. Khi ATR chu kỳ nhỏ thấp hơn ATR chu kỳ lớn, cho thấy sự biến động của thị trường tăng tốc và thu hẹp, như là tín hiệu tăng cường.

Cuối cùng, chiến lược tổng hợp xem xét nhiều điều kiện mua như trên, bao gồm bán tháo, chỉ số giá trị, giá phá vỡ và chỉ số ATR. Khi các điều kiện này được đáp ứng cùng một lúc, tạo ra tín hiệu mua nhiều cuối cùng và thiết lập một vị trí mua nhiều.

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

Chiến lược này có một số lợi thế:

  1. Đánh giá chỉ số đo lường giá trị theo nhiều khung thời gian, cải thiện độ chính xác. Chiến lược không chỉ xem xét dữ liệu đo lường giá trị của một chu kỳ duy nhất, mà còn đánh giá sự giao thoa của nhiều nhóm điều kiện đo lường giá trị khác nhau, có thể đánh giá chính xác hơn về mức độ tập trung của năng lượng đo lường.

  2. Quá bán + số lượng + giá trí phán đoán cơ chế, đảm bảo độ tin cậy của tín hiệu mua. Quá bán cung cấp cơ sở nhất mua chọn thời điểm, ngoài ra, giá và số lượng của các chỉ số giao chéo thêm xác nhận cho thời điểm mua, độ tin cậy cao hơn.

  3. Thiết lập cơ chế dừng lỗ để kiểm soát chặt chẽ rủi ro giao dịch đơn lẻ. Các tham số dừng lỗ và dừng lỗ có thể được điều chỉnh theo sở thích rủi ro cá nhân, kiểm soát hợp lý rủi ro cho mỗi giao dịch đồng thời theo đuổi tối đa hóa lợi nhuận.

  4. Quyết định tích hợp nhiều chỉ số tăng tính linh hoạt. Ngay cả khi một số chỉ số bị hỏng hoặc sai, bạn vẫn có thể dựa vào các chỉ số khác để đảm bảo khả năng hoạt động liên tục.

Rủi ro và giải pháp

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

  1. Rủi ro cấu hình tham số. Thiết lập tham số của các chỉ số ảnh hưởng trực tiếp đến kết quả phán đoán, tham số không hợp lý có thể dẫn đến tín hiệu giao dịch bị lệch. Cần tìm kiếm nghiêm túc các tham số có giá trị hợp lý.

  2. Không gian lợi nhuận có giới hạn. Là một chiến lược kết hợp nhiều chỉ số để đưa ra phán đoán tích hợp, tần số tạo tín hiệu tương đối bảo thủ hơn, số lần giao dịch ít hơn trong một đơn vị thời gian, không gian lợi nhuận có giới hạn.

  3. Nguy cơ phân tán của chỉ số. Khi một số chỉ số phát ra nhiều tín hiệu và một số khác phát ra tín hiệu trống, chiến lược không thể xác định quyết định tối ưu. Điều này đòi hỏi phải xác định trước và giải quyết các trường hợp có thể phân tán giữa các chỉ số.

Hướng tối ưu hóa chiến lược

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

  1. Thêm mô hình học máy hỗ trợ phán đoán. Có thể huấn luyện mô hình giá trị và tính năng dao động, hỗ trợ các tham số được đặt bằng tay, thực hiện động lực hóa các tham số.

  2. Tăng sự trưởng thành của chiến lược dừng. Ví dụ: có thể thiết lập dừng nổi, dừng hàng loạt, dừng theo dõi, v.v., có thể nâng cao hơn nữa lợi nhuận mỗi lần trong khi ngăn chặn thời gian trôi qua.

  3. Đánh giá dữ liệu mở cửa nhập. Ngoài dữ liệu giá trị K-line, kết hợp với dữ liệu mở cửa mua bán sâu cũng có thể đánh giá sự phân bố của vị trí nắm giữ, có thể cung cấp tín hiệu tham khảo bổ sung.

  4. Kiểm tra và kiểm tra 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 để tích hợp, bạn cũng có thể thử giới thiệu các chỉ số khác như Brinline, KDJ và các chỉ số khác để làm phong phú và tối ưu hóa nguồn tín hiệu giao dịch.

Tóm tắt

Chiến lược tổng hợp này sử dụng RSI, ATR, SMA và phán quyết điều kiện giá cả tùy chỉnh để xác định thời gian mua hàng tiềm năng. Nó cũng có lợi thế như phán quyết chỉ số giá cả nhiều khung thời gian, cơ chế xác nhận tín hiệu ba và kiểm soát rủi ro dừng lỗ. Tất nhiên, cũng cần chú ý đến các vấn đề như rủi ro cấu hình tham số, hạn chế lợi nhuận. Trong tương lai, chiến lược có thể được tối ưu hóa hơn nữa từ hỗ trợ học máy, tối ưu hóa chiến lược dừng, giới thiệu dữ liệu giao dịch và mở rộng tích hợp chỉ số.

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