hyper_agent_core/services/
order.rs1use std::sync::Arc;
2
3use crate::account_state_ext::account_state_from_paper;
4use crate::config::AppConfig;
5use crate::error::{HyperAgentError, Result};
6use crate::executor::{DryRunExecutor, OrderResult, OrderSubmitter, PaperExecutor};
7use crate::pipeline::{OrderPipeline, PipelineContext, TradingMode};
8use crate::pipeline_stages::*;
9use crate::position_manager::PositionManager;
10use crate::signal::{Side, SignalAction, TradeSignal};
11
12pub struct PlaceOrderParams {
13 pub market: String,
14 pub side: Side,
15 pub size: f64,
16 pub price: Option<f64>,
17}
18
19pub async fn place_order(
20 params: PlaceOrderParams,
21 mode: TradingMode,
22 pm: Arc<PositionManager>,
23 config: Arc<AppConfig>,
24 live_executor: Option<Arc<dyn OrderSubmitter>>,
25) -> Result<OrderResult> {
26 let signal = TradeSignal::manual(
27 params.market.clone(),
28 SignalAction::Open {
29 side: params.side,
30 size: params.size,
31 price: params.price,
32 },
33 "order placement".into(),
34 );
35
36 let paper = Arc::new(PaperExecutor::new(Arc::clone(&pm)));
37 let dry_run = Arc::new(DryRunExecutor);
38 let pipeline = OrderPipeline::new(vec![
39 Box::new(RiskGuardStage::new()),
40 Box::new(OrderRouterStage::new(paper, live_executor, dry_run)),
41 Box::new(NotifierStage::noop()),
42 Box::new(LoggerStage),
43 ]);
44
45 let account_state = account_state_from_paper(&pm).await;
46 let mut ctx = PipelineContext {
47 mode,
48 account_state,
49 position_manager: pm,
50 config,
51 execution_results: vec![],
52 };
53
54 pipeline.execute(signal, &mut ctx).await?;
55
56 ctx.execution_results
57 .pop()
58 .ok_or_else(|| HyperAgentError::ExecutionFailed("No execution result".into()))
59}