use tradestation::account::OrderType;
use tradestation::execution::{
Duration, Order, OrderGroupType, OrderRequestBuilder, OrderRequestGroupBuilder,
OrderTimeInForce, OrderUpdate, TradeAction,
};
use tradestation::{ClientBuilder, Error, Token};
#[tokio::main]
async fn main() -> Result<(), Error> {
let mut client = ClientBuilder::new()?
.credentials("YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET")?
.token(Token {
access_token: String::from("YOUR_ACCESS_TOKEN"),
refresh_token: String::from("YOUR_REFRESH_TOKEN"),
id_token: String::from("YOUR_ID_TOKEN"),
token_type: String::from("Bearer"),
scope: String::from("YOUR_SCOPES SPACE_SEPERATED FOR_EACH_SCOPE"),
expires_in: 1200,
})?
.build()
.await?;
println!("Your TradeStation API Bearer Token: {:?}", client.token);
let routes = client.get_execution_routes().await?;
println!("Valid routes for order execution: {routes:?}");
let triggers = client.get_activation_triggers().await?;
println!("Valid activation triggers for order execution: {triggers:?}");
let order_req = OrderRequestBuilder::new()
.account_id("YOUR_EQUITIES_ACCOUNT_ID")
.symbol("JPM")
.trade_action(TradeAction::Buy)
.quantity("100")
.order_type(OrderType::Limit)
.limit_price("220.50")
.time_in_force(OrderTimeInForce {
duration: Duration::GTC,
expiration: None,
})
.build()?;
let order = Order::place(&mut client, &order_req)
.await?
.into_iter()
.next();
if let Some(order) = order {
let updated_order = order
.replace(
&mut client,
OrderUpdate::new().limit_price("222.75").quantity("25"),
)
.await?
.into_iter()
.next();
if let Some(order) = updated_order {
order.cancel(&mut client).await?;
}
}
let entry_order_req = OrderRequestBuilder::new()
.account_id("YOUR_EQUITIES_ACCOUNT_ID")
.symbol("XLRE")
.trade_action(TradeAction::SellShort)
.quantity("1000")
.order_type(OrderType::Market)
.time_in_force(OrderTimeInForce {
duration: Duration::GTC,
expiration: None,
})
.build()?;
let take_profit_order_req = OrderRequestBuilder::new()
.account_id("YOUR_EQUITIES_ACCOUNT_ID")
.symbol("XLRE")
.trade_action(TradeAction::BuyToCover)
.quantity("1000")
.order_type(OrderType::Limit)
.limit_price("35.75")
.time_in_force(OrderTimeInForce {
duration: Duration::GTC,
expiration: None,
})
.build()?;
let stop_loss_order_req = OrderRequestBuilder::new()
.account_id("YOUR_EQUITIES_ACCOUNT_ID")
.symbol("XLRE")
.trade_action(TradeAction::BuyToCover)
.quantity("1000")
.order_type(OrderType::StopMarket)
.stop_price("46.50")
.time_in_force(OrderTimeInForce {
duration: Duration::GTC,
expiration: None,
})
.build()?;
let order_group = OrderRequestGroupBuilder::new()
.order_requests(Vec::from([
entry_order_req,
take_profit_order_req,
stop_loss_order_req,
]))
.group_type(OrderGroupType::BRK)
.build()?;
let orders = order_group.place(&mut client).await?;
println!("Place Orders Result: {orders:?}");
Ok(())
}