solana_trader/
solana_trader.rs1use fulid::strategy_engine::StrategyEngine;
2use plotly::{Plot, Scatter};
3
4pub struct SolanaTrader {
5 pub engine: StrategyEngine,
6 pub current_strategy: Option<usize>,
7}
8
9impl SolanaTrader {
10 pub fn new(engine: StrategyEngine) -> Self {
11 Self {
12 engine,
13 current_strategy: None,
14 }
15 }
16
17 pub fn determine_strategy(&mut self, prices: Vec<f64>) {
18 let results = self.engine.backtest(prices.clone());
19 let best_strategy_index = results
20 .iter()
21 .enumerate()
22 .max_by(|(_, a), (_, b)| a.partial_cmp(b).unwrap())
23 .unwrap()
24 .0;
25
26 self.current_strategy = Some(best_strategy_index);
27 println!("Best Strategy: {}", best_strategy_index + 1);
28 }
29
30 pub fn generate_signal(&self, price: f64) -> f64 {
31 if let Some(strategy_index) = self.current_strategy {
32 let strategy = &self.engine.strategies[strategy_index];
33
34 strategy.evaluate(&price)
35 } else {
36 0.0 }
38 }
39
40 pub fn execute_trade(&self, signal: f64) {
41 if signal > 0.0 {
42 println!("Buy order executed.");
43 } else if signal < 0.0 {
44 println!("Sell order executed.");
45 } else {
46 println!("No trade executed.");
47 }
48 }
49
50 pub fn trade(&mut self, prices: Vec<f64>) {
51 self.determine_strategy(prices.clone());
52
53 let prices_clone = prices.clone();
54
55 for price in prices {
56 let signal = self.generate_signal(price);
57 self.execute_trade(signal);
58 }
59
60
61 let mut plot = Plot::new();
63 for (i, strategy) in self.engine.strategies.iter().enumerate() {
64 let mut results = vec![];
65
66
67 prices_clone.iter().for_each(|price| {
68 results.push(strategy.evaluate(price));
69 });
70
71 let trace = Scatter::new((0..prices_clone.len()).collect(), results)
72 .name(&format!("Strategy {}", i + 1));
73 plot.add_trace(trace);
74 }
75 plot.write_html("solana_strategy_performance.html");
76 }
77}
78
79fn main() {
80 let engine = StrategyEngine::default();
81 let mut solana_trander = SolanaTrader::new(engine);
82 let prices = vec![10.0, 12.0, 15.0, 14.0, 13.0, 12.0];
83 solana_trander.trade(prices);
84}