Skip to content

ru Getting Started

Eugene Palchukovsky edited this page Mar 9, 2026 · 1 revision

Начало работы

Эта страница показывает минимальное полезное встраивание openpit в Rust и объясняет границу ответственности между SDK и хостовой торговой системой.

1. Добавьте зависимость

[dependencies]
openpit = "0.1.0"

2. Сконфигурируйте движок

Собирайте движок один раз на этапе инициализации платформы. Политики выполняются в порядке регистрации.

В примере ниже используется инструмент 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");

3. Проверьте ордер

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()

4. Верните результат исполнения обратно в движок

Когда результат исполнения известен, передайте реализованный 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 самостоятельно.

Связанные страницы

Clone this wiki locally