Crypto Market Watch game - VWAP+RSI scanner, paper trading, systemd timer
This commit is contained in:
60
projects/crypto-watch/run_scan.py
Normal file
60
projects/crypto-watch/run_scan.py
Normal file
@ -0,0 +1,60 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Wrapper to run crypto scan and send Telegram alerts.
|
||||
Designed for systemd timer execution.
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
import urllib.request
|
||||
from game_engine import run_scan, get_portfolio_value, get_trades
|
||||
|
||||
TELEGRAM_BOT_TOKEN = os.environ.get("TELEGRAM_BOT_TOKEN", "")
|
||||
TELEGRAM_CHAT_ID = os.environ.get("TELEGRAM_CHAT_ID", "6443752046")
|
||||
|
||||
|
||||
def send_telegram(message):
|
||||
if not TELEGRAM_BOT_TOKEN:
|
||||
return
|
||||
url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
|
||||
data = json.dumps({
|
||||
"chat_id": TELEGRAM_CHAT_ID,
|
||||
"text": message,
|
||||
"parse_mode": "HTML",
|
||||
}).encode()
|
||||
req = urllib.request.Request(url, data=data, headers={"Content-Type": "application/json"})
|
||||
try:
|
||||
urllib.request.urlopen(req, timeout=10)
|
||||
except Exception as e:
|
||||
print(f"Telegram error: {e}")
|
||||
|
||||
|
||||
def main():
|
||||
result = run_scan(max_positions=10, position_size=5000)
|
||||
|
||||
buys = result.get("buys", [])
|
||||
sells = result.get("sells", [])
|
||||
snapshot = result.get("snapshot", {})
|
||||
|
||||
# Only alert if there were trades
|
||||
if buys or sells:
|
||||
lines = ["🎮 <b>Crypto Watch Update</b>\n"]
|
||||
|
||||
for t in buys:
|
||||
lines.append(f"📥 BUY {t['symbol']} @ ${t['price']:,.4f}")
|
||||
lines.append(f" {t.get('reason', '')}\n")
|
||||
|
||||
for t in sells:
|
||||
emoji = "🟢" if t.get("pnl", 0) >= 0 else "🔴"
|
||||
lines.append(f"📤 SELL {t['symbol']} @ ${t['price']:,.4f}")
|
||||
lines.append(f" {emoji} PnL: ${t.get('pnl', 0):+,.2f} ({t.get('pnl_pct', 0):+.1f}%)")
|
||||
lines.append(f" {t.get('reason', '')}\n")
|
||||
|
||||
lines.append(f"💰 Portfolio: ${snapshot.get('total_value', 0):,.2f} ({snapshot.get('total_pnl_pct', 0):+.2f}%)")
|
||||
lines.append(f"💵 Cash: ${snapshot.get('cash', 0):,.2f} | Positions: {snapshot.get('num_positions', 0)}")
|
||||
|
||||
send_telegram("\n".join(lines))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user