ibapi 5.3.0

An unofficial Rust client for the Interactive Brokers TWS API: market data, orders, and account data, with async (Tokio) and blocking clients for TWS and IB Gateway.
Documentation
use super::super::{Contract, SecurityType};
use crate::messages::OutgoingMessages;
use crate::Error;

pub(crate) fn encode_request_contract_data(request_id: i32, contract: &Contract) -> Result<Vec<u8>, Error> {
    use crate::messages::encode_protobuf_message;
    use prost::Message;
    let request = crate::proto::ContractDataRequest {
        req_id: Some(request_id),
        contract: Some(crate::proto::encoders::encode_contract(contract)),
    };
    Ok(encode_protobuf_message(
        OutgoingMessages::RequestContractData as i32,
        &request.encode_to_vec(),
    ))
}

pub(crate) fn encode_request_matching_symbols(request_id: i32, pattern: &str) -> Result<Vec<u8>, Error> {
    use crate::messages::encode_protobuf_message;
    use prost::Message;
    let request = crate::proto::MatchingSymbolsRequest {
        req_id: Some(request_id),
        pattern: Some(pattern.to_string()),
    };
    Ok(encode_protobuf_message(
        OutgoingMessages::RequestMatchingSymbols as i32,
        &request.encode_to_vec(),
    ))
}

pub(crate) fn encode_request_market_rule(market_rule_id: i32) -> Result<Vec<u8>, Error> {
    use crate::messages::encode_protobuf_message;
    use prost::Message;
    let request = crate::proto::MarketRuleRequest {
        market_rule_id: Some(market_rule_id),
    };
    Ok(encode_protobuf_message(
        OutgoingMessages::RequestMarketRule as i32,
        &request.encode_to_vec(),
    ))
}

pub(crate) fn encode_request_smart_components(request_id: i32, bbo_exchange: &str) -> Result<Vec<u8>, Error> {
    use crate::messages::encode_protobuf_message;
    use prost::Message;
    let request = crate::proto::SmartComponentsRequest {
        req_id: Some(request_id),
        bbo_exchange: Some(bbo_exchange.to_string()),
    };
    Ok(encode_protobuf_message(
        OutgoingMessages::RequestSmartComponents as i32,
        &request.encode_to_vec(),
    ))
}

pub(crate) fn encode_calculate_option_price(request_id: i32, contract: &Contract, volatility: f64, underlying_price: f64) -> Result<Vec<u8>, Error> {
    use crate::messages::encode_protobuf_message;
    use prost::Message;
    let request = crate::proto::CalculateOptionPriceRequest {
        req_id: Some(request_id),
        contract: Some(crate::proto::encoders::encode_contract(contract)),
        volatility: Some(volatility),
        under_price: Some(underlying_price),
        option_price_options: Default::default(),
    };
    Ok(encode_protobuf_message(
        OutgoingMessages::ReqCalcOptionPrice as i32,
        &request.encode_to_vec(),
    ))
}

pub(crate) fn encode_calculate_implied_volatility(
    request_id: i32,
    contract: &Contract,
    option_price: f64,
    underlying_price: f64,
) -> Result<Vec<u8>, Error> {
    use crate::messages::encode_protobuf_message;
    use prost::Message;
    let request = crate::proto::CalculateImpliedVolatilityRequest {
        req_id: Some(request_id),
        contract: Some(crate::proto::encoders::encode_contract(contract)),
        option_price: Some(option_price),
        under_price: Some(underlying_price),
        implied_volatility_options: Default::default(),
    };
    Ok(encode_protobuf_message(
        OutgoingMessages::ReqCalcImpliedVolat as i32,
        &request.encode_to_vec(),
    ))
}

pub(crate) fn encode_cancel_option_price(request_id: i32) -> Result<Vec<u8>, Error> {
    crate::proto::encoders::encode_cancel_by_id!(request_id, CancelCalculateOptionPrice, OutgoingMessages::CancelOptionPrice)
}

pub(crate) fn encode_cancel_implied_volatility(request_id: i32) -> Result<Vec<u8>, Error> {
    crate::proto::encoders::encode_cancel_by_id!(request_id, CancelCalculateImpliedVolatility, OutgoingMessages::CancelImpliedVolatility)
}

pub(crate) fn encode_cancel_contract_data(request_id: i32) -> Result<Vec<u8>, Error> {
    crate::proto::encoders::encode_cancel_by_id!(request_id, CancelContractData, OutgoingMessages::CancelContractData)
}

pub(in crate::contracts) fn encode_request_option_chain(
    request_id: i32,
    symbol: &str,
    exchange: Option<&str>,
    security_type: SecurityType,
    contract_id: i32,
) -> Result<Vec<u8>, Error> {
    use crate::messages::encode_protobuf_message;
    use prost::Message;
    let request = crate::proto::SecDefOptParamsRequest {
        req_id: Some(request_id),
        underlying_symbol: Some(symbol.to_string()),
        fut_fop_exchange: exchange.map(str::to_string),
        underlying_sec_type: Some(security_type.to_string()),
        underlying_con_id: Some(contract_id),
    };
    Ok(encode_protobuf_message(
        OutgoingMessages::RequestSecurityDefinitionOptionalParameters as i32,
        &request.encode_to_vec(),
    ))
}

// Encoder coverage lives end-to-end in `contracts/{sync,async}_tests.rs`
// (via `assert_request<B>`) and in their `cancel_messages`
// (option-computation cancel dispatch).