믿을 수 없는 거래 아이디어를 살펴보면, 이 기사에서는 K-라인 영역 거래 전략을 살펴보고 그 시나리오를 구현하려고 노력할 것입니다.
K-라인 영역 전략 (K-line area strategy) 은 가격 K-라인과 이동 평균 사이의 영역 관계를 기반으로 하는 거래 전략이다. 주요 아이디어는 가격 트렌드의 크기와 변화, 구매 및 판매 정서 변화 등을 분석하여 주식 가격의 가능한 추세를 예측하여 포지션 개설 및 출시를 결정하는 것입니다. 이 전략은 K-라인과 이동 평균 사이의 영역과 KDJ 지표의 값에 의존하여 긴 및 짧은 거래 신호를 생성합니다.
K-라인 영역은 가격 K-라인과 이동 평균 사이의 공간 영역을 가리키며, 각 막대기 폐쇄 가격에서 이동 평균 값을 빼고 합쳐 계산된다. 장기간에 걸쳐 가격이 크게 상승하면 K-라인 영역은 커질 것이고, 변동성 시장 또는 변동성 반전 후 K-라인 영역은 작을 것이다. 상승 추세가 커지고 지속될수록 그에 해당하는 K-라인 영역도 커지며, 따라서 반전 가능성이 증가한다.
임박한 트렌드 전환을 추가로 확인하기 위해 구매 또는 판매 감정의 변화를 결정하는 데 도움이되는 KDJ 지표의 사용을 도입합니다. 이러한 지표의 전략의 임계와 값은 정확성을 높이기 위해 특정 상황과 필요에 따라 조정 될 수 있습니다.
K-라인 영역 전략의 장점은 가격 동향의 규모와 변화, 그리고 구매 및 판매 정서의 변화의 조합으로 비교적 완전한 양적 거래 전략을 제공합니다. 그것의 장점은 다음을 포함합니다.
K-선 지역 전략은 몇 가지 장점을 가지고 있지만, 다음과 같은 몇 가지 위험을 초래합니다.
K-라인 영역 전략을 최적화하려면 다음 방향을 고려하십시오.
K-선 영역을 계산합니다.
긴 위치 개시 신호:
(1) 하향 추세의 K-선 영역은 한계를 도달하면 사전에 설정할 수 있습니다.
(2) KDJ 지표 값이 80보다 크다.
짧은 포지션 개시 신호:
(1) 상승 추세의
(2) KDJ 지표 값은 20보다 작습니다.
긴/단기 포지션의 출구: ATR 후속 스톱 손실 및 수익을 취합니다.
코드 실행
// 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)
}
}
전략 논리는 매우 간단합니다.
전략 매개 변수
글로벌 변수
계산 함수
메인 루프 기능
onTick 함수: 주요 전략 실행 함수입니다. 함수 내의 동작은 다음과 같습니다.
a. 최신 K 라인 데이터를 얻고 K 라인 수가 maPeriod보다 적지 않도록 하고, 그렇지 않으면 상태를 기록하고 반환합니다.
b. 이동평균선 ma와 ATR 지표 atr, 그리고 KDJ 지표를 계산한다.
c. 지역 정보에서 지역 정보를 얻으십시오, 마지막 교차 K-라인 인덱스, 마지막 교차 K-라인 인덱스.
d. K-라인 차트 객체 c를 사용하여 K-라인과 지표 라인을 그리면서 이동 평균 라인과 가격
e. 조건에 따라 구매 또는 판매 시기를 결정합니다.
트레이드 스테이트가
만약 구매 상태라면, 마지막 거래일의 폐업 가격 미만 전날의 ATR (Average True Range) 이하로 떨어지면, 포지션을 닫습니다. 판매 상태라면, 가격이 마지막 거래 날의 종료 가격과 전날의 ATR (Average True Range) 보다 상승하면, 포지션을 닫습니다.
main function: 이것은 주요 실행 입점으로 사용됩니다. 교환 이름에
한마디로,이 전략은 주로 구매 또는 판매 결정을 내리기 위해 K-라인 차트 및 기술적 인 지표에 의존하며 위험을 관리하기 위해 스톱 로스 및 영업 전략을 사용합니다. 이것은 실제 사용 중 시장 상황 및 특정 요구 사항에 따라 조정 및 최적화되어야하는 예 전략으로만 사용됩니다.
시작FMZ.COM, 자바스크립트 언어를 사용하여 많은 코드 라인이 필요하지 않았으며, 대신이 모델을 쉽게 구현했습니다. KLineChart 함수의 도움으로 K-라인 차트 영역의 그래픽 표현도 쉽게 달성되었습니다. 전략 디자인은
저는 무작위로 백테스팅 기간을 선택했습니다. 돈을 잃지 않았지만, 지속적으로 수익을 축적하지도 못했습니다. 그리고 인출 문제는 상당히 중요합니다. 전략에 대한 다른 방향과 최적화 공간이 있어야합니다. 관심있는 사람들은 전략을 업그레이드하려고 할 수 있습니다.
이 전략을 통해, 우리는 매우 비정상적인 거래 아이디어를 배웠을 뿐만 아니라, 도표를 그리는 방법을 배웠습니다. K-선과 이동 평균선으로 둘러싸인 영역을 표현하고, KDJ 지표를 그리는 방법 등을 배웠습니다.
K-라인 영역 전략은 가격 트렌드 크기와 KDJ 지표에 기반한 거래 전략이다. K-라인과 이동 평균 사이의 영역을 분석하고 구매 및 판매 정서 변화뿐만 아니라 시장 추세를 예측하는 데 도움이 된다. 특정 위험에도 불구하고, 이 전략은 지속적인 최적화와 조정을 통해 강력한 거래 도구를 제공하여 거래자가 시장 변동에 더 잘 대처할 수 있도록 도와준다. 또한, 거래자는 더 나은 거래 성과를 달성하기 위해 특정 상황과 시장 조건에 따라 전략의 매개 변수와 규칙을 유연하게 조정해야 한다.