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

この戦略はチャイキンマネーフロー (CMF) をベースに取引信号を生成します

作者: リン・ハーンチャオチャン開催日: 2024-06-07 17:05:04
タグ:

カッシング CMF,EMA,SMA

概要

この戦略は,チャイキンマネーフロー (CMF) インディケーターと指数関数移動平均値 (EMA) をベースに取引信号を生成する.最初に指定された期間のCMF値を計算し,その後,CMFデータをスムーズにするために異なる期間の2つのEMAを使用する.速いEMAが遅いEMAを超えると買い信号が生成され,速いEMAが遅いEMAを下回ると売り信号が生成される.この戦略はリスクを管理し,利益をロックするためにストップ・ロストとテイク・プロフィート条件も設定する.

戦略の原則

  1. 特定の期間のチャイキンマネーフロー (CMF) 値を計算する.CMFは,市場への貨幣流と市場からの貨幣流の強さを測定するために価格とボリュームの両方のデータを組み込む.
  2. CMFデータを平滑させるために,異なる期間を持つ2つの指数関数移動平均値 (EMA) を適用します.高速EMAは短期的傾向を捉え,遅いEMAは長期的傾向を特定します.
  3. 急速なEMAが遅いEMAを横切るときに購入信号,高速なEMAが遅いEMAを横切るときに販売信号を生成する.
  4. 取引信号が生成された後,戦略は偽信号を避けるために2つのキャンドルの確認を待つ.
  5. ストップ・ロストとテイク・プロフィートの条件を設定します.ストップ・ロスト価格はエントリー価格の一定パーセントで,テイク・プロフィートの価格はエントリー価格の一定パーセントです.

利点分析

  1. 価格と量データを組み合わせます.CMF指標は価格と量データを総合的に考慮し,市場の資金流をより信頼的に反映し,より正確な取引信号を生成します.
  2. トレンドトラッキング:異なる期間のEMAを利用することで,戦略は短期的および長期的トレンドの両方を把握し,さまざまな市場環境に適応することができます.
  3. シグナル確認: 取引信号が生成された後,戦略は2つのキャンドルからの確認を待っています. これにより,いくつかの偽信号を効果的にフィルタリングし,取引の成功率を改善します.
  4. リスク管理: ストップ・ロストとテイク・プロフィートの条件を組み込み,個々の取引のリスクを効果的に制御し,得られる利益を確保します.

リスク分析

  1. パラメータ最適化:戦略のパフォーマンスはCMFとEMA期間選択に依存する.異なる市場環境は異なるパラメータ設定を必要とする可能性があるため,周期的なパラメータ最適化が必要である.
  2. トレンド認識: 不安定な市場や トレンドターニングポイントでは,戦略はより多くの誤った信号を生み出し,頻繁に取引と資本損失につながる可能性があります.
  3. スリップと取引コスト:頻繁な取引は,スリップと取引コストを増加させ,戦略の全体的な収益性に影響を与える可能性があります.

オプティマイゼーションの方向性

  1. ダイナミックパラメータ調整: 市場状況の変化に基づいて,CMFとEMA期間パラメータをダイナミックに調整し,異なる市場状態に適応します.
  2. 他の指標を組み込む:トレンド認識の正確性とシグナルの信頼性を向上させるために,相対強度指数 (RSI) と平均真差 (ATR) などの他の技術指標を組み合わせる.
  3. ストップ・ロストとテイク・プロフィートの最適化: ストップ・ロストとテイク・プロフィートの割合を市場の変動とリスク偏見に基づいて動的に調整し,リスクをよりうまく管理し,利益を固定します.
  4. ポジションサイズを導入する: 市場の動向と信号強度に基づいてポジションサイズを動的に調整する. 傾向が明確であるときにポジションサイズを増加させ,不確実な期間にポジションサイズを削減する.

概要

この戦略は,チャイキンマネーフロー指標と指数関数移動平均を活用し,価格とボリュームデータを組み合わせ,トレンドトラッキングを主な焦点とする.また,リスクを管理するためにストップ・ロストとテイク・プロフィートの条件を設定する.この戦略の利点は,複数の要因を包括的に考慮し,異なる時間スケールでトレンドを把握する能力にあります.しかし,パラメータ設定とトレンド認識の最適化にはまだ余地があります.将来,戦略の安定性と収益性は,ダイナミックなパラメータ調整,他の指標の組み込み,ストップ・ロストとテイク・プロフィートの最適化,ポジションサイジングの実施を通じてさらに改善することができます.


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


もっと