use super::query::{Field, Query};
pub fn day_gainers() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::gt(Field::PercentChange, 3.0),
Query::gte(Field::IntradayPrice, 5.0),
Query::gt(Field::DayVolume, 15_000),
])
}
pub fn day_losers() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::lt(Field::PercentChange, -3.0),
Query::gte(Field::IntradayPrice, 5.0),
Query::gt(Field::DayVolume, 15_000),
])
}
pub fn most_actives() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::gte(Field::IntradayPrice, 5.0),
Query::gt(Field::DayVolume, 500_000),
])
}
pub fn growth_technology_stocks() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::eq(Field::Sector, "Technology"),
Query::gte(Field::IntradayMarketCap, 2_000_000_000.0),
Query::gt(Field::EPSGrowthTTM, 25.0),
])
}
pub fn aggressive_small_caps() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::lte(Field::IntradayMarketCap, 2_000_000_000.0),
Query::gte(Field::IntradayMarketCap, 300_000_000.0),
Query::gt(Field::EPSGrowthTTM, 25.0),
Query::gte(Field::IntradayPrice, 5.0),
])
}
pub fn undervalued_growth_stocks() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::gte(Field::IntradayMarketCap, 2_000_000_000.0),
Query::lte(Field::PERatioTTM, 20.0),
Query::gt(Field::EPSGrowthTTM, 20.0),
Query::lte(Field::PEGRatio5Y, 1.0),
])
}
pub fn undervalued_large_caps() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::gte(Field::IntradayMarketCap, 10_000_000_000.0),
Query::lte(Field::PERatioTTM, 15.0),
Query::gte(Field::ReturnOnEquity, 0.15),
])
}
pub fn high_yield_stocks() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::gte(Field::DividendYield, 0.03),
Query::gte(Field::IntradayMarketCap, 2_000_000_000.0),
Query::gte(Field::IntradayPrice, 5.0),
])
}
pub fn near_52_week_high() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::gte(Field::PercentFromFiftyTwoWeekHigh, -5.0),
Query::gte(Field::IntradayPrice, 5.0),
Query::gt(Field::DayVolume, 100_000),
])
}
pub fn near_52_week_low() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::lte(Field::PercentFromFiftyTwoWeekLow, 5.0),
Query::gte(Field::IntradayPrice, 5.0),
Query::gt(Field::DayVolume, 100_000),
])
}
pub fn solid_large_cap_growth() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::gte(Field::IntradayMarketCap, 10_000_000_000.0),
Query::gte(Field::EPSGrowthTTM, 10.0),
Query::gte(Field::ReturnOnEquity, 0.15),
Query::gte(Field::ProfitMargin, 0.10),
])
}
pub fn solid_mid_cap_growth() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::between(Field::IntradayMarketCap, 2_000_000_000.0, 10_000_000_000.0),
Query::gte(Field::EPSGrowthTTM, 15.0),
Query::gte(Field::ReturnOnEquity, 0.15),
])
}
pub fn portfolio_anchors() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::gte(Field::IntradayMarketCap, 10_000_000_000.0),
Query::gte(Field::DividendYield, 0.02),
Query::gte(Field::ReturnOnEquity, 0.12),
Query::gte(Field::ProfitMargin, 0.10),
Query::lte(Field::Beta, 1.2),
])
}
pub fn value_stocks() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::gte(Field::IntradayMarketCap, 2_000_000_000.0),
Query::lte(Field::PERatioTTM, 15.0),
Query::lte(Field::PriceToBook, 3.0),
Query::gte(Field::IntradayPrice, 5.0),
])
}
pub fn momentum_stocks() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::gt(Field::PercentChange, 2.0),
Query::gte(Field::PercentFromFiftyTwoWeekHigh, -10.0),
Query::gt(Field::DayVolume, 500_000),
Query::gte(Field::IntradayPrice, 10.0),
])
}
pub fn breakout_stocks() -> Query {
Query::and(vec![
Query::eq(Field::Region, "us"),
Query::gt(Field::PercentChange, 5.0),
Query::gte(Field::IntradayPrice, 5.0),
Query::gt(Field::DayVolume, 1_000_000),
])
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_day_gainers_query() {
let query = day_gainers();
let json = query.to_json();
assert_eq!(json["operator"], "and");
}
#[test]
fn test_all_preset_queries_compile() {
let _queries = vec![
day_gainers(),
day_losers(),
most_actives(),
growth_technology_stocks(),
aggressive_small_caps(),
undervalued_growth_stocks(),
undervalued_large_caps(),
high_yield_stocks(),
near_52_week_high(),
near_52_week_low(),
solid_large_cap_growth(),
solid_mid_cap_growth(),
portfolio_anchors(),
value_stocks(),
momentum_stocks(),
breakout_stocks(),
];
}
}