オルタナティブ・トレーディング・アイディア--K線エリア・トレーディング・戦略

作者: リン・ハーンリディア, 作成日:2023年11月06日 13:33:17, 更新日:2024年1月01日 12:20:19

img

この記事では,このコンセプトを探索し,その脚本を実装しようとします.

K線地域戦略の主な考え

K線エリア戦略は,価格K線と移動平均線の間のエリア関係に基づいた取引戦略である.その主なアイデアは,価格動向の大きさと変化,および購入および販売の感情の変化を分析することによって,株価の潜在的な傾向を予測することであり,それによってポジションを開設し退場する時期を決定することである.この戦略は,K線と移動平均線との間のエリア,およびKDJ指標からの値に依存し,長と短の取引信号を生成する.

K線地域戦略の原則

Kラインの面積は,価格Kラインと移動平均の間の空間領域を指す.各バーの閉値から移動平均値を引いて合計することによって計算される.長期間にわたって価格が大きく上昇すると,Kラインエリアは大きくなり,不安定な市場や変動逆転後にKラインエリアは小さくなります.上昇傾向が大きくなり,長く続くにつれて,対応するKラインエリアも増加します.したがって,逆転の確率も増加します.さらに伸びるとより大きな力で反弹するスプリングのようなものです.したがって,このKラインエリアの値を設定することで,価格がピークに達し,逆転する可能性が高いことを示すことができます.

傾向の逆転をさらに確認するために,購入または販売の感情の変化を決定するのに役立つ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の後ろのストップ・ロストと収益

コード実施

// 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)
    }
}

戦略の論理は とてもシンプルです

  1. まず,以下を含むいくつかのグローバル変数とパラメータが定義されます.

戦略パラメータ

  • maPeriod: 移動平均の期間.
  • 取引先: 取引先の取引先の取引先の取引先です.
  • 量:各取引の量.

グローバル変数

  • c: K線図のオブジェクトで,図を描くのに使用されます.
  • openPrice: オープニング価格を記録する.
  • tradeState: 取引状態を記録し,これはNULL (空きポジション),BUYまたはSELLである可能性があります.

計算関数

  • calculateKLineArea関数: K線グラフ上の価格と移動平均線間の面積を一定の期間で計算するために使用され,面積値,最後の上向きのK線横断のインデックス,および最後の下向きのK線横断のインデックスを返します.これらの値は,購入や売却のタイミングを決定するために後の決定に使用されます.

メインループ機能

  • この機能の内にある操作は以下の通りです.

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

    移動平均線maとATR指標atr,およびKDJ指標を計算する.

    c. areaInfo からエリア情報,最後のクロスオーバーKラインインデックス,そして最後のクロスアンダーKラインインデックスを取得します.

    d.K線チャートオブジェクトcを使用して,K線とインディケーター線を描き,移動平均線との価格の関係に基づいて異なる色を記入します.

    e. 条件に従って買い物または販売のタイミングを決定する.

    tradeStateが NULLで,エリアが - 値を下回り,KDJの K値が 70を超えると,購入操作を実行します. tradeStateがNULLで,エリアが値を超え,KDJのK値は30未満なら,セール操作を実行する. f.ストップ・ロストと得益条件を設定する.これらの条件が満たされている場合,ポジションを閉じる.

    価格が最後の取引日の閉店価格マイナス前日のATR (平均真差) 以下の値を下回ると,閉店します. 売り状態である場合,価格が最後の取引日の閉店価格と前日のATR (平均真差) を上回ると,閉店します.

    main function: これは主実行入力点として機能します. Exchange name が _Futures を含んでいるかどうかをチェックします.そうであれば,例外が投げられます.そうでなければ, onTick 関数が毎秒実行される無限ループに入ります.

簡単に言うと,この戦略は,主にK線チャートと技術指標に頼り,購入または売却の決定を下す一方で,リスクを管理するためにストップ・ロスト&テイク・プロフィート戦略も採用しています.これは,実際の使用中に市場の状況と特定の要件に応じて調整および最適化する必要がある例戦略としてのみ使用されていることに注意してください.

そのままFMZ.COMこのモデルには,KLineChartの機能によるK線チャート領域のグラフィカル表現も簡単に達成できました. 戦略デザインは,テンプレート内のカプセル化された機能を通じて注文を入れるためのデジタル通貨スポット取引ライブラリテンプレートを活用することで,仮想通貨スポットマーケットに配慮しています.

戦略 バックテスト

img

img

バックテスト期間をランダムに選択しました.私はお金を失うことはありませんでしたが,継続的に利益も蓄積しませんでした. 引き下げ問題はかなり重要です. 戦略の最適化のための他の方向性と余地があります. 興味のある人は戦略をアップグレードしようとします.

img img

K線と移動平均線に囲まれた面積を表現し,KDJ指標をプロットするなど.

概要

K線エリア戦略は,価格傾向の大きさとKDJ指標に基づいた取引戦略である.K線と移動平均の間の領域,および購入および販売の感情の変化を分析することによって,トレーダーが市場の傾向を予測するのに役立ちます.特定のリスクにもかかわらず,この戦略は継続的な最適化と調整を通じて強力な取引ツールを提供することができ,トレーダーが市場の変動によりうまく対処するのを助けます.さらに,トレーダーはよりよい取引パフォーマンスを達成するために,特定の状況と市場の条件に応じて戦略のパラメータとルールを柔軟に調整する必要があります.


もっと