use std::time::Duration;
use openpit::param::{AccountId, Asset, Fee, Pnl, Price, Quantity, Side, TradeAmount, Volume};
use openpit::pretrade::policies::{
OrderSizeLimit, OrderSizeLimitPolicy, OrderValidationPolicy, PnlBoundsBarrier,
PnlBoundsKillSwitchPolicy, 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")?;
let pnl_policy = PnlBoundsKillSwitchPolicy::new(
PnlBoundsBarrier {
settlement_asset: usd.clone(),
lower_bound: Some(Pnl::from_str("-1000")?),
upper_bound: None,
initial_pnl: Pnl::ZERO,
},
[],
)?;
let rate_limit_policy = RateLimitPolicy::new(100, Duration::from_secs(1));
let size_policy = OrderSizeLimitPolicy::new(
OrderSizeLimit {
settlement_asset: usd.clone(),
max_quantity: Quantity::from_str("500")?,
max_notional: Volume::from_str("100000")?,
},
[],
);
type Report = WithExecutionReportOperation<WithFinancialImpact<()>>;
let engine = Engine::<OrderOperation, Report>::builder()
.check_pre_trade_start_policy(OrderValidationPolicy::new())
.check_pre_trade_start_policy(pnl_policy)
.check_pre_trade_start_policy(rate_limit_policy)
.check_pre_trade_start_policy(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.kill_switch_triggered);
Ok(())
}