main.rs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. mod server;
  2. mod control_c;
  3. mod core_libs;
  4. use std::str::FromStr;
  5. use std::sync::Arc;
  6. use std::sync::atomic::{AtomicBool, Ordering};
  7. use std::time::Duration;
  8. use tokio::sync::Mutex;
  9. use tracing::{info, warn};
  10. use tracing_appender_timezone::non_blocking::WorkerGuard;
  11. use global::cci::CentralControlInfo;
  12. use global::log_utils::{send_remote_err_log};
  13. use global::params::Params;
  14. // 日志级别配置
  15. fn log_level_init(log_str: String, port: u32, account_name: String) -> WorkerGuard {
  16. info!("日志级别读取成功:{}。", log_str);
  17. global::log_utils::final_init(log_str.as_str(), port, account_name)
  18. }
  19. // 获取本地配置
  20. // fn read_params() -> Params {
  21. // let mut path = "config.toml";
  22. //
  23. // let args: Vec<String> = std::env::args().collect();
  24. //
  25. // for arg in &args {
  26. // if !arg.contains("--config") {
  27. // continue;
  28. // }
  29. //
  30. // let p: Vec<&str> = arg.split("=").collect();
  31. // path = p[1];
  32. // }
  33. //
  34. // println!("配置文件路径:{}", path);
  35. // let params = Params::new(path).unwrap();
  36. //
  37. // return params;
  38. // }
  39. // 获取本地配置- json 文件解析
  40. fn read_params_json() -> Params {
  41. let mut path = "config.json";
  42. let mut call_port = 5555;
  43. let args: Vec<String> = std::env::args().collect();
  44. for arg in &args {
  45. // Check for the --config argument and assign its value.
  46. if arg.starts_with("--config=") {
  47. let parts: Vec<&str> = arg.split('=').collect();
  48. if parts.len() == 2 {
  49. path = parts[1];
  50. }
  51. }
  52. // Check for the --port argument and assign its value.
  53. if arg.starts_with("--port=") {
  54. let parts: Vec<&str> = arg.split('=').collect();
  55. if parts.len() == 2 {
  56. match u32::from_str(parts[1]) {
  57. Ok(num) => call_port = num,
  58. Err(_) => eprintln!("Invalid number for port: {}", parts[1]),
  59. }
  60. }
  61. }
  62. }
  63. println!("通讯端口:{}, 配置文件路径:{}", call_port, path);
  64. let params = Params::new_json(path, call_port).unwrap();
  65. return params;
  66. }
  67. #[tokio::main(flavor = "multi_thread", worker_threads = 2)]
  68. async fn main() {
  69. // 日志级别配置
  70. // let params = read_params();
  71. let params = read_params_json();
  72. // 日志级别配置
  73. let _guard = log_level_init(params.log_level.clone(), params.port.clone(), params.account_name.clone());
  74. info!("--------------------------------程序开始执行-----------------------------");
  75. info!("配置读取成功:{:?}。", params);
  76. // 主进程控制
  77. let running = Arc::new(AtomicBool::new(true));
  78. // panic错误捕获,panic级别的错误直接退出
  79. let account_name_clone = params.account_name.clone();
  80. let panic_running = running.clone();
  81. std::panic::set_hook(Box::new(move |panic_info| {
  82. let msg = format!("account={}, type=panic, msg={:?}, location={:?}",
  83. account_name_clone, panic_info.to_string(), panic_info.location());
  84. warn!("{}", msg);
  85. send_remote_err_log(msg);
  86. panic_running.store(false, Ordering::Relaxed);
  87. }));
  88. // 中央控制器信息
  89. let cci = CentralControlInfo {
  90. now_balance: Default::default(),
  91. unrealized_pn_l: Default::default(),
  92. pos: Default::default(),
  93. entry_price: Default::default(),
  94. now_price: Default::default(),
  95. };
  96. let cci_arc = Arc::new(Mutex::new(cci));
  97. // ws退出程序
  98. let ws_running = Arc::new(AtomicBool::new(true));
  99. // core初始化动作
  100. let core_arc = core_libs::init(params.clone(), ws_running.clone(), running.clone(), cci_arc.clone()).await;
  101. // 初始化中控服务
  102. server::run_server(params.port.clone(), running.clone(), cci_arc.clone());
  103. // ctrl c退出检查程序
  104. control_c::exit_handler(running.clone());
  105. // 每一秒检查一次程序是否结束
  106. while running.load(Ordering::Relaxed) {
  107. tokio::time::sleep(Duration::from_secs(1)).await;
  108. }
  109. info!("检测到退出信号!停止ws订阅……");
  110. ws_running.store(false, Ordering::Relaxed);
  111. tokio::time::sleep(Duration::from_secs(1)).await;
  112. info!("等待清空仓位、订单(再次按control c可以立马结束)……");
  113. let mut core = core_arc.lock().await;
  114. core.exit().await;
  115. info!("程序已退出!为以防万一,请再次检查仓位和订单!");
  116. // 等两秒,等中控反应过来
  117. tokio::time::sleep(Duration::from_secs(2)).await;
  118. // 强制退出
  119. std::process::exit(0);
  120. }