|
@@ -17,10 +17,12 @@ use crate::exchange::extended_account::ExtendedAccount;
|
|
|
use crate::exchange::extended_rest_client::ExtendedRestClient;
|
|
use crate::exchange::extended_rest_client::ExtendedRestClient;
|
|
|
use crate::exchange::extended_stream_client::ExtendedStreamClient;
|
|
use crate::exchange::extended_stream_client::ExtendedStreamClient;
|
|
|
use crate::strategy::Strategy;
|
|
use crate::strategy::Strategy;
|
|
|
|
|
+use crate::utils::config::Config;
|
|
|
use crate::utils::response::Response;
|
|
use crate::utils::response::Response;
|
|
|
|
|
|
|
|
#[tokio::main]
|
|
#[tokio::main]
|
|
|
async fn main() {
|
|
async fn main() {
|
|
|
|
|
+ // 日志初始化
|
|
|
let _guards = log_setup::setup_logging().unwrap();
|
|
let _guards = log_setup::setup_logging().unwrap();
|
|
|
|
|
|
|
|
// 主进程控制
|
|
// 主进程控制
|
|
@@ -44,10 +46,19 @@ async fn main() {
|
|
|
panic_running.store(false, Ordering::Relaxed);
|
|
panic_running.store(false, Ordering::Relaxed);
|
|
|
}));
|
|
}));
|
|
|
|
|
|
|
|
|
|
+ // 配置文件
|
|
|
|
|
+ let config_result = Config::load();
|
|
|
|
|
+ let config = match config_result {
|
|
|
|
|
+ Ok(config) => config,
|
|
|
|
|
+ Err(error) => {
|
|
|
|
|
+ panic!("Configuration error: {}", error);
|
|
|
|
|
+ }
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
// ---- 优雅停机处理 (示例: SIGINT/Ctrl+C) ----
|
|
// ---- 优雅停机处理 (示例: SIGINT/Ctrl+C) ----
|
|
|
//注意:Windows上可能不支持所有信号,SIGINT通常可用
|
|
//注意:Windows上可能不支持所有信号,SIGINT通常可用
|
|
|
let r = running.clone(); // 克隆 Arc 用于 SIGHUP/SIGTERM/SIGINT 处理
|
|
let r = running.clone(); // 克隆 Arc 用于 SIGHUP/SIGTERM/SIGINT 处理
|
|
|
- tokio::spawn(async move {
|
|
|
|
|
|
|
+ spawn(async move {
|
|
|
tokio::signal::ctrl_c().await.expect("设置 Ctrl+C 处理器失败");
|
|
tokio::signal::ctrl_c().await.expect("设置 Ctrl+C 处理器失败");
|
|
|
warn!("接收到退出信号 (Ctrl+C)... 开始关闭.");
|
|
warn!("接收到退出信号 (Ctrl+C)... 开始关闭.");
|
|
|
r.store(false, Ordering::Relaxed);
|
|
r.store(false, Ordering::Relaxed);
|
|
@@ -56,10 +67,11 @@ async fn main() {
|
|
|
// ---- 运行核心订阅逻辑 ----
|
|
// ---- 运行核心订阅逻辑 ----
|
|
|
info!("==================================== 应用程序启动 =======================================");
|
|
info!("==================================== 应用程序启动 =======================================");
|
|
|
let task_running = running.clone();
|
|
let task_running = running.clone();
|
|
|
|
|
+ let config_clone = config.clone();
|
|
|
// 启动一个后台任务来执行订阅和数据处理
|
|
// 启动一个后台任务来执行订阅和数据处理
|
|
|
- let subscription_handle = tokio::spawn(async move {
|
|
|
|
|
|
|
+ let subscription_handle = spawn(async move {
|
|
|
// 运行获取交易对和订阅 K 线的函数
|
|
// 运行获取交易对和订阅 K 线的函数
|
|
|
- if let Err(e) = run_extended_subscriptions(task_running.clone()).await {
|
|
|
|
|
|
|
+ if let Err(e) = run_extended_subscriptions(task_running.clone(), &config_clone).await {
|
|
|
error!("运行 Extended 订阅任务失败: {:?}", e);
|
|
error!("运行 Extended 订阅任务失败: {:?}", e);
|
|
|
task_running.store(false, Ordering::Relaxed); // 如果启动失败,也设置停止标志
|
|
task_running.store(false, Ordering::Relaxed); // 如果启动失败,也设置停止标志
|
|
|
}
|
|
}
|
|
@@ -93,15 +105,15 @@ async fn main() {
|
|
|
/// * `running` - 用于控制程序是否继续运行的原子布尔值 (Arc 包裹)
|
|
/// * `running` - 用于控制程序是否继续运行的原子布尔值 (Arc 包裹)
|
|
|
///
|
|
///
|
|
|
/// # Returns
|
|
/// # Returns
|
|
|
-pub async fn run_extended_subscriptions(running: Arc<AtomicBool>) -> Result<()> {
|
|
|
|
|
- let market = "BTC-USD";
|
|
|
|
|
|
|
+pub async fn run_extended_subscriptions(running: Arc<AtomicBool>, config: &Config) -> Result<()> {
|
|
|
|
|
+ let market = config.strategy.market.as_str();
|
|
|
let account = ExtendedAccount::new(
|
|
let account = ExtendedAccount::new(
|
|
|
- "9ae4030902ab469a1bae8a90464e2e91",
|
|
|
|
|
- "0x71e16e49b717b851ced8347cf0dfa8f490bfb826323b9af624a66285dc99672",
|
|
|
|
|
- "0x47cdde8952945c13460f9129644eade096100810fba59de05452b34aacecff6",
|
|
|
|
|
- 220844,
|
|
|
|
|
|
|
+ config.account.api_key.as_str(),
|
|
|
|
|
+ config.account.stark_public_key.as_str(),
|
|
|
|
|
+ config.account.stark_private_key.as_str(),
|
|
|
|
|
+ config.account.vault_number,
|
|
|
);
|
|
);
|
|
|
- let is_testnet = false;
|
|
|
|
|
|
|
+ let is_testnet = config.network.is_testnet;
|
|
|
|
|
|
|
|
// 订阅数据的客户端
|
|
// 订阅数据的客户端
|
|
|
let stream_client_list = vec![
|
|
let stream_client_list = vec![
|
|
@@ -118,7 +130,7 @@ pub async fn run_extended_subscriptions(running: Arc<AtomicBool>) -> Result<()>
|
|
|
let data_manager_am = Arc::new(Mutex::new(data_manager));
|
|
let data_manager_am = Arc::new(Mutex::new(data_manager));
|
|
|
|
|
|
|
|
// 策略执行
|
|
// 策略执行
|
|
|
- let strategy = Strategy::new(rest_client_am.clone());
|
|
|
|
|
|
|
+ let strategy = Strategy::new(rest_client_am.clone(), &config.strategy);
|
|
|
let strategy_am = Arc::new(Mutex::new(strategy));
|
|
let strategy_am = Arc::new(Mutex::new(strategy));
|
|
|
|
|
|
|
|
// 异步去订阅、并阻塞
|
|
// 异步去订阅、并阻塞
|