이 글에서는 K 라인 영역 거래 전략에 대한 믿을 수 없는 거래 아이디어를 살펴보고, 이 아이디어를 함께 탐구하고, 이 스크립트를 실행하려고 노력합니다.
K선 면적 전략 (K-line area strategy) 은 가격 K선과 평균선 사이의 면적 관계에 기반한 거래 전략이다. 그것의 주요 아이디어는 가격 트렌드의 폭과 변화를 분석하고, 매매 정서의 전환을 통해 주식 시장의 가격의 가능한 움직임을 예측하여 입상 및 출시를 결정하는 것이다. 이 전략은 K선과 평균선 사이의 면적, 그리고 KDJ 지표의 수치에 의존하여 멀티 헤드 및 빈 헤드 거래 신호를 생성한다.
K선 면적은 가격의 K선과 평선 사이의 공간 면적을 말하며, 각 바의 폐쇄값을 평균값에서 빼서 합을 계산한다. K선 면적은 가격 상승 추세의 폭이 크면, 시간이 길면 커지고, 불안한 시장이나 불안한 후 반전할 때 K선 면적은 작다. 동물의 필연적 피드백 원칙에 따르면 상승 추세가 커질수록 시간이 길어질수록 해당 K선 면적이 커질수록 반전의 확률이 커지며, 리본처럼 길게 당겨지고, 반력이 커진다. 따라서, K선 면적의 한계값을 설정하면, 이 리본이 도달하면 가격이 추세를 끝내고 반전할 가능성이 높다.
트렌드 전환이 임박하다는 것을 더 확인하기 위해, 사매 정서 전환을 판단하기 위해 KDJ 지표를 도입한다. 이 전략의 문턱값과 KDJ 지표값의 설정은 구체적인 상황과 필요에 따라 조정될 수 있어 전략의 정확성을 높일 수 있다.
K선 면적 전략의 장점은 가격 트렌드의 크기와 변화와 매수 정서의 전환을 결합하여 비교적 완전한 양적 거래 전략을 제공하는 것입니다. 이의 장점은 다음과 같습니다.
K-선 면적 전략은 몇 가지 장점이 있지만 다음과 같은 몇 가지 위험 요소가 있습니다.
K선 면적 전략을 최적화하기 위해 다음과 같은 방향을 고려할 수 있습니다.
K선 넓이를 계산합니다.
이 자리에서,
(1) 하락 추세의 K선 부피
(2) KDJ 지표 값이 80보다 크다
(1) 상승 추세의 K선 부피
(2) KDJ 지표 값은 20보다 작습니다.
멀티 헤드 / 빈 헤드 출전: ATR 추적 중단 손실 중단
코드 구현
// 参数
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)
}
}
이 전략의 논리는 매우 간단합니다.
1, 먼저, 몇 가지 글로벌 변수와 매개 변수를 정의합니다.
전략 매개 변수
글로벌 변수
계산 함수
주 회로 함수
onTick 함수: 이것은 주요 정책 실행 함수이며 함수 안의 동작은 다음과 같습니다.
a. 최신 K선 데이터를 획득하고, maPeriod보다 작은 K선 수가 없도록 하여, 그렇지 않으면 상태를 기록하고 반환한다.
b. 이동평균 ma와 ATR 지표 atr, 그리고 KDJ 지표를 계산한다.
c. areaInfo에서 영역 정보를 얻으며, 마지막으로 교차한 K 문자열 인덱스와 마지막으로 교차한 K 문자열 인덱스를 얻는다.
d. K 라인 그래프 객체 c를 사용하여 K 라인과 지표 라인을 그리며, 동시에 가격과 이동 평균의 관계에 따라 다른 색상을 채웁니다.
e. 조건에 따라 구매 및 판매 시기를 판단:
만약 tradeState가 NULL 인데, 면적이 -threshold보다 작고 KDJ의 K선 값이 70보다 크다면, 구매 동작을 수행한다. 만약 tradeState가 NULL 인데, 영역이 임계보다 크고 KDJ의 K선 값이 30보다 작다면, 팔기 동작을 실행한다. f. 중지 손실 및 중단 유출 조건을 설정하고, 조건이 충족되면 평형:
만약 구매 상태라면, 가격이 전날 거래일의 종식 가격 미만 전날의 ATR보다 낮을 때 동결된다. 판매 상태라면, 가격이 전날 거래일의 종료 가격과 전날의 ATR보다 높을 때 동결된다. main 함수: 이것은 주요 실행 입력이며, 거래소 이름이?? _Futures?? 을 포함하는지 확인하고, 포함되면 이상을 던지거나 무한한 루프로 들어가 각 루프에서 onTick 함수를 실행하고 1초 휴식을 취합니다.
전반적으로, 이 전략은 주로 K선 차트와 기술 지표에 의존하여 매매 결정을 내리고, 동시에 Stop Loss 및 Stop Pull 전략을 사용하여 위험을 관리합니다. 참고로, 이것은 단지 예제 전략이며 실제 사용 시 시장 상황과 특정 요구에 따라 조정 및 최적화 할 필요가 있습니다.
在FMZ.COM上使用JavaScript语言没有用多少行代码,很简单的就实现了这个模型。并且使用KLineChart函数很容易实现了K线面积的图形表示。策略设计用于加密货币现货市场,使用了「数字货币现货交易类库」模板,使用模板封装的函数下单,也是非常简单易用、易懂。
재검토 기간을 임의로 선택하여 손실이 없지만 지속적으로 수익을 쌓지 않은 경우, 회귀 문제는 상대적으로 크다. 이 전략에 대한 다른 방향과 최적화 공간이 있어야합니다. 관심있는 사람은이 전략을 업그레이드 할 수 있습니다.
이 전략으로 우리는 비교적 다른 거래 생각을 배우는 것 외에도, 그래프를 그리는 방법을 배웠습니다. K선과 평선으로 둘러싸인 면적을 나타내는 방법; KDJ 지표를 그리는 방법, 등등.
K선 면적 전략은 가격 트렌드 폭과 KDJ 지표에 기반한 거래 전략으로, K선과 평균선 사이의 면적과 매매 정서의 전환을 분석함으로써 거래자가 시장 움직임을 예측하는 데 도움이 된다. 특정 위험이 있음에도 불구하고, 지속적인 최적화와 조정을 통해, 이 전략은 거래자가 시장 변동에 더 잘 대처할 수 있도록 도와주는 강력한 거래 도구를 제공할 수 있다. 중요한 것은, 거래자는 특정 상황과 시장 조건에 따라 전략의 매개 변수와 규칙을 유연하게 조정하여 더 나은 거래 성과를 낼 수 있다.