チャイキンマネーフロー(CMF)指標戦略に基づく


作成日: 2024-06-07 17:05:04 最終変更日: 2024-06-07 17:05:04
コピー: 0 クリック数: 625
1
フォロー
1617
フォロワー

チャイキンマネーフロー(CMF)指標戦略に基づく CASHISKING | CASHISKING CMF, EMA, SMA

概要

この戦略は,Chaikinの資金流動 ((CMF) 指数と指数移動平均 ((EMA) をベースに取引シグナルを生成する.まず,指定された周期内のCMF値を計算し,それから,異なる2つの周期のEMAを使用してCMFデータを平らにする.速いEMAが遅いEMAの上に交差すると,購入シグナルを生成し,逆に,売りシグナルを生成する.この戦略は,リスクを制御し,利益をロックするために,ストップとストップの条件も設定する.

戦略原則

  1. 指定期間のChaikinの資金流動 ((CMF) 値を計算する.CMF指標は,価格と取引量データを組み合わせて,資金流入と流出の強さを測定する.
  2. 2つの異なる周期の指数移動平均 ((EMA) を使ってCMFデータを平滑に処理し,高速EMAは短期トレンドを捕捉し,遅いEMAは長期トレンドを決定する.
  3. 速いEMAが遅いEMA上を交差すると,買いの信号が生じ,速いEMAが遅いEMA下を交差すると,売りの信号が生じます.
  4. 取引信号が生成された後,偽信号を避けるために,戦略は2つのK線の確認を待つ.
  5. ストップとストップの条件を設定し,ストップ価格は開設価格の一定パーセント,ストップ価格は開設価格の一定パーセントとする.

優位分析

  1. 価格と取引量データとの組み合わせ:CMF指標は,価格と取引量データを総合的に考慮し,市場資金の流れをより全面的に反映し,より信頼できる取引信号を提供します.
  2. トレンド追跡:異なる周期のEMAを使用することで,戦略は短期的および長期的なトレンドを同時に捉え,異なる市場環境に適応することができます.
  3. シグナル確認:取引シグナルが生成された後,戦略は2つのKラインの確認を待って,偽の信号を効果的にフィルターし,取引の成功率を高めます.
  4. リスクコントロール: ストップ・ロスとストップ・ストップの条件を設定し,単一の取引のリスクを効果的に制御し,既得の利益をロックします.

リスク分析

  1. パラメータ最適化: 戦略のパフォーマンスはCMFとEMAの周期選択に依存し,異なる市場環境は異なるパラメータ設定を必要とする可能性があるため,定期的にパラメータ最適化を行う必要がある.
  2. トレンド識別: 動揺する市場やトレンドの転換点では,戦略は偽の信号を多く生み出し,頻繁に取引をしたり,資金の損失を招く可能性があります.
  3. スキップポイントと取引コスト: 取引頻度がスキップポイントと取引コストを増加させ,戦略の全体的な収益に影響を与える可能性があります.

最適化の方向

  1. 動的調整パラメータ: CMFとEMAの周期パラメータは,市場環境の変化に応じて動的に調整され,異なる市場状態に対応する.
  2. 他の指標を導入する: 傾向認識の正確さと信号の信頼性を向上させるために,他の技術指標,例えば,相対的に強い指数 ((RSI),平均真波幅 ((ATR) などと組み合わせる.
  3. ストップとストップの最適化: リスクと利益のロックを制御するために,市場の変動とリスクの好みに応じてストップとストップの割合を動的に調整します.
  4. ポジション管理に加入:市場の傾向と信号の強さに応じて,ポジションのサイズを動的に調整し,トレンドが明確であればポジションを大きくし,不確実であればポジションを小さくする.

要約する

この戦略は,Chaikinのキャピタルフロー指標と指数移動平均を使用し,価格と取引量データを組み合わせ,トレンド追跡を主観として考え,停止と停止の条件を設定してリスクを制御する.戦略の優点は,多面的な要因を総合的に考慮して,異なる時間尺度のトレンドを捕捉できるという点にあるが,パラメータ設定とトレンド識別に関して,最適化の余地がある.将来,パラメータを動的に調整し,他の指標を導入し,停止を最適化し,ポジション管理方法を追加することで,戦略の安定性と収益性をさらに向上させることができる.

ストラテジーソースコード
/*backtest
start: 2023-06-01 00:00:00
end: 2024-06-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("CASHISKING", overlay=false)

// Kullanıcı girişleri ile parametreler
cmfPeriod = input.int(200, "CMF Periyodu", minval=1)
emaFastPeriod = input.int(80, "Hızlı EMA Periyodu", minval=1)
emaSlowPeriod = input.int(160, "Yavaş EMA Periyodu", minval=1)
stopLossPercent = input.float(3, "Stop Loss Yüzdesi", minval=0.1) / 100
stopGainPercent = input.float(5, "Stop Gain Yüzdesi", minval=0.1) / 100

// CMF hesaplama fonksiyonu
cmfFunc(close, high, low, volume, length) =>
    clv = ((close - low) - (high - close)) / (high - low)
    valid = not na(clv) and not na(volume) and (high != low)
    clv_volume = valid ? clv * volume : na
    sum_clv_volume = ta.sma(clv_volume, length)
    sum_volume = ta.sma(volume, length)
    cmf = sum_volume != 0 ? sum_clv_volume / sum_volume : na
    cmf

// CMF değerlerini hesaplama
cmf = cmfFunc(close, high, low, volume, cmfPeriod)

// EMA hesaplamaları
emaFast = ta.ema(cmf, emaFastPeriod)
emaSlow = ta.ema(cmf, emaSlowPeriod)

// Göstergeleri çiz
plot(emaFast, color=color.blue, title="EMA 23")
plot(emaSlow, color=color.orange, title="EMA 50")

// Alım ve Satım Sinyalleri
crossOverHappened = ta.crossover(emaFast, emaSlow)
crossUnderHappened = ta.crossunder(emaFast, emaSlow)

// Kesişme sonrası bekleme sayacı
var int crossOverCount = na
var int crossUnderCount = na

if (crossOverHappened)
    crossOverCount := 0

if (crossUnderHappened)
    crossUnderCount := 0

if (not na(crossOverCount))
    crossOverCount += 1

if (not na(crossUnderCount))
    crossUnderCount += 1

// Alım ve Satım işlemleri
if (crossOverCount == 2)
    strategy.entry("Buy", strategy.long)
    crossOverCount := na  // Sayaç sıfırlanır

if (crossUnderCount == 2)
    strategy.entry("Sell", strategy.short)
    crossUnderCount := na  // Sayaç sıfırlanır

// Stop Loss ve Stop Gain hesaplama
longStopPrice = strategy.position_avg_price * (1 - stopLossPercent)
shortStopPrice = strategy.position_avg_price * (1 + stopLossPercent)
longTakeProfitPrice = strategy.position_avg_price * (1 + stopGainPercent)
shortTakeProfitPrice = strategy.position_avg_price * (1 - stopGainPercent)

// Stop Loss ve Stop Gain'i uygula
if (strategy.position_size > 0 and strategy.position_avg_price > 0)
    strategy.exit("Stop", "Buy", stop=longStopPrice, limit=longTakeProfitPrice)
else if (strategy.position_size < 0 and strategy.position_avg_price > 0)
    strategy.exit("Stop", "Sell", stop=shortStopPrice, limit=shortTakeProfitPrice)