use std::time::Duration;
use openpit::param::{AccountId, Asset, Fee, Pnl, Price, Quantity, Side, TradeAmount, Volume};
use openpit::pretrade::policies::{
OrderSizeAssetBarrier, OrderSizeBrokerBarrier, OrderSizeLimit, OrderSizeLimitPolicy,
OrderValidationPolicy, PnlBoundsBrokerBarrier, PnlBoundsKillSwitchPolicy, RateLimit,
RateLimitBrokerBarrier, RateLimitPolicy,
};
use openpit::{Engine, Instrument};
use openpit::{
ExecutionReportOperation, FinancialImpact, OrderOperation, WithExecutionReportOperation,
WithFinancialImpact,
};
#[test]
fn example_readme_quickstart() -> Result<(), Box<dyn std::error::Error>> {
let usd = Asset::new("USD")?;
type Report = WithExecutionReportOperation<WithFinancialImpact<()>>;
let builder = Engine::builder::<OrderOperation, Report, ()>().no_sync();
let pnl_policy = PnlBoundsKillSwitchPolicy::new(
[PnlBoundsBrokerBarrier {
settlement_asset: usd.clone(),
lower_bound: Some(Pnl::from_str("-1000")?),
upper_bound: None,
}],
[],
builder.storage_builder(),
)?;
let rate_limit_policy = RateLimitPolicy::new(
Some(RateLimitBrokerBarrier {
limit: RateLimit {
max_orders: 100,
window: Duration::from_secs(1),
},
}),
[],
[],
[],
builder.storage_builder(),
)?;
let size_policy = OrderSizeLimitPolicy::new(
Some(OrderSizeBrokerBarrier {
limit: OrderSizeLimit {
max_quantity: Quantity::from_str("500")?,
max_notional: Volume::from_str("100000")?,
},
}),
[OrderSizeAssetBarrier {
limit: OrderSizeLimit {
max_quantity: Quantity::from_str("500")?,
max_notional: Volume::from_str("100000")?,
},
settlement_asset: usd.clone(),
}],
[],
)?;
let engine = builder
.pre_trade(OrderValidationPolicy::new())
.pre_trade(pnl_policy)
.pre_trade(rate_limit_policy)
.pre_trade(size_policy)
.build()?;
let order = OrderOperation {
instrument: Instrument::new(Asset::new("AAPL")?, usd.clone()),
account_id: AccountId::from_u64(99224416),
side: Side::Buy,
trade_amount: TradeAmount::Quantity(Quantity::from_f64(100.0)?),
price: Some(Price::from_str("185")?),
};
let request = engine.start_pre_trade(order)?;
let mut reservation = request.execute()?;
reservation.commit();
let report = WithExecutionReportOperation {
inner: WithFinancialImpact {
inner: (),
financial_impact: FinancialImpact {
pnl: Pnl::from_str("-50")?,
fee: Fee::from_str("3.4")?,
},
},
operation: ExecutionReportOperation {
instrument: Instrument::new(Asset::new("AAPL")?, usd),
account_id: AccountId::from_u64(99224416),
side: Side::Buy,
},
};
let result = engine.apply_execution_report(&report);
assert!(result.account_blocks.is_empty());
Ok(())
}