修复web前端,增加openai
This commit is contained in:
@@ -100,8 +100,11 @@ WECHAT_TIMEOUT_SECONDS=10
|
||||
AI_TIMEOUT_SECONDS=120
|
||||
|
||||
# AI 复盘服务地址(本机 Ollama 默认地址)
|
||||
AI_PROVIDER=openai
|
||||
OPENAI_API_BASE=https://op.bz121.com/v1
|
||||
OPENAI_API_KEY=你的密钥
|
||||
OPENAI_MODEL=gemma4:e4b
|
||||
OLLAMA_API=http://127.0.0.1:11434/api/generate
|
||||
# AI 模型名称
|
||||
AI_MODEL=huihui_ai/deepseek-r1-abliterated:latest
|
||||
|
||||
# OKX 代理(可选):用于本机网络对 OKX TLS/SNI 不稳定时,通过 SSH 动态转发 SOCKS5 出口
|
||||
|
||||
+19
-66
@@ -34,6 +34,7 @@ import sys
|
||||
|
||||
if _REPO_ROOT not in sys.path:
|
||||
sys.path.insert(0, _REPO_ROOT)
|
||||
from ai_client import ai_generate, ai_review, ai_short_advice
|
||||
from fib_key_monitor_lib import (
|
||||
FIB_KEY_MONITOR_TYPES,
|
||||
calc_fib_plan,
|
||||
@@ -190,8 +191,6 @@ KEY_SIZING_USE_ZERO_POSITION_SNAPSHOT = os.getenv("KEY_SIZING_USE_ZERO_POSITION_
|
||||
"on",
|
||||
)
|
||||
DEFAULT_TRADE_STYLE = (os.getenv("DEFAULT_TRADE_STYLE", "trend") or "trend").strip().lower()
|
||||
OLLAMA_API = os.getenv("OLLAMA_API", "http://127.0.0.1:11434/api/generate")
|
||||
AI_MODEL = os.getenv("AI_MODEL", "huihui_ai/deepseek-r1-abliterated:latest")
|
||||
|
||||
OKX_SOCKS_PROXY = (os.getenv("OKX_SOCKS_PROXY") or "").strip()
|
||||
OKX_HTTP_PROXY = (os.getenv("OKX_HTTP_PROXY") or "").strip()
|
||||
@@ -441,51 +440,6 @@ def _extract_json_object(text):
|
||||
return None
|
||||
|
||||
|
||||
def ai_review(trades_text, period_title, image_paths=None):
|
||||
prompt = f"""
|
||||
你是一位专业交易教练。下面是用户的{period_title}交易记录,请做专业、简洁、可执行的复盘:
|
||||
1. 总体盈亏结构
|
||||
2. 心态问题与执行漏洞(请给每笔交易一个1-10的心态分并简短说明)
|
||||
3. 提前离场、乱开仓、扛单等行为分析
|
||||
4. 给出具体改进建议(最多3条)
|
||||
5. 若附带截图,请结合图中价格行为、结构、进出场位置一起分析(看不清时请明确说明不确定)
|
||||
交易记录:
|
||||
{trades_text}
|
||||
用中文输出,直接给结论与建议。
|
||||
""".strip()
|
||||
payload = {"model": AI_MODEL, "prompt": prompt, "stream": False, "options": {"temperature": 0.3}}
|
||||
images = []
|
||||
for p in image_paths or []:
|
||||
b64 = _read_image_base64(p)
|
||||
if b64:
|
||||
images.append(b64)
|
||||
if images:
|
||||
payload["images"] = images
|
||||
try:
|
||||
r = requests.post(OLLAMA_API, json=payload, timeout=AI_TIMEOUT_SECONDS)
|
||||
return r.json().get("response", "AI 生成失败")
|
||||
except Exception as e:
|
||||
return f"AI 调用失败:{str(e)}"
|
||||
|
||||
|
||||
def ai_short_advice(prompt_text):
|
||||
prompt = f"""
|
||||
你是交易风控助理。请用中文给出**最多 3 条**提醒,要求:
|
||||
- 每条不超过 25 个字
|
||||
- 语气克制、具体、可执行
|
||||
- 不要输出 Markdown,不要编号前缀以外的废话
|
||||
|
||||
场景:
|
||||
{prompt_text}
|
||||
""".strip()
|
||||
payload = {"model": AI_MODEL, "prompt": prompt, "stream": False, "options": {"temperature": 0.2}}
|
||||
try:
|
||||
r = requests.post(OLLAMA_API, json=payload, timeout=AI_TIMEOUT_SECONDS)
|
||||
return (r.json().get("response") or "").strip()
|
||||
except Exception:
|
||||
return ""
|
||||
|
||||
|
||||
def _load_font(size):
|
||||
if not ImageFont:
|
||||
return None
|
||||
@@ -985,16 +939,10 @@ JSON 字段:
|
||||
"note": ""
|
||||
}
|
||||
""".strip()
|
||||
payload = {
|
||||
"model": AI_MODEL,
|
||||
"prompt": prompt,
|
||||
"images": [image_b64],
|
||||
"stream": False,
|
||||
"options": {"temperature": 0.1},
|
||||
}
|
||||
try:
|
||||
r = requests.post(OLLAMA_API, json=payload, timeout=AI_TIMEOUT_SECONDS)
|
||||
raw = r.json().get("response", "")
|
||||
raw = ai_generate(prompt, images_b64=[image_b64], temperature=0.1)
|
||||
if raw.startswith("AI 调用失败"):
|
||||
return {}
|
||||
data = _extract_json_object(raw) or {}
|
||||
if not isinstance(data, dict):
|
||||
data = {}
|
||||
@@ -4235,18 +4183,16 @@ def render_main_page(page="trade"):
|
||||
f"斐波:添加后立即挂限价 @ E,失效按标记价触达 H/L(未成交撤单)"
|
||||
)
|
||||
strategy_extra = {}
|
||||
if page in ("strategy_trend", "strategy_roll"):
|
||||
if page in ("strategy", "strategy_trend", "strategy_roll"):
|
||||
from strategy_ui import strategy_page_template_vars
|
||||
|
||||
strategy_extra = strategy_page_template_vars(
|
||||
conn, page, default_risk_percent=float(RISK_PERCENT)
|
||||
conn,
|
||||
"strategy",
|
||||
default_risk_percent=float(RISK_PERCENT),
|
||||
request_obj=request,
|
||||
trend_cfg=app.extensions.get("strategy_trend_cfg"),
|
||||
)
|
||||
if page == "strategy_trend":
|
||||
cfg = app.extensions.get("strategy_trend_cfg")
|
||||
if cfg:
|
||||
from strategy_trend_register import load_trend_page_context
|
||||
|
||||
strategy_extra.update(load_trend_page_context(conn, request, cfg))
|
||||
conn.close()
|
||||
return render_template(
|
||||
"index.html",
|
||||
@@ -6006,16 +5952,23 @@ except Exception as _hub_err:
|
||||
print(f"[hub_bridge] okx: {_hub_err}")
|
||||
|
||||
|
||||
@app.route("/strategy")
|
||||
@login_required
|
||||
def strategy_trading_page():
|
||||
return render_main_page("strategy")
|
||||
|
||||
|
||||
@app.route("/strategy/trend")
|
||||
@login_required
|
||||
def strategy_trend_page():
|
||||
return render_main_page("strategy_trend")
|
||||
qs = request.query_string.decode()
|
||||
return redirect(f"/strategy?{qs}" if qs else "/strategy")
|
||||
|
||||
|
||||
@app.route("/strategy/roll")
|
||||
@login_required
|
||||
def strategy_roll_page():
|
||||
return render_main_page("strategy_roll")
|
||||
return redirect("/strategy")
|
||||
|
||||
|
||||
from strategy_register import install_strategy_trading
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
<div class="header"><h1>加密货币|交易监控 + AI复盘一体化</h1></div>
|
||||
<div class="top-nav">
|
||||
<a href="/trade" class="{% if page == 'trade' %}active{% endif %}">交易执行</a>
|
||||
<a href="/strategy/trend" class="{% if page in ('strategy_trend', 'strategy_roll') %}active{% endif %}">策略交易</a>
|
||||
<a href="/strategy" class="{% if page in ('strategy', 'strategy_trend', 'strategy_roll') %}active{% endif %}">策略交易</a>
|
||||
<a href="/records" class="{% if page == 'records' %}active{% endif %}">交易记录与复盘</a>
|
||||
<a href="/stats" class="{% if page == 'stats' %}active{% endif %}">统计分析</a>
|
||||
</div>
|
||||
@@ -352,10 +352,8 @@
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% elif page == 'strategy_trend' %}
|
||||
{% include 'strategy_trend_panel.html' %}
|
||||
{% elif page == 'strategy_roll' %}
|
||||
{% include 'strategy_roll_panel.html' %}
|
||||
{% elif page in ('strategy', 'strategy_trend', 'strategy_roll') %}
|
||||
{% include 'strategy_trading_page.html' %}
|
||||
{% endif %}
|
||||
|
||||
{% if page == 'records' %}
|
||||
|
||||
Reference in New Issue
Block a user