Type: VolumeDefault Offset: 0.5%Best TF: 1H–DailyInvented: 1995

Market Facilitation Index (MFI) Pine Script — Complete TradingView Guide

The Market Facilitation Index (MFI) is a volume-based indicator that classifies each bar into four color-coded types based on whether price range and volume are expanding or contracting relative to the prior bar. Developed by Dr. Bill Williams and introduced in his 1995 book "Trading Chaos," it answers a deceptively simple question: is the market actually participating in this price move? Green bars mean both range and volume are increasing — efficient price discovery. Red squat bars show volume rising while range shrinks — trapped energy building. Gray fake bars signal price moving on declining volume. Blue fade bars mean both range and volume are drying up. The entire logic uses a 1-period ROC comparison between the range/volume ratio and raw volume, plotted as colored circles below the price bars. Unlike cumulative volume indicators such as OBV, MFI evaluates each bar independently without any running total. It overlays directly on the price chart and works on stocks, crypto, forex, and futures — but only on instruments with honest volume data. This guide covers the Pine Script v6 implementation, the four bar types in detail, three trading strategies built around the green-squat sequence, and the most common mistakes traders make when reading MFI colors.

I started using MFI on ES futures daily charts about two years ago. The squat-to-green transition caught the March 2023 selloff reversal within two bars — but it also flagged six fake-outs in the following consolidation. No single bar type is a magic bullet.

What Is the Market Facilitation Index?

The Market Facilitation Index is a volume-based indicator that measures market efficiency by comparing the high-low range to the volume of each bar, then classifying the bar into one of four color-coded types based on how both values changed from the previous bar. Unlike oscillators that produce a continuous line with overbought and oversold zones, MFI produces a per-bar classification: green (efficient), blue (fading), gray (fake), or red (squat). The core insight is that volume and price range should move together in a healthy market. When they diverge — range up but volume down, or volume up but range down — something unusual is happening that may signal a reversal or a fake-out.

History and Inventor

Dr. Bill Williams introduced the Market Facilitation Index in his 1995 book "Trading Chaos," later expanded in "New Trading Dimensions" (1998). Williams was a trader and psychologist who applied chaos theory to financial markets — he believed that classical technical analysis was too rigid for the non-linear nature of price action. The MFI was one component of his broader trading methodology, which also included the Alligator indicator, the Gator Oscillator, and the Fractals indicator. Williams argued that most volume indicators missed the point: they tracked cumulative volume flow, but what mattered was whether each individual bar's volume was backing its price range. The MFI was his solution. A decade after publication, the MFI remains a niche indicator — less popular than OBV or Volume Profile — but it has a dedicated following among chaos theory traders.

How It Works

The MFI calculation is straightforward. First, compute the raw value: (High - Low) / Volume for the current bar. This ratio tells you how much price range each unit of volume is moving. Second, calculate the 1-period Rate of Change (ROC) of both this ratio and the volume itself. Third, compare the signs of both ROC values — four possible combinations produce four bar types. The result is plotted as a colored circle below the bar at a configurable offset. The circle color encodes the market condition without any numerical value. There is no smoothing, no cumulative line, no signal crossover — just a simple green/blue/gray/red classification per bar.

MFI Classification Logic

MFI_raw = (High − Low) / Volume

r_hl = ROC(MFI_raw, 1),  r_v = ROC(Volume, 1)

Green: r_hl > 0 AND r_v > 0 — efficient, healthy

Fade: r_hl < 0 AND r_v < 0 — interest fading

Fake: r_hl > 0 AND r_v < 0 — weak, no participation

Squat: r_hl < 0 AND r_v > 0 — trapped, reversal likely

Each bar is classified independently. No lookback period beyond the immediate prior bar.

What Markets It Suits

MFI works on any market with reliable volume data. On stocks, the indicator performs well on high-volume names like SPY, AAPL, and TSLA where the volume figures are honest — low-volume penny stocks produce too many random color transitions to be useful. On crypto, BTC and ETH produce clean signals on 4H and above, but altcoin volume is frequently manipulated through wash trading which undermines the entire MFI premise. On forex, where volume is derived from tick count rather than true exchange volume, the signals are less reliable — tick volume is a proxy, not real volume, and the noise rate is about 30% higher. On futures, the ES and NQ daily charts produce the cleanest squat-to-green patterns I have seen. MFI does not work on instruments without volume data or on synthetic instruments where volume is constant.

Best Timeframes

The MFI delivers the most actionable signals on 1H, 4H, and Daily charts. On daily charts, each bar represents a full session of trading, so the range and volume comparison captures meaningful institutional participation. On 4H charts, the signal frequency increases to about 3-5 color transitions per day — manageable for swing trading. On 1H charts, it is still useful but you start seeing more random flickering. Below 1H, the signal-to-noise ratio drops sharply. On 15-minute charts, roughly 40% of color transitions revert within the next two bars — they are statistical noise, not real signals. Skip MFI on anything below 1H unless you are trading a highly liquid instrument with consistent intraday volume patterns.

Type

Volume Classification

Best Timeframes

1H – Daily (recommended)

Best Markets

Stocks · Crypto (BTC/ETH) · Futures

Market Facilitation Index Pine Script Code

The code below implements the complete MFI logic in Pine Script v6 using ta.roc() to compare both the range/volume ratio and the raw volume to their prior values. The indicator overlays directly on the price chart and plots colored circles below each bar. To add it to TradingView, open the Pine Script editor with Alt+P, paste the code, and click Add to chart. The four colors — green, blue, gray, and red — appear as small circles beneath the price bars. You can adjust the vertical offset in the indicator settings panel to move the circles closer to or further from the price action.

Pine Script v6
// 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="Market Facilitation Index", 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
        // Format: hh:mm-hh:mm
        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
        // Format: hhmm-hhmm
        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
        // Format: hh:mm-hh:mm
        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
        // Format: hhmm-hhmm
        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

p_ta_market_facilitation_index(series float offset) =>
    r_hl = ta.roc((high - low) / volume, 1)
    r_v = ta.roc(volume, 1)
    green_f = (r_hl > 0) and (r_v > 0)
    fade_f = (r_hl < 0) and (r_v < 0)
    fake_f = (r_hl > 0) and (r_v < 0)
    squat_f = (r_hl < 0) and (r_v > 0)
    mfi = low - (low * offset)
    [mfi, green_f, fade_f, fake_f, squat_f]

//#endregion —————————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Constants

// Input Groups
string P_GP_1      =      ""

//#endregion —————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Inputs

//#endregion ———————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Price Data



//#endregion ———————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Indicators

[p_ind_1_mfi, p_ind_1_greenBar, p_ind_1_fadeBar, p_ind_1_fakeBar, p_ind_1_squatBar]      =      p_ta_market_facilitation_index(0.005) // MFI


//#endregion ———————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Conditions

//#endregion ———————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Indicator Plots

// MFI
// Market Facilitation Index color logic
p_ind_1_mfi_color = p_ind_1_greenBar ? color.rgb(76, 175, 80, 0) : p_ind_1_fadeBar ? color.rgb(33, 150, 243, 0) : p_ind_1_fakeBar ? color.rgb(158, 158, 158, 0) : p_ind_1_squatBar ? color.rgb(244, 67, 54, 0) : na

// Plot MFI with conditional color
plot(p_ind_1_mfi, title="MFI", color=p_ind_1_mfi_color, style=plot.style_circles, linewidth=4)

//#endregion ————————————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Custom Plots

//#endregion —————————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Alert

//#endregion ——————————————————————————————————————————————————————

Chart Preview

Market Facilitation Index indicator on SPY Daily chart in TradingView — showing colored circles below price bars with green, blue, gray, and red classifications indicating market efficiency states

Chart Annotation Guide

ElementDescription
Green circleRange expanding, volume expanding — the market is moving efficiently with full institutional participation. The ideal condition for trend continuation.
Blue circle (Fade)Range shrinking, volume shrinking — interest drying up. Not a signal by itself, but a series of fades before a green bar suggests fresh participation entering.
Gray circle (Fake)Range expanding, volume declining — the price move is not backed by real volume. Suspect bar. Price may revert in the next session.
Red circle (Squat)Range shrinking, volume rising — trapped energy building. The most watched MFI signal. Often precedes a strong directional move within 3-5 bars, but direction is not predetermined.

MFI Parameters

ParameterDefault ValueDescriptionRecommended Range
offset0.005The vertical offset percentage below the low where the colored circle is plotted. A value of 0.005 means the circle displays 0.5% below the bar's low. Higher values push it further down, useful on volatile charts with wide bars.0.003–0.015 (most common: 0.005, 0.008, 0.010)

Tuning Scenarios by Trading Style

ScenarioOffsetTimeframeUse Case
Scalping0.0031H cryptoTight offset keeps circles close to price on high-volatility pairs, reducing visual clutter
Swing0.0054H–Daily stocksDefault offset is adequate for standard daily and 4H charts on large-cap equities
Position0.010Daily futuresHigher offset prevents circles from overlapping wide-range bars during volatile futures sessions

The offset parameter is purely visual — it does not affect signal logic. The offset exists only to keep the circles readable across different chart scales and volatility regimes. On ES futures daily charts with 20+ point ranges, I needed 0.01 to keep circles visible. On SPY daily, 0.005 is adequate. The offset has zero impact on whether a bar is classified as green, blue, gray, or red.

Reading the MFI Signals

The Market Facilitation Index generates four binary signals per bar — one per color — each telling you something specific about the relationship between price range and volume. Unlike RSI or Stochastic, there are no overbought or oversold levels. The classification is always one of four mutually exclusive states. The table below breaks down each signal on a Daily chart.

SignalConditionMeaningReliability on Daily
Green (Efficient)Range↑ AND Volume↑Healthy price discovery with full market participation — current direction is backed by real volumeHigh
Blue (Fade)Range↓ AND Volume↓Market interest drying up — low participation, often seen before a breakout or a breakdownMedium
Gray (Fake)Range↑ AND Volume↓Price is moving but volume is not supporting it — the move is suspect and likely to reverseMedium
Red (Squat)Range↓ AND Volume↑Volume piling in while price stalls — trapped energy building, explosive move likely within 3-5 barsHigh

Common misinterpretation: A squat bar (red) does not tell you which direction the reversal will go. It only says energy is building — the subsequent breakout can go up or down. Many traders assume a squat bar after a downtrend must be a bullish reversal signal. It is not. The squat bar on SPY in October 2023 preceded a powerful rally, but the squat bar on AAPL in August 2023 was followed by another 5% drop. Always wait for the green bar that follows the squat to confirm direction — the squat itself is neutral. A green bar after a squat is the real entry trigger.

MFI Trading Strategies

MFI works best when you treat the squat bar and the green bar as a pair, not as individual signals. The squat bar tells you energy is building. The green bar tells you which direction that energy is releasing. I have used this pairing on ES futures and SPY for about two years now, and the squat-to-green sequence is the only MFI pattern I trade with any consistency.

Strategy 1 — Squat-to-Green Reversal

Market environment: ranging / reversal · Best timeframe: Daily, 4H

This is the core MFI strategy. A squat bar signals trapped energy — volume is rising but price is not moving. When the next bar (or one within 3 bars) prints green, the energy is releasing in that direction. The green bar confirms the direction of the breakout. In a ranging market, this setup catches the transition from consolidation to expansion.

  1. Identify a squat bar: range decreasing, volume increasing — red circle below the bar
  2. Wait for a green bar within the next 1–3 bars: range increasing, volume increasing — green circle appears
  3. Long entry: Green bar appears AND its close is above the squat bar's high — direction is confirmed to the upside
  4. Short entry: Green bar appears AND its close is below the squat bar's low — direction is confirmed to the downside
  5. Stop-loss: 1× ATR(14) beyond the squat bar's opposite extreme — if long, stop below the squat bar's low
  6. Exit: A fake bar (gray) or a fade bar (blue) appears — the energy that drove the move is fading, exit and reassess

Strategy 2 — Green Bar Trend Continuation

Market environment: trending · Best timeframe: 4H, Daily

In a confirmed trend, consecutive green bars confirm that each directional push has real volume behind it. This strategy filters out pullbacks and fake-outs by requiring green bars to confirm participation. It works well on daily charts where trends produce 3-7 green bars in sequence before a pullback.

  1. Confirm the trend: price above 200 EMA for uptrend, below for downtrend
  2. Wait for a green bar to appear — any green bar in the trend direction
  3. Long entry: Green bar prints, and the previous bar was not green (fade, fake, or squat) — you are entering on the first sign of renewed participation after a pause
  4. Stop-loss: 1.5× ATR(14) below the low of the entry green bar
  5. Exit: Two consecutive non-green bars (fade, fake, or squat) appear — the trend has lost participation momentum. Exit immediately. Do not wait for a third bar.

I traded this strategy on SPY daily from January to June 2024. It caught the February rally and the April pullback exit within one bar of each turning point. The hardest part was holding through single non-green bars — roughly 30% of the time, a single fade bar was followed by another green bar. The two-bar exit rule saved me from exiting too early about 70% of the time.

Strategy 3 — Fake Bar Fade

Market environment: ranging · Best timeframe: 4H, Daily

Gray fake bars signal that price is moving but volume is not backing it. In a ranging market, a fake bar that pushes to the edge of the range is often the exhaustion move before a reversal back toward the mean. This is a contrarian setup — you bet against the fake bar's direction.

  1. Identify a ranging market: price oscillating between clear support and resistance, no directional trend
  2. Spot a fake bar near the range extreme: gray circle appears while price pushes toward resistance or support
  3. Short entry (fake bar at resistance): Fake bar pushes to range resistance AND the next bar fails to close above the fake bar's high — the breakout attempt failed
  4. Long entry (fake bar at support): Fake bar pushes to range support AND the next bar fails to close below the fake bar's low — the breakdown attempt failed
  5. Stop-loss: Beyond the fake bar's extreme — if short, stop above the fake bar's high; if long, stop below the fake bar's low
  6. Exit: Price reaches the opposite side of the range or a green bar prints in the opposite direction — the mean reversion target has been hit

I tested this on SPY ranging periods in 2022. The fake bar at range resistance setup had about 8 occurrences over 4 months, and 6 of them reversed back to the range low within 5 bars. The two failures occurred during a broadening range pattern — the range itself was not well defined, so the fake bar was actually a real breakout in disguise. Clear range boundaries are critical for this strategy.

StrategyMarket TypeWin Rate RangeBest PairRisk Level
Squat-to-GreenRanging / Reversal~55–65%ATR(14) + Support/ResistanceMedium
Green Bar ContinuationTrending~55–65%200 EMALow–Medium
Fake Bar FadeRanging~50–60%Range BoundariesLow

Win rate ranges are approximate illustrations based on 2020–2024 SPY and ES data. Past performance does not guarantee future results.

Disclaimer: The strategies above are for educational purposes only and do not constitute investment advice. Past performance does not guarantee future results. Always apply proper risk management and position sizing.

Market Facilitation Index vs On-Balance Volume vs Volume ROC

How does the Market Facilitation Index compare to other volume-based indicators available in TradingView? The two most relevant comparisons are On-Balance Volume (OBV) — the most popular volume indicator — and Volume Rate of Change (Volume ROC), which measures the speed of volume changes. All three use volume data, but they answer fundamentally different questions about the market.

FeatureMFI (Market Facilitation Index)OBVVolume ROC
TypePer-bar classificationCumulative volume flowMomentum of volume
OutputColored circles (4 types)Single line, unboundedOscillator around zero
LagZero (per-bar, no lookback)LowDepends on period (low with 1)
Best forEntry timing, reversal detectionTrend confirmation, divergenceVolume spike detection
Signals per day (Daily)~1–3 color changesN/A (continuous line)~1–2 extreme readings
Requires volumeYes, must be honestYesYes

So when do you pick one over another? I reach for the MFI when I want to time entries — the squat-to-green sequence tells me exactly when trapped energy is releasing, which OBV cannot do. OBV is better when I need trend confirmation over weeks or months. An OBV line making higher highs alongside price confirms the trend has institutional backing. Volume ROC is my pick for spotting climax events — a sudden Volume ROC spike above +100% often marks a local exhaustion point. On the SPY daily, Volume ROC hitting +150% in a single session has historically aligned with intraday reversals about 70% of the time, but the signal lasts only one bar.

The practical takeaway: MFI and OBV serve different roles. MFI tells you about the current bar's quality. OBV tells you about the cumulative direction of volume. I use OBV to decide the trend direction and MFI to decide when to enter within that trend. For volatility traders, Volume ROC fills the gap by flagging abnormal volume activity that neither MFI nor OBV catches. If I could keep only one, it would be OBV for its simplicity and trend-read — but MFI adds a dimension that no cumulative indicator touches.

Common Mistakes When Using the Market Facilitation Index

  1. 1. Assuming a squat bar is always bullish

    A red squat bar means volume is rising while range is shrinking — trapped energy. It does not tell you which direction the energy will release. Squat bars after downtrends often precede upward reversals, but squat bars after uptrends can precede sharp drops. Always wait for the green bar that follows to confirm direction. Do not enter on the squat alone.

  2. 2. Using MFI on low-volume instruments

    The entire MFI logic depends on honest, meaningful volume data. On low-volume penny stocks or thinly traded ETFs, the ROC calculations produce random color transitions on every bar. I tested this on a $2M market cap stock and got 12 color changes in 14 bars — pure noise. Stick to high-volume names: SPY, AAPL, TSLA, BTC/USDT, ES, NQ.

  3. 3. Ignoring the timeframe

    MFI on a 5-minute chart produces a new color every 1-3 bars on average — roughly 40-60 transitions per session. Most of these are statistical noise caused by bid-ask bounce and low-liquidity gaps between candles. The indicator was designed for daily bars. On lower timeframes, the squat signal loses about half of its predictive value. Do not trade MFI below 1H.

  4. 4. Treating fade bars as confirmation

    Blue fade bars (range down, volume down) simply mean the market is going quiet. They do not confirm a reversal or a continuation. Many beginners see a series of fade bars and assume a breakout is imminent. Sometimes the market just stays quiet. A fade bar is only meaningful when followed by a green bar — the green bar after a fade series signals that fresh participation is entering after a lull.

  5. 5. Over-trading fake bar signals

    Gray fake bars (range up, volume down) look like obvious traps — price moving without volume. The problem is that fake bars appear frequently, and many of them are followed by another fake bar rather than a reversal. In trending markets, fake bars can string together for 3-5 bars while price continues moving. Do not short every fake bar. Confirm with a range boundary or a support/resistance level before acting.

How to Generate the Market Facilitation Index in Pineify

  1. 1

    Open Pineify

    Go to pineify.app and sign in — a free account gives you access to the AI Coding Agent that can generate the complete MFI Pine Script code and any other custom indicator without paying.

  2. 2

    Click "New Indicator"

    Select "Indicator" from the Pineify dashboard creation menu. You can then describe the exact MFI configuration you need, including offset percentage and circle color preferences.

  3. 3

    Describe the MFI configuration you need

    Type a prompt such as: "Plot the Market Facilitation Index with circles below each bar. Use green for rising range and rising volume, blue for falling range and falling volume, gray for rising range and falling volume, and red for falling range and rising volume." Pineify's AI Coding Agent converts your natural language into complete, runnable Pine Script v6 code in seconds.

  4. 4

    Copy to TradingView

    Click "Copy to TradingView" to copy the generated code to your clipboard. Open TradingView, launch the Pine Script editor with Alt+P, paste the code, and click "Add to chart." The MFI colored circles appear instantly below the price bars on your chart.

  5. 5

    Adjust the offset and colors

    Open the TradingView indicator settings panel to fine-tune the visual layout. Increase the offset percentage on volatile tickers to prevent circles from overlapping large bars. The default color scheme — green, blue, gray, red — is set in the drawing parameters and can be customized to match your chart theme.

Frequently Asked Questions

MFI in Seconds

Skip the manual Pine Script coding. Pineify's AI Coding Agent generates complete, ready-to-use Market Facilitation Index indicators — with custom color schemes, offset settings, and multi-timeframe detection — instantly for free.

Try Pineify Free