diff --git a/.env.telegram-bot b/.env.telegram-bot index e5b9247..2ce0761 100644 --- a/.env.telegram-bot +++ b/.env.telegram-bot @@ -9,3 +9,9 @@ N8N_WEBHOOK_URL=https://flow.egonetix.de/webhook/3371ad7c-0866-4161-90a4-f251de4 # Your Telegram chat ID (already set to 579304651) TELEGRAM_CHAT_ID=579304651 + +# Trading Bot API URL (internal Docker network) +TRADING_BOT_URL=http://trading-bot-v4:3000 + +# API Secret Key (same as in main .env file) +API_SECRET_KEY=2a344f0149442c857fb56c038c0c7d1b113883b830bec792c76f1e0efa15d6bb diff --git a/STATUS_COMMAND_QUICKREF.txt b/STATUS_COMMAND_QUICKREF.txt new file mode 100644 index 0000000..857d9ff --- /dev/null +++ b/STATUS_COMMAND_QUICKREF.txt @@ -0,0 +1,66 @@ +╔════════════════════════════════════════════════════════════════╗ +║ TELEGRAM /status COMMAND ║ +║ ✅ READY TO USE ║ +╚════════════════════════════════════════════════════════════════╝ + +📱 HOW TO USE +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +1. Open your Telegram bot chat +2. Send: /status +3. Get instant position info! + +📊 WHAT YOU'LL SEE +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +✅ Current P&L ($ and % of account) +✅ Entry price & current price +✅ TP1, TP2, and SL levels with status +✅ Position size & leverage +✅ Trade age in minutes + +🎯 EXAMPLE OUTPUT +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 🟢 SOL-PERP 📈 LONG + + 💰 P&L: $3.50 (+0.70% account) + 📊 Price Change: +0.07% + + Entry: $142.5000 + Current: $142.6000 + + Targets: + TP1: $143.4975 ⏳ + TP2: $144.6375 + SL: $140.3625 + + Position: $500.00 @ 10x + Age: 5 min + +🔧 TECHNICAL STATUS +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +✅ Container: telegram-trade-bot (Running) +✅ Network: Connected to trading-bot-v4 +✅ API: Authenticated & tested +✅ Command: /status handler active + +📝 ALL COMMANDS +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +/status → Show current position +/buySOL → Long SOL +/sellSOL → Short SOL +/buyBTC → Long BTC +/sellBTC → Short BTC +/buyETH → Long ETH +/sellETH → Short ETH + +🔐 SECURITY +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +✅ Only works in YOUR chat (579304651) +✅ API authentication required +✅ Internal Docker network +✅ No internet exposure + +🎉 READY! +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +Open Telegram and send /status to try it now! + +Next: Open a position, then check /status to see it in action! 🚀 diff --git a/TELEGRAM_BOT_README.md b/TELEGRAM_BOT_README.md index 63d2f9b..f7b5064 100644 --- a/TELEGRAM_BOT_README.md +++ b/TELEGRAM_BOT_README.md @@ -26,6 +26,34 @@ Paste your bot token when asked. ## 📱 Using it on your phone +### Check Position Status +Send `/status` to see your current open position with: +- Real-time P&L (both $ amount and % of account) +- Entry price and current price +- TP1, TP2, and SL levels with status indicators +- Position size and leverage +- Trade age in minutes + +Example output: +``` +🟢 SOL-PERP 📈 LONG + +💰 P&L: $3.50 (+0.70% account) +📊 Price Change: +0.07% + +Entry: $142.5000 +Current: $142.6000 + +Targets: + TP1: $143.4975 ⏳ + TP2: $144.6375 + SL: $140.3625 + +Position: $500.00 @ 10x +Age: 5 min +``` + +### Execute Trades Just send messages to your Telegram chat: ``` buy sol @@ -34,6 +62,14 @@ buy eth sell sol ``` +Or use commands: +``` +/buySOL +/sellBTC +/buyETH +/status +``` + The bot will: 1. ✅ Parse your message 2. ✅ Forward to n8n webhook diff --git a/TELEGRAM_STATUS_IMPLEMENTATION.md b/TELEGRAM_STATUS_IMPLEMENTATION.md new file mode 100644 index 0000000..b5f7b23 --- /dev/null +++ b/TELEGRAM_STATUS_IMPLEMENTATION.md @@ -0,0 +1,172 @@ +# Telegram /status Command - Implementation Summary + +## ✅ **Feature Complete** + +You can now send `/status` in your Telegram channel to get real-time information about your open position on Drift Protocol. + +--- + +## 📊 What You'll See + +### When No Position Is Open: +``` +📊 No open positions + +All clear! Ready for new signals. +``` + +### When You Have an Open Position: +``` +🟢 SOL-PERP 📈 LONG + +💰 P&L: $3.50 (+0.70% account) +📊 Price Change: +0.07% + +Entry: $142.5000 +Current: $142.6000 + +Targets: + TP1: $143.4975 ✅ (if hit) + TP2: $144.6375 ⏳ + SL: $140.3625 + +Position: $500.00 @ 10x +Age: 5 min +``` + +### Legend: +- 🟢 = Profit | 🔴 = Loss | ⚪ = Breakeven +- 📈 = Long | 📉 = Short +- ✅ = Target hit | ⏳ = Pending + +--- + +## 🚀 How to Use + +1. Open your Telegram bot chat +2. Send: `/status` +3. Get instant position info! + +You can send it anytime - while trading, after hours, whenever you want to check your position. + +--- + +## 🔧 What Changed + +### Files Modified: +1. **`telegram_command_bot.py`** + - Added `status_command()` function + - Fetches data from trading bot API + - Formats beautiful status messages + +2. **`docker-compose.telegram-bot.yml`** + - Added `TRADING_BOT_URL` environment variable + - Added `API_SECRET_KEY` environment variable + +3. **`.env.telegram-bot`** + - Added trading bot URL (internal Docker network) + - Added API secret key for authentication + +### New Environment Variables: +```bash +TRADING_BOT_URL=http://trading-bot-v4:3000 +API_SECRET_KEY=2a344f0149442c857fb56c038c0c7d1b113883b830bec792c76f1e0efa15d6bb +``` + +--- + +## ✅ Verification + +**Container Status:** +```bash +docker ps | grep telegram-trade-bot +# Output: Up About a minute +``` + +**Bot Logs:** +```bash +docker logs telegram-trade-bot --tail 10 +# Shows: ✅ Commands: /status - Show open positions +``` + +**API Connectivity Test:** +```bash +docker exec telegram-trade-bot python3 -c "import requests; r=requests.get('http://trading-bot-v4:3000/api/trading/positions', headers={'Authorization': 'Bearer 2a344f0149442c857fb56c038c0c7d1b113883b830bec792c76f1e0efa15d6bb'}); print(r.status_code)" +# Output: 200 ✅ +``` + +--- + +## 🎯 Live Example Use Cases + +### Morning Check: +``` +You: /status +Bot: 🟢 SOL-PERP 📈 LONG + 💰 P&L: $8.25 (+1.65% account) + TP1: $143.50 ✅ + Runner position active! +``` + +### During Volatile Move: +``` +You: /status +Bot: 🔴 SOL-PERP 📈 LONG + 💰 P&L: -$3.75 (-0.75% account) + Current: $141.80 + SL: $140.36 (still safe!) +``` + +### Multiple Times Per Day: +- Check before meetings +- Monitor during lunch +- Quick check before bed +- Anytime you're curious! + +--- + +## 🔐 Security + +✅ **Only works in YOUR Telegram chat** (TELEGRAM_CHAT_ID=579304651) +✅ **Requires API authentication** (API_SECRET_KEY) +✅ **Internal Docker network** (not exposed to internet) +✅ **Same security as main trading bot** + +--- + +## 📝 Available Commands + +Your Telegram bot now supports: + +| Command | Description | +|---------|-------------| +| `/status` | Show current open position | +| `/buySOL` | Open long SOL position | +| `/sellSOL` | Open short SOL position | +| `/buyBTC` | Open long BTC position | +| `/sellBTC` | Open short BTC position | +| `/buyETH` | Open long ETH position | +| `/sellETH` | Open short ETH position | + +--- + +## 🎉 Ready to Use! + +Your Telegram bot is running and ready. Just send `/status` to try it out! + +**Container:** `telegram-trade-bot` ✅ Running +**Network:** Connected to `trading-bot-v4` ✅ +**API:** Authenticated and tested ✅ +**Commands:** `/status` handler active ✅ + +--- + +## 📚 Documentation Updated + +- ✅ `TELEGRAM_BOT_README.md` - Updated with /status usage +- ✅ `TEST_STATUS_COMMAND.md` - Testing guide +- ✅ `TELEGRAM_STATUS_IMPLEMENTATION.md` - This file + +--- + +**Next time you open a position, send `/status` to see it in action!** 🚀 diff --git a/TEST_STATUS_COMMAND.md b/TEST_STATUS_COMMAND.md new file mode 100644 index 0000000..92bda2e --- /dev/null +++ b/TEST_STATUS_COMMAND.md @@ -0,0 +1,110 @@ +# Testing the /status Command + +## ✅ Feature Implemented + +The Telegram bot now supports the `/status` command to show current open positions. + +## What It Shows + +When you send `/status` in your Telegram chat, you'll receive: + +### If No Positions Are Open: +``` +📊 No open positions + +All clear! Ready for new signals. +``` + +### If Position Is Open: +``` +🟢 SOL-PERP 📈 LONG + +💰 P&L: $3.50 (+0.70% account) +📊 Price Change: +0.07% + +Entry: $142.5000 +Current: $142.6000 + +Targets: + TP1: $143.4975 ⏳ + TP2: $144.6375 + SL: $140.3625 + +Position: $500.00 @ 10x +Age: 5 min +``` + +### Emojis Used: +- 🟢 Green = Position in profit +- 🔴 Red = Position in loss +- ⚪ White = Breakeven +- 📈 = Long position +- 📉 = Short position +- ✅ = Target hit +- ⏳ = Target pending + +## Technical Details + +### How It Works: +1. User sends `/status` in Telegram +2. Bot calls `GET /api/trading/positions` on trading-bot-v4:3000 +3. Bot parses response and formats position data +4. Bot sends formatted message back to user + +### Files Modified: +- `telegram_command_bot.py` - Added `status_command()` handler +- `docker-compose.telegram-bot.yml` - Added environment variables +- `.env.telegram-bot` - Added `TRADING_BOT_URL` and `API_SECRET_KEY` + +### Environment Variables Required: +```bash +TRADING_BOT_URL=http://trading-bot-v4:3000 +API_SECRET_KEY= +``` + +## Testing + +### 1. Test from Terminal (API): +```bash +curl -H "Authorization: Bearer YOUR_API_SECRET_KEY" \ + http://localhost:3001/api/trading/positions | jq . +``` + +### 2. Test from Telegram: +- Open your Telegram bot chat +- Send: `/status` +- Should receive position info or "No open positions" + +### 3. Test with Active Position: +- Execute a test trade first: + - Send `/buySOL` or use settings page "Test LONG" +- Then send `/status` +- Should see full position details + +## Verification + +✅ Container running: +```bash +docker ps | grep telegram-trade-bot +``` + +✅ Logs showing /status handler: +```bash +docker logs telegram-trade-bot --tail 20 +``` + +✅ Network connectivity: +```bash +docker exec telegram-trade-bot python3 -c "import requests; r=requests.get('http://trading-bot-v4:3000/api/trading/positions', headers={'Authorization': 'Bearer YOUR_KEY'}); print(r.status_code)" +``` + +Should output: `200` + +## Next Steps + +You can now monitor your positions in real-time from your phone! + +Just send `/status` anytime to check: +- Current P&L +- How close you are to TP/SL +- How long the trade has been open diff --git a/docker-compose.telegram-bot.yml b/docker-compose.telegram-bot.yml index 575e5e3..660b14e 100644 --- a/docker-compose.telegram-bot.yml +++ b/docker-compose.telegram-bot.yml @@ -14,6 +14,8 @@ services: - TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN} - N8N_WEBHOOK_URL=${N8N_WEBHOOK_URL} - TELEGRAM_CHAT_ID=579304651 + - TRADING_BOT_URL=${TRADING_BOT_URL:-http://trading-bot-v4:3000} + - API_SECRET_KEY=${API_SECRET_KEY} networks: - traderv4_trading-net diff --git a/telegram_command_bot.py b/telegram_command_bot.py index 28a2304..15d2f7c 100644 --- a/telegram_command_bot.py +++ b/telegram_command_bot.py @@ -11,8 +11,94 @@ from telegram.ext import Application, CommandHandler, ContextTypes # Configuration TELEGRAM_BOT_TOKEN = os.getenv('TELEGRAM_BOT_TOKEN') N8N_WEBHOOK_URL = os.getenv('N8N_WEBHOOK_URL') +TRADING_BOT_URL = os.getenv('TRADING_BOT_URL', 'http://trading-bot-v4:3000') +API_SECRET_KEY = os.getenv('API_SECRET_KEY', '') ALLOWED_CHAT_ID = int(os.getenv('TELEGRAM_CHAT_ID', '579304651')) +async def status_command(update: Update, context: ContextTypes.DEFAULT_TYPE): + """Handle /status command - show current open positions""" + + # Only process from YOUR chat + if update.message.chat_id != ALLOWED_CHAT_ID: + await update.message.reply_text("❌ Unauthorized") + return + + print(f"📊 /status command received", flush=True) + + try: + # Fetch positions from trading bot API + response = requests.get( + f"{TRADING_BOT_URL}/api/trading/positions", + headers={'Authorization': f'Bearer {API_SECRET_KEY}'}, + timeout=10 + ) + + print(f"📥 API Response: {response.status_code}", flush=True) + + if not response.ok: + await update.message.reply_text(f"❌ Error fetching positions: {response.status_code}") + return + + data = response.json() + + if not data.get('success'): + await update.message.reply_text("❌ Failed to fetch positions") + return + + # Check if there are active positions + positions = data.get('positions', []) + + if not positions: + await update.message.reply_text("📊 *No open positions*\n\nAll clear! Ready for new signals.", parse_mode='Markdown') + return + + # Format position information + for pos in positions: + symbol = pos['symbol'] + direction = pos['direction'].upper() + entry = pos['entryPrice'] + current = pos['currentPrice'] + size = pos['currentSize'] + leverage = pos['leverage'] + + # P&L + pnl_pct = pos['profitPercent'] + account_pnl = pos['accountPnL'] + unrealized_pnl = pos['unrealizedPnL'] + + # Targets + sl = pos['stopLoss'] + tp1 = pos['takeProfit1'] + tp2 = pos['takeProfit2'] + tp1_hit = pos['tp1Hit'] + + # Age + age_min = pos['ageMinutes'] + + # Build status message + emoji = "🟢" if account_pnl > 0 else "🔴" if account_pnl < 0 else "⚪" + direction_emoji = "📈" if direction == "LONG" else "📉" + + message = f"{emoji} *{symbol}* {direction_emoji} {direction}\n\n" + message += f"💰 *P&L:* ${unrealized_pnl:.2f} ({account_pnl:+.2f}% account)\n" + message += f"📊 *Price Change:* {pnl_pct:+.2f}%\n\n" + message += f"*Entry:* ${entry:.4f}\n" + message += f"*Current:* ${current:.4f}\n\n" + message += f"*Targets:*\n" + message += f" TP1: ${tp1:.4f} {'✅' if tp1_hit else '⏳'}\n" + message += f" TP2: ${tp2:.4f}\n" + message += f" SL: ${sl:.4f}\n\n" + message += f"*Position:* ${size:.2f} @ {leverage}x\n" + message += f"*Age:* {age_min} min" + + await update.message.reply_text(message, parse_mode='Markdown') + + print(f"✅ Status sent: {len(positions)} position(s)", flush=True) + + except Exception as e: + print(f"❌ Error: {e}", flush=True) + await update.message.reply_text(f"❌ Error: {str(e)}") + async def trade_command(update: Update, context: ContextTypes.DEFAULT_TYPE): """Handle trade commands like /buySOL, /sellBTC, etc.""" @@ -72,7 +158,9 @@ def main(): print(f"🚀 Telegram Trade Bot Starting...", flush=True) print(f"📱 Allowed Chat ID: {ALLOWED_CHAT_ID}", flush=True) print(f"🔗 Webhook: {N8N_WEBHOOK_URL}", flush=True) + print(f"🤖 Trading Bot: {TRADING_BOT_URL}", flush=True) print(f"\n✅ Commands:", flush=True) + print(f" /status - Show open positions", flush=True) print(f" /buySOL, /sellSOL", flush=True) print(f" /buyBTC, /sellBTC", flush=True) print(f" /buyETH, /sellETH", flush=True) @@ -81,6 +169,7 @@ def main(): application = Application.builder().token(TELEGRAM_BOT_TOKEN).build() # Add command handlers + application.add_handler(CommandHandler("status", status_command)) application.add_handler(CommandHandler("buySOL", trade_command)) application.add_handler(CommandHandler("sellSOL", trade_command)) application.add_handler(CommandHandler("buyBTC", trade_command)) diff --git a/telegram_trade_bot.py b/telegram_trade_bot.py index 9ce58d4..7aa2d12 100644 --- a/telegram_trade_bot.py +++ b/telegram_trade_bot.py @@ -7,13 +7,96 @@ Run: python3 telegram_trade_bot.py import os import requests from telegram import Update -from telegram.ext import Application, MessageHandler, filters, ContextTypes +from telegram.ext import Application, MessageHandler, CommandHandler, filters, ContextTypes # Configuration - SET THESE! TELEGRAM_BOT_TOKEN = os.getenv('TELEGRAM_BOT_TOKEN', 'YOUR_BOT_TOKEN_HERE') N8N_WEBHOOK_URL = os.getenv('N8N_WEBHOOK_URL', 'https://your-n8n.com/webhook/manual-trade') +TRADING_BOT_URL = os.getenv('TRADING_BOT_URL', 'http://trading-bot-v4:3000') +API_SECRET_KEY = os.getenv('API_SECRET_KEY', '') ALLOWED_CHAT_ID = int(os.getenv('TELEGRAM_CHAT_ID', '579304651')) +async def handle_status_command(update: Update, context: ContextTypes.DEFAULT_TYPE): + """Handle /status command - show current open positions""" + + # Only your chat + if update.message.chat_id != ALLOWED_CHAT_ID: + return + + print(f"📊 /status command received") + + try: + # Fetch positions from trading bot API + response = requests.get( + f"{TRADING_BOT_URL}/api/trading/positions", + headers={'Authorization': f'Bearer {API_SECRET_KEY}'}, + timeout=10 + ) + + if not response.ok: + await update.message.reply_text(f"❌ Error fetching positions: {response.status_code}") + return + + data = response.json() + + if not data.get('success'): + await update.message.reply_text("❌ Failed to fetch positions") + return + + # Check if there are active positions + positions = data.get('positions', []) + + if not positions: + await update.message.reply_text("📊 *No open positions*\n\nAll clear! Ready for new signals.", parse_mode='Markdown') + return + + # Format position information + for pos in positions: + symbol = pos['symbol'] + direction = pos['direction'].upper() + entry = pos['entryPrice'] + current = pos['currentPrice'] + size = pos['currentSize'] + leverage = pos['leverage'] + + # P&L + pnl_pct = pos['profitPercent'] + account_pnl = pos['accountPnL'] + unrealized_pnl = pos['unrealizedPnL'] + + # Targets + sl = pos['stopLoss'] + tp1 = pos['takeProfit1'] + tp2 = pos['takeProfit2'] + tp1_hit = pos['tp1Hit'] + + # Age + age_min = pos['ageMinutes'] + + # Build status message + emoji = "🟢" if account_pnl > 0 else "🔴" if account_pnl < 0 else "⚪" + direction_emoji = "📈" if direction == "LONG" else "📉" + + message = f"{emoji} *{symbol}* {direction_emoji} {direction}\n\n" + message += f"💰 *P&L:* ${unrealized_pnl:.2f} ({account_pnl:+.2f}% account)\n" + message += f"📊 *Price Change:* {pnl_pct:+.2f}%\n\n" + message += f"*Entry:* ${entry:.4f}\n" + message += f"*Current:* ${current:.4f}\n\n" + message += f"*Targets:*\n" + message += f" TP1: ${tp1:.4f} {'✅' if tp1_hit else '⏳'}\n" + message += f" TP2: ${tp2:.4f}\n" + message += f" SL: ${sl:.4f}\n\n" + message += f"*Position:* ${size:.2f} @ {leverage}x\n" + message += f"*Age:* {age_min} min" + + await update.message.reply_text(message, parse_mode='Markdown') + + print(f"✅ Status sent: {len(positions)} position(s)") + + except Exception as e: + print(f"❌ Error: {e}") + await update.message.reply_text(f"❌ Error: {str(e)}") + async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE): """Forward trade commands to n8n""" @@ -63,16 +146,20 @@ def main(): print(f"🚀 Telegram Trade Bot Starting...") print(f"📱 Chat ID: {ALLOWED_CHAT_ID}") print(f"🔗 Webhook: {N8N_WEBHOOK_URL}") - print(f"\n✅ Send messages like:") + print(f"🤖 Trading Bot: {TRADING_BOT_URL}") + print(f"\n✅ Commands:") + print(f" /status - Show open positions") + print(f"\n✅ Trade messages:") print(f" buy sol") print(f" sell btc") print(f" buy eth") print(f" sell sol") app = Application.builder().token(TELEGRAM_BOT_TOKEN).build() + app.add_handler(CommandHandler("status", handle_status_command)) app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message)) - print(f"\n🤖 Bot ready! Listening for trade commands...\n") + print(f"\n🤖 Bot ready! Listening for commands...\n") app.run_polling(allowed_updates=Update.ALL_TYPES) if __name__ == '__main__':