Chiến lược logic ngược cuối cùng N Candle

Tác giả:ChaoZhang, Ngày: 2023-12-26 11:00:29
Tags:

img

Tổng quan

Ý tưởng chính của chiến lược này là xác định dài hay ngắn dựa trên màu sắc của N nến cuối cùng. Nếu N nến cuối cùng là màu xanh lá cây, đi dài; nếu N nến cuối cùng là màu đỏ, đi ngắn. Phần độc đáo là việc thêm một tham số logic ngược có thể đảo ngược logic ban đầu. Khi tham số logic ngược là đúng, N nến màu xanh lá cây cuối cùng sẽ đi ngắn, và N nến màu đỏ cuối cùng sẽ đi dài.

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

Chiến lược này chủ yếu dựa trên các thông số quan trọng sau:

  1. numCandlesToCheck: Sử dụng để chỉ định số lượng nến để kiểm tra
  2. numCandlesToExit: Xác định số lượng nến sau khi mở vị trí cần phải thoát
  3. inverseLogic: Các tham số logic ngược. Khi đúng, logic dài và ngắn ban đầu được đảo ngược

Lý thuyết chính là đi qua các nến numCandlesToCheck cuối cùng thông qua vòng lặp for, và đếm các nến màu xanh lá cây và màu đỏ liên tiếp trong thời gian thực. Nếu nến màu đỏ liên tiếp ≥numCandlesToCheck, đánh dấu lastNCandlesRed là đúng. Nếu nến màu xanh lá cây liên tiếp ≥numCandlesToCheck, đánh dấu lastNCandlesGreen là đúng.

Khi lastNCandlesGreen đúng, đi dài nếu inverseLogic là sai, nếu không đi ngắn. Ngược lại, khi lastNCandlesRed đúng, đi ngắn nếu inverseLogic là sai, nếu không đi dài.

Bất kể dài hay ngắn, barSinceEntry sẽ được thiết lập lại thành 0 sau khi mở vị trí. Khi barSinceEntry lớn hơn hoặc bằng numCandlesToExit, vị trí hiện tại sẽ được đóng.

Phân tích lợi thế

Đây là một chiến lược thú vị sử dụng màu nến để đưa ra quyết định, với một tham số logic ngược có thể điều chỉnh linh hoạt logic dài và ngắn.

  1. Ý tưởng này là mới mẻ và có thể tạo thành đầu tư ngược lại chống lại logic chung của thị trường
  2. Mã là rõ ràng và ngắn gọn, dễ hiểu và sửa đổi
  3. Có thể tìm thấy kết hợp thông số tối ưu bằng cách điều chỉnh các thông số
  4. Bất kể điều kiện thị trường, chiến lược này có thể tiếp tục chạy và tạo ra tín hiệu

Phân tích rủi ro

Ngoài ra còn có một số rủi ro cần lưu ý cho chiến lược này:

  1. Màu nến không thể đại diện đầy đủ cho điều kiện thị trường, nguy cơ theo dõi tín hiệu không chính xác tồn tại
  2. Không thể xác định giá trị tối ưu cho numCandlesToCheck
  3. Không thể xác định giá trị tối ưu cho numCandlesToExit
  4. Các thông số logic ngược không đúng có thể khuếch đại tổn thất
  5. Không thể kiểm soát hiệu quả tổn thất dừng duy nhất

Để đối phó với những rủi ro này, các biện pháp sau đây có thể được áp dụng để kiểm soát và tối ưu hóa:

  1. Tăng các bộ lọc khác để tránh tín hiệu không chính xác, ví dụ: xác định xu hướng trong khung thời gian dài hơn
  2. Đi qua các giá trị tham số khác nhau để tìm kết hợp tham số tối ưu
  3. Thêm cơ chế dừng lỗ để kiểm soát lỗ đơn
  4. Kiểm tra hiệu quả của tham số logic ngược

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

Các hướng tối ưu hóa chính cho chiến lược này là:

  1. Tăng điều kiện sổ lệnh để tránh bị mắc kẹt
  2. Tối ưu hóa các giá trị của numCandlesToCheck và numCandlesToExit
  3. Thêm chỉ số xu hướng trên khung thời gian cao hơn để lọc tín hiệu sai
  4. Thêm stop loss và take profit
  5. Kiểm tra hậu quả trên các sản phẩm khác nhau để xác minh hiệu quả
  6. So sánh lợi nhuận giữa logic ban đầu và ngược

Kết luận

Ý tưởng tổng thể của chiến lược này là rõ ràng và dễ hiểu, tạo ra các tín hiệu giao dịch đơn giản dựa trên xác định màu nến. Điều chỉnh các tham số có thể tạo ra các biến thể kết hợp phong phú để tối ưu hóa nhắm vào các môi trường và sản phẩm thị trường khác nhau. Cũng cần chú ý đến một số rủi ro tiềm ẩn và thực hiện các biện pháp cần thiết để kiểm soát chúng. Bằng cách liên tục làm phong phú nội dung chiến lược, chiến lược này có thể trở thành một chiến lược có giá trị để tiếp tục tối ưu hóa cho giao dịch dài hạn.


/*backtest
start: 2022-12-25 00:00:00
end: 2023-12-25 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Last Number of  Candles", overlay=true)

// Define the condition for a green candle
isGreenCandle(candle) =>
    close[candle] > open[candle]

// Define the condition for a red candle
isRedCandle(candle) =>
    close[candle] < open[candle]

// Input to specify the number of candles to check
numCandlesToCheck = input(5, title="Number of Candles to Check")
numCandlesToExit = input(2, title="Number of Candles To Exit")  // Corrected the input title

// Initialize variables to count consecutive green and red candles
var int consecutiveGreenCandles = 0
var int consecutiveRedCandles = 0

// Initialize barsSinceEntry outside the loop
var int barsSinceEntry = 0

// Loop through the last "numCandlesToCheck" candles
for i = 0 to numCandlesToCheck - 1
    if isGreenCandle(i)
        consecutiveGreenCandles := consecutiveGreenCandles + 1
        consecutiveRedCandles := 0 // Reset the count for consecutive red candles
    else if isRedCandle(i)
        consecutiveRedCandles := consecutiveRedCandles + 1
        consecutiveGreenCandles := 0 // Reset the count for consecutive green candles

// Check if the last "numCandlesToCheck" candles are green or red
lastNCandlesGreen = consecutiveGreenCandles >= numCandlesToCheck
lastNCandlesRed = consecutiveRedCandles >= numCandlesToCheck

// Calculate the quantity based on the investment value and current asset price
investmentValue = input(10000, title="Investment Value")
var assetPrice = close
var quantity = investmentValue / assetPrice


inverseLogic = input(false, title="inverseLogic")

// Entry condition: Open a buy order if the last "numCandlesToCheck" candles are green
if lastNCandlesGreen
    if inverseLogic
        strategy.entry("Short", strategy.long, qty = quantity)
    else 
        strategy.entry("Buy", strategy.long, qty = quantity)// Reset barsSinceEntry when entering a trade
    barsSinceEntry := 0

// Entry condition: Open a short order if the last "numCandlesToCheck" candles are red
if lastNCandlesRed
    if inverseLogic
        strategy.entry("Buy", strategy.long, qty = quantity)

    else 
        strategy.entry("Short", strategy.short, qty = quantity)
    // Reset barsSinceEntry when entering a trade
    barsSinceEntry := 0

// Increment barsSinceEntry
barsSinceEntry := barsSinceEntry + 1

// Exit condition: Close the position after 2 bars
if barsSinceEntry >= numCandlesToExit
    strategy.close("Buy")
    strategy.close("Short")


Thêm nữa