|
|
@@ -1,6 +1,7 @@
|
|
|
use std::cmp::{max, min};
|
|
|
use std::collections::HashMap;
|
|
|
use std::ops::{Div, Mul};
|
|
|
+use std::str::FromStr;
|
|
|
use chrono::Utc;
|
|
|
use rust_decimal::Decimal;
|
|
|
use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
|
|
|
@@ -294,9 +295,8 @@ impl Strategy {
|
|
|
|
|
|
// 参考价格
|
|
|
if trader_msg.ref_price.len() == 0 {
|
|
|
- self.ref_bp = self.bp;
|
|
|
- self.ref_ap = self.ap;
|
|
|
- self.ref_price = self.mp;
|
|
|
+ debug!("参考价格还未预热完成,等待预热...");
|
|
|
+ return false;
|
|
|
} else {
|
|
|
self.ref_bp = trader_msg.ref_price[self.ref_index][0];
|
|
|
self.ref_ap = trader_msg.ref_price[self.ref_index][1];
|
|
|
@@ -473,6 +473,17 @@ impl Strategy {
|
|
|
let grid = self.grid;
|
|
|
let mode = self.maker_mode.clone();
|
|
|
|
|
|
+ // let mut mp = (ref_bp + ref_ap) * dec!(0.5);
|
|
|
+ // let mut buy_start = ref_bp;
|
|
|
+ // let mut sell_start = ref_ap;
|
|
|
+ // let mut avoid = min(dec!(0.0005), close * dec!(0.5));
|
|
|
+ // let mut close_dist = vec![
|
|
|
+ // buy_start , // buy upper
|
|
|
+ // buy_start , // buy lower
|
|
|
+ // sell_start , // sell lower
|
|
|
+ // sell_start , // sell upper
|
|
|
+ // ];
|
|
|
+
|
|
|
// 平仓相关
|
|
|
let mut mp = (ref_bp + ref_ap) * dec!(0.5);
|
|
|
let mut buy_start = mp;
|
|
|
@@ -515,6 +526,14 @@ impl Strategy {
|
|
|
];
|
|
|
debug!(?avoid, ?buy_shift, ?sell_shift, ?avoid, ?open_dist);
|
|
|
|
|
|
+
|
|
|
+ // let mut open_dist = vec![
|
|
|
+ // ref_bp , // buy upper
|
|
|
+ // ref_bp , // buy lower
|
|
|
+ // ref_ap , // sell lower
|
|
|
+ // ref_ap , // sell upper
|
|
|
+ // ];
|
|
|
+ // debug!(?open_dist);
|
|
|
// 修复价格
|
|
|
for open_price in &mut open_dist {
|
|
|
*open_price = utils::fix_price(*open_price, self.tick_size);
|
|
|
@@ -950,9 +969,22 @@ impl Strategy {
|
|
|
price.to_string(),
|
|
|
order_client_id.clone()
|
|
|
];
|
|
|
-
|
|
|
command.limits_close.insert(order_client_id, order.clone());
|
|
|
|
|
|
+ // 定价止损平仓单
|
|
|
+ let mut price_limit = self.pos.long_avg * Decimal::from_str("0.995").unwrap();
|
|
|
+ price_limit = utils::fix_price(price_limit, self.tick_size);
|
|
|
+
|
|
|
+ let order_client_limit_id = utils::generate_client_id(Some(self.broker_id.clone()));
|
|
|
+ let order_limit = vec![
|
|
|
+ self.pos.long_pos.to_string(),
|
|
|
+ "pd".to_string(),
|
|
|
+ price_limit.to_string(),
|
|
|
+ order_client_limit_id.clone()
|
|
|
+ ];
|
|
|
+
|
|
|
+ command.limits_close.insert(order_client_limit_id, order_limit.clone());
|
|
|
+ info!(?command);
|
|
|
debug!(?command);
|
|
|
}
|
|
|
}
|
|
|
@@ -973,6 +1005,20 @@ impl Strategy {
|
|
|
|
|
|
command.limits_close.insert(order_client_id, order.clone());
|
|
|
|
|
|
+ // 定价止损平仓单
|
|
|
+ let mut price_limit = self.pos.short_avg * Decimal::from_str("1.005").unwrap();
|
|
|
+ price_limit = utils::fix_price(price_limit, self.tick_size);
|
|
|
+
|
|
|
+ let order_client_limit_id = utils::generate_client_id(Some(self.broker_id.clone()));
|
|
|
+ let order_limit = vec![
|
|
|
+ self.pos.short_pos.to_string(),
|
|
|
+ "pk".to_string(),
|
|
|
+ price_limit.to_string(),
|
|
|
+ order_client_limit_id.clone()
|
|
|
+ ];
|
|
|
+
|
|
|
+ command.limits_close.insert(order_client_limit_id, order_limit.clone());
|
|
|
+ info!(?command);
|
|
|
debug!(?command);
|
|
|
}
|
|
|
}
|