資源の読み込みに... 荷物...

K線面積の取引戦略

作者: リン・ハーン発明者 量化 - 微かな夢作成日:2023年11月03日 17:12:42 更新日:2024年11月08日 09:08:54 更新日:2020年11月08日 09:08:54 更新日:2020年11月08日 更新日:2020年11月08日 更新日:2020年11月08日 更新日:2020年11月08日 更新日:2020年11月08日 更新日:2020年11月08日 更新日:2020年11月08日

img

信頼性の低い取引のアイデアを見てください. この記事では,このアイデアと,この脚本を実行しようとします.

K線面積戦略の主なアイデア

K線面積戦略は,価格のK線と平均線との間の面積関係に基づいた取引戦略である.その主な考え方は,価格傾向の幅と変化と,買い物情勢の転換を分析することによって,株式市場の価格の潜在的な動向を予測し,そのために取引開始と終了のタイミングを決定することである.この戦略は,K線と平均線との間の面積,およびKDJ指標の数値に依存し,多頭および空頭取引信号を生成する.

K線面積戦略の原理

K線面積は,価格のK線と均線との間の空間面積を指し,各バーの閉じる価格を均線値から減算し,それから求和を計算する. 価格上昇傾向幅が大きい場合,時間が長い場合,K線面積は大きくなり,波動市場または波動後逆転する場合,K線面積は小さくなります. ペットの反発必然性原理によると,上昇傾向が大きいほど,時間が長いほど,対応するK線面積は大きいほど,逆転の可能性は大きいほど,弾丸のように長く引き上げられ,反発力も大きい.したがって,K線面積の値を設定すると,この値に達すると,価格がトレンドを終了し,逆転する可能性が高くなります.

トレンドの転機が迫っていることをさらに確認するために,買い売り感情の転機を判断するためにKDJ指標を導入する.この戦略の値とKDJ指標の値設定は,特定の状況とニーズに応じて調整され,戦略の正確性を高める.

K線面積戦略の利点

K線面積戦略の利点は,価格傾向の幅と変化と,買い買い感情の転換を組み合わせて,比較的完全な量化取引戦略を提供することにある.その利点は以下のとおりである.

  • 市場動向を把握するのに役立つ,トレンド逆転の可能性を識別するためのシンプルで直感的な方法を提供します.
  • K線面積とKDJ指標の組み合わせにより,戦略の信頼性と精度が向上した.
  • 柔軟性があり,市場状況に応じてパラメータを調整して異なる取引ニーズを満たすことができます.

K線面積戦略のリスク

K線面積戦略には利点があるものの,リスクもあります.

  • 値の設定には,経験と調整が必要であり,間違った設定では市場の動向を誤って判断する可能性があります.
  • KDJ指標の正確さは,市場の波動や騒音の影響を受け,誤った信号が発生する可能性があります.
  • 戦略のパフォーマンスは,異なる市場条件によって変化し,常に最適化と調整が必要である.

K線面積戦略の最適化方向

K線面積戦略を最適化するために,次の方向性を考慮することができます:

  • パラメータ最適化: 市場状況や取引ニーズに合わせて,値とKDJ指標のパラメータを常に調整・最適化する.
  • リスクマネジメント: 損失リスクを低減するために,停止損失と停止損失のルールを含む効果的なリスク管理戦略を実施する.
  • 多戦略組み合わせ:K線領域戦略を他の戦略と組み合わせて,総合取引戦略のパフォーマンスを向上させる.
  • リアルタイムモニタリングと調整:定期的なモニタリング戦略のパフォーマンス,実際の状況に応じて調整と改善.

JavaScript で実行します.

  • 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: 購入または売却のタイミングを判断するために使用される.
  • 取引数: 取引回数.

グローバル変数

  • c:K線グラフオブジェクト,グラフを描くために使用される.
  • オープン価格:オープン価格を記録する.
  • tradeState: NULL (空置) またはBUY (購入) またはSELL (売却) のいずれかの取引状態を記録する.

計算関数

  • calculateKLineArea関数:この関数は,K線グラフ上の価格と移動平均線との間の面積を計算し,面積値,最後に交差したK線索と最後に交差したK線索を返します.これらの値は,購入と売却のタイミングを判断するために,次の決定に使用されます.

主回転関数

  • onTick関数: これは主要なポリシー実行関数で,関数内の操作は以下のとおりです.

    a. 最新のK線データを取得し,K線数が maPeriod よりも少ないことを確認し,そうでなければ状態を記録して返します.

    b. 移動平均 ma と ATR の指標 atr と KDJ の指標を計算する.

    c. areaInfoから面積情報,最後に交差したK文字列のインデックスと最後に交差したK文字列のインデックスを取得する.

    d. K線グラフオブジェクトcを使用して,K線と指標線を描き,同時に価格と移動平均線との関係に応じて異なる色を記入する.

    (e) 条件による購入および売却の時期:

    tradeState が NULL で,面積が -threshold 未満で,KDJ の K 線値が 70 以上の場合,買い操作を実行します. tradeStateが NULL とされ,面積が Threshold よりも大きく,KDJ の K 線値が 30 未満である場合,売る操作を実行します. f. 停止損失と停止損失の条件を設定し,条件が満たされた場合,平衡:

    買取状態の場合,前日のATRをマイナス1日前の取引日の閉じる価格より低い価格で平衡します. 売り切れた状態の場合,前取引日の閉じる価格と前日のATRを上回る価格で平衡します. main関数:これは主実行入力で,取引所の名前に_Futures関数が含まれているかどうかをチェックし,含まれている場合は異常を投げる.そうでなければ無限のループに入ります.各ループでonTick関数を実行し,1秒休眠します.

一般的には,この戦略は,主にK線チャートと技術指標を頼りに買い買い決定を行い,同時に停止損失と停止上昇の戦略を用いてリスクを管理する.ただし,これは例策に過ぎず,実際の使用では,市場状況と特定のニーズに応じて調整と最適化が必要であることを注意してください.

在FMZ.COM上使用JavaScript语言没有用多少行代码,很简单的就实现了这个模型。并且使用KLineChart函数很容易实现了K线面积的图形表示。策略设计用于加密货币现货市场,使用了「数字货币现货交易类库」模板,使用模板封装的函数下单,也是非常简单易用、易懂。

戦略の復習

img

img

ランダムに回見期間を選んで,損をしていないが,継続的に利益も蓄積していない場合,回帰問題は比較的大きい. この戦略には他の最適化方向と空間があるはずです. 興味のある人は,この戦略をアップグレードしてみることができます.

img

この戦略によって,比較的な取引の考え方を学ぶだけでなく,図を描く方法,K線と均線を囲む面積を表す方法,KDJ指標を描く方法なども学びました.

概要

K線面積戦略は,価格傾向幅とKDJ指標に基づいた取引戦略であり,K線と平均線との間の面積と売り込み情勢の転換を分析することで,トレーダーが市場の動きを予測するのを助けます.リスクがあるにもかかわらず,継続的な最適化と調整によって,この戦略は強力な取引ツールを提供し,トレーダーが市場の変動によりうまく対応するのを助けます.重要なことに,トレーダーは,特定の状況と市場の条件に応じて,戦略のパラメータとルールを柔軟に調整して,より良い取引パフォーマンスを実現する必要があります.


もっと