|
@@ -104,7 +104,6 @@ impl Bot {
|
|
|
}
|
|
}
|
|
|
// 5.计算gamma值
|
|
// 5.计算gamma值
|
|
|
let gamma = calc_gamma(max_spread, q, last_std);
|
|
let gamma = calc_gamma(max_spread, q, last_std);
|
|
|
-
|
|
|
|
|
// 6.生成等差数列
|
|
// 6.生成等差数列
|
|
|
let rl = Array::linspace(self.rl_start, self.rl_end, 50).into_owned();
|
|
let rl = Array::linspace(self.rl_start, self.rl_end, 50).into_owned();
|
|
|
let mut rl_list: Vec<RiskLevel> = Vec::new();
|
|
let mut rl_list: Vec<RiskLevel> = Vec::new();
|
|
@@ -113,26 +112,24 @@ impl Bot {
|
|
|
let dd = calc_deviation_range(self.rl_end, &self.spread_list, *i);
|
|
let dd = calc_deviation_range(self.rl_end, &self.spread_list, *i);
|
|
|
// 8.获取Reservation price 预定价格
|
|
// 8.获取Reservation price 预定价格
|
|
|
let rp = calc_rp(self.mid_price, q, *i, gamma, last_std);
|
|
let rp = calc_rp(self.mid_price, q, *i, gamma, last_std);
|
|
|
-
|
|
|
|
|
if (rp + 0.5 * dd) < self.ask || (rp - 0.5 * dd) > self.bid {
|
|
if (rp + 0.5 * dd) < self.ask || (rp - 0.5 * dd) > self.bid {
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
// 9.获取dk,用于计算e的dk次方
|
|
// 9.获取dk,用于计算e的dk次方
|
|
|
let dk = calc_dk(dd, gamma, last_std, *i);
|
|
let dk = calc_dk(dd, gamma, last_std, *i);
|
|
|
-
|
|
|
|
|
// 10.获取kappa
|
|
// 10.获取kappa
|
|
|
let kappa = calc_kappa(gamma, dk, dd, *i);
|
|
let kappa = calc_kappa(gamma, dk, dd, *i);
|
|
|
-
|
|
|
|
|
// 11.获取theta
|
|
// 11.获取theta
|
|
|
let cal_theta = calc_theta(gamma, last_std, kappa, *i);
|
|
let cal_theta = calc_theta(gamma, last_std, kappa, *i);
|
|
|
// 交易数量
|
|
// 交易数量
|
|
|
let order_amount = calc_order_amount(self.rl_end, *i, q, self.quantity_max, self.bid, self.amount_decimal_places);
|
|
let order_amount = calc_order_amount(self.rl_end, *i, q, self.quantity_max, self.bid, self.amount_decimal_places);
|
|
|
|
|
+ let order_info_map_len_f64 = self.order_info_map.len().to_f64().unwrap_or(0.0);
|
|
|
let rl_info = RiskLevel{
|
|
let rl_info = RiskLevel{
|
|
|
gamma: gamma*i,
|
|
gamma: gamma*i,
|
|
|
mid_price: self.mid_price,
|
|
mid_price: self.mid_price,
|
|
|
rp,
|
|
rp,
|
|
|
theta_a_b_half: 0.5*dd,
|
|
theta_a_b_half: 0.5*dd,
|
|
|
- bid: rp - cal_theta,
|
|
|
|
|
|
|
+ bid: rp - cal_theta*(order_info_map_len_f64 + 1.0f64), // TODO 库存越大,买单越远,使其成交概率降低,有利于去库存
|
|
|
bid_best: self.bid,
|
|
bid_best: self.bid,
|
|
|
ask: rp + cal_theta,
|
|
ask: rp + cal_theta,
|
|
|
ask_best: self.ask,
|
|
ask_best: self.ask,
|
|
@@ -155,9 +152,9 @@ impl Bot {
|
|
|
// 防止有手续费的账户导致的余额小于实际下单数额
|
|
// 防止有手续费的账户导致的余额小于实际下单数额
|
|
|
let order_amount = f64::min(balance_info.stocks, order_info.amount);
|
|
let order_amount = f64::min(balance_info.stocks, order_info.amount);
|
|
|
let id = self.exchange.place_okx_order(&self.symbol, &"sell".to_string(), &"limit".to_string(), &order.sell_price.to_string(), &order_amount.to_string()).await.unwrap();
|
|
let id = self.exchange.place_okx_order(&self.symbol, &"sell".to_string(), &"limit".to_string(), &order.sell_price.to_string(), &order_amount.to_string()).await.unwrap();
|
|
|
|
|
+ eprintln!("委托限价卖单id: {}, 交易对:{}, 数量:{}, 价格:{}", id, self.symbol, order_amount, order.sell_price);
|
|
|
// 清除已处理订单数据
|
|
// 清除已处理订单数据
|
|
|
self.order_info_map.remove(&*order_info.id);
|
|
self.order_info_map.remove(&*order_info.id);
|
|
|
- eprintln!("委托限价卖单id: {}, 交易对:{}, 数量:{}, 价格:{}", id, self.symbol, order_amount, &order.sell_price);
|
|
|
|
|
}
|
|
}
|
|
|
eprintln!("----------------------------------------------------------------------------------------------------------------\n\n");
|
|
eprintln!("----------------------------------------------------------------------------------------------------------------\n\n");
|
|
|
}
|
|
}
|
|
@@ -175,6 +172,8 @@ impl Bot {
|
|
|
// eprintln!("order_info: {:?}", order_info);
|
|
// eprintln!("order_info: {:?}", order_info);
|
|
|
// 未成交 && 超时
|
|
// 未成交 && 超时
|
|
|
if !order_info.status.eq("filled") && order.time_num + self.cancel_time_limit < now_time {
|
|
if !order_info.status.eq("filled") && order.time_num + self.cancel_time_limit < now_time {
|
|
|
|
|
+ eprintln!("----------------------------------------------------------------------------------------------------------------");
|
|
|
|
|
+ eprintln!("订单{}秒内未成交,执行取消逻辑,订单下单时间:{}, 现在时间: {}", self.cancel_time_limit, order.time_num, now_time);
|
|
|
let is_success = match self.exchange.cancel_okx_order(&self.symbol, &order.id).await {
|
|
let is_success = match self.exchange.cancel_okx_order(&self.symbol, &order.id).await {
|
|
|
Ok(m) => m,
|
|
Ok(m) => m,
|
|
|
Err(error) => {
|
|
Err(error) => {
|
|
@@ -183,7 +182,8 @@ impl Bot {
|
|
|
};
|
|
};
|
|
|
next_list.push((*key.clone()).parse().unwrap());
|
|
next_list.push((*key.clone()).parse().unwrap());
|
|
|
// 取消订单,可以在这里执行取消订单的操作
|
|
// 取消订单,可以在这里执行取消订单的操作
|
|
|
- eprintln!("是否成功:{}, 取消订单: {}, 订单下单时间:{}, 现在时间: {}", is_success, order.id, order.time_num, now_time);
|
|
|
|
|
|
|
+ eprintln!("是否取消成功:{}, 订单id: {}", is_success, order.id);
|
|
|
|
|
+ eprintln!("----------------------------------------------------------------------------------------------------------------\n\n");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
// 清除已处理订单数据
|
|
// 清除已处理订单数据
|
|
@@ -221,7 +221,7 @@ impl Bot {
|
|
|
self.order_list_deal().await.expect("订单信息处理异常!");
|
|
self.order_list_deal().await.expect("订单信息处理异常!");
|
|
|
|
|
|
|
|
// 2.获取最新k线
|
|
// 2.获取最新k线
|
|
|
- let k_line_data = match exchange.get_binance_klines(&self.symbol.to_string(), &self.short_interval, &200).await {
|
|
|
|
|
|
|
+ let k_line_data = match exchange.get_binance_klines(&self.symbol.to_string(), &self.short_interval, &200).await {
|
|
|
Ok(m) => m,
|
|
Ok(m) => m,
|
|
|
Err(error) => {
|
|
Err(error) => {
|
|
|
return Err(error);
|
|
return Err(error);
|
|
@@ -254,8 +254,12 @@ impl Bot {
|
|
|
sell_price: order_dict.sell_price,
|
|
sell_price: order_dict.sell_price,
|
|
|
time_num: now_time
|
|
time_num: now_time
|
|
|
};
|
|
};
|
|
|
- eprintln!("buy_order: {:?}", order);
|
|
|
|
|
- eprintln!("rl_obj: {:?}", rl_list.get(index));
|
|
|
|
|
|
|
+ eprintln!("----------------------------------------------------------------------------------------------------------------");
|
|
|
|
|
+ eprintln!("新的限价买单,id:{}, bid:{}, ask:{}, amount:{}", order.id, order_dict.buy_price, order_dict.sell_price, order_dict.order_amount);
|
|
|
|
|
+ eprintln!("order: {:?}", order_dict);
|
|
|
|
|
+ eprintln!("rl: {:?}", rl_list.get(index));
|
|
|
|
|
+ eprintln!("----------------------------------------------------------------------------------------------------------------\n\n");
|
|
|
|
|
+ // 为什么要用map:数组访问是O(n)的时间复杂度,而map是O(1)的时间复杂度
|
|
|
self.order_info_map.insert(buy_order_id, order);
|
|
self.order_info_map.insert(buy_order_id, order);
|
|
|
self.last_buy_time = now_time;
|
|
self.last_buy_time = now_time;
|
|
|
|
|
|