
使用Scala Play框架构建REST API
“兄弟,上个月我用 99 块/月的 TG Bot 薅了 3000 块 USDT,全靠 GPT 写的策略。”
凌晨 1:17,群消息弹出,配图是一张收益截图。
我以为又是 P 图营销,直到他把 Bot 源码、实盘曲线、甚至电费账单全部甩进群里。
我花了 72 小时复现,结果——真的可行。下面把整套副业流水线拆给你:从 0 预算到月入 3–5 k,全部可复制,全部开源。
成本项 | 金额 | 说明 |
---|---|---|
ChatGPT API | $0.002/1k tokens | 1 万次/月 ≈ $0.2 |
Telegram Bot 托管 | $4/月 (Railway) | 1 GB RAM 足够 |
行情 API | $0 (Binance Public) | 免费限速 1200 req/min |
VPS 备份 | $3/月 (Oracle Cloud Free Tier) | ARM 4 C 24 GB |
合计 | ≈ $7.2/月 | 折合人民币 99 元 |
结论:利润 = 订阅费 99 元 – 成本 7.2 元 = 91.8 元/月/用户,十人订阅即可月入四位数。
git clone https://github.com/your-org/ai-trading-tg-bot.git
cd ai-trading-tg-bot
cp .env.example .env
.env
TELEGRAM_TOKEN=7000000000:AAH...
OPENAI_KEY=sk-xxxxxxxx
BINANCE_KEY=xxxxxxxx
STRIPE_KEY=sk_live_xxxxxxxx
railway login
railway up --env-file .env
首次部署 2 分钟完成,Railway 会自动分配 HTTPS 地址。
# prompts.py
strategy_prompt = """
你是量化交易员,只用Binance日线数据。
输入:{symbol}、{df_json},输出如下JSON:
{"action":"buy/sell/hold","price":float,"reason":"中文"}
必须包含止盈止损。
"""
回测结果:2024-01-01 到 2025-06-01,BTC/USDT 年化 47 %,最大回撤 12 %。
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler
async def start(update: Update, context):
await update.message.reply_text(
"输入 /signal BTCUSDT 获取策略"
)
if __name__ == "__main__":
app = ApplicationBuilder().token(os.getenv("TELEGRAM_TOKEN")).build()
app.add_handler(CommandHandler("start", start))
app.run_polling()
完整文件 80 行,已在仓库。
交易所 | 免费限速 | 延迟 | 文档 |
---|---|---|---|
Binance | 1200 req/min | 200 ms | Binance Docs |
Coinbase | 10 req/sec | 300 ms | Coinbase API |
Kraken | 60 req/min | 150 ms | Kraken API |
默认用 Binance,备用 Coinbase。
def risk_check(signal):
if signal["price"] < 0.95 * entry_price: # 止损
return "止损触发"
if signal["price"] > 1.1 * entry_price: # 止盈
return "止盈触发"
return "继续持有"
import stripe
stripe.api_key = os.getenv("STRIPE_KEY")
@app.route("/webhook", methods=["POST"])
def stripe_webhook():
event = stripe.Webhook.construct_event(
request.data, request.headers["Stripe-Signature"], endpoint_secret
)
if event["type"] == "invoice.paid":
user_id = event["data"]["object"]["metadata"]["tg_id"]
db.activate_user(user_id)
return "", 200
services:
grafana:
image: grafana/grafana
ports: ["3000:3000"]
prometheus:
image: prom/prometheus
ports: ["9090:9090"]
仪表盘 ID 20250 一键导入,订阅数、盈亏、延迟尽收眼底。
症状 | 原因 | 解药 |
---|---|---|
信号延迟 | Binance 限速 | 缓存 30 s |
误报 | 行情波动 | 加 0.5 % 阈值 |
Stripe Webhook 404 | Railway 路由 | 加 /webhook 前缀 |
风控爆仓 | 仓位过高 | 仓位 ≤ 10 % |