Engine config status

This commit is contained in:
2026-07-31 04:44:47 +02:00
parent 405dbdda2e
commit b0e95dfca4
7 changed files with 63 additions and 79 deletions
+7 -18
View File
@@ -1,7 +1,8 @@
use crate::{ use crate::{
general::{EventLog, ItemState, Mode, Position, Signal}, strategy::StrategyManifest, general::{EngineStatus, EventLog, Position, Signal},
strategy::StrategyManifest,
}; };
use hypersdk::{Decimal, hypercore::CandleInterval}; use hypersdk::Decimal;
pub type SignalStatus = Result<Signal, Signal>; pub type SignalStatus = Result<Signal, Signal>;
@@ -13,8 +14,8 @@ pub enum TerminalServerMessage {
// Positions // Positions
PositionsUpdated(Vec<Position>), PositionsUpdated(Vec<Position>),
// Strategy // Configuration
StrategyUpdated(StrategyStatus), ConfigUpdated(EngineConfig),
// Signals // Signals
SignalsUpdated(Vec<SignalStatus>), SignalsUpdated(Vec<SignalStatus>),
@@ -23,7 +24,7 @@ pub enum TerminalServerMessage {
Inspect(InspectTarget), Inspect(InspectTarget),
// Status // Status
StatusUpdated(Status), StatusUpdated(EngineStatus),
// Logs // Logs
SetLogs(Vec<EventLog>), SetLogs(Vec<EventLog>),
@@ -58,18 +59,6 @@ pub enum InspectItem {
} }
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct Status { pub struct EngineConfig {
pub feed: Mode,
pub exchange: String,
pub dex: String,
pub latency: u16,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct StrategyStatus {
pub strategy: StrategyManifest, pub strategy: StrategyManifest,
pub mode: Mode,
pub state: ItemState,
pub cooldown: CandleInterval,
} }
+18 -11
View File
@@ -49,6 +49,12 @@ impl Engine {
self.terminal_server self.terminal_server
.info("config::set", "watchlist set successfully, use `config save` to persist changes") .info("config::set", "watchlist set successfully, use `config save` to persist changes")
.await?; .await?;
self.terminal_server
.broadcast(TerminalServerMessage::ConfigUpdated(
self.get_config_status().await,
))
.await?;
} }
"strategy" | "strat" | "sg" => { "strategy" | "strat" | "sg" => {
@@ -75,23 +81,24 @@ impl Engine {
self.terminal_server self.terminal_server
.info("config::set", "strategy set successfully, use `config save` to persist changes") .info("config::set", "strategy set successfully, use `config save` to persist changes")
.await?; .await?;
self.terminal_server
.broadcast(TerminalServerMessage::ConfigUpdated(
self.get_config_status().await,
))
.await?;
} }
"cooldown" | "cool" | "cd" => { "cooldown" | "cool" | "cd" => {
set_cfg!(cooldown, { set_cfg!(cooldown, {
self.config.lock().await.cooldown = cooldown; self.config.lock().await.cooldown = cooldown;
self.terminal_server.broadcast(
pulse_sdk::terminal::TerminalServerMessage::StrategyUpdated(StrategyStatus {
strategy: self.strategy_engine.strategy.lock().await.manifest.clone(),
mode: Mode::Auto,
state: ItemState::Running,
cooldown,
}),
)
.await?;
}); });
self.terminal_server
.broadcast(TerminalServerMessage::ConfigUpdated(
self.get_config_status().await,
))
.await?;
} }
_ => { _ => {
+6
View File
@@ -86,4 +86,10 @@ impl Engine {
.await?; .await?;
} }
} }
pub async fn get_config_status(&self) -> EngineConfig {
EngineConfig {
strategy: self.strategy_engine.strategy.lock().await.manifest.clone(),
}
}
} }
+1 -12
View File
@@ -71,18 +71,7 @@ impl TerminalServer {
self.send_to( self.send_to(
id, id,
pulse_sdk::terminal::TerminalServerMessage::StrategyUpdated(StrategyStatus { TerminalServerMessage::ConfigUpdated(engine.get_config_status().await),
strategy: engine
.strategy_engine
.strategy
.lock()
.await
.manifest
.clone(),
mode: Mode::Auto,
state: ItemState::Running,
cooldown: engine.config.lock().await.cooldown,
}),
) )
.await?; .await?;
+22 -28
View File
@@ -114,28 +114,8 @@ impl Formatted for Position {
} }
} }
struct Pair<'a>(&'a str, &'a str);
struct Triple<'a>(&'a str, &'a str, &'a str); struct Triple<'a>(&'a str, &'a str, &'a str);
impl Formatted for Status {
fn get_formatted(&self) -> Vec<String> {
vec![
Pair("Feed", &format!("{:?}", self.feed)),
Pair("Exchange", &self.exchange.clone()),
Pair("DEX", &self.dex.clone()),
Pair("Latency", &format!("{} ms", self.latency)),
]
.get_formatted()
}
}
impl<'a> Formatted for Pair<'a> {
fn get_formatted(&self) -> Vec<String> {
vec![self.0.to_string(), self.1.to_string()]
}
}
impl<'a> Formatted for Triple<'a> { impl<'a> Formatted for Triple<'a> {
fn get_formatted(&self) -> Vec<String> { fn get_formatted(&self) -> Vec<String> {
vec![self.0.to_string(), self.1.to_string(), self.2.to_string()] vec![self.0.to_string(), self.1.to_string(), self.2.to_string()]
@@ -206,19 +186,33 @@ impl<T: Formatted> Formatted for Vec<T> {
} }
} }
impl Formatted for StrategyStatus { impl Formatted for EngineStatus {
fn get_formatted(&self) -> Vec<String> {
vec![
Triple(
"\x1b[2mState\x1b[0m",
"\x1b[2mMode\x1b[0m",
"\x1b[2m..\x1b[0m",
),
Triple(
&self.strategy_state.to_string(),
&self.strategy_mode.to_string(),
"..",
),
]
.get_formatted()
}
}
impl Formatted for EngineConfig {
fn get_formatted(&self) -> Vec<String> { fn get_formatted(&self) -> Vec<String> {
vec![ vec![
Triple( Triple(
"\x1b[2mStrategy\x1b[0m", "\x1b[2mStrategy\x1b[0m",
"\x1b[2mState\x1b[0m", "\x1b[2m..\x1b[0m",
"\x1b[2mMode\x1b[0m", "\x1b[2m..\x1b[0m",
),
Triple(
&format!("\x1b[97m{}\x1b[0m", self.strategy.name),
&self.state.to_string(),
&self.mode.to_string(),
), ),
Triple(&self.strategy.name, "..", ".."),
] ]
.get_formatted() .get_formatted()
} }
+4 -5
View File
@@ -29,8 +29,8 @@ pub struct PulseTradeApp {
command: State<InputState>, command: State<InputState>,
scroll: State<ScrollState<7>>, scroll: State<ScrollState<7>>,
strategy: State<Option<StrategyStatus>>, config: State<Option<EngineConfig>>,
status: State<Option<Status>>, status: State<Option<EngineStatus>>,
watch_list: State<Vec<MarketItem>>, watch_list: State<Vec<MarketItem>>,
active_positions: State<Vec<Position>>, active_positions: State<Vec<Position>>,
@@ -144,8 +144,7 @@ impl App for PulseTradeApp {
( (
LayoutItem::Widget(Size::Flex(1)), LayoutItem::Widget(Size::Flex(1)),
Box::new( Box::new(
advanced_option_draw(&self.scroll, 3, "CONFIGURATION", &self.strategy) advanced_option_draw(&self.scroll, 3, "CONFIGURATION", &self.config).await,
.await,
), ),
), ),
( (
@@ -182,7 +181,7 @@ async fn main() -> tokio::io::Result<()> {
signals: ctx.use_state(Vec::new()), signals: ctx.use_state(Vec::new()),
logs: ctx.use_state(Vec::new()), logs: ctx.use_state(Vec::new()),
inspect: ctx.use_state(InspectTarget::None), inspect: ctx.use_state(InspectTarget::None),
strategy: ctx.use_state(None), config: ctx.use_state(None),
status: ctx.use_state(None), status: ctx.use_state(None),
}) })
}) })
+5 -5
View File
@@ -49,7 +49,7 @@ impl TerminalClient {
let active_positions = app.active_positions.clone(); let active_positions = app.active_positions.clone();
let logs = app.logs.clone(); let logs = app.logs.clone();
let signals = app.signals.clone(); let signals = app.signals.clone();
let market_overview = app.strategy.clone(); let market_overview = app.config.clone();
let status = app.status.clone(); let status = app.status.clone();
let inspect = app.inspect.clone(); let inspect = app.inspect.clone();
@@ -82,8 +82,8 @@ impl TerminalClient {
active_positions: State<Vec<Position>>, active_positions: State<Vec<Position>>,
logs: State<Vec<EventLog>>, logs: State<Vec<EventLog>>,
signals: State<Vec<SignalStatus>>, signals: State<Vec<SignalStatus>>,
market_overview: State<Option<StrategyStatus>>, config: State<Option<EngineConfig>>,
status: State<Option<Status>>, status: State<Option<EngineStatus>>,
inspect: State<InspectTarget>, inspect: State<InspectTarget>,
) -> tokio::io::Result<()> { ) -> tokio::io::Result<()> {
loop { loop {
@@ -111,8 +111,8 @@ impl TerminalClient {
*active_positions.lock().await = v; *active_positions.lock().await = v;
} }
TerminalServerMessage::StrategyUpdated(v) => { TerminalServerMessage::ConfigUpdated(v) => {
*market_overview.lock().await = Some(v); *config.lock().await = Some(v);
} }
TerminalServerMessage::SignalsUpdated(v) => { TerminalServerMessage::SignalsUpdated(v) => {