This strategy combines the classic technical indicator CCI and self-developed VCI and MCI dual indices to form trading signals, which is a typical quantitative trading strategy. By identifying the trend and momentum of Volume and Price changes, it determines the main direction of the current market and forms trading signals. It can be widely used for financial instruments such as digital currencies, foreign exchange and stocks.
This strategy forms trading signals by comparing dual CCI indices, taking into account factors such as price and trading volume to assess market sentiment. It is a typical and practical quantitative trading strategy. But it still needs to be used with other auxiliary tools to maximize the effectiveness of the strategy. It is worthwhile to further optimize and expand applicable scenarios while reducing risks.
/*backtest start: 2023-10-28 00:00:00 end: 2023-11-27 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("MCI and VCI - Modified CCI Formulas") test = cci(ohlc4, 13) test1 = cci(ohlc4, 20) obv(src) => cum(change(src) > 0 ? volume : change(src) < 0 ? -volume : 0*volume) mDisc = input(0, title="Mode Discrepency") mDiv = input(0.015, title="Interval") mean(_src, _length)=> _return = sum(_src, _length) / _length median(_src, _length)=> _return = _src for _i = 0 to _length _return := _return == 0 ? _src : (_return + _src[_i]) / 2 _return len = input(20, title="Standard (Average) Length") mmm = input(20, title="Lookback length") srcV = obv(input(ohlc4)) srcP = input(close) x = sma(srcV, len) MDV2 = abs(stdev(median(x, len), mmm)) MDV3 = abs(stdev(mean(x, len), mmm)) AMDV = (MDV2+MDV3)/2 pt1v = (srcV-ema(srcV, len))/ AMDV pt2v = 1/mDiv VCI=pt1v*pt2v y = ema(srcP, len) MDP2 = abs(stdev(median(y, len), mmm)) MDP3 = abs(stdev(mean(y, len), mmm)) AMDA = (MDP2 + MDP3)/2 pt1p = 1/mDiv pt2p = (srcP-ema(srcP, len))/ AMDA MCI = pt1p * pt2p plot(VCI, color=yellow, title="VCI", style="Histogram") plot(MCI, color=white, title="MCI") plot(500, style=line) plot(0, style=line, linewidth=2) plot(-500, style=line) long = crossover(MCI, 0) and VCI > MCI[2] short = crossunder(MCI, 0) and VCI < MCI[2] //Time Control //Set date and time FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 13, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2018, title = "From Year", minval = 2017) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 2017) // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => time >= start and time <= finish ? true : false // create function "within window of time" direction = input(0, title = "Strategy Direction", minval=-1, maxval=1) strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long)) if (long) strategy.entry("Long", strategy.long, when=window(), limit=ohlc4, oca_name="BollingerBands", comment="BBandLE") else strategy.cancel(id="Long") if (short) strategy.entry("Short", strategy.short, when=window(), limit=ohlc4, oca_name="BollingerBands", comment="BBandSE") else strategy.cancel(id="Short")