Skip to main content

hyper_agent_core/services/
order.rs

1use 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}