Nhìn vào một ý tưởng giao dịch không đáng tin cậy
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.
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
Để 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.
Ư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.
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:
Để 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í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:
Các thông số chiến lược
Các biến số toàn cầu
Tính toán hàm
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á
e. Xác định thời gian mua hoặc bán theo các điều kiện:
Nếu tradeState là
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
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.
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.
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.
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.