avatar of 发明者量化-小小梦 发明者量化-小小梦
tập trung vào tin nhắn riêng tư
4
tập trung vào
1271
Người theo dõi

Ý tưởng giao dịch thay thế - Chiến lược giao dịch theo vùng K-line

Được tạo ra trong: 2023-11-03 17:12:42, cập nhật trên: 2024-11-08 09:08:54
comments   0
hits   1617

Ý tưởng giao dịch thay thế - Chiến lược giao dịch theo vùng K-line

Xem xét một ý tưởng giao dịch không mấy đáng tin cậy - chiến lược giao dịch theo vùng K, trong bài viết này chúng ta sẽ thảo luận về ý tưởng này và cố gắng triển khai chiến lược này.

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

Chiến lược vùng K-line là chiến lược giao dịch dựa trên mối quan hệ diện tích giữa giá K-line 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 của giá cổ phiếu bằng cách phân tích biên độ và sự thay đổi của xu hướng giá, cũng như sự chuyển đổi của tâm lý mua và bán, để xác định thời điểm mở và thoát khỏi vị thế. Chiến lược này dựa vào diện tích giữa nến và đường trung bình động, cũng như giá trị của chỉ báo KDJ, để tạo ra các tín hiệu giao dịch dài hạn và ngắn hạn.

Nguyên lý của chiến lược vùng K-line

Diện tích nến là khoảng cách giữa nến giá và đường trung bình động, được tính bằng cách trừ giá trị trung bình động khỏi giá đóng cửa của mỗi thanh rồi cộng lại. Khi giá tăng trong thời gian dài và ở biên độ lớn, diện tích của đường K sẽ trở nên lớn hơn, trong khi ở thị trường biến động hoặc đảo chiều sau biến động, diện tích của đường K sẽ nhỏ hơn . Theo nguyên lý “mọi thứ đều đi về cực đối lập”, xu hướng tăng càng lớn và thời gian càng dài thì diện tích đường K tương ứng càng lớn và khả năng đảo ngược càng lớn, giống như lò xo, càng dài. bị kéo căng, lực bật lại càng lớn. Do đó, ngưỡng cho vùng K-line được thiết lập. Khi ngưỡng này đạt đến, xu hướng giá có thể hoàn thành và khả năng đảo ngược sẽ lớn hơn.

Để xác nhận thêm rằng xu hướng sắp đảo ngược, chỉ báo KDJ được đưa vào để đánh giá sự chuyển đổi của tâm lý mua và bán. Ngưỡng và giá trị chỉ báo KDJ của chiến lược này có thể được điều chỉnh theo các tình huống cụ thể và nhu cầu nhằm nâng cao độ chính xác của chiến lược.

Ưu điểm của chiến lược vùng K-line

Ưu điểm của chiến lược vùng K là kết hợp biên độ và sự thay đổi của xu hướng giá, cũng như sự chuyển đổi tâm lý mua và bán, mang lại một chiến lược giao dịch định lượng tương đối hoàn chỉnh. Ưu điểm của nó bao gồm:

  • Nó cung cấp một cách đơ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 nắm bắt tốt hơn xu hướng thị trường.
  • Sự kết hợp giữa diện tích đường K và chỉ số KDJ làm tăng độ tin cậy và độ chính xác của chiến lược.
  • Nó rất linh hoạt và có thể điều chỉnh các thông 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 vùng K-line

Mặc dù chiến lược vùng nến có một số ưu điểm nhất định nhưng cũng có một số rủi ro, bao gồm:

  • Việc đặt ra ngưỡng có thể đòi hỏi một số kinh nghiệm và điều chỉnh, và nếu không đặt đúng cách, có thể dẫn đến đánh giá sai xu hướng thị trường.
  • Độ chính xác của chỉ báo KDJ bị ảnh hưởng bởi biến động và nhiễu của thị trường, và có thể xảy ra tín hiệu sai.
  • Hiệu quả của một chiến lược có thể thay đổi tùy theo các điều kiện thị trường khác nhau và đòi hỏi phải tối ưu hóa và điều chỉnh liên tục.

Hướng tối ưu hóa chiến lược diện tích đường K

Để tối ưu hóa chiến lược diện tích đường K, có thể cân nhắc các hướng sau:

  • Tối ưu hóa tham số: Liên tục điều chỉnh và tối ưu hóa ngưỡng và các tham số chỉ báo KDJ để thích ứng 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: Triển khai 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à chốt lời, để giảm rủi ro thua lỗ.
  • Kết hợp nhiều chiến lược: Kết hợp chiến lược vùng K với các chiến lược khác để cải thiện hiệu suất của chiến lược giao dịch toàn diện.
  • Theo dõi và điều chỉnh theo thời gian thực: Thường xuyên theo dõi hiệu quả thực hiện chiến lược và thực hiện điều chỉnh, cải tiến dựa trên điều kiện thực tế.

Thực hiện chiến lược này bằng cách sử dụng JavaScript

  • Tính diện tích của chân nến

  • Tín hiệu mở vị thế mua:

(1) “Khu vực đường K” của xu hướng giảm đạt đến ngưỡng, có thể được thiết lập trước

(2) Giá trị chỉ báo KDJ lớn hơn 80

  • Tín hiệu mở vị thế bán khống:

(1) “Khu vực đường K” của xu hướng tăng đạt đến ngưỡng, có thể được thiết lập trước

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

  • Thoát lệnh dài/ngắn: ATR theo dõi lệnh dừng lỗ và chốt lời

Triển khai mã

// 参数
var maPeriod = 30
var threshold = 50000
var amount = 0.1

// 全局变量
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(), "K线数量不足")
        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)
    }
}

Logic của chiến lược này rất đơn giản:

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

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

  • maPeriod: Chu kỳ của đường trung bình động.
  • ngưỡng: Ngưỡng được sử dụng để xác định thời điểm mua hoặc bán.
  • số tiền: Số tiền của mỗi giao dịch.

Biến toàn cục

  • c: Đối tượng biểu đồ đường K, 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” (mua) hoặc “SELL” (bán).

Chức năng tính toán

  • Hàm calculateKLineArea: Hàm này được sử dụng để tính diện tích giữa giá và đường trung bình động trong một khoảng thời gian trên biểu đồ nến và trả về giá trị diện tích, chỉ số nến của lần giao cắt cuối cùng và chỉ số nến của lần chéo xuống. Những giá trị này được sử dụng trong các quyết định tiếp theo để xác định thời điểm mua và bán.

Chức năng vòng lặp chính

  • Hàm onTick: Đây là hàm thực thi chiến lược chính. Sau đây là các hoạt động trong hàm:

a. Lấy 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 thì ghi lại trạng thái và trả về.

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

c. Lấy thông tin diện tích, chỉ mục đường K chéo lên cuối cùng và chỉ mục đường K chéo xuống cuối cùng từ areaInfo.

d. Sử dụng đối tượng biểu đồ nến c để vẽ các đường nến và chỉ báo, sau đó tô chúng bằng các màu khác nhau theo mối quan hệ giữa giá và đường trung bình động.

e. Xác định thời điểm mua và bán dựa trên các điều kiện:

Nếu tradeState là “NULL”, diện tích nhỏ hơn -threshold và giá trị nến KDJ lớn hơn 70, thì lệnh mua sẽ được thực hiện. Nếu tradeState là “NULL”, diện tích lớn hơn ngưỡng và giá trị nến KDJ nhỏ hơn 30, hãy thực hiện lệnh bán. f. Đặt điều kiện dừng lỗ và chốt lời và đóng vị thế nếu đáp ứng được các điều kiện:

Nếu ở trạng thái mua, vị thế sẽ được đóng khi giá thấp hơn giá đóng cửa của ngày giao dịch trước đó trừ đi ATR của ngày hôm trước. Nếu đang ở trạng thái bán, vị thế sẽ được đóng khi giá cao hơn giá đóng cửa của ngày giao dịch trước đó cộng với ATR của ngày hôm trước. Chức năng chính: Đây là điểm vào thực thi chính, kiểm tra xem tên trao đổi có chứa “_“Futures”, nếu được bao gồm, sẽ đưa ra một ngoại lệ, nếu không sẽ vào vòng lặp vô hạn, thực thi hàm onTick trong mỗi vòng lặp và chuyển sang chế độ ngủ trong 1 giây.

Nhìn chung, chiến lược này chủ yếu dựa vào biểu đồ K-line và các chỉ báo kỹ thuật để đưa ra quyết định mua và bán, đồng thời sử dụng các chiến lược cắt lỗ và chốt lời để quản lý rủi ro. Xin lưu ý rằng đây chỉ là một chiến lược ví dụ và việc sử dụng thực tế cần được điều chỉnh và tối ưu hóa dựa trên điều kiện thị trường và nhu cầu cụ thể.

Mô hình này có thể dễ dàng triển khai bằng JavaScript trên FMZ.COM mà không cần sử dụng nhiều dòng mã. Và biểu diễn đồ họa của diện tích đường K có thể dễ dàng thực hiện được bằng cách sử dụng hàm KLineChart. Chiến lược này được thiết kế cho thị trường giao ngay tiền điện tử và sử dụng mẫu “Thư viện giao dịch giao ngay tiền kỹ thuật số”. Nó sử dụng các chức năng được đóng gói trong mẫu để đặt lệnh, cũng rất đơn giản, dễ sử dụng và dễ hiểu.

Kiểm tra lại chiến lược

Ý tưởng giao dịch thay thế - Chiến lược giao dịch theo vùng K-line

Ý tưởng giao dịch thay thế - Chiến lược giao dịch theo vùng K-line

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

Ý tưởng giao dịch thay thế - Chiến lược giao dịch theo vùng K-line

Thông qua chiến lược này, ngoài việc học được ý tưởng giao dịch thay thế, chúng ta còn học cách vẽ biểu đồ; biểu diễn vùng được bao quanh bởi đường K và đường trung bình động; vẽ chỉ báo KDJ, v.v.

Tóm tắt

Chiến lược vùng K-line là chiến lược giao dịch dựa trên biên độ xu hướng giá và chỉ báo 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 vùng giữa đường K-line và đường trung bình động và chuyển đổi tâm lý mua và bán. Mặc dù có một số rủi ro nhất định, nhưng thông qua việc tối ưu hóa và điều chỉnh liên tục, chiến lược này có thể cung cấp một công cụ giao dịch mạnh mẽ giúp các nhà giao dịch ứng phó tốt hơn với những biến động của thị trường. Điều quan trọng là các nhà giao dịch phải linh hoạt điều chỉnh các thông số và quy tắc của chiến lược theo tình hình cụ thể và điều kiện thị trường để đạt được hiệu suất giao dịch tốt hơn.