Ver Fonte

整合文件目录

JiahengHe há 11 meses atrás
pai
commit
ad0d0e89be
65 ficheiros alterados com 489 adições e 4652 exclusões
  1. 21 12
      Cargo.toml
  2. 0 2
      exchanges/.gitignore
  3. 0 1088
      exchanges/Cargo.lock
  4. 0 52
      exchanges/Cargo.toml
  5. 0 32
      exchanges/README.md
  6. 0 9
      exchanges/src/lib.rs
  7. 0 9
      exchanges/src/utils.rs
  8. 0 92
      exchanges/src/xlsx_utils.rs
  9. 0 181
      exchanges/tests/gate_swap_test.rs
  10. 0 547
      exchanges/tests/test.rs
  11. 0 229
      exchanges/tests/xlsx_test.rs
  12. 0 5
      global/.gitignore
  13. 0 28
      global/Cargo.toml
  14. 0 38
      global/src/export_utils.rs
  15. 0 10
      global/src/lib.rs
  16. 0 33
      global/tests/appender_test.rs
  17. 0 12
      global/tests/export_utils_test.rs
  18. 0 10
      global/tests/get_account_info_test.rs
  19. 0 0
      src/account_info.rs
  20. 0 0
      src/cci.rs
  21. 14 27
      src/clear_core.rs
  22. 5 6
      src/clear_core_libs.rs
  23. 23 25
      src/clear_log_utils.rs
  24. 0 0
      src/clear_position_result.rs
  25. 28 203
      src/core.rs
  26. 9 35
      src/core_libs.rs
  27. 6 6
      src/exchange.rs
  28. 3 4
      src/exchange_disguise.rs
  29. 40 42
      src/gate_swap.rs
  30. 3 3
      src/gate_swap_handle.rs
  31. 2 2
      src/gate_swap_rest.rs
  32. 0 1
      src/gate_swap_ws.rs
  33. 12 11
      src/gate_usdt_swap.rs
  34. 9 9
      src/handle_info.rs
  35. 0 0
      src/http_tool.rs
  36. 23 25
      src/log_utils.rs
  37. 35 30
      src/main.rs
  38. 148 169
      src/model.rs
  39. 0 0
      src/params.rs
  40. 0 0
      src/proxy.rs
  41. 0 0
      src/public_params.rs
  42. 0 0
      src/response_base.rs
  43. 1 1
      src/server.rs
  44. 2 3
      src/socket_tool.rs
  45. 41 63
      src/strategy.rs
  46. 0 0
      src/trace_stack.rs
  47. 0 0
      src/trade.rs
  48. 64 1
      src/utils.rs
  49. 0 5
      standard/.gitignore
  50. 0 7
      standard/Cargo.lock
  51. 0 23
      standard/Cargo.toml
  52. 0 15
      standard/README.md
  53. 0 113
      standard/src/gate_spot.rs
  54. 0 61
      standard/src/utils.rs
  55. 0 662
      standard/tests/exchange_test.rs
  56. 0 92
      standard/tests/gate_handle_test.rs
  57. 0 279
      standard/tests/gate_swap_test.rs
  58. 0 2
      strategy/.gitignore
  59. 0 26
      strategy/Cargo.toml
  60. 0 15
      strategy/README.md
  61. 0 24
      strategy/config.toml
  62. 0 7
      strategy/src/lib.rs
  63. 0 183
      strategy/src/model.rs
  64. 0 54
      strategy/tests/decimal_test.rs
  65. 0 29
      strategy/tests/f64_test.rs

+ 21 - 12
Cargo.toml

@@ -6,27 +6,36 @@ edition = "2021"
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-strategy = {path="./strategy"}
-standard = { path="./standard" }
-#exchanges = { path="./exchanges" }
-global = { path="./global" }
 tokio = { version = "1.31.0", features = ["full"] }
 chrono = "0.4.26"
 tracing = "0.1"
-#tracing-subscriber = { version = "0.3.17", features = ["env-filter"] }
 tracing-appender-timezone = { git = "https://github.com/skyfffire/tracing-appender-timezone.git" }
 serde = { version = "1.0.188", features = ["derive"] }
-#actix-rt = "2.5.0"
 actix-web = "4.0.0-beta.12"
 ctrlc = "3.2.5"
 serde_json = "1.0.105"
-#rust_decimal = { version = "1.32.0", features = ["maths"] }
-#rust_decimal_macros = "1.32.0"
+rust_decimal = { version = "1.32.0", features = ["maths"] }
+rust_decimal_macros = "1.32.0"
+rand = "0.8.5"
+futures-channel = "0.3.29"
+serde_derive = "1.0.190"
+futures = "0.3"
+reqwest = { version = "0.11.14", features = ["json"] }
+hex = "0.4"
+hmac = "0.8.1"
+sha2 = "0.9.8"
+base64 = "0.13"
+tokio-tungstenite= { git = "https://github.com/HonestHouLiang/tokio-tungstenite.git",rev = "208fc9b09bcc2e2c8cb52e1cde5087446464fc91"  }
+ring = "0.16.20"
+futures-util = { version = "0.3.28", default-features = false, features = ["sink", "std"] }
+toml = "0.5.11"
+time = { version = "0.3.7", features = ["macros"] }
+tracing-subscriber = { version = "0.3.17", features = [
+    "env-filter",
+    "time",
+    "local-time"
+] }
 
 [workspace]
 members=[
-    "exchanges",
-    "standard",
-    "strategy",
-    "global"
 ]

+ 0 - 2
exchanges/.gitignore

@@ -1,2 +0,0 @@
-/target
-/.idea

+ 0 - 1088
exchanges/Cargo.lock

@@ -1,1088 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 3
-
-[[package]]
-name = "addr2line"
-version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
-dependencies = [
- "gimli",
-]
-
-[[package]]
-name = "adler"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
-
-[[package]]
-name = "android-tzdata"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
-
-[[package]]
-name = "android_system_properties"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "autocfg"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
-
-[[package]]
-name = "backtrace"
-version = "0.3.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
-dependencies = [
- "addr2line",
- "cc",
- "cfg-if",
- "libc",
- "miniz_oxide",
- "object",
- "rustc-demangle",
-]
-
-[[package]]
-name = "base64"
-version = "0.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
-
-[[package]]
-name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "bitflags"
-version = "2.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
-
-[[package]]
-name = "block-buffer"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "bumpalo"
-version = "3.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"
-
-[[package]]
-name = "byteorder"
-version = "1.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
-
-[[package]]
-name = "bytes"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
-
-[[package]]
-name = "cc"
-version = "1.0.83"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-
-[[package]]
-name = "chrono"
-version = "0.4.28"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95ed24df0632f708f5f6d8082675bef2596f7084dee3dd55f632290bf35bfe0f"
-dependencies = [
- "android-tzdata",
- "iana-time-zone",
- "js-sys",
- "num-traits",
- "time",
- "wasm-bindgen",
- "windows-targets",
-]
-
-[[package]]
-name = "core-foundation"
-version = "0.9.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
-[[package]]
-name = "core-foundation-sys"
-version = "0.8.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
-
-[[package]]
-name = "cpufeatures"
-version = "0.2.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "digest"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "errno"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd"
-dependencies = [
- "errno-dragonfly",
- "libc",
- "windows-sys",
-]
-
-[[package]]
-name = "errno-dragonfly"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
-dependencies = [
- "cc",
- "libc",
-]
-
-[[package]]
-name = "exchanges"
-version = "0.1.0"
-dependencies = [
- "base64",
- "chrono",
- "serde_json",
- "tokio",
- "tungstenite",
- "url",
-]
-
-[[package]]
-name = "fastrand"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764"
-
-[[package]]
-name = "fnv"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
-
-[[package]]
-name = "foreign-types"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
-dependencies = [
- "foreign-types-shared",
-]
-
-[[package]]
-name = "foreign-types-shared"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
-
-[[package]]
-name = "form_urlencoded"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
-dependencies = [
- "percent-encoding",
-]
-
-[[package]]
-name = "generic-array"
-version = "0.14.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
-dependencies = [
- "typenum",
- "version_check",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.2.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
-dependencies = [
- "cfg-if",
- "libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
-]
-
-[[package]]
-name = "gimli"
-version = "0.28.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
-
-[[package]]
-name = "hermit-abi"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b"
-
-[[package]]
-name = "http"
-version = "0.2.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
-dependencies = [
- "bytes",
- "fnv",
- "itoa",
-]
-
-[[package]]
-name = "httparse"
-version = "1.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
-
-[[package]]
-name = "iana-time-zone"
-version = "0.1.57"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613"
-dependencies = [
- "android_system_properties",
- "core-foundation-sys",
- "iana-time-zone-haiku",
- "js-sys",
- "wasm-bindgen",
- "windows",
-]
-
-[[package]]
-name = "iana-time-zone-haiku"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "idna"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
-dependencies = [
- "unicode-bidi",
- "unicode-normalization",
-]
-
-[[package]]
-name = "input_buffer"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f97967975f448f1a7ddb12b0bc41069d09ed6a1c161a92687e057325db35d413"
-dependencies = [
- "bytes",
-]
-
-[[package]]
-name = "itoa"
-version = "1.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
-
-[[package]]
-name = "js-sys"
-version = "0.3.64"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"
-dependencies = [
- "wasm-bindgen",
-]
-
-[[package]]
-name = "lazy_static"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-
-[[package]]
-name = "libc"
-version = "0.2.147"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503"
-
-[[package]]
-name = "lock_api"
-version = "0.4.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
-dependencies = [
- "autocfg",
- "scopeguard",
-]
-
-[[package]]
-name = "log"
-version = "0.4.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
-
-[[package]]
-name = "memchr"
-version = "2.6.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
-
-[[package]]
-name = "miniz_oxide"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
-dependencies = [
- "adler",
-]
-
-[[package]]
-name = "mio"
-version = "0.8.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
-dependencies = [
- "libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
- "windows-sys",
-]
-
-[[package]]
-name = "native-tls"
-version = "0.2.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
-dependencies = [
- "lazy_static",
- "libc",
- "log",
- "openssl",
- "openssl-probe",
- "openssl-sys",
- "schannel",
- "security-framework",
- "security-framework-sys",
- "tempfile",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "num_cpus"
-version = "1.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
-dependencies = [
- "hermit-abi",
- "libc",
-]
-
-[[package]]
-name = "object"
-version = "0.32.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.18.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
-
-[[package]]
-name = "opaque-debug"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
-
-[[package]]
-name = "openssl"
-version = "0.10.57"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c"
-dependencies = [
- "bitflags 2.4.0",
- "cfg-if",
- "foreign-types",
- "libc",
- "once_cell",
- "openssl-macros",
- "openssl-sys",
-]
-
-[[package]]
-name = "openssl-macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "openssl-probe"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
-
-[[package]]
-name = "openssl-sys"
-version = "0.9.92"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db7e971c2c2bba161b2d2fdf37080177eff520b3bc044787c7f1f5f9e78d869b"
-dependencies = [
- "cc",
- "libc",
- "pkg-config",
- "vcpkg",
-]
-
-[[package]]
-name = "parking_lot"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
-dependencies = [
- "lock_api",
- "parking_lot_core",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.9.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
-dependencies = [
- "cfg-if",
- "libc",
- "redox_syscall",
- "smallvec",
- "windows-targets",
-]
-
-[[package]]
-name = "percent-encoding"
-version = "2.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
-
-[[package]]
-name = "pin-project-lite"
-version = "0.2.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
-
-[[package]]
-name = "pkg-config"
-version = "0.3.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
-
-[[package]]
-name = "ppv-lite86"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.66"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.33"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "rand"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
-dependencies = [
- "libc",
- "rand_chacha",
- "rand_core",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
-dependencies = [
- "ppv-lite86",
- "rand_core",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
-dependencies = [
- "getrandom",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
-dependencies = [
- "bitflags 1.3.2",
-]
-
-[[package]]
-name = "rustc-demangle"
-version = "0.1.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
-
-[[package]]
-name = "rustix"
-version = "0.38.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0c3dde1fc030af041adc40e79c0e7fbcf431dd24870053d187d7c66e4b87453"
-dependencies = [
- "bitflags 2.4.0",
- "errno",
- "libc",
- "linux-raw-sys",
- "windows-sys",
-]
-
-[[package]]
-name = "ryu"
-version = "1.0.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
-
-[[package]]
-name = "schannel"
-version = "0.1.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88"
-dependencies = [
- "windows-sys",
-]
-
-[[package]]
-name = "scopeguard"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
-
-[[package]]
-name = "security-framework"
-version = "2.9.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de"
-dependencies = [
- "bitflags 1.3.2",
- "core-foundation",
- "core-foundation-sys",
- "libc",
- "security-framework-sys",
-]
-
-[[package]]
-name = "security-framework-sys"
-version = "2.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a"
-dependencies = [
- "core-foundation-sys",
- "libc",
-]
-
-[[package]]
-name = "serde"
-version = "1.0.188"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.188"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.105"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360"
-dependencies = [
- "itoa",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "sha-1"
-version = "0.9.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6"
-dependencies = [
- "block-buffer",
- "cfg-if",
- "cpufeatures",
- "digest",
- "opaque-debug",
-]
-
-[[package]]
-name = "signal-hook-registry"
-version = "1.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "smallvec"
-version = "1.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
-
-[[package]]
-name = "socket2"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877"
-dependencies = [
- "libc",
- "windows-sys",
-]
-
-[[package]]
-name = "socks"
-version = "0.3.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b"
-dependencies = [
- "byteorder",
- "libc",
- "winapi",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "tempfile"
-version = "3.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef"
-dependencies = [
- "cfg-if",
- "fastrand",
- "redox_syscall",
- "rustix",
- "windows-sys",
-]
-
-[[package]]
-name = "thiserror"
-version = "1.0.48"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7"
-dependencies = [
- "thiserror-impl",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "1.0.48"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "time"
-version = "0.1.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
-dependencies = [
- "libc",
- "wasi 0.10.0+wasi-snapshot-preview1",
- "winapi",
-]
-
-[[package]]
-name = "tinyvec"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
-dependencies = [
- "tinyvec_macros",
-]
-
-[[package]]
-name = "tinyvec_macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
-
-[[package]]
-name = "tokio"
-version = "1.32.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9"
-dependencies = [
- "backtrace",
- "bytes",
- "libc",
- "mio",
- "num_cpus",
- "parking_lot",
- "pin-project-lite",
- "signal-hook-registry",
- "socket2",
- "tokio-macros",
- "windows-sys",
-]
-
-[[package]]
-name = "tokio-macros"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "tungstenite"
-version = "0.13.0"
-source = "git+https://github.com/PrivateRookie/tungstenite-rs.git?rev=1d9289276518e5ab7e5194126d40b441d8938375#1d9289276518e5ab7e5194126d40b441d8938375"
-dependencies = [
- "base64",
- "byteorder",
- "bytes",
- "http",
- "httparse",
- "input_buffer",
- "log",
- "native-tls",
- "rand",
- "sha-1",
- "socks",
- "thiserror",
- "url",
- "utf-8",
-]
-
-[[package]]
-name = "typenum"
-version = "1.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
-
-[[package]]
-name = "unicode-bidi"
-version = "0.3.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
-
-[[package]]
-name = "unicode-normalization"
-version = "0.1.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
-dependencies = [
- "tinyvec",
-]
-
-[[package]]
-name = "url"
-version = "2.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5"
-dependencies = [
- "form_urlencoded",
- "idna",
- "percent-encoding",
-]
-
-[[package]]
-name = "utf-8"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
-
-[[package]]
-name = "vcpkg"
-version = "0.2.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
-
-[[package]]
-name = "version_check"
-version = "0.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
-
-[[package]]
-name = "wasi"
-version = "0.10.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
-
-[[package]]
-name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
-
-[[package]]
-name = "wasm-bindgen"
-version = "0.2.87"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
-dependencies = [
- "cfg-if",
- "wasm-bindgen-macro",
-]
-
-[[package]]
-name = "wasm-bindgen-backend"
-version = "0.2.87"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"
-dependencies = [
- "bumpalo",
- "log",
- "once_cell",
- "proc-macro2",
- "quote",
- "syn",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-macro"
-version = "0.2.87"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
-dependencies = [
- "quote",
- "wasm-bindgen-macro-support",
-]
-
-[[package]]
-name = "wasm-bindgen-macro-support"
-version = "0.2.87"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "wasm-bindgen-backend",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-shared"
-version = "0.2.87"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
-
-[[package]]
-name = "winapi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
-dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-
-[[package]]
-name = "windows"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
-dependencies = [
- "windows-targets",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
-dependencies = [
- "windows-targets",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
-dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
-]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"

+ 0 - 52
exchanges/Cargo.toml

@@ -1,52 +0,0 @@
-[package]
-name = "exchanges"
-version = "0.1.0"
-edition = "2021"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
-# json
-serde_json = "1.0.104"
-#tungstenite = { git = "https://github.com/PrivateRookie/tungstenite-rs.git", rev = "1d9289276518e5ab7e5194126d40b441d8938375" }
-#tungstenite = { git = "https://github.com/PrivateRookie/tungstenite-rs.git", rev = "f368f3087d50d97658fda5337550e587bb1ba1b6" }
-
-tokio-tungstenite= { git = "https://github.com/HonestHouLiang/tokio-tungstenite.git",rev = "208fc9b09bcc2e2c8cb52e1cde5087446464fc91"  }
-futures-util = { version = "0.3.28", default-features = false, features = ["sink", "std"] }
-futures-channel = "0.3.28"
-
-url = "2.4.0"
-base64 = "0.13"
-tokio = { version = "1.31.0", features = ["full"] }
-chrono = "0.4.26"
-hex = "0.4"
-reqwest = { version = "0.11.14", features = ["json"] }
-# 解壓縮數據
-flate2 = "1.0"
-
-
-ring = "0.16.20"
-data-encoding = "2.4.0"
-
-
-hmac = "0.8.1"
-sha2 = "0.9.8"
-#tokio-tungstenite = "0.14"
-
-##代替f64避免精度丢失
-rust_decimal = "1.32.0"
-rust_decimal_macros = "1.32.0"
-
-
-##日志
-global = { path="../global" }
-tracing = "0.1"
-tracing-subscriber = { version = "0.3.17", features = ["env-filter"] }
-
-##生成 xlsx
-rust_xlsxwriter = "0.58.0"
-
-once_cell = "1.18.0"
-
-##url编码
-percent-encoding = "2.1.0"

+ 0 - 32
exchanges/README.md

@@ -1,32 +0,0 @@
-## 声明
-
-
-## 项目结构解析
-
-```
-|
-├─ main                                 // 系统入口
-│
-├─ exchanges                            // 交易所层(网络层)
-│
-├─ standard                             // 标准化层(中间件)
-│
-└─ strategy                             // 策略层(主逻辑、风控等)
-```
-
-```
-币安深度示例-
- //币安---深度socket-公共频道订阅
-    let get_res_data = move |res_data: ResponseData| {
-        async move {
-            println!("?????{:?}", res_data);
-        }
-    };
- 
-
-    let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
-    btree_map.insert("lable".parse().unwrap(), "binance".parse().unwrap());//交易行名称
-
-    let ba_exc = BinanceUsdtSwapWs::new(false, true, btree_map);
-    ba_exc.kline(vec![&"BTCUSDT"], get_res_data);
-```

+ 0 - 9
exchanges/src/lib.rs

@@ -1,9 +0,0 @@
-pub mod proxy;
-pub mod response_base;
-pub mod http_tool;
-pub mod gate_swap_ws;
-pub mod gate_swap_rest;
-pub mod socket_tool;
-mod utils;
-pub mod xlsx_utils;
-

+ 0 - 9
exchanges/src/utils.rs

@@ -1,9 +0,0 @@
-// use chrono::Utc;
-
-// pub fn get_time_microsecond() -> i64 {
-//     let now = Utc::now();
-//     let total_micros = now.timestamp_micros(); //微妙
-//     total_micros
-// }
-//
-

+ 0 - 92
exchanges/src/xlsx_utils.rs

@@ -1,92 +0,0 @@
-use std::collections::BTreeMap;
-use rust_xlsxwriter::*;
-
-pub fn creation_xlsx(one_row_name: &Vec<&str>, data_rows: &BTreeMap<String, Vec<Vec<String>>>, file_name: String) -> Result<(), XlsxError> {
-
-    // 创建一个新的Excel文件对象。
-    let mut workbook = Workbook::new();
-    for (key, value) in data_rows {
-        // 向工作簿中添加工作表。
-        let  worksheet = workbook.add_worksheet();
-        worksheet.set_name(key).unwrap();
-
-        // 第一行 列,明
-        let mut row_index: usize = 0;
-        let mut i: usize = 0;
-        let bold_format = Format::new().set_bold();
-        while i <= one_row_name.len() - 1 {
-            worksheet.write_with_format(row_index as RowNum, i as ColNum, one_row_name[i], &bold_format)?;
-            i = i + 1;
-        }
-
-
-        //后续 数据写入
-        row_index = 1;
-        while row_index <= value.len()  {
-            let row = value.get(row_index - 1).unwrap();
-
-            i = 0;
-            for str in row {
-                worksheet.write(row_index as RowNum, i as ColNum, str)?;
-                i = i + 1;
-            }
-            row_index = row_index + 1;
-        }
-    }
-
-
-    //
-    // for row in one_row_name {}
-    // // 写一个不带格式的字符串。
-    // worksheet.write(0, 0, "Hello")?;
-    //
-    //
-    // // 创建一些要在工作表中使用的格式。
-    // let bold_format = Format::new().set_bold();
-    // let decimal_format = Format::new().set_num_format("0.000");
-    // let date_format = Format::new().set_num_format("yyyy-mm-dd");
-    // let merge_format = Format::new()
-    //     .set_border(FormatBorder::Thin)
-    //     .set_align(FormatAlign::Center);
-    //
-    //
-    // // 为清晰设置列宽度。
-    // worksheet.set_column_width(0, 22)?;
-    //
-    // // 写一个不带格式的字符串。
-    // worksheet.write(0, 0, "Hello")?;
-    //
-    // // 用上面定义的粗体格式编写一个字符串。
-    // worksheet.write_with_format(1, 0, "World", &bold_format)?;
-    //
-    // //
-    // worksheet.write(2, 0, 1)?;
-    // worksheet.write(3, 0, 2.34)?;
-    //
-    // // 用格式写一个数字。
-    // worksheet.write_with_format(4, 0, 3.00, &decimal_format)?;
-    //
-    // // 写一个公式。
-    // worksheet.write(5, 0, Formula::new("=SIN(PI()/4)"))?;
-    //
-    // // 写一个日期。
-    // let date = ExcelDateTime::from_ymd(2023, 1, 25)?;
-    // worksheet.write_with_format(6, 0, &date, &date_format)?;
-    //
-    // //写一些链接。
-    // worksheet.write(7, 0, Url::new("https://www.rust-lang.org"))?;
-    // worksheet.write(8, 0, Url::new("https://www.rust-lang.org").set_text("Rust"))?;
-
-    // 写入一些合并的单元格。
-    // worksheet.merge_range(9, 0, 9, 1, "Merged cells", &merge_format)?;
-
-    // Insert an image.
-    // let image = Image::new("examples/rust_logo.png")?;
-    // worksheet.insert_image(1, 2, &image)?;
-
-    // 生成文件
-    let path = format!("./{}.xlsx", file_name);
-    workbook.save(path)?;
-
-    Ok(())
-}

+ 0 - 181
exchanges/tests/gate_swap_test.rs

@@ -1,181 +0,0 @@
-// use std::collections::BTreeMap;
-// use std::sync::Arc;
-// use std::sync::atomic::AtomicBool;
-// 
-// use futures_util::StreamExt;
-// use tokio::sync::Mutex;
-// use tracing::trace;
-// 
-// use exchanges::gate_swap_rest::GateSwapRest;
-// use exchanges::gate_swap_ws::{GateSwapLogin, GateSwapSubscribeType, GateSwapWs, GateSwapWsType};
-// 
-// const ACCESS_KEY: &str = "";
-// const SECRET_KEY: &str = "";
-// 
-// //ws-订阅公共频道信息
-// #[tokio::test(flavor = "multi_thread", worker_threads = 2)]
-// async fn ws_custom_subscribe() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-//     let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded();
-// 
-//     let param = GateSwapLogin {
-//         api_key: ACCESS_KEY.to_string(),
-//         secret: SECRET_KEY.to_string(),
-//     };
-// 
-//     let mut ws = get_ws(Option::from(param));
-//     ws.set_symbols(vec!["BTC_USDT".to_string()]);
-//     ws.set_subscribe(vec![
-//         // GateSwapSubscribeType::PuFuturesOrderBook,
-//         GateSwapSubscribeType::PuFuturesCandlesticks,
-//         GateSwapSubscribeType::PuFuturesTrades,
-// 
-//         // GateSwapSubscribeType::PrFuturesBalances("".to_string()),
-//         // GateSwapSubscribeType::PrFuturesOrders("".to_string()),
-//         // GateSwapSubscribeType::PrFuturesPositions("".to_string()),
-//     ]);
-// 
-// 
-//     let write_tx_am = Arc::new(Mutex::new(write_tx));
-//     let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-// 
-//     //读取
-//     let _is_shutdown_arc_clone = Arc::clone(&is_shutdown_arc);
-//     let _tr = tokio::spawn(async move {
-//         trace!("线程-数据读取-开启");
-//         loop {
-//             if let Some(data) = read_rx.next().await {
-//                 trace!("读取数据data:{:?}",data)
-//             }
-//         }
-//         // trace!("线程-数据读取-结束");
-//     });
-// 
-//     //写数据
-//     // let bool_v2_clone = Arc::clone(&is_shutdown_arc);
-//     // let write_tx_clone = Arc::clone(&write_tx_am);
-//     // let su = ws.get_subscription();
-//     // let tw = tokio::spawn(async move {
-//     //     trace!("线程-数据写入-开始");
-//     //     loop {
-//     //         tokio::time::sleep(Duration::from_millis(20 * 1000)).await;
-//     //         // let close_frame = CloseFrame {
-//     //         //     code: CloseCode::Normal,
-//     //         //     reason: Cow::Borrowed("Bye bye"),
-//     //         // };
-//     //         // let message = Message::Close(Some(close_frame));
-//     //
-//     //
-//     //         let message = Message::Text(su.clone());
-//     //         AbstractWsMode::send_subscribe(write_tx_clone.clone(), message.clone()).await;
-//     //         trace!("发送指令成功");
-//     //     }
-//     //     trace!("线程-数据写入-结束");
-//     // });
-// 
-//     let t1 = tokio::spawn(async move {
-//         //链接
-//         let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-//         ws.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-//         trace!("test 唯一线程结束--");
-//     });
-//     tokio::try_join!(t1).unwrap();
-//     trace!("当此结束");
-//     trace!("重启!");
-//     trace!("参考交易所关闭");
-//     return;
-// }
-// 
-// 
-// //rest-设置持仓模式
-// #[tokio::test]
-// async fn rest_cancel_order_all_test() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let mut ret = get_rest();
-//     let req_data = ret.cancel_order_all().await;
-//     println!("okx--设置持仓模式--{:?}", req_data);
-// }
-// 
-// //rest-下一个自动单
-// #[tokio::test]
-// async fn price_order_test() {
-//     global::log_utils::init_log_with_info();
-// 
-//     let mut rest = get_rest();
-//     let mut params = json!({});
-// 
-//     params["initial"] = json!({
-//         "contract": "XRP_USDT",
-//         "price": "0",
-//         "tif": "ioc",
-//         "reduce_only": true,
-//         // [平多:close_long, 平空:close_short]
-//         "auto_size": "close_long"
-//     });
-// 
-//     params["trigger"] = json!({
-//         // [平多:close-long-position, 平空:close-short-position]
-//         "order_type": "close-long-position",
-//         // 一般都默认用0
-//         "strategy_type": 0,
-//         // [0 - 最新成交价,1 - 标记价格,2 - 指数价格]
-//         "price_type": 0,
-//         // [1: 引用价格大于等于我们传的价格,2:引用价格小于等于我们传的价格]
-//         // 在止损的情况下:
-//         //     1 可以理解为向上突破触发价(一般是给空单用)
-//         //     2 可以理解为向下突破触发价(一般是给多单用)
-//         "rule": 2,
-//         // 订单触发价格
-//         "price": "0.5600",
-//     });
-// 
-//     let response_data = rest.place_price_order("usdt".to_string(), params).await;
-//     if response_data.code == "200" {
-//         let response_obj: serde_json::Value = serde_json::from_str(response_data.data.as_str()).unwrap();
-// 
-//         info!("resp={:?}", response_obj.as_object().unwrap());
-//     } else {
-//         error!(?response_data);
-//     }
-// }
-// 
-// #[tokio::test]
-// async fn price_order_cancel_test() {
-//     global::log_utils::init_log_with_info();
-// 
-//     let mut rest = get_rest();
-// 
-//     // 这边取消订单只能使用系统返回的
-//     let rst = rest.cancel_price_order("usdt".to_string(), "58002898".to_string()).await;
-//     info!(?rst);
-// }
-// 
-// //rest-查询合约账户变更历史
-// #[tokio::test]
-// async fn rest_account_book_test() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let mut ret = get_rest();
-//     let req_data = ret.account_book("usdt".to_string()).await;
-//     println!("okx--查询合约账户变更历史--{:?}", req_data);
-// }
-// 
-// fn get_ws(btree_map: Option<GateSwapLogin>) -> GateSwapWs {
-//     let binance_ws = GateSwapWs::new(false,
-//                                      btree_map,
-//                                      GateSwapWsType::PublicAndPrivate("usdt".to_string()));
-//     binance_ws
-// }
-// 
-// 
-// fn get_rest() -> GateSwapRest {
-//     let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
-//     btree_map.insert("access_key".to_string(), ACCESS_KEY.to_string());
-//     btree_map.insert("secret_key".to_string(), SECRET_KEY.to_string());
-// 
-//     let ba_exc = GateSwapRest::new(false, btree_map);
-//     ba_exc
-// }

+ 0 - 547
exchanges/tests/test.rs

@@ -1,547 +0,0 @@
-// use exchanges::gate_swap_rest::GateSwapRest;
-// use std::collections::BTreeMap;
-// use tokio::io::{AsyncReadExt};
-// use exchanges::kucoin_swap_rest::KucoinSwapRest;
-// use exchanges::kucoin_swap_ws::{KucoinSwapSubscribeType, KucoinSwapWs, KucoinSwapWsType};
-// use exchanges::{proxy};
-// use exchanges::okx_swap_ws::{OkxSwapSubscribeType, OkxSwapWs, OkxSwapWsType};
-//
-// use std::io::{Read, Write};
-// use std::sync::Arc;
-// use std::sync::atomic::AtomicBool;
-// use tokio::sync::mpsc::channel;
-// use tokio::try_join;
-// use tracing::{trace};
-// use tracing::instrument::WithSubscriber;
-// use exchanges::binance_swap_rest::BinanceSwapRest;
-// use exchanges::binance_swap_ws::{BinanceSwapSubscribeType, BinanceSwapWs, BinanceSwapWsType};
-// use exchanges::okx_swap_rest::OkxSwapRest;
-//
-// #[tokio::test]
-// async fn test_import() {
-//     global::log_utils::init_log_with_trace();
-//
-//
-//     /*******走代理:根据环境变量配置来决定,如果配置了走代理,没有配置不走*******/
-//     if proxy::ParsingDetail::http_enable_proxy() {
-//         trace!("检测有代理配置,配置走代理");
-//     }
-//
-//
-//     //获取代理
-//     // demo_get_http_proxy();
-//
-//     //币安---深度socket-公共频道订阅
-//     // demo_pub_ws_ba().await;
-//     // 币安-rest-获取账户信息
-//     // demo_rest_ba().await;
-//     //本次更新成功
-//
-//
-//     //gate-rest -账户信息
-//     // demo_rest_gate().await;
-//     //gate-ws-public-private频道
-//     // demo_ws_gate().await;
-//
-//
-//     //kucoin_rest -账户信息
-//     // demo_rest_kucoin().await;
-//     //Kucoin-ws--公共频道
-//     // demo_ws_kucoin_pu().await;
-//     //Kucoin-ws--私有频道
-//     // demo_ws_kucoin_pr().await;
-//
-//     //okx - Business 频道
-//     // demo_ws_okx_bu().await;
-//     //okx - public 频道
-//     // demo_ws_okx_pu().await;
-//     //okx - rest 频道
-//     // demo_okx_rest().await;
-//
-//     // demo_so();
-//
-//
-//     // let mut ku_ws = KucoinSwapWs::new(false, btree_map.clone(),
-//     //                                   KucoinWsType::Private, tx).await;
-//     // ku_ws.set_subscribe(vec![KucoinSubscribeType::PrContractMarketTradeOrdersSys]);
-//     //
-//     // let t1 = tokio::spawn(async move {
-//     //     ku_ws.custom_subscribe(vec!["ACHUSDTM".to_string(), "ROSEUSDTM".to_string()]).await;
-//     // });
-//     //
-//     // let t2 = tokio::spawn(async move {
-//     //     let mut stdout = std::io::stdout();
-//     //     loop {
-//     //         if let Ok(received) = rx.try_recv() {
-//     //             writeln!(stdout, "age: {:?}", received).unwrap();
-//     //         }
-//     //     }
-//     // let t01 = tokio::spawn(async move {
-//     //     loop {
-//     //         tokio::time::sleep(Duration::from_secs(2)).await;
-//     //         trace!( "发送-指令: ");
-//     //     }
-//     // });
-//     // let t02 = tokio::spawn(async move {
-//     //     loop {
-//     //         tokio::time::sleep(Duration::from_secs(3)).await;
-//     //         trace!( "接收 -指令: ");
-//     //     }
-//     // });
-//     // try_join!(t01,t02).unwrap();
-//
-//
-//     // let (mut tx_end, mut rx_end) = channel::<String>(1024);
-//     // let (mut tx_read, mut rx_read) = channel::<String>(1024);
-//     // let mut stream = tokio::net::TcpStream::connect("127.0.0.1:8080").await.unwrap();
-//     // stream.write_all( b"Hello, server!").await.unwrap();
-//     // stream.flush().await.unwrap();
-//     // let mutex_stream = Arc::new(Mutex::new(stream));
-//     //
-//     // //捕捉用户的主动发送的订阅指令
-//     // let stream_clone = Arc::clone(&mutex_stream);
-//     // let t_1 = tokio::spawn(async move {
-//     //     loop {
-//     //         tokio::time::sleep(Duration::from_secs(1)).await;
-//     //         if let Ok(received) = rx_end.try_recv() {
-//     //             trace!("动态订阅内容: {:?}", received);
-//     //             let mut stream_lock = stream_clone.lock().await;
-//     //             // stream_lock.write_all( b"1111!").await.unwrap();
-//     //             // stream_lock.flush().await.unwrap();
-//     //
-//     //             // stream_lock.write_all(b"Hello, server!").await.unwrap();
-//     //         }
-//     //     }
-//     // });
-//     //
-//     //
-//     // //socket数据获取,装入回显通道
-//     // let stream_clone = Arc::clone(&mutex_stream);
-//     // let t_2 = tokio::spawn(async move {
-//     //     // 创建一个用于存储服务器响应的缓冲区
-//     //     let mut buffer = [0; 512];
-//     //     loop {
-//     //         let mut stream_lock = stream_clone.lock().await;
-//     //         tokio::time::sleep(Duration::from_secs(1)).await;
-//     //
-//     //         let _ = match stream_lock.read(&mut buffer).await {
-//     //             Ok(n) => {
-//     //                 tokio::time::sleep(Duration::from_secs(1)).await;
-//     //                 if n == 0 {
-//     //                     // 没有读取到数据
-//     //                     trace!("没有数据,主动发送");
-//     //                 } else {
-//     //                     // 打印服务器的响应
-//     //                     trace!("有数据: {}", String::from_utf8_lossy(&buffer[..n]));
-//     //                     tx_read.send(format!("{}", String::from_utf8_lossy(&buffer[..n]))).await.unwrap()
-//     //                 }
-//     //             }
-//     //             Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
-//     //                 // 如果读取操作会阻塞,则等待一会儿再试
-//     //                 trace!("Would block, sleeping会阻碍睡眠??");
-//     //                 tokio::time::sleep(Duration::from_secs(3)).await;
-//     //                 continue;
-//     //             }
-//     //             Err(e) => {
-//     //                 trace!("Err:{:?}",e);
-//     //                 break;
-//     //             }
-//     //         };
-//     //     }
-//     // });
-//     //
-//     //
-//     // //socket 数据回显
-//     // let t02 = tokio::spawn(async move {
-//     //     loop {
-//     //         tokio::time::sleep(Duration::from_secs(1)).await;
-//     //         // tx.send("hai!!!".to_string()).await.unwrap();
-//     //         if let Ok(received) = rx_read.try_recv() {
-//     //             trace!("拿到 socket 的数据: {:?}", received);
-//     //         }
-//     //     }
-//     // });
-//     //
-//     // //模拟用户动态发送
-//     // let t03 = tokio::spawn(async move {
-//     //     loop {
-//     //         tokio::time::sleep(Duration::from_secs(1)).await;
-//     //         tx_end.send("这里是 动态订阅".to_string()).await.unwrap();
-//     //     }
-//     // });
-//     //
-//     // try_join!(t_1,t_2,t02,t03).unwrap();
-// }
-//
-//
-// async fn demo_okx_rest() {
-//     // let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
-//     // btree_map.insert("access_key".to_string(), "".to_string());
-//     // btree_map.insert("secret_key".to_string(), "".to_string());
-//     // btree_map.insert("pass_key".to_string(), "".to_string());
-//     //
-//     // let mut okx_rest = OkxSwapRest::new(false, btree_map);
-//     // let res_data = okx_rest.get_account("BTC".to_string()).await;
-//     // trace!("okx_rest-rest - get_account- {:?}", res_data);
-// }
-//
-// async fn demo_ws_gate() {}
-//
-//
-// fn demo_so() {
-//     // 代理服务器地址和端口
-//     // let proxy_address = "127.0.0.1:7890";
-//     // // 目标服务器地址和端口
-//     // let target_address = "wss://ws.okx.com:8443/ws/v5/public";
-//     //
-//     //   // 建立与代理服务器的连接
-//     //   let mut proxy_stream = TcpStream::connect(proxy_address).expect("Failed to connect to proxy");
-//     //
-//     //   // 发送代理请求
-//     //   let request = format!("CONNECT {}\r\n\r\n", target_address);
-//     //   proxy_stream.write_all(request.as_bytes()).expect("Failed to send proxy request");
-//     //
-//     //   // 读取代理响应
-//     //   let mut response = String::new();
-//     //   proxy_stream.read_to_string(&mut response).expect("Failed to read proxy response");
-//     //
-//     //   // 检查代理响应是否成功
-//     //   if !response.contains("200 Connection established") {
-//     //       trace!("Proxy connection failed: {}", response);
-//     //   }
-//     //
-//     //   // 从代理连接中获取原始 TCP 流
-//     //   let mut tcp_stream = std::mem::ManuallyDrop::new(proxy_stream);
-//     //
-//     //   // 现在你可以使用 `tcp_stream` 来进行与目标服务器的通信
-//     //   // 例如,发送和接收数据
-//     //   // tcp_stream.write_all(b"Hello, server!").expect("Failed to send data");
-//     //
-//     //   thread::spawn(move || {
-//     //       loop {
-//     //           let mut buffer = [0u8; 1024]; // 用于存储读取的数据的缓冲区
-//     //           let bytes_read = tcp_stream.read(&mut buffer).expect("Failed to read data");
-//     //
-//     //           // 将读取的数据转换为字符串并打印
-//     //           if let Ok(data) = std::str::from_utf8(&buffer[..bytes_read]) {
-//     //               trace!("Received data: {}", data);
-//     //           } else {
-//     //               trace!("Received data contains non-UTF8 characters");
-//     //           }
-//     //       }
-//     //
-//     //   });
-//     //
-//     //   // 最后记得手动释放套接字
-//     //   // 注意:不要调用 `drop(tcp_stream)`,因为我们使用了 `ManuallyDrop` 来避免自动释放
-//     //   unsafe {
-//     //       std::mem::ManuallyDrop::drop(&mut tcp_stream);
-//     //   }
-// }
-//
-//
-// async fn demo_ws_okx_pu() {
-//
-//     // let btree_map: BTreeMap<String, String> = BTreeMap::new();
-//     // let (tx, mut rx) = channel(1024);
-//     // let mut ku_ws = OkxSwapWs::new(false, btree_map, OkxWsType::Public, tx);
-//     // ku_ws.set_subscribe(vec![OkxSubscribeType::PuIndexTickers]);
-//     // let t1 = tokio::spawn(async move {
-//     //     ku_ws.custom_subscribe(vec!["BTC-USD".to_string()]).await;
-//     // });
-//     // let t2 = tokio::spawn(async move {
-//     //     let mut stdout = std::io::stdout();
-//     //     loop {
-//     //         if let Ok(received) = rx.try_recv() {
-//     //             writeln!(stdout, "age: {:?}", received).unwrap();
-//     //         }
-//     //     }
-//     // });
-//     // try_join!(t1,t2).unwrap();
-// }
-//
-// async fn demo_ws_okx_bu() {
-//     // let btree_map: BTreeMap<String, String> = BTreeMap::new();
-//     // let (tx, mut rx) = channel(1024);
-//     // let mut ku_ws = OkxSwapWs::new(false, btree_map, OkxWsType::Business, tx);
-//     // ku_ws.set_subscribe(vec![OkxSubscribeType::BuIndexCandle30m]);
-//     // let t1 = tokio::spawn(async move {
-//     //     ku_ws.custom_subscribe(vec!["BTC-USD".to_string()]).await;
-//     // });
-//     // let t2 = tokio::spawn(async move {
-//     //     let mut stdout = std::io::stdout();
-//     //     loop {
-//     //         if let Ok(received) = rx.try_recv() {
-//     //             writeln!(stdout, "age: {:?}", received).unwrap();
-//     //         }
-//     //     }
-//     // });
-//     // try_join!(t1,t2).unwrap();
-// }
-//
-// async fn demo_ws_kucoin_pr() {
-//     // let mut is_shutdown_arc = Arc::new(AtomicBool::new(true));
-//     // let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
-//     // btree_map.insert("access_key".to_string(), "".to_string());
-//     // btree_map.insert("secret_key".to_string(), "".to_string());
-//     // btree_map.insert("pass_key".to_string(), "".to_string());
-//     // trace!("----------------------btree_map{:?}", btree_map.clone());
-//     // let (tx, mut rx) = channel(1024);
-//     // let mut ku_ws = KucoinSwapWs::new(false, btree_map.clone(),
-//     //                                   KucoinWsType::Private, tx).await;
-//     // ku_ws.set_subscribe(vec![KucoinSubscribeType::PrContractMarketTradeOrdersSys]);
-//     //
-//     // let t1 = tokio::spawn(async move {
-//     //     ku_ws.custom_subscribe(is_shutdown_arc, vec!["ACHUSDTM".to_string(), "ROSEUSDTM".to_string()]).await;
-//     // });
-//     //
-//     // let t2 = tokio::spawn(async move {
-//     //     loop {
-//     //         if let Ok(received) = rx.try_recv() {
-//     //             trace!( "age: {:?}", received);
-//     //         }
-//     //     }
-//     // });
-//     //
-//     // try_join!(t1,t2).unwrap();
-// }
-//
-// async fn demo_ws_kucoin_pu() {
-//     // let mut is_shutdown_arc = Arc::new(AtomicBool::new(true));
-//     // let btree_map: BTreeMap<String, String> = BTreeMap::new();
-//     // let (tx, mut rx) = channel(1024);
-//     // let mut ku_ws = KucoinSwapWs::new(false, btree_map, KucoinWsType::Public, tx).await;
-//     // ku_ws.set_subscribe(vec![
-//     //     KucoinSubscribeType::PuContractMarketLevel2Depth50,
-//     //     KucoinSubscribeType::PuContractMarkettickerV2,
-//     // ]);
-//     //
-//     // let t1 = tokio::spawn(async move {
-//     //     ku_ws.custom_subscribe(is_shutdown_arc, vec!["ACHUSDTM".to_string(), "ROSEUSDTM".to_string()]).await;
-//     // });
-//     // let t2 = tokio::spawn(async move {
-//     //     loop {
-//     //         if let Ok(received) = rx.try_recv() {
-//     //             trace!("age: {:?}", received);
-//     //         }
-//     //     }
-//     // });
-//     //
-//     // try_join!(t1,t2).unwrap();
-// }
-//
-// async fn demo_rest_kucoin() {
-//     let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
-//     btree_map.insert("access_key".to_string(), "".to_string());
-//     btree_map.insert("secret_key".to_string(), "".to_string());
-//     btree_map.insert("pass_key".to_string(), "".to_string());
-//
-//     let mut kucoin_exc = KucoinSwapRest::new(false, btree_map);
-//     // let res_data = kucoin_exc.get_server_time().await;
-//     // trace!("kucoin_exc-rest - get_server_time- {:?}", res_data);
-//     // trace!("kucoin_exc-rest-get_delays{:?}", kucoin_exc.get_delays() );
-//     // trace!("kucoin_exc-rest -get_avg_delay{:?}", kucoin_exc.get_avg_delay());
-//     // let res_data = kucoin_exc.get_account("USDT".to_string()).await;
-//     // trace!("kucoin_exc-rest - get_account- {:?}", res_data);
-//     // let res_data = kucoin_exc.get_position("XBT1USDM".to_string()).await;
-//     // trace!("kucoin_exc-rest - get_position- {:?}", res_data);
-//     // let res_data = kucoin_exc.get_market_details().await;
-//     // trace!("kucoin_exc-rest - get_market_details- {:?}", res_data);
-//     // let res_data = kucoin_exc.get_ticker("ROSEUSDTM".to_string()).await;
-//     // trace!("kucoin_exc-rest - get_ticker- {:?}", res_data);
-//     let res_data = kucoin_exc.get_orders("".to_string(),
-//                                          "".to_string()).await;
-//     trace!("kucoin_exc-rest - get_orders- {:?}", res_data);
-//     // let res_data = kucoin_exc.get_positions("USDT".to_string()).await;
-//     // trace!("kucoin_exc-rest - get_positions- {:?}", res_data);
-//     // let res_data = kucoin_exc.get_orders_details("111".to_string(), "".to_string()).await;
-//     // trace!("kucoin_exc-rest - get_orders_details- {:?}", res_data);
-//     // let res_data = kucoin_exc.swap_bazaar_order(
-//     //     "cs_202309111808".to_string(),
-//     //     "ROSEUSDTM".to_string(),
-//     //     "pd".to_string(),
-//     //     1,
-//     //     "10".to_string(),
-//     //     "0.03856".to_string(),
-//     //     "limit".to_string(),
-//     // ).await;
-//     // trace!("kucoin_exc-rest - swap_bazaar_order- {:?}
-//     // let res_data = kucoin_exc.cancel_order("".to_string(), "999999".to_string()).await;
-//     // trace!("kucoin_exc-rest - cancel_order- {:?}", res_data);
-//     // let res_data = kucoin_exc.get_public_token().await;
-//     // trace!("kucoin_exc-rest - get_public_token- {:?}", res_data);
-// }
-//
-// async fn demo_rest_gate() {
-//     let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
-//     btree_map.insert("access_key".to_string(), "".to_string());
-//     btree_map.insert("secret_key".to_string(), "".to_string());
-//
-//     let mut gate_exc = GateSwapRest::new(false, btree_map);
-//     let res_data = gate_exc.get_account("usdt".to_string()).await;
-//     trace!("gate-rest -账户信息{:?}", res_data);
-//     trace!("gate-rest -get_delays{:?}", gate_exc.get_delays() );
-//     trace!("gate-rest -get_avg_delay{:?}", gate_exc.get_avg_delay());
-//     // let res_data = gate_exc.get_position("usdt".to_string(), "CYBER_USDT".to_string()).await;
-//     // trace!("gate-rest -持仓信息{:?}", res_data);
-//     // let res_data = gate_exc.get_ticker("usdt".to_string()).await;
-//     // trace!("gate-rest -ticker{:?}", res_data);
-//     // let res_data = gate_exc.get_server_time().await;
-//     // trace!("gate-rest -get_server_time{:?}", res_data);
-//     // let res_data = gate_exc.get_user_position("usdt".to_string()).await;
-//     // trace!("gate-rest -get_server_time{:?}", res_data);
-//     // let res_data = gate_exc.get_order_details("usdt".to_string(), "11335522".to_string()).await;
-//     // trace!("gate-rest -get_order_details{:?}", res_data);
-//     // let res_data = gate_exc.get_orders("usd1t".to_string(), "open".to_string()).await;
-//     // trace!("gate-rest -get_orders{:?}", res_data);
-//     // let params = serde_json::json!({
-//     //         "contract":"CYBER_USDT",
-//     //         "size":-1,
-//     //         "price":"0",
-//     //         "tif":"ioc",
-//     //      });
-//     // let res_data = gate_exc.take_order("usdt".to_string(), params).await;
-//     // trace!("gate-rest -get_orders{:?}", res_data);
-//     // let res_data = gate_exc.setting_dual_mode("usdt".to_string(), true).await;
-//     // trace!("gate-rest -setting_dual_mode{:?}", res_data);
-//     // let res_data = gate_exc.setting_dual_leverage("usdt".to_string(),
-//     //                                               "CYBER_USDT".to_string(),
-//     //                                               "20".to_string(),
-//     // ).await;
-//     // trace!("gate-rest -setting_dual_mode{:?}", res_data);
-//     // let res_data = gate_exc.wallet_transfers("usdt".to_string(),
-//     //                                               "CYBER_USDT".to_string(),
-//     //                                               "20".to_string(),
-//     // ).await;
-//     // trace!("gate-rest -setting_dual_mode{:?}", res_data);
-//     // let res_data = gate_exc.cancel_order("usdt".to_string(),
-//     //                                      "12345".to_string(),
-//     // ).await;
-//     // trace!("gate-rest -setting_dual_mode{:?}", res_data);
-//     // let res_data = gate_exc.cancel_orders("usdt".to_string(),
-//     //                                      "CYBER_USDT".to_string(),
-//     // ).await;
-//     // trace!("gate-rest -cancel_orders{:?}", res_data);
-//     // let res_data = gate_exc.order(
-//     //     "usdt".to_string(),
-//     //     "long".to_string(),
-//     //     "buy".to_string(),
-//     //     "ROSE_USDT".to_string(),
-//     //     1,
-//     //     "0.03888".to_string(),
-//     //     "t-my-custom-id-001".to_string(),
-//     // ).await;
-//     // trace!("gate-rest -order{:?}", res_data);
-//
-//
-//     // let res_data = gate_exc.my_trades("usdt".to_string()).await;
-//     // trace!("gate-rest -my_trades{:?}", res_data);
-//     let res_data = gate_exc.account_book("usdt".to_string()).await;
-//     trace!("gate-rest -account_book{:?}", res_data);
-// }
-//
-// async fn demo_rest_ba() {
-//     let mut btree_map: BTreeMap<String, String> = BTreeMap::new();
-//     btree_map.insert("access_key".to_string(), "".to_string());
-//     btree_map.insert("secret_key".to_string(), "".to_string());
-//
-//     // let ba_exc = BinanceUsdtSwapRest::new(false, btree_map);
-//     // let res_data = ba_exc.get_account().await;
-//     let mut ba_exc = BinanceSwapRest::new(false, btree_map);
-//     // let res_data = ba_exc.get_server_time().await;
-//     // trace!("币安-rest - get_server_time{:?}", res_data);
-//     // let res_data = ba_exc.get_exchange_info().await;
-//     // trace!("币安-restget_ get_exchange_info{:?}", res_data);
-//
-//
-//     let res_data = ba_exc.get_account().await;
-//     trace!("币安-rest-获取账户信息{:?}", res_data);
-//     // trace!("币安-rest- -get_delays{:?}", ba_exc.get_delays() );
-//     // trace!("币安-rest--get_avg_delay{:?}", ba_exc.get_avg_delay());
-//
-//     // let res_data = ba_exc.get_order("BTCUSDT".to_string(), 131, "".to_string()).await;
-//     // trace!("币安-rest--get_order{:?}", res_data);
-//     // let res_data = ba_exc.get_open_orders("BTCUSDT".to_string()).await;
-//     // trace!("币安-rest--get_open_orders{:?}", res_data);
-//     // let timestamp_start = chrono::Utc::now().timestamp_millis() - 60 * 100 * 1000;
-//     // let timestamp_end = chrono::Utc::now().timestamp_millis() +  60 * 100 * 1000;
-//     // let res_data = ba_exc.get_all_orders("BTCUSDT".to_string(), 1000, timestamp_start, timestamp_end).await;
-//     // trace!("币安-rest--get_all_orders{:?}", res_data);
-//     // let res_data = ba_exc.get_book_ticker("BTCUSDT".to_string()).await;
-//     // trace!("币安-rest--get_book_ticker{:?}", res_data);
-//     // let res_data = ba_exc.get_position_risk("BTCUS1DT".to_string()).await;
-//     // trace!("币安-rest--get_position_risk{:?}", res_data);
-//     // let res_data = ba_exc.change_pos_side(true).await;
-//     // trace!("币安-rest--change_pos_side{:?}", res_data);
-//     // let res_data = ba_exc.cancel_order("BTCUSDT".to_string(), 3312331, "".to_string()).await;
-//     // trace!("币安-rest--cancel_order{:?}", res_data);
-// }
-//
-// async fn demo_pub_ws_ba() {
-//     // let mut is_shutdown_arc = Arc::new(AtomicBool::new(true));
-//     // let btree_map: BTreeMap<String, String> = BTreeMap::new();
-//     // let (tx, mut rx) = channel(1024);
-//     // let mut binance_ws = BinanceSwapWs::new(false, btree_map, BinanceWsType::PublicAndPrivate, tx);
-//     // binance_ws.set_subscribe(vec![
-//     //     BinanceSubscribeType::PuAggTrade,
-//     //     BinanceSubscribeType::PuDepth20levels100ms,
-//     //     BinanceSubscribeType::PuBookTicker,
-//     // ]);
-//     // let t1 = tokio::spawn(async move {
-//     //     binance_ws.custom_subscribe(is_shutdown_arc,vec!["BTCUSDT".to_string()]).await;
-//     // });
-//     // let t2 = tokio::spawn(async move {
-//     //     loop {
-//     //         if let Ok(received) = rx.try_recv() {
-//     //             trace!( "age: {:?}", received);
-//     //         }
-//     //     }
-//     // });
-//     // try_join!(t1,t2).unwrap();
-// }
-//
-// fn demo_get_http_proxy() {
-//     //代理地址
-//     let parsing_detail = proxy::ParsingDetail::parsing_environment_variables();
-//     trace!("----代理信息:{:?}", parsing_detail);
-// }
-//
-//
-// // /*********************web服务*/
-// // fn demo_http() {
-// //     let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
-// //     for stream in listener.incoming() {
-// //         let stream = stream.unwrap();
-// //
-// //         handle_connection(TcpStream::try_from(stream).unwrap());
-// //     }
-// // }
-// //
-// //
-// // fn handle_connection(mut stream: TcpStream) {
-// //     let buf_reader = BufReader::new(&mut stream);
-// //     let http_request: Vec<_> = buf_reader
-// //         .lines()
-// //         .map(|result| result.unwrap())
-// //         .take_while(|line| !line.is_empty())
-// //         .collect();
-// //     trace!("Request: {:#?}", http_request);
-// //     trace!("Request2: {:#?}", http_request[0]);
-// //     trace!("Request3: {:#?}", http_request[1]);
-// //
-// //     let (status_line, filename) = if http_request[0] == "GET / HTTP/1.1" {
-// //         ("HTTP/1.1 200 OK", "hello.html")
-// //     } else {
-// //         ("HTTP/1.1 404 NOT FOUND", "404.html")
-// //     };
-// //
-// //     let status_line = "HTTP/1.1 200 OK";
-// //     let contents = fs::read_to_string("src/404.html").unwrap();
-// //     let length = contents.len();
-// //
-// //     let response =
-// //         format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}");
-// //     // let response = "HTTP/1.1 200 OK\r\n\r\nccccc";
-// //
-// //     stream.write_all(response.as_bytes()).unwrap();
-// // }

+ 0 - 229
exchanges/tests/xlsx_test.rs

@@ -1,229 +0,0 @@
-// use std::collections::{BTreeMap, HashSet};
-// use chrono::{DateTime, FixedOffset, NaiveDateTime, TimeZone, Utc};
-// 
-// use tracing::{trace};
-// 
-// use exchanges::gate_swap_rest::GateSwapRest;
-// use exchanges::xlsx_utils::creation_xlsx;
-// 
-// //ws-订阅公共频道信息
-// #[tokio::test(flavor = "multi_thread", worker_threads = 1)]
-// async fn test_gate_creation_xlsx() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     //获取不同账号的数据
-//     let mut acc_array: Vec<BTreeMap<String, String>> = vec![];
-//     let mut acc_all_data: BTreeMap<String, Vec<Vec<String>>> = BTreeMap::new();
-//     let mut acc_all_data_clone: BTreeMap<String, Vec<Vec<String>>> = BTreeMap::new();
-//     let mut data_array_all: Vec<Vec<String>> = vec![];
-//     let mut time_all: Vec<i64> = vec![];
-//     loop {
-//         let mut gate60: BTreeMap<String, String> = BTreeMap::new();
-//         gate60.insert("acc_name".to_string(), String::from("gate60"));
-//         gate60.insert("access_key".to_string(), String::from("61e3a1b12c44c8ccfce1f32782b9922f"));
-//         gate60.insert("secret_key".to_string(), String::from("f3f533fa685cbae44b3017f73b71e90eaa9aa8d4922a39426744721e4824a527"));
-//         acc_array.push(gate60);
-// 
-//         let mut gate59: BTreeMap<String, String> = BTreeMap::new();
-//         gate59.insert("acc_name".to_string(), String::from("gate59"));
-//         gate59.insert("access_key".to_string(), String::from("c691d4fcc5a5a98af459f993a3a0c653"));
-//         gate59.insert("secret_key".to_string(), String::from("05e7f8640bffeacc146b6f9f08512955d00d89bbdb051c9427f31adf96adeb2f"));
-//         acc_array.push(gate59);
-// 
-//         let mut gate58: BTreeMap<String, String> = BTreeMap::new();
-//         gate58.insert("acc_name".to_string(), String::from("gate58"));
-//         gate58.insert("access_key".to_string(), String::from("dfdc30687ac71daefa2fb39c706b8afa"));
-//         gate58.insert("secret_key".to_string(), String::from("31e8999f85d38f5dd174f8919d9a1611c24d4e35b4d6319d6b160005871bf8b6"));
-//         acc_array.push(gate58);
-// 
-//         let mut gate57: BTreeMap<String, String> = BTreeMap::new();
-//         gate57.insert("acc_name".to_string(), String::from("gate57"));
-//         gate57.insert("access_key".to_string(), String::from("ba11ea511f343763db7c92c685f20c12"));
-//         gate57.insert("secret_key".to_string(), String::from("272d1d38ac4f0af3e6ed96e6a9a2c59dd905c3d7ad730507008604bba14edb3d"));
-//         acc_array.push(gate57);
-// 
-//         let mut gate56: BTreeMap<String, String> = BTreeMap::new();
-//         gate56.insert("acc_name".to_string(), String::from("gate56"));
-//         gate56.insert("access_key".to_string(), String::from("72f0c351a83b04808baad625f6085599"));
-//         gate56.insert("secret_key".to_string(), String::from("8a8d482bcc31f184cce350531cb40ca70564f9c466698d025e16d8943257dc0f"));
-//         acc_array.push(gate56);
-// 
-//         let mut gate55: BTreeMap<String, String> = BTreeMap::new();
-//         gate55.insert("acc_name".to_string(), String::from("gate55"));
-//         gate55.insert("access_key".to_string(), String::from("036408d5cbd8ddf1c6e0baab61ee641a"));
-//         gate55.insert("secret_key".to_string(), String::from("940414a37711e59848011e99e223fa11b0e69f8badd35347301e3f8e41957a60"));
-//         acc_array.push(gate55);
-// 
-//         let mut gate54: BTreeMap<String, String> = BTreeMap::new();
-//         gate54.insert("acc_name".to_string(), String::from("gate54"));
-//         gate54.insert("access_key".to_string(), String::from("fbe564e8bd4efaa0c3c023ca8c057b36"));
-//         gate54.insert("secret_key".to_string(), String::from("0be3c0223fd021fdacacc03f183f467e988ceee6eb1b0e09ca96bb1eebd45f39"));
-//         acc_array.push(gate54);
-// 
-//         let mut gate53: BTreeMap<String, String> = BTreeMap::new();
-//         gate53.insert("acc_name".to_string(), String::from("gate53"));
-//         gate53.insert("access_key".to_string(), String::from("16d91ba0a3d79a2925d16ea01a615fa1"));
-//         gate53.insert("secret_key".to_string(), String::from("607b07cf240466656c00beb0c6fff252839467583fd3f8b14782eb007b3d99ce"));
-//         acc_array.push(gate53);
-// 
-//         let mut gate52: BTreeMap<String, String> = BTreeMap::new();
-//         gate52.insert("acc_name".to_string(), String::from("gate52"));
-//         gate52.insert("access_key".to_string(), String::from("31054006c457a80a027e961cf3e5e3a4"));
-//         gate52.insert("secret_key".to_string(), String::from("a43f8f5672b49bfcc304d0731100610de1c55e7d2b6c00199b267993f0b189d1"));
-//         acc_array.push(gate52);
-// 
-//         let mut gate51: BTreeMap<String, String> = BTreeMap::new();
-//         gate51.insert("acc_name".to_string(), String::from("gate51"));
-//         gate51.insert("access_key".to_string(), String::from("edcedefe7830dd5722c2c37704ae700f"));
-//         gate51.insert("secret_key".to_string(), String::from("41db86a8463ac7c66023a8505e5fddd3448e551a11a52141bf57ca8478e2149b"));
-//         acc_array.push(gate51);
-// 
-// 
-//         for acc in acc_array {
-//             let mut gate_exc = GateSwapRest::new(false, acc.clone());
-//             let data = gate_exc.account_book("usdt".to_string()).await;
-//             // trace!("data???????:{:?}",data.clone());
-//             if data.code.as_str() == "200" {
-//                 let acc_name = acc.get("acc_name").clone();
-// 
-//                 //账号
-//                 let json_value: serde_json::Value = serde_json::from_str(&data.data).unwrap();
-//                 if let serde_json::Value::Array(array) = json_value {
-//                     let mut name_data_all: Vec<Vec<String>> = vec![];
-//                     let mut name_data_all_clone: Vec<Vec<String>> = vec![];
-//                     for item in array {
-//                         let time = item["time"].as_i64().unwrap();//秒级
-//                         // 使用秒构建一个DateTime<Utc>对象
-//                         // let datetime: DateTime<Utc> = Utc.timestamp(time, 0);
-//                         //2023-12-10 00:00:00
-//                         if 1702051200 > time {
-//                             continue;
-//                         }
-//                         time_all.push(time);
-//                         let time_str = NaiveDateTime::from_timestamp_millis((time + 8 * 3600) * 1000).unwrap().format("%Y-%m-%d %H:%M:%S%.3f").to_string();
-// 
-//                         trace!("数据时间解析:{:?}---{:?}",time,time_str);
-//                         let change = item["change"].as_str().unwrap();
-// 
-//                         let balance = item["balance"].as_str().unwrap();
-//                         let type_str = match item["type"].as_str().unwrap() {
-//                             "dnw" => { "转入转出" }
-//                             "pnl" => { "减仓盈亏" }
-//                             "fee" => { "交易手续费" }
-//                             "refr" => { "推荐人返佣" }
-//                             "fund" => { "资金费用" }
-//                             "point_dnw" => { "点卡转入转出" }
-//                             "point_fee" => { "点卡交易手续费" }
-//                             "point_refr" => { "点卡推荐人返佣" }
-//                             _ => {
-//                                 "未知-变更类型"
-//                             }
-//                         };
-//                         let text = item["text"].as_str().unwrap();
-//                         let contract = item["contract"].as_str().unwrap();
-//                         let trade_id = item["trade_id"].as_str().unwrap();
-// 
-//                         let mut name_data_array: Vec<String> = vec![];
-//                         name_data_array.push(time_str.to_string());
-//                         name_data_array.push(trade_id.to_string());
-//                         name_data_array.push(change.to_string());
-//                         name_data_array.push(balance.to_string());
-//                         name_data_array.push(type_str.to_string());
-//                         name_data_array.push(contract.to_string());
-//                         name_data_array.push(text.to_string());
-// 
-//                         let mut name_data_array_clone: Vec<String> = vec![];
-//                         name_data_array_clone.push(time.to_string());
-//                         name_data_array_clone.push(trade_id.to_string());
-//                         name_data_array_clone.push(change.to_string());
-//                         name_data_array_clone.push(balance.to_string());
-//                         name_data_array_clone.push(type_str.to_string());
-//                         name_data_array_clone.push(contract.to_string());
-//                         name_data_array_clone.push(text.to_string());
-// 
-//                         name_data_all.push(name_data_array.clone());
-//                         name_data_all_clone.push(name_data_array_clone.clone());
-//                         let mut cp =  name_data_array.clone();
-//                         cp.push(acc_name.clone().unwrap().to_string());
-//                         data_array_all.push(cp);
-//                     }
-//                     acc_all_data.insert(acc_name.clone().unwrap().to_string(), name_data_all.clone());
-//                     acc_all_data_clone.insert(acc_name.clone().unwrap().to_string(), name_data_all_clone.clone());
-//                 } else {
-//                     trace!("不是数组 检查数据");
-//                 }
-//             }
-//             // break;
-//         }
-//         break;//这里是为了 代码收纳,用了loop来放置代码
-//     }
-//     trace!("数据如下:{:?}",acc_all_data);
-// 
-//     //汇总
-//     //1. 生成时间片
-//     let mut unique = HashSet::new();
-//     time_all.retain(|e| unique.insert(*e));
-//     trace!("时间片:{:?}",time_all);
-// 
-//     //2. 根据时间片 去求每个时间片的  总余额,
-//     let mut sum_data_array_all: Vec<Vec<String>> = vec![];
-//     for time in time_all.clone() {
-//         let mut sum_data_array: Vec<String> = vec![];
-//         let mut sum_balance: f64 = 0 as f64;
-//         for (key, value) in acc_all_data_clone.clone() {
-//             let acc_key = key;
-//             trace!("读取value:{:?}",value);
-//             let filter_arrya: Vec<Vec<String>> = value.clone().into_iter().filter(|s| {
-//                 trace!("读取time:{:?}",s);
-//                 let time_v = s[0].clone();
-//                 time_v < (time - 1).to_string()
-//             }).collect();
-// 
-//             let balance: f64 = if filter_arrya.len() > 0 {
-//                 let row = filter_arrya[filter_arrya.len() - 1].clone();
-//                 trace!("读取balance:{:?}",row);
-//                 let balance_clone = row[3].clone();
-//                 balance_clone.parse::<f64>().unwrap()
-//             } else {
-//                 0 as f64
-//             };
-//             sum_balance = balance + sum_balance;
-//         }
-// 
-//         // 使用秒构建一个DateTime<Utc>对象
-//         let time_str = NaiveDateTime::from_timestamp_millis((time + 8 * 3600) * 1000).unwrap().format("%Y-%m-%d %H:%M:%S%.3f").to_string();
-// 
-//         sum_data_array.push(time_str.to_string());
-//         sum_data_array.push("".to_string());
-//         sum_data_array.push("".to_string());
-//         sum_data_array.push(sum_balance.to_string());
-//         sum_data_array.push("".to_string());
-//         sum_data_array.push("".to_string());
-//         sum_data_array.push("".to_string());
-// 
-//         sum_data_array_all.push(sum_data_array);
-//     }
-//     if sum_data_array_all.len() > 0 {
-//         acc_all_data.insert("total".to_string(), sum_data_array_all);
-//     }
-//     if data_array_all.len() > 0{
-//         acc_all_data.insert("gather".to_string(), data_array_all);
-//     }
-// 
-//     //数据组装.
-//     let noe_row_name = vec!["时间", "成交Id", "变更金额", "变更后余额", "变更类型", "合约标识", "注释"];
-//     //创建表格
-//     //提示。涉及到 需要转换的数据,请提前自行转换,工具只负责写入生成
-//     // after - 之后的,时间戳> after 才是有效数据
-//     match creation_xlsx(&noe_row_name, &acc_all_data,
-//                         "okx".to_string(),
-//     ) {
-//         Ok(d) => {
-//             trace!("完成");
-//         }
-//         Err(z) => {
-//             eprint!("{:?}", z);
-//             trace!("失败");
-//         }
-//     }
-// }

+ 0 - 5
global/.gitignore

@@ -1,5 +0,0 @@
-/target
-/.idea
-/logs
-
-Cargo.lock

+ 0 - 28
global/Cargo.toml

@@ -1,28 +0,0 @@
-[package]
-name = "global"
-version = "0.1.0"
-edition = "2021"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
-rust_decimal = "1.32.0"
-rust_decimal_macros = "1.32.0"
-tracing = "0.1"
-tracing-subscriber = { version = "0.3.17", features = [
-    "env-filter",
-    "time",
-    "local-time"
-] }
-time = { version = "0.3.7", features = ["macros"] }
-tracing-appender-timezone = { git = "https://github.com/skyfffire/tracing-appender-timezone.git" }
-toml = "0.5.11"
-serde = "1.0.183"
-serde_derive = "1.0"
-serde_json = "1.0.104"
-chrono = "0.4.26"
-tokio = { version = "1.31.0", features = ["full"] }
-base64 = "0.13.0"
-reqwest = "0.11.22"
-uuid = { version = "1.5.0", features = ["v4"] }
-simple_excel_writer = "0.2.0"

+ 0 - 38
global/src/export_utils.rs

@@ -1,38 +0,0 @@
-use chrono::Local;
-use simple_excel_writer::*;
-use uuid::Uuid;
-
-pub fn export_excel(header_array: Vec<&str>, data: Vec<Vec<String>>, prefix_name: &str) -> String {
-    //本地存储路径
-    let save_path = "C:/Users/Public/Documents/";
-    let _ = std::fs::create_dir(format!("{}rust_export/", save_path));
-    // 当前时间
-    let date = Local::now().format("%Y-%m-%d").to_string();
-    let uid = Uuid::new_v4().to_string()[0..8].to_string();
-    let name = if prefix_name == "" { "".to_string() } else { format!("{}_", prefix_name) };
-    let file_name = format!("{}rust_export/{}{}_{}.xlsx", save_path, name, date, uid);
-    let mut wb = Workbook::create(&file_name);
-    let mut sheet = wb.create_sheet("sheet1");
-    // 设置行宽
-    for _ in 0..header_array.len() {
-        sheet.add_column(Column { width: 30.0 });
-    }
-    wb.write_sheet(&mut sheet, |sheet_writer| {
-        let sw = sheet_writer;
-        let mut header_row = Row::new();
-        for value in header_array.clone() {
-            header_row.add_cell(value);
-        }
-        sw.append_row(header_row).expect(format!("创建excel标题错误!header:{:?}", header_array).as_str());
-        for cell in data.clone() {
-            let mut data_row = Row::new();
-            for value in cell.clone() {
-                data_row.add_cell(value);
-            }
-            sw.append_row(data_row).expect(format!("添加excel数据错误!cell:{:?}", cell).as_str());
-        }
-        sw.append_row(Default::default())
-    }).expect("写入excel错误!");
-    wb.close().expect("关闭excel错误!");
-    file_name
-}

+ 0 - 10
global/src/lib.rs

@@ -1,10 +0,0 @@
-pub mod public_params;
-pub mod log_utils;
-pub mod params;
-pub mod trace_stack;
-pub mod export_utils;
-pub mod account_info;
-pub mod cci;
-pub mod clear_position_result;
-pub mod trade;
-pub mod clear_log_utils;

+ 0 - 33
global/tests/appender_test.rs

@@ -1,33 +0,0 @@
-// use tracing::{info};
-// use tracing_subscriber::{fmt};
-// use tracing_subscriber::prelude::*;
-// use std::io;
-// 
-// #[tokio::test]
-// async fn appender_test() {
-//     let file_appender = tracing_appender::rolling::daily("./logs", "tracing.log");
-//     let (non_blocking, _) = tracing_appender::non_blocking(file_appender);
-// 
-//     let fmt_layer = fmt::layer()
-//         .with_target(false)
-//         .with_level(true)
-//         .with_writer(io::stdout);
-// 
-//     let file_layer = fmt::layer()
-//         .with_target(true)
-//         .with_ansi(false)
-//         .with_level(true)
-//         .with_writer(non_blocking.clone());
-// 
-//     let subscriber = tracing_subscriber::Registry::default()
-//         .with(fmt_layer)
-//         .with(file_layer)
-//         .with(tracing_subscriber::EnvFilter::new("info"));
-// 
-//     let _ = tracing::subscriber::set_global_default(subscriber);
-//     let number = 42;
-//     info!(answer = number, "the answer to life, the universe, and everything");
-// 
-//     // 使 main 函数“等待”一段时间,增大日志被正确写入的机会
-//     tokio::time::sleep(std::time::Duration::from_secs(10)).await;
-// }

+ 0 - 12
global/tests/export_utils_test.rs

@@ -1,12 +0,0 @@
-// use tracing::trace;
-// use global::export_utils;
-// 
-// #[tokio::test]
-// async fn export_excel() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let header = vec!["标题1", "标题2"];
-//     let data = vec![vec!["第一行数据1", "第一行数据2"], vec!["第二行数据1", "第二行数据2"]];
-//     let file_name = export_utils::export_excel(header,data,"");
-//     trace!(?file_name);
-// }

+ 0 - 10
global/tests/get_account_info_test.rs

@@ -1,10 +0,0 @@
-use tracing::trace;
-use global::account_info;
-
-#[tokio::test]
-async fn get_account_info() {
-    global::log_utils::init_log_with_trace();
-
-    let account_info = account_info::get_account_info("../test_account.toml");
-    trace!(?account_info);
-}

+ 0 - 0
global/src/account_info.rs → src/account_info.rs


+ 0 - 0
global/src/cci.rs → src/cci.rs


+ 14 - 27
strategy/src/clear_core.rs → src/clear_core.rs

@@ -2,30 +2,26 @@ use tokio::time::Instant;
 use std::collections::{BTreeMap, HashMap};
 use std::io::Error;
 use std::sync::Arc;
-use std::sync::atomic::{AtomicBool};
+use std::sync::atomic::AtomicBool;
 use std::time::Duration;
-use chrono::{Utc};
-use reqwest::header::{CONTENT_TYPE, HeaderMap, HeaderValue};
+use chrono::Utc;
+use reqwest::header::{HeaderMap, HeaderValue, CONTENT_TYPE};
 use rust_decimal::Decimal;
 use rust_decimal_macros::dec;
-use tokio::sync::mpsc::{Sender};
-use tokio::sync::{Mutex};
+use tokio::sync::mpsc::Sender;
+use tokio::sync::Mutex;
 use tokio::time::sleep;
 use tracing::{error, info, warn};
-use global::cci::CentralControlInfo;
-use global::clear_position_result::ClearPositionResult;
-use global::params::Params;
-use global::trace_stack::TraceStack;
-use standard::{Account, Market, Order, Platform, Position, PositionModeEnum, SpecialTicker};
-use standard::exchange::{Exchange};
-use standard::exchange::ExchangeEnum::GateSwap;
-
-use crate::model::{LocalPosition, OrderInfo};
+use crate::cci::CentralControlInfo;
+use crate::clear_position_result::ClearPositionResult;
+use crate::params::Params;
+use crate::gate_swap::GateSwap;
+use crate::model::{Account, LocalPosition, Market, Order, OrderInfo, Position, PositionModeEnum, SpecialTicker};
 use crate::strategy::Strategy;
+use crate::trace_stack::TraceStack;
 use crate::utils;
 use crate::utils::clip;
 
-
 pub struct ClearCore {
     pub params: Params,
     // 启动时间
@@ -89,7 +85,7 @@ pub struct ClearCore {
     pub trade_name: String,
     pub ready: i8,
     pub market: Market,
-    pub platform_rest: Box<dyn Platform + Send + Sync>,
+    pub platform_rest: GateSwap,
     // 市场最优买卖价
     pub max_buy_min_sell_cache: HashMap<String, Vec<Decimal>>,
     // 最近一次的depth信息
@@ -112,8 +108,7 @@ pub struct ClearCore {
 }
 
 impl ClearCore {
-    pub async fn new(exchange: String,
-                     params: Params,
+    pub async fn new(params: Params,
                      exchange_params: BTreeMap<String, String>,
                      order_sender: Sender<Order>,
                      error_sender: Sender<Error>,
@@ -185,15 +180,7 @@ impl ClearCore {
                 ct_val: Default::default(),
                 amount_size: Default::default(),
             },
-            platform_rest: match exchange.as_str() {
-                "gate_usdt_swap" => {
-                    Exchange::new(GateSwap, symbol, params.colo != 0i8, exchange_params, order_sender, error_sender).await
-                }
-                _ => {
-                    error!("203未找到对应的交易所rest枚举!");
-                    panic!("203未找到对应的交易所rest枚举!");
-                }
-            },
+            platform_rest: GateSwap::new(symbol, params.colo != 0i8, exchange_params, order_sender, error_sender).await,
             max_buy_min_sell_cache: Default::default(),
             local_depths: Default::default(),
             is_update: Default::default(),

+ 5 - 6
src/clear_core_libs.rs

@@ -5,10 +5,10 @@ use std::sync::Arc;
 use std::sync::atomic::{AtomicBool};
 use tokio::sync::{mpsc, Mutex};
 use tracing::{info};
-use global::cci::CentralControlInfo;
-use global::params::Params;
-use standard::Order;
-use strategy::clear_core::ClearCore;
+use crate::cci::CentralControlInfo;
+use crate::params::Params;
+use crate::clear_core::ClearCore;
+use crate::model::Order;
 
 pub async fn init(params: Params,
                   _ws_running: Arc<AtomicBool>,
@@ -23,8 +23,7 @@ pub async fn init(params: Params,
     let (order_sender, _order_receiver) = mpsc::channel::<Order>(100);
     let (error_sender, _error_receiver) = mpsc::channel::<Error>(100);
 
-    let mut core_obj = ClearCore::new(params.exchange.clone(),
-                                 params.clone(),
+    let mut core_obj = ClearCore::new(params.clone(),
                                  exchange_params.clone(),
                                  order_sender.clone(),
                                  error_sender.clone(),

+ 23 - 25
global/src/clear_log_utils.rs → src/clear_log_utils.rs

@@ -1,11 +1,9 @@
-use std::collections::HashMap;
 use std::fmt::Debug;
 use std::io;
-use tracing::{Event, info, Subscriber, warn};
+use tracing::{Event, info, Subscriber};
 use tracing_appender_timezone::non_blocking::WorkerGuard;
 use tracing_subscriber::{fmt, Layer};
 use tracing_subscriber::layer::{Context, SubscriberExt};
-use reqwest::{Client};
 use tracing::field::{Field, Visit};
 use tracing_appender_timezone::rolling::{RollingFileAppender, Rotation};
 
@@ -45,28 +43,28 @@ where
     }
 }
 
-pub fn send_remote_err_log(msg: String) {
-    tokio::spawn(async move {
-        let encoded_str = base64::encode(msg.clone());
-        let mut request_json_data = HashMap::new();
-        request_json_data.insert("serverName", "As");
-        request_json_data.insert("data", encoded_str.as_str());
-
-        let res = Client::new().post("https://hhh.liangjiang.cc/api/log/addError?key=d64a8sc874sa8c4as5")
-            .json(&request_json_data)
-            .send()
-            .await;
-
-        match res {
-            Ok(_resp) => {
-                // let body = _resp.text().await.unwrap();
-            }
-            Err(err) => {
-                warn!("log的error监听器发送远端报错失败:{:?}", err);
-            }
-        }
-    });
-}
+// pub fn send_remote_err_log(msg: String) {
+//     tokio::spawn(async move {
+//         let encoded_str = base64::encode(msg.clone());
+//         let mut request_json_data = HashMap::new();
+//         request_json_data.insert("serverName", "As");
+//         request_json_data.insert("data", encoded_str.as_str());
+//
+//         let res = Client::new().post("https://hhh.liangjiang.cc/api/log/addError?key=d64a8sc874sa8c4as5")
+//             .json(&request_json_data)
+//             .send()
+//             .await;
+//
+//         match res {
+//             Ok(_resp) => {
+//                 // let body = _resp.text().await.unwrap();
+//             }
+//             Err(err) => {
+//                 warn!("log的error监听器发送远端报错失败:{:?}", err);
+//             }
+//         }
+//     });
+// }
 
 pub fn init_log_with_debug() {
     let _ = final_init(tracing::Level::DEBUG.as_str(), 0, "test".to_string());

+ 0 - 0
global/src/clear_position_result.rs → src/clear_position_result.rs


+ 28 - 203
strategy/src/core.rs → src/core.rs

@@ -3,34 +3,30 @@ use std::cmp::max;
 use std::collections::{BTreeMap, HashMap, VecDeque};
 use std::io::Error;
 use std::str::FromStr;
-use std::sync::{Arc};
+use std::sync::Arc;
 use std::sync::atomic::{AtomicBool, Ordering};
 use std::time::Duration;
-use chrono::{Utc};
+use chrono::Utc;
 use rust_decimal::{Decimal, MathematicalOps};
-use rust_decimal::prelude::{ToPrimitive};
+use rust_decimal::prelude::ToPrimitive;
 use rust_decimal_macros::dec;
 use tokio::spawn;
-use tokio::sync::mpsc::{Sender};
-use tokio::sync::{Mutex};
+use tokio::sync::mpsc::Sender;
+use tokio::sync::Mutex;
 use tokio::task::JoinHandle;
 use tokio::time::sleep;
 use tracing::{error, info, warn};
-use global::cci::CentralControlInfo;
-use global::params::Params;
-use global::public_params::{ASK_PRICE_INDEX, BID_PRICE_INDEX, LENGTH};
-use global::trace_stack::TraceStack;
-use global::trade::Trade;
-use standard::{Account, Market, Order, OrderCommand, Platform, Position, PositionModeEnum, SpecialTicker, Ticker};
-use standard::exchange::{Exchange};
-use standard::exchange::ExchangeEnum::GateSwap;
-
-use crate::model::{LocalPosition, OrderInfo, TokenParam};
+use crate::cci::CentralControlInfo;
+use crate::params::Params;
+use crate::public_params::{ASK_PRICE_INDEX, BID_PRICE_INDEX, LENGTH};
+use crate::gate_swap::GateSwap;
+use crate::model::{Account, LocalPosition, Market, Order, OrderCommand, OrderInfo, Position, PositionModeEnum, SpecialTicker, Ticker};
 use crate::strategy::Strategy;
+use crate::trace_stack::TraceStack;
+use crate::trade::Trade;
 use crate::utils;
 use crate::utils::clip;
 
-
 pub struct Core {
     pub params: Params,
     // 启动时间
@@ -92,7 +88,7 @@ pub struct Core {
     pub trade_name: String,
     pub ready: i8,
     pub market: Market,
-    pub platform_rest: Box<dyn Platform + Send + Sync>,
+    pub platform_rest: GateSwap,
     // 最近一次的depth信息
     pub local_depths: HashMap<String, Vec<Decimal>>,
     pub is_update: HashMap<String, bool>,
@@ -118,8 +114,7 @@ pub struct Core {
 }
 
 impl Core {
-    pub async fn new(exchange: String,
-                     params: Params,
+    pub async fn new(params: Params,
                      exchange_params: BTreeMap<String, String>,
                      order_sender: Sender<Order>,
                      error_sender: Sender<Error>,
@@ -189,15 +184,7 @@ impl Core {
                 ct_val: Default::default(),
                 amount_size: Default::default(),
             },
-            platform_rest: match exchange.as_str() {
-                "gate_usdt_swap" => {
-                    Exchange::new(GateSwap, symbol, params.colo != 0i8, exchange_params, order_sender, error_sender).await
-                }
-                _ => {
-                    error!("203未找到对应的交易所rest枚举!");
-                    panic!("203未找到对应的交易所rest枚举!");
-                }
-            },
+            platform_rest: GateSwap::new(symbol, params.colo != 0i8, exchange_params, order_sender, error_sender).await,
             local_depths: Default::default(),
             is_update: Default::default(),
             running,
@@ -231,6 +218,7 @@ impl Core {
         }
     }
 
+    // 本地订单维护
     pub async fn update_local_order(&mut self, data: OrderInfo, trace_stack: TraceStack) {
         if data.filled != Decimal::ZERO {
             info!("\n\n");
@@ -481,6 +469,7 @@ impl Core {
         }
     }
 
+    // 打印本地交易数据
     pub fn _print_local_trades_summary(&mut self) {
         // 计算本地累计利润
         let local_buy_amount = self.local_buy_amount.round_dp(5);
@@ -532,6 +521,7 @@ impl Core {
         }
     }
 
+    // 行情数据更新
     pub async fn on_depth_update(&mut self, depth: &Vec<Decimal>, name_ref: &String, trace_stack: &mut TraceStack) {
         // 要从回调传入的深度信息中获取data.name
         let now_time = Utc::now().timestamp_millis();
@@ -614,7 +604,6 @@ impl Core {
             }
         }
 
-
         {
             let mut unrealized_pn_l = self.local_profit;
             unrealized_pn_l.rescale(4);
@@ -1035,7 +1024,7 @@ impl Core {
         let now_time_millis = Utc::now().timestamp_millis();
         let last_update_millis = self.market_update_time.get(&self.trade_name).unwrap();
         let delay = now_time_millis - last_update_millis;
-        let limit = global::public_params::MARKET_DELAY_LIMIT;
+        let limit = crate::public_params::MARKET_DELAY_LIMIT;
 
         if self.ready == 1 && delay > limit {
             let exit_msg = format!("{} ticker_name:{}, delay:{}ms,行情更新延迟过高,退出。",
@@ -1100,62 +1089,6 @@ impl Core {
             self.stop().await;
         }
     }
-    pub async fn buy_token(&mut self) {
-        // 买入平台币
-        // 获取U数量,平台币数量
-        // 更新账户
-        let mut cash = Decimal::ZERO;
-        let mut token = Decimal::ZERO;
-        let token_param = get_exchange_token(&self.exchange);
-        if token_param.token == "***" {
-            error!("购买平台币失败,未找到交易所的平台币!");
-            return;
-        }
-        match self.platform_rest.get_spot_account().await {
-            Ok(val) => {
-                for account in val {
-                    if account.coin == "USDT".to_string() {
-                        cash += account.balance;
-                    }
-                    if token_param.token == account.coin {
-                        token += account.balance;
-                    }
-                }
-            }
-            Err(err) => {
-                error!("购买{}-获取账户失败 {}", token_param.token, err);
-            }
-        }
-        info!("持u {} , 持有平台币 {}", cash, token);
-        match self.platform_rest.get_ticker_symbol(format!("{}_USDT", token_param.token)).await {
-            Ok(val) => {
-                let mp = (val.buy + val.sell) / Decimal::TWO;
-                let token_value = token * mp;
-                if token_value < token_param.limit_value {
-                    info!("平台币 {} 数量过少,需要补充。", token_param.token);
-                    let need_cash: Decimal = Decimal::TWO * Decimal::ONE_HUNDRED;
-                    if cash > need_cash {
-                        info!("准备买入{}", token_param.token);
-                        match self.platform_rest.take_order_symbol(token_param.token, Decimal::ONE, "t-888", "kd", mp * Decimal::from_str("1.001").unwrap(), Decimal::from_str("50").unwrap() / mp).await {
-                            Ok(value) => {
-                                info!("买入平台币下单成功: {:?}", value);
-                            }
-                            Err(error) => {
-                                error!("买入平台币下单失败: {}", error)
-                            }
-                        }
-                    } else {
-                        info!("账户余额:{}{},至少需要:{}{}, 不执行买入{}操作!", cash, self.quote, need_cash, self.quote, token_param.token);
-                    }
-                } else {
-                    info!("平台币{}数量充足!", token_param.token);
-                }
-            }
-            Err(err) => {
-                error!("购买平台币-获取平台币行情失败 {}", err);
-            }
-        }
-    }
 
     pub async fn check_position(&mut self, target_hold_coin: Decimal, is_first_clear: bool) -> bool {
         info!("------------------------------------------------------------------------------------------------------------");
@@ -1304,6 +1237,7 @@ impl Core {
         return length;
     }
 
+    // 检查仓位信息与清仓
     pub async fn check_position_swap(&mut self) -> usize {
         let mut length = 0;
         match self.platform_rest.get_positions().await {
@@ -1358,66 +1292,6 @@ impl Core {
                         }
                     };
                 }
-                // match self.platform_rest.get_ticker_symbol(position.symbol.clone()).await {
-                //     Ok(ticker) => {
-                //         let ap = ticker.sell;
-                //         let bp = ticker.buy;
-                //         let mp = (ap + bp) / Decimal::TWO;
-                //         let price;
-                //         let side;
-                //         let market_info;
-                //         // 获取market
-                //         match self.platform_rest.get_market_symbol(position.symbol.clone()).await {
-                //             Ok(market) => {
-                //                 market_info = market;
-                //             }
-                //             Err(err) => {
-                //                 error!("    {} 获取当前market异常: {}", position.symbol.clone(), err);
-                //                 continue;
-                //             }
-                //         }
-                //         info!(?position);
-                //         match position.position_mode {
-                //             PositionModeEnum::Long => {
-                //                 // pd
-                //                 price = (mp * dec!(0.9985) / market_info.tick_size).floor() * market_info.tick_size;
-                //                 side = "pd";
-                //             }
-                //             PositionModeEnum::Short => {
-                //                 // pk
-                //                 price = (mp * dec!(1.0015) / market_info.tick_size).floor() * market_info.tick_size;
-                //                 side = "pk";
-                //             }
-                //             _ => {
-                //                 error!("    仓位position_mode匹配失败,不做操作!");
-                //                 // 执行完当前币对  结束循环
-                //                 continue;
-                //             }
-                //         }
-                //         // 发起清仓订单
-                //         info!(?ticker);
-                //         let mut ts = TraceStack::new(0, Instant::now());
-                //         ts.on_before_send();
-                //         match self.platform_rest.take_order_symbol(position.symbol.clone(), Decimal::ONE, utils::generate_client_id(None).as_str(), side, price, position.amount.abs()).await {
-                //             Ok(order) => {
-                //                 ts.on_after_send();
-                //                 info!("    {}仓位清除下单成功 {:?}, {}", position.symbol.clone(), order, ts.to_string());
-                //                 // 执行完当前币对  结束循环
-                //                 continue;
-                //             }
-                //             Err(error) => {
-                //                 ts.on_after_send();
-                //                 error!("    {}仓位清除下单异常 {}, {}", position.symbol.clone(), error, ts.to_string());
-                //                 // 执行完当前币对  结束循环
-                //                 continue;
-                //             }
-                //         };
-                //     }
-                //     Err(err) => {
-                //         error!("    {} 获取当前ticker异常: {}", position.symbol.clone(), err)
-                //     }
-                // }
-                // }
             }
             Err(error) => {
                 length = 0;
@@ -1425,11 +1299,10 @@ impl Core {
                 error!("获取仓位信息异常: {}", error);
             }
         }
-
         length
     }
 
-
+    // 停机
     pub async fn stop(&mut self) {
         /*
          *  停机函数
@@ -1441,17 +1314,6 @@ impl Core {
         info!("进入停机流程...");
         self.running.store(false, Ordering::Relaxed);
         self.mode_signal = 80;
-        // info!("开始退出操作");
-        // info!("为避免api失效导致遗漏仓位 建议人工复查");
-        // self.check_position().await;
-        // // 开启停机信号
-        // // sleep(Duration::from_secs(1)).await;
-        // info!("双重检查遗漏仓位");
-        // self.check_position().await;
-        // info!("停机退出  停机原因: {}", self.exit_msg);
-        // // 发送交易状态 await self._post_params()
-        // // TODO: 向中控发送信号
-        // info!("退出进程!");
     }
 
     pub async fn exit(&mut self) {
@@ -1464,6 +1326,7 @@ impl Core {
         info!("停机原因:{}。", self.exit_msg);
     }
 
+    // 交易前准备函数(价格信息,账户信息,精度信息等信息获取与确认)
     pub async fn before_trade(&mut self) -> bool {
         sleep(Duration::from_secs(1)).await;
         // 获取市场信息
@@ -1559,24 +1422,12 @@ impl Core {
         self.local_cash = start_cash;
         self.local_coin = start_coin;
 
-        // 买入平台币
-        if self.exchange.contains("spot") { // 现货
-            self.buy_token().await;
-        }
-
         // 清空挂单和仓位
         self.clear_position_and_orders(self.hold_coin).await;
-        /*
-        ###### 交易前准备就绪 可以开始交易 ######
-        self.loop.create_task(self.rest.go())
-        self.loop.create_task(self.on_timer())
-        self.loop.create_task(self._run_server())
-        self.loop.create_task(self.run_stratey())
-        self.loop.create_task(self.early_stop_loop())
-        */
-        return true;
+        true
     }
 
+    // 清理挂单和仓位
     pub async fn clear_position_and_orders(&mut self, target_hold_coin: Decimal) {
         let mut clear_count = 1;
         let mut total_clear_count = 1;
@@ -1612,9 +1463,9 @@ impl Core {
         }
     }
 }
-
+//
 pub fn run_strategy(core_arc: Arc<Mutex<Core>>) -> JoinHandle<()> {
-    return spawn(async move {
+    spawn(async move {
         //定期触发策略
         info!("定时触发器启动");
         info!("前期准备完成");
@@ -1700,10 +1551,10 @@ pub fn run_strategy(core_arc: Arc<Mutex<Core>>) -> JoinHandle<()> {
             }
             sleep(Duration::from_millis(delay)).await;
         }
-    });
+    })
 }
 
-// 定期触发的系统逻辑
+// 定期触发的系统逻辑(风控检查等操作)
 pub fn on_timer(core_arc: Arc<Mutex<Core>>) -> JoinHandle<()> {
     let core_arc_clone = core_arc.clone();
 
@@ -1729,13 +1580,6 @@ pub fn on_timer(core_arc: Arc<Mutex<Core>>) -> JoinHandle<()> {
                 let trade_vol_24h = (total_trade_value / time_diff) * dec!(86400);
                 core.strategy.trade_vol_24h_w = trade_vol_24h / dec!(10000);
                 core.strategy.trade_vol_24h_w.rescale(2);
-
-                // TODO core没有rest
-                // info!("Rest报单平均延迟{}ms", core.rest.avg_delay);
-                // info!("Rest报单最高延迟{}ms", core.rest.max_delay);
-                for (_name, _interval) in &core.market_update_interval {
-                    // debug!("WS盘口{}行情平均更新间隔{}ms。", name, interval);
-                }
             }
         }
     })
@@ -1751,23 +1595,4 @@ pub fn check_coin(exchanges: &String, coin_name: &String) -> bool {
         _ => {}
     }
     result
-}
-
-//获取平台币
-pub fn get_exchange_token(exchanges: &String) -> TokenParam {
-    return match exchanges.as_str() {
-        "bitget_spot" => {
-            TokenParam {
-                token: "BGB".to_string(),
-                // 30u
-                limit_value: Decimal::TEN * (Decimal::ONE + Decimal::TWO),
-            }
-        }
-        _ => {
-            TokenParam {
-                token: "***".to_string(),
-                limit_value: Decimal::ZERO,
-            }
-        }
-    };
 }

+ 9 - 35
src/core_libs.rs

@@ -1,20 +1,19 @@
 
-use strategy::core::Core;
+use crate::core::Core;
 use std::collections::BTreeMap;
 use std::io::Error;
-use strategy::{exchange_disguise, core};
 use std::sync::Arc;
-use std::sync::atomic::{AtomicBool};
+use std::sync::atomic::AtomicBool;
 use std::time::Duration;
 use chrono::Utc;
 use tokio::sync::{mpsc, Mutex};
 use tokio::time::Instant;
 use tracing::{error, info};
-use global::cci::CentralControlInfo;
-use global::params::Params;
-use global::trace_stack::TraceStack;
-use standard::Order;
-use strategy::model::OrderInfo;
+use crate::cci::CentralControlInfo;
+use crate::params::Params;
+use crate::model::{Order, OrderInfo};
+use crate::{core, exchange_disguise};
+use crate::trace_stack::TraceStack;
 
 pub async fn init(params: Params,
                   ws_running: Arc<AtomicBool>,
@@ -29,8 +28,7 @@ pub async fn init(params: Params,
     let (order_sender, mut order_receiver) = mpsc::channel::<Order>(100);
     let (error_sender, mut error_receiver) = mpsc::channel::<Error>(100);
 
-    let mut core_obj = Core::new(params.exchange.clone(),
-                                   params.clone(),
+    let mut core_obj = Core::new(params.clone(),
                                    exchange_params.clone(),
                                    order_sender.clone(),
                                    error_sender.clone(),
@@ -67,9 +65,7 @@ pub async fn init(params: Params,
                     let trace_stack = TraceStack::new(Utc::now().timestamp_micros(), Instant::now());
 
                     if order.status != "NULL" {
-                        // trace_stack.on_before_format();
                         let mut core = order_handler_core_arc.lock().await;
-                        // let mut delay_time_lock_instance = delay_time_lock.lock().await;
                         let order_info = OrderInfo {
                             symbol: "".to_string(),
                             amount: order.amount.abs(),
@@ -85,7 +81,6 @@ pub async fn init(params: Params,
                             fee: Default::default(),
                             trace_stack: order.trace_stack.clone(),
                         };
-                        // trace_stack.on_after_format();
 
                         core.update_local_order(order_info.clone(), trace_stack).await;
                     }
@@ -115,26 +110,5 @@ pub async fn init(params: Params,
         }
     });
 
-    // 定时仓位检测
-    // let markt_price_core_arc = core_arc.clone();
-    // tokio::spawn(async move {
-    //     info!("rest仓位检测定时任务启动(5s)...");
-    //     loop {
-    //         tokio::time::sleep(Duration::from_secs(5)).await;
-    //
-    //         let mut core = markt_price_core_arc.lock().await;
-    //         match core.platform_rest.get_positions().await {
-    //             Ok(pos) => {
-    //                 if pos.len() > 0 {
-    //                     core.update_position(pos).await;
-    //                 }
-    //             },
-    //             Err(err) => {
-    //                 error!("rest持仓数据获取异常 {}", err);
-    //             }
-    //         };
-    //     }
-    // });
-
-    return core_arc;
+    core_arc
 }

+ 6 - 6
standard/src/exchange.rs → src/exchange.rs

@@ -1,8 +1,8 @@
 use std::collections::{BTreeMap};
 use std::io::Error;
 use tokio::sync::mpsc::Sender;
-use crate::{Order, Platform};
 use crate::gate_swap::GateSwap;
+use crate::model::Order;
 
 /// 交易所交易模式枚举
 /// - `BinanceSwap`: Binance交易所期货;
@@ -12,7 +12,7 @@ use crate::gate_swap::GateSwap;
 /// - `KucoinSwap`: kucoin交易所期货;
 #[derive(Debug, Clone, PartialEq, Eq)]
 pub enum ExchangeEnum {
-    GateSwap
+    GateSwapEnum
 }
 
 /// Exchange结构体
@@ -41,7 +41,7 @@ pub enum ExchangeEnum {
 /// use std::collections::BTreeMap;
 /// use std::io::Error;
 /// use tokio::sync::mpsc;
-/// use standard::exchange::{Exchange, ExchangeEnum};
+/// use as_rust::exchange::{Exchange, ExchangeEnum};
 /// use standard::Order;
 ///
 /// let mut params:BTreeMap<String,String> = BTreeMap::new();
@@ -55,10 +55,10 @@ pub enum ExchangeEnum {
 pub struct Exchange;
 
 impl Exchange {
-    pub async fn new(exchange: ExchangeEnum, symbol: String, is_colo: bool, params: BTreeMap<String, String>, order_sender: Sender<Order>, error_sender: Sender<Error>) -> Box<dyn Platform + Send + Sync> {
+    pub async fn new(exchange: ExchangeEnum, symbol: String, is_colo: bool, params: BTreeMap<String, String>, order_sender: Sender<Order>, error_sender: Sender<Error>) -> GateSwap {
         match exchange {
-            ExchangeEnum::GateSwap => {
-                Box::new(GateSwap::new(symbol, is_colo, params, order_sender, error_sender).await)
+            ExchangeEnum::GateSwapEnum => {
+                GateSwap::new(symbol, is_colo, params, order_sender, error_sender).await
             }
         }
     }

+ 3 - 4
strategy/src/exchange_disguise.rs → src/exchange_disguise.rs

@@ -3,11 +3,10 @@ use std::sync::Arc;
 use std::sync::atomic::AtomicBool;
 use rust_decimal::Decimal;
 use tokio::sync::Mutex;
-use global::trace_stack::TraceStack;
-use standard::SpecialDepth;
-
-use crate::gate_swap::gate_swap_run;
 use crate::core::Core;
+use crate::gate_usdt_swap::gate_swap_run;
+use crate::model::SpecialDepth;
+use crate::trace_stack::TraceStack;
 
 // 交易交易所启动
 pub async fn run_transactional_exchange(is_shutdown_arc :Arc<AtomicBool>,

+ 40 - 42
standard/src/gate_swap.rs → src/gate_swap.rs

@@ -2,7 +2,6 @@ use std::collections::{BTreeMap};
 use std::io::{Error, ErrorKind};
 use std::str::FromStr;
 use tokio::sync::mpsc::Sender;
-use async_trait::async_trait;
 use futures::stream::FuturesUnordered;
 use futures::TryStreamExt;
 use rust_decimal::Decimal;
@@ -11,9 +10,10 @@ use serde_json::{json, Value};
 use tokio::spawn;
 use tokio::time::Instant;
 use tracing::{error, info};
-use crate::{Platform, ExchangeEnum, Account, Position, Ticker, Market, Order, OrderCommand, PositionModeEnum};
-use exchanges::gate_swap_rest::GateSwapRest;
-use global::trace_stack::TraceStack;
+use crate::exchange::ExchangeEnum;
+use crate::gate_swap_rest::GateSwapRest;
+use crate::model::{Account, Market, Order, OrderCommand, Position, PositionModeEnum, Ticker};
+use crate::trace_stack::TraceStack;
 
 #[allow(dead_code)]
 #[derive(Clone)]
@@ -32,7 +32,7 @@ impl GateSwap {
     pub async fn new(symbol: String, is_colo: bool, params: BTreeMap<String, String>, order_sender: Sender<Order>, error_sender: Sender<Error>) -> GateSwap {
         let market = Market::new();
         let mut gate_swap = GateSwap {
-            exchange: ExchangeEnum::GateSwap,
+            exchange: ExchangeEnum::GateSwapEnum,
             symbol: symbol.to_uppercase(),
             is_colo,
             params: params.clone(),
@@ -55,39 +55,37 @@ impl GateSwap {
         }
         // 获取市场信息
         gate_swap.market = GateSwap::get_market(&mut gate_swap).await.unwrap_or(gate_swap.market);
-        return gate_swap;
+        gate_swap
     }
-}
 
-#[async_trait]
-impl Platform for GateSwap {
+
     // 克隆方法
-    fn clone_box(&self) -> Box<dyn Platform + Send + Sync> { Box::new(self.clone()) }
+    pub fn clone_box(&self) -> GateSwap { self.clone() }
     // 获取交易所模式
-    fn get_self_exchange(&self) -> ExchangeEnum {
-        ExchangeEnum::GateSwap
+    pub fn get_self_exchange(&self) -> ExchangeEnum {
+        ExchangeEnum::GateSwapEnum
     }
     // 获取交易对
-    fn get_self_symbol(&self) -> String { self.symbol.clone() }
+    pub fn get_self_symbol(&self) -> String { self.symbol.clone() }
     // 获取是否使用高速通道
-    fn get_self_is_colo(&self) -> bool {
+    pub fn get_self_is_colo(&self) -> bool {
         self.is_colo
     }
     // 获取params信息
-    fn get_self_params(&self) -> BTreeMap<String, String> {
+    pub fn get_self_params(&self) -> BTreeMap<String, String> {
         self.params.clone()
     }
     // 获取market信息
-    fn get_self_market(&self) -> Market { self.market.clone() }
+    pub fn get_self_market(&self) -> Market { self.market.clone() }
     // 获取请求时间
-    fn get_request_delays(&self) -> Vec<i64> { self.request.get_delays() }
+    pub fn get_request_delays(&self) -> Vec<i64> { self.request.get_delays() }
     // 获取请求平均时间
-    fn get_request_avg_delay(&self) -> Decimal { self.request.get_avg_delay() }
+    pub fn get_request_avg_delay(&self) -> Decimal { self.request.get_avg_delay() }
     // 获取请求最大时间
-    fn get_request_max_delay(&self) -> i64 { self.request.get_max_delay() }
+    pub fn get_request_max_delay(&self) -> i64 { self.request.get_max_delay() }
 
     // 获取服务器时间
-    async fn get_server_time(&mut self) -> Result<String, Error> {
+    pub async fn get_server_time(&mut self) -> Result<String, Error> {
         let res_data = self.request.get_server_time().await;
         if res_data.code == 200 {
             let res_data_json: serde_json::Value = res_data.data;
@@ -98,7 +96,7 @@ impl Platform for GateSwap {
         }
     }
     // 获取账号信息
-    async fn get_account(&mut self) -> Result<Account, Error> {
+    pub async fn get_account(&mut self) -> Result<Account, Error> {
         let symbol_array: Vec<&str> = self.symbol.split("_").collect();
         let res_data = self.request.get_account(symbol_array[1].to_string().to_lowercase()).await;
         if res_data.code == 200 {
@@ -121,12 +119,12 @@ impl Platform for GateSwap {
         }
     }
 
-    async fn get_spot_account(&mut self) -> Result<Vec<Account>, Error> {
+    pub async fn get_spot_account(&mut self) -> Result<Vec<Account>, Error> {
         Err(Error::new(ErrorKind::NotFound, "gate_swap:该交易所方法未实现".to_string()))
     }
 
     // 获取持仓信息
-    async fn get_position(&mut self) -> Result<Vec<Position>, Error> {
+    pub async fn get_position(&mut self) -> Result<Vec<Position>, Error> {
         let symbol_array: Vec<&str> = self.symbol.split("_").collect();
         let ct_val = self.market.ct_val;
         let res_data = self.request.get_position(symbol_array[1].to_string().to_lowercase(), self.symbol.clone()).await;
@@ -139,7 +137,7 @@ impl Platform for GateSwap {
         }
     }
     // 获取所有持仓
-    async fn get_positions(&mut self) -> Result<Vec<Position>, Error> {
+    pub async fn get_positions(&mut self) -> Result<Vec<Position>, Error> {
         let symbol_array: Vec<&str> = self.symbol.split("_").collect();
         let res_data = self.request.get_user_position(symbol_array[1].to_string().to_lowercase()).await;
         if res_data.code == 200 {
@@ -152,7 +150,7 @@ impl Platform for GateSwap {
         }
     }
     // 获取市场行情
-    async fn get_ticker(&mut self) -> Result<Ticker, Error> {
+    pub async fn get_ticker(&mut self) -> Result<Ticker, Error> {
         let symbol_array: Vec<&str> = self.symbol.split("_").collect();
         let res_data = self.request.get_ticker(symbol_array[1].to_string().to_lowercase()).await;
         if res_data.code == 200 {
@@ -183,7 +181,7 @@ impl Platform for GateSwap {
         }
     }
 
-    async fn get_ticker_symbol(&mut self, symbol: String) -> Result<Ticker, Error> {
+    pub async fn get_ticker_symbol(&mut self, symbol: String) -> Result<Ticker, Error> {
         let symbol_upper = symbol.to_uppercase();
         let symbol_array: Vec<&str> = symbol_upper.split("_").collect();
         let res_data = self.request.get_ticker(symbol_array[1].to_string().to_lowercase()).await;
@@ -215,7 +213,7 @@ impl Platform for GateSwap {
         }
     }
 
-    async fn get_market(&mut self) -> Result<Market, Error> {
+    pub async fn get_market(&mut self) -> Result<Market, Error> {
         let symbol_array: Vec<&str> = self.symbol.split("_").collect();
         let res_data = self.request.get_market_details(symbol_array[1].to_string().to_lowercase()).await;
         if res_data.code == 200 {
@@ -262,7 +260,7 @@ impl Platform for GateSwap {
         }
     }
 
-    async fn get_market_symbol(&mut self, symbol: String) -> Result<Market, Error> {
+    pub async fn get_market_symbol(&mut self, symbol: String) -> Result<Market, Error> {
         let symbol_upper = symbol.to_uppercase();
         let symbol_array: Vec<&str> = symbol_upper.split("_").collect();
         let res_data = self.request.get_market_details(symbol_array[1].to_string().to_lowercase()).await;
@@ -311,7 +309,7 @@ impl Platform for GateSwap {
     }
 
     // 获取订单详情
-    async fn get_order_detail(&mut self, order_id: &str, custom_id: &str) -> Result<Order, Error> {
+    pub async fn get_order_detail(&mut self, order_id: &str, custom_id: &str) -> Result<Order, Error> {
         let symbol_array: Vec<&str> = self.symbol.split("_").collect();
         let ct_val = self.market.ct_val;
         let id = if order_id.eq("") { format!("t-{}", custom_id) } else { order_id.to_string() };
@@ -325,7 +323,7 @@ impl Platform for GateSwap {
         }
     }
     // 获取订单列表
-    async fn get_orders_list(&mut self, status: &str) -> Result<Vec<Order>, Error> {
+    pub async fn get_orders_list(&mut self, status: &str) -> Result<Vec<Order>, Error> {
         let symbol_array: Vec<&str> = self.symbol.split("_").collect();
         let ct_val = self.market.ct_val;
         let res_data = self.request.get_orders(symbol_array[1].to_string().to_lowercase(), status.to_string()).await;
@@ -339,7 +337,7 @@ impl Platform for GateSwap {
         }
     }
     // 下单接口
-    async fn take_order(&mut self, custom_id: &str, origin_side: &str, price: Decimal, amount: Decimal) -> Result<Order, Error> {
+    pub async fn take_order(&mut self, custom_id: &str, origin_side: &str, price: Decimal, amount: Decimal) -> Result<Order, Error> {
         let symbol_array: Vec<&str> = self.symbol.split("_").collect();
         let ct_val = self.market.ct_val;
         let mut params = json!({
@@ -380,7 +378,7 @@ impl Platform for GateSwap {
         }
     }
 
-    async fn take_order_symbol(&mut self, symbol: String, ct_val: Decimal, custom_id: &str, origin_side: &str, price: Decimal, amount: Decimal) -> Result<Order, Error> {
+    pub async fn take_order_symbol(&mut self, symbol: String, ct_val: Decimal, custom_id: &str, origin_side: &str, price: Decimal, amount: Decimal) -> Result<Order, Error> {
         let symbol_upper = symbol.to_uppercase();
         let symbol_array: Vec<&str> = symbol_upper.split("_").collect();
         let mut params = json!({
@@ -422,7 +420,7 @@ impl Platform for GateSwap {
     }
 
     // 撤销订单
-    async fn cancel_order(&mut self, order_id: &str, custom_id: &str) -> Result<Order, Error> {
+    pub async fn cancel_order(&mut self, order_id: &str, custom_id: &str) -> Result<Order, Error> {
         let symbol_array: Vec<&str> = self.symbol.split("_").collect();
         let ct_val = self.market.ct_val;
         let settle = symbol_array[1].to_string().to_lowercase();
@@ -437,7 +435,7 @@ impl Platform for GateSwap {
         }
     }
     // 批量撤销订单
-    async fn cancel_orders(&mut self) -> Result<Vec<Order>, Error> {
+    pub async fn cancel_orders(&mut self) -> Result<Vec<Order>, Error> {
         let symbol_array: Vec<&str> = self.symbol.split("_").collect();
         let ct_val = self.market.ct_val;
         let res_data = self.request.cancel_orders(symbol_array[1].to_string().to_lowercase(), self.symbol.to_string()).await;
@@ -451,7 +449,7 @@ impl Platform for GateSwap {
         }
     }
 
-    async fn cancel_orders_all(&mut self) -> Result<Vec<Order>, Error> {
+    pub async fn cancel_orders_all(&mut self) -> Result<Vec<Order>, Error> {
         let symbol_array: Vec<&str> = self.symbol.split("_").collect();
         let ct_val = self.market.ct_val;
         let orders_res_data = self.request.get_orders(symbol_array[1].to_string().to_lowercase(), "open".to_string()).await;
@@ -476,7 +474,7 @@ impl Platform for GateSwap {
         }
     }
 
-    async fn take_stop_loss_order(&mut self, stop_price: Decimal, price: Decimal, side: &str) -> Result<Value, Error>
+    pub async fn take_stop_loss_order(&mut self, stop_price: Decimal, price: Decimal, side: &str) -> Result<Value, Error>
     {
         let mut params = json!({});
         let mut initial = json!({
@@ -533,7 +531,7 @@ impl Platform for GateSwap {
         }
     }
 
-    async fn cancel_stop_loss_order(&mut self, order_id: &str) -> Result<Value, Error> {
+    pub async fn cancel_stop_loss_order(&mut self, order_id: &str) -> Result<Value, Error> {
         let binding = self.symbol.clone().to_lowercase();
         let symbol_split: Vec<&str> = binding.split("_").collect();
         let base_coin = symbol_split[1].to_string();
@@ -547,7 +545,7 @@ impl Platform for GateSwap {
     }
 
     // 设置持仓模式
-    async fn set_dual_mode(&mut self, coin: &str, is_dual_mode: bool) -> Result<String, Error> {
+    pub async fn set_dual_mode(&mut self, coin: &str, is_dual_mode: bool) -> Result<String, Error> {
         let coin_format = coin.to_string().to_lowercase();
         let res_data = self.request.setting_dual_mode(coin_format, is_dual_mode).await;
         if res_data.code == 200 {
@@ -560,7 +558,7 @@ impl Platform for GateSwap {
     }
 
     // 更新双持仓模式下杠杆
-    async fn set_dual_leverage(&mut self, leverage: &str) -> Result<String, Error> {
+    pub async fn set_dual_leverage(&mut self, leverage: &str) -> Result<String, Error> {
         let symbol_array: Vec<&str> = self.symbol.split("_").collect();
         let res_data = self.request.setting_dual_leverage(symbol_array[1].to_string().to_lowercase(), self.symbol.to_string(), leverage.to_string()).await;
         if res_data.code == 200 {
@@ -572,10 +570,10 @@ impl Platform for GateSwap {
         }
     }
 
-    async fn set_auto_deposit_status(&mut self, _status: bool) -> Result<String, Error> { Err(Error::new(ErrorKind::NotFound, "gate:该交易所方法未实现".to_string())) }
+    pub async fn set_auto_deposit_status(&mut self, _status: bool) -> Result<String, Error> { Err(Error::new(ErrorKind::NotFound, "gate:该交易所方法未实现".to_string())) }
 
     // 交易账户互转
-    async fn wallet_transfers(&mut self, coin: &str, from: &str, to: &str, amount: Decimal) -> Result<String, Error> {
+    pub async fn wallet_transfers(&mut self, coin: &str, from: &str, to: &str, amount: Decimal) -> Result<String, Error> {
         let coin_format = coin.to_string().to_lowercase();
         let res_data = self.request.wallet_transfers(coin_format.clone(), from.to_string(), to.to_string(), amount.to_string(), coin_format.clone()).await;
         if res_data.code == 200 {
@@ -588,7 +586,7 @@ impl Platform for GateSwap {
     }
 
     // 指令下单
-    async fn command_order(&mut self, order_command: &mut OrderCommand, trace_stack: &TraceStack) {
+    pub async fn command_order(&mut self, order_command: &mut OrderCommand, trace_stack: &TraceStack) {
         let mut handles = vec![];
 
         // 下单指令,limits_open里已经包含了limits_close

+ 3 - 3
standard/src/gate_swap_handle.rs → src/gate_swap_handle.rs

@@ -5,9 +5,9 @@ use rust_decimal_macros::dec;
 use serde_json::Value;
 use tokio::time::Instant;
 use tracing::{error};
-use exchanges::response_base::ResponseData;
-use global::trace_stack::TraceStack;
-use crate::{Account, MarketOrder, Order, Position, PositionModeEnum, SpecialDepth, SpecialOrder, SpecialTicker};
+use crate::model::{Account, MarketOrder, Order, Position, PositionModeEnum, SpecialDepth, SpecialOrder, SpecialTicker};
+use crate::response_base::ResponseData;
+use crate::trace_stack::TraceStack;
 
 // 处理账号信息
 pub fn handle_account_info(res_data: &ResponseData, symbol: &String) -> Account {

+ 2 - 2
exchanges/src/gate_swap_rest.rs → src/gate_swap_rest.rs

@@ -8,10 +8,10 @@ use rust_decimal::Decimal;
 use rust_decimal::prelude::FromPrimitive;
 use rust_decimal_macros::dec;
 use serde_json::Value;
-use crate::http_tool::RestTool;
-use crate::response_base::ResponseData;
 use sha2::Sha512;
 use tracing::{error, info};
+use crate::http_tool::RestTool;
+use crate::response_base::ResponseData;
 
 #[derive(Clone)]
 pub struct GateSwapRest {

+ 0 - 1
exchanges/src/gate_swap_ws.rs → src/gate_swap_ws.rs

@@ -12,7 +12,6 @@ use sha2::Sha512;
 use tokio::sync::Mutex;
 use tokio_tungstenite::tungstenite::{Error, Message};
 use tracing::{error, info, trace};
-
 use crate::response_base::ResponseData;
 use crate::socket_tool::{AbstractWsMode, HeartbeatType};
 

+ 12 - 11
strategy/src/gate_swap.rs → src/gate_usdt_swap.rs

@@ -5,14 +5,15 @@ use std::sync::atomic::AtomicBool;
 use rust_decimal::Decimal;
 use tokio::spawn;
 use tokio::sync::Mutex;
-use exchanges::gate_swap_rest::GateSwapRest;
-use exchanges::gate_swap_ws::{GateSwapLogin, GateSwapSubscribeType, GateSwapWs, GateSwapWsType};
-use exchanges::response_base::ResponseData;
-use global::trace_stack::{TraceStack};
-use standard::exchange::ExchangeEnum::{GateSwap};
-use crate::model::{OrderInfo};
+
 use crate::core::Core;
+use crate::exchange::ExchangeEnum::GateSwapEnum;
 use crate::exchange_disguise::on_special_depth;
+use crate::gate_swap_rest::GateSwapRest;
+use crate::gate_swap_ws::{GateSwapLogin, GateSwapSubscribeType, GateSwapWs, GateSwapWsType};
+use crate::model::OrderInfo;
+use crate::response_base::ResponseData;
+use crate::trace_stack::TraceStack;
 
 // 1交易、0参考 gate 合约 启动
 pub async fn gate_swap_run(is_shutdown_arc: Arc<AtomicBool>,
@@ -89,7 +90,7 @@ async fn on_data(core_arc_clone: Arc<Mutex<Core>>,
     match response.channel.as_str() {
         "futures.order_book" => {
             trace_stack.set_source("gate_usdt_swap.order_book".to_string());
-            let special_depth = standard::handle_info::HandleSwapInfo::handle_special_depth(GateSwap, &response);
+            let special_depth = crate::handle_info::HandleSwapInfo::handle_special_depth(GateSwapEnum, &response);
             trace_stack.on_after_format();
 
             on_special_depth(core_arc_clone, update_flag_u, &response.label, &mut trace_stack, &special_depth).await;
@@ -97,7 +98,7 @@ async fn on_data(core_arc_clone: Arc<Mutex<Core>>,
         "futures.book_ticker" => {
             trace_stack.set_source("gate_usdt_swap.book_ticker".to_string());
             // 将ticker数据转换为模拟深度
-            let special_depth = standard::handle_info::HandleSwapInfo::handle_book_ticker(GateSwap, &response).await;
+            let special_depth = crate::handle_info::HandleSwapInfo::handle_book_ticker(GateSwapEnum, &response).await;
             trace_stack.on_after_format();
             // 没有买价或卖价,则不更新
             if special_depth.ticker.buy != Decimal::ZERO || special_depth.ticker.sell != Decimal::ZERO {
@@ -105,13 +106,13 @@ async fn on_data(core_arc_clone: Arc<Mutex<Core>>,
             }
         }
         "futures.balances" => {
-            let account = standard::handle_info::HandleSwapInfo::handle_account_info(GateSwap, &response, run_symbol);
+            let account = crate::handle_info::HandleSwapInfo::handle_account_info(GateSwapEnum, &response, run_symbol);
             let mut core = core_arc_clone.lock().await;
             core.update_equity(account).await;
         }
         "futures.orders" => {
             trace_stack.set_source("gate_swap.orders".to_string());
-            let orders = standard::handle_info::HandleSwapInfo::handle_order(GateSwap, response.clone(), multiplier.clone());
+            let orders = crate::handle_info::HandleSwapInfo::handle_order(GateSwapEnum, response.clone(), multiplier.clone());
 
             let mut order_infos:Vec<OrderInfo> = Vec::new();
             for mut order in orders.order {
@@ -131,7 +132,7 @@ async fn on_data(core_arc_clone: Arc<Mutex<Core>>,
             }
         }
         "futures.positions" => {
-            let positions = standard::handle_info::HandleSwapInfo::handle_position(GateSwap, &response, multiplier);
+            let positions = crate::handle_info::HandleSwapInfo::handle_position(GateSwapEnum, &response, multiplier);
             let mut core = core_arc_clone.lock().await;
             core.update_position(positions).await;
         }

+ 9 - 9
standard/src/handle_info.rs → src/handle_info.rs

@@ -1,13 +1,13 @@
 use std::cmp::Ordering;
 use std::str::FromStr;
-use rust_decimal::{Decimal};
+use rust_decimal::Decimal;
 use rust_decimal::prelude::FromPrimitive;
 use rust_decimal_macros::dec;
-use exchanges::response_base::ResponseData;
-use global::public_params;
+use crate::public_params;
 use crate::exchange::ExchangeEnum;
 use crate::gate_swap_handle;
-use crate::{Account, MarketOrder, Position, SpecialDepth, SpecialOrder, SpecialTicker};
+use crate::model::{Account, MarketOrder, Position, SpecialDepth, SpecialOrder, SpecialTicker};
+use crate::response_base::ResponseData;
 
 #[allow(dead_code)]
 pub struct HandleSwapInfo;
@@ -25,7 +25,7 @@ impl HandleSwapInfo {
     // 处理账号信息
     pub fn handle_account_info(exchange: ExchangeEnum, res_data: &ResponseData, symbol: &String) -> Account {
         match exchange {
-            ExchangeEnum::GateSwap => {
+            ExchangeEnum::GateSwapEnum => {
                 gate_swap_handle::handle_account_info(res_data, symbol)
             }
         }
@@ -33,7 +33,7 @@ impl HandleSwapInfo {
     // 处理特殊Ticket信息
     pub async fn handle_book_ticker(exchange: ExchangeEnum, res_data: &ResponseData) -> SpecialDepth {
         match exchange {
-            ExchangeEnum::GateSwap => {
+            ExchangeEnum::GateSwapEnum => {
                 gate_swap_handle::handle_book_ticker(res_data)
             }
         }
@@ -41,7 +41,7 @@ impl HandleSwapInfo {
     // 处理position信息
     pub fn handle_position(exchange: ExchangeEnum, res_data: &ResponseData, ct_val: &Decimal) -> Vec<Position> {
         match exchange {
-            ExchangeEnum::GateSwap => {
+            ExchangeEnum::GateSwapEnum => {
                 gate_swap_handle::handle_position(res_data, ct_val)
             }
         }
@@ -49,7 +49,7 @@ impl HandleSwapInfo {
     // 处理订单信息
     pub fn handle_order(exchange: ExchangeEnum, res_data: ResponseData, ct_val: Decimal) -> SpecialOrder {
         match exchange {
-            ExchangeEnum::GateSwap => {
+            ExchangeEnum::GateSwapEnum => {
                 gate_swap_handle::handle_order(res_data, ct_val)
             }
         }
@@ -137,7 +137,7 @@ pub fn format_depth(exchange: ExchangeEnum, res_data: &ResponseData) -> DepthPar
     let t: Decimal;
     let create_at: i64;
     match exchange {
-        ExchangeEnum::GateSwap => {
+        ExchangeEnum::GateSwapEnum => {
             depth_asks = gate_swap_handle::format_depth_items(&res_data.data["asks"]);
             depth_bids = gate_swap_handle::format_depth_items(&res_data.data["bids"]);
             // todo! 有id可以取 保证与py一致

+ 0 - 0
exchanges/src/http_tool.rs → src/http_tool.rs


+ 23 - 25
global/src/log_utils.rs → src/log_utils.rs

@@ -1,11 +1,9 @@
-use std::collections::HashMap;
 use std::fmt::Debug;
 use std::io;
-use tracing::{Event, info, Subscriber, warn};
+use tracing::{Event, info, Subscriber};
 use tracing_appender_timezone::non_blocking::WorkerGuard;
 use tracing_subscriber::{fmt, Layer};
 use tracing_subscriber::layer::{Context, SubscriberExt};
-use reqwest::{Client};
 use tracing::field::{Field, Visit};
 use tracing_appender_timezone::rolling::{RollingFileAppender, Rotation};
 
@@ -45,28 +43,28 @@ impl<S> Layer<S> for ReportingLayer
     }
 }
 
-pub fn send_remote_err_log(msg: String) {
-    tokio::spawn(async move {
-        let encoded_str = base64::encode(msg.clone());
-        let mut request_json_data = HashMap::new();
-        request_json_data.insert("serverName", "As");
-        request_json_data.insert("data", encoded_str.as_str());
-
-        let res = Client::new().post("https://hhh.liangjiang.cc/api/log/addError?key=d64a8sc874sa8c4as5")
-            .json(&request_json_data)
-            .send()
-            .await;
-
-        match res {
-            Ok(_resp) => {
-                // let body = _resp.text().await.unwrap();
-            }
-            Err(err) => {
-                warn!("log的error监听器发送远端报错失败:{:?}", err);
-            }
-        }
-    });
-}
+// pub fn send_remote_err_log(msg: String) {
+//     tokio::spawn(async move {
+//         let encoded_str = base64::encode(msg.clone());
+//         let mut request_json_data = HashMap::new();
+//         request_json_data.insert("serverName", "As");
+//         request_json_data.insert("data", encoded_str.as_str());
+//
+//         let res = Client::new().post("https://hhh.liangjiang.cc/api/log/addError?key=d64a8sc874sa8c4as5")
+//             .json(&request_json_data)
+//             .send()
+//             .await;
+//
+//         match res {
+//             Ok(_resp) => {
+//                 // let body = _resp.text().await.unwrap();
+//             }
+//             Err(err) => {
+//                 warn!("log的error监听器发送远端报错失败:{:?}", err);
+//             }
+//         }
+//     });
+// }
 
 pub fn init_log_with_debug() {
     let _ = final_init(tracing::Level::DEBUG.as_str(), 0, "test".to_string());

+ 35 - 30
src/main.rs

@@ -2,6 +2,34 @@ mod server;
 mod control_c;
 mod core_libs;
 mod clear_core_libs;
+pub mod core;
+pub mod model;
+mod strategy;
+mod utils;
+pub mod exchange_disguise;
+mod gate_usdt_swap;
+pub mod clear_core;
+pub mod proxy;
+pub mod response_base;
+pub mod http_tool;
+pub mod gate_swap_ws;
+pub mod gate_swap_rest;
+pub mod socket_tool;
+// 引入exchange模块
+pub mod exchange;
+pub mod handle_info;
+// 引入gate模块
+mod gate_swap;
+pub mod gate_swap_handle;
+pub mod params;
+pub mod log_utils;
+pub mod clear_log_utils;
+pub mod account_info;
+pub mod clear_position_result;
+pub mod cci;
+pub mod public_params;
+pub mod trace_stack;
+pub mod trade;
 
 use std::str::FromStr;
 use std::sync::Arc;
@@ -10,45 +38,23 @@ use std::time::Duration;
 use tokio::sync::Mutex;
 use tracing::{error, info, warn};
 use tracing_appender_timezone::non_blocking::WorkerGuard;
-use global::cci::CentralControlInfo;
-use global::log_utils::{send_remote_err_log};
-use global::params::Params;
+use cci::CentralControlInfo;
+use params::Params;
 
 // 日志级别配置
 fn log_level_init(log_str: String, port: u32, account_name: String) -> WorkerGuard {
-    let log = global::log_utils::final_init(log_str.as_str(), port, account_name);
+    let log = log_utils::final_init(log_str.as_str(), port, account_name);
     info!("日志级别读取成功:{}。", log_str);
-    return log;
+    log
 }
 
 // 清仓程序日志级别配置
 fn clear_log_level_init(log_str: String, port: u32, account_name: String) -> WorkerGuard {
-    let log = global::clear_log_utils::final_init(log_str.as_str(), port, account_name);
+    let log = clear_log_utils::final_init(log_str.as_str(), port, account_name);
     info!("清仓程序日志级别读取成功:{}。", log_str);
-    return log;
+    log
 }
 
-// 获取本地配置
-// fn read_params() -> Params {
-//     let mut path = "config.toml";
-//
-//     let args: Vec<String> = std::env::args().collect();
-//
-//     for arg in &args {
-//         if !arg.contains("--config") {
-//             continue;
-//         }
-//
-//         let p: Vec<&str> = arg.split("=").collect();
-//         path = p[1];
-//     }
-//
-//     println!("配置文件路径:{}", path);
-//     let params = Params::new(path).unwrap();
-//
-//     return params;
-// }
-
 // 获取本地配置- json 文件解析
 fn read_params_json() -> Params {
     let mut path = "config.json";
@@ -112,7 +118,7 @@ fn read_params_json() -> Params {
         }
     }
     params.r_id = r_id;
-    return params;
+    params
 }
 
 #[tokio::main(flavor = "multi_thread", worker_threads = 2)]
@@ -141,7 +147,6 @@ async fn main() {
         let msg = format!("account={}, type=panic, msg={:?}, location={:?}",
                           account_name_clone, panic_info.to_string(), panic_info.location());
         warn!("{}", msg);
-        send_remote_err_log(msg);
         panic_running.store(false, Ordering::Relaxed);
     }));
 

+ 148 - 169
standard/src/lib.rs → src/model.rs

@@ -1,25 +1,158 @@
-use std::collections::{BTreeMap, HashMap};
+use std::collections::HashMap;
 use std::fmt;
 use std::fmt::Formatter;
-use std::io::{Error};
-use async_trait::async_trait;
 use rust_decimal::Decimal;
-use serde_json::Value;
+use rust_decimal_macros::dec;
+use serde_derive::{Deserialize, Serialize};
 use tokio::time::Instant;
-use global::trace_stack::TraceStack;
+use crate::trace_stack::TraceStack;
 
-use crate::exchange::ExchangeEnum;
+pub struct TokenParam {
+    // 平台币名称
+    pub token: String,
+    // 最低持有价值(u)
+    pub limit_value: Decimal
+}
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct LocalPosition {
+    // 做多仓位
+    pub long_pos: Decimal,
+    // 做空仓位
+    pub short_pos: Decimal,
+    //
+    pub long_avg: Decimal,
+    //
+    pub short_avg: Decimal
+}
+
+impl LocalPosition {
+    pub fn new() -> LocalPosition {
+        LocalPosition{
+            long_pos: dec!(0),
+            short_pos: dec!(0),
+            long_avg: dec!(0),
+            short_avg: dec!(0),
+        }
+    }
+}
 
-// 引入工具模块
-pub mod utils;
-// 引入exchange模块
-pub mod exchange;
-pub mod handle_info;
-// 引入gate模块
-mod gate_swap;
-mod gate_spot;
-pub mod gate_swap_handle;
+#[derive(Debug, Clone)]
+pub struct OrderInfo {
+    pub symbol: String,
 
+    pub amount: Decimal,
+    // 方向 kd kk
+    pub side: String,
+    // 价格
+    pub price: Decimal,
+    // 自定义订单号
+    pub client_id: String,
+    // 实际价格
+    pub filled_price: Decimal,
+    //
+    pub filled: Decimal,
+    // 订单号
+    pub order_id: String,
+    // 时间
+    pub local_time: i64,
+    // 时间
+    pub create_time: i64,
+
+    pub status: String,
+
+    pub fee: Decimal,
+    // 追踪体系
+    pub trace_stack: TraceStack
+}
+
+impl OrderInfo {
+    pub fn parse_order_to_order_info(order: &mut Order) -> OrderInfo {
+        OrderInfo {
+            symbol: "".to_string(),
+            amount: order.amount.abs(),
+            side: "".to_string(),
+            price: order.price,
+            client_id: order.custom_id.clone(),
+            filled_price: order.avg_price,
+            filled: order.deal_amount.abs(),
+            order_id: order.id.clone(),
+            local_time: 0,
+            create_time: 0,
+            status: order.status.clone(),
+            fee: Default::default(),
+            trace_stack: TraceStack::new(0, Instant::now()),
+        }
+    }
+}
+
+#[derive(Serialize, Deserialize, Clone, Debug)]
+pub struct OriginalTradeBa {
+    // 成交价格
+    pub p: Decimal,
+    // 成交数量
+    pub q: Decimal,
+    // 成交时间
+    #[serde(rename = "T")]
+    pub t: Decimal,
+    // 买方是否是做市方。如true,则此次成交是一个主动卖出单,否则是一个主动买入单。
+    pub m: bool
+}
+
+#[derive(Serialize, Deserialize)]
+pub struct OriginalTradeGa {
+    pub size: Decimal,
+    pub price: Decimal
+}
+
+#[derive(Serialize, Deserialize)]
+pub struct OriginalTradeBy {
+    pub v: Decimal,
+    pub p: Decimal
+}
+
+#[derive(Serialize, Deserialize)]
+pub struct OriginalTradeOK {
+    // 数量
+    pub sz: Decimal,
+    // 价格
+    pub px: Decimal
+}
+
+#[allow(non_snake_case)]
+#[derive(Serialize, Deserialize, Debug)]
+pub struct OriginalTicker {
+    // 更新ID
+    pub u: i64,
+    // 买单最优挂单价格
+    pub b: Decimal,
+    // 买单最优挂单数量
+    pub B: Decimal,
+    // 卖单最优挂单价格
+    pub a: Decimal,
+    // 卖单最优挂单数量
+    pub A: Decimal
+}
+
+#[allow(non_snake_case)]
+#[derive(Serialize, Deserialize, Debug)]
+pub struct DealRecord {
+    // 参考价
+    pub refPrice: String,
+    // 挂单价
+    pub regPrice: String,
+    // 买单最优挂单数量
+    pub num: String,
+    // 触发时间
+    pub triggerTime: i64,
+    // 机器名称
+    pub robotName: String,
+    // 方向
+    pub side: String
+}
+
+
+// standard model
 /// 持仓模式枚举
 /// - `Both`:单持仓方向
 /// - `LONG`:多仓
@@ -406,157 +539,3 @@ impl Position {
         }
     }
 }
-
-/// 交易所统一方法接口
-///
-/// 使用方法前需实例化
-/// ```rust
-/// use std::collections::BTreeMap;
-/// use standard::exchange::{Exchange, ExchangeEnum};
-///
-/// let mut params:BTreeMap<String,String> = BTreeMap::new();
-/// params.insert("access_key".to_string(), "your_access_key".to_string());
-/// params.insert("access_key".to_string(), "your_secret_key".to_string());
-/// // let exchange = Exchange::new(ExchangeEnum::BinanceSwap, "BTC_USDT".to_string(), true, params);
-/// ```
-/// 获取当前交易所交易模式
-/// - fn get_self_exchange(&self) -> ExchangeEnum;
-/// ```rust
-/// # use std::collections::BTreeMap;
-/// # use standard::exchange::{Exchange, ExchangeEnum};
-/// # let mut params:BTreeMap<String,String> = BTreeMap::new();
-/// # params.insert("access_key".to_string(), "your_access_key".to_string());
-/// # params.insert("access_key".to_string(), "your_secret_key".to_string());
-/// # // let exchange = Exchange::new(ExchangeEnum::BinanceSwap, "BTC_USDT".to_string(), true, params);
-///
-/// // exchange.get_self_exchange();
-/// ```
-/// 获取当前是否使用高速模式
-/// - fn get_self_is_colo(&self) -> bool;
-/// ```rust
-/// # use std::collections::BTreeMap;
-/// # use standard::exchange::{Exchange, ExchangeEnum};
-/// # let mut params:BTreeMap<String,String> = BTreeMap::new();
-/// # params.insert("access_key".to_string(), "your_access_key".to_string());
-/// # params.insert("access_key".to_string(), "your_secret_key".to_string());
-/// # // let exchange = Exchange::new(ExchangeEnum::BinanceSwap, "BTC_USDT".to_string(), true, params);
-///
-/// // exchange.get_self_is_colo();
-/// ```
-/// 获取当前是否使用登录
-/// - fn get_self_is_login(&self) -> bool;
-/// ```rust
-/// # use std::collections::BTreeMap;
-/// # use standard::exchange::{Exchange, ExchangeEnum};
-/// # let mut params:BTreeMap<String,String> = BTreeMap::new();
-/// # params.insert("access_key".to_string(), "your_access_key".to_string());
-/// # params.insert("access_key".to_string(), "your_secret_key".to_string());
-/// # // let exchange = Exchange::new(ExchangeEnum::BinanceSwap, "BTC_USDT".to_string(), true, params);
-///
-/// // exchange.get_self_is_login();
-/// ```
-/// 获取登录params信息
-/// - fn get_self_params(&self) -> BTreeMap<String, String>;
-/// ```rust
-/// # use std::collections::BTreeMap;
-/// # use standard::exchange::{Exchange, ExchangeEnum};
-/// # let mut params:BTreeMap<String,String> = BTreeMap::new();
-/// # params.insert("access_key".to_string(), "your_access_key".to_string());
-/// # params.insert("access_key".to_string(), "your_secret_key".to_string());
-/// # // let exchange = Exchange::new(ExchangeEnum::BinanceSwap, "BTC_USDT".to_string(), true, params);
-///
-/// // exchange.get_self_params();
-/// ```
-/// 获取账号信息
-/// - async fn get_account(&self, symbol: &str) -> Result<Account, Error>;
-/// ```rust
-/// # use std::collections::BTreeMap;
-/// # use standard::exchange::{Exchange, ExchangeEnum};
-/// # let mut params:BTreeMap<String,String> = BTreeMap::new();
-/// # params.insert("access_key".to_string(), "your_access_key".to_string());
-/// # params.insert("access_key".to_string(), "your_secret_key".to_string());
-/// # // let exchange = Exchange::new(ExchangeEnum::BinanceSwap, "BTC_USDT".to_string(), true, params);
-///
-/// // exchange.get_account()
-/// ```
-/// 订阅账号信息
-/// ```rust
-/// # use std::collections::BTreeMap;
-/// # use standard::exchange::{Exchange, ExchangeEnum};
-/// # let mut params:BTreeMap<String,String> = BTreeMap::new();
-/// # params.insert("access_key".to_string(), "your_access_key".to_string());
-/// # params.insert("access_key".to_string(), "your_secret_key".to_string());
-/// # // let exchange = Exchange::new(ExchangeEnum::BinanceSwap, "BTC_USDT".to_string(), true, params);
-///
-/// // exchange.subscribe_account();
-/// ```
-#[async_trait]
-pub trait Platform {
-    fn clone_box(&self) -> Box<dyn Platform + Send + Sync>;
-    // 获取当前交易所交易模式
-    fn get_self_exchange(&self) -> ExchangeEnum;
-    // 获取交易对
-    fn get_self_symbol(&self) -> String;
-    // 获取当前是否使用高速模式
-    fn get_self_is_colo(&self) -> bool;
-    // 获取登录params信息
-    fn get_self_params(&self) -> BTreeMap<String, String>;
-    // 获取market信息
-    fn get_self_market(&self) -> Market;
-    // 获取请求时间
-    fn get_request_delays(&self) -> Vec<i64>;
-    // 获取请求平均时间
-    fn get_request_avg_delay(&self) -> Decimal;
-    // 获取请求最大时间
-    fn get_request_max_delay(&self) -> i64;
-    // 获取服务器时间
-    async fn get_server_time(&mut self) -> Result<String, Error>;
-    // 获取账号信息
-    async fn get_account(&mut self) -> Result<Account, Error>;
-    // 获取现货账号信息
-    async fn get_spot_account(&mut self) -> Result<Vec<Account>, Error>;
-    // 获取持仓信息
-    async fn get_position(&mut self) -> Result<Vec<Position>, Error>;
-    // 获取所有持仓
-    async fn get_positions(&mut self) -> Result<Vec<Position>, Error>;
-    // 获取市场行情
-    async fn get_ticker(&mut self) -> Result<Ticker, Error>;
-    // 获取市场行情自定义交易对
-    async fn get_ticker_symbol(&mut self, symbol: String) -> Result<Ticker, Error>;
-    // 查询所有的市场信息
-    async fn get_market(&mut self) -> Result<Market, Error>;
-    // 查询所有的市场信息自定义交易对
-    async fn get_market_symbol(&mut self, symbol: String) -> Result<Market, Error>;
-    // 查询订单详情
-    async fn get_order_detail(&mut self, order_id: &str, custom_id: &str) -> Result<Order, Error>;
-    // 获取订单列表
-    async fn get_orders_list(&mut self, status: &str) -> Result<Vec<Order>, Error>;
-    // 下单接口
-    async fn take_order(&mut self, custom_id: &str, origin_side: &str, price: Decimal, amount: Decimal) -> Result<Order, Error>;
-    // 下单接口自定义交易对
-    async fn take_order_symbol(&mut self, symbol: String, ct_val: Decimal, custom_id: &str, origin_side: &str, price: Decimal, amount: Decimal) -> Result<Order, Error>;
-    // 撤销订单
-    async fn cancel_order(&mut self, order_id: &str, custom_id: &str) -> Result<Order, Error>;
-    // 批量撤销订单
-    async fn cancel_orders(&mut self) -> Result<Vec<Order>, Error>;
-    // 撤销所有订单
-    async fn cancel_orders_all(&mut self) -> Result<Vec<Order>, Error>;
-    /// 下一个止损单
-    /// - stop_price: 触发价
-    /// - price: 委托价,0就市价委托
-    /// - side: 止损哪个方向[long多单,short空单]
-    async fn take_stop_loss_order(&mut self, stop_price: Decimal, price: Decimal, side: &str) -> Result<Value, Error>;
-    /// 撤销止损订单
-    /// - order_id: 需要撤销的id
-    async fn cancel_stop_loss_order(&mut self, order_id: &str) -> Result<Value, Error>;
-    // 设置持仓模式
-    async fn set_dual_mode(&mut self, coin: &str, is_dual_mode: bool) -> Result<String, Error>;
-    // 更新双持仓模式下杠杆
-    async fn set_dual_leverage(&mut self, leverage: &str) -> Result<String, Error>;
-    // 设置自动追加保证金
-    async fn set_auto_deposit_status(&mut self, status: bool) -> Result<String, Error>;
-    // 交易账户互转
-    async fn wallet_transfers(&mut self, coin: &str, from: &str, to: &str, amount: Decimal) -> Result<String, Error>;
-    // 指令下单
-    async fn command_order(&mut self, order_command: &mut OrderCommand, trace_stack: &TraceStack);
-}

+ 0 - 0
global/src/params.rs → src/params.rs


+ 0 - 0
exchanges/src/proxy.rs → src/proxy.rs


+ 0 - 0
global/src/public_params.rs → src/public_params.rs


+ 0 - 0
exchanges/src/response_base.rs → src/response_base.rs


+ 1 - 1
src/server.rs

@@ -4,7 +4,7 @@ use std::time::Duration;
 use actix_web::{web, App, HttpResponse, HttpServer, Responder, post, get};
 use tokio::sync::Mutex;
 use tracing::{info};
-use global::cci::CentralControlInfo;
+use crate::cci::CentralControlInfo;
 
 // arcs
 #[derive(Clone)]

+ 2 - 3
exchanges/src/socket_tool.rs → src/socket_tool.rs

@@ -15,7 +15,6 @@ use tokio::time::Instant;
 use tokio_tungstenite::{connect_async, MaybeTlsStream, WebSocketStream};
 use tokio_tungstenite::tungstenite::{Error, Message};
 use tracing::{error, info, trace};
-
 use crate::proxy;
 use crate::proxy::{ProxyEnum, ProxyResponseEnum};
 use crate::response_base::ResponseData;
@@ -436,8 +435,8 @@ pub fn log_in_to_str() -> String {
         let timestamp = Utc::now().timestamp().to_string();
         // 时间戳 + 请求类型+ 请求参数字符串
         let message = format!("{}GET{}", timestamp, "/users/self/verify");
-        let hmac_key = ring::hmac::Key::new(hmac::HMAC_SHA256, secret_key.as_bytes());
-        let result = ring::hmac::sign(&hmac_key, &message.as_bytes());
+        let hmac_key = hmac::Key::new(hmac::HMAC_SHA256, secret_key.as_bytes());
+        let result = hmac::sign(&hmac_key, &message.as_bytes());
         let sign = base64::encode(result);
 
         let login_json = json!({

+ 41 - 63
strategy/src/strategy.rs → src/strategy.rs

@@ -5,12 +5,11 @@ use chrono::Utc;
 use rust_decimal::Decimal;
 use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
 use rust_decimal_macros::dec;
-use crate::model::{LocalPosition, OrderInfo};
-use crate::utils;
-use tracing::{info, error, warn};
+use tracing::{error, info, warn};
 use tokio::time::Instant;
-use global::params::Params;
-use standard::{OrderCommand};
+use crate::params::Params;
+use crate::model::{LocalPosition, OrderCommand, OrderInfo};
+use crate::utils::{clip, fix_amount, fix_price, generate_client_id, get_limit_order_requests_num_per_second, get_limit_requests_num_per_second};
 
 #[derive(Debug)]
 pub struct Strategy {
@@ -223,11 +222,11 @@ impl Strategy {
         strategy.request_limit_check_interval = 10 * 1000;
         // 求得正常请求数量和下单请求数量(interval时间内)
         let request_limit_check_interval_per_second = strategy.request_limit_check_interval / 1000;
-        strategy.limit_requests_num = utils::get_limit_requests_num_per_second(params.exchange.clone()) * (request_limit_check_interval_per_second);
-        strategy.limit_order_requests_num = utils::get_limit_order_requests_num_per_second(params.exchange.clone()) * (request_limit_check_interval_per_second);
+        strategy.limit_requests_num = get_limit_requests_num_per_second(params.exchange.clone()) * (request_limit_check_interval_per_second);
+        strategy.limit_order_requests_num = get_limit_order_requests_num_per_second(params.exchange.clone()) * (request_limit_check_interval_per_second);
         // 开仓下单间隔 均匀下单机会
         strategy.post_open_time = now.timestamp_millis();
-        let post_open_interval_per_second = Decimal::ONE.div(Decimal::from_i64(utils::get_limit_order_requests_num_per_second(params.exchange.clone())).unwrap());
+        let post_open_interval_per_second = Decimal::ONE.div(Decimal::from_i64(get_limit_order_requests_num_per_second(params.exchange.clone())).unwrap());
         strategy.post_open_interval = dec!(1000).mul(post_open_interval_per_second).to_i64().unwrap();
         info!("策略模块初始化完成!");
 
@@ -253,8 +252,8 @@ impl Strategy {
         // debug!(?self.pos);
 
         // 价格值处理
-        self.bp = agg_market[global::public_params::BID_PRICE_INDEX];
-        self.ap = agg_market[global::public_params::ASK_PRICE_INDEX];
+        self.bp = agg_market[crate::public_params::BID_PRICE_INDEX];
+        self.ap = agg_market[crate::public_params::ASK_PRICE_INDEX];
         self.mp = (self.bp + self.ap) * dec!(0.5);
         // 中间价的ema值处理
         if self.mp_ema.eq(&Decimal::ZERO) {
@@ -305,7 +304,7 @@ impl Strategy {
 
         // spread
         // let temp_predict = predict * self.predict_alpha;
-        // self.predict = utils::clip(temp_predict, -self.trade_open_dist, self.trade_open_dist);
+        // self.predict = clip(temp_predict, -self.trade_open_dist, self.trade_open_dist);
         // debug!(?self.predict);
 
         // 计算当前账户cash和coin
@@ -319,7 +318,7 @@ 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);
+        self.total_amount = fix_amount(self.total_amount, self.step_size);
         // debug!(?self.total_amount);
         if self.total_amount.eq(&Decimal::ZERO) {
             error!("总可开数量低于一张,请尝试加大杠杆倍数或资金!equity={}, lever_rate={}, adjust_lever_rate={}, mp={}, step_size={}",
@@ -520,10 +519,10 @@ impl Strategy {
 
         // 修复价格
         for open_price in &mut self.open_dist {
-            *open_price = utils::fix_price(*open_price, self.tick_size);
+            *open_price = fix_price(*open_price, self.tick_size);
         }
         for close_price in &mut self.close_dist {
-            *close_price = utils::fix_price(*close_price, self.tick_size);
+            *close_price = fix_price(*close_price, self.tick_size);
         }
         // debug!(?open_dist);
         // debug!(?close_dist);
@@ -790,10 +789,10 @@ impl Strategy {
             let mut amount = need_close_long;
             // 现货要对数量精度进行限定处理
             if self.exchange.contains("spot") {
-                amount = utils::fix_amount(amount, self.step_size);
+                amount = fix_amount(amount, self.step_size);
             }
-            let price = utils::fix_price(self.mp, self.tick_size);
-            let client_id = utils::generate_client_id(Some(self.broker_id.clone()));
+            let price = fix_price(self.mp, self.tick_size);
+            let client_id = generate_client_id(Some(self.broker_id.clone()));
 
             let value = vec![
                 amount.to_string(),
@@ -810,10 +809,10 @@ impl Strategy {
         if need_close_short * self.mp > self._min_amount_value {
             let mut amount = need_close_short;
             if self.exchange.contains("spot") {
-                amount = utils::fix_amount(amount, self.step_size);
+                amount = fix_amount(amount, self.step_size);
             }
-            let price = utils::fix_price(self.mp, self.tick_size);
-            let client_id = utils::generate_client_id(Some(self.broker_id.clone()));
+            let price = fix_price(self.mp, self.tick_size);
+            let client_id = generate_client_id(Some(self.broker_id.clone()));
 
             let value = vec![
                 amount.to_string(),
@@ -915,13 +914,13 @@ impl Strategy {
             if self.pos.long_pos * self.mp > self._min_amount_value {
                 if pd_order_num == 0 {
                     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);
+                    price = clip(price, self.bp * dec!(0.9995), self.ap * dec!(1.03));
+                    price = fix_price(price, self.tick_size);
                     let mut amount = self.pos.long_pos;
-                    amount = utils::fix_amount(amount, self.step_size);
+                    amount = fix_amount(amount, self.step_size);
 
                     if amount * price > self._min_amount_value {
-                        let order_client_id = utils::generate_client_id(Some(self.broker_id.clone()));
+                        let order_client_id = generate_client_id(Some(self.broker_id.clone()));
                         let order = vec![
                             amount.to_string(),
                             "pd".to_string(),
@@ -939,13 +938,13 @@ impl Strategy {
             if self.pos.short_pos > self._min_amount_value {
                 if pk_order_num == 0 {
                     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);
+                    price = clip(price, self.bp * dec!(0.97), self.ap * dec!(1.0005));
+                    price = fix_price(price, self.tick_size);
                     let mut amount = self.pos.short_pos;
-                    amount = utils::fix_amount(amount, self.step_size);
+                    amount = fix_amount(amount, self.step_size);
 
                     if amount * price > self._min_amount_value {
-                        let order_client_id = utils::generate_client_id(Some(self.broker_id.clone()));
+                        let order_client_id = generate_client_id(Some(self.broker_id.clone()));
                         let order = vec![
                             amount.to_string(),
                             "pk".to_string(),
@@ -963,10 +962,10 @@ impl Strategy {
                 if pd_order_num == 0 {
                     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);
+                    // price = clip(price, self.bp * dec!(0.9995), self.ap * dec!(1.03));
+                    price = fix_price(price, self.tick_size);
 
-                    let order_client_id = utils::generate_client_id(Some(self.broker_id.clone()));
+                    let order_client_id = generate_client_id(Some(self.broker_id.clone()));
                     let order = vec![
                         self.pos.long_pos.to_string(),
                         "pd".to_string(),
@@ -984,10 +983,10 @@ impl Strategy {
                 if pk_order_num == 0 {
                     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);
+                    // price = clip(price, self.bp * dec!(0.97), self.ap * dec!(1.0005));
+                    price = fix_price(price, self.tick_size);
 
-                    let order_client_id = utils::generate_client_id(Some(self.broker_id.clone()));
+                    let order_client_id = generate_client_id(Some(self.broker_id.clone()));
                     let order = vec![
                         self.pos.short_pos.to_string(),
                         "pk".to_string(),
@@ -1147,16 +1146,16 @@ impl Strategy {
                 let mut target_buy_price = (long_upper + long_lower) * dec!(0.5);
                 // 取消大小限制
                 target_buy_price = target_buy_price;
-                // target_buy_price = utils::clip(target_buy_price, self.bp * dec!(0.97), self.ap * dec!(1.0005));
-                target_buy_price = utils::fix_price(target_buy_price, self.tick_size);
+                // target_buy_price = clip(target_buy_price, self.bp * dec!(0.97), self.ap * dec!(1.0005));
+                target_buy_price = fix_price(target_buy_price, self.tick_size);
                 let value = min(one_hand_long_value, long_free_value);
-                let amount = utils::fix_amount(value / self.mp, self.step_size);
+                let amount = fix_amount(value / self.mp, self.step_size);
                 let amount_value = amount * self.mp;
                 // debug!(?one_hand_long_value, ?long_free_value, ?amount);
 
                 // 下单价值不能太大,也不能太小
                 if amount_value >= self._min_amount_value && amount_value <= long_free_value {
-                    let client_id = utils::generate_client_id(Some(self.broker_id.clone()));
+                    let client_id = generate_client_id(Some(self.broker_id.clone()));
                     let order = vec![
                         amount.to_string(),
                         "kd".to_string(),
@@ -1174,17 +1173,17 @@ impl Strategy {
             // debug!(?sell_price_list);
             if sell_price_list.len() == 0 {
                 let mut target_sell_price = (short_lower + short_upper) * dec!(0.5);
-                // target_sell_price = utils::clip(target_sell_price, self.bp * dec!(0.9995), self.ap * dec!(1.03));
+                // target_sell_price = clip(target_sell_price, self.bp * dec!(0.9995), self.ap * dec!(1.03));
                 // 取消大小限制
                 target_sell_price = target_sell_price;
-                target_sell_price = utils::fix_price(target_sell_price, self.tick_size);
+                target_sell_price = fix_price(target_sell_price, self.tick_size);
                 let value = min(one_hand_short_value, short_free_value);
-                let amount = utils::fix_amount(value / self.mp, self.step_size);
+                let amount = fix_amount(value / self.mp, self.step_size);
                 let amount_value = amount * self.mp;
 
                 // 下单价值不能太大,也不能太小
                 if amount_value >= self._min_amount_value && amount_value <= short_free_value {
-                    let client_id = utils::generate_client_id(Some(self.broker_id.clone()));
+                    let client_id = generate_client_id(Some(self.broker_id.clone()));
                     let order = vec![
                         amount.to_string(),
                         "kk".to_string(),
@@ -1339,24 +1338,3 @@ impl Strategy {
 //     return list;
 // }
 
-#[cfg(test)]
-mod tests {
-    use rust_decimal::Decimal;
-    use rust_decimal_macros::dec;
-    use global::params::Params;
-    use crate::strategy::Strategy;
-
-    #[test]
-    fn on_time_test() {
-        global::log_utils::init_log_with_debug();
-
-        let params = Params::new("config.toml.gate").unwrap();
-        let mut strategy = Strategy::new(&params, true);
-
-        strategy.is_ready = true;
-        strategy.equity = dec!(1000);
-        strategy.lever_rate = Decimal::ONE;
-
-        // debug!("{:?}", strategy.on_time(&trader_msg));
-    }
-}

+ 0 - 0
global/src/trace_stack.rs → src/trace_stack.rs


+ 0 - 0
global/src/trade.rs → src/trade.rs


+ 64 - 1
strategy/src/utils.rs → src/utils.rs

@@ -3,7 +3,7 @@ use chrono::Utc;
 use rand::Rng;
 use rust_decimal::Decimal;
 use tracing::error;
-use global::public_params;
+use crate::public_params;
 
 // 生成订单的id,可以根据交易所名字来
 pub fn generate_client_id(exchange_name_some: Option<String>) -> String {
@@ -120,7 +120,11 @@ pub fn get_limit_order_requests_num_per_second(exchange: String) -> i64 {
 #[cfg(test)]
 mod tests {
     use chrono::Utc;
+    use rust_decimal::Decimal;
     use rust_decimal_macros::dec;
+    use tracing::log::trace;
+    use crate::exchange::ExchangeEnum;
+    use crate::proxy;
     use crate::utils::{clip, fix_amount, fix_price, generate_client_id};
 
     #[test]
@@ -169,4 +173,63 @@ mod tests {
         println!("timestamp_nanos: {}", now.timestamp_nanos_opt().unwrap());
     }
 
+
+
+    // standard utils
+    /// 修改交易对连接符号
+    /// - `symbol(str)`: 交易对, "BTC_USDT", 默认以下划线传递
+    /// - `pat(str)`: 替换字符, "-", 把 “_” 替换为 "-"
+    pub fn format_symbol(symbol: String, pat: &str) -> String {
+        return symbol.to_uppercase().replace("_", pat);
+    }
+
+    // 检测是否走代理
+    pub fn proxy_handle() {
+        if proxy::ParsingDetail::http_enable_proxy() {
+            trace!("检测有代理配置,配置走代理");
+        }
+    }
+
+    /// 币种映射器
+    #[allow(dead_code)]
+    pub fn symbol_enter_mapper(exchange_enum: ExchangeEnum, symbol: &str) -> String {
+        let symbol_upper = symbol.to_uppercase();
+        match exchange_enum {
+            // ExchangeEnum::KucoinSwap => {
+            //     if symbol_upper.contains("BTC") {
+            //         symbol_upper.replace("BTC", "XBT")
+            //     } else { symbol_upper.to_string() }
+            // }
+            _ => {
+                symbol_upper.to_string()
+            }
+        }
+    }
+
+    // 截取指定精度的decimal(不会四舍五入)
+    pub fn truncate_decimal(amount: Decimal, precision: u32) -> Decimal {
+        let scale = Decimal::new(10i64.pow(precision), 0);
+        (amount * scale).trunc() / scale
+    }
+
+    // 获取指定精度下的tick_size
+    pub fn get_tick_size(precision: u32) -> Decimal {
+        return Decimal::new(1, 0) / Decimal::new(10i64.pow(precision), 0);
+    }
+
+    /// 币种映射器
+    #[allow(dead_code)]
+    pub fn symbol_out_mapper(exchange_enum: ExchangeEnum, symbol: &str) -> String {
+        let symbol_upper = symbol.to_uppercase();
+        match exchange_enum {
+            // ExchangeEnum::KucoinSwap => {
+            //     if symbol_upper.contains("XBT") {
+            //         symbol_upper.replace("XBT", "BTC")
+            //     } else { symbol_upper.to_string() }
+            // }
+            _ => {
+                symbol_upper.to_string()
+            }
+        }
+    }
 }

+ 0 - 5
standard/.gitignore

@@ -1,5 +0,0 @@
-/target
-/.idea
-/logs*
-
-/Cargo.lock

+ 0 - 7
standard/Cargo.lock

@@ -1,7 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 3
-
-[[package]]
-name = "standard"
-version = "0.1.0"

+ 0 - 23
standard/Cargo.toml

@@ -1,23 +0,0 @@
-[package]
-name = "standard"
-version = "0.1.0"
-edition = "2021"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
-global = { path = "../global" }
-exchanges = { path = "../exchanges" }
-tokio = { version = "1.31.0", features = ["full"] }
-async-trait = "0.1.73"
-serde = { version = "1.0", features = ["derive"] }
-serde_json = "1.0.104"
-rust_decimal = { version = "1.32.0", features = ["maths"] }
-rust_decimal_macros = "1.32.0"
-chrono = "0.4.30"
-futures = "0.3"
-tracing = "0.1"
-tracing-subscriber = { version = "0.3.17", features = ["env-filter"] }
-toml = "0.5.11"
-futures-channel = "0.3.29"
-lazy_static = "1.4.0"

+ 0 - 15
standard/README.md

@@ -1,15 +0,0 @@
-## 声明
-
-
-## 项目结构解析
-
-```
-|
-├─ main                                 // 系统入口
-│
-├─ exchanges                            // 交易所层(网络层)
-│
-├─ standard                             // 标准化层(中间件)
-│
-└─ strategy                             // 策略层(主逻辑、风控等)
-```

+ 0 - 113
standard/src/gate_spot.rs

@@ -1,113 +0,0 @@
-// use std::collections::BTreeMap;
-// use std::io::{Error, ErrorKind};
-// use async_trait::async_trait;
-// use rust_decimal::Decimal;
-// use rust_decimal_macros::dec;
-// use tracing::warn;
-// use crate::{Platform, ExchangeEnum, Account, Position, Ticker, Market, Order, OrderCommand};
-// use exchanges::gate_spot_rest::GateSpotRest;
-// use global::trace_stack::TraceStack;
-//
-// #[allow(dead_code)]
-// #[derive(Clone)]
-// pub struct GateSpot {
-//     exchange: ExchangeEnum,
-//     symbol: String,
-//     is_colo: bool,
-//     params: BTreeMap<String, String>,
-//     request: GateSpotRest,
-// }
-//
-// impl GateSpot {
-//     pub fn new(symbol: String, is_colo: bool, params: BTreeMap<String, String>) -> GateSpot {
-//         GateSpot {
-//             exchange: ExchangeEnum::GateSpot,
-//             symbol: symbol.to_uppercase(),
-//             is_colo,
-//             params: params.clone(),
-//             request: GateSpotRest::new(is_colo, params.clone()),
-//         }
-//     }
-// }
-//
-// #[async_trait]
-// impl Platform for GateSpot {
-//     // 克隆方法
-//     fn clone_box(&self) -> Box<dyn Platform + Send + Sync> { Box::new(self.clone()) }
-//     // 获取交易所模式
-//     fn get_self_exchange(&self) -> ExchangeEnum {
-//         ExchangeEnum::GateSpot
-//     }
-//     // 获取交易对
-//     fn get_self_symbol(&self) -> String { self.symbol.clone() }
-//     // 获取是否使用高速通道
-//     fn get_self_is_colo(&self) -> bool {
-//         self.is_colo
-//     }
-//     // 获取params信息
-//     fn get_self_params(&self) -> BTreeMap<String, String> {
-//         self.params.clone()
-//     }
-//
-//     fn get_self_market(&self) -> Market {
-//         warn!("gate_spot:该交易所方法未实现");
-//         return Market::new();
-//     }
-//
-//     fn get_request_delays(&self) -> Vec<i64> {
-//         warn!("gate_spot:该交易所方法未实现");
-//         return vec![];
-//     }
-//
-//     fn get_request_avg_delay(&self) -> Decimal {
-//         warn!("gate_spot:该交易所方法未实现");
-//         return dec!(0);
-//     }
-//
-//     fn get_request_max_delay(&self) -> i64 {
-//         warn!("gate_spot:该交易所方法未实现");
-//         return 0;
-//     }
-//
-//     async fn get_server_time(&mut self) -> Result<String, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn get_account(&mut self) -> Result<Account, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn get_spot_account(&mut self) -> Result<Vec<Account>, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn get_position(&mut self) -> Result<Vec<Position>, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn get_positions(&mut self) -> Result<Vec<Position>, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn get_ticker(&mut self) -> Result<Ticker, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn get_ticker_symbol(&mut self, _symbol: String) -> Result<Ticker, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn get_market(&mut self) -> Result<Market, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn get_market_symbol(&mut self, _symbol: String) -> Result<Market, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn get_order_detail(&mut self, _order_id: &str, _custom_id: &str) -> Result<Order, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn get_orders_list(&mut self, _status: &str) -> Result<Vec<Order>, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn take_order(&mut self, _custom_id: &str, _origin_side: &str, _price: Decimal, _amount: Decimal) -> Result<Order, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn take_order_symbol(&mut self, _symbol: String, _ct_val: Decimal, _custom_id: &str, _origin_side: &str, _price: Decimal, _amount: Decimal) -> Result<Order, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn cancel_order(&mut self, _order_id: &str, _custom_id: &str) -> Result<Order, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn cancel_orders(&mut self) -> Result<Vec<Order>, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn cancel_orders_all(&mut self) -> Result<Vec<Order>, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn set_dual_mode(&mut self, _coin: &str, _is_dual_mode: bool) -> Result<String, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn set_dual_leverage(&mut self, _leverage: &str) -> Result<String, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn set_auto_deposit_status(&mut self, _status: bool) -> Result<String, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn wallet_transfers(&mut self, _coin: &str, _from: &str, _to: &str, _amount: Decimal) -> Result<String, Error> { Err(Error::new(ErrorKind::NotFound, "gate_spot:该交易所方法未实现".to_string())) }
-//
-//     async fn command_order(&mut self, _order_command: OrderCommand, _trace_stack: TraceStack) { warn!("gate_spot:该交易所方法未实现"); }
-// }

+ 0 - 61
standard/src/utils.rs

@@ -1,61 +0,0 @@
-use rust_decimal::Decimal;
-use tracing::trace;
-use exchanges::proxy;
-use crate::exchange::ExchangeEnum;
-
-/// 修改交易对连接符号
-/// - `symbol(str)`: 交易对, "BTC_USDT", 默认以下划线传递
-/// - `pat(str)`: 替换字符, "-", 把 “_” 替换为 "-"
-pub fn format_symbol(symbol: String, pat: &str) -> String {
-    return symbol.to_uppercase().replace("_", pat);
-}
-
-// 检测是否走代理
-pub fn proxy_handle() {
-    if proxy::ParsingDetail::http_enable_proxy() {
-        trace!("检测有代理配置,配置走代理");
-    }
-}
-
-/// 币种映射器
-#[allow(dead_code)]
-pub fn symbol_enter_mapper(exchange_enum: ExchangeEnum, symbol: &str) -> String {
-    let symbol_upper = symbol.to_uppercase();
-    match exchange_enum {
-        // ExchangeEnum::KucoinSwap => {
-        //     if symbol_upper.contains("BTC") {
-        //         symbol_upper.replace("BTC", "XBT")
-        //     } else { symbol_upper.to_string() }
-        // }
-        _ => {
-            symbol_upper.to_string()
-        }
-    }
-}
-
-// 截取指定精度的decimal(不会四舍五入)
-pub fn truncate_decimal(amount: Decimal, precision: u32) -> Decimal {
-    let scale = Decimal::new(10i64.pow(precision), 0);
-    (amount * scale).trunc() / scale
-}
-
-// 获取指定精度下的tick_size
-pub fn get_tick_size(precision: u32) -> Decimal {
-    return Decimal::new(1, 0) / Decimal::new(10i64.pow(precision), 0);
-}
-
-/// 币种映射器
-#[allow(dead_code)]
-pub fn symbol_out_mapper(exchange_enum: ExchangeEnum, symbol: &str) -> String {
-    let symbol_upper = symbol.to_uppercase();
-    match exchange_enum {
-        // ExchangeEnum::KucoinSwap => {
-        //     if symbol_upper.contains("XBT") {
-        //         symbol_upper.replace("XBT", "BTC")
-        //     } else { symbol_upper.to_string() }
-        // }
-        _ => {
-            symbol_upper.to_string()
-        }
-    }
-}

+ 0 - 662
standard/tests/exchange_test.rs

@@ -1,662 +0,0 @@
-// use std::collections::{BTreeMap};
-// use std::io::{Error};
-// use std::sync::Arc;
-// use std::sync::atomic::AtomicBool;
-// use futures::StreamExt;
-// use rust_decimal_macros::dec;
-// use tokio::sync::mpsc::{channel, Receiver, Sender};
-// use tokio::sync::Mutex;
-// use tokio::try_join;
-// use tracing::{error, trace};
-// // use exchanges::binance_spot_ws::{BinanceSpotLogin, BinanceSpotSubscribeType, BinanceSpotWs, BinanceSpotWsType};
-// // use exchanges::binance_swap_ws::{BinanceSwapLogin, BinanceSwapSubscribeType, BinanceSwapWs, BinanceSwapWsType};
-// // use exchanges::kucoin_swap_ws::{KucoinSwapLogin, KucoinSwapSubscribeType, KucoinSwapWs, KucoinSwapWsType};
-// // use exchanges::kucoin_spot_ws::{KucoinSpotLogin, KucoinSpotSubscribeType, KucoinSpotWs, KucoinSpotWsType};
-// // use exchanges::gate_swap_ws::{GateSwapLogin, GateSwapSubscribeType, GateSwapWs, GateSwapWsType};
-// // use exchanges::bitget_spot_ws::{BitgetSpotLogin, BitgetSpotSubscribeType, BitgetSpotWs, BitgetSpotWsType};
-// use exchanges::okx_swap_ws::{OkxSwapLogin, OkxSwapSubscribeType, OkxSwapWs, OkxSwapWsType};
-// use exchanges::response_base::ResponseData;
-// use standard::exchange::{Exchange, ExchangeEnum};
-// // use standard::{binance_spot_handle, Order, Platform, utils};
-// // use standard::{binance_handle, Order, Platform, utils};
-// // use standard::{kucoin_handle, Order, Platform, utils};
-// // use standard::{kucoin_spot_handle, Order, Platform, utils};
-// // use standard::{gate_handle, Order, Platform, utils};
-// // use standard::{bitget_spot_handle, Order, Platform, utils};
-// use standard::{okx_handle, Order, Platform, utils};
-// 
-// // 创建实体
-// #[allow(dead_code)]
-// pub async fn test_new_exchange(exchange: ExchangeEnum, symbol: &str) -> Box<dyn Platform> {
-//     utils::proxy_handle();
-//     let (order_sender, _order_receiver): (Sender<Order>, Receiver<Order>) = channel(1024);
-//     let (error_sender, _error_receiver): (Sender<Error>, Receiver<Error>) = channel(1024);
-// 
-//     let account_info = global::account_info::get_account_info("../test_account.toml");
-//     match exchange {
-//         ExchangeEnum::BinanceSwap => {
-//             let mut params: BTreeMap<String, String> = BTreeMap::new();
-//             let access_key = account_info.binance_access_key;
-//             let secret_key = account_info.binance_secret_key;
-//             params.insert("access_key".to_string(), access_key);
-//             params.insert("secret_key".to_string(), secret_key);
-//             Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
-//         }
-//         ExchangeEnum::BinanceSpot => {
-//             let mut params: BTreeMap<String, String> = BTreeMap::new();
-//             let access_key = account_info.binance_access_key;
-//             let secret_key = account_info.binance_secret_key;
-//             params.insert("access_key".to_string(), access_key);
-//             params.insert("secret_key".to_string(), secret_key);
-//             Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
-//         }
-//         ExchangeEnum::GateSwap => {
-//             let mut params: BTreeMap<String, String> = BTreeMap::new();
-//             let access_key = account_info.gate_access_key;
-//             let secret_key = account_info.gate_secret_key;
-//             params.insert("access_key".to_string(), access_key);
-//             params.insert("secret_key".to_string(), secret_key);
-//             Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
-//         }
-//         ExchangeEnum::GateSpot => {
-//             let mut params: BTreeMap<String, String> = BTreeMap::new();
-//             let access_key = account_info.gate_access_key;
-//             let secret_key = account_info.gate_secret_key;
-//             params.insert("access_key".to_string(), access_key);
-//             params.insert("secret_key".to_string(), secret_key);
-//             Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
-//         }
-//         ExchangeEnum::KucoinSwap => {
-//             let mut params: BTreeMap<String, String> = BTreeMap::new();
-//             let access_key = account_info.kucoin_access_key;
-//             let secret_key = account_info.kucoin_secret_key;
-//             let pass_key = account_info.kucoin_pass;
-//             params.insert("access_key".to_string(), access_key);
-//             params.insert("secret_key".to_string(), secret_key);
-//             params.insert("pass_key".to_string(), pass_key);
-//             Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
-//         }
-//         ExchangeEnum::KucoinSpot => {
-//             let mut params: BTreeMap<String, String> = BTreeMap::new();
-//             let access_key = account_info.kucoin_access_key;
-//             let secret_key = account_info.kucoin_secret_key;
-//             let pass_key = account_info.kucoin_pass;
-//             params.insert("access_key".to_string(), access_key);
-//             params.insert("secret_key".to_string(), secret_key);
-//             params.insert("pass_key".to_string(), pass_key);
-//             Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
-//         }
-//         ExchangeEnum::OkxSwap => {
-//             let mut params: BTreeMap<String, String> = BTreeMap::new();
-//             let access_key = account_info.okx_access_key;
-//             let secret_key = account_info.okx_secret_key;
-//             let pass_key = account_info.okx_pass;
-//             params.insert("access_key".to_string(), access_key);
-//             params.insert("secret_key".to_string(), secret_key);
-//             params.insert("pass_key".to_string(), pass_key);
-//             Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
-//         }
-//         ExchangeEnum::BitgetSpot => {
-//             let mut params: BTreeMap<String, String> = BTreeMap::new();
-//             let access_key = account_info.bitget_access_key;
-//             let secret_key = account_info.bitget_secret_key;
-//             let pass_key = account_info.bitget_pass;
-//             params.insert("access_key".to_string(), access_key);
-//             params.insert("secret_key".to_string(), secret_key);
-//             params.insert("pass_key".to_string(), pass_key);
-//             Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
-//         }
-//         ExchangeEnum::HtxSwap => {
-//             let mut params: BTreeMap<String, String> = BTreeMap::new();
-//             let access_key = account_info.htx_access_key;
-//             let secret_key = account_info.htx_secret_key;
-//             let pass_key = account_info.htx_pass;
-//             params.insert("access_key".to_string(), access_key);
-//             params.insert("secret_key".to_string(), secret_key);
-//             params.insert("pass_key".to_string(), pass_key);
-//             Exchange::new(exchange, symbol.to_string(), false, params, order_sender, error_sender).await
-//         }
-//         _ => {
-//             panic!("该交易所未实现!")
-//         }
-//     }
-// }
-// 
-// #[allow(dead_code)]
-// pub async fn test_new_exchange_wss<T>(exchange: ExchangeEnum, symbol: &str, subscriber_type: T, mold: &str) where Vec<OkxSwapSubscribeType>: From<T> {
-//     utils::proxy_handle();
-//     let account_info = global::account_info::get_account_info("../test_account.toml");
-//     match exchange {
-//         ExchangeEnum::BinanceSpot => {
-//             // let symbol_format = utils::format_symbol(symbol.to_string(), "").to_uppercase();
-//             // trace!(symbol_format);
-//             // let name = format!("binance_spot@{}", symbol.to_string().to_lowercase());
-//             // let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-//             // let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
-//             // let write_tx_am = Arc::new(Mutex::new(write_tx));
-//             // let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-//             //
-//             // let params = BinanceSpotLogin {
-//             //     api_key: account_info.binance_access_key,
-//             //     api_secret: account_info.binance_secret_key,
-//             // };
-//             // let mut exchange_wss;
-//             // exchange_wss = BinanceSpotWs::new_label(name, false, Option::from(params), BinanceSpotWsType::PublicAndPrivate);
-//             // exchange_wss.set_symbols(vec![symbol_format]);
-//             // exchange_wss.set_subscribe(subscriber_type.into());
-//             //
-//             //
-//             // let mold_arc = Arc::new(mold.to_string());
-//             // //读取
-//             // tokio::spawn(async move {
-//             //     let mold_clone = Arc::clone(&mold_arc);
-//             //     loop {
-//             //         if let Some(data) = read_rx.next().await {
-//             //             trace!("原始数据 data:{:?}",data);
-//             //             match mold_clone.as_str() {
-//             //                 "depth" => {
-//             //                     if data.data != "" {
-//             //                         let result = binance_spot_handle::handle_special_depth(data);
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 "ticker" => {
-//             //                     if data.data != "" {
-//             //                         let result = binance_spot_handle::handle_special_ticker(data);
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 _ => {
-//             //                     error!("没有该命令!mode={}", mold_clone);
-//             //                     panic!("没有该命令!mode={}", mold_clone)
-//             //                 }
-//             //             }
-//             //         }
-//             //     };
-//             // });
-//             //
-//             // let t1 = tokio::spawn(async move {
-//             //     //链接
-//             //     let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-//             //     exchange_wss.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-//             // });
-//             // try_join!(t1).unwrap();
-//         }
-//         ExchangeEnum::BinanceSwap => {
-//             // let symbol_format = utils::format_symbol(symbol.to_string(), "").to_uppercase();
-//             // trace!(symbol_format);
-//             // let name = format!("binance_swap@{}", symbol.to_string().to_lowercase());
-//             // let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-//             // let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
-//             // let write_tx_am = Arc::new(Mutex::new(write_tx));
-//             // let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-//             //
-//             // let params = BinanceSwapLogin {
-//             //     api_key: account_info.binance_access_key,
-//             //     api_secret: account_info.binance_secret_key,
-//             // };
-//             // let mut exchange_wss;
-//             // exchange_wss = BinanceSwapWs::new_label(name, false, Option::from(params), BinanceSwapWsType::PublicAndPrivate);
-//             // exchange_wss.set_symbols(vec![symbol_format]);
-//             // exchange_wss.set_subscribe(subscriber_type.into());
-//             //
-//             //
-//             // let mold_arc = Arc::new(mold.to_string());
-//             // //读取
-//             // tokio::spawn(async move {
-//             //     let mold_clone = Arc::clone(&mold_arc);
-//             //     loop {
-//             //         if let Some(data) = read_rx.next().await {
-//             //             trace!("原始数据 data:{:?}",data);
-//             //             match mold_clone.as_str() {
-//             //                 "depth" => {
-//             //                     if data.data != "" {
-//             //                         let result = binance_handle::handle_special_depth(data);
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 "ticker" => {
-//             //                     if data.data != "" {
-//             //                         let result = binance_handle::handle_special_ticker(data);
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 _ => {
-//             //                     error!("没有该命令!mode={}", mold_clone);
-//             //                     panic!("没有该命令!mode={}", mold_clone)
-//             //                 }
-//             //             }
-//             //         }
-//             //     };
-//             // });
-//             //
-//             // let t1 = tokio::spawn(async move {
-//             //     //链接
-//             //     let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-//             //     exchange_wss.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-//             // });
-//             // try_join!(t1).unwrap();
-//         }
-//         ExchangeEnum::KucoinSwap => {
-//             // let symbol_format = format!("{}M", utils::format_symbol(symbol.to_string(), ""));
-//             // let symbol_back = utils::format_symbol(symbol.to_string(), "_");
-//             //
-//             // let name = format!("kucoin_swap@{}", symbol.to_string().to_lowercase());
-//             // let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-//             // let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
-//             // let write_tx_am = Arc::new(Mutex::new(write_tx));
-//             // let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-//             //
-//             // let params = KucoinSwapLogin {
-//             //     access_key: account_info.kucoin_access_key,
-//             //     secret_key: account_info.kucoin_secret_key,
-//             //     pass_key: account_info.kucoin_pass,
-//             // };
-//             // let mut exchange_wss;
-//             // if ["depth", "ticker"].contains(&mold) {
-//             //     exchange_wss = KucoinSwapWs::new_label(name, false, Option::from(params), KucoinSwapWsType::Public).await;
-//             // } else {
-//             //     exchange_wss = KucoinSwapWs::new_label(name, false, Option::from(params), KucoinSwapWsType::Private).await;
-//             // }
-//             // exchange_wss.set_symbols(vec![symbol_format]);
-//             // exchange_wss.set_subscribe(subscriber_type.into());
-//             //
-//             // let mold_arc = Arc::new(mold.to_string());
-//             // tokio::spawn(async move {
-//             //     let mold_clone = Arc::clone(&mold_arc);
-//             //     loop {
-//             //         if let Some(data) = read_rx.next().await {
-//             //             trace!("原始数据 data:{:?}",data);
-//             //             match mold_clone.as_str() {
-//             //                 "depth" => {
-//             //                     let result = kucoin_handle::handle_special_depth(data);
-//             //                     trace!(?result)
-//             //                 }
-//             //                 "ticker" => {
-//             //                     let result = kucoin_handle::handle_special_ticker(data);
-//             //                     trace!(?result)
-//             //                 }
-//             //                 "account" => {
-//             //                     let result = kucoin_handle::handle_account_info(data, symbol_back.clone());
-//             //                     trace!(?result)
-//             //                 }
-//             //                 "position" => {
-//             //                     let result = kucoin_handle::handle_position(data, dec!(1));
-//             //                     trace!(?result)
-//             //                 }
-//             //                 "orders" => {
-//             //                     let result = kucoin_handle::handle_order(data, dec!(0.001));
-//             //                     trace!(?result)
-//             //                 }
-//             //                 _ => {
-//             //                     error!("没有该命令!mode={}", mold_clone);
-//             //                     panic!("没有该命令!mode={}", mold_clone)
-//             //                 }
-//             //             }
-//             //         }
-//             //     }
-//             // });
-//             //
-//             // let t1 = tokio::spawn(async move {
-//             //     //链接
-//             //     let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-//             //     exchange_wss.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-//             // });
-//             // try_join!(t1).unwrap();
-//         }
-//         ExchangeEnum::KucoinSpot => {
-//             // let symbol_format = utils::format_symbol(symbol.to_string(), "-").to_uppercase();
-//             // let symbol_back = utils::format_symbol(symbol.to_string(), "_");
-//             // trace!(symbol_format);
-//             // let name = format!("kucoin_spot@{}", symbol.to_string().to_lowercase());
-//             // let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-//             // let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
-//             // let write_tx_am = Arc::new(Mutex::new(write_tx));
-//             // let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-//             //
-//             // let params = KucoinSpotLogin {
-//             //     access_key: account_info.kucoin_access_key,
-//             //     secret_key: account_info.kucoin_secret_key,
-//             //     pass_key: account_info.kucoin_pass,
-//             // };
-//             // let mut exchange_wss = if ["depth", "ticker"].contains(&mold) {
-//             //     KucoinSpotWs::new_label(name, false, Option::from(params), KucoinSpotWsType::Public).await
-//             // } else {
-//             //     KucoinSpotWs::new_label(name, false, Option::from(params), KucoinSpotWsType::Private).await
-//             // };
-//             // exchange_wss.set_symbols(vec![symbol_format]);
-//             // exchange_wss.set_subscribe(subscriber_type.into());
-//             //
-//             // let mold_arc = Arc::new(mold.to_string());
-//             // tokio::spawn(async move {
-//             //     let mold_clone = Arc::clone(&mold_arc);
-//             //     loop {
-//             //         if let Some(data) = read_rx.next().await {
-//             //             trace!("原始数据 data:{:?}",data);
-//             //             match mold_clone.as_str() {
-//             //                 "depth" => {
-//             //                     if data.data != "" {
-//             //                         let result = kucoin_spot_handle::handle_special_depth(data);
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 "ticker" => {
-//             //                     if data.data != "" {
-//             //                         let result = kucoin_spot_handle::handle_special_ticker(data);
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 "account" => {
-//             //                     if data.data != "" {
-//             //                         let result = kucoin_spot_handle::handle_account_info(data, symbol_back.clone());
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 "orders" => {
-//             //                     if data.data != "" {
-//             //                         let result = kucoin_spot_handle::handle_order(data, dec!(1));
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 _ => {
-//             //                     error!("没有该命令!mode={}", mold_clone);
-//             //                     panic!("没有该命令!mode={}", mold_clone)
-//             //                 }
-//             //             }
-//             //         }
-//             //     }
-//             // });
-//             // let t1 = tokio::spawn(async move {
-//             //     //链接
-//             //     let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-//             //     exchange_wss.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-//             // });
-//             // try_join!(t1).unwrap();
-//         }
-//         ExchangeEnum::GateSwap => {
-//             // let symbol_format = utils::format_symbol(symbol.to_string(), "_").to_uppercase();
-//             // trace!(symbol_format);
-//             // let name = format!("gate_swap@{}", symbol.to_string().to_lowercase());
-//             // let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-//             // let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
-//             // let write_tx_am = Arc::new(Mutex::new(write_tx));
-//             // let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-//             //
-//             // let params = GateSwapLogin {
-//             //     api_key: account_info.gate_access_key,
-//             //     secret: account_info.gate_secret_key,
-//             // };
-//             // let mut exchange_wss = GateSwapWs::new_label(name, false, Option::from(params), GateSwapWsType::PublicAndPrivate("usdt".to_string()));
-//             // exchange_wss.set_symbols(vec![symbol_format.clone()]);
-//             // exchange_wss.set_subscribe(subscriber_type.into());
-//             //
-//             // let mold_arc = Arc::new(mold.to_string());
-//             // tokio::spawn(async move {
-//             //     let mold_clone = Arc::clone(&mold_arc);
-//             //     loop {
-//             //         if let Some(data) = read_rx.next().await {
-//             //             trace!("原始数据 data:{:?}",data);
-//             //             match mold_clone.as_str() {
-//             //                 "depth" => {
-//             //                     if data.data != "" {
-//             //                         let result = gate_handle::handle_special_depth(data);
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 "ticker" => {
-//             //                     if data.data != "" {
-//             //                         let result = gate_handle::handle_special_ticker(data);
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 "account" => {
-//             //                     if data.data != "" {
-//             //                         let result = gate_handle::handle_account_info(data, symbol_format.clone());
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 "orders" => {
-//             //                     if data.data != "" {
-//             //                         let result = gate_handle::handle_order(data, dec!(1));
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 _ => {
-//             //                     error!("没有该命令!mode={}", mold_clone);
-//             //                     panic!("没有该命令!mode={}", mold_clone)
-//             //                 }
-//             //             }
-//             //         }
-//             //     }
-//             // });
-//             // let t1 = tokio::spawn(async move {
-//             //     //链接
-//             //     let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-//             //     exchange_wss.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-//             // });
-//             // try_join!(t1).unwrap();
-//         }
-//         ExchangeEnum::BitgetSpot => {
-//             // let symbol_format = utils::format_symbol(symbol.to_string(), "-").to_uppercase();
-//             // let symbol_back = utils::format_symbol(symbol.to_string(), "_");
-//             // trace!(symbol_format);
-//             // let name = format!("bitget_spot@{}", symbol.to_string().to_lowercase());
-//             // let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-//             // let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
-//             // let write_tx_am = Arc::new(Mutex::new(write_tx));
-//             // let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-//             //
-//             // let params = BitgetSpotLogin {
-//             //     api_key: account_info.bitget_access_key,
-//             //     secret_key: account_info.bitget_secret_key,
-//             //     passphrase_key: account_info.bitget_pass,
-//             // };
-//             //
-//             // let mut exchange_wss = if ["depth", "ticker"].contains(&mold) {
-//             //     BitgetSpotWs::new_label(name, false, Option::from(params), BitgetSpotWsType::Public)
-//             // } else {
-//             //     BitgetSpotWs::new_label(name, false, Option::from(params), BitgetSpotWsType::Private)
-//             // };
-//             // exchange_wss.set_symbols(vec![symbol_format]);
-//             // exchange_wss.set_subscribe(subscriber_type.into());
-//             //
-//             // let mold_arc = Arc::new(mold.to_string());
-//             // //读取
-//             // tokio::spawn(async move {
-//             //     loop {
-//             //         let mold_clone = Arc::clone(&mold_arc);
-//             //         if let Some(data) = read_rx.next().await {
-//             //             trace!("原始数据 data:{:?}",data);
-//             //             match mold_clone.as_str() {
-//             //                 "depth" => {
-//             //                     if data.data != "" {
-//             //                         let result = bitget_spot_handle::handle_special_depth(data);
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 "ticker" => {
-//             //                     if data.data != "" {
-//             //                         let result = bitget_spot_handle::handle_special_ticker(data);
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 "account" => {
-//             //                     if data.data != "" {
-//             //                         let result = bitget_spot_handle::handle_account_info(data, symbol_back.clone());
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 "orders" => {
-//             //                     if data.data != "" {
-//             //                         let result = bitget_spot_handle::handle_order(data, dec!(1));
-//             //                         trace!(?result)
-//             //                     }
-//             //                 }
-//             //                 _ => {
-//             //                     error!("没有该命令!mode={}", mold_clone);
-//             //                     panic!("没有该命令!mode={}", mold_clone)
-//             //                 }
-//             //             }
-//             //         }
-//             //     }
-//             // });
-//             // let t1 = tokio::spawn(async move {
-//             //     //链接
-//             //     let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-//             //     exchange_wss.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-//             // });
-//             // try_join!(t1).unwrap();
-//         }
-//         ExchangeEnum::OkxSwap => {
-//             let symbol_format = utils::format_symbol(symbol.to_string(), "-").to_uppercase();
-//             trace!(symbol_format);
-//             let name = format!("okx_swap@{}", symbol.to_string().to_lowercase());
-//             let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-//             let (read_tx, mut read_rx) = futures_channel::mpsc::unbounded::<ResponseData>();
-//             let write_tx_am = Arc::new(Mutex::new(write_tx));
-//             let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-// 
-//             let params = OkxSwapLogin {
-//                 api_key: account_info.okx_access_key,
-//                 secret_key: account_info.okx_secret_key,
-//                 passphrase: account_info.okx_pass,
-//             };
-// 
-//             let mut exchange_wss = if ["depth", "ticker"].contains(&mold) {
-//                 OkxSwapWs::new_label(name, false, Option::from(params), OkxSwapWsType::Public)
-//             } else if ["account", "orders", "position"].contains(&mold) {
-//                 OkxSwapWs::new_label(name, false, Option::from(params), OkxSwapWsType::Private)
-//             } else {
-//                 OkxSwapWs::new_label(name, false, Option::from(params), OkxSwapWsType::Business)
-//             };
-// 
-//             exchange_wss.set_symbols(vec![symbol_format.clone()]);
-//             exchange_wss.set_subscribe(subscriber_type.into());
-// 
-//             let mold_arc = Arc::new(mold.to_string());
-//             tokio::spawn(async move {
-//                 let mold_clone = Arc::clone(&mold_arc);
-//                 loop {
-//                     if let Some(data) = read_rx.next().await {
-//                         trace!("原始数据 data:{:?}",data);
-//                         match mold_clone.as_str() {
-//                             "depth" => {
-//                                 if data.data != "" {
-//                                     let result = okx_handle::handle_special_depth(data);
-//                                     trace!(?result)
-//                                 }
-//                             }
-//                             "ticker" => {
-//                                 if data.data != "" {
-//                                     let result = okx_handle::handle_special_ticker(data);
-//                                     trace!(?result)
-//                                 }
-//                             }
-//                             "account" => {
-//                                 if data.data != "" {
-//                                     let result = okx_handle::handle_account_info(data, symbol_format.clone());
-//                                     trace!(?result)
-//                                 }
-//                             }
-//                             "position" => {
-//                                 if data.data != "" {
-//                                     let result = okx_handle::handle_position(data, dec!(10));
-//                                     trace!(?result)
-//                                 }
-//                             }
-//                             "orders" => {
-//                                 if data.data != "" {
-//                                     let result = okx_handle::handle_order(data, dec!(10));
-//                                     trace!(?result)
-//                                 }
-//                             }
-//                             _ => {
-//                                 error!("没有该命令!mode={}", mold_clone);
-//                                 panic!("没有该命令!mode={}", mold_clone)
-//                             }
-//                         }
-//                     }
-//                 }
-//             });
-// 
-//             let t1 = tokio::spawn(async move {
-//                 //链接
-//                 let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-//                 exchange_wss.ws_connect_async(bool_v3_clone, &write_tx_am, write_rx, read_tx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-//             });
-//             try_join!(t1).unwrap();
-//         }
-//         ExchangeEnum::HtxSwap => {
-//             let symbol_format = utils::format_symbol(symbol.to_string(), "-").to_uppercase();
-//             trace!(symbol_format);
-//             let name = format!("htx_swap@{}", symbol.to_string().to_lowercase());
-//             let (write_tx, write_rx) = futures_channel::mpsc::unbounded();
-//             let write_tx_am = Arc::new(Mutex::new(write_tx));
-//             let is_shutdown_arc = Arc::new(AtomicBool::new(true));
-// 
-//             let params = HtxSwapLogin {
-//                 api_key: account_info.htx_access_key,
-//                 secret: account_info.htx_secret_key,
-//             };
-// 
-//             let htx_wss_type = match mold.to_string().clone().as_str() {
-//                 "depth" => HtxSwapWsType::Public,
-//                 _ => HtxSwapWsType::Private
-//             };
-// 
-//             let mut exchange_wss = HtxSwapWs::new_label(name, Option::from(params), htx_wss_type);
-//             exchange_wss.set_symbols(vec![symbol_format.clone()]);
-//             exchange_wss.set_subscribe(subscriber_type.into());
-//             let bool_v3_clone = Arc::clone(&is_shutdown_arc);
-//             let mold_clone = mold.to_string().clone();
-//             let fun = move |data: ResponseData| {
-//                 let symbol_format_c = symbol_format.clone();
-//                 let mold_cc = mold_clone.clone();
-// 
-//                 async move {
-//                     trace!("原始数据 data:{:?}",data);
-//                     match mold_cc.as_str() {
-//                         "depth" => {
-//                             if data.data != "" {
-//                                 let result = handle_info::format_depth(ExchangeEnum::HtxSwap, &data);
-//                                 trace!("-------------------------------");
-//                                 trace!(?result)
-//                             }
-//                         }
-//                         "position" => {
-//                             if data.data != "" {
-//                                 let result = htx_swap_handle::handle_position(&data, &dec!(10));
-//                                 trace!("-------------------------------");
-//                                 trace!(?result)
-//                             }
-//                         }
-//                         "account" => {
-//                             if data.data != "" {
-//                                 let result = htx_swap_handle::handle_account_info(&data, &symbol_format_c);
-//                                 trace!("-------------------------------");
-//                                 trace!(?result)
-//                             }
-//                         }
-//                         "orders" => {
-//                             println!("{:?}", data);
-//                             if data.data != "" {
-//                                 let result = htx_swap_handle::handle_order(data, dec!(10));
-//                                 trace!("-------------------------------");
-//                                 trace!(?result)
-//                             }
-//                         }
-//                         _ => {
-//                             error!("没有该命令!mode={}", mold_cc);
-//                             panic!("没有该命令!mode={}", mold_cc)
-//                         }
-//                     };
-//                 }
-//             };
-//             exchange_wss.ws_connect_async(bool_v3_clone, fun, &write_tx_am, write_rx).await.expect("链接失败(内部一个心跳线程应该已经关闭了)");
-//         }
-//         _ => {
-//             error!("该交易所不支持!test_new_exchange_wss:{:?}",exchange);
-//             panic!("该交易所不支持!test_new_exchange_wss:{:?}", exchange)
-//         }
-//     }
-// }

+ 0 - 92
standard/tests/gate_handle_test.rs

@@ -1,92 +0,0 @@
-// mod exchange_test;
-// 
-// use std::collections::BTreeMap;
-// use tracing::{instrument, trace};
-// use exchanges::gate_swap_rest::GateSwapRest;
-// use exchanges::gate_swap_ws::GateSwapSubscribeType;
-// use standard::exchange::ExchangeEnum;
-// use crate::exchange_test::{test_new_exchange_wss};
-// 
-// const SYMBOL: &str = "BTC_USDT";
-// 
-// async fn get_user_id() -> String {
-//     let account_info = global::account_info::get_account_info("../test_account.toml");
-//     let mut params: BTreeMap<String, String> = BTreeMap::new();
-//     let access_key = account_info.gate_access_key;
-//     let secret_key = account_info.gate_secret_key;
-//     params.insert("access_key".to_string(), access_key);
-//     params.insert("secret_key".to_string(), secret_key);
-// 
-//     let mut gate_request = GateSwapRest::new(false, params);
-//     let res_data = gate_request.wallet_fee().await;
-//     if res_data.code == "200" {
-//         let res_data_json: serde_json::Value = serde_json::from_str(&res_data.data).unwrap();
-//         res_data_json["user_id"].to_string()
-//     } else {
-//         "".to_string()
-//     }
-// }
-// 
-// // 测试订阅深度订阅
-// #[tokio::test(flavor = "multi_thread", worker_threads = 4)]
-// #[instrument(level = "TRACE")]
-// async fn test_get_wss_depth() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let gate_subscribe_type = vec![
-//         GateSwapSubscribeType::PuFuturesOrderBook
-//     ];
-//     test_new_exchange_wss(ExchangeEnum::GateSwap, SYMBOL, gate_subscribe_type, "depth").await;
-// }
-// 
-// // 测试订阅Ticker信息
-// #[tokio::test(flavor = "multi_thread", worker_threads = 4)]
-// #[instrument(level = "TRACE")]
-// async fn test_get_wss_ticker() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let gate_subscribe_type = vec![
-//         GateSwapSubscribeType::PuFuturesOrderBook
-//     ];
-//     test_new_exchange_wss(ExchangeEnum::GateSwap, SYMBOL, gate_subscribe_type, "ticker").await;
-// }
-// 
-// // 测试订阅Account信息
-// #[tokio::test(flavor = "multi_thread", worker_threads = 4)]
-// #[instrument(level = "TRACE")]
-// async fn test_get_wss_account() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let user_id = get_user_id().await;
-//     trace!(?user_id);
-//     let gate_subscribe_type = vec![
-//         GateSwapSubscribeType::PrFuturesBalances(user_id)
-//     ];
-//     test_new_exchange_wss(ExchangeEnum::GateSwap, SYMBOL, gate_subscribe_type, "account").await;
-// }
-// 
-// // 测试订阅Position信息
-// #[tokio::test(flavor = "multi_thread", worker_threads = 4)]
-// #[instrument(level = "TRACE")]
-// async fn test_get_wss_position() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let user_id = get_user_id().await;
-//     let gate_subscribe_type = vec![
-//         GateSwapSubscribeType::PrFuturesPositions(user_id)
-//     ];
-//     test_new_exchange_wss(ExchangeEnum::GateSwap, SYMBOL, gate_subscribe_type, "position").await;
-// }
-// 
-// // 测试订阅Orders信息
-// #[tokio::test(flavor = "multi_thread", worker_threads = 4)]
-// #[instrument(level = "TRACE")]
-// async fn test_get_wss_orders() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let user_id = get_user_id().await;
-//     let gate_subscribe_type = vec![
-//         GateSwapSubscribeType::PrFuturesOrders(user_id)
-//     ];
-//     test_new_exchange_wss(ExchangeEnum::GateSwap, SYMBOL, gate_subscribe_type, "orders").await;
-// }

+ 0 - 279
standard/tests/gate_swap_test.rs

@@ -1,279 +0,0 @@
-// mod exchange_test;
-// 
-// use std::collections::BTreeMap;
-// use std::env;
-// use std::io::Error;
-// use rust_decimal_macros::dec;
-// use tokio::sync::mpsc;
-// use tracing::{instrument, trace};
-// use standard::exchange::{Exchange, ExchangeEnum};
-// use standard::{Order, OrderCommand, Platform, utils};
-// use crate::exchange_test::{test_new_exchange};
-// 
-// const SYMBOL: &str = "BLZ_USDT";
-// 
-// // 测试获取Exchange实体
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_self_exchange() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_self_exchange = gate_swap_exchange.get_self_exchange();
-//     trace!(?gate_get_self_exchange);
-// }
-// 
-// // 测试获取交易对信息
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_self_symbol() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_self_symbol = gate_swap_exchange.get_self_symbol();
-//     trace!(?gate_get_self_symbol);
-// }
-// 
-// // 测试获取是否使用高速通道
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_self_is_colo() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_self_is_colo = gate_swap_exchange.get_self_is_colo();
-//     trace!(?gate_get_self_is_colo);
-// }
-// 
-// // 测试获取登录params信息
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_self_params() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_self_params = gate_swap_exchange.get_self_params();
-//     trace!("gate_get_self_params={:?}",gate_get_self_params);
-// }
-// 
-// // 测试获取Market信息
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_self_market() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_self_market = gate_swap_exchange.get_self_market();
-//     trace!(?gate_get_self_market);
-// }
-// 
-// // 测试获取请求时间信息
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_request_delays() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_request_delays = gate_swap_exchange.get_request_delays();
-//     trace!(?gate_get_request_delays);
-// }
-// 
-// // 测试获取请求平均时间信息
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_request_avg_delay() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_request_avg_delay = gate_swap_exchange.get_request_avg_delay();
-//     trace!(?gate_get_request_avg_delay);
-// }
-// 
-// // 测试获取最大请求时间信息
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_request_max_delay() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_request_max_delay = gate_swap_exchange.get_request_max_delay();
-//     trace!(?gate_get_request_max_delay);
-// }
-// 
-// // 测试获取服务器时间
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_server_time() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let mut gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_server_time = gate_swap_exchange.get_server_time().await;
-//     trace!(?gate_get_server_time);
-// }
-// 
-// // 测试获取账号信息
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_account() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let mut gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_account = gate_swap_exchange.get_account().await;
-//     trace!(?gate_get_account);
-// }
-// 
-// // 测试获取持仓信息
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_position() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let mut gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_position = gate_swap_exchange.get_position().await;
-//     trace!(?gate_get_position);
-// }
-// 
-// // 测试获取所有持仓信息
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_positions() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let mut gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_positions = gate_swap_exchange.get_positions().await;
-//     trace!(?gate_get_positions);
-// }
-// 
-// // 测试获取Ticker信息
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_ticker() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let mut gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_ticker = gate_swap_exchange.get_ticker().await;
-//     trace!(?gate_get_ticker);
-// }
-// 
-// // 测试获取Market信息
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_market() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let mut gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_market = gate_swap_exchange.get_market().await;
-//     trace!(?gate_get_market);
-// }
-// 
-// // 测试获取Order详情信息
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_order_detail() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let mut gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_order_detail = gate_swap_exchange.get_order_detail("", "999999").await;
-//     trace!(?gate_get_order_detail);
-// }
-// 
-// // 测试获取Order列表信息
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_get_orders_list() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let mut gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_get_orders_list = gate_swap_exchange.get_orders_list("finished").await;
-//     trace!(?gate_get_orders_list);
-// }
-// 
-// // 测试下单
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_take_order() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let mut gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_take_order = gate_swap_exchange.take_order("999999", "kk", dec!(0.27), dec!(100)).await;
-//     trace!(?gate_take_order);
-// }
-// 
-// // 测试撤销订单
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_cancel_order() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let mut gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_cancel_order = gate_swap_exchange.cancel_order("", "999999").await;
-//     trace!(?gate_cancel_order);
-// }
-// 
-// // 测试批量撤销订单
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_cancel_orders() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let mut gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_cancel_orders = gate_swap_exchange.cancel_orders().await;
-//     trace!(?gate_cancel_orders);
-// }
-// 
-// // 测试设置持仓模式
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_set_dual_mode() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let mut gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_set_dual_mode = gate_swap_exchange.set_dual_mode("usdt", true).await;
-//     trace!(?gate_set_dual_mode);
-// }
-// 
-// // 测试设置杠杆
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_set_dual_leverage() {
-//     global::log_utils::init_log_with_trace();
-// 
-//     let mut gate_swap_exchange: Box<dyn Platform> = test_new_exchange(ExchangeEnum::GateSwap, SYMBOL).await;
-//     let gate_set_dual_leverage = gate_swap_exchange.set_dual_leverage("10").await;
-//     trace!(?gate_set_dual_leverage);
-// }
-// 
-// // 测试指令下单
-// #[tokio::test]
-// #[instrument(level = "TRACE")]
-// async fn test_command_order() {
-//     global::log_utils::init_log_with_trace();
-//     utils::proxy_handle();
-// 
-//     let (order_sender, mut order_receiver): (mpsc::Sender<Order>, mpsc::Receiver<Order>) = mpsc::channel(1024);
-//     let (error_sender, mut error_receiver): (mpsc::Sender<Error>, mpsc::Receiver<Error>) = mpsc::channel(1024);
-// 
-//     let mut params: BTreeMap<String, String> = BTreeMap::new();
-//     let access_key = env::var("gate_access_key").unwrap_or("".to_string());
-//     let secret_key = env::var("gate_secret_key").unwrap_or("".to_string());
-//     params.insert("access_key".to_string(), access_key);
-//     params.insert("secret_key".to_string(), secret_key);
-// 
-//     let mut gate_swap_exchange: Box<dyn Platform> = Exchange::new(ExchangeEnum::GateSwap, SYMBOL.to_string(), false, params, order_sender, error_sender).await;
-// 
-//     let mut command = OrderCommand::new();
-//     command.cancel.insert("888888".to_string(), vec!["888888".to_string(), "".to_string()]);
-//     command.limits_open.insert("888888".to_string(), vec!["100".to_string(), "kd".to_string(), "0.18".to_string(), "888888".to_string()]);
-//     command.limits_close.insert("999999".to_string(), vec!["100".to_string(), "kk".to_string(), "0.25".to_string(), "999999".to_string()]);
-//     command.check.insert("888888".to_string(), vec!["999999".to_string(), "".to_string()]);
-//     gate_swap_exchange.command_order(command, Default::default()).await;
-// 
-//     loop {
-//         if let Ok(order) = order_receiver.try_recv() {
-//             trace!(?order);
-//         }
-//         if let Ok(error) = error_receiver.try_recv() {
-//             trace!(?error);
-//         }
-//     }
-// }

+ 0 - 2
strategy/.gitignore

@@ -1,2 +0,0 @@
-/target
-/.idea

+ 0 - 26
strategy/Cargo.toml

@@ -1,26 +0,0 @@
-[package]
-name = "strategy"
-version = "0.1.0"
-edition = "2021"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
-serde = "1.0.183"
-serde_derive = "1.0"
-serde_json = "1.0.104"
-tokio = { version = "1.31.0", features = ["full"] }
-rust_decimal = { version = "1.32.0", features = ["maths"]}
-rust_decimal_macros = "1.32.0"
-rand = "0.8.4"
-chrono = "0.4.26"
-tracing = "0.1"
-tracing-subscriber = "0.3.17"
-standard = { path = "../standard" }
-global = { path = "../global" }
-exchanges = { path = "../exchanges" }
-reqwest = { version = "0.11.14", features = ["json"] }
-
-futures-util = { version = "0.3.28", default-features = false, features = ["sink", "std"] }
-futures-channel = "0.3.28"
-tokio-tungstenite= { git = "https://github.com/HonestHouLiang/tokio-tungstenite.git",rev = "208fc9b09bcc2e2c8cb52e1cde5087446464fc91"  }

+ 0 - 15
strategy/README.md

@@ -1,15 +0,0 @@
-## 声明
-
-
-## 项目结构解析
-
-```
-|
-├─ main                                 // 系统入口
-│
-├─ exchanges                            // 交易所层(网络层)
-│
-├─ standard                             // 标准化层(中间件)
-│
-└─ strategy                             // 策略层(主逻辑、风控等)
-```

+ 0 - 24
strategy/config.toml

@@ -1,24 +0,0 @@
-broker_id = ""
-account_name = "test_account_001"
-access_key = ""
-secret_key = ""
-pass_key = ""
-exchange = "coinex_usdt_swap"
-pair = "rose_usdt"
-open = 0.01
-close = 0.0002
-lever_rate = 1.0
-interval = 0.1
-ref_exchange = ["binance_usdt_swap"]
-ref_pair = ["ftm_usdt"]
-used_pct = 0.9
-index = 0
-save = 0
-hold_coin = 0.0
-log = 1
-stop_loss = 0.02
-gamma = 0.999
-grid = 1
-place_order_limit = 0
-colo = 0
-log_level = "debug"

+ 0 - 7
strategy/src/lib.rs

@@ -1,7 +0,0 @@
-pub mod core;
-pub mod model;
-mod strategy;
-mod utils;
-pub mod exchange_disguise;
-mod gate_swap;
-pub mod clear_core;

+ 0 - 183
strategy/src/model.rs

@@ -1,183 +0,0 @@
-use rust_decimal::Decimal;
-use rust_decimal_macros::dec;
-use serde_derive::{Deserialize, Serialize};
-use tokio::time::Instant;
-use global::trace_stack::TraceStack;
-use standard::Order;
-
-pub struct TokenParam {
-    // 平台币名称
-    pub token: String,
-    // 最低持有价值(u)
-    pub limit_value: Decimal
-}
-
-#[derive(Debug, Clone, PartialEq, Eq)]
-pub struct LocalPosition {
-    // 做多仓位
-    pub long_pos: Decimal,
-    // 做空仓位
-    pub short_pos: Decimal,
-    //
-    pub long_avg: Decimal,
-    //
-    pub short_avg: Decimal
-}
-
-impl LocalPosition {
-    pub fn new() -> LocalPosition {
-        LocalPosition{
-            long_pos: dec!(0),
-            short_pos: dec!(0),
-            long_avg: dec!(0),
-            short_avg: dec!(0),
-        }
-    }
-}
-
-// #[derive(Debug, Clone)]
-// pub struct TraderMsg {
-//     pub position: LocalPosition,
-//     pub cash: Decimal,
-//     pub coin: Decimal,
-//     pub orders: HashMap<String, OrderInfo>,
-//     pub ref_price: Vec<Vec<Decimal>>,
-//     pub market: Vec<Decimal>,
-//     pub predict: Decimal,
-//     pub side: String,
-// }
-
-// impl TraderMsg {
-//     pub fn new() -> TraderMsg {
-//         TraderMsg{
-//             position: LocalPosition {
-//                 long_pos: Default::default(),
-//                 short_pos: Default::default(),
-//                 long_avg: Default::default(),
-//                 short_avg: Default::default(),
-//             },
-//             cash: Default::default(),
-//             coin: Default::default(),
-//             orders: Default::default(),
-//             ref_price: Default::default(),
-//             market: vec![],
-//             predict: Default::default(),
-//             side: "normal".to_string(),
-//         }
-//     }
-// }
-
-#[derive(Debug, Clone)]
-pub struct OrderInfo {
-    pub symbol: String,
-
-    pub amount: Decimal,
-    // 方向 kd kk
-    pub side: String,
-    // 价格
-    pub price: Decimal,
-    // 自定义订单号
-    pub client_id: String,
-    // 实际价格
-    pub filled_price: Decimal,
-    //
-    pub filled: Decimal,
-    // 订单号
-    pub order_id: String,
-    // 时间
-    pub local_time: i64,
-    // 时间
-    pub create_time: i64,
-
-    pub status: String,
-
-    pub fee: Decimal,
-    // 追踪体系
-    pub trace_stack: TraceStack
-}
-
-impl OrderInfo {
-    pub fn parse_order_to_order_info(order: &mut Order) -> OrderInfo {
-        OrderInfo {
-            symbol: "".to_string(),
-            amount: order.amount.abs(),
-            side: "".to_string(),
-            price: order.price,
-            client_id: order.custom_id.clone(),
-            filled_price: order.avg_price,
-            filled: order.deal_amount.abs(),
-            order_id: order.id.clone(),
-            local_time: 0,
-            create_time: 0,
-            status: order.status.clone(),
-            fee: Default::default(),
-            trace_stack: TraceStack::new(0, Instant::now()),
-        }
-    }
-}
-
-#[derive(Serialize, Deserialize, Clone, Debug)]
-pub struct OriginalTradeBa {
-    // 成交价格
-    pub p: Decimal,
-    // 成交数量
-    pub q: Decimal,
-    // 成交时间
-    #[serde(rename = "T")]
-    pub t: Decimal,
-    // 买方是否是做市方。如true,则此次成交是一个主动卖出单,否则是一个主动买入单。
-    pub m: bool
-}
-
-#[derive(Serialize, Deserialize)]
-pub struct OriginalTradeGa {
-    pub size: Decimal,
-    pub price: Decimal
-}
-
-#[derive(Serialize, Deserialize)]
-pub struct OriginalTradeBy {
-    pub v: Decimal,
-    pub p: Decimal
-}
-
-#[derive(Serialize, Deserialize)]
-pub struct OriginalTradeOK {
-    // 数量
-    pub sz: Decimal,
-    // 价格
-    pub px: Decimal
-}
-
-#[allow(non_snake_case)]
-#[derive(Serialize, Deserialize, Debug)]
-pub struct OriginalTicker {
-    // 更新ID
-    pub u: i64,
-    // 买单最优挂单价格
-    pub b: Decimal,
-    // 买单最优挂单数量
-    pub B: Decimal,
-    // 卖单最优挂单价格
-    pub a: Decimal,
-    // 卖单最优挂单数量
-    pub A: Decimal
-}
-
-#[allow(non_snake_case)]
-#[derive(Serialize, Deserialize, Debug)]
-pub struct DealRecord {
-    // 参考价
-    pub refPrice: String,
-    // 挂单价
-    pub regPrice: String,
-    // 买单最优挂单数量
-    pub num: String,
-    // 触发时间
-    pub triggerTime: i64,
-    // 机器名称
-    pub robotName: String,
-    // 方向
-    pub side: String
-}
-

+ 0 - 54
strategy/tests/decimal_test.rs

@@ -1,54 +0,0 @@
-#[cfg(test)]
-mod tests {
-    use std::cmp::{max, min};
-    use std::str::FromStr;
-    use std::time::{Instant, Duration};
-    use rust_decimal::Decimal;
-    use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
-    use rust_decimal_macros::dec;
-
-    #[test]
-    // 计算十秒内能执行多少次decimal计算
-    fn test_decimal_subtraction_performance() {
-        // decimal使用的参考文档:https://docs.rs/rust_decimal/latest/rust_decimal/
-        // 在AMD Ryzen 7 5800X 8-Core Processor下,Decimal平均每秒可以计算1200w次(28位小数)~1600w次(1位小数)
-        let mut count = 0u64;
-        let point_3 = dec!(0.3323289834012382184823981293);
-        let point_2 = dec!(0.2518364912329136932183926421);
-        let num = point_3 - point_2;
-        let seconds = 10;
-
-        let start = Instant::now();
-        while start.elapsed() < Duration::from_secs(seconds) {
-            let _ = point_3 - point_2;
-            count += 1;
-        }
-
-        println!("Performed {} decimal subtractions in one second(avg), result is {:?}.", count / seconds, num.to_f64().unwrap());
-    }
-
-    #[test]
-    fn test_decimal_equals() {
-        let a = dec!(0.123234213);
-        let b = dec!(0.123234213);
-        println!("{} == {} is {}", a, b, a == b);
-        println!("{}.eq({}) is {}", a, b, a.eq(&b));
-    }
-
-    #[test]
-    fn test_decimal_min_and_max() {
-        let a = dec!(0.123234213);
-        let b = dec!(0.823004213);
-        println!("max({}, {})={}", a, b, max(a, b));
-        println!("min({}, {})={}", a, b, min(a, b));
-    }
-
-    #[test]
-    fn test_decimal_from() {
-        let a = dec!(1e-6);
-        let b = Decimal::from_f64(f64::from_str("1e-6").unwrap()).unwrap();
-
-        println!("a={}", a);
-        println!("b={:?}", b);
-    }
-}

+ 0 - 29
strategy/tests/f64_test.rs

@@ -1,29 +0,0 @@
-use tokio;
-
-#[tokio::test]
-async fn f64_tests() {
-    println!("{:?}", 0.3f64 - 0.1f64);
-    println!("{:?}", 0.3f64 - 0.2f64);
-}
-
-#[cfg(test)]
-mod tests {
-    use std::time::{Instant, Duration};
-
-    #[test]
-    // 计算十秒内能执行多少次f64计算
-    fn test_f64_subtraction_performance() {
-        // 在AMD Ryzen 7 5800X 8-Core Processor下,f64平均每秒可以计算2300w次~2600w次(1位小数)
-        let mut count = 0u64;
-        let num = 0.3f64 - 0.2f64;
-        let seconds = 10;
-
-        let start = Instant::now();
-        while start.elapsed() < Duration::from_secs(seconds) {
-            let _ = 0.3f64 - 0.2f64;
-            count += 1;
-        }
-
-        println!("Performed {} f64 subtractions in one second(avg), result is {}.", count / seconds, num);
-    }
-}