greed/
lib.rs

1use crate::analysis::AssetAnalyzer;
2use crate::asset::AssetSymbol;
3use crate::config::platform::PlatformType;
4use crate::error::GreedError;
5use crate::platform::args::PlatformArgs;
6use crate::run::{GreedRunner, GreedRunnerArgs};
7
8mod analysis;
9mod assert;
10pub mod asset;
11mod bool;
12pub mod config;
13mod date;
14mod enum_display;
15pub mod error;
16mod fixture;
17mod float;
18mod num;
19mod pager;
20pub mod platform;
21pub mod run;
22mod statistics;
23mod strategy;
24mod tactic;
25mod trading_days;
26
27pub async fn greed_loop(args: GreedRunnerArgs) -> Result<(), GreedError> {
28    let runner = GreedRunner::from_args(args).await?;
29    runner.run_loop().await;
30    Ok(())
31}
32
33pub async fn fetch_quote(
34    assets: &Vec<AssetSymbol>,
35    platform_type: &PlatformType,
36    platform_args: PlatformArgs,
37) -> Result<(), GreedError> {
38    print_price_explainer();
39    let platform = platform::for_type(platform_type, platform_args)?;
40    let quotes = platform.latest_quotes(assets).await?;
41    for quote in quotes {
42        println!("{}", quote)
43    }
44    Ok(())
45}
46
47pub async fn fetch_recent_orders(
48    platform_args: PlatformArgs,
49    platform_type: &PlatformType,
50) -> Result<(), GreedError> {
51    let platform = platform::for_type(platform_type, platform_args)?;
52    let orders = platform.recent_orders().await?;
53    println!("Recent Orders:");
54    for order in orders {
55        println!("-- {}", order.display_with_time_zone(&chrono::Local))
56    }
57    Ok(())
58}
59
60pub async fn fetch_status(
61    platform_args: PlatformArgs,
62    platform_type: &PlatformType,
63    show_full_status: bool
64) -> Result<(), GreedError> {
65    let platform = platform::for_type(platform_type, platform_args)?;
66    // Fetch account info
67    let account = platform.account().await?;
68    println!("Account Info: {}", account);
69    // Bail if we're not showing full status
70    if !show_full_status {
71        return Ok(());
72    }
73    // Fetch Open Positions
74    println!("Open Positions:");
75    let positions = platform.positions().await?;
76    positions
77        .iter()
78        .filter(|p| p.market_value.unwrap_or(0.0).abs() >= 0.01)
79        .for_each(|p| println!("-- {}", p));
80    // Fetch Open Orders
81    println!("Open Orders:");
82    let orders = platform.open_orders().await?;
83    for order in &orders {
84        println!("-- {}", order);
85    }
86    Ok(())
87}
88
89fn print_price_explainer() {
90    println!("ask price = lowest price where someone is willing to sell a share");
91    println!("bid price = highest price someone is willing to pay for a share");
92    println!("-----------");
93}
94
95pub async fn analyze_stocks(
96    assets: &Vec<AssetSymbol>,
97    platform_type: &PlatformType,
98    platform_args: PlatformArgs,
99) -> Result<(), GreedError> {
100    let platform = platform::for_type(platform_type, platform_args)?;
101    let analyzer = AssetAnalyzer::new(platform);
102    let bars_by_symbol = analyzer.analyze_bars(assets).await?;
103    for symbol in assets {
104        let bars = bars_by_symbol
105            .get(symbol)
106            .ok_or(GreedError::new("missing bars"))?;
107        println!("{}", bars)
108    }
109    Ok(())
110}