truefix-ig-client 0.1.3

Native, typed IG REST trading client for TrueFix.
Documentation

truefix-ig-client

truefix-ig-client 是 TrueFix 的原生、类型化 IG REST Trading API 客户端。它支持 IG Demo 与 Live 环境、v2 CST/XST session 认证以及可选的 v3 OAuth 认证。

Demo 是默认环境。Live 环境必须显式确认风险;凭证由调用方的 secret provider 注入,crate 不会从环境变量或 .env 文件读取凭证。

安装

[dependencies]
truefix-ig-client = "0.1"
tokio = { version = "1", features = ["full"] }

快速开始:Demo + v2

v2 是默认认证模式。登录后,IG 返回 CSTX-SECURITY-TOKEN,客户端会在后续 REST 请求中自动携带它们。

use truefix_ig_client::{ClientConfig, Credentials, IgClient};

# async fn example() -> Result<(), Box<dyn std::error::Error>> {
let credentials = Credentials::new("identifier", "password", "api-key")?;
let client = IgClient::new(ClientConfig::demo(Some(credentials)))?;

let session = client.login().await?;
println!("client ID: {}", session.client_id);

let positions = client.positions().await?;
println!("open positions: {}", positions.positions.len());

client.logout().await?;
# Ok(()) }

可选认证:v3 OAuth

选择 v3 时必须指定活动账户 ID。登录后客户端保存 OAuth access/refresh token;每个 REST 请求会自动发送 Authorization: Bearer …IG-ACCOUNT-ID,并在 access token 距离过期 少于 10 秒时通过 POST /session/refresh-token 刷新。

use truefix_ig_client::{ClientConfig, Credentials, IgClient};

# async fn example() -> Result<(), Box<dyn std::error::Error>> {
let credentials = Credentials::new("identifier", "password", "api-key")?;
let config = ClientConfig::demo(Some(credentials))
    .with_v3_authentication("ABC123")?;
let client = IgClient::new(config)?;

client.login().await?;
let accounts = client.accounts().await?;
# Ok(()) }
模式 登录请求 后续 REST 请求 适用情形
v2(默认) Version: 2 CSTX-SECURITY-TOKEN 简单的 session 认证
v3(可选) Version: 3、账户 ID Bearer token、IG-ACCOUNT-ID 需要 OAuth token 生命周期管理

IG 的 streaming 服务仍需要 CST/XST;本 crate 当前仅提供 REST 客户端。login() 返回的 lightstreamer_endpoint 供应用自行创建 streaming 连接,不能硬编码。

已支持的 REST 操作

Rust API IG endpoint API version
login / login_v2 POST /session 2
login / login_v3 POST /session 3
logout DELETE /session 1
accounts GET /accounts 1
positions GET /positions 2
market GET /markets/{epic} 3
search_markets GET /markets?searchTerm=… 1
historical_prices GET /prices/{epic} 3
create_position POST /positions/otc 2

路径与 query 参数会被编码;例如 epic 中的 / 不会被误认为 URL path 分隔符。

查询市场与历史价格

use truefix_ig_client::{types::HistoricalPricesQuery, ClientConfig, Credentials, IgClient};

# async fn example() -> Result<(), Box<dyn std::error::Error>> {
# let credentials = Credentials::new("identifier", "password", "api-key")?;
# let client = IgClient::new(ClientConfig::demo(Some(credentials)))?;
# client.login().await?;
let markets = client.search_markets("EURUSD").await?;
let prices = client
    .historical_prices(
        "CS.D.EURUSD.MINI.IP",
        HistoricalPricesQuery::new("HOUR").max(100),
    )
    .await?;
# Ok(()) }

创建仓位

写操作不会自动重试,避免网络中断后的重复下单。应用应保存并用 IG 返回的 deal_reference 进行后续确认和对账。

use truefix_ig_client::{
    types::{CreatePositionRequest, Direction, OrderType},
    ClientConfig, Credentials, IgClient,
};

# async fn example() -> Result<(), Box<dyn std::error::Error>> {
# let credentials = Credentials::new("identifier", "password", "api-key")?;
# let client = IgClient::new(ClientConfig::demo(Some(credentials)))?;
# client.login().await?;
let acknowledgement = client
    .create_position(&CreatePositionRequest {
        currency_code: "USD".to_owned(),
        direction: Direction::Buy,
        epic: "CS.D.EURUSD.MINI.IP".to_owned(),
        expiry: "DFB".to_owned(),
        force_open: false,
        guaranteed_stop: false,
        order_type: OrderType::Market,
        size: 1.0,
        level: None,
        limit_level: None,
        stop_level: None,
    })
    .await?;
println!("deal reference: {}", acknowledgement.deal_reference);
# Ok(()) }

Live 环境

构造 Live client 时需要 LiveTradingConfirmation,使生产交易意图在调用点可见:

use truefix_ig_client::{ClientConfig, Credentials, IgClient, LiveTradingConfirmation};

# fn example() -> Result<(), Box<dyn std::error::Error>> {
let credentials = Credentials::new("identifier", "password", "api-key")?;
let config = ClientConfig::live(
    credentials,
    LiveTradingConfirmation::acknowledge_risk(),
);
let _client = IgClient::new(config)?;
# Ok(()) }

测试或支持的区域路由可使用 Environment::Custom { rest_base }ClientConfig 还提供 timeout(默认 15 秒)及可选 proxy 字段。

错误处理与安全性

所有方法返回 IgResult<T>IgError 会区分配置、缺少凭证、未认证 session、IG API 拒绝、 网络传输与响应解析错误。IG 返回非 2xx 时,错误会保留 HTTP status、IG errorCode 和响应信息。

  • CredentialsDebug 输出始终为 Credentials(REDACTED)
  • API key、密码、session token 与 OAuth token 不会出现在日志或错误文本中。
  • Client 构造不发起网络请求;只有 login 和业务 API 会访问 IG。
  • 遇到 token 被服务端撤销或刷新失败时,调用方应处理错误并重新登录。

验证

cargo test -p truefix-ig-client
cargo clippy -p truefix-ig-client --all-targets -- -D warnings

协议与账户配置请参阅 IG Labs 的官方文档。