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 let account = platform.account().await?;
68 println!("Account Info: {}", account);
69 if !show_full_status {
71 return Ok(());
72 }
73 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 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}