main.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. mod server;
  2. mod control_c;
  3. mod quant_libs;
  4. use std::sync::Arc;
  5. use std::sync::atomic::{AtomicBool, Ordering};
  6. use std::time::Duration;
  7. use tokio::sync::Mutex;
  8. use tracing::{info, warn};
  9. use tracing_appender_timezone::non_blocking::WorkerGuard;
  10. use global::cci::CentralControlInfo;
  11. use global::log_utils::send_remote_err_log;
  12. use global::params::Params;
  13. // 日志级别配置
  14. fn log_level_init(log_str: String, port: u32, account_name: String) -> WorkerGuard {
  15. info!("日志级别读取成功:{}。", log_str);
  16. global::log_utils::final_init(log_str.as_str(), port, account_name)
  17. }
  18. // 获取本地配置
  19. fn read_params() -> Params {
  20. let mut path = "config.toml";
  21. let args: Vec<String> = std::env::args().collect();
  22. for arg in &args {
  23. if !arg.contains("--config") {
  24. continue;
  25. }
  26. let p: Vec<&str> = arg.split("=").collect();
  27. path = p[1];
  28. }
  29. let params = Params::new(path).unwrap();
  30. return params;
  31. }
  32. #[tokio::main(flavor = "multi_thread", worker_threads = 2)]
  33. async fn main() {
  34. // 日志级别配置
  35. let params = read_params();
  36. // 日志级别配置
  37. let _guard = log_level_init(params.log_level.clone(), params.port.clone(), params.account_name.clone());
  38. info!("配置读取成功:{:?}。", params);
  39. // 主进程控制
  40. let running = Arc::new(AtomicBool::new(true));
  41. // panic错误捕获,panic级别的错误直接退出
  42. let account_name_clone = params.account_name.clone();
  43. let panic_running = running.clone();
  44. std::panic::set_hook(Box::new(move |panic_info| {
  45. let msg = format!("account={}, type=panic, msg={:?}, location={:?}",
  46. account_name_clone, panic_info.to_string(), panic_info.location());
  47. warn!("{}", msg);
  48. send_remote_err_log(msg);
  49. panic_running.store(false, Ordering::Relaxed);
  50. }));
  51. // 中央控制器信息
  52. let cci = CentralControlInfo {
  53. now_balance: Default::default(),
  54. unrealized_pn_l: Default::default(),
  55. pos: Default::default(),
  56. entry_price: Default::default(),
  57. now_price: Default::default(),
  58. };
  59. let cci_arc = Arc::new(Mutex::new(cci));
  60. // ws退出程序
  61. let ws_running = Arc::new(AtomicBool::new(true));
  62. // quant初始化动作
  63. let quant_arc = quant_libs::init(params.clone(), ws_running.clone(), running.clone(), cci_arc.clone()).await;
  64. // 初始化中控服务
  65. server::run_server(params.port.clone(), running.clone(), cci_arc.clone());
  66. // ctrl c退出检查程序
  67. control_c::exit_handler(running.clone());
  68. // 每一秒检查一次程序是否结束
  69. while running.load(Ordering::Relaxed) {
  70. tokio::time::sleep(Duration::from_secs(1)).await;
  71. }
  72. info!("检测到退出信号!停止ws订阅……");
  73. ws_running.store(false, Ordering::Relaxed);
  74. tokio::time::sleep(Duration::from_secs(1)).await;
  75. info!("等待清空仓位、订单(再次按control c可以立马结束)……");
  76. let mut quant = quant_arc.lock().await;
  77. quant.exit().await;
  78. info!("程序已退出!为以防万一,请再次检查仓位和订单!");
  79. // 强制退出
  80. std::process::exit(0);
  81. }