|
|
@@ -177,7 +177,7 @@ impl Strategy {
|
|
|
max_pos_rate: Default::default(),
|
|
|
profit: Default::default(),
|
|
|
daily_return: Default::default(),
|
|
|
- adjust_lever_rate: dec!(1),
|
|
|
+ adjust_lever_rate: Decimal::ONE,
|
|
|
lever_rate: Default::default(),
|
|
|
long_pos_bias: Default::default(),
|
|
|
short_pos_bias: Default::default(),
|
|
|
@@ -205,7 +205,7 @@ impl Strategy {
|
|
|
}
|
|
|
// 杠杆比例处理
|
|
|
if strategy.exchange.contains("spot") {
|
|
|
- strategy.lever_rate = min(params.lever_rate, dec!(1));
|
|
|
+ strategy.lever_rate = min(params.lever_rate, Decimal::ONE);
|
|
|
}
|
|
|
// 各类时间戳
|
|
|
let now = Utc::now();
|
|
|
@@ -226,7 +226,7 @@ impl Strategy {
|
|
|
strategy.limit_order_requests_num = utils::get_limit_order_requests_num_per_second(params.exchange.clone(), params.place_order_limit) * (request_limit_check_interval_per_second);
|
|
|
// 开仓下单间隔 均匀下单机会
|
|
|
strategy.post_open_time = now.timestamp_millis();
|
|
|
- let post_open_interval_per_second = dec!(1).div(Decimal::from_i64(utils::get_limit_order_requests_num_per_second(params.exchange.clone(), 0)).unwrap());
|
|
|
+ let post_open_interval_per_second = Decimal::ONE.div(Decimal::from_i64(utils::get_limit_order_requests_num_per_second(params.exchange.clone(), 0)).unwrap());
|
|
|
strategy.post_open_interval = dec!(1000).mul(post_open_interval_per_second).to_i64().unwrap();
|
|
|
// 初始化日志订阅者
|
|
|
let sub = tracing_subscriber::fmt()
|
|
|
@@ -265,7 +265,7 @@ impl Strategy {
|
|
|
self.ap = trader_msg.market[global::public_params::ASK_PRICE_INDEX];
|
|
|
self.mp = (self.bp + self.ap) * dec!(0.5);
|
|
|
// 中间价的ema值处理
|
|
|
- if self.mp_ema.eq(&dec!(0)) {
|
|
|
+ if self.mp_ema.eq(&Decimal::ZERO) {
|
|
|
self.mp_ema = self.mp;
|
|
|
} else {
|
|
|
self.mp_ema = self.mp_ema * dec!(0.999) + self.mp * dec!(0.001);
|
|
|
@@ -274,7 +274,7 @@ impl Strategy {
|
|
|
|
|
|
// 动态杠杆调节
|
|
|
if self.mp > self.mp_ema {
|
|
|
- self.adjust_lever_rate = dec!(1);
|
|
|
+ self.adjust_lever_rate = Decimal::ONE;
|
|
|
} else {
|
|
|
self.adjust_lever_rate = dec!(0.8);
|
|
|
}
|
|
|
@@ -333,13 +333,13 @@ impl Strategy {
|
|
|
self.total_amount = self.equity * self.lever_rate * self.adjust_lever_rate / self.mp;
|
|
|
self.total_amount = utils::fix_amount(self.total_amount, self.step_size);
|
|
|
trace!(?self.total_amount);
|
|
|
- if self.total_amount.eq(&dec!(0)) {
|
|
|
+ if self.total_amount.eq(&Decimal::ZERO) {
|
|
|
error!("总可开数量太少!equity={}, lever_rate={}, adjust_lever_rate={}", self.equity, self.lever_rate, self.adjust_lever_rate);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
// 求最大pos
|
|
|
- if self.equity > dec!(0) {
|
|
|
+ if self.equity > Decimal::ZERO {
|
|
|
let max_pos_rate = max(self.pos.long_pos, self.pos.short_pos) * self.mp / self.equity;
|
|
|
if max_pos_rate > self.max_pos_rate {
|
|
|
self.max_pos_rate = max_pos_rate;
|
|
|
@@ -401,10 +401,10 @@ impl Strategy {
|
|
|
let mut sell_start = mp;
|
|
|
let mut avoid = min(dec!(0.0005), close * dec!(0.5));
|
|
|
let mut close_dist = vec![
|
|
|
- buy_start * (dec!(1) + predict - close + avoid), // buy upper
|
|
|
- buy_start * (dec!(1) + predict - close - avoid), // buy lower
|
|
|
- sell_start * (dec!(1) + predict + close - avoid), // sell lower
|
|
|
- sell_start * (dec!(1) + predict + close + avoid), // sell upper
|
|
|
+ buy_start * (Decimal::ONE + predict - close + avoid), // buy upper
|
|
|
+ buy_start * (Decimal::ONE + predict - close - avoid), // buy lower
|
|
|
+ sell_start * (Decimal::ONE + predict + close - avoid), // sell lower
|
|
|
+ sell_start * (Decimal::ONE + predict + close + avoid), // sell upper
|
|
|
];
|
|
|
trace!(?mp, ?buy_start, ?sell_start, ?avoid, ?close_dist);
|
|
|
|
|
|
@@ -426,13 +426,13 @@ impl Strategy {
|
|
|
// 开仓相关
|
|
|
avoid = min(dec!(0.001), open * dec!(0.05));
|
|
|
// 持仓偏移
|
|
|
- let buy_shift = dec!(1) + pos_rate[0] * grid;
|
|
|
- let sell_shift = dec!(1) + pos_rate[1] * grid;
|
|
|
+ let buy_shift = Decimal::ONE + pos_rate[0] * grid;
|
|
|
+ let sell_shift = Decimal::ONE + pos_rate[1] * grid;
|
|
|
let mut open_dist = vec![
|
|
|
- buy_start * (dec!(1) + predict - open * buy_shift + avoid), // buy upper
|
|
|
- buy_start * (dec!(1) + predict - open * buy_shift - avoid), // buy lower
|
|
|
- sell_start * (dec!(1) + predict + open * sell_shift - avoid), // sell lower
|
|
|
- sell_start * (dec!(1) + predict + open * sell_shift + avoid), // sell upper
|
|
|
+ buy_start * (Decimal::ONE + predict - open * buy_shift + avoid), // buy upper
|
|
|
+ buy_start * (Decimal::ONE + predict - open * buy_shift - avoid), // buy lower
|
|
|
+ sell_start * (Decimal::ONE + predict + open * sell_shift - avoid), // sell lower
|
|
|
+ sell_start * (Decimal::ONE + predict + open * sell_shift + avoid), // sell upper
|
|
|
];
|
|
|
trace!(?avoid, ?buy_shift, ?sell_shift, ?avoid, ?open_dist);
|
|
|
|
|
|
@@ -606,12 +606,12 @@ impl Strategy {
|
|
|
pub fn _pos_rate(&mut self) {
|
|
|
trace!(?self);
|
|
|
|
|
|
- if self.max_long_value > dec!(0) {
|
|
|
+ if self.max_long_value > Decimal::ZERO {
|
|
|
self.long_hold_rate = self.long_hold_value / self.max_long_value;
|
|
|
trace!(?self.long_hold_rate);
|
|
|
}
|
|
|
|
|
|
- if self.max_short_value > dec!(0) {
|
|
|
+ if self.max_short_value > Decimal::ZERO {
|
|
|
self.short_hold_rate = self.short_hold_value / self.max_short_value;
|
|
|
trace!(?self.short_hold_rate);
|
|
|
}
|
|
|
@@ -667,8 +667,8 @@ impl Strategy {
|
|
|
#[instrument(skip(self, command), level="TRACE")]
|
|
|
pub fn _close_all(&self, command: &mut OrderCommand) {
|
|
|
// 撤掉全部挂单
|
|
|
- let mut pd_amount = dec!(0);
|
|
|
- let mut pk_amount = dec!(0);
|
|
|
+ let mut pd_amount = Decimal::ZERO;
|
|
|
+ let mut pk_amount = Decimal::ZERO;
|
|
|
trace!(?self.local_orders);
|
|
|
for client_id in self.local_orders.keys() {
|
|
|
let order = self.local_orders.get(client_id).unwrap();
|
|
|
@@ -741,7 +741,7 @@ impl Strategy {
|
|
|
}
|
|
|
|
|
|
let pre_hot:i64 = 10 * 1000;
|
|
|
- if !self.mp.eq(&dec!(0)) && self.local_time - self.local_start_time > pre_hot {
|
|
|
+ if !self.mp.eq(&Decimal::ZERO) && self.local_time - self.local_start_time > pre_hot {
|
|
|
self.is_ready = true;
|
|
|
trace!(?self.mp, ?self.local_time, ?self.local_start_time, ?pre_hot);
|
|
|
info!("策略预热完毕,可以执行后续逻辑!")
|
|
|
@@ -763,9 +763,9 @@ impl Strategy {
|
|
|
pub fn _post_close(&self, command: &mut OrderCommand) {
|
|
|
trace!(?command);
|
|
|
|
|
|
- let mut pd_amount = dec!(0);
|
|
|
+ let mut pd_amount = Decimal::ZERO;
|
|
|
let mut pd_order_num = 0;
|
|
|
- let mut pk_amount = dec!(0);
|
|
|
+ let mut pk_amount = Decimal::ZERO;
|
|
|
let mut pk_order_num = 0;
|
|
|
// 各类价格
|
|
|
let long_upper = self.close_dist[0];
|
|
|
@@ -867,7 +867,7 @@ impl Strategy {
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
- if self.pos.long_pos > dec!(0) {
|
|
|
+ if self.pos.long_pos > Decimal::ZERO {
|
|
|
let mut price = (short_lower + short_upper) * dec!(0.5);
|
|
|
price = utils::clip(price, self.bp * dec!(0.9995), self.ap * dec!(1.03));
|
|
|
price = utils::fix_price(price, self.tick_size);
|
|
|
@@ -885,7 +885,7 @@ impl Strategy {
|
|
|
trace!(?command);
|
|
|
}
|
|
|
|
|
|
- if self.pos.short_pos > dec!(0) {
|
|
|
+ if self.pos.short_pos > Decimal::ZERO {
|
|
|
let mut price = (long_upper + long_lower) * dec!(0.5);
|
|
|
price = utils::clip(price, self.bp * dec!(0.97), self.ap * dec!(1.0005));
|
|
|
price = utils::fix_price(price, self.tick_size);
|
|
|
@@ -1005,8 +1005,8 @@ impl Strategy {
|
|
|
// 获取当前挂单价值
|
|
|
let mut buy_price_list: Vec<Decimal> = vec![];
|
|
|
let mut sell_price_list: Vec<Decimal> = vec![];
|
|
|
- let mut buy_value = dec!(0);
|
|
|
- let mut sell_value = dec!(0);
|
|
|
+ let mut buy_value = Decimal::ZERO;
|
|
|
+ let mut sell_value = Decimal::ZERO;
|
|
|
for client_id in self.local_orders.keys() {
|
|
|
let order = self.local_orders.get(client_id).unwrap();
|
|
|
if order.side == "kd".to_string() {
|
|
|
@@ -1184,11 +1184,11 @@ mod tests {
|
|
|
fee: Default::default(),
|
|
|
});
|
|
|
trader_msg.cash = dec!(1000);
|
|
|
- trader_msg.coin = dec!(0);
|
|
|
+ trader_msg.coin = Decimal::ZERO;
|
|
|
|
|
|
strategy.is_ready = true;
|
|
|
strategy.equity = dec!(1000);
|
|
|
- strategy.lever_rate = dec!(1);
|
|
|
+ strategy.lever_rate = Decimal::ONE;
|
|
|
|
|
|
trace!("{:?}", strategy.on_time(&trader_msg));
|
|
|
}
|