Glogger System — Installation & FAQ

Complete guide for setting up the Glogger signal bot on a new Windows machine, configuring brokers, and connecting Telegram alerts.

Installation

Prerequisites

1
Install Python 3.11+ from python.org. During setup, check "Add Python to PATH".

Copy the folder

2
Copy the glogger_system\ folder to the new machine. The required structure is:
glogger_system/
  src/
  templates/
  static/
  data/          ← created automatically on first run
  config.yaml
  requirements.txt
  run.bat
  run_dashboard.bat

Install dependencies

3
Open a terminal in the project folder and run:
python -m pip install -r requirements.txt
Key packages: yfinance, flask, pyyaml, robin_stocks, pyotp, pyetrade, matplotlib, holidays, requests

Edit config.yaml

4
Fill in your credentials. At minimum you need Robinhood credentials and a Telegram bot token. See the Configuration section below.

Test the installation

5
python -m tests.test_synthetic     # unit tests
python -m src.main --once          # single scan — confirms data + alerts work

Configuration (config.yaml)

All settings live in config.yaml. You can also edit most settings from the Settings panel in the dashboard without opening a file editor.

account:
  value: 5000            # your account balance in USD
  max_risk_pct: 10       # never risk more than 10% per trade

trading:
  mode: notify           # notify | sandbox | live
  broker: robinhood      # robinhood | etrade (Robinhood is the default)

robinhood:
  username: "you@email.com"
  password: "yourpassword"
  totp_secret: ""        # only if you use 2FA via an authenticator app
  account_number: "123456789"   # agentic / bot account

alerts:
  telegram:
    enabled: true
    bot_token: "1234567890:AABBCCxxx..."
    chat_id: "987654321"
    forward_to: []       # add other recipients' chat IDs here

Running the Bot

Signal bot (main loop)

python -m src.main

Or double-click run.bat. Starts before 10:00 AM ET. Must stay running all day during market hours.

Dashboard only

python -m src.dashboard_server

Or double-click run_dashboard.bat. Then open http://localhost:5000.

Keep it running 24/7 (Windows Task Scheduler)

  1. Open Task Scheduler → Create Basic Task
  2. Trigger: When the computer starts
  3. Action: Start a program → browse to run.bat
  4. Set the working directory to the project folder

RHRobinhood Setup

Robinhood is the default broker. The bot uses robin_stocks to look up option chains and place orders.

1
Have two Robinhood accounts: one agentic account the bot uses, and one personal account you trade in manually. Keep them separate.
2
Set robinhood.username, robinhood.password, and robinhood.account_number in config.yaml (or via the Settings panel).
3
2FA (optional): If your Robinhood account uses an authenticator app (TOTP), set totp_secret to the base32 secret from the app setup screen. Leave blank if you use SMS or no 2FA.
4
The session is cached in memory. No daily token refresh is needed (unlike E*TRADE).

2x Exit Rule

When the bot buys a contract at $X, it immediately places a sell-to-close GTC limit at $2X. If the contract doubles in value, it sells automatically. This is Cardona methodology Rule 27.

ETE*TRADE Setup (optional)

E*TRADE is optional. Use it if you prefer it over Robinhood.

1
Apply at developer.etrade.com. Sandbox keys are instant; live keys take a few days.
2
Paste consumer_key and consumer_secret into config.yaml under the etrade: block.
3
Daily login: E*TRADE kills OAuth tokens every night. Each morning the bot prints a login URL — open it, authorize, and paste the verification code back into the terminal.
4
Change trading.broker to etrade in config.yaml (or via the Settings panel).

Telegram Setup

1
Message @BotFather on Telegram → /newbot → follow prompts → copy the bot token.
2
Message @userinfobot to find your chat ID.
3
Paste both into config.yaml (or the Settings panel). Send your bot any message once to activate the chat.
4
Start sending commands to the bot. The most important ones to get started:
/signals          — see today's signal IDs
/trade <id>       — preview a trade
/qty 2            — set a fixed quantity (e.g. always buy 2 contracts)
exp 7/10          — change expiration on the previewed trade
strike 620        — change strike (also: dist 8, qty 2, limit 0.40)
yes / si / dale   — confirm and place
no / cancel       — abort
See the full Bot Commands reference below for every available command.
5
To add another recipient, add their chat ID to alerts.telegram.forward_to. They must send the bot /start first.

Telegram Bot — Full Command Reference

Send any of these to your Telegram bot. Commands are case-insensitive. The bot only responds to the chat_id configured in config.yaml.

Signals & Trading

Command What it does
/signals also /today, /hoy List every signal detected today with its ID, direction, strike, expiry, ask price, and the correct /trade command to use.
/trade <id> Fetch a live quote for signal <id> and show a trade preview: contract details, quantity, total cost, risk %, and the 2× GTC exit price. The quantity shown follows the priority: per-trade override → global /qty override → auto-calculated. Replies with "yes" or "no" to proceed.
/trade <id> <qty> Same as /trade <id> but forces <qty> contracts for this one trade only — does not change the global setting. Example: /trade 7 3 previews signal 7 with exactly 3 contracts.
/tradelive <id> Same as /trade but for signals detected from the professor's live class audio (tagged [LIVE CLASS] in /signals).
yes / si / dale / ok / go / confirm Confirm the pending trade preview. The bot places the buy-to-open limit order, then immediately places a 2× sell-to-close GTC order. Works even when the bot is in notify mode.
no / cancel / cancelar / abort / nope Cancel the pending trade preview. Nothing is placed.

Customize Before Placing

After a /trade or /tradelive preview (and before replying "yes"), you can change anything about the trade by sending one of the messages below. Each one fetches a fresh live quote and shows an updated preview, with a Customized: line listing what you've changed. Adjustments stack — change the expiry, then the strike, then the quantity. Sending /trade <id> again starts over with the signal's original values. The slash is optional: strike 620 and /strike 620 both work.

Message What it does
exp 7/10 also exp 2026-07-10, exp 7-10, exp 7/10/26 Change the expiration date. Accepts most date formats; a month/day without a year assumes the next occurrence. Also answers to expiry and expiration.
exp +1  /  exp +2  /  exp next Roll to a later weekly expiry without typing a date. +1 = the next listed expiry after the current one, +2 = two out. SPY rolls Mon/Wed/Fri; other tickers roll Friday to Friday. Market holidays are skipped automatically.
strike 620 Set an exact strike price. If that strike isn't listed on the chain, the bot picks the nearest available one and tells you in the preview.
dist 8 also distance 8 Set the strike by distance from spot (the VALORES table method). Recomputes strike = spot + $8 for CALLs, spot − $8 for PUTs, using the live underlying price (falls back to the price when the signal fired). The preview shows which spot was used.
qty 2 Change the contract quantity for this trade only. Doesn't touch the global /qty setting. (Note: bare qty 2 adjusts the pending trade; slash /qty 2 sets the global override.)
limit 0.40 also price 0.40 Use a custom limit price instead of the live ask. The buy order is placed at your price, and the 2× sell-to-close exit scales with it (limit 0.40 → exit at 0.80). Also lets you preview when the market is closed and the ask reads $0.
Example session: /trade 7 → preview shows SPY CALL $630 exp Jul 6 → exp +1 (roll to Jul 8) → strike 625qty 2limit 0.40 → preview now shows every change → yes places 2 contracts @ $0.40 with a $0.80 GTC exit.

Quantity Override

By default the bot calculates contracts as floor(account × risk% / (ask × 100)). You can override this up or down — buy fewer contracts than the bot suggests to reduce risk, or buy more to scale up a high-conviction trade. The global setting persists in data/bot_state.json and survives bot restarts.

Command What it does
/qty Show the current quantity setting — either a fixed number or "auto (bot calculates)".
/qty 1 Reduce to minimum. Always buy 1 contract regardless of account size. Useful for testing or when you want minimum exposure.
/qty 2  /  /qty 3  /  /qty 5  … Set any fixed number. Every future /trade preview will use exactly that many contracts — whether that's fewer or more than the bot would calculate. Saved to disk immediately. Any whole number ≥ 1 is valid.
/qty 10  /  /qty 20  … Scale up. Buy more contracts than the bot's risk-cap would normally allow. Use with care — this intentionally exceeds the max risk % cap.
/qty auto
also: /qty 0  ·  /qty off  ·  /qty reset
Revert to automatic sizing. Clears the saved override. The bot calculates the quantity from your account value and max risk % on each trade. Any of the four aliases work identically.
One-time override (no global change): Add the quantity directly to the /trade command — /trade 7 3 previews signal 7 with exactly 3 contracts without changing the saved global setting. Useful when you want a different size for just this one trade.

Priority order (highest wins): /trade <id> <qty> (one-time inline)  ›  /qty <n> (global saved override)  ›  auto-calculated from account size

Outcomes & History

Command What it does
/outcomes also /results Show the last 15 checked signal outcomes: contract, ask price, 2× target, option peak, WIN/LOSS, and win rate summary.
/outcomes <n> Show the last <n> outcomes. Example: /outcomes 30. Outcomes are filled in by the hourly outcome checker; pending signals show ⏳.

Robinhood Session

Robinhood sessions expire occasionally. Use these commands to reconnect from Telegram without touching the computer.

Command What it does
/rh_status also /rhstatus Check whether the Robinhood session is currently active. ✅ = ready to trade. ❌ = needs login.
/rh_login also /rhlogin Trigger a Robinhood login attempt. Robinhood will send a verification code via SMS, email, or push notification. Follow with /rh_code or /rh_push depending on what you receive.
/rh_code <code> Submit the SMS or email verification code Robinhood sent. Example: /rh_code 123456. The bot completes the login and confirms with ✅.
/rh_push also /rhpush After approving a push notification in the Robinhood app, send this to complete the login (waits up to 30 seconds for Robinhood to confirm).

Cloudflare Tunnel (remote access)

Expose the dashboard to the internet so you can view it from your phone or any device — no VPN needed.

1
Install cloudflared from Cloudflare's download page.
2
Start the dashboard, then in a separate terminal run:
cloudflared tunnel --url http://localhost:5000
Cloudflare will print a public *.trycloudflare.com URL you can open from anywhere.
3
For a permanent URL, use a named tunnel with a Cloudflare account. See run_tunnel.ps1 in the project folder.
4
From the remote dashboard you can use the Settings panel to change the broker, account number, credentials, and mode — no need to SSH into the server.

Trading Modes

Mode What happens When to use
notify Sends Telegram alerts only. No orders placed. Telegram /trade still works (uses force=True). Start here. Run at least 30 days before going live.
sandbox Places simulated orders in E*TRADE sandbox (no real money). E*TRADE testing before going live.
live Places REAL orders. Requires confirm_live: "I UNDERSTAND THE RISKS" in config. Only after 30+ days of paper trading with good results.

The Telegram /trade command bypasses the mode setting — you can place real orders via Telegram even in notify mode. This is intentional: you control each trade manually.

Economic Events the Bot Monitors

The bot has a built-in 2026 economic calendar in config.yaml. Every time a signal fires, the bot checks if a high-impact event is nearby and either blocks the auto-trade or adds a warning. You can add custom one-off dates in extra_event_days.

Event Config key Severity What it is
FOMC Decision fomc_decision_2026 HIGH Federal Reserve interest-rate decision + press conference. 2:00 PM ET. Auto-trades are blocked on these days.
FOMC Start fomc_start_2026 MEDIUM Day 1 of the 2-day FOMC meeting (no decision yet, but the market is cautious). Warning shown.
CPI cpi_2026 HIGH Consumer Price Index — BLS, 8:30 AM ET. The most market-moving inflation print. Auto-trades blocked.
PPI ppi_2026 MEDIUM Producer Price Index — BLS, 8:30 AM ET. Released the day after CPI. Warning shown.
PCE pce_2026 MEDIUM Personal Consumption Expenditures — BEA, 8:30 AM ET. The Fed's preferred inflation gauge. Warning shown. PCE ≠ FOMC — it is a separate monthly data release.
NFP nfp_2026 HIGH Non-Farm Payrolls (Employment Situation) — BLS, 8:30 AM ET, first Friday of each month. Most volatile macro release. Auto-trades blocked.
JOLTS jolts_2026 MEDIUM Job Openings & Labor Turnover Survey — BLS, 10:00 AM ET. Released ~6 weeks after reference month.
ADP adp_2026 WATCH ADP National Employment Report — 8:15 AM ET, Wednesday before NFP. Private-sector payrolls preview.
GDP gdp_2026 HIGH GDP Advance Estimate — BEA, 8:30 AM ET. Quarterly. Auto-trades blocked.
Retail Sales retail_sales_2026 MEDIUM Census Bureau, 8:30 AM ET. Key consumer spending gauge, released monthly.
Consumer Confidence consumer_confidence_2026 WATCH Conference Board, 10:00 AM ET, last Tuesday of each month. Awareness only.
Michigan Sentiment michigan_sentiment_2026 WATCH UMich Consumer Sentiment Preliminary — 10:00 AM ET, 2nd Friday of each month. Awareness only.
Beige Book beige_book_2026 MEDIUM Fed regional economic report, 2:00 PM ET, released ~2 weeks before each FOMC meeting.
ISM Mfg PMI ism_mfg_2026 MEDIUM ISM Manufacturing PMI — 10:00 AM ET, first business day of each month.
ISM Services PMI ism_svc_2026 MEDIUM ISM Services PMI — 10:00 AM ET, 3rd business day of each month.
Monthly OPEX opex_monthly_2026 MEDIUM Options expiration — 3rd Friday of non-quarterly months. Pinning and last-hour reversals are common.
Triple Witching opex_quarterly_2026 HIGH Quarterly OPEX — 3rd Friday of Mar / Jun / Sep / Dec. Stock options + index options + index futures all expire simultaneously. Massive volume. Auto-trades blocked.

Severity levels

  • HIGH — Auto-trades are blocked. The signal is still logged and a Telegram alert fires, but the bot will not place an order. The row appears with the 🚫 BLOCKED tag in the dashboard.
  • MEDIUM — Auto-trades can still proceed, but a warning is added to the signal and shown in the dashboard Events column.
  • WATCH — Awareness only. Logged in the signal but no trade restriction.

Adding custom dates

Add any one-off high-impact dates (earnings, Fed speeches, geopolitical events) to config.yaml:

events:
  extra_event_days: ["2026-07-15", "2026-09-22"]

These behave as HIGH-severity blocks.

FAQ

What's new — July 2026

What is the Paper Money page?

A fake-money trading account at /paper (💵 buttons in the dashboard navbar and charts header), modeled on uCharts Paper Money. You start with a virtual $10,000. It shows Account Value, Cash, Open/Realized P&L, Win Rate and Profit Factor, plus open positions with live prices, a per-strategy performance table, and full trade history. Reset account wipes all paper trades and sets a new starting balance. Nothing here touches a real broker.

How does the auto paper-trading bot work?

When the toggle on the Paper Money page is ON, every CALL/PUT signal the scanner logs today is automatically bought as a 1-contract paper trade at the signal's ask price — every strategy, regardless of tag. It runs in the background every 15 minutes (page doesn't need to be open) and each signal is traded only once. Positions auto-sell the moment the contract's live price touches the 2× target (Rule 27 exit); expired contracts settle at intrinsic value. The Strategy Performance table then shows which strategies actually make money.

How do I make manual paper trades?

Two ways: (1) turn the auto-bot toggle OFF on the Paper Money page — a manual entry form appears (ticker, CALL/PUT, strike, expiry, entry price, qty); or (2) on the Charts page, pick any contract in the Price Calculator and press 📝 Paper trade next to the Copy button. Manual and bot trades are labeled separately in the tables.

How do the themes work?

Every page (dashboard, charts, paper money, this page, and the PIN/login screens) has a theme toggle — in the dashboard/docs navbar, on the charts header and the login screens, a dropdown on Paper Money. Two options: dark (black) and gray, both with the US-flag watermark in the background. Your choice is saved in the browser and applies to all pages at once — including before you've entered your PIN.

Does the dashboard link change every time I reboot?

No — fixed as of 2026-07-05. The dashboard used to run behind a Cloudflare "quick tunnel," which mints a brand-new random *.trycloudflare.com address on every restart. Shortening that address turned out not to work either: Bitly's free plan only allows 5 short links total (not per month — ever), and every no-signup shortener tested (is.gd, v.gd, TinyURL) refuses to shorten trycloudflare.com-style links outright, since tunnel/redirector domains are blocklisted as a common phishing pattern.

The real fix was switching to Tailscale Funnel — a free, permanent public HTTPS address for the dashboard that never changes across restarts. No domain purchase or DNS migration needed (a Cloudflare named tunnel was considered, but required either a $250/mo Business plan or migrating the whole brightstarsupplies.com domain's DNS, which risked the Google Workspace email records — Tailscale avoids all of that). The dashboard is now permanently reachable at https://glogger.tail51945a.ts.net (the device was renamed from its default desktop-ij0srrl to glogger for a cleaner URL), already saved as the Chrome bookmark. The old Cloudflare tunnel scripts (run_tunnel.ps1, the URL-watching logic in power_reset_helper.py) are no longer used by startup.

The charts said "Yahoo may be rate-limiting" — what happens now?

Options data (expirations and chains) loads from Yahoo Finance first; if Yahoo is rate-limited or returns nothing, the server automatically falls back to your Robinhood session (the same login the bot uses). When that happens the contract panel shows a small RH data pill. Expiration lists are cached for 6 hours, and the web server now handles requests in parallel, so one slow Yahoo call no longer freezes the whole page.

Why does the Price Calculator start with a higher underlying price?

The Simple calculator's "Underlying price" now defaults to the recommended strike from the PDF-criteria table — so the estimate immediately answers "what would this option be worth if the stock reaches the recommended level by the target date?" Click the blue Current: $X chip to reset it to the live spot, or type any price.

Can I use the dashboard and charts on my phone?

Yes — all pages adapt to phone screens (tested at Galaxy S Ultra size). On the dashboard the navbar buttons become icon-only, signal tabs swipe sideways, and wide tables scroll horizontally inside their card. On the charts page the sidebar stacks under the chart and the drawing tools work with touch (draw with your finger; pan/zoom stays normal when the cursor tool is selected).

General

The bot started but I don't see Telegram messages — what's wrong?

Check config.yaml: alerts.telegram.enabled must be true, and bot_token + chat_id must be correct. Send /start to your bot in Telegram at least once to activate the chat.

I sent /trade 5 and got "Signal 5 not found" — why?

/trade only searches today's signals. If the signal is from yesterday, it won't appear. Use /signals to see what IDs are available today.

The bot is in notify mode — can I still place trades via Telegram?

Yes. The Telegram listener uses force=True, which bypasses the mode check. You can place orders through Telegram regardless of whether the bot is in notify, sandbox, or live mode.

How do I switch from E*TRADE to Robinhood?

In the Settings panel (gear icon in the dashboard navbar), change Broker to Robinhood and save. You can also edit config.yaml directly: trading.broker: robinhood. Restart the bot for the change to take effect.

The bot shows 0 contracts — why?

Your 10% risk cap is smaller than the cost of one contract. Example: $200 account × 10% = $20 cap, but the contract asks $0.21 × 100 = $21. The Telegram preview will show 1 contract anyway and tell you you're slightly over the cap — you decide whether to proceed.

What is the 2x exit rule?

When you buy a contract at $X, the bot immediately places a sell-to-close GTC limit at $2X. If the contract doubles in value, it sells automatically. This is Cardona methodology Rule 27.

Where is the database stored?

glogger_system/data/glogger.db — SQLite file. The dashboard reads from it. Do not delete it; all signal history and P&L estimates are stored there.

How do I check if the Telegram listener is running?

Send /signals to your bot. If it replies within 30 seconds, the listener is active. If there's no response, the bot may not be running or the token/chat_id is wrong.

How do I add a second Telegram recipient?

In config.yaml, add their chat ID to alerts.telegram.forward_to: forward_to: ["987654321"]. They must send /start to the bot first. You can also do this from the Settings panel.

What Robinhood account number should I use?

Use the agentic account number (the one dedicated to the bot). Keep your personal trading account separate. If you only have one account, that's fine — just use that number.

Where can I change the account number without editing config.yaml?

In the dashboard Settings panel (gear icon in the navbar). Changes are saved immediately to config.yaml. Restart the bot for broker/credential changes to take effect.

How do I control how many contracts the bot buys?

Send /qty 2 (or any number) to set a global override — every future /trade preview will use that quantity. Send /qty auto to revert to automatic sizing. For a one-off change on a single trade, add the quantity directly to the command: /trade 5 3 previews signal 5 with exactly 3 contracts, without changing the global setting. The current override is saved to data/bot_state.json and survives bot restarts. Send /qty alone to see what's currently set.

The trade preview shows "[global override (2)]" — what does that mean?

It means a global quantity override of 2 is active (set with /qty 2). The bracket label always tells you why that quantity was chosen: auto = bot calculated it, global override = you set it with /qty, custom = you set it for this trade only (via /trade <id> <qty> or by sending qty <n> after the preview).

Can I change the expiration date or strike price before placing a trade?

Yes — after any /trade preview and before replying "yes", send exp 7/10 (or exp +1 for the next weekly expiry) to change the expiration, strike 620 for an exact strike, or dist 8 to recompute the strike as spot ± $8. Each message re-quotes the contract live and shows an updated preview. Changes stack, and the preview lists everything you've customized. See Customize Before Placing for the full list.

What's the difference between strike 620 and dist 8?

strike 620 pins an exact strike price. dist 8 uses the VALORES-table method: the bot fetches the live underlying price and sets strike = spot + $8 for CALLs (spot − $8 for PUTs). Use dist when the underlying has moved since the signal fired and you want to keep the same out-of-the-money distance. Setting one clears the other — whichever you sent last wins.

Can I buy at my own price instead of the live ask?

Yes — send limit 0.40 (or price 0.40) after a preview. The buy-to-open order is placed at your limit price, and the 2× sell-to-close exit scales with it ($0.40 entry → $0.80 exit). This also works when the market is closed and the ask shows $0 — set a manual limit and the preview completes.

How do I check signal outcomes from Telegram without opening the dashboard?

Send /outcomes to see the last 15 checked signals with their WIN/LOSS result, option peak price, and overall win rate. Send /outcomes 30 to see more. The outcome checker runs automatically every hour in the background.

The bot can't place trades — what Robinhood commands do I use?

First send /rh_status to check if the session is active. If it's not, send /rh_login — Robinhood will send a verification code to your SMS, email, or Robinhood app. Then: if you got a code via SMS or email, reply /rh_code 123456; if you got a push notification and approved it in the app, reply /rh_push. See the Bot Commands section for details.

Can I place trades from Telegram even when the bot is in notify mode?

Yes — the Telegram /trade command always bypasses the mode setting and places real orders. This is intentional: the mode controls auto trades; Telegram gives you manual control over each trade regardless of mode.