Tài nguyên đang được tải lên... tải...

Ý tưởng giao dịch thay thế - Chiến lược giao dịch khu vực đường K

Tác giả:FMZ~Lydia, Tạo: 2023-11-06 13:33:17, Cập nhật: 2024-11-08 09:10:08

img

Nhìn vào một ý tưởng giao dịch không đáng tin cậy chiến lược giao dịch khu vực đường K, trong bài viết này, chúng tôi sẽ khám phá khái niệm và cố gắng thực hiện kịch bản.

Ý tưởng chính của Chiến lược khu vực đường K

Chiến lược khu vực đường K là một chiến lược giao dịch dựa trên mối quan hệ khu vực giữa đường K giá và đường trung bình động. Ý tưởng chính của nó là dự đoán xu hướng có thể xảy ra trong giá cổ phiếu bằng cách phân tích quy mô và thay đổi xu hướng giá, cũng như thay đổi tâm lý mua và bán, do đó xác định thời điểm mở và thoát vị. Chiến lược này dựa trên khu vực giữa đường K và đường trung bình động, cũng như các giá trị từ chỉ số KDJ, để tạo ra các tín hiệu giao dịch dài và ngắn.

Nguyên tắc chiến lược khu vực đường K

Khu vực của đường K đề cập đến khu vực không gian giữa đường giá K và đường trung bình động, được tính bằng cách trừ giá trung bình động từ giá đóng cửa của mỗi thanh và sau đó tổng hợp nó. Khi có sự gia tăng lớn về giá trong một khoảng thời gian dài, khu vực đường K sẽ trở nên lớn hơn, trong khi trong thời gian thị trường biến động hoặc sau khi đảo ngược biến động, khu vực đường K nhỏ hơn. Theo nguyên tắc của những gì đi lên phải đi xuống , khi xu hướng tăng lớn hơn và kéo dài lâu hơn, khu vực đường K tương ứng của nó cũng tăng; do đó tăng xác suất đảo ngược - giống như một mùa xuân phục hồi với sức mạnh lớn hơn khi kéo dài hơn. Do đó, việc thiết lập ngưỡng cho khu vực đường K này có thể chỉ ra khi nào giá có thể đã đạt đến đỉnh và có khả năng đảo ngược.

Để xác nhận thêm sự đảo ngược xu hướng sắp xảy ra, chúng tôi giới thiệu việc sử dụng các chỉ số KDJ giúp xác định sự thay đổi trong tâm lý mua hoặc bán.

Những lợi thế của chiến lược khu vực K-Line

Ưu điểm của chiến lược khu vực đường K nằm trong sự kết hợp của quy mô và sự thay đổi của xu hướng giá, cũng như sự thay đổi trong tâm lý mua và bán, cung cấp một chiến lược giao dịch định lượng tương đối hoàn chỉnh.

  • Nó cung cấp một phương pháp đơn giản và trực quan để xác định khả năng đảo ngược xu hướng, giúp các nhà giao dịch hiểu rõ hơn về xu hướng thị trường.
  • Bằng cách kết hợp khu vực đường K và chỉ số KDJ, nó làm tăng độ tin cậy và độ chính xác của chiến lược.
  • Độ linh hoạt cao cho phép điều chỉnh các tham số theo điều kiện thị trường để đáp ứng các nhu cầu giao dịch khác nhau.

Rủi ro của chiến lược khu vực đường K

Mặc dù chiến lược khu vực đường K có một số lợi thế, nó cũng mang theo một số rủi ro, bao gồm:

  • Việc thiết lập ngưỡng có thể đòi hỏi một số kinh nghiệm và điều chỉnh.
  • Độ chính xác của chỉ số KDJ bị ảnh hưởng bởi biến động thị trường và tiếng ồn, có thể dẫn đến tín hiệu sai.
  • Hiệu suất của chiến lược có thể thay đổi trong các điều kiện thị trường khác nhau và cần tối ưu hóa và điều chỉnh liên tục.

Định hướng tối ưu hóa chiến lược khu vực đường K

Để tối ưu hóa chiến lược khu vực đường K, hãy xem xét các hướng sau:

  • Tối ưu hóa tham số: Tiếp tục điều chỉnh và tối ưu hóa các giá trị ngưỡng và các tham số chỉ số KDJ để thích nghi với các điều kiện thị trường và nhu cầu giao dịch khác nhau.
  • Quản lý rủi ro: Thực hiện các chiến lược quản lý rủi ro hiệu quả, bao gồm các quy tắc dừng lỗ và lấy lợi nhuận, để giảm rủi ro mất mát.
  • Kết hợp nhiều chiến lược: Kết hợp chiến lược khu vực đường K với các chiến lược khác để cải thiện hiệu suất của các chiến lược giao dịch toàn diện.
  • Theo dõi và điều chỉnh thời gian thực: Theo dõi thường xuyên hiệu suất của các chiến lược, điều chỉnh và cải thiện dựa trên tình huống thực tế.

Thực hiện chiến lược sử dụng JavaScript

  • Tính toán diện tích đường K

  • Tín hiệu mở vị trí dài:

    (1) Khu vực đường K của xu hướng giảm đạt ngưỡng, nó có thể được xác định trước.

    (2) Giá trị chỉ số KDJ lớn hơn 80.

  • Tín hiệu mở vị trí ngắn:

    (1) Khu vực đường K của xu hướng tăng đạt ngưỡng, nó có thể được xác định trước.

    (2) Giá trị chỉ số KDJ nhỏ hơn 20.

  • Rời khỏi các vị trí Long/Short: ATR trailing stop loss and take profit.

Thực hiện mã

// Parameter
var maPeriod = 30
var threshold = 50000
var amount = 0.1

// Global variable
let c = KLineChart({})
let openPrice = 0
let tradeState = "NULL"  // NULL BUY SELL

function calculateKLineArea(r, ma) {
    var lastCrossUpIndex = null
    var lastCrossDownIndex = null
    for (var i = r.length - 1 ; i >= 0 ; i--) {
        if (ma[i] !== null && r[i].Open < ma[i] && r[i].Close > ma[i]) {
            lastCrossUpIndex = i
            break
        } else if (ma[i] !== null && r[i].Open > ma[i] && r[i].Close < ma[i]) {
            lastCrossDownIndex = i
            break
        }

        if (i >= 1 && ma[i] !== null && ma[i - 1] !== null && r[i - 1].Close < ma[i - 1] && r[i].Close > ma[i]) {
            lastCrossUpIndex = i
            break
        } else if (i >= 1 && ma[i] !== null && ma[i - 1] !== null && r[i - 1].Close > ma[i - 1] && r[i].Close < ma[i]) {
            lastCrossDownIndex = i
            break
        }
    }

    var area = 0
    if (lastCrossDownIndex !== null) {
        for (var i = r.length - 1 ; i >= lastCrossDownIndex ; i--) {
            area -= Math.abs(r[i].Close - ma[i])
        }
    } else if (lastCrossUpIndex !== null) {
        for (var i = r.length - 1 ; i >= lastCrossUpIndex ; i--) {
            area += Math.abs(r[i].Close - ma[i])
        }
    }

    return [area, lastCrossUpIndex, lastCrossDownIndex]
}

function onTick() {
    var r = _C(exchange.GetRecords)
    if (r.length < maPeriod) {
        LogStatus(_D(), "Insufficient number of K-line")
        return 
    }
    var ma = TA.MA(r, maPeriod)
    var atr = TA.ATR(r)
    var kdj = TA.KDJ(r)
    var lineK = kdj[0]
    var lineD = kdj[1]
    var lineJ = kdj[2]
    var areaInfo = calculateKLineArea(r, ma)
    var area = _N(areaInfo[0], 0)
    var lastCrossUpIndex = areaInfo[1]
    var lastCrossDownIndex = areaInfo[2]
    
    r.forEach(function(bar, index) {
        c.begin(bar)
        c.plotcandle(bar.Open, bar.High, bar.Low, bar.Close, {overlay: true})
        let maLine = c.plot(ma[index], "ma", {overlay: true})
        let close = c.plot(bar.Close, 'close', {overlay: true})
        c.fill(maLine, close, {color: bar.Close > ma[index] ? 'rgba(255, 0, 0, 0.1)' : 'rgba(0, 255, 0, 0.1)'})
        if (lastCrossUpIndex !== null) {
            c.plotchar(bar.Time, {char: '$:' + area, overlay: true})
        } else if (lastCrossDownIndex !== null) {
            c.plotchar(bar.Time, {char: '$:' + area, overlay: true})
        }
        c.plot(lineK[index], "K")
        c.plot(lineD[index], "D")
        c.plot(lineJ[index], "J")

        c.close()
    })
    
    if (tradeState == "NULL" && area < -threshold && lineK[lineK.length - 1] > 70) {
        // long
        let tradeInfo = $.Buy(amount)
        if (tradeInfo) {
            openPrice = tradeInfo.price
            tradeState = "BUY"
        }
    } else if (tradeState == "NULL" && area > threshold && lineK[lineK.length - 1] < 30) {
        // short
        let tradeInfo = $.Sell(amount)
        if (tradeInfo) {
            openPrice = tradeInfo.price
            tradeState = "SELL"
        }
    }
    
    let stopBase = tradeState == "BUY" ? Math.max(openPrice, r[r.length - 2].Close) : Math.min(openPrice, r[r.length - 2].Close)
    if (tradeState == "BUY" && r[r.length - 1].Close < stopBase - atr[atr.length - 2]) {
        // cover long
        let tradeInfo = $.Sell(amount)
        if (tradeInfo) {
            tradeState = "NULL"
            openPrice = 0
        }        
    } else if (tradeState == "SELL" && r[r.length - 1].Close > stopBase + atr[atr.length - 2]) {
        // cover short 
        let tradeInfo = $.Buy(amount)
        if (tradeInfo) {
            tradeState = "NULL"
            openPrice = 0
        }        
    }

    LogStatus(_D(), "area:", area, ", lineK[lineK.length - 2]:", lineK[lineK.length - 2])
}


function main() {    
    if (exchange.GetName().includes("_Futures")) {
        throw "not support Futures"
    }
    while (true) {
        onTick()
        Sleep(1000)
    }
}

Chiến lược logic rất đơn giản:

  1. Đầu tiên, một số biến và tham số toàn cầu được xác định, bao gồm:

Các thông số chiến lược

  • maPeriod: Thời gian của trung bình động.
  • Đường ngưỡng: Một ngưỡng được sử dụng để xác định thời gian mua hoặc bán.
  • Số lượng: Số lượng cho mỗi giao dịch.

Các biến số toàn cầu

  • c: Một đối tượng biểu đồ đường K, được sử dụng để vẽ biểu đồ.
  • openPrice: ghi lại giá mở cửa.
  • tradeState: Ghi lại trạng thái giao dịch, có thể là NULL (vị trí trống), BUY hoặc SELL.

Tính toán hàm

  • tính toán hàm KLineArea: Nó được sử dụng để tính toán diện tích giữa giá và đường trung bình động trên biểu đồ đường K trong một khoảng thời gian nhất định, và trả về giá trị diện tích, chỉ số của đường K vượt lên cuối cùng và chỉ số của đường K vượt xuống cuối cùng. Các giá trị này được sử dụng trong các quyết định tiếp theo để xác định khi mua và bán.

Chức năng vòng tròn chính

  • chức năng onTick: Đây là chức năng thực hiện chiến lược chính, và đây là các hoạt động trong chức năng:

    a. Nhận dữ liệu K-line mới nhất và đảm bảo rằng số lượng K-line không ít hơn maPeriod, nếu không ghi lại tình trạng và trả lại.

    tính toán đường trung bình động ma và chỉ số ATR atr, cũng như chỉ số KDJ.

    c. Nhận thông tin khu vực từ areaInfo, chỉ số đường K chéo cuối cùng và chỉ số đường K chéo cuối cùng.

    d. Sử dụng đối tượng biểu đồ đường K c để vẽ đường K và đường chỉ số trong khi điền vào các màu sắc khác nhau dựa trên mối quan hệ giás với đường trung bình động.

    e. Xác định thời gian mua hoặc bán theo các điều kiện:

    Nếu tradeState là NULL, và khu vực nhỏ hơn ngưỡng - và giá trị K của KDJ lớn hơn 70, thực hiện giao dịch mua. Nếu tradeState là NULL, và khu vực lớn hơn ngưỡng, và giá trị K của KDJ nhỏ hơn 30, thực hiện giao dịch bán. Nếu các điều kiện này được đáp ứng, đóng các vị trí:

    Nếu nó ở trạng thái mua, khi giá giảm xuống dưới giá đóng cửa của ngày giao dịch cuối cùng trừ ATR (Medio True Range) của ngày trước, đóng vị trí. Nếu nó ở trạng thái bán, khi giá tăng lên trên giá đóng cửa ngày giao dịch cuối cùng cộng với ngày trước đó ATR (Medio True Range), đóng vị trí.

    main function: Đây là điểm đầu vào thực thi chính. Nó kiểm tra xem tên trao đổi có chứa _Futures hay không. Nếu có, một ngoại lệ sẽ được ném; nếu không nó sẽ đi vào một vòng lặp vô hạn nơi hàm onTick được thực thi mỗi giây.

Nói tóm lại, chiến lược này chủ yếu dựa trên biểu đồ K-line và các chỉ số kỹ thuật để đưa ra quyết định mua hoặc bán trong khi cũng sử dụng các chiến lược dừng lỗ & lấy lợi nhuận để quản lý rủi ro. Xin lưu ý rằng đây chỉ là một chiến lược ví dụ cần được điều chỉnh & tối ưu hóa theo tình hình thị trường và các yêu cầu cụ thể trong quá trình sử dụng thực tế.

TrênFMZ.COM, sử dụng ngôn ngữ JavaScript không yêu cầu nhiều dòng mã, thay vào đó, nó thực hiện mô hình này một cách dễ dàng. Và với sự giúp đỡ của KLineChart chức năng biểu diễn đồ họa của khu vực biểu đồ K-line cũng dễ dàng đạt được.

Chiến lược kiểm tra lại

img

img

Tôi chọn một thời gian backtesting ngẫu nhiên. Mặc dù tôi không mất tiền, tôi cũng không tích lũy lợi nhuận liên tục, và vấn đề rút vốn khá quan trọng. Có thể có những hướng khác và không gian tối ưu hóa cho chiến lược. Những người quan tâm có thể cố gắng nâng cấp chiến lược.

img img

Thông qua chiến lược, chúng tôi không chỉ học được một ý tưởng giao dịch khá không thông thường, mà còn học cách vẽ sơ đồ; đại diện cho khu vực bao quanh bởi đường K và đường trung bình động; vẽ các chỉ số KDJ v.v.

Tóm lại

Chiến lược khu vực đường K là một chiến lược giao dịch dựa trên quy mô xu hướng giá và chỉ số KDJ. Nó giúp các nhà giao dịch dự đoán xu hướng thị trường bằng cách phân tích khu vực giữa đường K và đường trung bình động, cũng như sự thay đổi tâm lý mua và bán. Mặc dù có một số rủi ro, chiến lược này có thể cung cấp các công cụ giao dịch mạnh mẽ thông qua tối ưu hóa và điều chỉnh liên tục, giúp các nhà giao dịch đối phó tốt hơn với biến động thị trường. Hơn nữa, các nhà giao dịch nên điều chỉnh các tham số và quy tắc của chiến lược một cách linh hoạt theo các tình huống và điều kiện thị trường cụ thể để đạt được hiệu suất giao dịch tốt hơn.


Thêm nữa