Candlestick Tape Reader For ThinkOrSwim

atcsam

Market Structure Expert
Plus
⭐ “Candlestick Tape Reader”

7La446j.png

Overview
Most traders look at candles and see shapes.
Operators look at candles and see intent.
The Candlestick Tape Reader is a compact, operator‑grade engine that reads the last three bars the way a tape reader would:
  • Who showed intent
  • Who backed off
  • Who pressed
  • Who trapped
  • Who hesitated
  • Who absorbed
  • Who lost control

XAHHy8D.png


see study script down below
Chart Link (all studies, a modified Better Volume is included in the Volume bar)
PFE-Chart https://tos.mx/!bJxxTuOP


Instead of memorizing 40+ patterns, the Tape Reader compresses everything into a simple, actionable output:
Reversal · Strong Body · Indecision · Neutral
paired with
Bias: Up · Down · Flat
It’s not a prediction tool.
It’s not a signal generator.
It’s a narrative engine — a way to read the story of the last three bars with clarity and consistency.
When combined with:
  • AdaptiveTrend v13+ — structural drift
  • MicroState — environment
  • Volume — participation
  • Price — immediate movement
…you get a complete picture of what the market is trying to do versus what it’s actually doing.
This is where the edge lives — in the disagreement:
  • Tape UP + Trend DOWN → early reversal attempt
  • Tape DOWN + Trend UP → early topping attempt
  • Tape + Trend aligned → continuation
  • Tape Indecision → no edge
  • Tape Neutral → nothing meaningful in the last 3 bars
The Tape Reader doesn’t tell you what to do.
It tells you what’s happening, cleanly and honestly, without noise — and it organizes that information into three groups.
1. Last Three Bars
1‑Bar and 2‑Bar Statements
This is the immediate tape story — the short‑term intent.
The Tape Reader evaluates each of the last three candles individually and in pairs, surfacing the core pattern types below.

Pattern Types
  • Strong body bars
  • Reversal bars
  • Indecision bars
  • Neutral bars
  • Continuation bars
  • Inside Bar / Outside Bar
  • Engulfing (Bull/Bear)
  • Tweezer Top / Bottom
  • Harami / Harami Cross
  • Pin Bars (Bull/Bear)
  • Belt Holds (Bull/Bear)
  • Piercing Line / Dark Cloud Cover
  • Shooting Star
  • Kangaroo Tail
These classifications produce a bar‑by‑bar narrative of pressure, hesitation, absorption, and control.
2. Multi‑Bar / Special Patterns
3+ Bar Structural Patterns
These are the larger, more meaningful patterns that add structural context.
They do not appear in the tape strip but are surfaced as separate labels.

Special Patterns
  • Morning Star
  • Evening Star
  • Three Inside Up
  • Three Inside Down
  • Three Line Strike (Bull)
  • Three Line Strike (Bear)
  • Three White Soldiers
  • Three Black Crows
  • Abandoned Baby (Bull)
  • Abandoned Baby (Bear)
  • Breakaway (Bear)
  • Rising Three Methods
  • Falling Three Methods
  • Upside Tasuki Gap
  • Downside Tasuki Gap
  • Two Black Gapping
  • Multi‑bar pressure sequences
  • Structural reversal clusters
  • Trend‑pause compression sequences
  • Continuation clusters
These patterns add weight to the narrative and highlight moments where the market is doing something structurally important.

3. Tape Narrative
Summary Classification + Directional Bias
Finally, the Tape Reader compresses everything into a single, clean headline:
Reversal · Strong Body · Indecision · Neutral
paired with
Bias: Up · Down · Flat
This is the distilled intent of the last three bars — the tape’s version of the truth.
It clarifies:
  • Who is pressing
  • Who is backing off
  • Whether momentum is building
  • Whether a turn is forming
  • Whether nothing meaningful is happening
  • Whether the bias is shifting
  • Whether continuation is strengthening
This final summary ties the entire tape story together into a form you can actually use.

Exp. Here we have a Tweezer Top formed on two down candles. Two bars later, price resolves back up into the tweezer’s rejection level.


CdBhoA9_d.png





Developers Note:
Study options include label position (Default: Top Right, reading right → left)

Labels are broken into 3 groups
  • 3‑Bar Tape
  • Patterns
  • Tape Summary (Yes for all by default)

One last project in work for the Bottom Left corner and I'll be finished with the price chart...

Study Link: Candlestick Tape https://tos.mx/!vCGMFtqn
Ruby:
# atcsam - Candlestick - Tape Reader 03/17/26
# Playing it forward
# Credits
# useThinkscriptCommunity
# CandleStickAnalysis_R1V7
# Written by KumoBob aka Bob Campbell
# http://fibonacci-financial.blogspot.com/

declare upper;
input LabelPos = {default "Top Right", "Top Left", "Bottom Right", "Bottom Left"};
# Formatted for top right, read right to left
def pos =
    if LabelPos == LabelPos."Top Left" then 0 else
    if LabelPos == LabelPos."Top Right" then 1 else
    if LabelPos == LabelPos."Bottom Left" then 2 else
    3;

input show3barLabels   = yes;
input showExtraLabels  = yes;
input ShowTapeBias     = yes;
input lookbackForAvg   = 14;
input dojiBodyToRange  = 0.1;
input hammerShadowToBody   = 2.0;
input shootingShadowToBody = 2.0;
input smallBodyFrac    = 0.35;
input longBodyFrac     = 0.60;
input equalHighLowTickFrac = 0.10;
input trendLen         = 8;
input bodyLengthLookback = 20;
input bodyMultiplier     = 1.5;

def o = open;
def h = high;
def l = low;
def c = close;

def body  = AbsValue(c - o);
def range = h - l;
def upper = h - Max(o, c);
def lower = Min(o, c) - l;
def avgRange = Average(range, lookbackForAvg);

def bullish = c > o;
def bearish = c < o;

def upTrend   = c > Average(c, trendLen);
def downTrend = c < Average(c, trendLen);

def gapUp   = l > h[1];
def gapDown = h < l[1];

def tinyBody  = body <= dojiBodyToRange * range;
def smallBody = body <= smallBodyFrac * range;
def longBody  = body >= longBodyFrac * range;

# === Pin Bars ===
def isBullPin =
    bullish and
    lower >= 2 * body and
    upper <= 0.3 * body;

def isBearPin =
    bearish and
    upper >= 2 * body and
    lower <= 0.3 * body;

########Shared #########

def bodyPct =
    if range > 0 then body / range else 0;
def upperPct =
    if range > 0 then upper / range else 0;

def lowerPct =
    if range > 0 then lower / range else 0;

# === Doji Family (tight) ===

def isDoji =
    bodyPct <= 0.20 and
    AbsValue(upperPct - lowerPct) <= 0.25;

def isDragonflyDoji =
    isDoji and
    lower >= 0.6 * range and
    upper <= 0.1 * range;

def isGravestoneDoji =
    isDoji and
    upper >= 0.6 * range and
    lower <= 0.1 * range;

def isLongLeggedDoji =
    isDoji and
    upperPct >= 0.40 and
    lowerPct >= 0.40 and
    range >= avgRange * 1.2;

# === Spinner / High‑Wave ===

def isSpinner =
    bodyPct > 0.10 and bodyPct <= 0.35 and
    upper >= 0.25 * range and
    lower >= 0.25 * range and
    AbsValue(upper - lower) <= 0.25 * range;

input Highwave_Wick_Multiplier = 3.0;
input Range_Multiplier = 1.0;
def dojiHW =
    tinyBody and
    AbsValue(upper - lower) <= 0.2 * range;

def wickBalance =
    AbsValue(upperPct - lowerPct) <= 0.20;   # adjust tolerance as needed

def isHighWave =
    !isDoji and
    bodyPct <= 0.25 and
    upperPct >= 0.35 and
    lowerPct >= 0.35 and
    range > avgRange * 1.1;

#### Kangaroo / shooting star

def isKangarooBull =
    bodyPct <= 0.25 and
    lowerPct >= 0.60 and
    upperPct <= 0.20;

def isShootingStar =
    bodyPct <= 0.25 and
    upperPct >= 0.60 and
    lowerPct <= 0.20;

# === One- and Two-Bar Patterns (reversal / strong body) ===
def isHammer   = lower >= hammerShadowToBody * body and upper <= 0.3 * body and downTrend;
def isInverted = upper >= hammerShadowToBody * body and lower <= 0.3 * body and downTrend;
def isShooting = upper >= shootingShadowToBody * body and lower <= 0.3 * body and upTrend and bearish;

def isMaruBull = bullish and upper <= 0.1 * range and lower <= 0.1 * range and body >= longBodyFrac * range;
def isMaruBear = bearish and upper <= 0.1 * range and lower <= 0.1 * range and body >= longBodyFrac * range;

def isBullEngulf = bullish and bearish[1] and o <= c[1] and c >= o[1];
def isBearEngulf = bearish and bullish[1] and o >= c[1] and c <= o[1];

# === Piercing Line / Dark Cloud ===
def isPiercingLine =
    bearish[1] and
    bullish and
    o < l[1] and
    c > (o[1] + c[1]) / 2 and
    c < o[1];

def isDarkCloud =
    bullish[1] and
    bearish and
    o > h[1] and
    c < (o[1] + c[1]) / 2 and
    c > c[1];

# === Harami / Harami Cross ===
def isBullHarami =
    bearish[1] and
    bullish and
    o > c[1] and
    c < o[1];

def isBearHarami =
    bullish[1] and
    bearish and
    o < c[1] and
    c > o[1];

def isBullHaramiCross =
    bearish[1] and
    isDoji and
    o > c[1] and
    c < o[1];

def isBearHaramiCross =
    bullish[1] and
    isDoji and
    o < c[1] and
    c > o[1];

# ================================
#   TWEEZER TOP / BOTTOM MODULE
# ================================

# --- Tolerance ---
def tolerance = equalHighLowTickFrac * avgRange;

# --- Range Guards ---
def range0 = h - l;
def range1 = h[1] - l[1];

# --- Wick Sizes ---
def botWick0 = o - l;
def botWick1 = o[1] - l[1];

def topWick0 = h - o;
def topWick1 = h[1] - o[1];

# --- Wick Meaningfulness (10% of range) ---
def wickThreshold = 0.10;

def botWickMeaningful0 = range0 > 0 and botWick0 / range0 > wickThreshold;
def botWickMeaningful1 = range1 > 0 and botWick1 / range1 > wickThreshold;

def topWickMeaningful0 = range0 > 0 and topWick0 / range0 > wickThreshold;
def topWickMeaningful1 = range1 > 0 and topWick1 / range1 > wickThreshold;

# ================================
#   TWEEZER BOTTOM
#   (Bottom ↔ Bottom only)
# ================================

# Wick ↔ Wick (preferred)
def tb_wick_wick =
    botWickMeaningful0 and botWickMeaningful1 and
    AbsValue(l - l[1]) <= tolerance;

# Body ↔ Body fallback (still bottom ↔ bottom)
def tb_body_body =
    (!botWickMeaningful0 or !botWickMeaningful1) and
    AbsValue(l - l[1]) <= tolerance;

def isTweezerBottom =
    tb_wick_wick or tb_body_body;


# ================================
#   TWEEZER TOP
#   (Top ↔ Top only)
# ================================

# Wick ↔ Wick (preferred)
def tt_wick_wick =
    topWickMeaningful0 and topWickMeaningful1 and
    AbsValue(h - h[1]) <= tolerance;

# Body ↔ Body fallback (still top ↔ top)
def tt_body_body =
    (!topWickMeaningful0 or !topWickMeaningful1) and
    AbsValue(h - h[1]) <= tolerance;

def isTweezerTop =
    tt_wick_wick or tt_body_body;


# === Inside / Outside Bars (neutral) ===
def isInsideBar =
    h < h[1] and
    l > l[1];

def isOutsideBar =
    h > h[1] and
    l < l[1];

# === Continuation: Tasuki / Two Black Gapping ===
def isUpsideTasukiGap =
    bullish[1] and bullish and
    o > c[1] and
    c < c[1] and
    l > h[1];

def isDownsideTasukiGap =
    bearish[1] and bearish and
    o < c[1] and
    c > c[1] and
    h < l[1];

def isTwoBlackGapping =
    bearish[1] and bearish and
    o < l[1] and
    c < c[1];

# === Multi-Bar Patterns (3+ bars) ===
def middleSmall = smallBody[1] or isDoji[1];

def isMorningStar =
    bearish[2] and middleSmall and bullish and
    c > (o[2] + c[2]) / 2 and downTrend[2];

def isEveningStar =
    bullish[2] and middleSmall and bearish and
    c < (o[2] + c[2]) / 2 and upTrend[2];

def isThreeInsideUp =
    bearish[2] and bullish[1] and
    Max(o[1], c[1]) <= Max(o[2], c[2]) and
    Min(o[1], c[1]) >= Min(o[2], c[2]) and
    c > o[2];

def isThreeInsideDown =
    bullish[2] and bearish[1] and
    Max(o[1], c[1]) <= Max(o[2], c[2]) and
    Min(o[1], c[1]) >= Min(o[2], c[2]) and
    c < o[2];

def longBull2 = (c[2] > o[2]) and ((c[2] - o[2]) >= longBodyFrac * (h[2] - l[2])) and ((h[2] - c[2]) <= 0.25 * (h[2] - l[2]));
def longBull1 = (c[1] > o[1]) and ((c[1] - o[1]) >= longBodyFrac * (h[1] - l[1])) and ((h[1] - c[1]) <= 0.25 * (h[1] - l[1]));
def longBull0 = (c > o)       and ((c - o)       >= longBodyFrac * (h - l))       and ((h - c)       <= 0.25 * (h - l));

def longBear2 = (c[2] < o[2]) and ((o[2] - c[2]) >= longBodyFrac * (h[2] - l[2])) and ((c[2] - l[2]) <= 0.25 * (h[2] - l[2]));
def longBear1 = (c[1] < o[1]) and ((o[1] - c[1]) >= longBodyFrac * (h[1] - l[1])) and ((c[1] - l[1]) <= 0.25 * (h[1] - l[1]));
def longBear0 = (c < o)       and ((o - c)       >= longBodyFrac * (h - l))       and ((c - l)       <= 0.25 * (h - l));

def isThreeWhiteSoldiers =
    longBull2 and longBull1 and longBull0 and
    c > c[1] and c[1] > c[2] and downTrend[3];

def isThreeBlackCrows =
    longBear2 and longBear1 and longBear0 and
    c < c[1] and c[1] < c[2] and upTrend[3];

def isAbandonedBabyBull = gapDown[1] and isDoji[1] and gapUp and bullish;
def isAbandonedBabyBear = gapUp[1]   and isDoji[1] and gapDown and bearish;

def isThreeLineStrikeBear =
    bearish[3] and bearish[2] and bearish[1] and bullish and c > h[2];

def isThreeLineStrikeBull =
    bullish[3] and bullish[2] and bullish[1] and bearish and c < l[2];

def isBreakawayBear =
    bullish[4] and gapUp[3] and bearish[3] and bearish[2] and bearish[1] and bearish and c < c[3];

# Rising / Falling Three Methods
def isRisingThree =
    bullish[4] and
    bearish[3] and bearish[2] and bearish[1] and
    h[3] < h[4] and l[3] > l[4] and
    h[2] < h[4] and l[2] > l[4] and
    h[1] < h[4] and l[1] > l[4] and
    bullish and
    c > c[4];

def isFallingThree =
    bearish[4] and
    bullish[3] and bullish[2] and bullish[1] and
    h[3] < h[4] and l[3] > l[4] and
    h[2] < h[4] and l[2] > l[4] and
    h[1] < h[4] and l[1] > l[4] and
    bearish and
    c < c[4];

# === Long-body context (belt holds) ===
def avgBody = Average(body, bodyLengthLookback);
def isLongBody = body > avgBody * bodyMultiplier;

def upperShadow = h - Max(o, c);
def lowerShadow = Min(o, c) - l;

def closeNearHigh = (h - c) / (h - l) < 0.3;
def closeNearLow  = (c - l) / (h - l) < 0.3;

def isLongBull = bullish and isLongBody;
def isLongBear = bearish and isLongBody;

def bullBeltHold =
    isLongBull and lowerShadow < body * 0.1 and closeNearHigh and isLongBear[1];

def bearBeltHold =
    isLongBear and upperShadow < body * 0.1 and closeNearLow and isLongBull[1];

# -----------------------------
#  classifyBar (priority)
# -----------------------------
script classifyBar {
    input isHammer = no;
    input isInverted = no;
    input isShooting = no;
    input isBullEngulf = no;
    input isBearEngulf = no;
    input isMaruBull = no;
    input isMaruBear = no;
    input isDragonflyDoji = no;
    input isGravestoneDoji = no;
    input isLongLeggedDoji = no;
    input isDoji = no;
    input isSpinner = no;
    input isHighWave = no;
    input isBullPin = no;
    input isBearPin = no;
    input isTweezerTop = no;
    input isTweezerBottom = no;
    input isPiercingLine = no;
    input isDarkCloud = no;
    input isBullHarami = no;
    input isBearHarami = no;
    input isBullHaramiCross = no;
    input isBearHaramiCross = no;
    input isKangaroo = no;    
    input isShootingStar = no;
    input bull = no;
    input bear = no;

   def isRev =
    isHammer or isInverted or isShooting or
    isBullEngulf or isBearEngulf or
    isBullPin or isBearPin or
    isTweezerTop or isTweezerBottom or
    isPiercingLine or isDarkCloud or
    isBullHarami or isBearHarami or
    isBullHaramiCross or isBearHaramiCross or
    isKangaroo or isShootingStar;


    def isStrong =
        !isRev and (isMaruBull or isMaruBear);

    def isIndec =
        !isRev and !isStrong and
        (isSpinner or isHighWave or
         isDragonflyDoji or isGravestoneDoji or
         isLongLeggedDoji or isDoji);

    def classCode =
        if isRev then 3
        else if isStrong then 2
        else if isIndec then 1
        else 0;

    def dirCode =
        if bull then 1
        else if bear then -1
        else 0;

    plot outClass = classCode;
    outClass.SetHiding(yes);


    plot outDir   = dirCode;
    outDir.SetHiding(yes);
}

# -----------------------------
#  3-BAR TAPE CLASS / DIR
# -----------------------------
def class0 = classifyBar(
    isHammer, isInverted, isShooting,
    isBullEngulf, isBearEngulf,
    isMaruBull, isMaruBear,
    isDragonflyDoji, isGravestoneDoji, isLongLeggedDoji,
    isDoji,
    isSpinner, isHighWave,
    isBullPin, isBearPin,
    isTweezerTop, isTweezerBottom,
    isPiercingLine, isDarkCloud,
    isBullHarami, isBearHarami,
    isBullHaramiCross, isBearHaramiCross,
    isKangarooBull, isShootingStar,
    bullish, bearish
).outClass;

def dir0 = classifyBar(
    isHammer, isInverted, isShooting,
    isBullEngulf, isBearEngulf,
    isMaruBull, isMaruBear,
    isDragonflyDoji, isGravestoneDoji, isLongLeggedDoji,
    isDoji,
    isSpinner, isHighWave,
    isBullPin, isBearPin,
    isTweezerTop, isTweezerBottom,
    isPiercingLine, isDarkCloud,
    isBullHarami, isBearHarami,
    isBullHaramiCross, isBearHaramiCross,
    isKangarooBull, isShootingStar,
    bullish, bearish
).outDir;

def class1 = classifyBar(
    isHammer[1], isInverted[1], isShooting[1],
    isBullEngulf[1], isBearEngulf[1],
    isMaruBull[1], isMaruBear[1],
    isDragonflyDoji[1], isGravestoneDoji[1],
    isLongLeggedDoji[1],
    isDoji[1],
    isSpinner[1], isHighWave[1],
    isBullPin[1], isBearPin[1],
    isTweezerTop[1], isTweezerBottom[1],
    isPiercingLine[1], isDarkCloud[1],
    isBullHarami[1], isBearHarami[1],
    isBullHaramiCross[1], isBearHaramiCross[1],
    isKangarooBull[1], isShootingStar[1],
    bullish[1], bearish[1]
).outClass;

def dir1 = classifyBar(isHammer, isInverted, isShooting,
    isBullEngulf, isBearEngulf,
    isMaruBull, isMaruBear,
    isDragonflyDoji, isGravestoneDoji, isLongLeggedDoji,
    isDoji,
    isSpinner, isHighWave,
    isBullPin, isBearPin,
    isTweezerTop, isTweezerBottom,
    isPiercingLine, isDarkCloud,
    isBullHarami, isBearHarami,
    isBullHaramiCross, isBearHaramiCross,
    isKangarooBull, isShootingStar,
    bullish, bearish

).outDir;

def class2 = classifyBar(
    isHammer[2], isInverted[2], isShooting[2],
    isBullEngulf[2], isBearEngulf[2],
    isMaruBull[2], isMaruBear[2],
    isDragonflyDoji[2], isGravestoneDoji[2],
    isLongLeggedDoji[2], isDoji[2],
    isSpinner[2], isHighWave[2],
    isBullPin[2], isBearPin[2],
    isTweezerTop[2], isTweezerBottom[2],
    isPiercingLine[2], isDarkCloud[2],
    isBullHarami[2], isBearHarami[2],
    isBullHaramiCross[2], isBearHaramiCross[2],
    isKangarooBull[2], isShootingStar[2],
    bullish[2], bearish[2]
).outClass;

def dir2 = classifyBar(
    isHammer[2], isInverted[2], isShooting[2],
    isBullEngulf[2], isBearEngulf[2],
    isMaruBull[2], isMaruBear[2],
    isDragonflyDoji[2], isGravestoneDoji[2], isLongLeggedDoji[2], isDoji[2],
    isSpinner[2], isHighWave[2],
    isBullPin[2], isBearPin[2],
    isTweezerTop[2], isTweezerBottom[2],
    isPiercingLine[2], isDarkCloud[2],
    isBullHarami[2], isBearHarami[2],
    isBullHaramiCross[2], isBearHaramiCross[2],
    isKangarooBull[2], isShootingStar[2],
    bullish[2], bearish[2]
).outDir;

def tapeClass = Max(Max(class0, class1), class2);
def tapeDir   = dir0 + dir1 + dir2;

def isTapeReversal   = tapeClass == 3;
def isTapeStrongBody = tapeClass == 2;
def isTapeIndecision = tapeClass == 1;

# -----------------------------
#  3-BAR TAPE STRIP (Bar 1, 2, 3)
# -----------------------------
DefineGlobalColor("Bull", Color.GREEN);
DefineGlobalColor("Bear", Color.RED);
DefineGlobalColor("Neutral", Color.CYAN);

script barCode {
    input isHammer = no;
    input isInverted = no;
    input isShooting = no;
    input isMaruBull = no;
    input isMaruBear = no;
    input isBullEngulf = no;
    input isBearEngulf = no;
    input isDragonflyDoji = no;
    input isGravestoneDoji = no;
    input isLongLeggedDoji = no;
    input isDoji = no;
    input isSpinner = no;
    input isHighWave = no;
    input isBullPin = no;
    input isBearPin = no;
    input isTweezerTop = no;
    input isTweezerBottom = no;
    input isPiercingLine = no;
    input isDarkCloud = no;
    input isBullHarami = no;
    input isBearHarami = no;
    input isBullHaramiCross = no;
    input isBearHaramiCross = no;
    input isInsideBar = no;
    input isOutsideBar = no;
    input isUpsideTasukiGap = no;
    input isDownsideTasukiGap = no;
    input isTwoBlackGapping = no;
    input iskangaroobull = no;
    input isshootingstar = no;

    plot out =
        if isBullPin then 1
        else if isBearPin then 2
        else if isHammer then 3
        else if isInverted then 4
        else if isShooting then 5
        else if isMaruBull then 6
        else if isMaruBear then 7
        else if isBullEngulf then 8
        else if isBearEngulf then 9
        else if isSpinner then 10
        else if isHighWave then 11
        else if isDragonflyDoji then 12
        else if isGravestoneDoji then 13
        else if isLongLeggedDoji then 14
        else if isDoji then 15
        else if isTweezerTop then 16
        else if isTweezerBottom then 17
        else if isPiercingLine then 18
        else if isDarkCloud then 19
        else if isBullHarami then 20
        else if isBearHarami then 21
        else if isBullHaramiCross then 22
        else if isBearHaramiCross then 23
        else if isInsideBar then 24
        else if isOutsideBar then 25
        else if isUpsideTasukiGap then 26
        else if isDownsideTasukiGap then 27
        else if isTwoBlackGapping then 28
        else if isKangaroobull then 29
        else if isShootingStar then 30
        else 0;
}

def code0 = barCode(
    isHammer, isInverted, isShooting,
    isMaruBull, isMaruBear,
    isBullEngulf, isBearEngulf,
    isDragonflyDoji, isGravestoneDoji, isLongLeggedDoji,
    isDoji,
    isSpinner, isHighWave,
    isBullPin, isBearPin,
    isTweezerTop, isTweezerBottom,
    isPiercingLine, isDarkCloud,
    isBullHarami, isBearHarami,
    isBullHaramiCross, isBearHaramiCross,
    isInsideBar, isOutsideBar,
    isUpsideTasukiGap, isDownsideTasukiGap,
    isTwoBlackGapping,
    iskangaroobull,
    isshootingstar
).out;

def code1 = barCode(
    isHammer[1], isInverted[1], isShooting[1],
    isMaruBull[1], isMaruBear[1],
    isBullEngulf[1], isBearEngulf[1],
    isDragonflyDoji[1], isGravestoneDoji[1],  
    isLongLeggedDoji[1], isDoji[1],
    isSpinner[1], isHighWave[1],
    isBullPin[1], isBearPin[1],
    isTweezerTop[1], isTweezerBottom[1],
    isPiercingLine[1], isDarkCloud[1],
    isBullHarami[1], isBearHarami[1],
    isBullHaramiCross[1], isBearHaramiCross[1],
    isInsideBar[1], isOutsideBar[1],
    isUpsideTasukiGap[1], isDownsideTasukiGap[1],  
    isTwoBlackGapping[1],
    iskangaroobull[1],
    isshootingstar[1]
).out;

def code2 = barCode(
    isHammer[2], isInverted[2], isShooting[2],
    isMaruBull[2], isMaruBear[2],
    isBullEngulf[2], isBearEngulf[2],
    isDragonflyDoji[2], isGravestoneDoji[2], isLongLeggedDoji[2], isDoji[2],
    isSpinner[2], isHighWave[2],
    isBullPin[2], isBearPin[2],
    isTweezerTop[2], isTweezerBottom[2],
    isPiercingLine[2], isDarkCloud[2],
    isBullHarami[2], isBearHarami[2],
    isBullHaramiCross[2], isBearHaramiCross[2],
    isInsideBar[2], isOutsideBar[2],
    isUpsideTasukiGap[2], isDownsideTasukiGap[2],
    isTwoBlackGapping[2],
    iskangaroobull[2],
    isshootingstar[2]
).out;

def bull0 = bullish;
def bull1 = bullish[1];
def bull2 = bullish[2];

def bear0 = bearish;
def bear1 = bearish[1];
def bear2 = bearish[2];

AddLabel(
    show3barLabels,
    (if code0 == 1 then "Bull Pin"
     else if code0 == 2 then "Bear Pin"
     else if code0 == 3 then "Hammer"
     else if code0 == 4 then "Inverted Hammer"
     else if code0 == 5 then "Shooting Star"
     else if code0 == 6 then "Marubozu Bull"
     else if code0 == 7 then "Marubozu Bear"
     else if code0 == 8 then "Bull Engulf"
     else if code0 == 9 then "Bear Engulf"
     else if code0 == 10 then "Spinner"
     else if code0 == 11 then "High‑Wave"
     else if code0 == 12 then "Dragonfly"
     else if code0 == 13 then "Gravestone"
     else if code0 == 14 then "Long‑Legged Doji"
     else if code0 == 15 then "Doji"
     else if code0 == 16 then "Tweezer Top"
     else if code0 == 17 then "Tweezer Bottom"
     else if code0 == 18 then "Piercing Line"
     else if code0 == 19 then "Dark Cloud"
     else if code0 == 20 then "Bull Harami"
     else if code0 == 21 then "Bear Harami"
     else if code0 == 22 then "Harami Cross Bull"
     else if code0 == 23 then "Harami Cross Bear"
     else if code0 == 24 then "Inside Bar"
     else if code0 == 25 then "Outside Bar"
     else if code0 == 26 then "Upside Tasuki"
     else if code0 == 27 then "Downside Tasuki"
     else if code0 == 28 then "Two Black Gapping"
     else if code0 == 29 then "Kangaroo"
     else if code0 == 30 then "Shooting Star"  
     else " ----- "),
    if bull0 then GlobalColor("Bull")
    else if bear0 then GlobalColor("Bear")
    else GlobalColor("Neutral"), pos
);

AddLabel(
    show3barLabels,
    (if code1 == 1 then "Bull Pin"
     else if code1 == 2 then "Bear Pin"
     else if code1 == 3 then "Hammer"
     else if code1 == 4 then "Inverted Hammer"
     else if code1 == 5 then "Shooting Star"
     else if code1 == 6 then "Marubozu Bull"
     else if code1 == 7 then "Marubozu Bear"
     else if code1 == 8 then "Bull Engulf"
     else if code1 == 9 then "Bear Engulf"
     else if code1 == 10 then "Spinner"
     else if code1 == 11 then "High‑Wave"
     else if code1 == 12 then "Dragonfly"
     else if code1 == 13 then "Gravestone"
     else if code1 == 14 then "Long‑Legged Doji"
     else if code1 == 15 then "Doji"
     else if code1 == 16 then "Tweezer Top"
     else if code1 == 17 then "Tweezer Bottom"
     else if code1 == 18 then "Piercing Line"
     else if code1 == 19 then "Dark Cloud"
     else if code1 == 20 then "Bull Harami"
     else if code1 == 21 then "Bear Harami"
     else if code1 == 22 then "Harami Cross Bull"
     else if code1 == 23 then "Harami Cross Bear"
     else if code1 == 24 then "Inside Bar"
     else if code1 == 25 then "Outside Bar"
     else if code1 == 26 then "Upside Tasuki"
     else if code1 == 27 then "Downside Tasuki"
     else if code1 == 28 then "Two Black Gapping"
     else if code1 == 29 then "Kangaroo"
     else if code1 == 30 then "Shooting Star"
     else " ----- "),
    if bull1 then GlobalColor("Bull")
    else if bear1 then GlobalColor("Bear")
    else GlobalColor("Neutral"), pos
);

AddLabel(
    show3barLabels,
    (if code2 == 1 then "Bull Pin"
     else if code2 == 2 then "Bear Pin"
     else if code2 == 3 then "Hammer"
     else if code2 == 4 then "Inverted Hammer"
     else if code2 == 5 then "Shooting Star"
     else if code2 == 6 then "Marubozu Bull"
     else if code2 == 7 then "Marubozu Bear"
     else if code2 == 8 then "Bull Engulf"
     else if code2 == 9 then "Bear Engulf"
     else if code2 == 10 then "Spinner"
     else if code2 == 11 then "High‑Wave"
     else if code2 == 12 then "Dragonfly"
     else if code2 == 13 then "Gravestone"
     else if code2 == 14 then "Long‑Legged Doji"
     else if code2 == 15 then "Doji"
     else if code2 == 16 then "Tweezer Top"
     else if code2 == 17 then "Tweezer Bottom"
     else if code2 == 18 then "Piercing Line"
     else if code2 == 19 then "Dark Cloud"
     else if code2 == 20 then "Bull Harami"
     else if code2 == 21 then "Bear Harami"
     else if code2 == 22 then "Harami Cross Bull"
     else if code2 == 23 then "Harami Cross Bear"
     else if code2 == 24 then "Inside Bar"
     else if code2 == 25 then "Outside Bar"
     else if code2 == 26 then "Upside Tasuki"
     else if code2 == 27 then "Downside Tasuki"
     else if code2 == 28 then "Two Black Gapping"
     else if code2 == 29 then "Kangaroo"
     else if code2 == 30 then "Shooting Star"
     else " ----- "),
    if bull2 then GlobalColor("Bull")
    else if bear2 then GlobalColor("Bear")
    else GlobalColor("Neutral"), pos
);

# -----------------------------
#  EXTRA MULTI-BAR / CONTINUATION LABELS
# -----------------------------
AddLabel(showExtraLabels and isThreeLineStrikeBear, "Three Line Strike Bearish", Color.ORANGE, pos);
AddLabel(showExtraLabels and isThreeLineStrikeBull, "Three Line Strike Bullish", Color.ORANGE, pos);
AddLabel(showExtraLabels and isThreeBlackCrows, "Three Black Crows", Color.MAGENTA, pos);
AddLabel(showExtraLabels and isThreeWhiteSoldiers, "Three White Soldiers", Color.MAGENTA, pos);
AddLabel(showExtraLabels and isEveningStar, "Evening Star", Color.YELLOW, pos);
AddLabel(showExtraLabels and isMorningStar, "Morning Star", Color.YELLOW, pos);
AddLabel(showExtraLabels and isThreeInsideUp, "Three Inside Up", Color.GREEN, pos);
AddLabel(showExtraLabels and isThreeInsideDown, "Three Inside Down", Color.RED, pos);
AddLabel(showExtraLabels and isAbandonedBabyBull, "Abandoned Baby Bull", Color.LIME, pos);
AddLabel(showExtraLabels and isAbandonedBabyBear, "Abandoned Baby Bear", Color.PINK, pos);
AddLabel(showExtraLabels and isBreakawayBear, "Breakaway Bearish", Color.DARK_RED, pos);
AddLabel(showExtraLabels and bullBeltHold, "Bull Belt Hold", Color.GREEN, pos);
AddLabel(showExtraLabels and bearBeltHold, "Bear Belt Hold", Color.RED, pos);
AddLabel(showExtraLabels and isRisingThree, "Rising Three Methods", Color.GREEN, pos);
AddLabel(showExtraLabels and isFallingThree, "Falling Three Methods", Color.RED, pos);

# -----------------------------
#  TAPE SUMMARY (LAST IN STACK)
# -----------------------------
AddLabel(
    ShowTapeBias,
    (if isTapeReversal then "Tape: Reversal"
     else if isTapeStrongBody then "Tape: Strong Body"
     else if isTapeIndecision then "Tape: Indecision"
     else "Tape: Neutral")
    + " | "
    + (if tapeDir > 0 then "Bias: Up"
       else if tapeDir < 0 then "Bias: Down"
       else "Bias: Flat"),
    if tapeDir > 0 then Color.GREEN
    else if tapeDir < 0 then Color.RED
    else Color.CYAN, pos
);
 
Last edited by a moderator:
TAPE vs TREND CHEAT SHEET

Operator‑Grade Framework for Reading Tape, Trend, Price, MicroState, and Volume

SECTION 1 — Core Tape/Trend Relationship

Tape UP + Trend DOWN

Meaning: Early bullish reversal attempt inside a pullback.

Story: Buyers showed intent in the last 1–3 bars, but the structural trend hasn’t flipped.

MicroState: Compression or Instability.

Operator Read:
“Potential turn forming — not confirmed.”

Action: Watch for confirmation, not entry.

Tape DOWN + Trend UP

Meaning: Early bearish reversal attempt inside an uptrend.

Story: Sellers showed intent, but the structural trend is still intact.

MicroState: Compression or Instability.

Operator Read:
“Possible top forming — trend hasn’t broken.”

Action: Wait for structure break or continuation failure.

Tape UP + Trend UP

Meaning: Aligned bullish continuation.

Story: Trend strong, tape confirms momentum.

Operator Read:
“High‑confidence continuation.”

Action: Look for pullback entries or breakouts.

Tape DOWN + Trend DOWN

Meaning: Aligned bearish continuation.

Story: Trend strong, tape confirms selling pressure.

Operator Read:
“High‑confidence continuation.”

Action: Look for lower‑high entries or breakdowns.

Tape INDECISION

Meaning: No actionable signal.

Story: Market pausing, no commitment.

Operator Read:
“No edge.”

Action: Standby.

Tape NEUTRAL

Meaning: Nothing meaningful in the last 3 bars.

Story: No reversal, no strong body, no indecision.

Operator Read:
“Tape is quiet — look elsewhere.”

Action: Wait for structure.

SECTION 2 — What Each Layer Measures

Tape Engine (3‑bar classifier)
Reads intent through:
  • Reversal patterns
  • Strong body bars
  • Indecision bars
  • Neutral bars
  • Continuation bars
Tape = short‑term intent.

AdaptiveTrend v13+

Reads drift + structure through:
  • Slope
  • Volatility normalization
  • Trend integrity
  • Adaptive smoothing
Trend = structural direction.

Price (raw candles)

Reads immediate movement.

Price = what’s happening right now.

MicroState Engine

Reads environmental condition:
  • Compression
  • Expansion
  • Instability
  • Trend
  • Transition
MicroState = context.

Volume Engine
Reads participation:
  • Neutral
  • Increasing
  • Decreasing
  • Imbalanced
Volume = commitment.

SECTION 3 — How to Read Disagreement (Operator Mode)

Tape UP + Trend DOWN + MicroState = Compression

“Reversal attempt forming inside a pullback.”

Often the earliest sign of a turn.

Tape DOWN + Trend UP + MicroState = Compression

“Top attempt forming inside an uptrend.”

Often the earliest sign of exhaustion.

Tape UP + Trend DOWN + Price DOWN

“Buyers showed intent, but sellers still in control.”

Tape DOWN + Trend UP + Price UP
“Sellers showed intent, but buyers still in control.”
Classic early topping behavior.

Tape INDECISION + Trend ANY + MicroState = Compression

“Market is pausing — no edge.”
Standby.

Tape NEUTRAL + Trend ANY

“Tape is quiet — wait for structure.”

SECTION 4 — Quick Operator Rules

Rule 1 — Tape leads turns
Tape often flips before the trend does.
This is normal and intentional.

Rule 2 — Trend confirms turns
Trend is slower but more reliable.
Tape without trend = early.
Trend without tape = late.

Rule 3 — MicroState explains everything
Compression = pause
Expansion = move
Instability = messy
Trend = clean
Transition = turning

Rule 4 — Volume tells you who cares
No volume = no commitment
High volume = real move
Imbalanced volume = pressure building

Rule 5 — Disagreement is information
When Tape and Trend disagree, you’re in a setup zone, not a trade zone.

Rule 6 — Agreement is confidence
When Tape, Trend, and MicroState align, you’re in a high‑probability zone.

SECTION 5 — Pattern Categories (for reference)

Reversal Patterns
Hammer
Inverted Hammer
Shooting Star
Bullish Engulfing
Bearish Engulfing
Piercing Line
Dark Cloud Cover
Bullish Harami
Bearish Harami
Harami Cross (Bull/Bear)
Tweezer Top
Tweezer Bottom
Morning Star
Evening Star
Three Inside Up
Three Inside Down
Three Line Strike
Abandoned Baby
Breakaway
Three White Soldiers
Three Black Crows
Strong Body Patterns
Marubozu (Bull/Bear)
Belt Hold (Bull/Bear)
Indecision Patterns
Doji
Long‑Legged Doji
Dragonfly Doji
Gravestone Doji
Spinner
High‑Wave
Neutral Patterns
Inside Bar
Outside Bar

Continuation Patterns
Upside Tasuki Gap
Downside Tasuki Gap
Two Black Gapping
Rising Three Methods
Falling Three Methods

SECTION 6 — How to Use This Cheat Sheet
  • Tape = intent
  • Trend = structure
  • MicroState = environment
  • Volume = commitment
  • Price = immediate movement
When all five agree → high‑confidence continuation
When Tape disagrees with Trend → early reversal zone
When MicroState = Compression → pause before expansion
When Volume is low → no commitment
 

Join useThinkScript to post your question to a community of 21,000+ developers and traders.

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
763 Online
Create Post

Similar threads

Similar threads

The Market Trading Game Changer

Join 2,500+ subscribers inside the useThinkScript VIP Membership Club
  • Exclusive indicators
  • Proven strategies & setups
  • Private Discord community
  • ‘Buy The Dip’ signal alerts
  • Exclusive members-only content
  • Add-ons and resources
  • 1 full year of unlimited support

Frequently Asked Questions

What is useThinkScript?

useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.

How do I get started?

We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.

If you are new, or just looking for guidance, here are some helpful links to get you started.

What are the benefits of VIP Membership?
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.
Back
Top