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
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
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
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
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
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
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.
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: