이 전략은 CMF 모멘텀 지표와 200일 EMA를 결합하여 거래 신호를 구성합니다.
특히, CMF 모멘텀은 돈 흐름의 변화율을 반영합니다. 0을 상향으로 넘어서는 것은 구매 신호이며 0을 하향으로 넘어가는 것은 판매 신호입니다. 한편, 200일 EMA보다 길고, 그 아래에 단축합니다.
스톱 로스는 ATR의 2배로 설정됩니다. 이윤을 취하는 것은 스톱 로스의 2배이며, 2: 1 이익/손실 비율을 달성합니다.
이 전략의 장점은 CMF 모멘텀을 사용하여 주요 트렌드에 대한 EMA와 결합한 자금 흐름 방향을 판단하는 것입니다. 이익/손실 비율은 안정적인 이익을 얻는 데 도움이됩니다. 그러나 지체된 지표로 인해 출입 시기는 최적의 수 없습니다.
전반적으로, CMF 모멘텀 브레이크업 이동 평균 전략은 트렌드가 명확하면 더 잘 작동합니다. 그러나 불필요한 손실을 피하기 위해 라이브 거래에서 신호 입출 시점에 여전히 관심이 필요합니다.
/*backtest start: 2023-08-11 00:00:00 end: 2023-09-10 00:00:00 period: 45m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // *************************************************** // CMF Velocity with 200 EMA Strategy // CMF Velocity Indicator by TheSadRhinoInvesting // Author: TheSadRhinoInvesting, v1.0, 2021.05.16 // INITIAL RELEASE // *************************************************** //@version=4 strategy("CMF Velocity with 200EMA Strategy") // *************************************************** // Strategy & Rules // *************************************************** // This strategy is a demonstration of my new Indicator: CMF Velocity // CMF Velocity: https://www.tradingview.com/script/zsTl96Gd-CMF-Velocity/ // The strategy works best in a strongly trending market // === Indicators === // EMA // @ 200 // CMF Velocity // @ 11, 7 // ATR // @ 10 // === Rules === // long only // - price above EMA200 // short only // - price below EMA200 // Stop Loss = 2x ATR // Profit = 2x SL/risk (Profit Ratio x Max Loss) // === Entries === // LONG // - long entry (Typical): // - CMF Velocity crosses above 0 // SHORT // - short entry (Typical): // - CMF Velocity crosses below 0 // *************************************************** // Backtest Parameters // *************************************************** testStartYear = input(2021, "Backtest Start Year") testStartMonth = input(5, "Backtest Start Month") testStartDay = input(2, "Backtest Start Day") testStartHour = input(0, "Backtest Start Hour") testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, testStartHour, 0) testEndYear = input(2021, "Backtest End Year") testEndMonth = input(5, "Backtest End Month") testEndDay = input(16, "Backtest End Day") testEndHour = input(0, "Backtest End Hour") testPeriodEnd = timestamp(testEndYear, testEndMonth, testEndDay, testEndHour, 0) timeBacktesting = true direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1) strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long)) // *************************************************** // Inputs // *************************************************** // Profit/Loss Ratio pLRatioMultiplier = input(2, title="Profit/Loss Multiplier", step=0.1, minval=0.1) // EMA Period emaPeriod = input(200, title="EMA Period", step=1, minval=1) // ATR Multiplier atrMultiplier = input(2, title="ATR Multiplier", step=0.1, minval=0.1) // ATR Period atrPeriod = input(10, title="ATR Period", step=1, minval=1) // CMF Period cmfPeriod = input(11, title="CMF Period", step=1, minval=1) // CMF Velocity Period cmfVelocityPeriod = input(7, title="CMF Velocity Period", step=1, minval=1) // *************************************************** // Indicator Functions // *************************************************** // CMF Function cmf(period) => moneyFlowMultiplier = (((close - low) - (high - close)) / (high - low)) * volume notNaMoneyFlowMultiplier = na(moneyFlowMultiplier) ? 0 : moneyFlowMultiplier moneyFlowAverage = sma(notNaMoneyFlowMultiplier, period) volumeAverage = sma(volume, period) moneyFlowAverage / volumeAverage // CMF Velocity Function cmfVelocity(cmf, period) => difference = change(cmf) sma(difference, period) // *************************************************** // Indicator Calculation and Plotting // *************************************************** cmfSeries = cmf(cmfPeriod) cmfVelocitySeries = cmfVelocity(cmfSeries, cmfVelocityPeriod) atrSeries = atr(atrPeriod) triggerEMA = ema(close, emaPeriod) plot(triggerEMA) // *************************************************** // Strategy Execution // *************************************************** if (crossover(cmfVelocitySeries, 0.0) and triggerEMA < close and timeBacktesting) stopOffset = atrSeries * atrMultiplier profitOffset = stopOffset * pLRatioMultiplier stopLoss = close - stopOffset takeProfit = close + profitOffset strategy.entry("Long Entry", true) strategy.exit("Exit", "Long Entry", stop=stopLoss, limit=takeProfit) if (crossunder(cmfVelocitySeries, 0.0) and triggerEMA > close and timeBacktesting) stopOffset = atrSeries * atrMultiplier profitOffset = stopOffset * pLRatioMultiplier stopLoss = close + stopOffset takeProfit = close - profitOffset strategy.entry("Short Entry", false) strategy.exit("Exit", "Short Entry", stop=stopLoss, limit=takeProfit)