/ src / main.rs
main.rs
  1  pub mod bot_functions;
  2  pub mod fsm;
  3  pub mod router;
  4  use actix::Actor;
  5  use color_print::cprintln;
  6  use ethos_sledb::storage::Storage;
  7  use once_cell::sync::Lazy;
  8  use serde_json::Value;
  9  use sled::*;
 10  use std::sync::Arc;
 11  use tokio::task::LocalSet;
 12  
 13  use crate::{
 14      bot_functions::{
 15          bot_functions::BotFunction,
 16          ngrok_webhook::start_webhook_listener,
 17          sysinfo::log_resource_usage_loop,
 18          utils::{cut_after_dot_symbol, get_ticksize_for_symbol},
 19          ws_connect::WSConnect,
 20      },
 21      fsm::{InitialData, FSM},
 22      router::{Router, WebhookMsg, WsMsg},
 23  };
 24  
 25  use ethos_algorithm_of_god_lib::trade_functions::{
 26      constants::leverage_constants::{Position, PositionResult},
 27      trade_functions::{self, AlgorithmOfGod, LeverageData, LeverageDetail},
 28  };
 29  
 30  /* static DB: Lazy<Arc<Db>> = Lazy::new(|| Arc::new(sled::open("db").expect("DB not open"))); */
 31  
 32  #[tokio::main(flavor = "current_thread")]
 33  async fn main() {
 34      let local = LocalSet::new();
 35  
 36      local
 37          .run_until(async {
 38              /*   const API_KEY: &'static str =
 39                  "0RUgccRJth6CPvytb1cywm6NUN0oDFm3Pja6EvcpAtXF1xaMqIIGFIQneFTa5YoR";
 40              const API_SECRET_KEY: &'static str =
 41                  "V5fkaOVNAxDRNslgvFFlsG6CwKiZeV6Ot9HXGxSUP1eLx0MttdQoZDS0FM0VJGR0"; */
 42  
 43              /* const API_KEY: &'static str =
 44                             "a80c845267c8985d51a1f368b195977814b52d152ad9f9aae714ca66270f76fd";
 45                         const API_SECRET_KEY: &'static str =
 46                             "b2efda99d3dba4d248b452f7cb1e4650acfa0a0e5a7cbbd09612649e920ef7bc";
 47              */
 48  
 49              const API_KEY: &'static str =
 50                  "0RUgccRJth6CPvytb1cywm6NUN0oDFm3Pja6EvcpAtXF1xaMqIIGFIQneFTa5YoR";
 51              const API_SECRET_KEY: &'static str =
 52                  "V5fkaOVNAxDRNslgvFFlsG6CwKiZeV6Ot9HXGxSUP1eLx0MttdQoZDS0FM0VJGR0";
 53  
 54              //const API_URL: &'static str = "https://testnet.binancefuture.com";
 55              const API_URL: &'static str = "https://fapi.binance.com";
 56  
 57              let leverage_data = vec![LeverageData {
 58                  user_id: 1,
 59                  lev_data: vec![],
 60              }];
 61  
 62              let initial_data = InitialData {
 63                  first_entrence_fee: 1.0 * 50.0,
 64                  spec_fold: 3,
 65              };
 66  
 67              let storage = Arc::new(Storage::new("db"));
 68              let algo = Arc::new(AlgorithmOfGod::new(leverage_data, Arc::clone(&storage)));
 69  
 70              let bot = Arc::new(BotFunction::new(
 71                  API_KEY.into(),
 72                  API_SECRET_KEY.into(),
 73                  API_URL.into(),
 74              ));
 75  
 76              bot.exchange_info().await;
 77  
 78              let router_addr =
 79                  Router::new(Arc::clone(&bot), Arc::clone(&algo), initial_data.clone()).start();
 80  
 81              let bot_ws = Arc::clone(&bot);
 82              let mut ws_rx = WSConnect::listen(bot_ws).await;
 83  
 84              let router_ws = router_addr.clone();
 85              let ws_task = tokio::task::spawn_local(async move {
 86                  while let Some(msg) = ws_rx.recv().await {
 87                      router_ws.do_send(WsMsg { data: msg });
 88                  }
 89              });
 90  
 91              let router_webhook = router_addr.clone();
 92              let cb = Arc::new(move |mut data: Value| {
 93                  println!("raw data : {:#?}",data);
 94                  if let Some(sym) = data.get("symbol").and_then(|v| v.as_str()) {
 95                      let clean = cut_after_dot_symbol(sym);
 96                      if let Some(obj) = data.as_object_mut() {
 97                          obj.insert("symbol".into(), Value::String(clean));
 98                      }
 99                  }
100                  println!("data : {:#?}",data);
101  
102                  router_webhook.do_send(WebhookMsg { data });
103              });
104              tokio::task::spawn_local(start_webhook_listener(cb));
105  
106              tokio::spawn(async move {
107                  loop {
108                      log_resource_usage_loop().await;
109                      tokio::time::sleep(std::time::Duration::from_secs(5)).await;
110                  }
111              });
112  
113              tokio::signal::ctrl_c().await.unwrap();
114              ws_task.abort();
115          })
116          .await;
117  }