Command Center · v19 · Property Portfolio
🎯 $2,500/mo by Mo.12
🚀 $4,500/mo by Mo.24
⚪ VIX —
Connect TastyTrade
TT CAPITAL $0
0% Free$0 Reserve$9,000 Yield ⚠️ Calculating idle cash...
⚙ Settings:
Get free key →
🤖 🔗 📣 🔄
Reference Tools
⚡ AI Daily Game Plan
TODAY'S ACTION BRIEF
📊 Market Regime (VIX Gate)
Market Regime — loading
Click refresh to pull current VIX level.
5d: —
source: —
🎯 Allocation Compass
Actual allocation
Targets: PMCC 45% · Puts 30% · Equipment 9% · Reserve 10% · Roth 6%.
🏘️ Property Portfolio — PMCC as Real Estate
Unique Properties
0
Total Cost Basis
$0
LEAPS invested
Monthly Rent
$0
— yield
Total Rent Collected
$0
Lifetime premium
Progress toward targetTarget:properties
Your properties
📐 LEAPS Purchase Analysis & Acquisition Queue
Click ⚡ Scan to check every property for sale conditions.
📋 Executed Trade Log
DateTickerTypeStrikeExpiryPremiumP&LCapitalDTEStatus
No trades logged yet.
💡 Quick Decision Guide
When To Roll vs Hold
🚨 Roll now: Loss = 2× premium collected. Close current, sell 30 days further out.
⚠️ Watch closely: DTE 7–14 and stock near your strike.
Close for profit: Up 50% of max profit. Take it. Free the capital.
💡 If assigned: Sell covered call 30 DTE, 0.30 delta. Spin the wheel.
Daily Routine by Day
MondayDeploy idle capital into puts/spreads. Primary action day.
TuesdayScan for 50% profit. Close early, free capital.
WednesdayCheck PMCC short call DTE. ≤14 days → sell next rent.
ThursdayRoll scan. Any position at 2× loss? Roll it out today.
FridayLog week's premium. No new trades. Let positions ride.
🏘️ Property Signal Board — log signals from your 14 properties · feeds Pre-Market Brief
📐 Spread Entry Builder
Strike Finder — 3 DTE Bull Put Spread
Delta-defined spread · Short ~50Δ · Long ~40Δ · QQQ/SPY weekly chains
SHORT Δ LONG Δ
Log a signal in the Property Board above, hit Open Builder → on the tile — or connect TastyTrade and click ⚡ Live Fetch
🎯 Active Spreads
No active spreads. Log a trade above to begin tracking.
📊 Signal Journal & Performance
No completed trades yet.
Properties Owned
0 / 14
LEAP positions active
Monthly Rental Income
$0
Covered calls collected
Total Estate Value
$0
LEAP cost basis
Annual Yield
0.0%
Rent / invested capital
🎲 Cat Nap Cove — Property Board
Boardwalk — Tier 1 ETFs Shore Drive — Tier 2 Resort Row — Tier 3 = 1 contract = 3+ contracts
📋 Property Portfolio — All Lots
Loading estate map…
🔄 Rolling Cycles & Income Engine 45-60 DTE · sell weekly · roll at 21 DTE
📅 This Week's Income Conveyor
Add a cycle below to see your weekly income schedule.
🔄 Active Rolling Cycles Each cycle = 1 long call + staggered weekly shorts
Add Rolling Cycle
675C 56 DTE + weekly shorts
🧮 Cycle Math Engine — Live Calculator
📊 Stress Test — Weekly Credit Scenarios
OPTIONS OPERATING PLAN
Rolling Engine · daily & weekly cadence to hit the goal
🪜 Strike Ladder — Spot vs. Your Strikes
P = Short Put (safe zone below) · C = Covered/Short Call (danger zone above) · L = LEAPS · Blue line = live spot · = live TT quote (hover for Δ/IV/mid)
No open options positions.
The weekly rhythm
Mon
Deploy
Put idle capital to work. Open new positions per the entry rules — up to this week's count.
Tue
Harvest
Scan positions. Anything at 50% max profit — close it. Don't wait for expiry. Free the capital.
Wed
Deposit
Send the weekly deposit. Reinvest collected premium. Grow the base toward required capital.
Thu
Manage
PMCC short calls at DTE ≤ 14 → roll. Check assignments. Adjust threatened strikes.
Fri
Review
Log the week's premium. Update pace. Plan Monday's deploys. Note VIX / earnings ahead.
Trade rules — what makes each position

PMCC — the "rent"

  • Buy LEAPS at 0.65–0.80Δ, ~12–14 mo out
  • Sell 30-DTE call at 0.25–0.30Δ = rent
  • Close short call at 50% max profit
  • Roll short call when DTE ≤ 14

Put side — the yield

  • Short put / spread at 0.20Δ, 30 DTE
  • Vertical spread to cap risk & free margin
  • Manage at 50% max profit
  • Target 1.5–2%/mo on put capital

Entry filter — HA 6-pattern (ETF mode)

  • Bias: above 200 SMA, VIX < 26
  • Setup higher timeframe: SMP / CC coil
  • Trigger: CGR / SHR confirms
  • BCD = stand down, momentum fading

Risk & sizing

  • Spread across uncorrelated tickers (QQQ/SPY/IWM/GLD)
  • No entries within 45 days of earnings on single names
  • Take 50% wins early — more cycles = more income
  • Every trade is your decision — checklist, not signal
This month's pace
$0 collectedof $0 target
Decision support, not advice. The plan applies rules you set and shows the math — you place every trade.

💼 LIVE PORTFOLIO

Real-time TastyTrade positions & P&L — manual trackers below
🔌

CONNECT TASTYTRADE

Live positions, real mark prices, day P&L, and one-click import. Your manual wheel & PMCC trackers live below — connect TT to see live data alongside them. Session token only.
Wheel Positions — manual tracker
⚙️ The Wheel: Sell Put → If assigned, own shares → Sell Covered Call → Repeat forever. Collect premium at every step.
Open Puts
0
Covered Calls
0
Total Premium
$0
Capital Secured
$0
TickerTypeStrikeExpiryDTEPremiumP&LCapitalBreakevenStatusRoll?Notes
No wheel positions yet.
PMCC "Real Estate"
🏠 Real Estate Analogy: LEAPS = your property (appreciates). Monthly short calls = rent. Collect every month.
LEAPS Positions
0
LEAPS Cost Basis
$0
Total Rent Collected
$0
Avg Monthly Yield
0%
TickerLEAPS StrikeLEAPS ExpLEAPS CostShort StrikeShort ExpDTEThis MonthTotal RentYieldAlert
No PMCC positions yet.
PMCC Roll Tracker — "When To Collect Next Month's Rent"
✅ Ideal Roll Timing
Close the short call when it reaches 50% of max profit (premium collected × 0.5). Don't wait for expiration. Free the capital, sell next month's rent immediately. More cycles = more income.
🚨 Defensive Roll
If the underlying rips through your short strike, roll up and out for a net credit. Close current short call, sell a higher strike further in time. Never let the short call go deep ITM — roll before that happens.
Live Roll Analysis
Add PMCC positions above to see roll analysis here.
📬 Optimal Rent Collection — When & How to Sell the Next Call
Loading rent timing analysis…
LEAPS — The Property
  • Buy 12–18 months out expiration
  • Target 0.75–0.80 delta (deep in the money)
  • QQQ or SPY — deep liquid, tight spreads
  • Cost: $6,000–$10,000 per contract
Short Calls — Monthly Rent
  • Sell 30 DTE calls every month
  • Target 0.25–0.30 delta (OTM)
  • Close at 50% profit, sell the next month
  • If threatened, roll up and out for a credit
EXAMPLE: Buy QQQ Jan 2027 $350 Call for $8,200 → Sell QQQ 30 DTE $420 Call for $310 → Close at $155 (50%) → Sell next month's $422 Call for $295 → Repeat. $310+$295+... = rent paid every month on your "property."
📊 Analytics & Progress
TastyTrade Total
$71,000
Margin + Options
Monthly Income
$0
Premium + returns
Roth IRA (VOO)
$0
Tax-free compounding
Allocation
🏠 PMCC/LEAPS 45% 🎯 Put Selling 30% 🚛 Equipment 9% 🏦 Reserve 10% 📈 VOO Roth 6%

PMCC rent 4–5% on ~$32k = $1,280–$1,600/mo  |  Put yield 1.5–2% on ~$21k = $315–$420/mo  |  Month 1 target: $1,600–$2,000/mo
Goal Progress
Month 12 — $2,500/mo
$0
Current0%
Month 24 — $4,500/mo
$0
Current0%
⚡ Capital Efficiency — PMCC vs Vertical Puts vs CSP
Loading efficiency analysis…
📐 Vertical Put Spread Calculator — All 3 Widths Side-by-Side
Adjust inputs above to calculate…
📊 LEAPS Price History — What Would It Have Cost?
Simulates what your preferred 0.65Δ LEAPS would have cost at every price level over the past 12 months. Use it to find your target entry price and stop guessing.
Click ↻ Refresh or connect TastyTrade to load 12-month price history.
📈 Snowball Comparison — Act Now vs. Build Slowly
Loading snowball analysis…
🗓️ Deployment Roadmap Hybrid LEAP + Rolling Engine · 1-2 positions/week · entry rule: 2 HA reds + above 50MA + VIX <26
🎯 $2,500/mo → JULY 2026 (~9 mo early)
🚀 $4,500/mo → JAN 2027 (~15 mo early)
At 1 position/wk · 85% credit assumption · $4,600 avg cost
Rolling Engine 49% yield vs 40% on LEAP model
🤖 Entry Gate Agent
Pre-trade check: VIX · earnings · capital · concentration · tier rules
🔄 Roll Timing Agent
Scans every open position for 21 DTE / 50% profit / roll-now triggers
📋 Log these 5 numbers on the 1st of every month. 15 minutes. If all 5 trend up, you're winning.
Log This Month
What Each Number Means
#MetricSignal
1Capital DeployedIs every dollar working? Idle = dead.
2Monthly PremiumThe engine. Must grow every month.
3Equipment RevenueBonus stream. $0 is fine — asset is waiting.
4Total Passive IncomeThe headline. Watch it march to $2,500.
5Open PositionsRisk check. Nothing too concentrated.
Scorecard History
MonthCapitalPremiumEquip RevPassive IncomePositionsvs $2,500Notes
No entries yet.
Income Chart
Log scorecard entries to see chart.
📓 Trade Journal — Thesis & Lessons
Log an Entry
Why Keep a Journal

Every trade teaches something. Writing forces clarity — thesis up front, lesson after the close. Skim this page before sizing up on any ticker you've traded before.

Prompt ideas:
· Why did I pick this strike / expiry?
· What would force me to roll or close early?
· After close: did my thesis play out? What surprised me?
Journal History
DateTickerP&LTagsEntry
No journal entries yet.
📖 Strategy Playbook & Rules click to expand
Wheel Rule: Only sell puts on stocks you'd genuinely want to own at that price. Liquid, large-cap, quality names only.
ParameterTargetWhy
DTE30–45 daysTheta decay sweet spot
Delta0.20–0.30OTM with real premium
Monthly Yield Target1.5–2%On capital secured
Roll TriggerLoss = 2× premiumRoll out 30 days
Early Close50% profitFree capital, reset faster
Kiyosaki Traps — Never Do These
🚫 Trap 1: Selling puts on meme/garbage stocks for huge premium. One bad week wipes months.
🚫 Trap 2: Spending premium as income. Every dollar gets redeployed within 7 days through Month 24.
🚫 Trap 3: Over-complicating. If you can't explain a trade in one sentence, don't make it.
🔑 Rohn Rule: Every dollar of premium redeployed within 7 days. No exceptions.
PMCC Strategy Playbook
QQQ — Primary PMCC Recommendation
  • Largest tech ETF — massive liquidity, tight spreads
  • Strong long-term uptrend = LEAPS appreciate over time
  • Robust monthly option premium available
  • Buy 12–18 mo LEAPS at 0.75–0.80 delta (~$7k–$10k)
  • Sell 30 DTE calls at 0.25–0.30 delta → ~$300–$500/mo rent
Buy QQQ Jan 2027 $350 Call → Sell QQQ 30 DTE $420 Call for $310/mo
$310 × 12 = $3,720/yr on $8,200 property = ~45% annual yield potential
SPY — Secondary PMCC
  • Most liquid ETF on earth — zero slippage concern
  • Steadier, more conservative than QQQ
  • Good for 2nd LEAPS position — diversifies tech exposure
  • Buy 12–18 mo LEAPS at 0.75–0.80 delta (~$8k–$12k)
  • Sell 30 DTE calls at 0.25–0.30 delta → ~$250–$450/mo rent
Great anchor position. Slower moving = easier to manage short calls.
📖 For Nikki, Ashtyn & Maggie: This tab explains everything in plain language. If Matt is unavailable, use this to keep the machine running.
Part 1 — The Big Picture

Dad built a system where money works while he's on the road. Two main engines and one backup. None require daily attention — just monthly check-ins.

🎯 Engine 1 — The Wheel
Selling puts on big stocks through TastyTrade. Premium hits the account every month. All of it gets reinvested immediately.
🏠 Engine 2 — PMCC
Buying long LEAPS as "property," then collecting "rent" by selling short monthly calls against them. Like a rental property in the stock market.
🚛 Backup — Equipment
Physical assets that can be rented when needed. Zero pressure — they sit idle until an opportunity shows up.
Part 2 — The Wheel (Simple)
1

Sell a Put Option

You're making a bet: "This stock won't fall below $X by this date." The market pays you money upfront. That money goes in your account immediately.

AAPL is at $200. Sell a $175 put for $300 premium expiring in 35 days. $300 hits your account now. Problem only if AAPL falls below $175.
2

Two Things Can Happen

GOOD: Stock stays above strike. Option expires worthless. Keep all premium. Repeat Step 1.

ALSO OK: Stock falls below strike. You get assigned — you now own 100 shares. Fine, because you only sold puts on stocks you wanted.

AAPL stays above $175 → Keep $300 → Sell another put → Repeat
3

If Assigned — Sell a Covered Call

You own shares now. Sell a call option against them. Market pays you again. You collect more premium. This is "the wheel spinning."

Own 100 AAPL at $175. Sell $180 call for $250. If AAPL goes above $180, shares get called away at a profit. If not, keep the premium and repeat.
4

The Wheel Never Stops

Sell Put → Maybe assigned → Sell Covered Call → Shares called away → Sell Put again. Premium at every step. The only way to lose is to stop turning it.

$300 put + $250 covered call = $550 in 60 days from one position = $3,300+/yr annualized
Part 3 — Roll Alerts
🚨 Roll trigger: Position loss = 2× premium collected. Close the trade. Open a new one 30 days further out at same/lower strike. Call Matt first if unsure.
⚠️ Early profit: Position is up 50%+ of max profit. Close it early. Take the win. Don't be greedy. Free the capital.
ROLL EXAMPLE: Sold AAPL $175 put for $300. AAPL drops hard. Position shows -$600 (2× premium). Buy back the put. Sell new $168 put 30 days out. Collect new premium. Reset.
Part 4 — Monthly Checklist
1st of Every Month (15 min)
☐ Check Positions tab for RED roll alerts
☐ Log scorecard numbers (5 numbers)
☐ Move collected premium back into put-selling capital
☐ Enter budget numbers
☐ Add monthly contribution ($2,500 puts / $1,000 LEAPS / $300 VOO / $200 equipment)
☐ Check capital bar at top — is anything idle?
☐ Take 15 min, close the laptop
The One Rule That Never Breaks
Every dollar of premium collected gets redeployed within 7 days.
It doesn't sit in checking. It doesn't wait for a better setup. It goes back to work immediately. This is the only rule that can never break.
📞 If something major happens — call Matt first. Do not close positions without talking to him. TastyTrade support: 1-888-888-8045.
Part 5 — The Black Swan Question
The Fear: "If the market crashes 30%, I lose my $10k LEAPS."
The Reality: You don't. Here's exactly what actually happens.
🏠 SCENARIO A — You Own a QQQ LEAPS Property
QQQ drops 30% (COVID-level crash): $450 → $315
Your LEAPS paper value drops: ~$110 → ~$55 (not zero — 15 months of time value remains)
Paper loss: ~$55 per contract
Your short call that month: expires worthless — keep 100% of premium
Next month's rent at VIX 35+: $700–900 instead of $400
Months to recover paper loss at elevated IV: 4–6 months
Capital you need to survive this: $0 additional
🎯 SCENARIO B — You Sold a SPY Put, Got Assigned
SPY drops 30%: $540 → $378 — put gets assigned
You now own 100 shares at cost basis: $540
Paper loss on those shares: ~$16,200 per contract
Capital locked up: $54,000 — your whole account, frozen
Monthly covered call income at VIX 35+: $500–700
Months to recover paper loss at max covered call income: 24–32 months
New trades you can make while waiting: None — capital tied up
The crash hits both strategies. The LEAPS recovers in 4–6 months. The assigned put takes 2+ years.
LEAPS max loss is bounded. Put assignment max loss is 30–50% of your entire account, frozen with no way to redeploy.
The Mental Model That Changes Everything
Stop calling it "$10k at risk"
You're not spending $10k. You're buying a machine that prints $400 every month. In 25 months that machine has paid for itself. After that it prints free money indefinitely. Saying the LEAPS is "risky" because it cost $10k is like saying a rental property is risky because you paid for it.
A crash is a rent raise
When VIX spikes to 35, your short call premium jumps 60–80%. The same 30 DTE call that made $400 in calm markets makes $650–750 during the panic. Your property doesn't burn down in a storm — it charges higher rent because fewer landlords are willing to be in the market. You collect during the chaos.
Time is your armor
The 2020 COVID crash: 33 days to bottom, 5 months to full recovery. Your LEAPS has 15 months of life. Even if you bought the exact day before the worst crash of the decade, you'd still have 10 months of elevated-IV rent collection before the LEAPS expired. You are buying time. Time doesn't evaporate in a crash.
Break-Even Timeline — How Long Until the LEAPS Pays For Itself
PropertyLEAPS CostNormal Rent/moBreak-Even (normal)Crash Rent/moBreak-Even (after crash)
QQQ$9,500$400~24 months$650–750~14 months
SPY$11,000$380~29 months$600–700~17 months
IWM$6,500$310~21 months$500–600~12 months
GOOGL$5,500$260~21 months$420–500~12 months
Crash scenario assumes VIX 30–40, short calls at elevated IV. After break-even every dollar of rent is pure profit on a fully paid-off asset. The LEAPS itself still has market value on top of that.
Black Swan Stress Test Calculator
Simulate a market drop of
Based on your current open positions
Click a scenario above to see your actual book's exposure.
Part 6 — PMCC vs Cash-Secured Put: The Real Difference
🏠 PMCC — Poor Man's Covered Call
• Buy a deep ITM call (LEAPS) — costs $7,000–9,500
• Controls 100 shares without owning them
• Sell a short call every month → collect rent
• Max loss: exactly what you paid for the LEAPS
• Assignment exposure: $0 — none
• Capital efficiency: open 5–6 positions for same $ as 1 CSP
• Coverage floor: doesn't apply — already defined-risk
🎯 Cash-Secured Put (CSP)
• Sell a put → keep $54,000 cash as collateral (SPY)
• That cash earns nothing while it waits
• Collect premium each cycle → no LEAPS appreciation
• Max loss: full value of shares minus premium
• Assignment exposure: full notional — $54k frozen if assigned
• Capital efficiency: 1 position ties up most of your account
• Coverage floor: 75% of notional must remain as buffer
The key insight: Both strategies collect similar monthly premium on similar tickers. The PMCC does it with 15% of the capital commitment and zero assignment exposure. The only real trade-off is that if the underlying rips 40%+ in a month, LEAPS don't capture 100% of that move — but for income generation, that almost never matters. The "poor man" in PMCC doesn't mean inferior. It means capital-efficient.
Part 7 — ETF Base vs Individual Stocks: The Recommended Structure
The debate isn't ETFs or stocks — it's about sequencing and concentration risk. Here's the structure that balances income, diversification, and psychological stability.
Phase 1 — Foundation (0–$80k account)
QQQ · SPY · IWM · GLD
4 ETF properties — uncorrelated, liquid, no earnings risk. Generates ~$1,400/mo.
Phase 2 — Expansion ($80k–$120k)
Add META + GOOGL
Best individual names for PMCC: post-split price, AI moat, moderate IV. Total ~$2,100/mo.
Phase 3 — Full Portfolio ($120k+)
Add XLE + DIA + AAPL/MSFT
Sector ETF diversification + blue-chip names. Total ~$3,200/mo.
Phase 4 — Premium Hunters ($150k+)
AMD · TSLA · NVDA (max 20% of book)
High IV = high rent but high paper-loss risk. Never more than 2 of these simultaneously.
Keep individual stocks when: your ETF base generates ≥ $1,400/mo, VIX < 18, stock has no earnings in 45 days, IV rank ≥ 25%.
🚨 Avoid individual stocks when: your account is below $80k, VIX > 20, the stock has earnings within 45 days, or more than 40% of your book is already in individual names.
Equipment Fund
$8,000
Starting allocation
Items Owned
0
Monthly Payments
$0
Revenue Potential
$0/mo
⚙️ Philosophy: Buy it. Store it. Let opportunity find you. You don't need a business — you need optionality. Finance smart: never let monthly payments exceed 2 rental days of coverage.
Equipment Log
ItemCategoryPriceDownMo. PaymentDaily RentalStatusRevenue/MoNotes
No equipment yet. Browse ideas below.
Fund Log
Fund Balance
$8,000
Truck Down Payment Goal
$25,000
Truck fund progress32%
DateDescriptionAmountBalance
No fund transactions yet.
Equipment Ideas
🚚
Dump Trailer (12–14 ft)
$8k–$12k | Finance
Rents $150–$250/day. Contractors, landscapers, junk haulers. Break-even on 2 rental days/mo. Family can operate.
High ROIFamily OperableFinance
🏗️
Utility / Flatbed Trailer
$3.5k–$5.5k | Cash or finance
Rents $75–$150/day. Enables hauling all other equipment. Extremely low maintenance. Very versatile.
VersatileLow Maintenance
💦
Commercial Pressure Washer
$1.8k–$3k | Cash
Rents $100–$200/day. Family can run occasional wash jobs at $150–$400/job. Hot/cold unit separates you from homeowner models.
Cash PurchaseFamily Run
🌿
Zero-Turn Mower (52–60")
$5k–$8.5k | Finance
Rents $150–$300/day. Holds value extremely well. Girls can run occasional yard jobs or just rent it out.
Strong ValueFamily Operable
🎪
Bounce House + Blower
$2.5k–$4.5k | Cash
Rents $150–$350/day for parties, schools, events. Girls manage deliveries/setups. 6–8 weekend bookings in summer. 10+ year lifespan.
High Weekend ROIGirls Run It
🎉
Party Package (Tables/Chairs/Tent)
$2k–$4k | Build over time
Full packages rent $200–$600/event. Pairs perfectly with bounce house. Nikki manages bookings from home. Near-zero competition in most local markets.
Pairs w/ BounceNikki Manages
Generator (12kW+ Dual Fuel)
$1.5k–$3.5k | Cash
Rents $100–$250/day for events and contractors. Your electrical background is an asset. Very low maintenance sleeping asset.
Low MaintenanceStorm Market
🎵
PA / Sound + Lighting Rig
$1.5k–$3.5k | Cash build
Rents $150–$400/event. Pairs with party package. Bands, outdoor events, school dances. Nikki or girls handle bookings.
Pairs w/ PartyEasy Transport
🎯
Mini Skid Steer (Dingo/Toro)
$18k–$28k | Finance | Mo.18+
Rents $300–$500/day — highest daily rate on this list. Landscapers, builders, tree services. Needs truck first. Premium market, minimal competition.
Highest RateTruck First
🛻
F-250 / Ram 2500 — THE TRUCK
$35k–$55k | Finance | Target Mo.12–18
Unlocks everything. Enables dump trailer, skid steer, branded hauls. Business write-off through CatShack. Plan $25k down from equipment fund. Save toward this every month.
Down payment progress:
$8,000 / $25,000
🔍 Deal Sourcing · one-tap local searches + log the deals you find
⚡ One-Tap Local Searches
Tap any button to open a live search in a new tab. Plattsburgh, NY + surrounding North Country area.
📋 Deal Tracker — Log Opportunities You Find
Log deals you find on FB Marketplace, Craigslist, or OfferUp. App calculates break-even and ROI so you know instantly if it's worth pursuing.
+ Log a Deal
ItemSourceAskingYour TargetRent/DayDays/MoMo. IncomeBreak-evenAnnual ROIStatus
No deals logged yet. Find something on FB Marketplace or Craigslist and log it here.
📋 CatShack Capital — Strategy Plan
Mission: $2,500/mo by Month 12 · $4,500/mo by Month 24 · 14 Properties · Three-Layer Income Stack
⬇ Download PDF
🎯 Section 1 — The Mission
Month 12 Target
$2,500/mo
Month 24 Target
$4,500/mo
Three-Layer Income Stack:
🏠 Foundation (PMCC) — Buy LEAPs (0.65Δ, 14mo), sell monthly covered calls (0.20Δ, 30-45 DTE). Stable base income. Requires BCD+signal acquisition entry.
 ⚙️ Engine (Wheel) — Sell short puts (0.20-0.25Δ, 30-45 DTE) on HA signals. Medium-term. VIX CAUTION = elevated IV = richer premium.
 ⚡ Accelerator (DSE) — 3-DTE bull put spreads on highest-conviction signals. Capital velocity: redeploys every 3 days. Funds PMCC acquisitions.
🛡 Section 2 — The VIX Gate
🟢 GREEN — VIX < 20
All signals valid. Full sizing. All three layers operating normally. Deploy freely.
🟡 CAUTION — VIX 20-25
DSE: SHR + CGR only, 1 contract max. Wheel: all patterns valid — elevated IV = richer premium. Lean into 30-45 DTE puts.
🔴 DEFENSE — VIX 26-34
No new DSE entries. No new short puts. Manage existing positions. Wait for VIX to drop below 26.
🎯 OPPORTUNITY — VIX > 35
Stand aside on DSE. Short puts on Tier 1 ETFs at 7-21 DTE only. Stagger any new LEAP purchases. Generational entry window.
📊 Section 3 — The HA 6-Pattern System
All signals fire on closed daily Heikin-Ashi candles via the TradingView indicator. Log EOD each day.
P2 SHR ★ — Stop Hunt Reclaim
Hunt candle: large lower wick sweeps below prior low. Follow candle: solid green reclaim.
All entries — highest conviction
P1 CGR — Clean Green Run
3+ consecutive solid HA green bars above rising SMA.
All entries — full sizing
P5 SMP — SMA Magnetic Pull
Solid green after price touches the 200-day SMA. SMA must be rising.
All entries — trend confirmation
P3 CC — Compression Coil
4+ narrowing bars then breakout 1.5x average body.
All entries — confirms coil release
P4 FR — First Responder
5+ red bars then first wide green (ETF mode). SMA must be rising.
30-45 DTE puts Day 1 / Spreads wait Day 2
P6 BCD ⚠️ — Body Count Divergence
Warning: shrinking body + lower wick after 5+ green streak.
NO entries — start 45-day ACQUIRE watch
🏠 Section 4 — The Property Acquisition Rule ★ Most Important
This is the strongest setup in the system. BCD warns of a pullback → pullback happens → first long signal fires above rising SMA = acquire the property at its best price + collect first rent on Day 1.
1️⃣
BCD Fires
Log it. Tile turns red. WATCH MODE begins. 45-day window.
2️⃣
The Gift
Price pulls back. LEAP getting cheaper. Put premium getting richer. Wait.
3️⃣
Signal Fires
SHR/CGR/SMP/CC above rising SMA. Tile turns GOLD. ACQUIRE.
🏠
Dual Entry
Buy LEAP (0.65Δ, 14mo) + Sell put (0.20-0.25Δ, 38 DTE). Same day.
Best properties for this rule (in order): GLD, SPY, QQQ, DIA, IWM, AMZN, AAPL, NVDA, TSLA.
Critical filter: SMA must still be rising at time of long signal. BCD below declining SMA = avoid.
Tier 3 (TSLA/NVDA/AMD): Require 4+ star signals only. Use Futures mode in TradingView indicator.
📐 Section 5 — Underwriting Decision Matrix
Trades are placed off the Premium Scanner (Engine tab), underwritten by The Book's tier / IVR / VIX gates. Columns are policy types; cells are the action at each condition.
Condition Standard — Iron Condor Directional — Credit Spread Event — Gap Fade Naked / CSP
IVR ≥ 30 · VIX < 20 · God/Excellent✅ core · 16Δ wings · 21–45 DTE✅ 30Δ short · $5 wide · 7–21 DTE⏳ confirmed gap only✅ 30Δ · 30–45 DTE · stop-risk sized
IVR ≥ 30 · VIX ≥ 20✅ preferred · $375 cap⚠ God tier only🚫⚠ reduce · God/Excellent only
IVR < 30🚫 don't write cheap🚫🚫🚫
Strong tier⚠ only if IVR elevated⚠ only if IVR elevated🚫⚠ only if IVR elevated
Earnings inside DTE🚫 skip🚫 skip🚫 unless God-tier 1–5 DTE event🚫 skip
Directional bias (optional HA signal)n/a — neutralSHR/CGR → put spread · BCD → call spreadconfirms fade directionside selection only
Risk per policy: $500 normal / $375 when VIX ≥ 20. Verticals size off true defined risk (width − credit); naked/CSP size off the 200% stop (risk = credit, not stock-to-zero). Total open book ≤ $2,500, max 5 policies, 1 per underlying — enforced by the Book-Risk Governor on the Engine tab.
📅 Section 6 — Daily Workflow
Scan — Pre-market
1. Engine tab → Premium Scanner → Scan
2. Keep IVR ≥ 30 + God/Excellent tier (Strong only if IVR elevated)
3. Check the VIX pill — ≥ 20 → $375/policy cap, iron-condor/God-tier only
4. Drop any name with earnings inside the DTE window
Size & Place
1. Size to stop-risk — spreads = width − credit · CSP = credit (200% stop)
2. Cap $500/policy ($375 if VIX ≥ 20)
3. Check the Book-Risk Governor: ≤ 5 open · ≤ 1/underlying · ≤ $2,500 total
4. Place in TastyTrade → log in CatShack
5. Set GTC 50% close + 200% stop
Mon
Deploy new policies up to the $2,500 / 5-policy cap.
Tue
Harvest — close anything at 50% of max premium.
Wed
21-DTE check — close standards hitting 21 DTE (gamma).
Thu
Stop discipline — anything at 200%? Pay the claim. No averaging down.
Fri
Log premium & P&L. Event plays close at 1 DTE.
⚠️ Section 7 — Non-Negotiable Rules
VIX gate is absolute
No new DSE when VIX > 25. No exceptions.
Signal quality floor
3 stars minimum for any entry.
Earnings block
Within 7 days = skip that property entirely.
DSE Day 1 red candle
Close immediately. No hoping.
DSE max loss rule
50% of max loss = exit. Always.
DSE profit target
50% of credit collected = close and redeploy.
PMCC SMA filter
SMA must be rising at time of acquisition signal.
FR Day 2 rule
Wait for Day 2 green before 3-DTE spread entry.
BCD watch expiry
45 days maximum. After that: reassess from scratch.
Tier 3 filter
TSLA/NVDA/AMD: 4+ star signals only. No borderline entries.
📈 Section 8 — TradingView Pine Script Indicator
HA 6-Pattern System | CatShack Capital
Pine Script v6 · Apply to any regular candlestick chart · ETF mode + Futures mode toggle
⬇ Download .pine
// ════════════════════════════════════════════════════════════════════
//  HA 6-PATTERN SYSTEM | CatShack Capital
//  Heikin-Ashi pattern recognition across 6 repeatable setups:
//
//  P1  CGR  — Clean Green Run         (3+ solid green streak)
//  P2  SHR  — Stop Hunt Reclaim       (wick flush + solid follow)
//  P3  CC   — Compression Coil        (narrowing bodies → breakout)
//  P4  FR   — First Responder         (wide green after red run)
//  P5  SMP  — SMA Magnetic Pull       (solid green after SMA touch)
//  P6  BCD  — Body Count Divergence   (warning: momentum fading)
//
//  Apply to a REGULAR candlestick chart.
//  HA values are computed internally via request.security.
// ════════════════════════════════════════════════════════════════════
//@version=6
indicator("HA 6-Pattern System | CatShack Capital", 
     overlay         = true, 
     max_labels_count = 500,
     max_lines_count  = 200)


// ────────────────────────────────────────────────────────────────────
//  SECTION 1 — INPUTS
// ────────────────────────────────────────────────────────────────────

// ── Instrument Mode ──────────────────────────────────────────────────
var string GRP_MODE = "🎚  Instrument Mode"
i_etfMode = input.bool(false, "ETF Mode (QQQ / SPY) — looser SHR & FR thresholds", group=GRP_MODE,
     tooltip="OFF = Futures/Futures ETF (MNQ, ES, NQ) — tight thresholds for volatile HA wicks\nON = ETF (QQQ, SPY) — smoother HA candles, relaxed wick & body requirements for SHR and FR")

// ── General ──────────────────────────────────────────────────────────
var string GRP_GEN = "⚙  General"
i_smaLen      = input.int   (200,  "SMA Length",                   group=GRP_GEN, minval=10,   maxval=500)
i_smaSlope    = input.int   (5,    "SMA Slope Lookback (bars)",    group=GRP_GEN, minval=1,    maxval=20)
i_solidMax    = input.float (0.15, "Solid candle: max wick/body",  group=GRP_GEN, minval=0.01, maxval=0.4, step=0.01)

// ── P1 CGR ───────────────────────────────────────────────────────────
var string GRP_CGR = "P1 — Clean Green Run (CGR) 🟢🟢🟢"
i_showCGR   = input.bool (true, "Show CGR",                  group=GRP_CGR)
i_cgrMin    = input.int  (3,    "Min consecutive solid bars", group=GRP_CGR, minval=2, maxval=7)

// ── P2 SHR ───────────────────────────────────────────────────────────
var string GRP_SHR = "P2 — Stop Hunt Reclaim (SHR) ⚡"
i_showSHR   = input.bool  (true,  "Show SHR",                          group=GRP_SHR)
i_shrWick   = input.float (0.80,  "Hunt candle: min lower wick/body",  group=GRP_SHR, minval=0.3, maxval=2.0, step=0.05,
     tooltip="Futures default: 0.80 | ETF mode auto-uses 0.55. Lower = more sensitive to smaller wicks (needed for ETF smooth HA candles)")
i_shrBody   = input.float (0.90,  "Reclaim: min body vs hunt body",    group=GRP_SHR, minval=0.3, maxval=1.5, step=0.05,
     tooltip="Futures default: 0.90 | ETF mode auto-uses 0.70. ETF recovery bars are often smaller relative to the crash candle")

// ── P3 CC ────────────────────────────────────────────────────────────
var string GRP_CC  = "P3 — Compression Coil (CC) 🌀"
i_showCC    = input.bool  (true, "Show CC",                         group=GRP_CC)
i_ccBars    = input.int   (4,    "Min coil bars",                   group=GRP_CC, minval=3, maxval=8)
i_ccMult    = input.float (1.5,  "Breakout size multiplier",        group=GRP_CC, minval=1.1, maxval=3.0, step=0.1)

// ── P4 FR ────────────────────────────────────────────────────────────
var string GRP_FR  = "P4 — First Responder (FR) 🔄"
i_showFR    = input.bool  (true, "Show FR",                         group=GRP_FR)
i_frRed     = input.int   (3,    "Min prior red bars",              group=GRP_FR, minval=2, maxval=7,
     tooltip="Futures default: 3 | ETF mode auto-uses 5. ETF crashes tend to have more red bars before the reversal")
i_frUpWick  = input.float (0.20, "Max upper wick/body (clean top)", group=GRP_FR, minval=0.0, maxval=0.5, step=0.05,
     tooltip="Futures default: 0.20 | ETF mode auto-uses 0.35. ETF first-responder bars often have small upper wicks and still work")

// ── P5 SMP ───────────────────────────────────────────────────────────
var string GRP_SMP = "P5 — SMA Magnetic Pull (SMP) 🧲"
i_showSMP   = input.bool  (true, "Show SMP",                        group=GRP_SMP)
i_smpZone   = input.float (1.5,  "SMA proximity zone (%)",          group=GRP_SMP, minval=0.25, maxval=5.0, step=0.25)

// ── P6 BCD ───────────────────────────────────────────────────────────
var string GRP_BCD = "P6 — Body Count Divergence (BCD) ⚠️"
i_showBCD    = input.bool  (true,  "Show BCD",                      group=GRP_BCD)
i_bcdRatio   = input.float (0.45,  "Body shrink ratio (warning)",   group=GRP_BCD, minval=0.1, maxval=0.7, step=0.05)
i_bcdWick    = input.float (0.35,  "Min lower wick/body to trigger",group=GRP_BCD, minval=0.1, maxval=0.8, step=0.05)
i_bcdStreak  = input.int   (5,     "Min green streak before signal",group=GRP_BCD, minval=3, maxval=10)

// ── Display ──────────────────────────────────────────────────────────
var string GRP_DISP = "🎨  Display"
i_showBG     = input.bool(true,  "Background tints on signals", group=GRP_DISP)
i_showLabels = input.bool(true,  "Detail labels (SHR, streak)",  group=GRP_DISP)
i_showScore  = input.bool(true,  "Show composite score on entry",group=GRP_DISP)


// ────────────────────────────────────────────────────────────────────
//  SECTION 2 — HEIKIN-ASHI DATA
//  Pull true HA OHLC via request.security so this works on any chart
// ────────────────────────────────────────────────────────────────────
haSymbol = ticker.heikinashi(syminfo.tickerid)

[haO, haH, haL, haC] = request.security(haSymbol, timeframe.period, 
                         [open, high, low, close], 
                         gaps            = barmerge.gaps_off,
                         lookahead       = barmerge.lookahead_off)

// ── Core measurements ────────────────────────────────────────────────
haBodyTop  = math.max(haO, haC)
haBodyBot  = math.min(haO, haC)
haBody     = haBodyTop - haBodyBot            // body size (always ≥ 0)
haUpWick   = haH - haBodyTop                  // upper wick
haDnWick   = haBodyBot - haL                  // lower wick

isGreen    = haC > haO
isRed      = haC < haO
isDoji     = math.abs(haC - haO) < (haH - haL) * 0.10

// ── Running body average (must be declared before quality flags) ──────
avgBody5 = math.avg(haBody[1], haBody[2], haBody[3], haBody[4], haBody[5])
avgBody3 = math.avg(haBody[1], haBody[2], haBody[3])

// ── Quality flags ────────────────────────────────────────────────────
// "Solid" = almost no wick in the momentum direction AND meaningful body size
solidGreen    = isGreen and haBody > 0 
     and (haDnWick <= haBody * i_solidMax)
     and (haBody >= avgBody5 * 0.6)          // must be at least 60% of avg body size

solidRed      = isRed   and haBody > 0 
     and (haUpWick <= haBody * i_solidMax)
     and (haBody >= avgBody5 * 0.6)

// Hunt candle: green HA bar with large lower wick (stop-sweep)
// ETF mode: lower wick threshold (0.55 vs 0.80) — ETF HA candles are smoother
// ETF mode: removes the sweep-below-prior-low requirement (ETFs gap less aggressively)
shrWickThresh = i_etfMode ? 0.55 : i_shrWick
shrBodyThresh = i_etfMode ? 0.70 : i_shrBody

huntCandle    = isGreen and haBody > 0 
     and (haDnWick >= haBody * shrWickThresh)
     and (i_etfMode ? true : haL < haL[1])   // ETF: skip sweep requirement; Futures: must sweep below prior low
     and (haBody >= avgBody5 * 0.5)           // body must be meaningful, not a doji

// ── (avgBody5/avgBody3 moved above — removed duplicate) ──────────────


// ────────────────────────────────────────────────────────────────────
//  SECTION 3 — SMA + TREND CONTEXT
// ────────────────────────────────────────────────────────────────────
sma         = ta.sma(close, i_smaLen)
smaRising   = sma > sma[i_smaSlope]
aboveSMA    = close > sma

smaPct      = i_smpZone / 100.0
nearSMA_1   = haL[1] <= sma[1] * (1.0 + smaPct) and haL[1] >= sma[1] * (1.0 - smaPct)
nearSMA_2   = haL[2] <= sma[2] * (1.0 + smaPct) and haL[2] >= sma[2] * (1.0 - smaPct)
smaTouched  = nearSMA_1 or nearSMA_2


// ────────────────────────────────────────────────────────────────────
//  SECTION 4 — RUNNING STREAKS
// ────────────────────────────────────────────────────────────────────
var int greenStreak = 0
var int redStreak   = 0
var int solidStreak = 0

greenStreak := isGreen    ? greenStreak + 1 : 0
redStreak   := isRed      ? redStreak + 1   : 0
solidStreak := solidGreen ? solidStreak + 1 : 0


// ────────────────────────────────────────────────────────────────────
//  SECTION 5 — PATTERN SIGNALS
// ────────────────────────────────────────────────────────────────────

// ── P1: CLEAN GREEN RUN (CGR) ─────────────────────────────────────────
// Fires when streak hits minimum — with 5-bar cooldown to prevent clustering
var int cgrCooldown = 0
cgrCooldown := cgrCooldown > 0 ? cgrCooldown - 1 : 0

cgrRaw    = solidStreak == i_cgrMin and aboveSMA and smaRising
cgrSignal = i_showCGR and cgrRaw and cgrCooldown == 0

if cgrSignal
    cgrCooldown := 5


// ── P2: STOP HUNT RECLAIM (SHR) ──────────────────────────────────────
// Bar[-1] = hunt candle (green + big lower wick)
// Bar[ 0] = solid green follow-through
// ETF mode: body comparison uses looser threshold (0.70 vs 0.90)
shrSignal = i_showSHR 
     and huntCandle[1] 
     and solidGreen 
     and haBody >= haBody[1] * shrBodyThresh


// ── P3: COMPRESSION COIL (CC) ────────────────────────────────────────
// Prior N bars show narrowing HA bodies (each ≤ 1.2× the one before)
// Then current bar: body >= avgCoil × multiplier (expansion breakout)
//
// Build compressed flag across i_ccBars prior bars
b1 = haBody[1]
b2 = haBody[2]
b3 = haBody[3]
b4 = haBody[4]
b5 = haBody[5]
b6 = haBody[6]

// 4-bar coil (always checked)
compressed4 = b1 <= b2 * 1.2 and b2 <= b3 * 1.2 and b3 <= b4 * 1.2
// 5-bar coil extension
compressed5 = compressed4 and b4 <= b5 * 1.2
// 6-bar coil extension
compressed6 = compressed5 and b5 <= b6 * 1.2

coilBase    = i_ccBars <= 4 ? compressed4 : 
              i_ccBars <= 5 ? compressed5 : compressed6
coilAvgBody = i_ccBars <= 4 ? (b1+b2+b3+b4)/4.0 : 
              i_ccBars <= 5 ? (b1+b2+b3+b4+b5)/5.0 : (b1+b2+b3+b4+b5+b6)/6.0

ccBull = i_showCC and coilBase and isGreen and haBody >= coilAvgBody * i_ccMult and smaRising  and aboveSMA
ccBear = i_showCC and coilBase and isRed   and haBody >= coilAvgBody * i_ccMult and not smaRising


// ── P4: FIRST RESPONDER (FR) ─────────────────────────────────────────
// Futures: 3+ consecutive red bars, first wide green, tight upper wick
// ETF mode: 5+ red bars required (ETF crashes are slower), 
//           body compared to 10-bar avg (not just 3 prior reds),
//           looser upper wick allowance (0.35 vs 0.20)
frRedMin    = i_etfMode ? 5       : i_frRed
frUpWickMax = i_etfMode ? 0.35    : i_frUpWick

// ETF: compare body to 10-bar lookback average (handles large crash candles)
avgBody10   = (haBody[1]+haBody[2]+haBody[3]+haBody[4]+haBody[5]+
               haBody[6]+haBody[7]+haBody[8]+haBody[9]+haBody[10]) / 10.0

avgPriorRed = redStreak[1] >= 3 ? 
     (haBody[1]+haBody[2]+haBody[3]) / 3.0 : 0.0

// ETF: body only needs to be 50% of avg (crash red bars are huge; first green looks small)
frBodyRef   = i_etfMode ? avgBody10 * 0.50 : avgPriorRed * 0.85

frSignal = i_showFR 
     and redStreak[1] >= frRedMin
     and isGreen 
     and haBody >= frBodyRef
     and haUpWick <= haBody * frUpWickMax


// ── P5: SMA MAGNETIC PULL (SMP) ──────────────────────────────────────
// Solid green candle after price touched/brushed the SMA within 2 bars
// Only valid in rising SMA environment
smpSignal = i_showSMP 
     and solidGreen 
     and smaTouched 
     and smaRising 
     and aboveSMA


// ── P6: BODY COUNT DIVERGENCE (BCD) ──────────────────────────────────
// WARNING — momentum fading:
//   - Currently in a green run (≥ i_bcdStreak bars)
//   - Current green candle body is much smaller than prior (shrinking)
//   - Lower wick appearing for first time in the run
inGreenRun    = greenStreak[1] >= i_bcdStreak
bodyShrinking = isGreen and haBody > 0 
     and haBody < haBody[1] * i_bcdRatio
     and haBody < avgBody5 * i_bcdRatio      // also below the recent average
wickEmerging  = haDnWick > haBody * i_bcdWick
priorSolid    = solidGreen[1] and solidGreen[2]  // TWO solid bars before (not just one)

bcdSignal = i_showBCD 
     and inGreenRun 
     and bodyShrinking 
     and wickEmerging 
     and priorSolid


// ────────────────────────────────────────────────────────────────────
//  SECTION 6 — COMPOSITE QUALITY SCORE
//  Useful to size positions and filter marginal setups
// ────────────────────────────────────────────────────────────────────
//  +2  SHR  (highest conviction — flush + reclaim)
//  +1  CGR  (streak confirmation)
//  +1  SMP  (level confluence with SMA)
//  +1  FR   (reversal + wide body)
//  +1  CCBull
//  −2  BCD  (momentum warning overrides)

score = 0
score += shrSignal ? 2 : 0
score += cgrSignal ? 1 : 0
score += smpSignal ? 1 : 0
score += frSignal  ? 1 : 0
score += ccBull    ? 1 : 0
score -= bcdSignal ? 2 : 0

anyBullSignal = cgrSignal or shrSignal or frSignal or smpSignal or ccBull


// ────────────────────────────────────────────────────────────────────
//  SECTION 7 — VISUAL OUTPUT
// ────────────────────────────────────────────────────────────────────

// ── SMA ──────────────────────────────────────────────────────────────
plot(sma, "SMA", color.new(color.blue, 0), linewidth=2)

// ── P1 CGR — lime triangle below bar ─────────────────────────────────
plotshape(cgrSignal, 
     title     = "P1 CGR — Clean Green Run",
     style     = shape.triangleup,
     location  = location.belowbar,
     color     = color.new(color.lime, 0),
     size      = size.small,
     text      = "CGR",
     textcolor = color.lime)

// ── P2 SHR — gold star below bar (highest signal) ────────────────────
plotshape(shrSignal, 
     title     = "P2 SHR — Stop Hunt Reclaim",
     style     = shape.labelup,
     location  = location.belowbar,
     color     = color.new(color.yellow, 0),
     size      = size.large,
     text      = "SHR",
     textcolor = color.yellow)

// ── P3 CC Bull — cyan diamond below ──────────────────────────────────
plotshape(ccBull, 
     title     = "P3 CC — Coil Breakout Up",
     style     = shape.diamond,
     location  = location.belowbar,
     color     = color.new(color.aqua, 0),
     size      = size.small,
     text      = "CC↑",
     textcolor = color.aqua)

// ── P3 CC Bear — cyan diamond above ──────────────────────────────────
plotshape(ccBear, 
     title     = "P3 CC — Coil Breakdown",
     style     = shape.diamond,
     location  = location.abovebar,
     color     = color.new(color.aqua, 20),
     size      = size.small,
     text      = "CC↓",
     textcolor = color.aqua)

// ── P4 FR — orange arrow up below ────────────────────────────────────
plotshape(frSignal, 
     title     = "P4 FR — First Responder",
     style     = shape.arrowup,
     location  = location.belowbar,
     color     = color.new(color.orange, 0),
     size      = size.normal,
     text      = "FR",
     textcolor = color.orange)

// ── P5 SMP — teal circle below ───────────────────────────────────────
plotshape(smpSignal, 
     title     = "P5 SMP — SMA Magnetic Pull",
     style     = shape.circle,
     location  = location.belowbar,
     color     = color.new(color.teal, 0),
     size      = size.small,
     text      = "SMP",
     textcolor = color.teal)

// ── P6 BCD — red triangle down above ─────────────────────────────────
plotshape(bcdSignal, 
     title     = "P6 BCD — Divergence Warning",
     style     = shape.triangledown,
     location  = location.abovebar,
     color     = color.new(color.red, 0),
     size      = size.normal,
     text      = "BCD",
     textcolor = color.red)


// ────────────────────────────────────────────────────────────────────
//  SECTION 8 — BACKGROUND TINTS  (subtle, not distracting)
// ────────────────────────────────────────────────────────────────────
bgcolor(i_showBG and cgrSignal                  ? color.new(color.lime,   93) : na, title="CGR BG")
bgcolor(i_showBG and shrSignal                  ? color.new(color.yellow, 90) : na, title="SHR BG")
bgcolor(i_showBG and (smpSignal or frSignal)    ? color.new(color.teal,   93) : na, title="SMP/FR BG")
bgcolor(i_showBG and bcdSignal                  ? color.new(color.red,    94) : na, title="BCD Warning BG")


// ────────────────────────────────────────────────────────────────────
//  SECTION 9 — DETAIL LABELS
// ────────────────────────────────────────────────────────────────────
// Green streak counter (small, above each solid green bar in run)
if i_showLabels and solidGreen and solidStreak > 0 and solidStreak < i_cgrMin
    label.new(bar_index, haH, 
         str.tostring(solidStreak) + "G", 
         color     = color.new(color.lime, 75), 
         textcolor = color.white,
         style     = label.style_label_down, 
         size      = size.tiny,
         tooltip   = "Solid green streak: " + str.tostring(solidStreak) + " bar(s). Need " + str.tostring(i_cgrMin) + " for CGR signal.")

// SHR detail label — shows the wick ratio of the hunt candle
if i_showLabels and shrSignal
    wickRatio = math.round(haDnWick[1] / math.max(haBody[1], 0.0001) * 100)
    label.new(bar_index, haL, 
         "RECLAIM\nWick " + str.tostring(wickRatio) + "%", 
         color     = color.new(color.yellow, 60), 
         textcolor = color.black,
         style     = label.style_label_up, 
         size      = size.small,
         tooltip   = "Hunt candle lower wick was " + str.tostring(wickRatio) + "% of body. Follow-through confirmed.")

// FR: note that this is day-1 — wait for confirmation
if i_showLabels and frSignal
    label.new(bar_index, haL,
         "FR\nWait D2",
         color     = color.new(color.orange, 65),
         textcolor = color.black,
         style     = label.style_label_up,
         size      = size.tiny,
         tooltip   = "First Responder after " + str.tostring(redStreak[1]) + " red bars. Consider waiting for second green candle to confirm.")

// Composite score label on any bull signal
if i_showScore and anyBullSignal and not bcdSignal
    scoreColor = score >= 3 ? color.new(color.green, 60) : 
                 score >= 2 ? color.new(color.lime, 70) : 
                              color.new(color.gray, 70)
    label.new(bar_index, haH, 
         "Q" + str.tostring(score),
         color     = scoreColor,
         textcolor = color.white,
         style     = label.style_label_down,
         size      = size.tiny,
         tooltip   = "Signal quality score: " + str.tostring(score) + "/5. CGR=" + str.tostring(cgrSignal?1:0) + " SHR=" + str.tostring(shrSignal?2:0) + " SMP=" + str.tostring(smpSignal?1:0) + " FR=" + str.tostring(frSignal?1:0))


// ────────────────────────────────────────────────────────────────────
//  SECTION 10 — HUNT CANDLE MARKER
//  Mark the hunt candle itself (bar[-1] when SHR fires) with a dot
// ────────────────────────────────────────────────────────────────────
// We need to mark bar[-1] — detect it by looking one bar ahead
huntConfirmed = shrSignal[1] == false and shrSignal  // SHR just fired THIS bar
if huntConfirmed and i_showLabels
    line.new(bar_index - 1, haBodyBot[1], bar_index - 1, haL[1],
         color = color.new(color.yellow, 0), 
         width = 2,
         style = line.style_dotted)


// ────────────────────────────────────────────────────────────────────
//  SECTION 11 — ALERT CONDITIONS
// ────────────────────────────────────────────────────────────────────
alertcondition(cgrSignal, 
     title   = "P1 CGR — Clean Green Run",
     message = "CGR SIGNAL: Consecutive solid green HA candles confirmed. Above rising SMA. Enter bull put spread at open.")

alertcondition(shrSignal, 
     title   = "P2 SHR — Stop Hunt Reclaim (HIGH PRIORITY)",
     message = "SHR SIGNAL: Stop hunt reclaim confirmed. Hunt candle swept low, solid green follow-through. Highest probability entry. Enter DSE spread at open.")

alertcondition(frSignal, 
     title   = "P4 FR — First Responder",
     message = "FR SIGNAL: Wide green candle after red bars. Day-1 signal — consider waiting for second green bar to confirm.")

alertcondition(smpSignal, 
     title   = "P5 SMP — SMA Magnetic Pull",
     message = "SMP SIGNAL: Solid green candle after SMA touch. Trend continuation setup. Check quality score before entry.")

alertcondition(bcdSignal, 
     title   = "P6 BCD — Divergence WARNING",
     message = "BCD WARNING: Body shrinking and lower wick appearing. Momentum fading. Avoid new bull entries. Consider early exit on open positions.")

alertcondition(ccBull, 
     title   = "P3 CC — Coil Breakout Up",
     message = "CC BULL: Compression coil breakout to upside. Body expansion confirmed. Trend aligned.")

alertcondition(ccBear, 
     title   = "P3 CC — Coil Breakdown",
     message = "CC BEAR: Compression coil breakdown to downside. No new bull spreads. Defensive posture.")

alertcondition(anyBullSignal and score >= 3, 
     title   = "HIGH QUALITY SIGNAL (Score 3+)",
     message = "HIGH QUALITY: Multiple pattern confluence detected. Priority DSE entry. Check score table for details.")


// ────────────────────────────────────────────────────────────────────
//  SECTION 12 — INFO TABLE  (top-right corner)
//  Shows current bar's active signals and quality score
// ────────────────────────────────────────────────────────────────────
if barstate.islast
    tbl = table.new(position.top_right, 2, 10, 
         bgcolor       = color.new(color.black, 70), 
         border_color  = color.new(color.gray, 60), 
         border_width  = 1,
         frame_color   = color.new(color.gray, 50),
         frame_width   = 1)

    // Mode header row
    modeLabel = i_etfMode ? "ETF MODE (QQQ/SPY)" : "FUTURES MODE (MNQ/ES)"
    modeColor = i_etfMode ? color.new(color.teal, 30) : color.new(color.orange, 30)
    table.cell(tbl, 0, 0, modeLabel, text_color=color.white, text_size=size.tiny, bgcolor=modeColor)
    table.cell(tbl, 1, 0, "",        text_color=color.white, text_size=size.tiny, bgcolor=modeColor)

    // Header row 2
    table.cell(tbl, 0, 1, "PATTERN",  text_color=color.new(color.white, 30), text_size=size.tiny, bgcolor=color.new(color.navy, 20))
    table.cell(tbl, 1, 1, "STATUS",   text_color=color.new(color.white, 30), text_size=size.tiny, bgcolor=color.new(color.navy, 20))

    // P1 CGR
    table.cell(tbl, 0, 2, "P1 CGR",   text_color=color.white, text_size=size.tiny)
    table.cell(tbl, 1, 2, cgrSignal ? "FIRE (" + str.tostring(solidStreak) + "G)" : solidStreak > 0 ? str.tostring(solidStreak) + "G building" : "-",
         text_color = cgrSignal ? color.lime : solidStreak > 0 ? color.new(color.lime, 40) : color.new(color.white, 50),
         text_size  = size.tiny)

    // P2 SHR
    table.cell(tbl, 0, 3, "P2 SHR",   text_color=color.white, text_size=size.tiny)
    table.cell(tbl, 1, 3, shrSignal ? "FIRE" : huntCandle ? "Hunt bar" : "-",
         text_color = shrSignal ? color.yellow : huntCandle ? color.new(color.yellow, 40) : color.new(color.white, 50),
         text_size  = size.tiny)

    // P3 CC
    table.cell(tbl, 0, 4, "P3 CC",    text_color=color.white, text_size=size.tiny)
    table.cell(tbl, 1, 4, ccBull ? "BULL" : ccBear ? "BEAR" : coilBase ? "Coiled" : "-",
         text_color = ccBull ? color.aqua : ccBear ? color.new(color.aqua, 40) : color.new(color.white, 50),
         text_size  = size.tiny)

    // P4 FR
    table.cell(tbl, 0, 5, "P4 FR",    text_color=color.white, text_size=size.tiny)
    table.cell(tbl, 1, 5, frSignal ? "DAY 1" : redStreak >= frRedMin ? str.tostring(redStreak) + " red" : "-",
         text_color = frSignal ? color.orange : redStreak >= frRedMin ? color.new(color.orange, 40) : color.new(color.white, 50),
         text_size  = size.tiny)

    // P5 SMP
    table.cell(tbl, 0, 6, "P5 SMP",   text_color=color.white, text_size=size.tiny)
    table.cell(tbl, 1, 6, smpSignal ? "FIRE" : smaTouched ? "Near SMA" : "-",
         text_color = smpSignal ? color.teal : smaTouched ? color.new(color.teal, 40) : color.new(color.white, 50),
         text_size  = size.tiny)

    // P6 BCD
    table.cell(tbl, 0, 7, "P6 BCD",   text_color=color.white, text_size=size.tiny)
    table.cell(tbl, 1, 7, bcdSignal ? "WARN" : "-",
         text_color = bcdSignal ? color.red : color.new(color.white, 50),
         text_size  = size.tiny)

    // Divider
    table.cell(tbl, 0, 8, "----",    text_color=color.new(color.white, 60), text_size=size.tiny)
    table.cell(tbl, 1, 8, "----",    text_color=color.new(color.white, 60), text_size=size.tiny)

    // Quality score
    scoreLabel = score >= 4 ? "** HIGH" : score >= 2 ? "* MED" : score <= -1 ? "AVOID" : "LOW"
    scoreCol   = score >= 4 ? color.lime : score >= 2 ? color.yellow : score <= -1 ? color.red : color.new(color.white, 50)
    table.cell(tbl, 0, 9, "SCORE",   text_color=color.white, text_size=size.tiny)
    table.cell(tbl, 1, 9, str.tostring(score) + "/5 " + scoreLabel,
         text_color = scoreCol, text_size=size.tiny)
How to add: TradingView → Pine Script Editor → paste → Save → Add to Chart · Set ETF Mode ON for QQQ/SPY/DIA/IWM/GLD/XLE · Leave OFF for individual stocks
📕 The Book
Premium underwriting system · tiers, VIX regime & risk rules that govern the scanner
21-Day Challenge — $500 → $1,000
$0.00 / $500.00
Net P&L
$0
from logged trades
Win Rate
no closed trades
Open Policies
0
of 5 max
Book Risk
$0
of $2,500 cap
P&L and open policies read live from the Live Test Log on the Engine tab — log trades there and this updates.
Ticker Universe — Tiers
Higher tiers get priority and looser VIX gates. These badges appear on every scanner card.
Underwriting Rules
Entry Standards
✓ IV Rank ≥ 30 — never write cheap policies
✓ God/Excellent tier preferred; Strong only with elevated IVR
✓ Max risk/policy: $500 normal · $375 when VIX ≥ 20
✓ Total book risk ≤ $2,500 — max 5 open policies
✓ Max 1 policy per underlying
✓ Never write into known earnings dates
✓ VIX ≥ 20: God-tier only, iron condors preferred
Exit Rules — No Discretion
✓ Close at 50% of max premium — collect, redeploy
✗ Stop at 200% of premium received — pay the claim
✓ Close standard policies at 21 DTE — no gamma
✓ Close event/gap plays at 1 DTE regardless of P&L
✗ No averaging down on losers — ever
✗ No holding past stop hoping for a reversal
Risk Model
Verticals: max risk = width − credit (defined)
Naked / CSP: risk = loss at the 200% stop (≈ credit), not stock-to-zero
◆ Size each policy to the per-policy cap
◆ Sizing is the risk management — no claim should threaten the book
Insurance Philosophy
✓ We are the insurer. Premium = revenue. Every trade is a written policy.
✓ A losing trade is a paid claim — budgeted, not a failure.
✓ Edge is in underwriting discipline, not direction prediction.
✓ Diversify across uncorrelated underlyings.
🏦 Prop Desk
CatShack Capital · prop-firm evaluation & funded-account business
Accounts
Cost & Budget
Trading System & Windows
MNQ System (scaffold)
◆ Bias: 5-min Heikin-Ashi — green body = long bias, red = short bias
◆ Drop to 1-min: wait for a smooth pullback / retracement against bias
◆ Entry: break of the smooth body in the bias direction
◆ Risk:reward 1:1 · stop + target always attached (platform-enforced)
More rules to come — this section is editable as the system firms up.
Trade Windows (ET)
🇪🇺 European — 3:30–6:00 AM
🇺🇸 US Morning — 9:30–11:00 AM
🌏 Asian — 7:00–10:00 PM
Pick the session on each logged trade.
EOD Drawdown Discipline
◆ Trailing threshold follows peak EOD balance, never moves down
◆ Lock profits — giving back an unrealized gain permanently shrinks the cushion
◆ Headroom (below) = distance to the threshold; protect it
◆ One disciplined system across the cluster — not lottery tickets
Log Trade / Session — logged once, mirrored across the cluster
Trade Log
Payouts — business revenue (isolated)
💰 Family Monthly Budget
Living document · every field editable · totals update as you type
Monthly Income
$0
base · no weeks logged
Monthly Expenses
$0
savings + debt + essentials + subs
Excess Cash / Surplus
$0
to move toward goals
Passive Income
$0
of $4,500/mo goal
Income
Matt monthly base: $0
Total base monthly income: $0
Travel/OT weeks run higher — log those in the Weekly Tracker below; this card is the steady non-travel baseline.
Savings & Funds
Subtotal: $0
Debt Payments
Subtotal: $0
Essentials
Subtotal: $0
Subscriptions
Subtotal: $0
📄 Pay-Stub Reader
Upload a pay stub (image or PDF). Claude reads the earnings lines using your confirmed pay rules, then shows you the parsed numbers to review before anything is saved. Approved stubs become a tracker week and update your live monthly income.
Weekly Tracker
Log each pay period here. This is where uploaded pay stubs will land — Claude will fill these rows and roll them up to the monthly total.
WeekMatt GrossNikkiTotal IncomeWeekly ExpensesSurplusNotes
Logged income (this set)
$0
0 weeks
Logged surplus
$0
income − weekly expenses
vs. budgeted income
$0
logged − base monthly
🎯 Goals
The headline goal — $4,500/mo passive income — is tracked live from your CatShack trading scorecards. Add savings or payoff goals below and the advisor will factor them in.
🚀 $4,500/mo Passive Income $0 / $4,500
Sourced from your latest trading scorecard + rolling-engine projection. Surplus from this budget is the capital that grows it.
🧠 Money-Move Advisor
Claude looks at your live income, expenses, excess cash, debt balances & rates, goals, and your passive-income progress — then recommends exactly where this month's excess should go to pay down debt fastest and build toward $4,500/mo passive. Needs your Anthropic key (Today tab → ⚙ Settings).
Allocation & Payoff Notes

Zero-based plan: essentials + debt + subscriptions are covered by base income. Surplus is assigned each month — extra debt paydown (avalanche: Brault 10% first, then Ashtyn 8%, then cars), then boost savings, then buffer / remodel / LLC / Nikki-reduce-hours fund.

Payoff projections with $2,000–$4,000 extra/month (avalanche): Brault ~4–8 mo · Ashtyn ~3–6 mo · cars 8–18 mo · student loans 12–30 mo · then extra toward the mortgage.

Pay-stub rules (for the upcoming upload feature): always 40 regular hours at the stub's effective rate ($79–$82+ on travel weeks, incl. ~$14.50 travel adder); OT = 1.5× that rate; double time ≈ 2×; add every extra line (Reimbursement Exper, T&C Per Diem, TC Benefits Scale). Use gross for budgeting.

Saved!
BUSINESS BASELINE
Cashflow Quadrant · the scoreboard
Edit any figure —
the scoreboard updates live.
Income on the right side (B + I)
0%
Active · you work (E + S)Passive · works for you (B + I)
The whole strategy is this number climbing toward 100%. Left funds the build; right is the goal.
Passive covers your monthly nut
0%
When this hits 100%, the W2 day job becomes a choice, not a requirement.
E — Employee$0
You work for money · active
→ Funds the build. Goal: make optional.
B — Business$0
Systems work for you · leveraged
← Built from S. Runs without your hands.
S — Self-employed$0
You own a job · active cash
→ Converts into I. Systematize into B.
I — Investor$0
Money works for you · the engine
Rolling Engine — options income
PMCC capital$%/mo
Put capital$%/mo
Options income$0/mo
Asset cash flow (STR/park)$
← Funded by S. Compounds + buys assets.
How to read this: The I box is wired to your Rolling Engine — PMCC rent (capital × %/mo) plus put-side yield. Deploy more capital or add properties and the right side climbs. You're done when passive alone covers your nut.