初始
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
币圈自动盯盘脚本 (复用股票框架)
|
||||
- 数据源: 币安公开接口 data-api.binance.vision (免key)
|
||||
- 每5分钟检查各币种现价,命中预警价则弹 macOS 通知
|
||||
- 7x24 运行(币圈无休)
|
||||
"""
|
||||
import subprocess
|
||||
import datetime
|
||||
import sys
|
||||
|
||||
# ===== 监控配置: 在下面加币种和预警价 =====
|
||||
# symbol 用币安格式 (BTCUSDT), alert 为你要监控的价位与提示
|
||||
WATCH = [
|
||||
{
|
||||
"symbol": "BTCUSDT", "name": "BTC",
|
||||
"alerts": [
|
||||
{"price": 80000, "tag": "突破", "tip": "站上8万,关注趋势延续"},
|
||||
{"price": 75000, "tag": "回调", "tip": "跌破7.5万,注意支撑"},
|
||||
],
|
||||
},
|
||||
{
|
||||
"symbol": "ETHUSDT", "name": "ETH",
|
||||
"alerts": [
|
||||
{"price": 4000, "tag": "突破", "tip": "站上4000,强势"},
|
||||
{"price": 3500, "tag": "回调", "tip": "跌破3500,减仓观察"},
|
||||
],
|
||||
},
|
||||
# 复制上面结构可继续添加, 例如:
|
||||
# {"symbol": "SOLUSDT", "name": "SOL",
|
||||
# "alerts": [{"price": 200, "tag": "突破", "tip": "SOL站上200"}]},
|
||||
]
|
||||
|
||||
ALERTED = set()
|
||||
|
||||
|
||||
def price_of(symbol):
|
||||
try:
|
||||
url = f"https://data-api.binance.vision/api/v3/ticker/24hr?symbol={symbol}"
|
||||
out = subprocess.run(
|
||||
["curl", "-s", "--max-time", "8", url],
|
||||
capture_output=True, text=True, timeout=12
|
||||
).stdout
|
||||
if '"lastPrice"' not in out:
|
||||
return None
|
||||
# 简单解析 lastPrice
|
||||
import json
|
||||
d = json.loads(out)
|
||||
return float(d["lastPrice"])
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
|
||||
def notify(title, msg):
|
||||
subprocess.run(["osascript", "-e",
|
||||
f'display notification "{msg}" with title "{title}" sound name "Glass"'])
|
||||
|
||||
|
||||
def main():
|
||||
today = datetime.date.today().isoformat()
|
||||
# 跨日重置
|
||||
if ALERTED and not any(k.endswith(today) for k in ALERTED):
|
||||
ALERTED.clear()
|
||||
|
||||
for c in WATCH:
|
||||
p = price_of(c["symbol"])
|
||||
if p is None:
|
||||
continue
|
||||
for a in c["alerts"]:
|
||||
key = f"{c['symbol']}_{a['price']}_{today}"
|
||||
hit = (p >= a["price"]) if a.get("above", True) else (p <= a["price"])
|
||||
# 默认 above=True: 价格>=预警价触发; 想做"跌破"提醒就设 above=False
|
||||
if "above" in a and a["above"] is False:
|
||||
hit = p <= a["price"]
|
||||
if hit and key not in ALERTED:
|
||||
ALERTED.add(key)
|
||||
notify(f"[币圈 {a['tag']}] {c['name']}",
|
||||
f"{c['name']} 现价 {p:.2f} USDT | {a['tip']}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user