Dashboard

● Active
📄 Download CSV
🖶 Print / PDF
🖼 Export Page (PDF)
📊 Generate Report…
All Time Today Yesterday 7 Days
IN
IndiaNSE
9:15 AM – 3:30 PM IST · Paper
Today's P&L
All-Time P&L
US
US MarketNYSE / NASDAQ
9:30 AM – 4:00 PM ET · Alpaca paper
Today's P&L
All-Time P&L
Crypto24/7
Binance BTC/ETH/USDT · Paper
Today's P&L
All-Time P&L

⚡ Windows Services

Loading...
Closed Trades Open Positions
Paper 🔴 Live
Last 10 closed
📄 Download CSV
🖶 Print / PDF
📊 Generate Report…
Loading...

Open Positions

Live 30s
📄 Download CSV
🖶 Print / PDF
📊 Generate Report…
Loading...

Trade History

All Today Yesterday 7 Days 30 Days
📄 Download CSV
🖶 Print / PDF
📊 Generate Report…
Loading...

Symbol Leaderboard

Live 60s
📄 Download CSV
🖶 Print / PDF
📊 Generate Report…
All
India
US
Crypto
Loading...

Watchlist Symbols

Add or remove symbols per market. Saved to data/watchlist.json. Bot workers pick up changes on next restart.

IN
India NSE
e.g. RELIANCE, TCS, INFY
US
US Markets
e.g. AAPL, TSLA, NVDA
Crypto
Crypto 24/7
e.g. BTC, ETH, SOL
How it works: Symbols are stored in data/watchlist.json on the server. The India worker expects NSE symbols without exchange suffix (e.g. RELIANCE). US symbols should match Alpaca tickers (e.g. AAPL). Crypto base currencies only — no USDT suffix (e.g. BTC, not BTCUSDT). The worker appends USDT automatically.

Settings

Saved to database — restart workers to apply.  ❓ Help & FAQ
📄 Download CSV
🖶 Print / PDF
Quick preset:
🎯
Strategy Quality Controls
Controls how often and when the bot buys — biggest impact on trade count and P&L.
❓ Explain these
Original $300/4hr profitable session: Signal Score 4 • Mood Filter OFF • Sector Cap OFF • Time Exit OFF
IN
India (NSE)
9:15 AM – 3:30 PM IST · Paper mode
US
US (NASDAQ / NYSE)
9:30 AM – 4:00 PM ET · Alpaca paper
Crypto (24/7)
Binance paper · BTC/ETH/USDT pairs
⚙️
General
Paper modes and slippage simulation
📨
Telegram Notifications
Master switch — disabling stops ALL alerts instantly, no restart needed
Enabled
ALERTS Alert Types
MARKETS Per-Market Control
Enable or disable alerts for each trading market independently.
THRESHOLDS Alert Filters
Suppress low-value alerts. Leave at 0 to receive every alert.
TUNNEL Tunnel URL Notifications
Send a Telegram message when the Cloudflare tunnel gets a new URL (quick tunnels rotate on every restart).
📱
WhatsApp Notifications
Master switch — disabling stops ALL WhatsApp alerts instantly, no restart needed
Enabled
ALERTS Alert Types
MARKETS Per-Market Control
Enable or disable WhatsApp alerts for each trading market independently.
THRESHOLDS Alert Filters
Suppress low-value alerts. Leave at 0 to receive every alert.
TUNNEL Tunnel URL Notifications
Get notified via WhatsApp when the Cloudflare tunnel URL changes (quick tunnels rotate on every restart).
🔔
ntfy Push Notifications
Free push notifications to your phone — no API key, no signup, works instantly
Enabled
SETUP How to get started (takes 2 minutes)
  1. Install the ntfy app on your phone — search "ntfy" on Android (Play Store) or iOS (App Store). It's free.
  2. Open the app → tap + → type any unique topic name, e.g. angelbot-pete
  3. Enter the same topic name in the Topic Name field below and save.
  4. Click 📡 Test Connection above — you should get a push notification on your phone within seconds.
  5. Enable the master switch and you're done. No API keys, no verification.
Privacy: ntfy.sh topics are public by default — pick a hard-to-guess name (add random numbers). For private topics, create an account at ntfy.sh and set an access token below.
CONFIG Connection Settings
ALERTS Alert Types
MARKETS Per-Market Control
Enable or disable ntfy alerts for each market independently.
TUNNEL Tunnel URL Notifications
Get a push notification when the Cloudflare tunnel URL changes (tunnels rotate on every restart).
⬇️
Update Bot Code
Pull latest code from GitHub and restart all services
Apply Update pulls the latest code from GitHub, restarts all workers and the portal (~10s downtime). Use after any code push.
Restart Workers
Restart individual services to pick up settings changes
After changing settings, restart the relevant worker(s) for changes to take effect.
🖥️
Portal Settings
Auto-refresh intervals for each dashboard widget (seconds)
🔴
Live Trading — REAL MONEY
Runs CONCURRENTLY alongside paper trading — enabling this places real broker orders on your live-funded accounts.
Set the capital cap below and save it before enabling either market — a cap of 0 means "not configured" and every live buy will be refused as a safety default. Disabling live trading is instant and does not touch any position already open; open live positions keep being monitored and exited normally.
Status & Kill Switch
Loading…

API Keys & Tokens

Credentials are saved to .env on the server. Restart bot workers after any changes.

IN
Angel One (India NSE)
Paper Trading
How to get your Angel One credentials:
1. Login to SmartAPI at smartapi.angelone.in → My Account → Generate API Key.
2. MPIN is the 4-digit PIN you use to login to the Angel One app.
3. TOTP Secret — enable TOTP in Angel One app under Settings → Security, scan the QR code, and save the secret key shown below the QR (26-character base32 string, e.g. F6ZPU4RVSBJ7BO7YUJGV…).
4. Client ID is your Angel One user ID (e.g. AAAK500258).
US
Alpaca (US Markets)
Paper Trading
How to get Alpaca Paper API keys:
1. Sign up free at alpaca.markets. Go to Paper Trading (not Live) in the dashboard.
2. Click View API Keys in the right panel → Generate New Key.
3. Copy both the API Key ID and Secret Key immediately — the secret is only shown once.
4. Paper trading has unlimited free trades and $100,000 virtual capital by default.
Crypto
Binance (Crypto 24/7)
Paper Trading
How to get Binance API keys:
1. Login to binance.com → Profile → API ManagementCreate API.
2. Choose System Generated. Give it a label like AngelBot.
3. Under API Restrictions, enable only Enable Reading (paper mode never places real orders).
4. Complete 2FA, then copy both keys — the secret is only shown once.
5. If you don't have a Binance account, keys can be left blank — the bot uses simulated prices via fallback.
Telegram Alerts
How to set up Telegram alerts:
1. Open Telegram → search for @BotFather → send /newbot.
2. Follow prompts to name your bot. BotFather gives you a Bot Token like 8760657306:AAH4zYb7oo5y….
3. To get your Chat ID: message your new bot, then open https://api.telegram.org/bot<TOKEN>/getUpdates in a browser and look for "chat":{"id": — that number is your Chat ID.
📱
WhatsApp Alerts (CallMeBot — Free)
Free setup — no account needed:
1. Save +34 644 82 13 90 in your WhatsApp contacts (name it "CallMeBot").
2. Send this exact message to that contact: I allow callmebot to send me messages
3. You will receive your API Key via WhatsApp within a few seconds.
4. Enter your Phone Number with country code, no + or spaces (e.g. 919876543210 for India, 12125551234 for US) and the API Key below.
🤖
AI Analysis (Optional)
Optional
AI-powered report analysis — optional, reports work without this:
1. Anthropic (Claude): Sign up at console.anthropic.com → API Keys → Create Key. Used first if set.
2. OpenAI (GPT-4o Mini): Sign up at platform.openai.com → API Keys → Create new secret key. Used as fallback.
3. If neither key is set, reports use the free built-in analysis engine automatically.
✉️
Email (SMTP) — Password Reset OTPs
Required for Forgot Password OTP emails.
Works with Gmail, Outlook, or any SMTP server.
Gmail example: Host: smtp.gmail.com · Port: 587 · User: your Gmail address · Pass: an App Password (not your login password).
SMTP_FROM is the "From" address shown in the email — leave blank to use SMTP_USER.
🔒
Portal & Database
Portal Admin Password — used to log in to this web portal. Change it here, then log out and back in.
SQL SA Password — SQL Server Express sa account password set during installation. Changing this here does not change the SQL Server password itself — update SQL Server separately if needed.

❓ Help & FAQ

⚡ Quick Presets
Apply a full strategy configuration in one click — saves immediately to database.

🚀 High Volume

Buy more stocks, more trades per day. Lower confidence per trade but maximum activity. Best when you want quantity.

Signal: 2Mood Filter: OFFSector Cap: OFFMax Positions: 20Time Exit: ON (30 min)

⚖️ Balanced

Mix of frequency and quality. Filters some bad market days but still trades actively. Good all-around starting point.

Signal: 3Mood Filter: ONSector Cap: OFFMax Positions: 10Time Exit: OFF

🛡️ Conservative

Only the strongest setups. Fewest trades but highest individual confidence. Good on low-volatility days.

Signal: 4Mood Filter: ON (-0.5%)Sector Cap: ONMax Positions: 5
📊 Signal Quality (MIN_SIGNAL_SCORE) — How does it work?

Before buying any stock, the bot checks multiple technical signals: RSI, volume spike, price momentum, candle pattern, and more. MIN_SIGNAL_SCORE is how many of these must say "BUY" before the bot actually places a trade.

Score 2 — Aggressive
Only 2 signals need to agree. Maximum trades. More noise and false entries. Use when you want as many setups as possible.
Score 3 — Moderate
3 signals agree. Good balance between frequency and quality. Fewer bad entries than Score 2.
Score 4 — Strict
4 signals agree. Fewest trades, highest confidence. Matched the original $300/4hr profitable session settings.
Score 5 — Very Strict
5+ signals align simultaneously. Ultra-selective — very few trades per day. Best on strong trending markets only.
🌡️ Market Mood Filter — ON or OFF?

What it does: Checks whether the NIFTY index (India) or S&P 500 (US) is down by more than the threshold percentage. If the index is down more than that, the bot stops buying new positions for the rest of the day. Existing open positions still close normally via target or SL.

Turn ON when: You want to avoid buying into a falling market. Conservative approach — avoids chasing stocks on overall bad days.

Turn OFF when: You want to trade regardless of the index direction. Individual stocks can go up even when the index is falling. The original $300/4hr profitable session had this OFF.

Threshold: -0.5 = very strict (blocks if index down 0.5%). -1.5 = standard. -3.0 = very loose (only blocks on crash days). Only applies when Mood Filter is ON.

🏢 Sector Cap — What does it protect against?

What it does: Limits how many stocks from the same industry sector you can hold open at the same time. With MAX_SECTOR_POSITIONS=2, the bot won't buy a 3rd IT stock if you already hold 2 IT stocks open.

Turn ON when: You want to spread risk across sectors. Protects you from being overexposed if one sector (e.g. Banks) suddenly drops.

Turn OFF when: You want maximum trades. If 5 IT stocks all have strong buy signals, the bot takes all 5. The original profitable session had this OFF. Sector concentration can work in your favor when a sector is on a run.

🔢 Max Concurrent Positions — How many stocks at once?

This is the total number of stocks the bot can hold open simultaneously across all markets. Once this limit is hit, it won't open new positions until existing ones close via target or stop-loss.

5 (default): Conservative. Only 5 open trades total at any time.

10–15: Active. Good for ₹10,000 capital — each position is ~₹500–₹700.

20+: High-volume. More positions means each individual SL hit hurts less. Recommended when you want maximum activity.

Rule of thumb: Keep (Max Positions × average position size) below 80% of your capital. With ₹10,000 and ₹600 avg position, 20 positions = ₹12,000 which is too much. Set target to 15 for ₹600 avg positions.

⏱️ Time Exit — Should I force-close stuck positions?

Sometimes a stock goes flat after you buy — neither hitting the profit target nor the stop-loss. It just sits there, tying up a position slot that could be used for a better opportunity.

Time Exit ON: After MAX_HOLD_MINUTES, close the position at whatever the current price is — profit, loss, or break-even. Frees the slot for new opportunities. Recommended for high-volume trading.

Time Exit OFF: Wait for target or stop-loss naturally. Better for high-confidence setups that just need more time.

MAX_HOLD_MINUTES: India market is 6 hours (9:15 AM – 3:30 PM IST). Setting 30 minutes means any stuck position is closed within 30 min and a new one can open. 90 minutes (default) means a stuck stock ties up a slot for 1.5 hours.

📈 Profit Target & Stop Loss — What % to use?

SCALP_TARGET_PCT (default 1.5%): Exit and take profit when the stock gains this much. On a ₹600 position that's ₹9 profit per win.

SCALP_SL_PCT (default 0.6%): Exit and cut the loss when the stock drops this much. On a ₹600 position that's -₹3.60 loss per loss.

Risk/Reward = 2.5:1. You win ₹9 when right, lose ₹3.60 when wrong. You only need to be right about 30% of the time to break even. Being right 50% of the time means every ₹10,000 in daily volume generates profit.

To get more fills faster: Tighten the target (e.g. 1.0%) so positions close quicker. But don't tighten the SL too much — below 0.4% you'll get false exits on normal price noise.

⚠️ Why did the bot stop buying after just a few stocks?
Peak Drawdown limit (PEAK_DRAWDOWN_PCT) — now fixed

This was broken. It compared cash balance (which drops when you deploy capital) against the starting balance, making the bot think you'd lost 40–50% when you'd actually just bought stocks. This is now fixed — the check only fires when you've actually lost money through closed losing trades.

Max Positions full (MAX_CONCURRENT_POSITIONS)

All position slots are occupied. Bot waits for existing positions to close. Raise MAX_CONCURRENT_POSITIONS to allow more simultaneous trades.

Daily Loss Limit hit (MAX_DAILY_LOSS_PCT)

Total realized losses for the day exceeded this %. Default is 2% = ₹200 on ₹10,000 capital. Bot stops buying for the rest of the day.

Daily Trade Cap hit (MAX_DAILY_TRADES)

The bot has already completed N trades (wins + losses combined) today. Default is 30.

Mood Filter triggered (USE_MOOD_FILTER)

NIFTY/S&P 500 dropped more than MOOD_FILTER_THRESHOLD%. Set USE_MOOD_FILTER to OFF to trade regardless of index direction.

🛡️ What is Paper Mode and why can't I turn it off in the portal?

Paper mode means the bot simulates trades without spending real money. It tracks virtual positions and P&L exactly as if live — but no real orders are ever placed on Angel One, Alpaca, or Binance.

PAPER_MODE = India • ALPACA_PAPER = US • BINANCE_PAPER = Crypto

The portal intentionally blocks turning these off. To go live, edit the .env file directly on the server and restart. This prevents accidentally going live from the web UI while still testing.

💰 How is position size calculated?

Position size = 5% of current balance per trade. On ₹10,000 balance: 5% = ₹500 per trade. For a stock at ₹250, that buys 2 shares. For a stock at ₹800, it buys 0 shares (can't afford a full lot) — the bot then tries 1 share if it's within 10% of balance.

As your balance grows from winning trades, position sizes grow automatically. As balance drops from losses, position sizes shrink — a built-in risk scaling mechanism.

MAX_DEPLOYED_PCT (default 70%) is the hard cap — bot will never have more than 70% of balance in open positions at any moment. The other 30% stays as cash buffer.

Logs

IN India US US Crypto Watchdog Portal
📄 Visible → CSV
🖶 Visible → Print
All 0 ERR 0 WARN 0 BUY 0 SELL
Select a market to load logs.

Live Monitor

Idle
IN India US US Crypto Portal
0 ERR 0 WARN 0 BUY 0 SELL
Connecting to live feed…

My Account

Manage your login credentials and recovery email.

Recovery Email
Used for Forgot Password OTP resets. Must be verified to receive OTPs.
Change Password
Two-Factor Authentication (MFA)
Adds a time-based code requirement every login. Works with Google Authenticator, Authy, and 1Password.
Hardware Security Keys
Supports YubiKey, Windows Hello, Touch ID, and any FIDO2/WebAuthn device. Can be used as a login method or second factor.

My Paper Account

Your isolated paper trading capital and risk settings. Changes apply on next bot restart.

Capital Allocation
Risk Settings
Market Toggles

User Management

Add users to this portal — they share the same database and see only their own trades. To create a completely separate independent portal, go to Portals.

User Role Email Bot Status Last Login Actions
Loading...
Admin

Full access — can view all data, change config, restart services, and manage users.

Viewer

Read-only access — can view dashboard, trades, positions, and logs. Cannot change settings.

Portal Instances

Each instance is a fully independent AngelBot deployment — its own database, port, and bot services. Users on separate instances are completely isolated from each other.

ℹ️
This Portal (port 8080) — your main instance. Users added here share this database.
New Portal — creates a fresh independent instance on a new port. Each gets its own database, its own bot workers, its own admin login.
Loading...

Confirm