리소스 로딩... 로딩...

대안 거래 아이디어 - K 라인 거래 전략

저자:발명가들의 수량화 - 작은 꿈, 창작: 2023-11-03 17:12:42, 업데이트: 2024-11-08 09:08:54

img

이 글에서는 K 라인 영역 거래 전략에 대한 믿을 수 없는 거래 아이디어를 살펴보고, 이 아이디어를 함께 탐구하고, 이 스크립트를 실행하려고 노력합니다.

K선 면적 전략의 주요 아이디어

K선 면적 전략 (K-line area strategy) 은 가격 K선과 평균선 사이의 면적 관계에 기반한 거래 전략이다. 그것의 주요 아이디어는 가격 트렌드의 폭과 변화를 분석하고, 매매 정서의 전환을 통해 주식 시장의 가격의 가능한 움직임을 예측하여 입상 및 출시를 결정하는 것이다. 이 전략은 K선과 평균선 사이의 면적, 그리고 KDJ 지표의 수치에 의존하여 멀티 헤드 및 빈 헤드 거래 신호를 생성한다.

K선 면적 전략의 원리

K선 면적은 가격의 K선과 평선 사이의 공간 면적을 말하며, 각 바의 폐쇄값을 평균값에서 빼서 합을 계산한다. K선 면적은 가격 상승 추세의 폭이 크면, 시간이 길면 커지고, 불안한 시장이나 불안한 후 반전할 때 K선 면적은 작다. 동물의 필연적 피드백 원칙에 따르면 상승 추세가 커질수록 시간이 길어질수록 해당 K선 면적이 커질수록 반전의 확률이 커지며, 리본처럼 길게 당겨지고, 반력이 커진다. 따라서, K선 면적의 한계값을 설정하면, 이 리본이 도달하면 가격이 추세를 끝내고 반전할 가능성이 높다.

트렌드 전환이 임박하다는 것을 더 확인하기 위해, 사매 정서 전환을 판단하기 위해 KDJ 지표를 도입한다. 이 전략의 문턱값과 KDJ 지표값의 설정은 구체적인 상황과 필요에 따라 조정될 수 있어 전략의 정확성을 높일 수 있다.

K선 면적 전략의 장점

K선 면적 전략의 장점은 가격 트렌드의 크기와 변화와 매수 정서의 전환을 결합하여 비교적 완전한 양적 거래 전략을 제공하는 것입니다. 이의 장점은 다음과 같습니다.

  • 트렌드 리버션 가능성을 식별하는 간단하고 직관적인 방법을 제공하여 거래자가 시장 움직임을 더 잘 파악할 수 있도록 도와줍니다.
  • K선 면적과 KDJ 지표의 조합을 활용하여 전략의 신뢰성과 정확성을 높였다.
  • 높은 유연성, 시장 상황에 따라 매개 변수를 조정하여 다른 거래 요구를 충족시킬 수 있습니다.

K-선 면적 전략의 위험

K-선 면적 전략은 몇 가지 장점이 있지만 다음과 같은 몇 가지 위험 요소가 있습니다.

  • 부적절하게 설정되면 시장의 움직임을 잘못 판단할 수 있는 약점 설정은 약간의 경험과 조정이 필요할 수 있다.
  • KDJ 지표의 정확성은 시장 변동과 소음에 영향을 받으며 잘못된 신호가 발생할 수 있습니다.
  • 전략의 성능은 다른 시장 조건에 따라 달라질 수 있으며, 지속적인 최적화와 조정이 필요합니다.

K선 면적 전략의 최적화 방향

K선 면적 전략을 최적화하기 위해 다음과 같은 방향을 고려할 수 있습니다.

  • 매개 변수 최적화: 시장 상황과 거래 요구 사항에 따라 기준값과 KDJ 지표의 매개 변수를 지속적으로 조정하고 최적화한다.
  • 위험 관리: 손실 위험을 줄이기 위해 손해를 막는 규칙과 손해를 막는 규칙을 포함한 효과적인 위험 관리 전략을 실행하십시오.
  • 멀티 전략 조합: 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, 먼저, 몇 가지 글로벌 변수와 매개 변수를 정의합니다.

전략 매개 변수

  • maPeriod: 이동 평균의 주기.
  • threshold: 구매 또는 판매 시점을 판단하는 기준값.
  • amount: 거래 당 거래량.

글로벌 변수

  • c: K 라인 그래프 객체, 그래프를 그리기 위해 쓰인다.
  • 오픈프라이스: 오픈프라이스를 기록합니다.
  • 트레이드 스테이트: 거래 상태를 기록합니다. "NULL" (무용) 또는 "SELL" (판매) 이 가능합니다.

계산 함수

  • calculateKLineArea 함수: 이 함수는 K 라인 차트에서 일정 시간 동안 가격과 이동 평균 사이의 면적을 계산하고, 면적 값, 마지막으로 교차한 K 라인 인덱스 및 마지막으로 교차한 K 라인 인덱스 등을 반환합니다. 이러한 값은 후속 결정에서 구매 및 판매 시기를 결정하는 데 사용됩니다.

주 회로 함수

  • 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线面积的图形表示。策略设计用于加密货币现货市场,使用了「数字货币现货交易类库」模板,使用模板封装的函数下单,也是非常简单易用、易懂。

전략 재검토

img

img

재검토 기간을 임의로 선택하여 손실이 없지만 지속적으로 수익을 쌓지 않은 경우, 회귀 문제는 상대적으로 크다. 이 전략에 대한 다른 방향과 최적화 공간이 있어야합니다. 관심있는 사람은이 전략을 업그레이드 할 수 있습니다.

img

이 전략으로 우리는 비교적 다른 거래 생각을 배우는 것 외에도, 그래프를 그리는 방법을 배웠습니다. K선과 평선으로 둘러싸인 면적을 나타내는 방법; KDJ 지표를 그리는 방법, 등등.

요약

K선 면적 전략은 가격 트렌드 폭과 KDJ 지표에 기반한 거래 전략으로, K선과 평균선 사이의 면적과 매매 정서의 전환을 분석함으로써 거래자가 시장 움직임을 예측하는 데 도움이 된다. 특정 위험이 있음에도 불구하고, 지속적인 최적화와 조정을 통해, 이 전략은 거래자가 시장 변동에 더 잘 대처할 수 있도록 도와주는 강력한 거래 도구를 제공할 수 있다. 중요한 것은, 거래자는 특정 상황과 시장 조건에 따라 전략의 매개 변수와 규칙을 유연하게 조정하여 더 나은 거래 성과를 낼 수 있다.


더 많은