Dashboard
⚡ Windows Services
Open Positions
Trade History
Symbol Leaderboard
Watchlist Symbols
Add or remove symbols per market. Saved to data/watchlist.json. Bot workers pick up changes on next restart.
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
- Install the ntfy app on your phone — search "ntfy" on Android (Play Store) or iOS (App Store). It's free.
- Open the app → tap + → type any unique topic name, e.g.
angelbot-pete - Enter the same topic name in the Topic Name field below and save.
- Click 📡 Test Connection above — you should get a push notification on your phone within seconds.
- Enable the master switch and you're done. No API keys, no verification.
API Keys & Tokens
Credentials are saved to .env on the server. Restart bot workers after any changes.
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).
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.
1. Login to binance.com → Profile → API Management → Create 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.
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.
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 messages3. 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.
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.
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.
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
🚀 High Volume
Buy more stocks, more trades per day. Lower confidence per trade but maximum activity. Best when you want quantity.
⚖️ Balanced
Mix of frequency and quality. Filters some bad market days but still trades actively. Good all-around starting point.
🛡️ Conservative
Only the strongest setups. Fewest trades but highest individual confidence. Good on low-volatility days.
📊 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.
🌡️ 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?
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.
All position slots are occupied. Bot waits for existing positions to close. Raise MAX_CONCURRENT_POSITIONS to allow more simultaneous trades.
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.
The bot has already completed N trades (wins + losses combined) today. Default is 30.
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
My Account
Manage your login credentials and recovery email.
My Paper Account
Your isolated paper trading capital and risk settings. Changes apply on next bot restart.
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.
Full access — can view all data, change config, restart services, and manage users.
Read-only access — can view dashboard, trades, positions, and logs. Cannot change settings.
Add New User
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.
New Portal — creates a fresh independent instance on a new port. Each gets its own database, its own bot workers, its own admin login.