solana_trader/
solana_trader.rs

1use 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 // 如果没有确定策略,则返回无信号
37        }
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        // 使用plotly绘制结果图
62        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}