Add paper URL support
Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
103
src/init.rs
Normal file
103
src/init.rs
Normal file
@@ -0,0 +1,103 @@
|
||||
use crate::{
|
||||
config::{Config, ALPACA_MODE},
|
||||
database,
|
||||
types::alpaca::{self, api, shared::Sort},
|
||||
};
|
||||
use log::{info, warn};
|
||||
use std::{collections::HashSet, sync::Arc};
|
||||
use time::OffsetDateTime;
|
||||
|
||||
pub async fn check_account(config: &Arc<Config>) {
|
||||
let account = alpaca::api::incoming::account::get(config, None)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
assert!(
|
||||
!(account.status != alpaca::api::incoming::account::Status::Active),
|
||||
"Account status is not active: {:?}.",
|
||||
account.status
|
||||
);
|
||||
assert!(
|
||||
!account.trade_suspend_by_user,
|
||||
"Account trading is suspended by user."
|
||||
);
|
||||
assert!(!account.trading_blocked, "Account trading is blocked.");
|
||||
assert!(!account.blocked, "Account is blocked.");
|
||||
|
||||
if account.cash == 0.0 {
|
||||
warn!("Account cash is zero, qrust will not be able to trade.");
|
||||
}
|
||||
|
||||
warn!(
|
||||
"qrust active on {} account with {} {}, avoid transferring funds without shutting down.",
|
||||
*ALPACA_MODE, account.currency, account.cash
|
||||
);
|
||||
}
|
||||
|
||||
pub async fn rehydrate_orders(config: &Arc<Config>) {
|
||||
info!("Rehydrating order data.");
|
||||
|
||||
let mut orders = vec![];
|
||||
let mut after = OffsetDateTime::UNIX_EPOCH;
|
||||
|
||||
while let Some(message) = api::incoming::order::get(
|
||||
config,
|
||||
&api::outgoing::order::Order {
|
||||
status: Some(api::outgoing::order::Status::All),
|
||||
limit: Some(500),
|
||||
after: Some(after),
|
||||
until: None,
|
||||
direction: Some(Sort::Asc),
|
||||
nested: Some(true),
|
||||
symbols: None,
|
||||
side: None,
|
||||
},
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.ok()
|
||||
.filter(|message| !message.is_empty())
|
||||
{
|
||||
orders.extend(message);
|
||||
after = orders.last().unwrap().submitted_at;
|
||||
}
|
||||
|
||||
let orders = orders
|
||||
.into_iter()
|
||||
.flat_map(&api::incoming::order::Order::normalize)
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
database::orders::upsert_batch(&config.clickhouse_client, &orders)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
info!("Rehydrated order data.");
|
||||
}
|
||||
|
||||
pub async fn check_positions(config: &Arc<Config>) {
|
||||
let positions_future = async {
|
||||
alpaca::api::incoming::position::get(config, None)
|
||||
.await
|
||||
.unwrap()
|
||||
};
|
||||
|
||||
let assets_future = async {
|
||||
database::assets::select(&config.clickhouse_client)
|
||||
.await
|
||||
.unwrap()
|
||||
.into_iter()
|
||||
.map(|asset| asset.symbol)
|
||||
.collect::<HashSet<_>>()
|
||||
};
|
||||
|
||||
let (positions, assets) = tokio::join!(positions_future, assets_future);
|
||||
|
||||
for position in positions {
|
||||
if !assets.contains(&position.symbol) {
|
||||
warn!(
|
||||
"Position for unmonitored asset: {}, {} shares.",
|
||||
position.symbol, position.qty
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user