Signal execution

This commit is contained in:
2026-08-02 00:51:12 +02:00
parent 05cf081339
commit f9f218ad80
2 changed files with 88 additions and 109 deletions
+87 -105
View File
@@ -6,121 +6,103 @@ use pulse_sdk::prelude::*;
use crate::engine::Engine; use crate::engine::Engine;
impl Engine { impl Engine {
pub async fn execute_signal(&self, signal: &Signal) -> tokio::io::Result<()> { pub async fn execute_signal(&self, signal: &Signal) -> anyhow::Result<()> {
let client = hypercore::mainnet(); let client = hypercore::mainnet();
let accounts = self.accounts.lock().await; let accounts = self.accounts.lock().await;
if let Some(acc) = accounts.get_active() { let acc = accounts
let Some(asset_id) = self .get_active()
.watch_list .ok_or_else(|| anyhow::anyhow!("Unable to get active account"))?;
.lock()
.await
.name_to_index
.get(&signal.symbol)
.cloned()
else {
self.terminal_server
.error(
"self::order",
&format!(
"Invalid Symbol: {:?}, Unable to get asset id",
signal.symbol
),
)
.await?;
return Ok(()); let Some(asset_id) = self
}; .watch_list
.lock()
.await
.name_to_index
.get(&signal.symbol)
.cloned()
else {
return Err(anyhow::anyhow!(
"Invalid Symbol: {:?}, Unable to get asset id",
signal.symbol
));
};
let order_ids = self.risk_engine.create_order(signal).await?; let engine_order = self.risk_engine.create_order(signal).await?;
println!("{order_ids:?}"); let order = BatchOrder {
orders: vec![
OrderRequest {
asset: asset_id,
is_buy: matches!(signal.side, Side::Bid),
limit_px: signal.entry_price,
sz: engine_order.size,
reduce_only: false,
order_type: OrderTypePlacement::Limit {
tif: TimeInForce::Gtc,
},
cloid: engine_order.entry,
},
OrderRequest {
asset: asset_id,
is_buy: matches!(signal.side, Side::Bid),
limit_px: signal.entry_price,
sz: engine_order.size,
reduce_only: true,
order_type: OrderTypePlacement::Trigger {
is_market: true,
trigger_px: signal.take_profit,
tpsl: hypercore::TpSl::Tp,
},
cloid: engine_order.take_profit,
},
OrderRequest {
asset: asset_id,
is_buy: matches!(signal.side, Side::Bid),
limit_px: signal.entry_price,
sz: engine_order.size,
reduce_only: true,
order_type: OrderTypePlacement::Trigger {
is_market: true,
trigger_px: signal.stop_loss,
tpsl: hypercore::TpSl::Sl,
},
cloid: engine_order.stop_loss,
},
],
grouping: hypercore::OrderGrouping::Na,
builder: None,
};
// let order = BatchOrder { let nonce = chrono::Utc::now().timestamp_millis() as u64;
// orders: vec![
// OrderRequest {
// asset: asset_id,
// is_buy: matches!(signal.side, Side::Bid),
// limit_px: signal.entry_price,
// sz: 0.into(),
// reduce_only: false,
// order_type: OrderTypePlacement::Limit {
// tif: TimeInForce::Gtc,
// },
// cloid: order_ids.entry,
// },
// OrderRequest {
// asset: asset_id,
// is_buy: matches!(signal.side, Side::Bid),
// limit_px: signal.entry_price,
// sz: 0.into(),
// reduce_only: true,
// order_type: OrderTypePlacement::Trigger {
// is_market: true,
// trigger_px: signal.take_profit,
// tpsl: hypercore::TpSl::Tp,
// },
// cloid: order_ids.take_profit,
// },
// OrderRequest {
// asset: asset_id,
// is_buy: matches!(signal.side, Side::Bid),
// limit_px: signal.entry_price,
// sz: 0.into(),
// reduce_only: true,
// order_type: OrderTypePlacement::Trigger {
// is_market: true,
// trigger_px: signal.stop_loss,
// tpsl: hypercore::TpSl::Sl,
// },
// cloid: order_ids.stop_loss,
// },
// ],
// grouping: hypercore::OrderGrouping::Na,
// builder: None,
// };
// let nonce = chrono::Utc::now().timestamp_millis() as u64; match client
.place(&acc.private_key.0, order, nonce, None, None)
.await
{
Ok(o) if o.iter().any(|o| matches!(o, OrderResponseStatus::Error(_))) => {
self.risk_engine.order_placed(engine_order).await;
}
// match client Ok(e) => {
// .place(&acc.private_key.0, order, nonce, None, None) return Err(anyhow::anyhow!(
// .await "order rejected: {}",
// { e.into_iter()
// Ok(o) if o.iter().any(|o| matches!(o, OrderResponseStatus::Error(_))) => { .filter_map(|res| {
// self.risk_engine.order_placed(order_ids).await; if let OrderResponseStatus::Error(e) = res {
// } Some(e)
} else {
None
}
})
.collect::<Vec<_>>()
.join(", ")
));
}
// Ok(e) => { e => {
// self.terminal_server e?;
// .error( }
// "self::order",
// &format!(
// "order rejected: {}",
// e.into_iter()
// .filter_map(|res| {
// if let OrderResponseStatus::Error(e) = res {
// Some(e)
// } else {
// None
// }
// })
// .collect::<Vec<_>>()
// .join(", ")
// ),
// )
// .await?;
// }
// Err(e) => {
// self.terminal_server
// .error("self::order", &e.to_string())
// .await?;
// }
// }
} else {
self.terminal_server
.error("Engine::order", "Unable to get active account")
.await?;
} }
Ok(()) Ok(())
+1 -4
View File
@@ -169,10 +169,7 @@ impl StrategyEngine {
engine engine
.terminal_server .terminal_server
.error( .error("engine::order", &format!("Failed to execute signal: {e}"))
"engine::strategy",
&format!("Failed to execute signal: {e}"),
)
.await? .await?
} }
} }