Chaikin Money Flow(CMF) 지표 전략을 기반으로


생성 날짜: 2024-06-07 17:05:04 마지막으로 수정됨: 2024-06-07 17:05:04
복사: 0 클릭수: 625
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

Chaikin Money Flow(CMF) 지표 전략을 기반으로 CASHISKING | CASHISKING CMF, EMA, SMA

개요

이 전략은 Chaikin 자금 흐름 ((CMF) 지표와 지수 이동 평균 ((EMA) 를 기반으로 거래 신호를 생성한다. 먼저 지정된 주기 내의 CMF 값을 계산하고, 그 다음 두 개의 다른 주기의 EMA를 사용하여 CMF 데이터를 평형화한다. 빠른 EMA가 느린 EMA 위를 가로지르면 구매 신호를 생성하고, 반대로 판매 신호를 생성한다. 이 전략은 또한 위험을 제어하고 이익을 잠금하기 위해 중지 및 중지 조건을 설정한다.

전략 원칙

  1. 특정 기간 동안의 Chaikin 자금 흐름 (CMF) 값을 계산합니다. CMF 지표는 가격과 거래량 데이터를 결합하여 자금 유입과 유출의 강도를 측정합니다.
  2. 두 개의 다른 기간의 지수 이동 평균 ((EMA) 을 사용하여 CMF 데이터를 매끄럽게 처리합니다. 빠른 EMA는 단기 트렌드를 포착하는 데 사용되며, 느린 EMA는 장기 트렌드를 결정하는 데 사용됩니다.
  3. 빠른 EMA가 느린 EMA 위를 넘으면 구매 신호가 발생하고, 빠른 EMA가 느린 EMA 아래를 넘으면 판매 신호가 발생한다.
  4. 거래 신호를 생성한 후, 전략은 가짜 신호를 피하기 위해 두 개의 K선 확인을 기다린다.
  5. 스톱로스 및 스톱 조건을 설정하여, 스톱로스 가격은 포지션 개시 가격의 일정한 비율로, 스톱 가격은 포지션 개시 가격의 일정한 비율로 설정한다.

우위 분석

  1. 가격과 거래량 데이터를 결합: CMF 지표 통합은 가격과 거래량 데이터를 고려하여 시장의 자금 흐름을 더 포괄적으로 반영하여 더 신뢰할 수있는 거래 신호를 제공합니다.
  2. 트렌드 추적: 다양한 주기의 EMA를 사용함으로써 전략은 단기 및 장기 동향을 동시에 포착하고 다양한 시장 환경에 적응할 수 있습니다.
  3. 신호 확인: 거래 신호를 생성한 후, 전략은 두 개의 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)