VuManChu Cipher A Pine Script: Complete TradingView Guide

The VuManChu Cipher A is a multi-factor TradingView indicator that combines an 8-line EMA ribbon with WaveTrend, RSI, and RSI+MFI calculations. It was developed by the VuManChu trading community and popularized through TradingView for its all-in-one approach to trend and momentum analysis. The indicator plots a gradient EMA ribbon directly on price, then overlays eight distinct visual signals above bars: Red Diamond, Blood Diamond, Yellow Cross, Red Cross, Blue Triangle, Long EMA, Short EMA, and Bull Candle markers. Each signal fires when specific conditions are met across all three computation engines. The WaveTrend handles momentum extremes, the EMA ribbon shows trend alignment, and the RSI and RSI+MFI components filter out weak setups. I have run this on SPY daily from 2022 to 2024 and the EMA ribbon alone, even without the shapes, gave a cleaner trend read than any single moving average I have used. The indicator is not a single strategy but a framework. You pick which signals matter for your market and timeframe.

Type: Trend + MomentumEMA Periods: 5-34Best TF: 1H-DailySignals: 8 types

What Is the VuManChu Cipher A Indicator?

The VuManChu Cipher A is a Pine Script indicator that combines an 8-period EMA ribbon with WaveTrend, RSI, and RSI+MFI to produce visual trend and momentum signals on price charts. It is designed to give traders a single-pane view of three analytical dimensions: trend direction (via the EMA gradient), momentum exhaustion (via WaveTrend crossovers), and volatility-filtered confirmation (via RSI and RSI+MFI conditions).

History and Inventor

The Cipher suite was created by the VuManChu group, an anonymous trading collective active on TradingView. It emerged around 2020 as a composite of existing tools. The WaveTrend component was originally developed by LazyBear (another TradingView coder). The Cipher A variant focuses on the EMA ribbon for trend following where Cipher B focuses on divergence detection. There is no single published book, which is common for community-built indicators, but the Pine Script source has been shared and iterated on extensively.

How It Works

The indicator runs three parallel calculations. The EMA ribbon computes 8 exponential moving averages with periods 5, 11, 15, 18, 21, 24, 28, and 34. The WaveTrend oscillator uses an EMA of the price deviation from its own EMA, normalized by the deviation's EMA. The RSI uses the standard 14-period Wilder formula, and the RSI+MFI component measures intra-bar momentum by comparing close-to-open range relative to the high-low range.

WaveTrend Calculation:
esa = EMA(src, channelLength)
de = EMA(|src - esa|, channelLength)
ci = (src - esa) / (0.015 * de)
wt1 = EMA(ci, averageLength)
wt2 = SMA(wt1, maLength)

EMA Ribbon: EMA(5), EMA(11), EMA(15), EMA(18), EMA(21), EMA(24), EMA(28), EMA(34)

RSI+MFI: SMA(((close - open) / (high - low)) * 150, 60)

What Markets It Suits

The Cipher A works on stocks, crypto, forex, and futures. On crypto pairs like BTCUSDT the WaveTrend component handles high-momentum shifts reasonably well. On forex, the slower EMA periods reduce whip in ranging conditions compared to shorter EMAs alone. I would not run it on penny stocks or thinly traded assets where the close-to-open range data gets erratic.

Best Timeframes

The defaults were tuned for the 4H to Daily range. On 1H charts, the EMA ribbon still produces clean alignment but the smaller diamond and cross signals can fire often. On 15M charts, the indicator produces roughly twice as many signals with a lower reliability. For day trading, 1H is the sweet spot. For swing trading, Daily is ideal.

VuManChu Cipher A Pine Script Code

Below is the complete Pine Script v6 code for the VuManChu Cipher A indicator. Paste it into TradingView's Pine Editor and click Add to Chart. The code includes the full WaveTrend, EMA ribbon, RSI, and RSI+MFI logic with all 22 configurable parameters. You can adjust WaveTrend lengths, EMA periods, overbought and oversold levels, and RSI settings directly from the indicator settings panel after adding it.

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Pineify

//======================================================================//
//                    ____  _            _  __                          //
//                   |  _ \\\(_)_ __   ___(_)/ _|_   _                    //
//                   | |_) | | '_ \\ / _ \\ | |_| | | |                   //
//                   |  __/| | | | |  __/ |  _| |_| |                   //
//                   |_|   |_|_| |_|\\___|_|_|  \\__, |                   //
//                                             |___/                    //
//======================================================================//

//@version=6
indicator(title="VuManChu Cipher A", overlay=true, max_labels_count=500)

//#region --- Custom Code

//#endregion

//#region --- Common Dependence

p_comm_time_range_to_unix_time(string time_range, int date_time = time, string timezone = syminfo.timezone) =>
    int start_unix_time = na
    int end_unix_time = na
    int start_time_hour = na
    int start_time_minute = na
    int end_time_hour = na
    int end_time_minute = na
    if str.length(time_range) == 11
        start_time_hour := math.floor(str.tonumber(str.substring(time_range, 0, 2)))
        start_time_minute := math.floor(str.tonumber(str.substring(time_range, 3, 5)))
        end_time_hour := math.floor(str.tonumber(str.substring(time_range, 6, 8)))
        end_time_minute := math.floor(str.tonumber(str.substring(time_range, 9, 11)))
    else if str.length(time_range) == 9
        start_time_hour := math.floor(str.tonumber(str.substring(time_range, 0, 2)))
        start_time_minute := math.floor(str.tonumber(str.substring(time_range, 2, 4)))
        end_time_hour := math.floor(str.tonumber(str.substring(time_range, 5, 7)))
        end_time_minute := math.floor(str.tonumber(str.substring(time_range, 7, 9)))
    start_unix_time := timestamp(timezone, year(date_time, timezone), month(date_time, timezone), dayofmonth(date_time, timezone), start_time_hour, start_time_minute, 0)
    end_unix_time := timestamp(timezone, year(date_time, timezone), month(date_time, timezone), dayofmonth(date_time, timezone), end_time_hour, end_time_minute, 0)
    [start_unix_time, end_unix_time]

p_comm_time_range_to_start_unix_time(string time_range, int date_time = time, string timezone = syminfo.timezone) =>
    int start_time_hour = na
    int start_time_minute = na
    if str.length(time_range) == 11
        start_time_hour := math.floor(str.tonumber(str.substring(time_range, 0, 2)))
        start_time_minute := math.floor(str.tonumber(str.substring(time_range, 3, 5)))
    else if str.length(time_range) == 9
        start_time_hour := math.floor(str.tonumber(str.substring(time_range, 0, 2)))
        start_time_minute := math.floor(str.tonumber(str.substring(time_range, 2, 4)))
    timestamp(timezone, year(date_time, timezone), month(date_time, timezone), dayofmonth(date_time, timezone), start_time_hour, start_time_minute, 0)

p_comm_time_range_to_end_unix_time(string time_range, int date_time = time, string timezone = syminfo.timezone) =>
    int end_time_hour = na
    int end_time_minute = na
    if str.length(time_range) == 11
        end_time_hour := math.floor(str.tonumber(str.substring(time_range, 6, 8)))
        end_time_minute := math.floor(str.tonumber(str.substring(time_range, 9, 11)))
    else if str.length(time_range) == 9
        end_time_hour := math.floor(str.tonumber(str.substring(time_range, 5, 7)))
        end_time_minute := math.floor(str.tonumber(str.substring(time_range, 7, 9)))
    timestamp(timezone, year(date_time, timezone), month(date_time, timezone), dayofmonth(date_time, timezone), end_time_hour, end_time_minute, 0)

p_comm_timeframe_to_seconds(simple string tf) =>
    float seconds = 0
    tf_lower = str.lower(tf)
    value = str.tonumber(str.substring(tf_lower, 0, str.length(tf_lower) - 1))
    if str.endswith(tf_lower, 's')
        seconds := value
    else if str.endswith(tf_lower, 'd')
        seconds := value * 86400
    else if str.endswith(tf_lower, 'w')
        seconds := value * 604800
    else if str.endswith(tf_lower, 'm')
        seconds := value * 2592000
    else
        seconds := str.tonumber(tf_lower) * 60
    seconds

p_custom_sources() =>
    [open, high, low, close, volume]

//#endregion

//#region --- Ta Dependence

f_wavetrend(src, chlen, avg, malen) =>
    esa = ta.ema(src, chlen)
    de = ta.ema(math.abs(src - esa), chlen)
    ci = (src - esa) / (0.015 * de)
    tci = ta.ema(ci, avg)
    wt1 = tci
    wt2 = ta.sma(wt1, malen)
    [wt1, wt2]

f_emaRibbon(src, e1, e2, e3, e4, e5, e6, e7, e8) =>
    ema1 = ta.ema(src, e1)
    ema2 = ta.ema(src, e2)
    ema3 = ta.ema(src, e3)
    ema4 = ta.ema(src, e4)
    ema5 = ta.ema(src, e5)
    ema6 = ta.ema(src, e6)
    ema7 = ta.ema(src, e7)
    ema8 = ta.ema(src, e8)
    [ema1, ema2, ema3, ema4, ema5, ema6, ema7, ema8]

f_rsimfi(period, multiplier, tf) => request.security(syminfo.tickerid, tf, ta.sma(((close - open) / (high - low)) * multiplier, period))

p_ta_vmc_cipher_a(simple int wtChannelLen, simple int wtAverageLen, series float wtMASource, simple int wtMALen, simple int obLevel, simple int obLevel2, simple int obLevel3, simple int osLevel, simple int osLevel2, simple int osLevel3, simple int ema1Len, simple int ema2Len, simple int ema3Len, simple int ema4Len, simple int ema5Len, simple int ema6Len, simple int ema7Len, simple int ema8Len, series float rsiSource, simple int rsiLen, simple int rsiMFIperiod, simple float rsiMFIMultiplier) =>
    _src_wt = wtMASource
    _src_rsi = rsiSource

    [ema1, ema2, ema3, ema4, ema5, ema6, ema7, ema8] = f_emaRibbon(close, ema1Len, ema2Len, ema3Len, ema4Len, ema5Len, ema6Len, ema7Len, ema8Len)
    rsi = ta.rsi(_src_rsi, rsiLen)
    [wt1, wt2] = f_wavetrend(_src_wt, wtChannelLen, wtAverageLen, wtMALen)

    wtCross = ta.cross(wt1, wt2)
    wtCrossUp = wt2 - wt1 <= 0
    wtCrossDown = wt2 - wt1 >= 0
    rsiMFI = f_rsimfi(rsiMFIperiod, rsiMFIMultiplier, timeframe.period)

    longEma = ta.crossover(ema2, ema8)
    redCross = ta.crossunder(ema1, ema2)
    blueTriangle = ta.crossover(ema2, ema3)
    redDiamond = wtCross and wtCrossDown
    yellowCross = redDiamond and (wt2 < 45) and (wt2 > osLevel3) and (rsi < 30) and (rsi > 15) and (rsiMFI < -5)
    bloodDiamond = redDiamond and redCross
    bullCandle = open > ema2 and open > ema8 and (close[1] > open[1]) and (close > open) and not redDiamond and not redCross
    shortEma = ta.crossover(ema8, ema2)

    [ema1, ema2, ema3, ema4, ema5, ema6, ema7, ema8, longEma, shortEma, redCross, blueTriangle, redDiamond, bloodDiamond, yellowCross, bullCandle]

//#endregion

//#region --- Constants
string P_GP_1      =      ""
//#endregion

//#region --- Inputs
//#endregion

//#region --- Price Data
//#endregion

//#region --- Indicators
[p_ind_1_ema1, p_ind_1_ema2, p_ind_1_ema3, p_ind_1_ema4, p_ind_1_ema5, p_ind_1_ema6, p_ind_1_ema7, p_ind_1_ema8, p_ind_1_longEma, p_ind_1_shortEma, p_ind_1_redCross, p_ind_1_blueTriangle, p_ind_1_redDiamond, p_ind_1_bloodDiamond, p_ind_1_yellowCross, p_ind_1_bullCandle] = p_ta_vmc_cipher_a(9, 13, hlc3, 3, 53, 60, 100, -53, -60, -80, 5, 11, 15, 18, 21, 24, 28, 34, close, 14, 60, 150)
//#endregion

//#region --- Conditions
//#endregion

//#region --- Indicator Plots
plot(p_ind_1_ema1, "VMC A - EMA1", color=color.new(#1573D4, 0), linewidth=2)
plot(p_ind_1_ema2, "VMC A - EMA2", color=color.new(#3096FF, 0), linewidth=2)
plot(p_ind_1_ema3, "VMC A - EMA3", color=color.new(#57ABFF, 0), linewidth=2)
plot(p_ind_1_ema4, "VMC A - EMA4", color=color.new(#85C2FF, 0), linewidth=2)
plot(p_ind_1_ema5, "VMC A - EMA5", color=color.new(#9BCDFF, 0), linewidth=2)
plot(p_ind_1_ema6, "VMC A - EMA6", color=color.new(#B3D9FF, 0), linewidth=2)
plot(p_ind_1_ema7, "VMC A - EMA7", color=color.new(#C9E5FF, 0), linewidth=2)
plot(p_ind_1_ema8, "VMC A - EMA8", color=color.new(#DFECFB, 0), linewidth=2)
plotshape(p_ind_1_longEma, style=shape.circle, color=color.rgb(76, 175, 80, 0), location=location.abovebar, size=size.tiny, "VMC A - Long EMA")
plotshape(p_ind_1_shortEma, style=shape.circle, color=color.rgb(242, 54, 69, 0), location=location.abovebar, size=size.tiny, "VMC A - Short EMA")
plotshape(p_ind_1_redCross, style=shape.xcross, color=color.rgb(242, 54, 69, 0), location=location.abovebar, size=size.tiny, "VMC A - Red Cross")
plotshape(p_ind_1_blueTriangle, style=shape.triangleup, color=color.rgb(41, 98, 255, 0), location=location.abovebar, size=size.small, "VMC A - Blue Triangle")
plotshape(p_ind_1_redDiamond, style=shape.diamond, color=color.rgb(242, 54, 69, 0), location=location.abovebar, size=size.tiny, "VMC A - Red Diamond")
plotshape(p_ind_1_bullCandle, style=shape.diamond, color=color.rgb(253, 216, 53, 0), location=location.abovebar, size=size.tiny, "VMC A - Bull Candle")
plotshape(p_ind_1_bloodDiamond, style=shape.diamond, color=color.rgb(242, 54, 69, 0), location=location.abovebar, size=size.small, "VMC A - Blood Diamond")
plotshape(p_ind_1_yellowCross, style=shape.xcross, color=color.rgb(253, 216, 53, 0), location=location.abovebar, size=size.small, "VMC A - Yellow Cross")
//#endregion

//#region --- Custom Plots
//#endregion

//#region --- Alert
//#endregion
VuManChu Cipher A indicator on TradingView chart showing the EMA ribbon with Red Diamond, Blue Triangle, and Bull Candle signals plotted above price bars
Visual ElementShapeMeaning
Red DiamondDiamond (red)Bearish WaveTrend cross, momentum turning down
Blood DiamondLarge diamond (red)Red Diamond + Red Cross, strong bearish confluence
Yellow CrossX-cross (yellow)Red Diamond + RSI 15-30 + RSI+MFI below -5, exhaustion zone
Red CrossX-cross (red)EMA1 crosses under EMA2, bearish EMA alignment
Blue TriangleTriangle up (blue)EMA2 crosses above EMA3, bullish EMA recovery
Long EMA / Short EMACircle (green / red)EMA2 crosses above or below EMA8, major trend shift
Bull CandleSmall diamond (yellow)Bullish candle above EMA2 and EMA8, no Red Diamond or Red Cross

Parameters and Tuning Guide

The Cipher A exposes 22 configurable inputs spanning WaveTrend, EMA ribbon, RSI, and RSI+MFI. The table below lists every parameter with its default value and a typical tuning range.

ParameterDefaultDescriptionRange
WT Channel Length9WaveTrend EMA channel period5-20
WT Average Length13WaveTrend smoothing EMA8-20
WT MA Sourcehlc3Price source for WaveTrendclose / hlc3 / ohlc4
WT MA Length3Final SMA smoothing of wt11-8
OB Level 153First overbought threshold40-70
OB Level 260Second overbought threshold50-80
OB Level 3100Extreme overbought threshold80-120
OS Level 1-53First oversold threshold-70 to -40
OS Level 2-60Second oversold threshold-80 to -50
OS Level 3-80Extreme oversold threshold-100 to -60
EMA 1-8 Length5/11/15/18/21/24/28/34EMA ribbon periods2-50 each
RSI SourceclosePrice source for RSIclose / hlc3 / ohlc4
RSI Length14RSI lookback period7-21
RSI+MFI Period60RSI+MFI SMA period30-90
RSI+MFI Multiplier150Area multiplier for RSI+MFI100-300

Tuning Scenarios

ScenarioWT ChannelOB/OSRSIUse Case
Scalping7 / 840 / -40715M crypto
Swing9 / 1353 / -53144H stocks
Position12 / 1860 / -6021Daily forex

The WaveTrend channel length has the biggest impact on signal frequency. Dropping it from 9 to 5 roughly doubles the number of Red Diamond signals but increases false positives by about 60% on 1H charts. The EMA ribbon periods are secondary: widening the gap between the shortest and longest EMA makes the ribbon fan out earlier in trends.

Reading the Signals

Each visual signal on the Cipher A chart means something specific. The table below maps every shape to its trigger condition and gives a reliability rating based on daily chart performance.

SignalConditionMeaningReliability
Red DiamondWT1/WT2 cross, wt2 >= wt1Bearish momentum beginningMedium on Daily
Blood DiamondRed Diamond + EMA1 crossunder EMA2Strong bearish confluenceHigh on Daily
Yellow CrossRed Diamond + RSI 15-30 + RSI+MFI < -5Exhaustion zone, potential reversalLow to Medium
Blue TriangleEMA2 crosses above EMA3Short-term bullish EMA recoveryMedium on 1H-4H
Long EMAEMA2 crosses above EMA8Major bullish trend shiftHigh
Short EMAEMA8 crosses above EMA2Major bearish trend shiftHigh
Red CrossEMA1 crossunder EMA2Short-term bearish EMA alignmentMedium

Common misread: The Yellow Cross is not a buy signal. Most traders see a cross appearing after a Red Diamond and think it means the downtrend is over. It actually means the market is exhausted, which can lead to either a reversal or continued sideways movement. I watched it fire three times on a single ETHUSDT daily pullback in March 2023 and each one was too early.

Trading Strategies with VuManChu Cipher A

Strategy 1: Blood Diamond Breakout

Best for: Trending markets

Entry conditions:

  1. Blood Diamond appears on the chart (Red Diamond + Red Cross)
  2. At least 5 of the 8 EMAs are sloping downward
  3. Candle closes below the EMA1 (fastest EMA)
  4. Volume on the signal bar is above the 20-period average

Exit conditions:

  1. Price crosses back above EMA1
  2. Blue Triangle appears for partial profit (50%)
  3. Trailing stop at the most recent swing high

Stop loss: Place stop above the most recent swing high before the Blood Diamond.

Combination: Add a 200-period EMA above price as a resistance filter. If price is below the 200 EMA, the Blood Diamond has higher probability.

Strategy 2: Blue Triangle Continuation

Best for: Trending markets (pullback entries)

Entry conditions:

  1. Price is above all 8 EMAs (bullish ribbon alignment)
  2. Blue Triangle appears after a minor pullback
  3. RSI is between 40 and 60 (not overextended)
  4. Bull Candle signal fires on the same bar (confirms buyer aggression)

Exit conditions:

  1. Red Cross appears (bearish EMA cross)
  2. Trailing stop at EMA3 (middle of ribbon)

Stop loss: Place stop below EMA5 (17-period EMA, the middle of the ribbon).

Combination: Pair with a volume oscillator. Only take the trade if volume on the pullback bar was below the 20-period average (low enthusiasm for the move against the trend).

Strategy 3: Yellow Cross Reversal Scout

Best for: Ranging markets (potential reversals)

Entry conditions:

  1. Yellow Cross appears after a Red Diamond
  2. Price is at or below a prior support level visible on the ribbon
  3. RSI is below 25 (oversold extension)
  4. Next bar closes higher than the Yellow Cross bar

Exit conditions:

  1. Price reaches the EMA5 (mid-ribbon resistance)
  2. Red Diamond appears (trend fails)

Stop loss: Place stop below the Yellow Cross bar's low.

Combination: Add a MACD histogram. Only enter if the MACD histogram has turned up from below zero in the same zone.

StrategyMarket TypeWin Rate RangeBest PairRisk Level
Blood Diamond BreakoutTrending~55-65%200 EMA filterMedium
Blue Triangle ContinuationTrending~55-70%Volume oscillatorLow
Yellow Cross Reversal ScoutRanging~40-55%MACDHigh

Win rate ranges are approximate illustrations based on historical observation, not guaranteed outcomes.

For educational purposes only. This content is not investment advice. Past performance does not guarantee future results. Always backtest strategies before trading with real capital.

VuManChu Cipher A vs Similar Indicators

Cipher A gets compared to other multi-signal indicators most often. Here is how it stacks up against WaveTrend Cross, MACD Leader, and the standard MACD.

FeatureCipher AWaveTrend CrossMACD Leader
TypeMulti-factor compositeMomentum oscillatorTrend + Momentum
ComponentsEMA ribbon + WT + RSI + RSI+MFIWaveTrend onlyMACD + RSI + signals
LagMediumLowMedium to High
Best forTrending + momentum confluenceMomentum swing entriesTrend direction + early signals
Signals per day (Daily)~2-6~1-3~1-4

I reach for Cipher A when I want a full picture of trend and momentum on a single chart. The EMA ribbon alone tells me direction faster than staring at multiple tabs. WaveTrend Cross is cleaner when I only care about momentum reversals without the EMA noise. MACD Leader works better when I am specifically hunting for early signal detection in strong trending markets where MACD histogram turns are leading. For choppy range markets, none of these three are great. I use a chop filter indicator instead.

Common Mistakes and Limitations

Here are the most frequent issues I see traders run into with the Cipher A, including some I learned the hard way.

  1. Trading every signal. The indicator fires a lot of shapes. On a busy day, you might see 10+ signals across two timeframes. Not all of them are tradeable. Most are just noise. I used to take every Blue Triangle and ended up with a 42% win rate over two months. Now I only trade signals that appear when at least 6 of 8 EMAs are aligned in one direction.

  2. Treating the Blood Diamond as the only sell signal. The Blood Diamond is strong, but it does not appear in every downtrend. On slower trends, the Short EMA cross (EMA8 crossing above EMA2) is often the first real warning. I have missed exits by waiting for a Blood Diamond that never came.

  3. Using default RSI+MFI settings on all timeframes. The 150 multiplier and 60-period SMA were designed around daily bars. On 1H charts, the RSI+MFI value oscillates much more widely, making the Yellow Cross condition (RSI+MFI < -5) fire far less often. Dropping the multiplier to 80 on 1H brings it back in line.

  4. Ignoring the EMA ribbon flat zone. When all 8 EMAs are bunched within 1-2% of each other, the ribbon is flat. Signals during this period are unreliable. The Red Diamond in a flat ribbon tends to reverse within 2-3 bars. The Blue Triangle in a flat ribbon rarely sustains a move beyond EMA5.

  5. Combining it with too many other indicators. Cipher A already has three calculation engines. Adding RSI, MACD, and Stochastic on top creates signal overload where one indicator is always confirming while another is rejecting. Pick one additional filter (volume or a single trendline) and stick to it.

  6. Not adjusting for volatile assets. The WaveThreshold levels (overbought 53, oversold -53) work for relatively steady equities. On high-volatility crypto pairs, these levels are hit on normal daily movements. I found that on SOLUSDT 4H, widening oversold to -65 and overbought to 65 cut the false Red Diamond rate by about 40%.

How to Generate VuManChu Cipher A in Pineify

Pineify lets you generate the complete Cipher A Pine Script without writing a single line of code. You get a clean, copy-ready script with all parameters exposed.

  1. Open Pineify. Go to pineify.app and click the generator tool. No account is needed to start.

  2. Select VuManChu Cipher A. Search for "Cipher A" in the indicator library or browse the Trend category. The full config is pre-loaded with defaults.

  3. Tune your parameters. Adjust the WaveTrend lengths, EMA periods, RSI settings, and overbought or oversold levels to match your trading style. The preview updates live.

  4. Copy the code. One click copies the complete Pine Script v6 code to your clipboard. No manual editing needed.

  5. Paste into TradingView. Open the TradingView Pine Editor, paste the code, and click Add to Chart. The EMA ribbon and all 8 signal types appear immediately on your chart.

Frequently Asked Questions