Ezen az oldalon egy konkrét fájl aktuális állapotát tudod megnézni.
/opt/bots/saturnus/app/templates/exchange_detail.html{% extends "base.html" %}
{% block title %}Saturnus Bot – {{ (exchange or 'binance')|lower }}{% endblock %}
{% block header %}Saturnus Bot{% endblock %}
{% set _root = data if data is defined and data is not none else {} %}
{% set state = _root.get('state', _root) if _root is mapping else {} %}
{% set services = _root.get('services', {}) if _root is mapping else {} %}
{% set ft = _root.get('ft', {}) if _root is mapping else {} %}
{% set prices = (state.get('prices') or {}) %}
{% set market = (state.get('market') or {}) %}
{% set levels = (state.get('levels') or {}) %}
{% set decision = (state.get('decision') or {}) %}
{% set base = state.get('base') %}
{% set peak = state.get('peak') %}
{% set trough = state.get('trough') %}
{% set last = market.get('last') if market.get('last') is not none else state.get('last') %}
{% set prev_last = market.get('prev_last') if market.get('prev_last') is not none else state.get('prev_last') %}
{% set lowp = market.get('low') if market.get('low') is not none else prices.get('low') %}
{% set inpos = (state.get('in_position') if state.get('in_position') is not none else false) %}
{% block top_status %}
<div class="pill">
<span class="dot {{ 'good' if inpos else 'bad' }}"></span>
<span class="mono muted" id="top-position-pill">pozíció: {{ 'VAN' if inpos else 'NINCS' }}</span>
</div>
{% endblock %}
{% block content %}
<style>
.grid{display:grid;grid-template-columns:repeat(12,1fr);gap:14px;}
.card2{background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.08);border-radius:16px;padding:14px;}
.h{font-weight:800;margin-bottom:10px;}
.excel{width:100%;border-collapse:collapse;margin-top:6px;}
.excel td{padding:6px 8px;border-bottom:1px solid rgba(255,255,255,.08);vertical-align:top;}
.excel td:first-child{opacity:.75;width:320px;}
.dot{display:inline-block;width:10px;height:10px;border-radius:50%;vertical-align:middle;margin-right:8px;}
.dot.good{background:#37d67a;}
.dot.bad{background:#888;}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;}
.pill2{display:inline-block;padding:4px 10px;border-radius:999px;border:1px solid rgba(255,255,255,.12);background:rgba(255,255,255,.03);font-size:12px;}
.small-note{margin-top:10px;font-size:12px;opacity:.8;}
.controls{display:flex;flex-wrap:wrap;gap:10px;align-items:center;}
.btnline{display:flex;gap:8px;flex-wrap:wrap;}
button.svcbtn{
border-radius:12px;
border:1px solid rgba(255,255,255,.14);
background:rgba(255,255,255,.05);
color:#fff;
padding:8px 14px;
cursor:pointer;
font-weight:700;
}
button.svcbtn.start{border-color:rgba(55,214,122,.4);}
button.svcbtn.stop{border-color:rgba(255,107,107,.4);}
.statuspill{
display:inline-block;
padding:4px 10px;
border-radius:999px;
font-size:12px;
font-weight:700;
border:1px solid rgba(255,255,255,.14);
}
.statuspill.active{background:rgba(55,214,122,.10); border-color:rgba(55,214,122,.50);}
.statuspill.inactive{background:rgba(255,107,107,.10); border-color:rgba(255,107,107,.50);}
.statuspill.unknown{background:rgba(148,163,184,.10); border-color:rgba(148,163,184,.50);}
.inline-muted{opacity:.75;font-size:12px;}
.service-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;}
@media (max-width: 900px){ .service-grid{grid-template-columns:1fr;} }
</style>
{% macro fmt(v, digits=4) -%}
{%- if v is undefined or v is none -%}
—
{%- else -%}
{{ ("{0:." ~ digits ~ "f}").format(v|float) }}
{%- endif -%}
{%- endmacro %}
<div class="grid">
<div class="card2" style="grid-column:span 12;">
<div class="h">Szolgáltatásvezérlés</div>
<div class="service-grid">
<div class="card2">
<div class="h">Botmotor (runner)</div>
<div class="controls">
<span id="runner-active-pill" class="statuspill unknown">ismeretlen</span>
<span class="inline-muted mono" id="runner-enabled-text">enabled: —</span>
<span class="inline-muted mono" id="runner-substate-text">substate: —</span>
</div>
<div class="btnline" style="margin-top:12px;">
<button class="svcbtn start" onclick="controlService('runner','start')">Runner Start</button>
<button class="svcbtn stop" onclick="controlService('runner','stop')">Runner Stop</button>
</div>
</div>
<div class="card2">
<div class="h">Freqtrade</div>
<div class="controls">
<span id="freqtrade-active-pill" class="statuspill unknown">ismeretlen</span>
<span class="inline-muted mono" id="freqtrade-enabled-text">enabled: —</span>
<span class="inline-muted mono" id="freqtrade-substate-text">substate: —</span>
</div>
<div class="btnline" style="margin-top:12px;">
<button class="svcbtn start" onclick="controlService('freqtrade','start')">Freqtrade Start</button>
<button class="svcbtn stop" onclick="controlService('freqtrade','stop')">Freqtrade Stop</button>
</div>
</div>
</div>
<div class="btnline" style="margin-top:14px;">
<button class="svcbtn start" onclick="controlService('all','start')">Összes indítás</button>
<button class="svcbtn stop" onclick="controlService('all','stop')">Összes leállítás</button>
</div>
<div class="small-note mono" id="service-control-status">Várakozás...</div>
</div>