main.rs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. mod server;
  2. mod control_c;
  3. mod core_libs;
  4. mod clear_core_libs;
  5. use std::str::FromStr;
  6. use std::sync::Arc;
  7. use std::sync::atomic::{AtomicBool, Ordering};
  8. use std::time::Duration;
  9. use tokio::sync::Mutex;
  10. use tracing::{error, info, warn};
  11. use tracing_appender_timezone::non_blocking::WorkerGuard;
  12. use global::cci::CentralControlInfo;
  13. use global::params::Params;
  14. // 日志级别配置
  15. fn log_level_init(log_str: String, port: u32) -> WorkerGuard {
  16. let log = global::log_utils::final_init(log_str.as_str(), port);
  17. info!("日志级别读取成功:{}。", log_str);
  18. return log;
  19. }
  20. // 清仓程序日志级别配置
  21. fn clear_log_level_init(log_str: String, port: u32, account_name: String) -> WorkerGuard {
  22. let log = global::clear_log_utils::final_init(log_str.as_str(), port, account_name);
  23. info!("清仓程序日志级别读取成功:{}。", log_str);
  24. return log;
  25. }
  26. // 获取本地配置
  27. // fn read_params() -> Params {
  28. // let mut path = "config.toml";
  29. //
  30. // let args: Vec<String> = std::env::args().collect();
  31. //
  32. // for arg in &args {
  33. // if !arg.contains("--config") {
  34. // continue;
  35. // }
  36. //
  37. // let p: Vec<&str> = arg.split("=").collect();
  38. // path = p[1];
  39. // }
  40. //
  41. // println!("配置文件路径:{}", path);
  42. // let params = Params::new(path).unwrap();
  43. //
  44. // return params;
  45. // }
  46. // 获取本地配置- json 文件解析
  47. fn read_params_json() -> Params {
  48. let mut path = "config.json";
  49. let mut call_port = 5555;
  50. // 运行模式 0.正常策略运行, 1.清理挂单及仓位
  51. let mut run_mode = 0;
  52. let mut r_id = "-1".to_string();
  53. let args: Vec<String> = std::env::args().collect();
  54. for arg in &args {
  55. // Check for the --config argument and assign its value.
  56. if arg.starts_with("--config=") {
  57. let parts: Vec<&str> = arg.split('=').collect();
  58. if parts.len() == 2 {
  59. path = parts[1];
  60. }
  61. }
  62. // Check for the --port argument and assign its value.
  63. if arg.starts_with("--port=") {
  64. let parts: Vec<&str> = arg.split('=').collect();
  65. if parts.len() == 2 {
  66. match u32::from_str(parts[1]) {
  67. Ok(num) => call_port = num,
  68. Err(_) => eprintln!("Invalid number for port: {}", parts[1]),
  69. }
  70. }
  71. }
  72. // Check for the --port argument and assign its value.
  73. if arg.starts_with("--run_mode=") {
  74. let parts: Vec<&str> = arg.split('=').collect();
  75. if parts.len() == 2 {
  76. match u32::from_str(parts[1]) {
  77. Ok(num) => run_mode = num,
  78. Err(_) => eprintln!("Invalid number for run_mode: {}", parts[1]),
  79. }
  80. }
  81. }
  82. //上报ID
  83. if arg.starts_with("--r_id=") {
  84. let parts: Vec<&str> = arg.split('=').collect();
  85. if parts.len() == 2 {
  86. r_id = parts[1].to_string();
  87. } else {
  88. error!("启动失败,回执单id参数格式设置错误 --check_id=xxx!");
  89. panic!("启动失败,回执单id参数格式设置错误 --check_id=xxx!");
  90. }
  91. }
  92. }
  93. println!("通讯端口:{}, 配置文件路径:{}", call_port, path);
  94. println!("请求指令携带参数:{:?}",args.clone());
  95. let mut params = Params::new_json(path, call_port).unwrap();
  96. if run_mode == 1 {
  97. params.run_mode = 1;
  98. if r_id == "-1" {
  99. error!("启动失败,缺少回执单id参数!");
  100. panic!("启动失败,缺少回执单id参数!");
  101. }
  102. }
  103. params.r_id = r_id;
  104. return params;
  105. }
  106. #[tokio::main(flavor = "multi_thread", worker_threads = 2)]
  107. async fn main() {
  108. // 日志级别配置
  109. // let params = read_params();
  110. let params = read_params_json();
  111. // 日志级别配置
  112. let _guard;
  113. if params.run_mode == 1 {
  114. _guard = clear_log_level_init(params.log_level.clone(), params.port.clone(), params.account_name.clone());
  115. } else {
  116. _guard = log_level_init(params.log_level.clone(), params.port.clone());
  117. }
  118. info!("--------------------------------程序开始执行-----------------------------");
  119. info!("配置读取成功:{:?}。", params);
  120. // 主进程控制
  121. let running = Arc::new(AtomicBool::new(true));
  122. // panic错误捕获,panic级别的错误直接退出
  123. let account_name_clone = params.account_name.clone();
  124. let panic_running = running.clone();
  125. std::panic::set_hook(Box::new(move |panic_info| {
  126. let msg = format!("account={}, type=panic, msg={:?}, location={:?}",
  127. account_name_clone, panic_info.to_string(), panic_info.location());
  128. warn!("{}", msg);
  129. panic_running.store(false, Ordering::Relaxed);
  130. }));
  131. // 中央控制器信息
  132. let cci = CentralControlInfo::new();
  133. let cci_arc = Arc::new(Mutex::new(cci));
  134. // ws退出程序
  135. let ws_running = Arc::new(AtomicBool::new(true));
  136. if params.run_mode == 1 {
  137. // core初始化动作
  138. let mut core_arc = clear_core_libs::init(params.clone(), ws_running.clone(), running.clone(), cci_arc.clone()).await;
  139. info!("开始执行清仓程序");
  140. core_arc.exit(params.r_id).await;
  141. info!("清仓程序执行完毕");
  142. // 强制退出
  143. std::process::exit(0);
  144. } else {
  145. // core初始化动作
  146. let core_arc = core_libs::init(params.clone(), ws_running.clone(), running.clone(), cci_arc.clone()).await;
  147. // 初始化中控服务
  148. server::run_server(params.port.clone(), running.clone(), cci_arc.clone());
  149. // ctrl c退出检查程序
  150. control_c::exit_handler(running.clone());
  151. // 每一秒检查一次程序是否结束
  152. while running.load(Ordering::Relaxed) {
  153. tokio::time::sleep(Duration::from_secs(1)).await;
  154. }
  155. info!("检测到退出信号!停止ws订阅……");
  156. ws_running.store(false, Ordering::Relaxed);
  157. tokio::time::sleep(Duration::from_secs(1)).await;
  158. info!("等待清空仓位、订单(再次按control c可以立马结束)……");
  159. let mut core = core_arc.lock().await;
  160. core.exit().await;
  161. info!("程序已退出!为以防万一,请再次检查仓位和订单!");
  162. // 等两秒,等中控反应过来
  163. tokio::time::sleep(Duration::from_secs(2)).await;
  164. // 强制退出
  165. std::process::exit(0);
  166. }
  167. }