utils.rs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. use std::ops::{Div, Mul};
  2. use std::time::{SystemTime, UNIX_EPOCH};
  3. use rand::Rng;
  4. use rust_decimal::Decimal;
  5. pub const LEVEL: usize = 1;
  6. pub const TRADE_LENGTH: usize = 2; // 推测应该是交易交易所的数据长度
  7. pub const LENGTH: usize = LEVEL * 4 + TRADE_LENGTH; // 市场数据汇总的总长度
  8. // pub const BID_PRICE_INDEX: usize = LEVEL * 0; // 买入价格下标
  9. // pub const BID_QUANTITY_INDEX: usize = LEVEL * 0 + 1; // 买入数量下标
  10. // pub const ASK_PRICE_INDEX: usize = LEVEL * 2; // 卖出价格下标
  11. // pub const ASK_QUANTITY_INDEX: usize = LEVEL * 2 + 1; // 卖出数量下标
  12. // // 上面是市场数据汇总的下标相关
  13. // pub const MARKET_DELAY_LIMIT: i64 = 30*1000; // 市场信息延迟限制(单位:毫秒)
  14. // pub const GRID: i64 = 1; // 策略资金分成多少份
  15. // pub const STOP_LOSS: Decimal = dec!(0.02); // 风控止损比例,0.02代表2%,是原文的STOPLOSS
  16. // pub const GAMMA: Decimal = dec!(0.999); // gamma默认值
  17. // pub const EFF_RANGE: Decimal = dec!(0.001); // 每1权重需要多少价格距离,0.001代表0.1%,每0.1%代表1权重
  18. // 生成订单的id,可以根据交易所名字来
  19. pub fn generate_client_id(mut exchange_name_some: Option<&str>) -> String {
  20. // 交易所名字获取
  21. let exchange_name = exchange_name_some.unwrap_or("");
  22. // 随机时间戳,作为订单id的前列
  23. let start = SystemTime::now();
  24. let since_the_epoch = start
  25. .duration_since(UNIX_EPOCH)
  26. .expect("Time went backwards");
  27. let in_ms = since_the_epoch.as_millis(); // 或者你可以使用 as_secs 获取秒
  28. let time_str = in_ms.to_string();
  29. let time_slice = &time_str[4..10];
  30. // 0-1000的随机数
  31. let rand_num = rand::thread_rng().gen_range(1..1000);
  32. let result = format!("{}{}{}", time_slice, rand_num, exchange_name);
  33. return result;
  34. }
  35. // 大小限定:将num限定在lower_limit和upper_limit范围内
  36. pub fn clip(num: Decimal, lower_limit: Decimal, upper_limit: Decimal) -> Decimal {
  37. if num.ge(&upper_limit) {
  38. return upper_limit;
  39. }
  40. if num.le(&lower_limit) {
  41. return lower_limit;
  42. }
  43. num
  44. }
  45. // 步长修复数量
  46. pub fn fix_amount(amount: Decimal, step_size: Decimal) -> Decimal {
  47. // 思路:做除法后取整,然后使用这个值乘以步长
  48. amount.div(step_size).floor().mul(step_size)
  49. }
  50. // 步长修复价格
  51. pub fn fix_price(amount: Decimal, tick_size: Decimal) -> Decimal {
  52. // 思路:做除法后四舍五入,然后使用这个值乘以步长
  53. amount.div(tick_size).round().mul(tick_size)
  54. }
  55. #[cfg(test)]
  56. mod tests {
  57. use rust_decimal_macros::dec;
  58. use crate::utils::{clip, fix_amount, fix_price, generate_client_id};
  59. #[test]
  60. fn clip_test() {
  61. let num = dec!(11);
  62. let num2 = dec!(2);
  63. let lower_limit = dec!(3);
  64. let upper_limit = dec!(6);
  65. println!("mum: {}", clip(num, lower_limit, upper_limit));
  66. println!("mum2: {}", clip(num, lower_limit, upper_limit));
  67. }
  68. #[test]
  69. fn generate_client_id_test() {
  70. println!("{}", generate_client_id(None));
  71. println!("{}", generate_client_id(Some("binance")));
  72. }
  73. #[test]
  74. fn fix_amount_test() {
  75. println!("{}", fix_amount(dec!(0.9), dec!(0.04)));
  76. println!("{}", fix_amount(dec!(1.0), dec!(0.1)));
  77. println!("{}", fix_amount(dec!(0.9), dec!(0.05)));
  78. println!("{}", fix_amount(dec!(1), dec!(0.1)));
  79. println!("{}", fix_amount(dec!(0.01), dec!(0.05)));
  80. }
  81. #[test]
  82. fn fix_price_test() {
  83. println!("{}", fix_price(dec!(1), dec!(0.1)));
  84. println!("{}", fix_price(dec!(0.9), dec!(2.0)));
  85. println!("{}", fix_price(dec!(1.1), dec!(0.1)));
  86. println!("{}", fix_price(dec!(1.2), dec!(0.5)));
  87. println!("{}", fix_price(dec!(4999.99), dec!(0.5)));
  88. }
  89. }