avatar of 发明者量化-小小梦 发明者量化-小小梦
フォロー ダイレクトメッセージ
4
フォロー
1271
フォロワー

代替取引アイデア - K ライン エリア取引戦略

作成日:: 2023-11-03 17:12:42, 更新日:: 2024-11-08 09:08:54
comments   0
hits   1617

代替取引アイデア - K ライン エリア取引戦略

あまり信頼性が高くない取引アイデアである K ライン エリア取引戦略を検討しながら、この記事ではこのアイデアについて説明し、このスクリプトを実装してみます。

Kラインエリア戦略の主な考え方

K ライン エリア戦略は、価格 K ラインと移動平均のエリア関係に基づいた取引戦略です。その主な考え方は、価格トレンドの振幅と変化、および売買感情の転換を分析することによって株価の可能性のあるトレンドを予測し、ポジションの開設と終了のタイミングを決定することです。この戦略は、ローソク足と移動平均の間の領域、および KDJ インジケーターの値に基づいて、ロングおよびショート取引シグナルを生成します。

Kラインエリア戦略の原則

ローソク足エリアとは、価格ローソク足と移動平均線の間のスペースを指し、各バーの終値から移動平均値を差し引いて合計することで計算されます。価格が長期間にわたって大きく上昇すると、Kラインの面積は大きくなりますが、ボラティリティの高い市場やボラティリティ後の反転では、Kラインの面積は小さくなります。 。 「すべては反対の極端に向かう」という原則によれば、上昇傾向が大きく、時間が長いほど、対応するKライン領域は大きくなり、バネのように反転の確率が高くなります。伸ばすほど、反発力は大きくなります。そのため、K ライン領域に閾値が設定され、この閾値に達すると価格トレンドが完成し、反転する可能性が高くなります。

トレンドが反転しようとしていることをさらに確認するために、売買センチメントの転換を判断する KDJ インジケーターが導入されています。この戦略のしきい値と KDJ インジケーター値の設定は、特定の状況やニーズに応じて調整でき、戦略の精度を高めることができます。

Kラインエリア戦略のメリット

K ライン エリア戦略の利点は、価格トレンドの振幅と変化、および売買センチメントの変換を組み合わせて、比較的完全な定量取引戦略を提供することです。その利点は次のとおりです。

  • トレンド反転の可能性を識別するためのシンプルで直感的な方法を提供し、トレーダーが市場のトレンドをよりよく把握するのに役立ちます。
  • K ライン エリアと KDJ インジケーターの組み合わせにより、戦略の信頼性と精度が向上します。
  • 柔軟性が高く、市場の状況に応じてパラメータを調整し、さまざまな取引ニーズに対応できます。

Kライン地域戦略のリスク

ローソク足エリア戦略には一定の利点がありますが、次のようなリスクもあります。

  • 閾値の設定にはある程度の経験と調整が必要になる場合があり、適切に設定しないと市場動向の誤判断につながる可能性があります。
  • KDJ インジケーターの精度は市場の変動やノイズの影響を受け、誤ったシグナルが発生する可能性があります。
  • 戦略のパフォーマンスは市場状況によって異なる場合があり、継続的な最適化と調整が必要です。

Kラインエリア戦略の最適化の方向性

K ラインエリア戦略を最適化するには、次の方向性を検討できます。

  • パラメータの最適化: さまざまな市場状況や取引ニーズに合わせて、しきい値と KDJ インジケーターのパラメータを継続的に調整および最適化します。
  • リスク管理: 損失のリスクを軽減するために、ストップロスやテイクプロフィットルールなどの効果的なリスク管理戦略を実装します。
  • マルチ戦略の組み合わせ: K ライン エリア戦略を他の戦略と組み合わせて、包括的な取引戦略のパフォーマンスを向上させます。
  • リアルタイムの監視と調整: 戦略のパフォーマンスを定期的に監視し、実際の状況に基づいて調整と改善を行います。

JavaScriptを使用してこの戦略を実装する

  • ローソク足の面積を計算する

  • ロングポジションを開くためのシグナル:

(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: 移動平均の期間。
  • しきい値: いつ買うか、いつ売るかを決定するために使用されるしきい値。
  • 金額: 各取引の金額。

グローバル変数

  • c: チャートを描画するために使用される K ライン チャート オブジェクト。
  • openPrice: 始値を記録します。
  • tradeState: トランザクションのステータスを記録します。ステータスは、「NULL」(空ポジション)、「BUY」(購入)、または「SELL」(販売) になります。

計算機能

  • calculateKLineArea関数:この関数は、ローソク足チャート上の一定期間の価格と移動平均の間の面積を計算し、面積値、最後の上向き交差のローソク足インデックス、およびローソク足インデックスを返します。最後のクロスダウンクロッシング。これらの値は、その後の売買のタイミングを決定する際に使用されます。

メインループ関数

  • onTick 関数: これは主な戦略実行関数です。関数内の操作は次のとおりです。

a. 最新の K ライン データを取得し、K ラインの数が maPeriod 未満でないことを確認します。そうでない場合は、ステータスを記録して戻ります。

b. 移動平均 ma と ATR インジケーター atr、および KDJ インジケーターを計算します。

c. areaInfo からエリア情報、最後のクロスアップ K ライン インデックス、最後のクロスダウン K ライン インデックスを取得します。

d. ローソク足チャート オブジェクト c を使用してローソク足とインジケーターの線を描画し、価格と移動平均の関係に応じて異なる色で塗りつぶします。

e. 状況に応じて売買のタイミングを決定する:

tradeState が「NULL」で、エリアが -threshold 未満で、KDJ ローソク足値が 70 より大きい場合、購入操作が実行されます。 tradeState が「NULL」で、領域がしきい値より大きく、KDJ ローソク足値が 30 未満の場合、売り操作を実行します。 f. ストップロスとテイクプロフィットの条件を設定し、条件が満たされたらポジションをクローズします。

買いの状態であれば、前営業日の終値から前日のATRを引いた価格よりも低い場合にポジションを決済します。 売り状態の場合は、前営業日の終値+前日のATRよりも価格が高ければポジションを決済します。 メイン関数: これはメインの実行エントリポイントであり、交換名に「_「Futures」が含まれている場合は例外をスローし、含まれていない場合は無限ループに入り、各ループで onTick 関数を実行して 1 秒間スリープします。

一般的に、この戦略では、主に K ライン チャートとテクニカル指標を使用して売買の決定を行い、ストップロスとテイクプロフィット戦略を使用してリスクを管理します。これは単なる戦略例であり、実際の使用は市場の状況や特定のニーズに基づいて調整および最適化する必要があることに注意してください。

このモデルは、多くのコード行を使用せずに、FMZ.COM で JavaScript を使用して簡単に実装されました。 K ライン領域のグラフィカル表現は、KLineChart 関数を使用して簡単に実現できます。この戦略は暗号通貨スポット市場向けに設計されており、「デジタル通貨スポット取引ライブラリ」テンプレートを使用します。テンプレートにカプセル化された関数を使用して注文を出すことも非常に簡単で、使いやすく、理解しやすいです。

戦略バックテスト

代替取引アイデア - K ライン エリア取引戦略

代替取引アイデア - K ライン エリア取引戦略

バックテスト期間をランダムに選択しました。損失は出ませんでしたが、継続的に利益を積み上げることはできなかったため、ドローダウンの問題は依然としてかなり大きかったです。この戦略には、他の最適化の方向性と余地があるはずです。興味のある方は、この戦略をアップグレードしてみてください。

代替取引アイデア - K ライン エリア取引戦略

この戦略を通じて、より代替的な取引アイデアを学ぶことに加えて、チャートを描く方法、K ラインと移動平均で囲まれた領域を表す方法、KDJ インジケーターを描く方法なども学びました。

要約する

K ライン エリア戦略は、価格トレンドの振幅と KDJ インジケーターに基づいた取引戦略です。K ラインと移動平均の間のエリアと、売買感情の変換を分析することで、トレーダーが市場トレンドを予測するのに役立ちます。一定のリスクはあるものの、継続的な最適化と調整を通じて、この戦略はトレーダーが市場の変動にうまく対処するのに役立つ強力な取引ツールを提供できます。トレーダーは、より良い取引パフォーマンスを実現するために、特定の状況や市場状況に応じて戦略のパラメータとルールを柔軟に調整することが重要です。