-
Notifications
You must be signed in to change notification settings - Fork 1
ru Getting Started
Eugene Palchukovsky edited this page Mar 9, 2026
·
1 revision
Эта страница показывает минимальное полезное встраивание openpit в Rust и
объясняет границу ответственности между SDK и хостовой торговой системой.
[dependencies]
openpit = "0.1.0"Собирайте движок один раз на этапе инициализации платформы. Политики выполняются в порядке регистрации.
В примере ниже используется инструмент AAPL с расчётом в USD. Расчётный
актив важен потому, что барьеры по P&L, комиссии и лимиты по номиналу
выражаются именно в нём.
use std::time::Duration;
use openpit::param::{Asset, Pnl, Price, Quantity, Side, Volume};
use openpit::pretrade::policies::{OrderSizeLimit, OrderSizeLimitPolicy};
use openpit::pretrade::policies::OrderValidationPolicy;
use openpit::pretrade::policies::PnlKillSwitchPolicy;
use openpit::pretrade::policies::RateLimitPolicy;
use openpit::pretrade::ExecutionReport;
use openpit::{Engine, Instrument, Order};
let usd = Asset::new("USD").expect("asset code must be valid");
let pnl = PnlKillSwitchPolicy::new(
(usd.clone(), Pnl::from_str("1000").expect("valid literal")),
[],
);
// Остановить торговлю USD-инструментами после 1000 реализованного убытка.
let rate = RateLimitPolicy::new(100, Duration::from_secs(1));
let size = OrderSizeLimitPolicy::new(
OrderSizeLimit {
settlement_asset: usd.clone(),
max_quantity: Quantity::from_str("500").expect("valid literal"),
max_notional: Volume::from_str("100000").expect("valid literal"),
},
[],
);
let engine = Engine::builder()
.check_pre_trade_start_policy(OrderValidationPolicy::new())
.check_pre_trade_start_policy(pnl)
.check_pre_trade_start_policy(rate)
.check_pre_trade_start_policy(size)
.build()
.expect("engine config must be valid");let order = Order {
instrument: Instrument::new(
Asset::new("AAPL").expect("asset code must be valid"),
usd.clone(),
),
side: Side::Buy,
quantity: Quantity::from_str("100").expect("valid literal"),
price: Price::from_str("185").expect("valid literal"),
};
let request = match engine.start_pre_trade(order) {
Ok(request) => request,
Err(reject) => {
eprintln!(
"rejected by {} [{} / {:?}]: {} ({})",
reject.policy, reject.code, reject.scope, reject.reason, reject.details
);
return;
}
};
let reservation = match request.execute() {
Ok(reservation) => reservation,
Err(rejects) => {
for reject in &rejects {
eprintln!(
"rejected by {} [{} / {:?}]: {} ({})",
reject.policy, reject.code, reject.scope, reject.reason, reject.details
);
}
return;
}
};
// Хостовая система сама решает, когда резервация становится реальным
// состоянием.
reservation.commit(); // или rollback()Когда результат исполнения известен, передайте реализованный outcome обратно в движок, чтобы накопительные политики обновили своё состояние.
use openpit::param::Fee;
let report = ExecutionReport {
instrument: Instrument::new(
Asset::new("AAPL").expect("asset code must be valid"),
usd,
),
pnl: Pnl::from_str("-50").expect("valid literal"),
fee: Fee::from_str("3").expect("valid literal"),
};
let result = engine.apply_execution_report(&report);
if result.kill_switch_triggered {
eprintln!("kill switch triggered; halt further trading");
}- Движок работает в памяти. Персистентность позиций, балансов и состояния резерваций принадлежит вызывающей стороне.
-
Engineне потокобезопасен. При совместном использовании между потоками нужна внешняя синхронизация. -
ExecutionReportнесёт только реализованный результат. Pit не считает P&L из fill-событий или market data самостоятельно.
- Архитектура — модель движка и структура крейтов
- Пайплайн pre-trade — жизненный цикл запроса
- Политики — поведение встроенных контролей