use std::time::Duration;
use openpit::param::{AccountId, Asset, Fee, Pnl, Price, Quantity, Side, TradeAmount, Volume};
use openpit::pretrade::policies::{
OrderSizeAssetBarrier, OrderSizeBrokerBarrier, OrderSizeLimit, OrderSizeLimitPolicy,
OrderSizeLimitSettings, OrderValidationPolicy, PnlBoundsBrokerBarrier,
PnlBoundsKillSwitchPolicy, PnlBoundsKillSwitchSettings, RateLimit, RateLimitBrokerBarrier,
RateLimitPolicy, RateLimitPolicyError, RateLimitSettings,
};
use openpit::storage::NoLocking;
use openpit::{Engine, Instrument};
use openpit::{
ExecutionReportOperation, FinancialImpact, OrderOperation, WithExecutionReportOperation,
WithFinancialImpact,
};
#[test]
fn example_readme_configure_builtin_policy() -> Result<(), Box<dyn std::error::Error>> {
let builder = Engine::builder::<OrderOperation, (), ()>().no_sync();
let policy = RateLimitPolicy::new(
RateLimitSettings::new(
Some(RateLimitBrokerBarrier {
limit: RateLimit {
max_orders: 100,
window: Duration::from_secs(1),
},
}),
[],
[],
[],
)?,
builder.storage_builder(),
);
let engine = builder.pre_trade(policy).build()?;
engine.configure().rate_limit::<RateLimitPolicyError>(
RateLimitPolicy::<NoLocking>::NAME,
|settings| {
settings.set_broker(Some(RateLimitBrokerBarrier {
limit: RateLimit {
max_orders: 10,
window: Duration::from_secs(1),
},
}))
},
)?;
Ok(())
}
#[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(
PnlBoundsKillSwitchSettings::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(
RateLimitSettings::new(
Some(RateLimitBrokerBarrier {
limit: RateLimit {
max_orders: 100,
window: Duration::from_secs(1),
},
}),
[],
[],
[],
)?,
builder.storage_builder(),
);
let engine = builder
.pre_trade(OrderValidationPolicy::new())
.pre_trade(pnl_policy)
.pre_trade(rate_limit_policy)
.pre_trade(OrderSizeLimitPolicy::<NoLocking>::new(
OrderSizeLimitSettings::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(),
}],
[],
)?,
))
.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(())
}