From ffd9ec28572933c4015dee7c608d7b4219198065 Mon Sep 17 00:00:00 2001 From: David Blom Date: Sun, 6 Oct 2024 08:27:24 +0200 Subject: [PATCH 001/224] Pin pre-commit to 3.8.0 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a9a4dd2c08a6..b557636a8143 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -96,7 +96,7 @@ jobs: version: ${{ env.POETRY_VERSION }} - name: Install build dependencies - run: python -m pip install --upgrade pip setuptools wheel pre-commit msgspec + run: python -m pip install --upgrade pip setuptools wheel pre-commit==3.8.0 msgspec # Temporarily pin pre-commit # ta-lib Python install currently broken # https://github.com/TA-Lib/ta-lib-python/issues/655 From 732785687cfba82cea7988be599dcc1cfaa6e53b Mon Sep 17 00:00:00 2001 From: David Blom Date: Sun, 6 Oct 2024 08:48:13 +0200 Subject: [PATCH 002/224] Pin it for mac and windows too --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b557636a8143..7d69db749efd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -235,7 +235,7 @@ jobs: version: ${{ env.POETRY_VERSION }} - name: Install build dependencies - run: python -m pip install --upgrade pip setuptools wheel pre-commit msgspec + run: python -m pip install --upgrade pip setuptools wheel pre-commit==3.8.0 msgspec - name: Cached pre-commit id: cached-pre-commit @@ -352,7 +352,7 @@ jobs: version: ${{ env.POETRY_VERSION }} - name: Install build dependencies - run: python -m pip install --upgrade pip setuptools wheel pre-commit msgspec + run: python -m pip install --upgrade pip setuptools wheel pre-commit==3.8.0 msgspec - name: Cached pre-commit id: cached-pre-commit From 2e88da2088ba5712507eedd3ef7c7da054c54e32 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 7 Oct 2024 09:28:33 +1100 Subject: [PATCH 003/224] Bump version --- nautilus_core/Cargo.lock | 57 ++++++------- nautilus_core/Cargo.toml | 4 +- nautilus_core/infrastructure/Cargo.toml | 2 +- poetry.lock | 108 ++++++++++++------------ pyproject.toml | 2 +- version.json | 2 +- 6 files changed, 86 insertions(+), 89 deletions(-) diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index d576222fcd7d..b413aeea52a7 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -783,9 +783,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.25" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d9e0b4957f635b8d3da819d0db5603620467ecf1f692d22a8c2717ce27e6d8" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ "jobserver", "libc", @@ -2711,7 +2711,7 @@ dependencies = [ [[package]] name = "nautilus-adapters" -version = "0.33.0" +version = "0.34.0" dependencies = [ "anyhow", "base64", @@ -2745,7 +2745,7 @@ dependencies = [ [[package]] name = "nautilus-analysis" -version = "0.33.0" +version = "0.34.0" dependencies = [ "anyhow", "chrono", @@ -2765,7 +2765,7 @@ dependencies = [ [[package]] name = "nautilus-backtest" -version = "0.33.0" +version = "0.34.0" dependencies = [ "anyhow", "cbindgen", @@ -2787,7 +2787,7 @@ dependencies = [ [[package]] name = "nautilus-cli" -version = "0.33.0" +version = "0.34.0" dependencies = [ "anyhow", "clap 4.5.19", @@ -2804,7 +2804,7 @@ dependencies = [ [[package]] name = "nautilus-common" -version = "0.33.0" +version = "0.34.0" dependencies = [ "anyhow", "bytes", @@ -2834,7 +2834,7 @@ dependencies = [ [[package]] name = "nautilus-core" -version = "0.33.0" +version = "0.34.0" dependencies = [ "anyhow", "bytes", @@ -2856,7 +2856,7 @@ dependencies = [ [[package]] name = "nautilus-data" -version = "0.33.0" +version = "0.34.0" dependencies = [ "anyhow", "chrono", @@ -2882,7 +2882,7 @@ dependencies = [ [[package]] name = "nautilus-execution" -version = "0.33.0" +version = "0.34.0" dependencies = [ "anyhow", "criterion", @@ -2906,7 +2906,7 @@ dependencies = [ [[package]] name = "nautilus-indicators" -version = "0.33.0" +version = "0.34.0" dependencies = [ "anyhow", "log", @@ -2919,7 +2919,7 @@ dependencies = [ [[package]] name = "nautilus-infrastructure" -version = "0.33.0" +version = "0.34.0" dependencies = [ "anyhow", "async-stream", @@ -2948,7 +2948,7 @@ dependencies = [ [[package]] name = "nautilus-model" -version = "0.33.0" +version = "0.34.0" dependencies = [ "anyhow", "cbindgen", @@ -2979,7 +2979,7 @@ dependencies = [ [[package]] name = "nautilus-network" -version = "0.33.0" +version = "0.34.0" dependencies = [ "anyhow", "axum", @@ -3009,7 +3009,7 @@ dependencies = [ [[package]] name = "nautilus-persistence" -version = "0.33.0" +version = "0.34.0" dependencies = [ "anyhow", "binary-heap-plus", @@ -3033,7 +3033,7 @@ dependencies = [ [[package]] name = "nautilus-pyo3" -version = "0.33.0" +version = "0.34.0" dependencies = [ "nautilus-adapters", "nautilus-common", @@ -3049,7 +3049,7 @@ dependencies = [ [[package]] name = "nautilus-test-kit" -version = "0.33.0" +version = "0.34.0" dependencies = [ "anyhow", "axum", @@ -3270,12 +3270,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.1" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "oorandom" @@ -3906,9 +3903,9 @@ dependencies = [ [[package]] name = "redis" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e86f5670bd8b028edfb240f0616cad620705b31ec389d55e4f3da2c38dcd48" +checksum = "92f61607c4c4442b575fbc3f31a5dd4e5dd69cfea8f6afec5b83e24f61c126ab" dependencies = [ "arc-swap", "async-trait", @@ -3929,7 +3926,7 @@ dependencies = [ "sha1_smol", "socket2", "tokio", - "tokio-retry", + "tokio-retry2", "tokio-rustls", "tokio-util", "url", @@ -4318,9 +4315,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ "windows-sys 0.59.0", ] @@ -5170,10 +5167,10 @@ dependencies = [ ] [[package]] -name = "tokio-retry" -version = "0.3.0" +name = "tokio-retry2" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f57eb36ecbe0fc510036adff84824dd3c24bb781e21bfa67b69d556aa85214f" +checksum = "903934dba1c4c2f2e9cb460ef10b5695e0b0ecad3bf9ee7c8675e540c5e8b2d1" dependencies = [ "pin-project", "rand", diff --git a/nautilus_core/Cargo.toml b/nautilus_core/Cargo.toml index cff73d8b049f..9f9c51f83a56 100644 --- a/nautilus_core/Cargo.toml +++ b/nautilus_core/Cargo.toml @@ -20,7 +20,7 @@ members = [ [workspace.package] rust-version = "1.81.0" -version = "0.33.0" +version = "0.34.0" edition = "2021" authors = ["Nautech Systems "] description = "A high-performance algorithmic trading platform and event-driven backtester" @@ -36,7 +36,7 @@ hex = "0.4.3" indexmap = { version = "2.6.0", features = ["serde"] } itertools = "0.12.1" itoa = "1.0.11" -once_cell = "1.20.1" +once_cell = "1.20.2" log = { version = "0.4.22", features = ["std", "kv_unstable", "serde", "release_max_level_debug"] } pyo3 = { version = "0.21.2", features = ["rust_decimal"] } pyo3-asyncio-0-21 = { version = "0.21.0", features = ["tokio-runtime", "tokio", "attributes"] } diff --git a/nautilus_core/infrastructure/Cargo.toml b/nautilus_core/infrastructure/Cargo.toml index 776c19a55930..1d720e3388d8 100644 --- a/nautilus_core/infrastructure/Cargo.toml +++ b/nautilus_core/infrastructure/Cargo.toml @@ -30,7 +30,7 @@ serde_json = { workspace = true } tokio = { workspace = true } tracing = {workspace = true } ustr = { workspace = true } -redis = { version = "0.27.2", features = [ +redis = { version = "0.27.3", features = [ "connection-manager", "keep-alive", "sentinel", diff --git a/poetry.lock b/poetry.lock index f9a9c6cadd74..a0bd9cf9315a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2187,64 +2187,64 @@ files = [ [[package]] name = "numpy" -version = "2.1.1" +version = "2.1.2" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" files = [ - {file = "numpy-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9"}, - {file = "numpy-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd"}, - {file = "numpy-2.1.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f"}, - {file = "numpy-2.1.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab"}, - {file = "numpy-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7"}, - {file = "numpy-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6"}, - {file = "numpy-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0"}, - {file = "numpy-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647"}, - {file = "numpy-2.1.1-cp310-cp310-win32.whl", hash = "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728"}, - {file = "numpy-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae"}, - {file = "numpy-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550"}, - {file = "numpy-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f"}, - {file = "numpy-2.1.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0"}, - {file = "numpy-2.1.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95"}, - {file = "numpy-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca"}, - {file = "numpy-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf"}, - {file = "numpy-2.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e"}, - {file = "numpy-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2"}, - {file = "numpy-2.1.1-cp311-cp311-win32.whl", hash = "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d"}, - {file = "numpy-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e"}, - {file = "numpy-2.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e"}, - {file = "numpy-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe"}, - {file = "numpy-2.1.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f"}, - {file = "numpy-2.1.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521"}, - {file = "numpy-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b"}, - {file = "numpy-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201"}, - {file = "numpy-2.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a"}, - {file = "numpy-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313"}, - {file = "numpy-2.1.1-cp312-cp312-win32.whl", hash = "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed"}, - {file = "numpy-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270"}, - {file = "numpy-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5"}, - {file = "numpy-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5"}, - {file = "numpy-2.1.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136"}, - {file = "numpy-2.1.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0"}, - {file = "numpy-2.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb"}, - {file = "numpy-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df"}, - {file = "numpy-2.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78"}, - {file = "numpy-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556"}, - {file = "numpy-2.1.1-cp313-cp313-win32.whl", hash = "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b"}, - {file = "numpy-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0"}, - {file = "numpy-2.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553"}, - {file = "numpy-2.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480"}, - {file = "numpy-2.1.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f"}, - {file = "numpy-2.1.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468"}, - {file = "numpy-2.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef"}, - {file = "numpy-2.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f"}, - {file = "numpy-2.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c"}, - {file = "numpy-2.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec"}, - {file = "numpy-2.1.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5"}, - {file = "numpy-2.1.1-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504"}, - {file = "numpy-2.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd"}, - {file = "numpy-2.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39"}, - {file = "numpy-2.1.1.tar.gz", hash = "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd"}, + {file = "numpy-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:30d53720b726ec36a7f88dc873f0eec8447fbc93d93a8f079dfac2629598d6ee"}, + {file = "numpy-2.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8d3ca0a72dd8846eb6f7dfe8f19088060fcb76931ed592d29128e0219652884"}, + {file = "numpy-2.1.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:fc44e3c68ff00fd991b59092a54350e6e4911152682b4782f68070985aa9e648"}, + {file = "numpy-2.1.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:7c1c60328bd964b53f8b835df69ae8198659e2b9302ff9ebb7de4e5a5994db3d"}, + {file = "numpy-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cdb606a7478f9ad91c6283e238544451e3a95f30fb5467fbf715964341a8a86"}, + {file = "numpy-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d666cb72687559689e9906197e3bec7b736764df6a2e58ee265e360663e9baf7"}, + {file = "numpy-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6eef7a2dbd0abfb0d9eaf78b73017dbfd0b54051102ff4e6a7b2980d5ac1a03"}, + {file = "numpy-2.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:12edb90831ff481f7ef5f6bc6431a9d74dc0e5ff401559a71e5e4611d4f2d466"}, + {file = "numpy-2.1.2-cp310-cp310-win32.whl", hash = "sha256:a65acfdb9c6ebb8368490dbafe83c03c7e277b37e6857f0caeadbbc56e12f4fb"}, + {file = "numpy-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:860ec6e63e2c5c2ee5e9121808145c7bf86c96cca9ad396c0bd3e0f2798ccbe2"}, + {file = "numpy-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b42a1a511c81cc78cbc4539675713bbcf9d9c3913386243ceff0e9429ca892fe"}, + {file = "numpy-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:faa88bc527d0f097abdc2c663cddf37c05a1c2f113716601555249805cf573f1"}, + {file = "numpy-2.1.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c82af4b2ddd2ee72d1fc0c6695048d457e00b3582ccde72d8a1c991b808bb20f"}, + {file = "numpy-2.1.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:13602b3174432a35b16c4cfb5de9a12d229727c3dd47a6ce35111f2ebdf66ff4"}, + {file = "numpy-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ebec5fd716c5a5b3d8dfcc439be82a8407b7b24b230d0ad28a81b61c2f4659a"}, + {file = "numpy-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2b49c3c0804e8ecb05d59af8386ec2f74877f7ca8fd9c1e00be2672e4d399b1"}, + {file = "numpy-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2cbba4b30bf31ddbe97f1c7205ef976909a93a66bb1583e983adbd155ba72ac2"}, + {file = "numpy-2.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8e00ea6fc82e8a804433d3e9cedaa1051a1422cb6e443011590c14d2dea59146"}, + {file = "numpy-2.1.2-cp311-cp311-win32.whl", hash = "sha256:5006b13a06e0b38d561fab5ccc37581f23c9511879be7693bd33c7cd15ca227c"}, + {file = "numpy-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:f1eb068ead09f4994dec71c24b2844f1e4e4e013b9629f812f292f04bd1510d9"}, + {file = "numpy-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7bf0a4f9f15b32b5ba53147369e94296f5fffb783db5aacc1be15b4bf72f43b"}, + {file = "numpy-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b1d0fcae4f0949f215d4632be684a539859b295e2d0cb14f78ec231915d644db"}, + {file = "numpy-2.1.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f751ed0a2f250541e19dfca9f1eafa31a392c71c832b6bb9e113b10d050cb0f1"}, + {file = "numpy-2.1.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:bd33f82e95ba7ad632bc57837ee99dba3d7e006536200c4e9124089e1bf42426"}, + {file = "numpy-2.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b8cde4f11f0a975d1fd59373b32e2f5a562ade7cde4f85b7137f3de8fbb29a0"}, + {file = "numpy-2.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d95f286b8244b3649b477ac066c6906fbb2905f8ac19b170e2175d3d799f4df"}, + {file = "numpy-2.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ab4754d432e3ac42d33a269c8567413bdb541689b02d93788af4131018cbf366"}, + {file = "numpy-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e585c8ae871fd38ac50598f4763d73ec5497b0de9a0ab4ef5b69f01c6a046142"}, + {file = "numpy-2.1.2-cp312-cp312-win32.whl", hash = "sha256:9c6c754df29ce6a89ed23afb25550d1c2d5fdb9901d9c67a16e0b16eaf7e2550"}, + {file = "numpy-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:456e3b11cb79ac9946c822a56346ec80275eaf2950314b249b512896c0d2505e"}, + {file = "numpy-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a84498e0d0a1174f2b3ed769b67b656aa5460c92c9554039e11f20a05650f00d"}, + {file = "numpy-2.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4d6ec0d4222e8ffdab1744da2560f07856421b367928026fb540e1945f2eeeaf"}, + {file = "numpy-2.1.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:259ec80d54999cc34cd1eb8ded513cb053c3bf4829152a2e00de2371bd406f5e"}, + {file = "numpy-2.1.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:675c741d4739af2dc20cd6c6a5c4b7355c728167845e3c6b0e824e4e5d36a6c3"}, + {file = "numpy-2.1.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b2d4e667895cc55e3ff2b56077e4c8a5604361fc21a042845ea3ad67465aa8"}, + {file = "numpy-2.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43cca367bf94a14aca50b89e9bc2061683116cfe864e56740e083392f533ce7a"}, + {file = "numpy-2.1.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:76322dcdb16fccf2ac56f99048af32259dcc488d9b7e25b51e5eca5147a3fb98"}, + {file = "numpy-2.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:32e16a03138cabe0cb28e1007ee82264296ac0983714094380b408097a418cfe"}, + {file = "numpy-2.1.2-cp313-cp313-win32.whl", hash = "sha256:242b39d00e4944431a3cd2db2f5377e15b5785920421993770cddb89992c3f3a"}, + {file = "numpy-2.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:f2ded8d9b6f68cc26f8425eda5d3877b47343e68ca23d0d0846f4d312ecaa445"}, + {file = "numpy-2.1.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ffef621c14ebb0188a8633348504a35c13680d6da93ab5cb86f4e54b7e922b5"}, + {file = "numpy-2.1.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ad369ed238b1959dfbade9018a740fb9392c5ac4f9b5173f420bd4f37ba1f7a0"}, + {file = "numpy-2.1.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d82075752f40c0ddf57e6e02673a17f6cb0f8eb3f587f63ca1eaab5594da5b17"}, + {file = "numpy-2.1.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:1600068c262af1ca9580a527d43dc9d959b0b1d8e56f8a05d830eea39b7c8af6"}, + {file = "numpy-2.1.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a26ae94658d3ba3781d5e103ac07a876b3e9b29db53f68ed7df432fd033358a8"}, + {file = "numpy-2.1.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13311c2db4c5f7609b462bc0f43d3c465424d25c626d95040f073e30f7570e35"}, + {file = "numpy-2.1.2-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:2abbf905a0b568706391ec6fa15161fad0fb5d8b68d73c461b3c1bab6064dd62"}, + {file = "numpy-2.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ef444c57d664d35cac4e18c298c47d7b504c66b17c2ea91312e979fcfbdfb08a"}, + {file = "numpy-2.1.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:bdd407c40483463898b84490770199d5714dcc9dd9b792f6c6caccc523c00952"}, + {file = "numpy-2.1.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:da65fb46d4cbb75cb417cddf6ba5e7582eb7bb0b47db4b99c9fe5787ce5d91f5"}, + {file = "numpy-2.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c193d0b0238638e6fc5f10f1b074a6993cb13b0b431f64079a509d63d3aa8b7"}, + {file = "numpy-2.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a7d80b2e904faa63068ead63107189164ca443b42dd1930299e0d1cb041cec2e"}, + {file = "numpy-2.1.2.tar.gz", hash = "sha256:13532a088217fa624c99b843eeb54640de23b3414b14aa66d023805eb731066c"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 080db5d0544a..915d69d50b0f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nautilus_trader" -version = "1.203.0" +version = "1.204.0" description = "A high-performance algorithmic trading platform and event-driven backtester" authors = ["Nautech Systems "] license = "LGPL-3.0-or-later" diff --git a/version.json b/version.json index 48f4f21643a6..19c811ad5c2f 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, "label": "", - "message": "v1.203.0", + "message": "v1.204.0", "color": "orange" } From 34dae2cedabf7024da607dd73a84e890e6a441af Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 7 Oct 2024 15:27:47 +1100 Subject: [PATCH 004/224] Update release notes --- RELEASES.md | 18 ++++++++++++++++++ poetry.lock | 13 ------------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index a58aee7cc3f7..d4b1397f8496 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,3 +1,21 @@ +# NautilusTrader 1.204.0 Beta + +Released on TBD (UTC). + +### Enhancements +None + +### Internal Improvements +None + +### Breaking Changes +None + +### Fixes +None + +--- + # NautilusTrader 1.203.0 Beta Released on 5th October 2024 (UTC). diff --git a/poetry.lock b/poetry.lock index a0bd9cf9315a..bd69ed384895 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2675,19 +2675,6 @@ files = [ {file = "pyarrow-17.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:392bc9feabc647338e6c89267635e111d71edad5fcffba204425a7c8d13610d7"}, {file = "pyarrow-17.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:af5ff82a04b2171415f1410cff7ebb79861afc5dae50be73ce06d6e870615204"}, {file = "pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:edca18eaca89cd6382dfbcff3dd2d87633433043650c07375d095cd3517561d8"}, - {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c7916bff914ac5d4a8fe25b7a25e432ff921e72f6f2b7547d1e325c1ad9d155"}, - {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f553ca691b9e94b202ff741bdd40f6ccb70cdd5fbf65c187af132f1317de6145"}, - {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0cdb0e627c86c373205a2f94a510ac4376fdc523f8bb36beab2e7f204416163c"}, - {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:d7d192305d9d8bc9082d10f361fc70a73590a4c65cf31c3e6926cd72b76bc35c"}, - {file = "pyarrow-17.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:02dae06ce212d8b3244dd3e7d12d9c4d3046945a5933d28026598e9dbbda1fca"}, - {file = "pyarrow-17.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:13d7a460b412f31e4c0efa1148e1d29bdf18ad1411eb6757d38f8fbdcc8645fb"}, - {file = "pyarrow-17.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b564a51fbccfab5a04a80453e5ac6c9954a9c5ef2890d1bcf63741909c3f8df"}, - {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32503827abbc5aadedfa235f5ece8c4f8f8b0a3cf01066bc8d29de7539532687"}, - {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a155acc7f154b9ffcc85497509bcd0d43efb80d6f733b0dc3bb14e281f131c8b"}, - {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:dec8d129254d0188a49f8a1fc99e0560dc1b85f60af729f47de4046015f9b0a5"}, - {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a48ddf5c3c6a6c505904545c25a4ae13646ae1f8ba703c4df4a1bfe4f4006bda"}, - {file = "pyarrow-17.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:42bf93249a083aca230ba7e2786c5f673507fa97bbd9725a1e2754715151a204"}, - {file = "pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28"}, ] [package.dependencies] From a9bac697b6328f04f323a7df57f2db88ae06e62d Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 7 Oct 2024 16:20:47 +1100 Subject: [PATCH 005/224] Standardize Betfair symbology --- .../betfair_backtest_orderbook_imbalance.py | 4 +- .../adapters/betfair/parsing/common.py | 6 +- nautilus_trader/model/instruments/betting.pyx | 21 ++-- nautilus_trader/test_kit/providers.py | 2 +- .../test_kit/rust/identifiers_pyo3.py | 2 +- nautilus_trader/test_kit/stubs/identifiers.py | 2 +- tests/acceptance_tests/test_backtest.py | 4 +- .../adapters/betfair/test_betfair_backtest.py | 10 +- .../adapters/betfair/test_betfair_client.py | 10 +- .../adapters/betfair/test_betfair_data.py | 8 +- .../betfair/test_betfair_execution.py | 4 +- .../adapters/betfair/test_betfair_parsing.py | 34 +++--- .../betfair/test_betfair_providers.py | 19 +-- .../adapters/betfair/test_kit.py | 114 +++++++++--------- .../{1.166564490.bz2 => 1-166564490.bz2} | Bin .../{1.166811431.bz2 => 1-166811431.bz2} | Bin .../{1.180305278.bz2 => 1-180305278.bz2} | Bin .../{1.206064380.bz2 => 1-206064380.bz2} | Bin tests/unit_tests/backtest/test_config.py | 2 +- tests/unit_tests/persistence/conftest.py | 2 +- .../unit_tests/persistence/test_streaming.py | 6 +- 21 files changed, 120 insertions(+), 130 deletions(-) rename tests/test_data/betfair/{1.166564490.bz2 => 1-166564490.bz2} (100%) rename tests/test_data/betfair/{1.166811431.bz2 => 1-166811431.bz2} (100%) rename tests/test_data/betfair/{1.180305278.bz2 => 1-180305278.bz2} (100%) rename tests/test_data/betfair/{1.206064380.bz2 => 1-206064380.bz2} (100%) diff --git a/examples/backtest/betfair_backtest_orderbook_imbalance.py b/examples/backtest/betfair_backtest_orderbook_imbalance.py index 24c7a6adb115..2c4822b128f6 100644 --- a/examples/backtest/betfair_backtest_orderbook_imbalance.py +++ b/examples/backtest/betfair_backtest_orderbook_imbalance.py @@ -56,12 +56,12 @@ # Add instruments instruments = [ betting_instrument( - market_id="1.166811431", + market_id="1-166811431", selection_id=19248890, selection_handicap=0.0, ), betting_instrument( - market_id="1.166811431", + market_id="1-166811431", selection_id=38848248, selection_handicap=0.0, ), diff --git a/nautilus_trader/adapters/betfair/parsing/common.py b/nautilus_trader/adapters/betfair/parsing/common.py index 2e194cff5f1e..b585d4e6a568 100644 --- a/nautilus_trader/adapters/betfair/parsing/common.py +++ b/nautilus_trader/adapters/betfair/parsing/common.py @@ -43,8 +43,8 @@ def betfair_instrument_id( """ Create an instrument ID from betfair fields. - >>> betfair_instrument_id(market_id="1.201070830", selection_id=123456, selection_handicap=None) - InstrumentId('1.201070830-123456-None.BETFAIR') + >>> betfair_instrument_id(market_id="1-201070830", selection_id=123456, selection_handicap=None) + InstrumentId('1-201070830-123456-None.BETFAIR') """ PyCondition.not_empty(market_id, "market_id") @@ -55,7 +55,7 @@ def betfair_instrument_id( def instrument_id_betfair_ids( instrument_id: InstrumentId, ) -> tuple[MarketId, SelectionId, Handicap | None]: - parts = instrument_id.symbol.value.split("-", maxsplit=2) + parts = instrument_id.symbol.value.rsplit("-", maxsplit=2) return ( MarketId(parts[0]), SelectionId(parts[1]), diff --git a/nautilus_trader/model/instruments/betting.pyx b/nautilus_trader/model/instruments/betting.pyx index 416118fa165b..1d3b524c5dca 100644 --- a/nautilus_trader/model/instruments/betting.pyx +++ b/nautilus_trader/model/instruments/betting.pyx @@ -204,27 +204,22 @@ cdef class BettingInstrument(Instrument): return Money(quantity.as_f64_c() * float(self.multiplier), self.quote_currency) -def make_symbol( - market_id: str, - selection_id: int, - selection_handicap: float, -) -> Symbol: +cpdef Symbol make_symbol( + str market_id, + int selection_id, + float selection_handicap, +): """ Make symbol. >>> make_symbol(market_id="1.201070830", selection_id=123456, selection_handicap=null_handicap()) - Symbol('1.201070830-123456-None') + Symbol('1-201070830-123456-None') """ - - def _clean(s): - return str(s).replace(" ", "").replace(":", "") - + market_id = market_id.replace(".", "-") handicap = selection_handicap if selection_handicap != null_handicap() else None - value: str = "-".join( - [_clean(k) for k in (market_id, selection_id, handicap)], - ) + cdef str value = f"{market_id}-{selection_id}-{handicap}".replace(" ", "").replace(":", "") assert len(value) <= 32, f"Symbol too long ({len(value)}): '{value}'" return Symbol(value) diff --git a/nautilus_trader/test_kit/providers.py b/nautilus_trader/test_kit/providers.py index 175654b0bbfd..12ec3d8d47cb 100644 --- a/nautilus_trader/test_kit/providers.py +++ b/nautilus_trader/test_kit/providers.py @@ -670,7 +670,7 @@ def betting_instrument(venue: str | None = None) -> BettingInstrument: event_open_date=pd.Timestamp("2022-02-07 23:30:00+00:00"), event_type_id=6423, event_type_name="American Football", - market_id="1.123456789", + market_id="1-123456789", market_name="AFC Conference Winner", market_start_time=pd.Timestamp("2022-02-07 23:30:00+00:00"), market_type="SPECIAL", diff --git a/nautilus_trader/test_kit/rust/identifiers_pyo3.py b/nautilus_trader/test_kit/rust/identifiers_pyo3.py index 907243d3df82..b10012b5e4c9 100644 --- a/nautilus_trader/test_kit/rust/identifiers_pyo3.py +++ b/nautilus_trader/test_kit/rust/identifiers_pyo3.py @@ -85,7 +85,7 @@ def betting_instrument_id(): from nautilus_trader.adapters.betfair.parsing.common import betfair_instrument_id return betfair_instrument_id( - market_id="1.179082386", + market_id="1-179082386", selection_id="50214", selection_handicap=None, ) diff --git a/nautilus_trader/test_kit/stubs/identifiers.py b/nautilus_trader/test_kit/stubs/identifiers.py index 3075dd3053f6..5abd8f857210 100644 --- a/nautilus_trader/test_kit/stubs/identifiers.py +++ b/nautilus_trader/test_kit/stubs/identifiers.py @@ -89,7 +89,7 @@ def betting_instrument_id(): from nautilus_trader.adapters.betfair.parsing.common import betfair_instrument_id return betfair_instrument_id( - market_id="1.179082386", + market_id="1-179082386", selection_id=50214, selection_handicap=None, ) diff --git a/tests/acceptance_tests/test_backtest.py b/tests/acceptance_tests/test_backtest.py index 8f74000867cc..2f49aa579522 100644 --- a/tests/acceptance_tests/test_backtest.py +++ b/tests/acceptance_tests/test_backtest.py @@ -651,7 +651,7 @@ def setup(self): ) # Set up data - data = BetfairDataProvider.betfair_feed_parsed(market_id="1.166811431") + data = BetfairDataProvider.betfair_feed_parsed(market_id="1-166811431") instruments = [d for d in data if isinstance(d, BettingInstrument)] assert instruments @@ -710,7 +710,7 @@ def setup(self): book_type=BookType.L2_MBP, ) - data = BetfairDataProvider.betfair_feed_parsed(market_id="1.166811431") + data = BetfairDataProvider.betfair_feed_parsed(market_id="1-166811431") instruments = [d for d in data if isinstance(d, BettingInstrument)] for instrument in instruments[:1]: diff --git a/tests/integration_tests/adapters/betfair/test_betfair_backtest.py b/tests/integration_tests/adapters/betfair/test_betfair_backtest.py index db11393e3064..45dbfc35b7a0 100644 --- a/tests/integration_tests/adapters/betfair/test_betfair_backtest.py +++ b/tests/integration_tests/adapters/betfair/test_betfair_backtest.py @@ -13,7 +13,6 @@ # limitations under the License. # ------------------------------------------------------------------------------------------------- -import pytest from nautilus_trader.adapters.betfair.constants import BETFAIR_VENUE from nautilus_trader.adapters.betfair.parsing.core import BetfairParser @@ -34,7 +33,6 @@ from tests.integration_tests.adapters.betfair.test_kit import betting_instrument -@pytest.mark.skip(reason="Unskip once Betfair symbol conventions changed") def test_betfair_backtest(): # Arrange config = BacktestEngineConfig( @@ -58,12 +56,12 @@ def test_betfair_backtest(): # Add instruments instruments = [ betting_instrument( - market_id="1.166811431", + market_id="1-166811431", selection_id=19248890, selection_handicap=None, ), betting_instrument( - market_id="1.166811431", + market_id="1-166811431", selection_id=38848248, selection_handicap=None, ), @@ -97,6 +95,6 @@ def test_betfair_backtest(): account = engine.trader.generate_account_report(BETFAIR_VENUE) fills = engine.trader.generate_order_fills_report() positions = engine.trader.generate_positions_report() - assert account.iloc[-1]["total"] == "8797.76" - assert len(fills) == 3652 + assert account.iloc[-1]["total"] == "49039.65" + assert len(fills) == 2708 assert len(positions) == 2 diff --git a/tests/integration_tests/adapters/betfair/test_betfair_client.py b/tests/integration_tests/adapters/betfair/test_betfair_client.py index 744d06541109..5e85cdd01410 100644 --- a/tests/integration_tests/adapters/betfair/test_betfair_client.py +++ b/tests/integration_tests/adapters/betfair/test_betfair_client.py @@ -184,7 +184,7 @@ async def test_place_orders(betfair_client): _, request = betfair_client._request.call_args[0] expected = PlaceOrders( params=_PlaceOrdersParams( - market_id="1.179082386", + market_id="1-179082386", instructions=[ PlaceInstruction( order_type=OrderType.LIMIT, @@ -229,7 +229,7 @@ async def test_place_orders_handicap(betfair_client): _, request = betfair_client._request.call_args[0] expected = PlaceOrders( params=_PlaceOrdersParams( - market_id="1.186249896", + market_id="1-186249896", instructions=[ PlaceInstruction( order_type=OrderType.LIMIT, @@ -284,7 +284,7 @@ async def test_place_orders_market_on_close(betfair_client): _, request = betfair_client._request.call_args[0] expected = PlaceOrders( params=_PlaceOrdersParams( - market_id="1.179082386", + market_id="1-179082386", instructions=[ PlaceInstruction( order_type=OrderType.MARKET_ON_CLOSE, @@ -328,7 +328,7 @@ async def test_replace_orders_single(betfair_client): _, request = betfair_client._request.call_args[0] expected = ReplaceOrders( params=_ReplaceOrdersParams( - market_id="1.179082386", + market_id="1-179082386", instructions=[ReplaceInstruction(bet_id=240718603398, new_price=2.0)], customer_ref="038990c619d2b5c837a6fe91f9b7b9ed", market_version=None, @@ -357,7 +357,7 @@ async def test_cancel_orders(betfair_client): _, request = betfair_client._request.call_args[0] expected = CancelOrders( params=_CancelOrdersParams( - market_id="1.179082386", + market_id="1-179082386", customer_ref="038990c619d2b5c837a6fe91f9b7b9ed", instructions=[CancelInstruction(bet_id=228302937743)], ), diff --git a/tests/integration_tests/adapters/betfair/test_betfair_data.py b/tests/integration_tests/adapters/betfair/test_betfair_data.py index 1725e1e6b0e8..8e423c57d63d 100644 --- a/tests/integration_tests/adapters/betfair/test_betfair_data.py +++ b/tests/integration_tests/adapters/betfair/test_betfair_data.py @@ -85,7 +85,7 @@ def instrument_list(mock_load_markets_metadata): # Fill INSTRUMENTS global cache INSTRUMENTS.extend(instrument_provider.list_all()) - assert INSTRUMENTS + # assert INSTRUMENTS # TODO: Fix Betfair symbology @pytest.mark.asyncio() @@ -388,13 +388,13 @@ def test_betfair_ticker(data_client, mock_data_engine_process) -> None: assert ticker.traded_volume == 364.45 assert ( str(ticker) - == "BetfairTicker(instrument_id=1.176621195-42153-None.BETFAIR, ltp=3.15, tv=364.45, spn=None, spf=None, ts_init=1471370160471000064)" + == "BetfairTicker(instrument_id=1-176621195-42153-None.BETFAIR, ltp=3.15, tv=364.45, spn=None, spf=None, ts_init=1471370160471000064)" ) def test_betfair_ticker_sp(data_client, mock_data_engine_process): # Arrange - lines = BetfairDataProvider.read_lines("1.206064380.bz2") + lines = BetfairDataProvider.read_lines("1-206064380.bz2") # Act for line in lines: @@ -416,7 +416,7 @@ def test_betfair_ticker_sp(data_client, mock_data_engine_process): def test_betfair_starting_price(data_client, mock_data_engine_process): # Arrange - lines = BetfairDataProvider.read_lines("1.206064380.bz2") + lines = BetfairDataProvider.read_lines("1-206064380.bz2") # Act for line in lines[-100:]: diff --git a/tests/integration_tests/adapters/betfair/test_betfair_execution.py b/tests/integration_tests/adapters/betfair/test_betfair_execution.py index 78038eb83fda..0c61dee70505 100644 --- a/tests/integration_tests/adapters/betfair/test_betfair_execution.py +++ b/tests/integration_tests/adapters/betfair/test_betfair_execution.py @@ -307,7 +307,7 @@ async def test_modify_order_error_order_doesnt_exist( expected_args = tuple( { "strategy_id": StrategyId("S-001"), - "instrument_id": InstrumentId.from_str("1.179082386-50214-None.BETFAIR"), + "instrument_id": InstrumentId.from_str("1-179082386-50214-None.BETFAIR"), "client_order_id": ClientOrderId("O-20210410-022422-001-001-1"), "venue_order_id": None, "reason": "ORDER NOT IN CACHE", @@ -936,7 +936,7 @@ async def test_check_cache_against_order_image_passes( async def test_fok_order_found_in_cache(exec_client, setup_order_state, strategy, cache): # Arrange instrument = betting_instrument( - market_id="1.219194342", + market_id="1-219194342", selection_id=61288616, selection_handicap=0.0, ) diff --git a/tests/integration_tests/adapters/betfair/test_betfair_parsing.py b/tests/integration_tests/adapters/betfair/test_betfair_parsing.py index 27fe8af0e466..41d8e7334b59 100644 --- a/tests/integration_tests/adapters/betfair/test_betfair_parsing.py +++ b/tests/integration_tests/adapters/betfair/test_betfair_parsing.py @@ -212,7 +212,7 @@ def test_market_change_ticker(self): assert result[0] == TradeTick.from_dict( { "type": "TradeTick", - "instrument_id": "1.205822330-49808334-None.BETFAIR", + "instrument_id": "1-205822330-49808334-None.BETFAIR", "price": "3.95", "size": "46.950000", "aggressor_side": "NO_AGGRESSOR", @@ -224,7 +224,7 @@ def test_market_change_ticker(self): assert result[1].data == BetfairTicker.from_dict( { "type": "BetfairTicker", - "instrument_id": "1.205822330-49808334-None.BETFAIR", + "instrument_id": "1-205822330-49808334-None.BETFAIR", "ts_event": 0, "ts_init": 0, "last_traded_price": 0.2531646, @@ -238,10 +238,10 @@ def test_market_change_ticker(self): @pytest.mark.parametrize( ("filename", "num_msgs"), [ - ("1.166564490.bz2", 2506), - ("1.166811431.bz2", 17852), - ("1.180305278.bz2", 15165), - ("1.206064380.bz2", 52111), + ("1-166564490.bz2", 2506), + ("1-166811431.bz2", 17852), + ("1-180305278.bz2", 15165), + ("1-206064380.bz2", 52111), ], ) def test_parsing_streaming_file(self, filename, num_msgs): @@ -253,7 +253,7 @@ def test_parsing_streaming_file(self, filename, num_msgs): assert len(updates) == num_msgs def test_parsing_streaming_file_message_counts(self): - mcms = BetfairDataProvider.read_mcm("1.206064380.bz2") + mcms = BetfairDataProvider.read_mcm("1-206064380.bz2") updates = [x for mcm in mcms for x in self.parser.parse(mcm)] counts = Counter( [ @@ -278,11 +278,11 @@ def test_parsing_streaming_file_message_counts(self): @pytest.mark.parametrize( ("filename", "book_count"), [ - ("1.166564490.bz2", [1077, 1307]), - ("1.166811431.bz2", [9374, 9348]), - ("1.180305278.bz2", [1714, 7695]), + ("1-166564490.bz2", [1077, 1307]), + ("1-166811431.bz2", [9374, 9348]), + ("1-180305278.bz2", [1714, 7695]), ( - "1.206064380.bz2", + "1-206064380.bz2", [6736, 3362, 6785, 5701, 363, 4191, 4442, 3636, 5861, 4318, 10854, 5599, 3520], ), ], @@ -306,7 +306,7 @@ def test_order_book_integrity(self, filename, book_count) -> None: assert result == book_count def test_betfair_trade_sizes(self) -> None: # noqa: C901 - mcms = BetfairDataProvider.read_mcm("1.206064380.bz2") + mcms = BetfairDataProvider.read_mcm("1-206064380.bz2") trade_ticks: dict[InstrumentId, list[TradeTick]] = defaultdict(list) betfair_tv: dict[int, dict[float, float]] = {} for mcm in mcms: @@ -371,7 +371,7 @@ def test_order_submit_to_betfair(self): result = order_submit_to_place_order_params(command=command, instrument=self.instrument) expected = PlaceOrders.with_params( request_id=result.id, - market_id="1.179082386", + market_id="1-179082386", instructions=[ PlaceInstruction( order_type=OrderType.LIMIT, @@ -411,7 +411,7 @@ def test_order_update_to_betfair(self): ) expected = ReplaceOrders.with_params( request_id=result.id, - market_id="1.179082386", + market_id="1-179082386", instructions=[ReplaceInstruction(bet_id=1, new_price=1.35)], customer_ref="038990c619d2b5c837a6fe91f9b7b9ed", market_version=None, @@ -430,7 +430,7 @@ def test_order_cancel_to_betfair(self): ) expected = CancelOrders.with_params( request_id=result.id, - market_id="1.179082386", + market_id="1-179082386", instructions=[CancelInstruction(bet_id=228302937743, size_reduction=None)], customer_ref="038990c619d2b5c837a6fe91f9b7b9ed", ) @@ -697,7 +697,7 @@ def test_mcm_bsp_example1(self): ] assert len(starting_prices) == 8 assert starting_prices[0].instrument_id == InstrumentId.from_str( - "1.208011084-45967562-None.BETFAIR", + "1-208011084-45967562-None.BETFAIR", ) assert starting_prices[0].bsp == 2.0008034621107256 @@ -710,7 +710,7 @@ def test_mcm_bsp_example2(self): for upd in updates if isinstance(upd, CustomData) and isinstance(upd.data, BSPOrderBookDelta) - and upd.data.instrument_id == InstrumentId.from_str("1.205880280-49892033-None.BETFAIR") + and upd.data.instrument_id == InstrumentId.from_str("1-205880280-49892033-None.BETFAIR") ] assert len(single_instrument_bsp_updates) == 1 diff --git a/tests/integration_tests/adapters/betfair/test_betfair_providers.py b/tests/integration_tests/adapters/betfair/test_betfair_providers.py index 9288fb913405..2a12ed36ce0d 100644 --- a/tests/integration_tests/adapters/betfair/test_betfair_providers.py +++ b/tests/integration_tests/adapters/betfair/test_betfair_providers.py @@ -60,6 +60,7 @@ async def test_load_markets(self): markets = await load_markets(self.client, event_type_names=["Tennis"]) assert len(markets) == 1958 + # TODO: Fix symbology markets = await load_markets(self.client, market_ids=["1.177125728"]) assert len(markets) == 1 @@ -133,15 +134,15 @@ def test_list_market_catalogue_parsing(self): # Assert result = [ins.id.value for ins in instruments] expected = [ - "1.221718403-20075720-None.BETFAIR", - "1.221718403-10733147-None.BETFAIR", - "1.221718403-38666189-None.BETFAIR", - "1.221718403-11781146-None.BETFAIR", - "1.221718403-36709273-None.BETFAIR", - "1.221718403-51130740-None.BETFAIR", - "1.221718403-63132709-None.BETFAIR", - "1.221718403-18508590-None.BETFAIR", - "1.221718403-41921465-None.BETFAIR", + "1-221718403-20075720-None.BETFAIR", + "1-221718403-10733147-None.BETFAIR", + "1-221718403-38666189-None.BETFAIR", + "1-221718403-11781146-None.BETFAIR", + "1-221718403-36709273-None.BETFAIR", + "1-221718403-51130740-None.BETFAIR", + "1-221718403-63132709-None.BETFAIR", + "1-221718403-18508590-None.BETFAIR", + "1-221718403-41921465-None.BETFAIR", ] assert result == expected diff --git a/tests/integration_tests/adapters/betfair/test_kit.py b/tests/integration_tests/adapters/betfair/test_kit.py index 132b6d73bb15..bedf889d94a8 100644 --- a/tests/integration_tests/adapters/betfair/test_kit.py +++ b/tests/integration_tests/adapters/betfair/test_kit.py @@ -150,7 +150,7 @@ async def request(method, request: Request, **kwargs): @staticmethod def make_order_place_response( - market_id="1.182127885", + market_id="1-182127885", customer_order_ref="O-20210418-015047-001-001-3", bet_id="230486317487", ): @@ -650,7 +650,7 @@ def generate_order_change_message( class BetfairDataProvider: @staticmethod def betting_instrument( - market_id: str = "1.179082386", + market_id: str = "1-179082386", selection_id: str = "50214", handicap: str | None = None, ) -> BettingInstrument: @@ -686,53 +686,53 @@ def market_ids(): """ return ( - "1.148894697", - "1.159045690", - "1.160683973", - "1.160740937", - "1.160837650", - "1.163016936", - "1.164555327", - "1.166577732", - "1.166881256", - "1.167249009", - "1.167249195", - "1.167249197", - "1.170262001", - "1.170262002", - "1.170436895", - "1.170508139", - "1.171431228", - "1.172698506", - "1.173509358", - "1.175061137", - "1.175061138", - "1.175135109", - "1.175492291", - "1.175492292", - "1.175492293", - "1.175492294", - "1.175492295", - "1.175492296", - "1.175775529", - "1.175776462", - "1.176584117", - "1.176621195", - "1.177125720", - "1.177125722", - "1.177126187", - "1.177126652", - "1.177126864", - "1.178198625", - "1.180294966", - "1.180294971", - "1.180434883", - "1.180604981", - "1.180727728", - "1.180737193", - "1.180770798", - "1.180737206", - "1.165003060", + "1-148894697", + "1-159045690", + "1-160683973", + "1-160740937", + "1-160837650", + "1-163016936", + "1-164555327", + "1-166577732", + "1-166881256", + "1-167249009", + "1-167249195", + "1-167249197", + "1-170262001", + "1-170262002", + "1-170436895", + "1-170508139", + "1-171431228", + "1-172698506", + "1-173509358", + "1-175061137", + "1-175061138", + "1-175135109", + "1-175492291", + "1-175492292", + "1-175492293", + "1-175492294", + "1-175492295", + "1-175492296", + "1-175775529", + "1-175776462", + "1-176584117", + "1-176621195", + "1-177125720", + "1-177125722", + "1-177126187", + "1-177126652", + "1-177126864", + "1-178198625", + "1-180294966", + "1-180294971", + "1-180434883", + "1-180604981", + "1-180727728", + "1-180737193", + "1-180770798", + "1-180737206", + "1-165003060", ) @staticmethod @@ -747,7 +747,7 @@ def market_catalogue_short(): ] @staticmethod - def read_lines(filename: str = "1.166811431.bz2") -> list[bytes]: + def read_lines(filename: str = "1-166811431.bz2") -> list[bytes]: path = TEST_DATA_DIR / "betfair" / filename if path.suffix == ".bz2": @@ -764,13 +764,13 @@ def read_mcm(filename: str) -> list[MCM]: return [stream_decode(line) for line in BetfairDataProvider.read_lines(filename)] @staticmethod - def market_updates(filename="1.166811431.bz2", runner1="60424", runner2="237478") -> list: + def market_updates(filename="1-166811431.bz2", runner1="60424", runner2="237478") -> list: market_id = pathlib.Path(filename).name - assert market_id.startswith("1.") + assert market_id.startswith("1-") def _fix_ids(r): return ( - r.replace(market_id.encode(), b"1.180737206") + r.replace(market_id.encode(), b"1-180737206") .replace(runner1.encode(), b"19248890") .replace(runner2.encode(), b"38848248") ) @@ -790,7 +790,7 @@ def mcm_to_instruments(mcm: MCM, currency="GBP") -> list[BettingInstrument]: return instruments @staticmethod - def betfair_feed_parsed(market_id: str = "1.166564490"): + def betfair_feed_parsed(market_id: str = "1-166564490"): parser = BetfairParser(currency="GBP") instruments: list[BettingInstrument] = [] @@ -809,7 +809,7 @@ def badly_formatted_log(): def betting_instrument( - market_id: MarketId = "1.179082386", + market_id: MarketId = "1-179082386", selection_id: SelectionId = 50214, selection_handicap: Handicap | None = None, ) -> BettingInstrument: @@ -853,7 +853,7 @@ def betting_instrument_handicap() -> BettingInstrument: "event_country_code": "AU", "event_open_date": "2021-08-13T09:50:00+00:00", "betting_type": "ASIAN_HANDICAP_DOUBLE_LINE", - "market_id": "1.186249896", + "market_id": "1-186249896", "market_name": "Handicap", "market_start_time": "2021-08-13T09:50:00+00:00", "market_type": "HANDICAP", @@ -870,7 +870,7 @@ def betting_instrument_handicap() -> BettingInstrument: def load_betfair_data(catalog: ParquetDataCatalog) -> ParquetDataCatalog: - filename = TEST_DATA_DIR / "betfair" / "1.166564490.bz2" + filename = TEST_DATA_DIR / "betfair" / "1-166564490.bz2" # Write betting instruments instruments = betting_instruments_from_file(filename, currency="GBP", ts_event=0, ts_init=0) diff --git a/tests/test_data/betfair/1.166564490.bz2 b/tests/test_data/betfair/1-166564490.bz2 similarity index 100% rename from tests/test_data/betfair/1.166564490.bz2 rename to tests/test_data/betfair/1-166564490.bz2 diff --git a/tests/test_data/betfair/1.166811431.bz2 b/tests/test_data/betfair/1-166811431.bz2 similarity index 100% rename from tests/test_data/betfair/1.166811431.bz2 rename to tests/test_data/betfair/1-166811431.bz2 diff --git a/tests/test_data/betfair/1.180305278.bz2 b/tests/test_data/betfair/1-180305278.bz2 similarity index 100% rename from tests/test_data/betfair/1.180305278.bz2 rename to tests/test_data/betfair/1-180305278.bz2 diff --git a/tests/test_data/betfair/1.206064380.bz2 b/tests/test_data/betfair/1-206064380.bz2 similarity index 100% rename from tests/test_data/betfair/1.206064380.bz2 rename to tests/test_data/betfair/1-206064380.bz2 diff --git a/tests/unit_tests/backtest/test_config.py b/tests/unit_tests/backtest/test_config.py index 70c45b96ed8e..8334c6569d8c 100644 --- a/tests/unit_tests/backtest/test_config.py +++ b/tests/unit_tests/backtest/test_config.py @@ -263,7 +263,7 @@ def test_backtest_run_config_id(self) -> None: print("token:", token) value: bytes = self.backtest_config.json() print("token_value:", value.decode()) - assert token == "bd1d6f5e506506ed251fb6a683045bfca30b937f0726eefc41abe40f87c9a53d" + assert token == "3c7139dc67cc3047c33a17d51ce47971671f18246c1e2e411654a35cfe04e903" @pytest.mark.skipif(sys.platform == "win32", reason="redundant to also test Windows") @pytest.mark.parametrize( diff --git a/tests/unit_tests/persistence/conftest.py b/tests/unit_tests/persistence/conftest.py index 30aaad9aaf46..c1703fef296a 100644 --- a/tests/unit_tests/persistence/conftest.py +++ b/tests/unit_tests/persistence/conftest.py @@ -34,7 +34,7 @@ def fixture_catalog() -> ParquetDataCatalog: @pytest.fixture(name="catalog_betfair") def fixture_catalog_betfair(catalog: ParquetDataCatalog) -> ParquetDataCatalog: - filename = TEST_DATA_DIR / "betfair" / "1.166564490.bz2" + filename = TEST_DATA_DIR / "betfair" / "1-166564490.bz2" # Write betting instruments instruments = betting_instruments_from_file(filename, currency="GBP", ts_event=0, ts_init=0) diff --git a/tests/unit_tests/persistence/test_streaming.py b/tests/unit_tests/persistence/test_streaming.py index ea3e776d6292..29c70e310b6b 100644 --- a/tests/unit_tests/persistence/test_streaming.py +++ b/tests/unit_tests/persistence/test_streaming.py @@ -16,8 +16,6 @@ import copy from collections import Counter -import pytest - from nautilus_trader.backtest.node import BacktestNode from nautilus_trader.backtest.results import BacktestResult from nautilus_trader.config import BacktestDataConfig @@ -61,7 +59,6 @@ def _run_default_backtest(self, catalog_betfair: ParquetDataCatalog) -> list[Bac return backtest_result - @pytest.mark.skip(reason="Unskip once Betfair symbol conventions changed") def test_feather_writer(self, catalog_betfair: ParquetDataCatalog) -> None: # Arrange backtest_result = self._run_default_backtest(catalog_betfair) @@ -297,7 +294,7 @@ def test_feather_writer_signal_data( ) result = Counter([r.__class__.__name__ for r in result]) # type: ignore - assert result["SignalCounter"] == 283 # type: ignore + assert result["SignalCounter"] == 179 # type: ignore def test_generate_signal_class(self) -> None: # Arrange @@ -400,7 +397,6 @@ def test_feather_reader_order_book_deltas( book.apply_delta(update) copy.deepcopy(book) - @pytest.mark.skip(reason="Unskip once Betfair symbol conventions changed") def test_read_backtest( self, catalog_betfair: ParquetDataCatalog, From cdb5c4cbd1293c35b395bbcd1eca24df361208d5 Mon Sep 17 00:00:00 2001 From: David Blom Date: Mon, 7 Oct 2024 07:37:21 +0200 Subject: [PATCH 006/224] Fix resubscribing to orderbook in batched mode for dYdX (#1985) --- .../adapters/dydx/websocket/client.py | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/nautilus_trader/adapters/dydx/websocket/client.py b/nautilus_trader/adapters/dydx/websocket/client.py index de64ba4550a4..2c07580a8bcb 100644 --- a/nautilus_trader/adapters/dydx/websocket/client.py +++ b/nautilus_trader/adapters/dydx/websocket/client.py @@ -83,7 +83,7 @@ def __init__( ) self._msg_timestamp = self._clock.utc_now() - self._msg_interval_secs: int = 60 + self._msg_timeout_secs: int = 60 self._reconnect_task: asyncio.Task | None = None def is_connected(self) -> bool: @@ -160,7 +160,10 @@ async def send_pong(self, raw: bytes) -> None: if self._client is None: return - await self._client.send_pong(raw) + try: + await self._client.send_pong(raw) + except WebSocketClientError as e: + self._log.error(str(e)) async def _reconnect_guard(self) -> None: """ @@ -169,18 +172,12 @@ async def _reconnect_guard(self) -> None: """ try: while True: - self._log.debug( - f"Scheduled `reconnect_guard` to run in {self._msg_interval_secs}s", - ) - await asyncio.sleep(self._msg_interval_secs) - - now_timestamp = self._clock.utc_now() - time_since_previous_msg = now_timestamp - self._msg_timestamp - - if time_since_previous_msg > pd.Timedelta(seconds=self._msg_interval_secs): - self._log.error( - f"Time since previous received message is {time_since_previous_msg}", - ) + await asyncio.sleep(1) + time_since_previous_msg = self._clock.utc_now() - self._msg_timestamp + + if self.is_disconnected() or time_since_previous_msg > pd.Timedelta( + seconds=self._msg_timeout_secs, + ): try: await self.disconnect() await self.connect() @@ -420,7 +417,15 @@ async def _subscribe_all(self) -> None: return for subscription in self._subscriptions: - msg = {"type": "subscribe", "channel": subscription[0], "id": subscription[1]} + msg: dict[str, Any] = { + "type": "subscribe", + "channel": subscription[0], + "id": subscription[1], + } + + if subscription[0] == "v4_orderbook": + msg["batched"] = True + await self._send(msg) def _send_subscribe_msg(self, msg: dict[str, Any]) -> None: From 3a6faf065234aec5d51acc82ef3a2830047e686f Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 7 Oct 2024 16:41:28 +1100 Subject: [PATCH 007/224] Update release notes --- RELEASES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index d4b1397f8496..e4e312581cbf 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -3,7 +3,7 @@ Released on TBD (UTC). ### Enhancements -None +- Standardized Betfair symbology to use hyphens instead of periods (preventing them being treated as composite symbols) ### Internal Improvements None @@ -12,7 +12,7 @@ None None ### Fixes -None +- Fixed resubscribing to orderbook in batched mode for dYdX (#1985), thanks @davidsblom --- From ed951ea7fcf5f8519af41c816c13aea01eea1552 Mon Sep 17 00:00:00 2001 From: Pushkar Mishra Date: Mon, 7 Oct 2024 23:03:56 +0530 Subject: [PATCH 008/224] Port Throttler to Rust (#1918) Signed-off-by: Pushkar Mishra Co-authored-by: Ishan Bhanuka --- nautilus_core/Cargo.lock | 78 +++ nautilus_core/common/Cargo.toml | 1 + nautilus_core/common/src/clock.rs | 25 +- nautilus_core/common/src/lib.rs | 1 + .../common/src/throttler/callbacks.rs | 60 ++ nautilus_core/common/src/throttler/inner.rs | 180 ++++++ nautilus_core/common/src/throttler/mod.rs | 557 ++++++++++++++++++ nautilus_core/common/src/timer.rs | 25 +- nautilus_core/data/src/aggregation.rs | 11 +- 9 files changed, 912 insertions(+), 26 deletions(-) create mode 100644 nautilus_core/common/src/throttler/callbacks.rs create mode 100644 nautilus_core/common/src/throttler/inner.rs create mode 100644 nautilus_core/common/src/throttler/mod.rs diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index b413aeea52a7..4bbbca72591e 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -605,6 +605,21 @@ dependencies = [ "which", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitflags" version = "1.3.2" @@ -2815,6 +2830,7 @@ dependencies = [ "log", "nautilus-core", "nautilus-model", + "proptest", "pyo3", "pyo3-asyncio-0-21", "rstest", @@ -3705,6 +3721,26 @@ dependencies = [ "hex", ] +[[package]] +name = "proptest" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.6.0", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax 0.8.5", + "rusty-fork", + "tempfile", + "unarray", +] + [[package]] name = "ptr_meta" version = "0.1.4" @@ -3814,6 +3850,12 @@ dependencies = [ "syn 2.0.79", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quickcheck" version = "1.0.3" @@ -3881,6 +3923,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + [[package]] name = "rayon" version = "1.10.0" @@ -4298,6 +4349,18 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "ryu" version = "1.0.18" @@ -5427,6 +5490,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicode-bidi" version = "0.3.17" @@ -5553,6 +5622,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" diff --git a/nautilus_core/common/Cargo.toml b/nautilus_core/common/Cargo.toml index 050fa3e3822b..3458b5d9ad53 100644 --- a/nautilus_core/common/Cargo.toml +++ b/nautilus_core/common/Cargo.toml @@ -37,6 +37,7 @@ sysinfo = "0.31.4" [dev-dependencies] tempfile = { workspace = true } +proptest = "1.5.0" [build-dependencies] cbindgen = { workspace = true, optional = true } diff --git a/nautilus_core/common/src/clock.rs b/nautilus_core/common/src/clock.rs index afd230f871b3..3dd3a2b687d8 100644 --- a/nautilus_core/common/src/clock.rs +++ b/nautilus_core/common/src/clock.rs @@ -83,6 +83,9 @@ pub trait Clock { callback: Option, ); + /// Returns the time interval in which the timer `name` is triggered + /// + /// If the timer doesn't exist 0 is returned. fn next_time_ns(&self, name: &str) -> UnixNanos; fn cancel_timer(&mut self, name: &str); fn cancel_timers(&mut self); @@ -472,22 +475,23 @@ mod tests { use rstest::{fixture, rstest}; use super::*; - use crate::timer::RustTimeEventCallback; #[derive(Default)] struct TestCallback { called: Rc>, } - impl RustTimeEventCallback for TestCallback { - fn call(&self, _event: TimeEvent) { - *self.called.borrow_mut() = true; + impl TestCallback { + const fn new(called: Rc>) -> Self { + Self { called } } } impl From for TimeEventCallback { - fn from(val: TestCallback) -> Self { - Self::Rust(Rc::new(val)) + fn from(callback: TestCallback) -> Self { + Self::Rust(Rc::new(move |_event: TimeEvent| { + *callback.called.borrow_mut() = true; + })) } } @@ -553,13 +557,8 @@ mod tests { let default_called = Rc::new(RefCell::new(false)); let custom_called = Rc::new(RefCell::new(false)); - let default_callback: Rc = Rc::new(TestCallback { - called: Rc::clone(&default_called), - }); - - let custom_callback: Rc = Rc::new(TestCallback { - called: Rc::clone(&custom_called), - }); + let default_callback = TestCallback::new(Rc::clone(&default_called)); + let custom_callback = TestCallback::new(Rc::clone(&custom_called)); clock.register_default_handler(TimeEventCallback::from(default_callback)); clock.set_time_alert_ns("default_timer", (*clock.timestamp_ns() + 1000).into(), None); diff --git a/nautilus_core/common/src/lib.rs b/nautilus_core/common/src/lib.rs index 8fc8078bc5f3..b687c6270956 100644 --- a/nautilus_core/common/src/lib.rs +++ b/nautilus_core/common/src/lib.rs @@ -40,6 +40,7 @@ pub mod messages; pub mod msgbus; pub mod runtime; pub mod testing; +pub mod throttler; pub mod timer; pub mod xrate; diff --git a/nautilus_core/common/src/throttler/callbacks.rs b/nautilus_core/common/src/throttler/callbacks.rs new file mode 100644 index 000000000000..f5809e2654bd --- /dev/null +++ b/nautilus_core/common/src/throttler/callbacks.rs @@ -0,0 +1,60 @@ +use std::{cell::RefCell, rc::Rc}; + +use super::inner::InnerThrottler; +use crate::timer::{TimeEvent, TimeEventCallback}; + +/// Stop rate limiting messages +pub struct ThrottlerResume { + inner: Rc>>, +} + +impl ThrottlerResume { + pub const fn new(inner: Rc>>) -> Self { + Self { inner } + } +} + +impl From> for TimeEventCallback { + fn from(value: ThrottlerResume) -> Self { + Self::Rust(Rc::new(move |_event: TimeEvent| { + value.inner.borrow_mut().is_limiting = false; + })) + } +} + +/// Process buffered messages +#[derive(Clone)] +pub struct ThrottlerProcess { + inner: Rc>>, +} + +impl ThrottlerProcess { + pub const fn new(inner: Rc>>) -> Self { + Self { inner } + } +} + +impl From> for TimeEventCallback { + fn from(value: ThrottlerProcess) -> Self { + Self::Rust(Rc::new(move |_event: TimeEvent| { + let process_clone = ThrottlerProcess { + inner: value.inner.clone(), + }; + let mut core = value.inner.borrow_mut(); + while let Some(msg) = core.buffer.pop_back() { + core.send_msg(msg); + + // Set timer to process more buffered messages + // if interval limit reached and there are more + // buffered messages to process + if !core.buffer.is_empty() && core.delta_next() > 0 { + core.is_limiting = true; + core.set_timer(Some(process_clone.into())); + return; + } + } + + core.is_limiting = false; + })) + } +} diff --git a/nautilus_core/common/src/throttler/inner.rs b/nautilus_core/common/src/throttler/inner.rs new file mode 100644 index 000000000000..49dee2e710cd --- /dev/null +++ b/nautilus_core/common/src/throttler/inner.rs @@ -0,0 +1,180 @@ +use std::{cell::RefCell, collections::VecDeque, fmt::Debug, rc::Rc}; + +use nautilus_core::nanos::UnixNanos; + +use super::Throttler; +use crate::{clock::Clock, timer::TimeEventCallback}; + +/// Throttler rate limits messages by dropping or buffering them +/// +/// Throttler takes messages of type T and callback of type F for dropping +/// or processing messages. +pub struct InnerThrottler { + pub recv_count: usize, + /// The number of messages sent. + pub sent_count: usize, + /// Whether the throttler is currently limiting the message rate. + pub is_limiting: bool, + /// The maximum number of messages that can be sent within the interval. + pub limit: usize, + /// The buffer of messages to be sent. + pub buffer: VecDeque, + /// The timestamps of the sent messages. + pub timestamps: VecDeque, + /// The interval between messages in nanoseconds. + interval: u64, + /// The clock used to keep track of time. + pub clock: Rc>, + /// The name of the timer. + timer_name: String, + /// The callback to send a message. + output_send: F, + /// The callback to drop a message. + output_drop: Option, +} + +impl Debug for InnerThrottler +where + T: Debug, +{ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("InnerThrottler") + .field("recv_count", &self.recv_count) + .field("sent_count", &self.sent_count) + .field("is_limiting", &self.is_limiting) + .field("limit", &self.limit) + .field("buffer", &self.buffer) + .field("timestamps", &self.timestamps) + .field("interval", &self.interval) + .field("timer_name", &self.timer_name) + .finish() + } +} + +impl InnerThrottler { + #[inline] + pub fn new( + limit: usize, + interval: u64, + clock: Rc>, + timer_name: String, + output_send: F, + output_drop: Option, + ) -> Self { + Self { + recv_count: 0, + sent_count: 0, + is_limiting: false, + limit, + buffer: VecDeque::new(), + timestamps: VecDeque::with_capacity(limit), + interval, + clock, + timer_name, + output_send, + output_drop, + } + } + + /// Set timer with a callback to be triggered on next interval + /// + /// Typically used to register callbacks + /// - [`super::callbacks::ThrottlerProcess`] to process buffered messages + /// - [`super::callbacks::ThrottlerResume`] to stop buffering + #[inline] + pub fn set_timer(&mut self, callback: Option) { + let delta = self.delta_next(); + let mut clock = self.clock.borrow_mut(); + if clock.timer_names().contains(&self.timer_name.as_str()) { + clock.cancel_timer(&self.timer_name); + } + let alert_ts = clock.timestamp_ns() + delta; + + clock.set_time_alert_ns(&self.timer_name, alert_ts, callback); + } + + /// Time delta when the next message can be sent + #[inline] + pub fn delta_next(&mut self) -> u64 { + match self.timestamps.get(self.limit - 1) { + Some(ts) => { + let diff = self.clock.borrow().timestamp_ns().as_u64() - ts.as_u64(); + self.interval.saturating_sub(diff) + } + None => 0, + } + } + + #[inline] + pub fn reset(&mut self) { + self.buffer.clear(); + self.recv_count = 0; + self.sent_count = 0; + self.is_limiting = false; + self.timestamps.clear(); + } + + /// Fractional value of rate limit consumed in current interval + #[inline] + pub fn used(&self) -> f64 { + if self.timestamps.is_empty() { + return 0.0; + } + + let now = self.clock.borrow().timestamp_ns().as_i64(); + let interval_start = now - self.interval as i64; + + let messages_in_current_interval = self + .timestamps + .iter() + .take_while(|&&ts| ts.as_i64() > interval_start) + .count(); + + (messages_in_current_interval as f64) / (self.limit as f64) + } + + /// Number of messages queued in buffer + #[inline] + pub fn qsize(&self) -> usize { + self.buffer.len() + } +} + +impl InnerThrottler +where + F: Fn(T) + 'static, + T: 'static, +{ + #[inline] + pub fn send_msg(&mut self, msg: T) { + let now = self.clock.borrow().timestamp_ns(); + + if self.timestamps.len() >= self.limit { + self.timestamps.pop_back(); + } + self.timestamps.push_front(now); + + (self.output_send)(msg); + self.sent_count += 1; + } + + #[inline] + pub fn limit_msg(&mut self, msg: T, throttler: Throttler) { + let callback = if self.output_drop.is_none() { + self.buffer.push_front(msg); + log::debug!("Buffering {}", self.buffer.len()); + Some(throttler.get_process_callback().into()) + } else { + log::debug!("Dropping"); + if let Some(drop) = &self.output_drop { + drop(msg); + } + Some(throttler.get_resume_callback().into()) + }; + if !self.is_limiting { + log::debug!("Limiting"); + self.set_timer(callback); + self.is_limiting = true; + } + } +} diff --git a/nautilus_core/common/src/throttler/mod.rs b/nautilus_core/common/src/throttler/mod.rs new file mode 100644 index 000000000000..06a0ae54479e --- /dev/null +++ b/nautilus_core/common/src/throttler/mod.rs @@ -0,0 +1,557 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +pub mod callbacks; +pub mod inner; + +use std::{cell::RefCell, fmt::Debug, rc::Rc}; + +use callbacks::{ThrottlerProcess, ThrottlerResume}; +use inner::InnerThrottler; + +use crate::clock::Clock; + +/// Shareable reference to an [`InnerThrottler`] +/// +/// Throttler takes messages of type T and callback of type F for dropping +/// or processing messages. +#[derive(Clone)] +pub struct Throttler { + inner: Rc>>, +} + +impl Debug for Throttler +where + T: Debug, +{ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Throttler") + .field("inner", &self.inner) + .finish() + } +} + +impl Throttler { + pub fn new( + limit: usize, + interval: u64, + clock: Rc>, + timer_name: String, + output_send: F, + output_drop: Option, + ) -> Self { + let inner = + InnerThrottler::new(limit, interval, clock, timer_name, output_send, output_drop); + + Self { + inner: Rc::new(RefCell::new(inner)), + } + } + + #[must_use] + pub fn qsize(&self) -> usize { + let inner = self.inner.borrow(); + inner.buffer.len() + } + + pub fn reset(&self) { + let mut inner = self.inner.borrow_mut(); + inner.reset(); + } + + #[must_use] + pub fn used(&self) -> f64 { + let inner = self.inner.borrow(); + inner.used() + } +} + +impl Throttler +where + F: Fn(T) + 'static, + T: 'static, +{ + pub fn send(&self, msg: T) { + let throttler_clone = Self { + inner: self.inner.clone(), + }; + let mut inner = self.inner.borrow_mut(); + inner.recv_count += 1; + + if inner.is_limiting || inner.delta_next() > 0 { + inner.limit_msg(msg, throttler_clone); + } else { + inner.send_msg(msg); + } + } + + fn get_process_callback(&self) -> ThrottlerProcess { + ThrottlerProcess::new(self.inner.clone()) + } + + fn get_resume_callback(&self) -> ThrottlerResume { + ThrottlerResume::new(self.inner.clone()) + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Tests +//////////////////////////////////////////////////////////////////////////////// +#[cfg(test)] +mod tests { + use std::{cell::RefCell, rc::Rc}; + + use rstest::{fixture, rstest}; + + use super::Throttler; + use crate::clock::TestClock; + + /// Test throttler with default values for testing + /// + /// - Rate limit is 5 messages in 10 intervals. + /// - Message handling is decided by specific fixture + struct TestThrottler { + throttler: Throttler>, + clock: Rc>, + interval: u64, + } + + #[fixture] + pub fn test_throttler_buffered() -> TestThrottler { + let output_send: Box = Box::new(|msg: u64| { + log::debug!("Sent: {}", msg); + }); + let clock = Rc::new(RefCell::new(TestClock::new())); + let inner_clock = Rc::clone(&clock); + let interval = 10; + + TestThrottler { + throttler: Throttler::new( + 5, + interval, + clock, + "buffer_timer".to_string(), + output_send, + None, + ), + clock: inner_clock, + interval, + } + } + + #[fixture] + pub fn test_throttler_unbuffered() -> TestThrottler { + let output_send: Box = Box::new(|msg: u64| { + log::debug!("Sent: {}", msg); + }); + let output_drop: Box = Box::new(|msg: u64| { + log::debug!("Dropped: {}", msg); + }); + let clock = Rc::new(RefCell::new(TestClock::new())); + let inner_clock = Rc::clone(&clock); + let interval = 10; + + TestThrottler { + throttler: Throttler::new( + 5, + interval, + clock, + "dropper_timer".to_string(), + output_send, + Some(output_drop), + ), + clock: inner_clock, + interval, + } + } + + #[rstest] + fn test_buffering_send_to_limit_becomes_throttled(mut test_throttler_buffered: TestThrottler) { + let throttler = &mut test_throttler_buffered.throttler; + for _ in 0..6 { + throttler.send(42); + } + assert_eq!(throttler.qsize(), 1); + + let inner = throttler.inner.borrow(); + assert!(inner.is_limiting); + assert_eq!(inner.recv_count, 6); + assert_eq!(inner.sent_count, 5); + assert_eq!(inner.clock.borrow().timer_names(), vec!["buffer_timer"]); + } + + #[rstest] + fn test_buffering_used_when_sent_to_limit_returns_one( + mut test_throttler_buffered: TestThrottler, + ) { + let throttler = &mut test_throttler_buffered.throttler; + + for _ in 0..5 { + throttler.send(42); + } + + let inner = throttler.inner.borrow(); + assert_eq!(inner.used(), 1.0); + assert_eq!(inner.recv_count, 5); + assert_eq!(inner.sent_count, 5); + } + + #[rstest] + fn test_buffering_used_when_half_interval_from_limit_returns_one( + mut test_throttler_buffered: TestThrottler, + ) { + let throttler = &mut test_throttler_buffered.throttler; + + for _ in 0..5 { + throttler.send(42); + } + + let half_interval = test_throttler_buffered.interval / 2; + // Advance the clock by half the interval + { + let mut clock = test_throttler_buffered.clock.borrow_mut(); + clock.advance_time(half_interval.into(), true); + } + + let inner = throttler.inner.borrow(); + assert_eq!(inner.used(), 1.0); + assert_eq!(inner.recv_count, 5); + assert_eq!(inner.sent_count, 5); + } + + #[rstest] + fn test_buffering_used_before_limit_when_halfway_returns_half( + mut test_throttler_buffered: TestThrottler, + ) { + let throttler = &mut test_throttler_buffered.throttler; + + for _ in 0..3 { + throttler.send(42); + } + + let inner = throttler.inner.borrow(); + assert_eq!(inner.used(), 0.6); + assert_eq!(inner.recv_count, 3); + assert_eq!(inner.sent_count, 3); + } + + #[rstest] + fn test_buffering_refresh_when_at_limit_sends_remaining_items( + mut test_throttler_buffered: TestThrottler, + ) { + let throttler = &mut test_throttler_buffered.throttler; + + for _ in 0..6 { + throttler.send(42); + } + + // Advance time and process events + { + let mut clock = test_throttler_buffered.clock.borrow_mut(); + let time_events = clock.advance_time(test_throttler_buffered.interval.into(), true); + for each_event in clock.match_handlers(time_events) { + drop(clock); // Release the mutable borrow + + each_event.callback.call(each_event.event); + + // Re-borrow the clock for the next iteration + clock = test_throttler_buffered.clock.borrow_mut(); + } + } + + // Assert final state + { + let inner = throttler.inner.borrow(); + assert_eq!(inner.used(), 0.2); + assert_eq!(inner.recv_count, 6); + assert_eq!(inner.sent_count, 6); + assert_eq!(inner.qsize(), 0); + } + } + + #[rstest] + fn test_buffering_send_message_after_buffering_message( + mut test_throttler_buffered: TestThrottler, + ) { + let throttler = &mut test_throttler_buffered.throttler; + + for _ in 0..6 { + throttler.send(42); + } + + // Advance time and process events + { + let mut clock = test_throttler_buffered.clock.borrow_mut(); + let time_events = clock.advance_time(test_throttler_buffered.interval.into(), true); + for each_event in clock.match_handlers(time_events) { + drop(clock); // Release the mutable borrow + + each_event.callback.call(each_event.event); + + // Re-borrow the clock for the next iteration + clock = test_throttler_buffered.clock.borrow_mut(); + } + } + + for _ in 0..6 { + throttler.send(42); + } + + // Assert final state + { + let inner = throttler.inner.borrow(); + assert_eq!(inner.used(), 1.0); + assert_eq!(inner.recv_count, 12); + assert_eq!(inner.sent_count, 10); + assert_eq!(inner.qsize(), 2); + } + } + + #[rstest] + fn test_buffering_send_message_after_halfway_after_buffering_message( + mut test_throttler_buffered: TestThrottler, + ) { + let throttler = &mut test_throttler_buffered.throttler; + + for _ in 0..6 { + throttler.send(42); + } + + // Advance time and process events + { + let mut clock = test_throttler_buffered.clock.borrow_mut(); + let time_events = clock.advance_time(test_throttler_buffered.interval.into(), true); + for each_event in clock.match_handlers(time_events) { + drop(clock); // Release the mutable borrow + + each_event.callback.call(each_event.event); + + // Re-borrow the clock for the next iteration + clock = test_throttler_buffered.clock.borrow_mut(); + } + } + + for _ in 0..3 { + throttler.send(42); + } + + // Assert final state + { + let inner = throttler.inner.borrow(); + assert_eq!(inner.used(), 0.8); + assert_eq!(inner.recv_count, 9); + assert_eq!(inner.sent_count, 9); + assert_eq!(inner.qsize(), 0); + } + } + + #[rstest] + fn test_dropping_send_sends_message_to_handler(mut test_throttler_unbuffered: TestThrottler) { + let throttler = &mut test_throttler_unbuffered.throttler; + throttler.send(42); + let inner = throttler.inner.borrow(); + + assert!(!inner.is_limiting); + assert_eq!(inner.recv_count, 1); + assert_eq!(inner.sent_count, 1); + } + + #[rstest] + fn test_dropping_send_to_limit_drops_message(mut test_throttler_unbuffered: TestThrottler) { + let throttler = &mut test_throttler_unbuffered.throttler; + for _ in 0..6 { + throttler.send(42); + } + assert_eq!(throttler.qsize(), 0); + + let inner = throttler.inner.borrow(); + assert!(inner.is_limiting); + assert_eq!(inner.used(), 1.0); + assert_eq!(inner.clock.borrow().timer_count(), 1); + assert_eq!(inner.clock.borrow().timer_names(), vec!["dropper_timer"]); + assert_eq!(inner.recv_count, 6); + assert_eq!(inner.sent_count, 5); + } + + #[rstest] + fn test_dropping_advance_time_when_at_limit_dropped_message( + mut test_throttler_unbuffered: TestThrottler, + ) { + let throttler = &mut test_throttler_unbuffered.throttler; + for _ in 0..6 { + throttler.send(42); + } + + // Advance time and process events + { + let mut clock = test_throttler_unbuffered.clock.borrow_mut(); + let time_events = clock.advance_time(test_throttler_unbuffered.interval.into(), true); + for each_event in clock.match_handlers(time_events) { + drop(clock); // Release the mutable borrow + + each_event.callback.call(each_event.event); + + // Re-borrow the clock for the next iteration + clock = test_throttler_unbuffered.clock.borrow_mut(); + } + } + + let inner = throttler.inner.borrow(); + assert_eq!(inner.clock.borrow().timer_count(), 0); + assert!(!inner.is_limiting); + assert_eq!(inner.used(), 0.0); + assert_eq!(inner.recv_count, 6); + assert_eq!(inner.sent_count, 5); + } + + #[rstest] + fn test_dropping_send_message_after_dropping_message( + mut test_throttler_unbuffered: TestThrottler, + ) { + let throttler = &mut test_throttler_unbuffered.throttler; + for _ in 0..6 { + throttler.send(42); + } + + // Advance time and process events + { + let mut clock = test_throttler_unbuffered.clock.borrow_mut(); + let time_events = clock.advance_time(test_throttler_unbuffered.interval.into(), true); + for each_event in clock.match_handlers(time_events) { + drop(clock); // Release the mutable borrow + + each_event.callback.call(each_event.event); + + // Re-borrow the clock for the next iteration + clock = test_throttler_unbuffered.clock.borrow_mut(); + } + } + + throttler.send(42); + + let inner = throttler.inner.borrow(); + assert_eq!(inner.used(), 0.2); + assert_eq!(inner.clock.borrow().timer_count(), 0); + assert!(!inner.is_limiting); + assert_eq!(inner.recv_count, 7); + assert_eq!(inner.sent_count, 6); + } + + use proptest::prelude::*; + + #[derive(Clone, Debug)] + enum ThrottlerInput { + SendMessage(u64), + AdvanceClock(u8), + } + + // Custom strategy for ThrottlerInput + fn throttler_input_strategy() -> impl Strategy { + prop_oneof![ + 2 => prop::bool::ANY.prop_map(|_| ThrottlerInput::SendMessage(42)), + 8 => prop::num::u8::ANY.prop_map(|v| ThrottlerInput::AdvanceClock(v % 5 + 5)), + ] + } + + // Custom strategy for ThrottlerTest + fn throttler_test_strategy() -> impl Strategy> { + prop::collection::vec(throttler_input_strategy(), 10..=150) + } + + fn test_throttler_with_inputs(inputs: Vec) { + let TestThrottler { + throttler, + clock: test_clock, + interval, + } = test_throttler_buffered(); + let mut sent_count = 0; + + for input in inputs { + match input { + ThrottlerInput::SendMessage(msg) => { + throttler.send(msg); + sent_count += 1; + } + ThrottlerInput::AdvanceClock(duration) => { + let mut clock_ref = test_clock.borrow_mut(); + let current_time = clock_ref.get_time_ns(); + let time_events = clock_ref.advance_time(current_time + duration as u64, true); + for each_event in clock_ref.match_handlers(time_events) { + drop(clock_ref); + each_event.callback.call(each_event.event); + clock_ref = test_clock.borrow_mut(); + } + } + } + + // Check the throttler rate limits on the appropriate conditions + // * Atleast one message is buffered + // * Timestamp queue is filled upto limit + // * Least recent timestamp in queue exceeds interval + let inner = throttler.inner.borrow(); + let buffered_messages = inner.qsize() > 0; + let now = inner.clock.borrow().timestamp_ns().as_u64(); + let limit_filled_within_interval = inner + .timestamps + .get(inner.limit - 1) + .map_or(false, |&ts| (now - ts.as_u64()) < interval); + let expected_limiting = buffered_messages && limit_filled_within_interval; + assert_eq!(inner.is_limiting, expected_limiting); + + // Message conservation + let inner = throttler.inner.borrow(); + assert_eq!(sent_count, inner.sent_count + inner.qsize()); + } + + // Advance clock by a large amount to process all messages + let time_events = test_clock + .borrow_mut() + .advance_time((interval * 100).into(), true); + let mut clock_ref = test_clock.borrow_mut(); + for each_event in clock_ref.match_handlers(time_events) { + drop(clock_ref); + each_event.callback.call(each_event.event); + clock_ref = test_clock.borrow_mut(); + } + assert_eq!(throttler.qsize(), 0); + } + + #[test] + #[ignore = "Used for manually testing failing cases"] + fn test_case() { + let inputs = [ + ThrottlerInput::SendMessage(42), + ThrottlerInput::AdvanceClock(5), + ThrottlerInput::SendMessage(42), + ThrottlerInput::SendMessage(42), + ThrottlerInput::SendMessage(42), + ThrottlerInput::SendMessage(42), + ThrottlerInput::SendMessage(42), + ThrottlerInput::AdvanceClock(5), + ThrottlerInput::SendMessage(42), + ThrottlerInput::SendMessage(42), + ] + .to_vec(); + + test_throttler_with_inputs(inputs); + } + + proptest! { + #[test] + fn test(inputs in throttler_test_strategy()) { + test_throttler_with_inputs(inputs); + } + } +} diff --git a/nautilus_core/common/src/timer.rs b/nautilus_core/common/src/timer.rs index 22a88aee4beb..630a2377c848 100644 --- a/nautilus_core/common/src/timer.rs +++ b/nautilus_core/common/src/timer.rs @@ -35,6 +35,7 @@ use nautilus_core::{ }; #[cfg(feature = "python")] use pyo3::{PyObject, Python}; +use std::fmt::Debug; use tokio::{ sync::oneshot, time::{Duration, Instant}, @@ -97,15 +98,23 @@ impl PartialEq for TimeEvent { } } -pub trait RustTimeEventCallback { - fn call(&self, event: TimeEvent); -} +pub type RustTimeEventCallback = dyn Fn(TimeEvent); #[derive(Clone)] pub enum TimeEventCallback { #[cfg(feature = "python")] Python(PyObject), - Rust(Rc), + Rust(Rc), +} + +impl Debug for TimeEventCallback { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + #[cfg(feature = "python")] + Self::Python(_) => f.write_str("Python callback"), + Self::Rust(_) => f.write_str("Rust callback"), + } + } } impl TimeEventCallback { @@ -117,13 +126,13 @@ impl TimeEventCallback { callback.call1(py, (event,)).unwrap(); }); } - Self::Rust(callback) => callback.call(event), + Self::Rust(callback) => callback(event), } } } -impl From> for TimeEventCallback { - fn from(value: Rc) -> Self { +impl From> for TimeEventCallback { + fn from(value: Rc) -> Self { Self::Rust(value) } } @@ -140,7 +149,7 @@ unsafe impl Send for TimeEventCallback {} unsafe impl Sync for TimeEventCallback {} #[repr(C)] -#[derive(Clone)] +#[derive(Clone, Debug)] /// Represents a time event and its associated handler. /// /// `TimeEventHandler` associates a `TimeEvent` with a callback function that is triggered diff --git a/nautilus_core/data/src/aggregation.rs b/nautilus_core/data/src/aggregation.rs index 1f8c400eb943..467cea88a786 100644 --- a/nautilus_core/data/src/aggregation.rs +++ b/nautilus_core/data/src/aggregation.rs @@ -24,7 +24,7 @@ use std::{cell::RefCell, ops::Add, rc::Rc}; use chrono::TimeDelta; use nautilus_common::{ clock::Clock, - timer::{RustTimeEventCallback, TimeEvent}, + timer::{TimeEvent, TimeEventCallback}, }; use nautilus_core::{ correctness::{self, FAILED}, @@ -478,9 +478,11 @@ impl NewBarCallback { } } -impl RustTimeEventCallback for NewBarCallback { - fn call(&self, event: TimeEvent) { - self.aggregator.borrow_mut().build_bar(event); +impl From> for TimeEventCallback { + fn from(value: NewBarCallback) -> Self { + Self::Rust(Rc::new(move |event: TimeEvent| { + value.aggregator.borrow_mut().build_bar(event); + })) } } @@ -528,7 +530,6 @@ where let now = self.clock.utc_now(); let start_time = get_time_bar_start(now, &self.bar_type()); let start_time_ns = UnixNanos::from(start_time.timestamp_nanos_opt().unwrap() as u64); - let callback: Rc = Rc::new(callback); self.clock.set_timer_ns( &self.timer_name, From 8aa0eef65f19a1eb820290e15aba3cf35f244ea4 Mon Sep 17 00:00:00 2001 From: David Blom Date: Mon, 7 Oct 2024 19:35:29 +0200 Subject: [PATCH 009/224] Close existing tasks when reconnecting WebSocketClient (#1986) --- nautilus_core/network/src/websocket.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nautilus_core/network/src/websocket.rs b/nautilus_core/network/src/websocket.rs index f8aecfc90547..d4c9c1da2f57 100644 --- a/nautilus_core/network/src/websocket.rs +++ b/nautilus_core/network/src/websocket.rs @@ -258,6 +258,8 @@ impl WebSocketClientInner { /// Make a new connection with server. Use the new read and write halves /// to update self writer and read and heartbeat tasks. pub async fn reconnect(&mut self) -> Result<(), Error> { + self.shutdown().await; + let (new_writer, reader) = Self::connect_with_server(&self.config.url, self.config.headers.clone()).await?; let mut guard = self.writer.lock().await; From 17411b9451f01b3d9c19139723de2e1c79806f53 Mon Sep 17 00:00:00 2001 From: Brad Date: Tue, 8 Oct 2024 04:36:33 +1100 Subject: [PATCH 010/224] Fix Betfair test (#1988) --- examples/live/betfair/betfair.py | 2 +- .../adapters/betfair/parsing/common.py | 2 +- .../adapters/betfair/test_betfair_data.py | 2 +- .../adapters/betfair/test_kit.py | 94 +++++++++---------- 4 files changed, 50 insertions(+), 50 deletions(-) diff --git a/examples/live/betfair/betfair.py b/examples/live/betfair/betfair.py index 7646b91e9133..bdec36a696e3 100644 --- a/examples/live/betfair/betfair.py +++ b/examples/live/betfair/betfair.py @@ -130,7 +130,7 @@ async def main( # The market ID will appear in the browser query string. config = BetfairInstrumentProviderConfig( account_currency="GBP", - market_ids=["1.223041451"], + market_ids=["1.176878927"], ) node = asyncio.run(main(instrument_config=config, log_level="DEBUG")) node.dispose() diff --git a/nautilus_trader/adapters/betfair/parsing/common.py b/nautilus_trader/adapters/betfair/parsing/common.py index b585d4e6a568..e918015676f1 100644 --- a/nautilus_trader/adapters/betfair/parsing/common.py +++ b/nautilus_trader/adapters/betfair/parsing/common.py @@ -43,7 +43,7 @@ def betfair_instrument_id( """ Create an instrument ID from betfair fields. - >>> betfair_instrument_id(market_id="1-201070830", selection_id=123456, selection_handicap=None) + >>> betfair_instrument_id(market_id="1.201070830", selection_id=123456, selection_handicap=None) InstrumentId('1-201070830-123456-None.BETFAIR') """ diff --git a/tests/integration_tests/adapters/betfair/test_betfair_data.py b/tests/integration_tests/adapters/betfair/test_betfair_data.py index 8e423c57d63d..36365aec4826 100644 --- a/tests/integration_tests/adapters/betfair/test_betfair_data.py +++ b/tests/integration_tests/adapters/betfair/test_betfair_data.py @@ -85,7 +85,7 @@ def instrument_list(mock_load_markets_metadata): # Fill INSTRUMENTS global cache INSTRUMENTS.extend(instrument_provider.list_all()) - # assert INSTRUMENTS # TODO: Fix Betfair symbology + assert INSTRUMENTS # TODO: Fix Betfair symbology @pytest.mark.asyncio() diff --git a/tests/integration_tests/adapters/betfair/test_kit.py b/tests/integration_tests/adapters/betfair/test_kit.py index bedf889d94a8..42349eedf29b 100644 --- a/tests/integration_tests/adapters/betfair/test_kit.py +++ b/tests/integration_tests/adapters/betfair/test_kit.py @@ -686,53 +686,53 @@ def market_ids(): """ return ( - "1-148894697", - "1-159045690", - "1-160683973", - "1-160740937", - "1-160837650", - "1-163016936", - "1-164555327", - "1-166577732", - "1-166881256", - "1-167249009", - "1-167249195", - "1-167249197", - "1-170262001", - "1-170262002", - "1-170436895", - "1-170508139", - "1-171431228", - "1-172698506", - "1-173509358", - "1-175061137", - "1-175061138", - "1-175135109", - "1-175492291", - "1-175492292", - "1-175492293", - "1-175492294", - "1-175492295", - "1-175492296", - "1-175775529", - "1-175776462", - "1-176584117", - "1-176621195", - "1-177125720", - "1-177125722", - "1-177126187", - "1-177126652", - "1-177126864", - "1-178198625", - "1-180294966", - "1-180294971", - "1-180434883", - "1-180604981", - "1-180727728", - "1-180737193", - "1-180770798", - "1-180737206", - "1-165003060", + "1.148894697", + "1.159045690", + "1.160683973", + "1.160740937", + "1.160837650", + "1.163016936", + "1.164555327", + "1.166577732", + "1.166881256", + "1.167249009", + "1.167249195", + "1.167249197", + "1.170262001", + "1.170262002", + "1.170436895", + "1.170508139", + "1.171431228", + "1.172698506", + "1.173509358", + "1.175061137", + "1.175061138", + "1.175135109", + "1.175492291", + "1.175492292", + "1.175492293", + "1.175492294", + "1.175492295", + "1.175492296", + "1.175775529", + "1.175776462", + "1.176584117", + "1.176621195", + "1.177125720", + "1.177125722", + "1.177126187", + "1.177126652", + "1.177126864", + "1.178198625", + "1.180294966", + "1.180294971", + "1.180434883", + "1.180604981", + "1.180727728", + "1.180737193", + "1.180770798", + "1.180737206", + "1.165003060", ) @staticmethod From 852c95105bbc5d5d98532433c0b01a6f72d2f346 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 04:40:59 +1100 Subject: [PATCH 011/224] Update release notes --- RELEASES.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index e4e312581cbf..d31e4309af59 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -3,16 +3,18 @@ Released on TBD (UTC). ### Enhancements -- Standardized Betfair symbology to use hyphens instead of periods (preventing them being treated as composite symbols) +- Standardized Betfair symbology to use hyphens instead of periods (prevents Betfair symbols being treated as composite) ### Internal Improvements -None +- Ported `Throttler` to Rust (#1988), thanks @Pushkarm029 and @twitu +- Refined `WebSocketClient` to close existing tasks on reconnect (#1986), thanks @davidsblom ### Breaking Changes None ### Fixes - Fixed resubscribing to orderbook in batched mode for dYdX (#1985), thanks @davidsblom +- Fixed Betfair tests related to symbology (#1988), thanks @limx0 --- @@ -27,9 +29,9 @@ Released on 5th October 2024 (UTC). - Improved option greeks (#1964), thanks @faysou ### Internal Improvements -- Implemented order book delta processing for `SimulatedExchange` (#1975), thanks @filipmacek -- Implemented bar processing for `SimulatedExchange` (#1969), thanks @filipmacek -- Implemented remaining getter functions in `SimulatedExchange` (#1970), thanks @filipmacek +- Implemented order book delta processing for `SimulatedExchange` in Rust (#1975), thanks @filipmacek +- Implemented bar processing for `SimulatedExchange` in Rust (#1969), thanks @filipmacek +- Implemented remaining getter functions for `SimulatedExchange` in Rust (#1970), thanks @filipmacek - Implemented rate limiting for dYdX websocket subscriptions (#1977), thanks @davidsblom - Refactored reconnection handling for dYdX (#1983), thanks @davidsblom - Refined `DatabentoDataLoader` internals to accommodate usage from Rust From 62dc2e8f371fa45db4ca5a0ef5ab2cddd5a71f7e Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 04:58:45 +1100 Subject: [PATCH 012/224] Minor formatting and add docs --- .../common/src/throttler/callbacks.rs | 17 ++++++++++- nautilus_core/common/src/throttler/inner.rs | 29 +++++++++++++++---- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/nautilus_core/common/src/throttler/callbacks.rs b/nautilus_core/common/src/throttler/callbacks.rs index f5809e2654bd..dc56f537e71a 100644 --- a/nautilus_core/common/src/throttler/callbacks.rs +++ b/nautilus_core/common/src/throttler/callbacks.rs @@ -1,3 +1,18 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + use std::{cell::RefCell, rc::Rc}; use super::inner::InnerThrottler; @@ -22,7 +37,7 @@ impl From> for TimeEventCa } } -/// Process buffered messages +/// Process buffered messages. #[derive(Clone)] pub struct ThrottlerProcess { inner: Rc>>, diff --git a/nautilus_core/common/src/throttler/inner.rs b/nautilus_core/common/src/throttler/inner.rs index 49dee2e710cd..48583d131a12 100644 --- a/nautilus_core/common/src/throttler/inner.rs +++ b/nautilus_core/common/src/throttler/inner.rs @@ -1,3 +1,18 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + use std::{cell::RefCell, collections::VecDeque, fmt::Debug, rc::Rc}; use nautilus_core::nanos::UnixNanos; @@ -5,11 +20,12 @@ use nautilus_core::nanos::UnixNanos; use super::Throttler; use crate::{clock::Clock, timer::TimeEventCallback}; -/// Throttler rate limits messages by dropping or buffering them +/// Throttler rate limits messages by dropping or buffering them. /// /// Throttler takes messages of type T and callback of type F for dropping /// or processing messages. pub struct InnerThrottler { + /// The number of messages received. pub recv_count: usize, /// The number of messages sent. pub sent_count: usize, @@ -76,9 +92,9 @@ impl InnerThrottler { } } - /// Set timer with a callback to be triggered on next interval + /// Set timer with a callback to be triggered on next interval. /// - /// Typically used to register callbacks + /// Typically used to register callbacks: /// - [`super::callbacks::ThrottlerProcess`] to process buffered messages /// - [`super::callbacks::ThrottlerResume`] to stop buffering #[inline] @@ -93,7 +109,7 @@ impl InnerThrottler { clock.set_time_alert_ns(&self.timer_name, alert_ts, callback); } - /// Time delta when the next message can be sent + /// Time delta when the next message can be sent. #[inline] pub fn delta_next(&mut self) -> u64 { match self.timestamps.get(self.limit - 1) { @@ -105,6 +121,7 @@ impl InnerThrottler { } } + /// Reset the throttler which clears internal state. #[inline] pub fn reset(&mut self) { self.buffer.clear(); @@ -114,7 +131,7 @@ impl InnerThrottler { self.timestamps.clear(); } - /// Fractional value of rate limit consumed in current interval + /// Fractional value of rate limit consumed in current interval. #[inline] pub fn used(&self) -> f64 { if self.timestamps.is_empty() { @@ -133,7 +150,7 @@ impl InnerThrottler { (messages_in_current_interval as f64) / (self.limit as f64) } - /// Number of messages queued in buffer + /// Number of messages queued in buffer. #[inline] pub fn qsize(&self) -> usize { self.buffer.len() From 09c60a6271b7244f51e4956bce1fb353fb138c19 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 05:07:32 +1100 Subject: [PATCH 013/224] Minor formatting --- nautilus_core/common/src/clock.rs | 3 ++- nautilus_core/common/src/timer.rs | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nautilus_core/common/src/clock.rs b/nautilus_core/common/src/clock.rs index 3dd3a2b687d8..a7c10a73f875 100644 --- a/nautilus_core/common/src/clock.rs +++ b/nautilus_core/common/src/clock.rs @@ -33,6 +33,7 @@ use crate::timer::{LiveTimer, TestTimer, TimeEvent, TimeEventCallback, TimeEvent /// Represents a type of clock. /// /// # Notes +/// /// An active timer is one which has not expired (`timer.is_expired == False`). pub trait Clock { /// Returns the current date and time as a timezone-aware `DateTime`. @@ -83,7 +84,7 @@ pub trait Clock { callback: Option, ); - /// Returns the time interval in which the timer `name` is triggered + /// Returns the time interval in which the timer `name` is triggered. /// /// If the timer doesn't exist 0 is returned. fn next_time_ns(&self, name: &str) -> UnixNanos; diff --git a/nautilus_core/common/src/timer.rs b/nautilus_core/common/src/timer.rs index 630a2377c848..99b0b7cee162 100644 --- a/nautilus_core/common/src/timer.rs +++ b/nautilus_core/common/src/timer.rs @@ -17,7 +17,7 @@ use std::{ cmp::Ordering, - fmt::Display, + fmt::{Debug, Display}, num::NonZeroU64, rc::Rc, sync::{ @@ -35,7 +35,6 @@ use nautilus_core::{ }; #[cfg(feature = "python")] use pyo3::{PyObject, Python}; -use std::fmt::Debug; use tokio::{ sync::oneshot, time::{Duration, Instant}, From c99b852ccb909556eba82b156b9e65094f3f2fda Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 05:10:13 +1100 Subject: [PATCH 014/224] Fix clippy lints --- nautilus_core/common/src/clock.rs | 4 ++-- nautilus_core/common/src/throttler/mod.rs | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/nautilus_core/common/src/clock.rs b/nautilus_core/common/src/clock.rs index a7c10a73f875..341700eb5659 100644 --- a/nautilus_core/common/src/clock.rs +++ b/nautilus_core/common/src/clock.rs @@ -450,7 +450,7 @@ impl Clock for LiveClock { None => {} Some(mut timer) => { if let Err(e) = timer.cancel() { - log::error!("Error on timer cancel: {:?}", e); + log::error!("Error on timer cancel: {e:?}"); } } } @@ -459,7 +459,7 @@ impl Clock for LiveClock { fn cancel_timers(&mut self) { for timer in &mut self.timers.values_mut() { if let Err(e) = timer.cancel() { - log::error!("Error on timer cancel: {:?}", e); + log::error!("Error on timer cancel: {e:?}"); } } self.timers.clear(); diff --git a/nautilus_core/common/src/throttler/mod.rs b/nautilus_core/common/src/throttler/mod.rs index 06a0ae54479e..0e47c2919425 100644 --- a/nautilus_core/common/src/throttler/mod.rs +++ b/nautilus_core/common/src/throttler/mod.rs @@ -487,7 +487,8 @@ mod tests { ThrottlerInput::AdvanceClock(duration) => { let mut clock_ref = test_clock.borrow_mut(); let current_time = clock_ref.get_time_ns(); - let time_events = clock_ref.advance_time(current_time + duration as u64, true); + let time_events = + clock_ref.advance_time(current_time + u64::from(duration), true); for each_event in clock_ref.match_handlers(time_events) { drop(clock_ref); each_event.callback.call(each_event.event); From 20ebe469428356b735328701b6cd1bea39ae5f0c Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 05:11:04 +1100 Subject: [PATCH 015/224] Update pre-commit --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c1ae35c7a3b0..91664d919681 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ repos: # General checks ############################################################################## - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 + rev: v5.0.0 hooks: - id: forbid-new-submodules - id: fix-encoding-pragma @@ -83,7 +83,7 @@ repos: exclude: "docs/_pygments/monokai.py" - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.8 + rev: v0.6.9 hooks: - id: ruff args: ["--fix"] From a0664a0fe97ad440f30b733937670ebc637e2d9a Mon Sep 17 00:00:00 2001 From: faysou Date: Mon, 7 Oct 2024 19:22:07 +0100 Subject: [PATCH 016/224] Add support for bbo quotes in Databento adapter (#1990) --- examples/backtest/databento_option_greeks.py | 20 +++-- .../adapters/src/databento/decode.rs | 70 +++++++++++++++ .../adapters/src/databento/loader.rs | 20 +++++ .../adapters/src/databento/python/loader.rs | 25 ++++++ .../adapters/src/databento/symbology.rs | 4 + .../test_data/test_data.bbo-1m.dbn.zst | Bin 0 -> 224 bytes .../test_data/test_data.bbo-1s.dbn.zst | Bin 0 -> 210 bytes .../adapters/databento/data_utils.py | 6 +- nautilus_trader/adapters/databento/enums.py | 2 + nautilus_trader/adapters/databento/loaders.py | 15 ++++ nautilus_trader/core/nautilus_pyo3.pyi | 2 + .../adapters/databento/test_loaders.py | 84 ++++++++++++++++++ tests/test_data/databento/bbo-1m.dbn.zst | Bin 0 -> 224 bytes tests/test_data/databento/bbo-1s.dbn.zst | Bin 0 -> 210 bytes 14 files changed, 241 insertions(+), 7 deletions(-) create mode 100644 nautilus_core/adapters/src/databento/test_data/test_data.bbo-1m.dbn.zst create mode 100644 nautilus_core/adapters/src/databento/test_data/test_data.bbo-1s.dbn.zst create mode 100644 tests/test_data/databento/bbo-1m.dbn.zst create mode 100644 tests/test_data/databento/bbo-1s.dbn.zst diff --git a/examples/backtest/databento_option_greeks.py b/examples/backtest/databento_option_greeks.py index d21e8256de9c..57d0fcacfa65 100644 --- a/examples/backtest/databento_option_greeks.py +++ b/examples/backtest/databento_option_greeks.py @@ -1,3 +1,18 @@ +# --- +# jupyter: +# jupytext: +# formats: py:percent +# text_representation: +# extension: .py +# format_name: percent +# format_version: '1.3' +# jupytext_version: 1.16.4 +# kernelspec: +# display_name: Python 3 (ipykernel) +# language: python +# name: python3 +# --- + # %% [markdown] # ## imports @@ -5,9 +20,6 @@ # Note: Use the python extension jupytext to be able to open this python file in jupyter as a notebook # %% -# from nautilus_trader.adapters.databento.data_utils import init_databento_client -import nautilus_trader.adapters.databento.data_utils as db_data_utils -from nautilus_trader import PACKAGE_ROOT from nautilus_trader.adapters.databento.data_utils import data_path from nautilus_trader.adapters.databento.data_utils import databento_data from nautilus_trader.adapters.databento.data_utils import load_catalog @@ -43,8 +55,6 @@ # ## parameters # %% -db_data_utils.DATA_PATH = PACKAGE_ROOT / "tests" / "test_data" / "databento" - catalog_folder = "option_catalog_example" catalog = load_catalog(catalog_folder) diff --git a/nautilus_core/adapters/src/databento/decode.rs b/nautilus_core/adapters/src/databento/decode.rs index 3adf91aad258..54c1f062dffb 100644 --- a/nautilus_core/adapters/src/databento/decode.rs +++ b/nautilus_core/adapters/src/databento/decode.rs @@ -615,6 +615,26 @@ pub fn decode_mbp1_msg( Ok((quote, maybe_trade)) } +pub fn decode_bbo_msg( + msg: &dbn::BboMsg, + instrument_id: InstrumentId, + price_precision: u8, + ts_init: UnixNanos, +) -> anyhow::Result { + let top_level = &msg.levels[0]; + let quote = QuoteTick::new( + instrument_id, + Price::from_raw(top_level.bid_px, price_precision), + Price::from_raw(top_level.ask_px, price_precision), + Quantity::from_raw(u64::from(top_level.bid_sz) * FIXED_SCALAR as u64, 0), + Quantity::from_raw(u64::from(top_level.ask_sz) * FIXED_SCALAR as u64, 0), + msg.ts_recv.into(), + ts_init, + ); + + Ok(quote) +} + pub fn decode_mbp10_msg( msg: &dbn::Mbp10Msg, instrument_id: InstrumentId, @@ -801,6 +821,14 @@ pub fn decode_record( (quote, None) => (Some(Data::Quote(quote)), None), (quote, Some(trade)) => (Some(Data::Quote(quote)), Some(Data::Trade(trade))), } + } else if let Some(msg) = record.get::() { + let ts_init = determine_timestamp(ts_init, msg.ts_recv.into()); + let quote = decode_bbo_msg(msg, instrument_id, price_precision, ts_init)?; + (Some(Data::Quote(quote)), None) + } else if let Some(msg) = record.get::() { + let ts_init = determine_timestamp(ts_init, msg.ts_recv.into()); + let quote = decode_bbo_msg(msg, instrument_id, price_precision, ts_init)?; + (Some(Data::Quote(quote)), None) } else if let Some(msg) = record.get::() { let ts_init = determine_timestamp(ts_init, msg.ts_recv.into()); let depth = decode_mbp10_msg(msg, instrument_id, price_precision, ts_init)?; @@ -1248,6 +1276,48 @@ mod tests { assert_eq!(quote.ts_init, 0); } + #[rstest] + fn test_decode_bbo_1s_msg() { + let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.bbo-1s.dbn.zst")); + let mut dbn_stream = Decoder::from_zstd_file(path) + .unwrap() + .decode_stream::(); + let msg = dbn_stream.next().unwrap().unwrap(); + + let instrument_id = InstrumentId::from("ESM4.GLBX"); + let quote = decode_bbo_msg(msg, instrument_id, 2, 0.into()).unwrap(); + + assert_eq!(quote.instrument_id, instrument_id); + assert_eq!(quote.bid_price, Price::from("5199.50")); + assert_eq!(quote.ask_price, Price::from("5199.75")); + assert_eq!(quote.bid_size, Quantity::from("26")); + assert_eq!(quote.ask_size, Quantity::from("23")); + assert_eq!(quote.ts_event, msg.ts_recv); + assert_eq!(quote.ts_event, 1715248801000000000); + assert_eq!(quote.ts_init, 0); + } + + #[rstest] + fn test_decode_bbo_1m_msg() { + let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.bbo-1m.dbn.zst")); + let mut dbn_stream = Decoder::from_zstd_file(path) + .unwrap() + .decode_stream::(); + let msg = dbn_stream.next().unwrap().unwrap(); + + let instrument_id = InstrumentId::from("ESM4.GLBX"); + let quote = decode_bbo_msg(msg, instrument_id, 2, 0.into()).unwrap(); + + assert_eq!(quote.instrument_id, instrument_id); + assert_eq!(quote.bid_price, Price::from("5199.50")); + assert_eq!(quote.ask_price, Price::from("5199.75")); + assert_eq!(quote.bid_size, Quantity::from("33")); + assert_eq!(quote.ask_size, Quantity::from("17")); + assert_eq!(quote.ts_event, msg.ts_recv); + assert_eq!(quote.ts_event, 1715248800000000000); + assert_eq!(quote.ts_init, 0); + } + #[rstest] fn test_decode_mbp10_msg() { let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.mbp-10.dbn.zst")); diff --git a/nautilus_core/adapters/src/databento/loader.rs b/nautilus_core/adapters/src/databento/loader.rs index 8a4528d1148b..db90e5ded99f 100644 --- a/nautilus_core/adapters/src/databento/loader.rs +++ b/nautilus_core/adapters/src/databento/loader.rs @@ -309,6 +309,26 @@ impl DatabentoDataLoader { .collect() } + pub fn load_bbo_quotes( + &self, + filepath: PathBuf, + instrument_id: Option, + ) -> anyhow::Result> { + self.read_records::(filepath, instrument_id, false)? + .filter_map(|result| match result { + Ok((Some(item1), _)) => { + if let Data::Quote(quote) = item1 { + Some(Ok(quote)) + } else { + None + } + } + Ok((None, _)) => None, + Err(e) => Some(Err(e)), + }) + .collect() + } + pub fn load_tbbo_trades( &self, filepath: PathBuf, diff --git a/nautilus_core/adapters/src/databento/python/loader.rs b/nautilus_core/adapters/src/databento/python/loader.rs index 591b24617d05..68153e56b020 100644 --- a/nautilus_core/adapters/src/databento/python/loader.rs +++ b/nautilus_core/adapters/src/databento/python/loader.rs @@ -170,6 +170,31 @@ impl DatabentoDataLoader { exhaust_data_iter_to_pycapsule(py, iter).map_err(to_pyvalue_err) } + #[pyo3(name = "load_bbo_quotes")] + fn py_load_bbo_quotes( + &self, + filepath: PathBuf, + instrument_id: Option, + ) -> PyResult> { + Ok(self + .load_bbo_quotes(filepath, instrument_id) + .map_err(to_pyvalue_err)?) + } + + #[pyo3(name = "load_bbo_quotes_as_pycapsule")] + fn py_load_bbo_quotes_as_pycapsule( + &self, + py: Python, + filepath: PathBuf, + instrument_id: Option, + ) -> PyResult { + let iter = self + .read_records::(filepath, instrument_id, false) + .map_err(to_pyvalue_err)?; + + exhaust_data_iter_to_pycapsule(py, iter).map_err(to_pyvalue_err) + } + #[pyo3(name = "load_tbbo_trades")] fn py_load_tbbo_trades( &self, diff --git a/nautilus_core/adapters/src/databento/symbology.rs b/nautilus_core/adapters/src/databento/symbology.rs index a1c08da165e5..e6712e4b3bf3 100644 --- a/nautilus_core/adapters/src/databento/symbology.rs +++ b/nautilus_core/adapters/src/databento/symbology.rs @@ -47,6 +47,10 @@ pub fn get_nautilus_instrument_id_for_record( (msg.hd.instrument_id, msg.ts_recv) } else if let Some(msg) = record.get::() { (msg.hd.instrument_id, msg.ts_recv) + } else if let Some(msg) = record.get::() { + (msg.hd.instrument_id, msg.ts_recv) + } else if let Some(msg) = record.get::() { + (msg.hd.instrument_id, msg.ts_recv) } else if let Some(msg) = record.get::() { (msg.hd.instrument_id, msg.ts_recv) } else if let Some(msg) = record.get::() { diff --git a/nautilus_core/adapters/src/databento/test_data/test_data.bbo-1m.dbn.zst b/nautilus_core/adapters/src/databento/test_data/test_data.bbo-1m.dbn.zst new file mode 100644 index 0000000000000000000000000000000000000000..0e5023347c777844d1c66bfe97a808da63855552 GIT binary patch literal 224 zcmV<603ZJ-wJ-f7&XocHgabrEP65UM002i!LRcFfs}NfB>-B(}JRG0F1I?LBK)aSl}!S*a6wPvlA$_ zFa0E-r2_ym1{NZaO>-*>)yn1tL)|OU^)CzT37ACh_%E`vn!jR|LWi6!Q+Ib?`~YG6 zlejQjjpnH+0;CI$IN?+#(%A-&(aW$6C8@R?KMmk$s>$VL*cB>KEE_}{s1OMNQ*gaw aOkm4XrQK?^DUe-?z)-;`IBP{H0|*1v=D4ybwJ-f7 zpiKh+B1ID*psP8r-=be#v~ojp$q2@avOb__@cnUJg#0Cca_=ouk1jZSK|zpEI?%&? z-l?|_CJu8|iO6Hq4#cmeOXa|51U4GW!oYzH@LZV|3IM=kKn4&OIGF-*paLyLV5nf3 M5xBv80z@%Mi^^P4=Kufz literal 0 HcmV?d00001 diff --git a/nautilus_trader/adapters/databento/data_utils.py b/nautilus_trader/adapters/databento/data_utils.py index ab2bb9510290..b9d867daf4d8 100644 --- a/nautilus_trader/adapters/databento/data_utils.py +++ b/nautilus_trader/adapters/databento/data_utils.py @@ -1,12 +1,14 @@ from datetime import datetime from datetime import timedelta -from pathlib import Path +from nautilus_trader import PACKAGE_ROOT from nautilus_trader.adapters.databento.loaders import DatabentoDataLoader from nautilus_trader.persistence.catalog import ParquetDataCatalog -DATA_PATH = Path("~/databento_data").expanduser() +# Note: when using the functions below, change the variable below to a folder path +# where you store all your databento data +DATA_PATH = PACKAGE_ROOT / "tests" / "test_data" / "databento" # this variable can be modified with a valid key if downloading data is needed DATABENTO_API_KEY = "db-XXXXX" diff --git a/nautilus_trader/adapters/databento/enums.py b/nautilus_trader/adapters/databento/enums.py index 9d45b1d7e0b2..d0f0867c0597 100644 --- a/nautilus_trader/adapters/databento/enums.py +++ b/nautilus_trader/adapters/databento/enums.py @@ -24,6 +24,8 @@ class DatabentoSchema(Enum): MBO = "mbo" MBP_1 = "mbp-1" MBP_10 = "mbp-10" + BBO_1S = "bbo-1s" + BBO_1M = "bbo-1m" TBBO = "tbbo" TRADES = "trades" OHLCV_1S = "ohlcv-1s" diff --git a/nautilus_trader/adapters/databento/loaders.py b/nautilus_trader/adapters/databento/loaders.py index 41a23272e2d4..ea082c8cdc6d 100644 --- a/nautilus_trader/adapters/databento/loaders.py +++ b/nautilus_trader/adapters/databento/loaders.py @@ -210,6 +210,21 @@ def from_dbn_file( # noqa: C901 (too complex) filepath=str(path), instrument_id=pyo3_instrument_id, ) + case DatabentoSchema.BBO_1S.value | DatabentoSchema.BBO_1M.value: + if as_legacy_cython: + capsule = self._pyo3_loader.load_bbo_quotes_as_pycapsule( + filepath=str(path), + instrument_id=pyo3_instrument_id, + ) + data = capsule_to_list(capsule) + # Drop encapsulated `CVec` as data is now transferred + drop_cvec_pycapsule(capsule) + return data + else: + return self._pyo3_loader.load_bbo_quotes( + filepath=str(path), + instrument_id=pyo3_instrument_id, + ) case DatabentoSchema.MBP_10.value: if as_legacy_cython: capsule = self._pyo3_loader.load_order_book_depth10_as_pycapsule( diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index c3b659476f44..a4c2dfcbb0e5 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -3852,6 +3852,8 @@ class DatabentoDataLoader: def load_order_book_depth10_as_pycapsule(self, filepath: str, instrument_id: InstrumentId | None) -> object: ... def load_quotes(self, filepath: str, instrument_id: InstrumentId | None) -> list[QuoteTick]: ... def load_quotes_as_pycapsule(self, filepath: str, instrument_id: InstrumentId | None, include_trades: bool | None) -> object: ... + def load_bbo_quotes(self, filepath: str, instrument_id: InstrumentId | None) -> list[QuoteTick]: ... + def load_bbo_quotes_as_pycapsule(self, filepath: str, instrument_id: InstrumentId | None) -> object: ... def load_trades(self, filepath: str, instrument_id: InstrumentId | None) -> list[TradeTick]: ... def load_trades_as_pycapsule(self, filepath: str, instrument_id: InstrumentId | None) -> object: ... def load_bars(self, filepath: str, instrument_id: InstrumentId | None) -> list[Bar]: ... diff --git a/tests/integration_tests/adapters/databento/test_loaders.py b/tests/integration_tests/adapters/databento/test_loaders.py index 14f7af54acc5..107e9592d11e 100644 --- a/tests/integration_tests/adapters/databento/test_loaders.py +++ b/tests/integration_tests/adapters/databento/test_loaders.py @@ -274,6 +274,90 @@ def test_loader_mbp_1_pyo3() -> None: assert quote.ts_init == 1609160400006136329 +def test_loader_bbo_1s() -> None: + # Arrange + loader = DatabentoDataLoader() + path = DATABENTO_TEST_DATA_DIR / "bbo-1s.dbn.zst" + + # Act + data = loader.from_dbn_file(path, as_legacy_cython=True) + + # Assert + assert len(data) > 0 + assert isinstance(data[0], QuoteTick) + quote = data[0] + assert quote.instrument_id == InstrumentId.from_str("ESM4.GLBX") + assert quote.bid_price == Price.from_str("5199.50") + assert quote.ask_price == Price.from_str("5199.75") + assert quote.bid_size == Quantity.from_int(26) + assert quote.ask_size == Quantity.from_int(23) + assert quote.ts_event == 1715248801000000000 + assert quote.ts_init == 1715248801000000000 + + +def test_loader_bbo_1s_pyo3() -> None: + # Arrange + loader = DatabentoDataLoader() + path = DATABENTO_TEST_DATA_DIR / "bbo-1s.dbn.zst" + + # Act + data = loader.from_dbn_file(path, as_legacy_cython=False) + + # Assert + assert len(data) > 0 + assert isinstance(data[0], nautilus_pyo3.QuoteTick) + quote = data[0] + assert quote.instrument_id == nautilus_pyo3.InstrumentId.from_str("ESM4.GLBX") + assert quote.bid_price == nautilus_pyo3.Price.from_str("5199.50") + assert quote.ask_price == nautilus_pyo3.Price.from_str("5199.75") + assert quote.bid_size == nautilus_pyo3.Quantity.from_int(26) + assert quote.ask_size == nautilus_pyo3.Quantity.from_int(23) + assert quote.ts_event == 1715248801000000000 + assert quote.ts_init == 1715248801000000000 + + +def test_loader_bbo_1m() -> None: + # Arrange + loader = DatabentoDataLoader() + path = DATABENTO_TEST_DATA_DIR / "bbo-1m.dbn.zst" + + # Act + data = loader.from_dbn_file(path, as_legacy_cython=True) + + # Assert + assert len(data) > 0 + assert isinstance(data[0], QuoteTick) + quote = data[0] + assert quote.instrument_id == InstrumentId.from_str("ESM4.GLBX") + assert quote.bid_price == Price.from_str("5199.50") + assert quote.ask_price == Price.from_str("5199.75") + assert quote.bid_size == Quantity.from_int(33) + assert quote.ask_size == Quantity.from_int(17) + assert quote.ts_event == 1715248800000000000 + assert quote.ts_init == 1715248800000000000 + + +def test_loader_bbo_1m_pyo3() -> None: + # Arrange + loader = DatabentoDataLoader() + path = DATABENTO_TEST_DATA_DIR / "bbo-1m.dbn.zst" + + # Act + data = loader.from_dbn_file(path, as_legacy_cython=False) + + # Assert + assert len(data) > 0 + assert isinstance(data[0], nautilus_pyo3.QuoteTick) + quote = data[0] + assert quote.instrument_id == nautilus_pyo3.InstrumentId.from_str("ESM4.GLBX") + assert quote.bid_price == nautilus_pyo3.Price.from_str("5199.50") + assert quote.ask_price == nautilus_pyo3.Price.from_str("5199.75") + assert quote.bid_size == nautilus_pyo3.Quantity.from_int(33) + assert quote.ask_size == nautilus_pyo3.Quantity.from_int(17) + assert quote.ts_event == 1715248800000000000 + assert quote.ts_init == 1715248800000000000 + + def test_loader_mbp_10() -> None: # Arrange loader = DatabentoDataLoader() diff --git a/tests/test_data/databento/bbo-1m.dbn.zst b/tests/test_data/databento/bbo-1m.dbn.zst new file mode 100644 index 0000000000000000000000000000000000000000..0e5023347c777844d1c66bfe97a808da63855552 GIT binary patch literal 224 zcmV<603ZJ-wJ-f7&XocHgabrEP65UM002i!LRcFfs}NfB>-B(}JRG0F1I?LBK)aSl}!S*a6wPvlA$_ zFa0E-r2_ym1{NZaO>-*>)yn1tL)|OU^)CzT37ACh_%E`vn!jR|LWi6!Q+Ib?`~YG6 zlejQjjpnH+0;CI$IN?+#(%A-&(aW$6C8@R?KMmk$s>$VL*cB>KEE_}{s1OMNQ*gaw aOkm4XrQK?^DUe-?z)-;`IBP{H0|*1v=D4ybwJ-f7 zpiKh+B1ID*psP8r-=be#v~ojp$q2@avOb__@cnUJg#0Cca_=ouk1jZSK|zpEI?%&? z-l?|_CJu8|iO6Hq4#cmeOXa|51U4GW!oYzH@LZV|3IM=kKn4&OIGF-*paLyLV5nf3 M5xBv80z@%Mi^^P4=Kufz literal 0 HcmV?d00001 From 7719842364c96caeb3ec0688d11c5f23cdae5f4a Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 05:25:25 +1100 Subject: [PATCH 017/224] Update release notes --- RELEASES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASES.md b/RELEASES.md index d31e4309af59..e7375bd9e5fa 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -3,6 +3,7 @@ Released on TBD (UTC). ### Enhancements +- Added support for `bbo-1s` and `bbo-1m` quote schemas for Databento adapter (#1990), thanks @faysou - Standardized Betfair symbology to use hyphens instead of periods (prevents Betfair symbols being treated as composite) ### Internal Improvements From ed4dad286549800613147e7f1098b3ca5ce63a44 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 05:35:13 +1100 Subject: [PATCH 018/224] Reorganize and update dependencies --- nautilus_core/Cargo.lock | 174 +++++++---------------- nautilus_core/Cargo.toml | 7 +- nautilus_core/common/Cargo.toml | 4 +- nautilus_trader/core/includes/backtest.h | 2 +- nautilus_trader/core/includes/common.h | 2 +- nautilus_trader/core/includes/core.h | 2 +- nautilus_trader/core/includes/model.h | 2 +- 7 files changed, 65 insertions(+), 128 deletions(-) diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 4bbbca72591e..964d01355109 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -305,7 +305,7 @@ dependencies = [ "arrow-schema", "chrono", "half", - "indexmap 2.6.0", + "indexmap", "lexical-core", "num", "serde", @@ -447,17 +447,6 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.4.0" @@ -779,19 +768,19 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cbindgen" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da6bc11b07529f16944307272d5bd9b22530bc7d05751717c9d416586cedab49" +checksum = "3fce8dd7fcfcbf3a0a87d8f515194b49d6135acab73e18bd380d1d93bb1a15eb" dependencies = [ - "clap 3.2.25", + "clap", "heck 0.4.1", - "indexmap 1.9.3", + "indexmap", "log", "proc-macro2", "quote", "serde", "serde_json", - "syn 1.0.109", + "syn 2.0.79", "tempfile", "toml", ] @@ -902,21 +891,6 @@ dependencies = [ "libloading", ] -[[package]] -name = "clap" -version = "3.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" -dependencies = [ - "atty", - "bitflags 1.3.2", - "clap_lex 0.2.4", - "indexmap 1.9.3", - "strsim 0.10.0", - "termcolor", - "textwrap", -] - [[package]] name = "clap" version = "4.5.19" @@ -935,8 +909,8 @@ checksum = "a5fbc17d3ef8278f55b282b2a2e75ae6f6c7d4bb70ed3d0382375104bfafdb4b" dependencies = [ "anstream", "anstyle", - "clap_lex 0.7.2", - "strsim 0.11.1", + "clap_lex", + "strsim", ] [[package]] @@ -951,15 +925,6 @@ dependencies = [ "syn 2.0.79", ] -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] - [[package]] name = "clap_lex" version = "0.7.2" @@ -1115,7 +1080,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.5.19", + "clap", "criterion-plot", "is-terminal", "itertools 0.10.5", @@ -1233,7 +1198,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim 0.11.1", + "strsim", "syn 2.0.79", ] @@ -1324,7 +1289,7 @@ dependencies = [ "glob", "half", "hashbrown 0.14.5", - "indexmap 2.6.0", + "indexmap", "itertools 0.12.1", "log", "num_cpus", @@ -1484,7 +1449,7 @@ dependencies = [ "datafusion-expr", "datafusion-physical-expr", "hashbrown 0.14.5", - "indexmap 2.6.0", + "indexmap", "itertools 0.12.1", "log", "paste", @@ -1513,7 +1478,7 @@ dependencies = [ "half", "hashbrown 0.14.5", "hex", - "indexmap 2.6.0", + "indexmap", "itertools 0.12.1", "log", "paste", @@ -1571,7 +1536,7 @@ dependencies = [ "futures", "half", "hashbrown 0.14.5", - "indexmap 2.6.0", + "indexmap", "itertools 0.12.1", "log", "once_cell", @@ -1836,9 +1801,9 @@ dependencies = [ [[package]] name = "float-cmp" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" dependencies = [ "num-traits", ] @@ -2047,7 +2012,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.6.0", + "indexmap", "slab", "tokio", "tokio-util", @@ -2111,15 +2076,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.9" @@ -2341,16 +2297,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d39bd655c296413f6c62bdcad319927348d81a83242dc514f7a2d1cfd52faf1" -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - [[package]] name = "indexmap" version = "2.6.0" @@ -2735,7 +2681,7 @@ dependencies = [ "databento", "fallible-streaming-iterator", "hex", - "indexmap 2.6.0", + "indexmap", "itoa", "nautilus-common", "nautilus-core", @@ -2765,7 +2711,7 @@ dependencies = [ "anyhow", "chrono", "criterion", - "indexmap 2.6.0", + "indexmap", "nautilus-common", "nautilus-core", "nautilus-model", @@ -2805,7 +2751,7 @@ name = "nautilus-cli" version = "0.34.0" dependencies = [ "anyhow", - "clap 4.5.19", + "clap", "clap_derive", "dotenvy", "log", @@ -2825,7 +2771,7 @@ dependencies = [ "bytes", "cbindgen", "chrono", - "indexmap 2.6.0", + "indexmap", "itertools 0.12.1", "log", "nautilus-core", @@ -2859,7 +2805,7 @@ dependencies = [ "criterion", "heck 0.5.0", "iai", - "indexmap 2.6.0", + "indexmap", "pretty_assertions", "pyo3", "rmp-serde", @@ -2878,7 +2824,7 @@ dependencies = [ "chrono", "criterion", "derive_builder", - "indexmap 2.6.0", + "indexmap", "log", "nautilus-common", "nautilus-core", @@ -2903,7 +2849,7 @@ dependencies = [ "anyhow", "criterion", "derive_builder", - "indexmap 2.6.0", + "indexmap", "log", "nautilus-common", "nautilus-core", @@ -2975,7 +2921,7 @@ dependencies = [ "float-cmp", "iai", "implied-vol", - "indexmap 2.6.0", + "indexmap", "nautilus-adapters", "nautilus-core", "nautilus-test-kit", @@ -3349,12 +3295,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "os_str_bytes" -version = "6.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" - [[package]] name = "overload" version = "0.1.1" @@ -3484,7 +3424,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.6.0", + "indexmap", ] [[package]] @@ -3688,9 +3628,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -4186,9 +4126,9 @@ dependencies = [ [[package]] name = "rstest" -version = "0.21.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afd55a67069d6e434a95161415f5beeada95a01c7b815508a82dcb0e1593682" +checksum = "0a2c585be59b6b5dd66a9d2084aa1d8bd52fbdb806eafdeffb52791147862035" dependencies = [ "futures", "futures-timer", @@ -4198,9 +4138,9 @@ dependencies = [ [[package]] name = "rstest_macros" -version = "0.21.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4165dfae59a39dd41d8dec720d3cbfbc71f69744efb480a3920f5d4e0cc6798d" +checksum = "825ea780781b15345a146be27eaefb05085e337e869bff01b4306a4fd4a9ad5a" dependencies = [ "cfg-if", "glob", @@ -4474,6 +4414,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -4712,7 +4661,7 @@ dependencies = [ "hashbrown 0.14.5", "hashlink", "hex", - "indexmap 2.6.0", + "indexmap", "log", "memchr", "once_cell", @@ -4889,12 +4838,6 @@ dependencies = [ "unicode-properties", ] -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -4980,9 +4923,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.31.4" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "355dbe4f8799b304b05e1b0f05fc59b2a18d36645cf169607da45bde2f69a1be" +checksum = "e3b5ae3f4f7d64646c46c4cae4e3f01d1c5d255c7406fdd7c7f999a94e488791" dependencies = [ "core-foundation-sys", "libc", @@ -5061,21 +5004,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "textwrap" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" - [[package]] name = "thiserror" version = "1.0.64" @@ -5293,11 +5221,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.11" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", ] [[package]] @@ -5305,6 +5236,9 @@ name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -5312,7 +5246,9 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", + "indexmap", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] diff --git a/nautilus_core/Cargo.toml b/nautilus_core/Cargo.toml index 9f9c51f83a56..f00d4d7bcf21 100644 --- a/nautilus_core/Cargo.toml +++ b/nautilus_core/Cargo.toml @@ -60,14 +60,15 @@ uuid = { version = "1.10.0", features = ["v4"] } # dev-dependencies axum = "0.7.7" criterion = "0.5.1" -float-cmp = "0.9.0" +float-cmp = "0.10.0" iai = "0.1.1" pretty_assertions = "1.4.1" -rstest = "0.21.0" +proptest = "1.5.0" +rstest = "0.23.0" tempfile = "3.13.0" # build-dependencies -cbindgen = "0.26.0" +cbindgen = "0.27.0" [profile.dev] opt-level = 0 diff --git a/nautilus_core/common/Cargo.toml b/nautilus_core/common/Cargo.toml index 3458b5d9ad53..d24e0e29939f 100644 --- a/nautilus_core/common/Cargo.toml +++ b/nautilus_core/common/Cargo.toml @@ -33,11 +33,11 @@ tracing-subscriber = { version = "0.3.18", default-features = false, features = tracing = { workspace = true } ustr = { workspace = true } uuid = { workspace = true } -sysinfo = "0.31.4" +sysinfo = "0.32.0" [dev-dependencies] +proptest = { workspace = true } tempfile = { workspace = true } -proptest = "1.5.0" [build-dependencies] cbindgen = { workspace = true, optional = true } diff --git a/nautilus_trader/core/includes/backtest.h b/nautilus_trader/core/includes/backtest.h index 1b5e0a970d04..d91dbab4a1ba 100644 --- a/nautilus_trader/core/includes/backtest.h +++ b/nautilus_trader/core/includes/backtest.h @@ -1,4 +1,4 @@ -/* Generated with cbindgen:0.26.0 */ +/* Generated with cbindgen:0.27.0 */ /* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */ diff --git a/nautilus_trader/core/includes/common.h b/nautilus_trader/core/includes/common.h index e72d2ffa4b19..7295daa8e582 100644 --- a/nautilus_trader/core/includes/common.h +++ b/nautilus_trader/core/includes/common.h @@ -1,4 +1,4 @@ -/* Generated with cbindgen:0.26.0 */ +/* Generated with cbindgen:0.27.0 */ /* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */ diff --git a/nautilus_trader/core/includes/core.h b/nautilus_trader/core/includes/core.h index f73ee70d51c0..f9d5b3fcbca5 100644 --- a/nautilus_trader/core/includes/core.h +++ b/nautilus_trader/core/includes/core.h @@ -1,4 +1,4 @@ -/* Generated with cbindgen:0.26.0 */ +/* Generated with cbindgen:0.27.0 */ /* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */ diff --git a/nautilus_trader/core/includes/model.h b/nautilus_trader/core/includes/model.h index 9d674922a027..9a635d7ed7e1 100644 --- a/nautilus_trader/core/includes/model.h +++ b/nautilus_trader/core/includes/model.h @@ -1,4 +1,4 @@ -/* Generated with cbindgen:0.26.0 */ +/* Generated with cbindgen:0.27.0 */ /* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */ From 337a8fe5eb0fddd8a482ff2541f531617d077de9 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 06:06:03 +1100 Subject: [PATCH 019/224] Refine method naming --- nautilus_core/data/src/aggregation.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_core/data/src/aggregation.rs b/nautilus_core/data/src/aggregation.rs index 467cea88a786..f7dc0e97f75a 100644 --- a/nautilus_core/data/src/aggregation.rs +++ b/nautilus_core/data/src/aggregation.rs @@ -47,7 +47,7 @@ pub trait BarAggregator { /// Updates theaggregator with the given price and size. fn update(&mut self, price: Price, size: Quantity, ts_event: UnixNanos); /// Updates the aggregator with the given quote. - fn handle_quote_tick(&mut self, quote: QuoteTick) { + fn handle_quote(&mut self, quote: QuoteTick) { let spec = self.bar_type().spec(); self.update( @@ -57,7 +57,7 @@ pub trait BarAggregator { ); } /// Updates the aggregator with the given trade. - fn handle_trade_tick(&mut self, trade: TradeTick) { + fn handle_trade(&mut self, trade: TradeTick) { self.update(trade.price, trade.size, trade.ts_event); } } From ec10de7c39bb782dc18c032acf434d61c4d8c50a Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 06:31:10 +1100 Subject: [PATCH 020/224] Refine quote and trade related method naming --- nautilus_core/backtest/src/exchange.rs | 28 ++++++++-------- nautilus_core/backtest/src/matching_engine.rs | 18 +++++------ nautilus_core/common/src/cache/mod.rs | 32 +++++++++---------- nautilus_core/data/src/engine/mod.rs | 4 +-- nautilus_core/indicators/src/average/ama.rs | 16 +++++----- nautilus_core/indicators/src/average/dema.rs | 16 +++++----- nautilus_core/indicators/src/average/ema.rs | 20 ++++++------ nautilus_core/indicators/src/average/hma.rs | 12 +++---- nautilus_core/indicators/src/average/rma.rs | 20 ++++++------ nautilus_core/indicators/src/average/sma.rs | 20 ++++++------ nautilus_core/indicators/src/average/vidya.rs | 12 +++---- nautilus_core/indicators/src/average/wma.rs | 4 +-- nautilus_core/indicators/src/indicator.rs | 4 +-- .../indicators/src/momentum/aroon.rs | 8 ++--- nautilus_core/indicators/src/momentum/bb.rs | 10 +++--- nautilus_core/indicators/src/momentum/cmo.rs | 8 ++--- nautilus_core/indicators/src/momentum/macd.rs | 14 ++++---- nautilus_core/indicators/src/momentum/rsi.rs | 12 +++---- .../indicators/src/python/average/ama.rs | 8 ++--- .../indicators/src/python/average/dema.rs | 8 ++--- .../indicators/src/python/average/ema.rs | 8 ++--- .../indicators/src/python/average/hma.rs | 8 ++--- .../indicators/src/python/average/rma.rs | 8 ++--- .../indicators/src/python/average/sma.rs | 8 ++--- .../indicators/src/python/average/vidya.rs | 8 ++--- .../indicators/src/python/average/wma.rs | 8 ++--- .../indicators/src/python/momentum/amat.rs | 4 +-- .../indicators/src/python/momentum/aroon.rs | 4 +-- .../indicators/src/python/momentum/bb.rs | 8 ++--- .../indicators/src/python/momentum/bias.rs | 4 +-- .../indicators/src/python/momentum/cmo.rs | 4 +-- .../indicators/src/python/momentum/macd.rs | 4 +-- .../indicators/src/python/momentum/roc.rs | 4 +-- .../indicators/src/python/momentum/rsi.rs | 8 ++--- .../indicators/src/python/momentum/swings.rs | 4 +-- .../indicators/src/python/momentum/vhf.rs | 4 +-- .../src/python/ratio/spread_analyzer.rs | 2 +- .../indicators/src/python/volatility/atr.rs | 4 +-- .../indicators/src/python/volatility/rvi.rs | 4 +-- .../indicators/src/python/volatility/vr.rs | 4 +-- .../indicators/src/ratio/efficiency_ratio.rs | 12 +++---- .../indicators/src/ratio/spread_analyzer.rs | 16 +++++----- nautilus_core/indicators/src/stubs.rs | 4 +-- nautilus_core/model/src/ffi/data/quote.rs | 4 +-- nautilus_core/model/src/ffi/data/trade.rs | 4 +-- nautilus_core/model/src/ffi/orderbook/book.rs | 4 +-- nautilus_trader/core/includes/model.h | 6 ++-- nautilus_trader/core/rust/model.pxd | 6 ++-- 48 files changed, 220 insertions(+), 220 deletions(-) diff --git a/nautilus_core/backtest/src/exchange.rs b/nautilus_core/backtest/src/exchange.rs index e5728bb08d64..594ef45b3b76 100644 --- a/nautilus_core/backtest/src/exchange.rs +++ b/nautilus_core/backtest/src/exchange.rs @@ -353,15 +353,15 @@ impl SimulatedExchange { todo!("process order book deltas") } - pub fn process_quote_tick(&mut self, tick: &QuoteTick) { + pub fn process_quote_tick(&mut self, quote: &QuoteTick) { for module in &self.modules { - module.pre_process(Data::Quote(tick.to_owned())); + module.pre_process(Data::Quote(quote.to_owned())); } - if !self.matching_engines.contains_key(&tick.instrument_id) { + if !self.matching_engines.contains_key("e.instrument_id) { let instrument = { let cache = self.cache.as_ref().borrow(); - cache.instrument(&tick.instrument_id).cloned() + cache.instrument("e.instrument_id).cloned() }; if let Some(instrument) = instrument { @@ -369,27 +369,27 @@ impl SimulatedExchange { } else { panic!( "No matching engine found for instrument {}", - tick.instrument_id + quote.instrument_id ); } } - if let Some(matching_engine) = self.matching_engines.get_mut(&tick.instrument_id) { - matching_engine.process_quote_tick(tick); + if let Some(matching_engine) = self.matching_engines.get_mut("e.instrument_id) { + matching_engine.process_quote_tick(quote); } else { panic!("Matching engine should be initialized"); } } - pub fn process_trade_tick(&mut self, tick: &TradeTick) { + pub fn process_trade_tick(&mut self, trade: &TradeTick) { for module in &self.modules { - module.pre_process(Data::Trade(tick.to_owned())); + module.pre_process(Data::Trade(trade.to_owned())); } - if !self.matching_engines.contains_key(&tick.instrument_id) { + if !self.matching_engines.contains_key(&trade.instrument_id) { let instrument = { let cache = self.cache.as_ref().borrow(); - cache.instrument(&tick.instrument_id).cloned() + cache.instrument(&trade.instrument_id).cloned() }; if let Some(instrument) = instrument { @@ -397,13 +397,13 @@ impl SimulatedExchange { } else { panic!( "No matching engine found for instrument {}", - tick.instrument_id + trade.instrument_id ); } } - if let Some(matching_engine) = self.matching_engines.get_mut(&tick.instrument_id) { - matching_engine.process_trade_tick(tick); + if let Some(matching_engine) = self.matching_engines.get_mut(&trade.instrument_id) { + matching_engine.process_trade_tick(trade); } else { panic!("Matching engine should be initialized"); } diff --git a/nautilus_core/backtest/src/matching_engine.rs b/nautilus_core/backtest/src/matching_engine.rs index d064b7cf07ec..f4fc48d68fa3 100644 --- a/nautilus_core/backtest/src/matching_engine.rs +++ b/nautilus_core/backtest/src/matching_engine.rs @@ -269,14 +269,14 @@ impl OrderMatchingEngine { self.iterate(delta.ts_event); } - pub fn process_quote_tick(&mut self, tick: &QuoteTick) { - log::debug!("Processing {tick}"); + pub fn process_quote_tick(&mut self, quote: &QuoteTick) { + log::debug!("Processing {quote}"); if self.book_type == BookType::L1_MBP { - self.book.update_quote_tick(tick).unwrap(); + self.book.update_quote_tick(quote).unwrap(); } - self.iterate(tick.ts_event); + self.iterate(quote.ts_event); } pub fn process_bar(&mut self, bar: &Bar) { @@ -463,15 +463,15 @@ impl OrderMatchingEngine { self.last_bar_ask = None; } - pub fn process_trade_tick(&mut self, tick: &TradeTick) { - log::debug!("Processing {tick}"); + pub fn process_trade_tick(&mut self, trade: &TradeTick) { + log::debug!("Processing {trade}"); if self.book_type == BookType::L1_MBP { - self.book.update_trade_tick(tick).unwrap(); + self.book.update_trade_tick(trade).unwrap(); } - self.core.set_last_raw(tick.price); + self.core.set_last_raw(trade.price); - self.iterate(tick.ts_event); + self.iterate(trade.ts_event); } // -- TRADING COMMANDS ------------------------------------------------------------------------ diff --git a/nautilus_core/common/src/cache/mod.rs b/nautilus_core/common/src/cache/mod.rs index b79f94410eee..1086b6564b42 100644 --- a/nautilus_core/common/src/cache/mod.rs +++ b/nautilus_core/common/src/cache/mod.rs @@ -2430,7 +2430,7 @@ impl Cache { /// Gets all quote ticks for the given `instrument_id`. #[must_use] - pub fn quote_ticks(&self, instrument_id: &InstrumentId) -> Option> { + pub fn quotes(&self, instrument_id: &InstrumentId) -> Option> { self.quotes .get(instrument_id) .map(|quotes| quotes.iter().copied().collect()) @@ -2438,7 +2438,7 @@ impl Cache { /// Gets all trade ticks for the given `instrument_id`. #[must_use] - pub fn trade_ticks(&self, instrument_id: &InstrumentId) -> Option> { + pub fn trades(&self, instrument_id: &InstrumentId) -> Option> { self.trades .get(instrument_id) .map(|trades| trades.iter().copied().collect()) @@ -2460,7 +2460,7 @@ impl Cache { /// Gets a reference to the latest quote tick for the given `instrument_id`. #[must_use] - pub fn quote_tick(&self, instrument_id: &InstrumentId) -> Option<&QuoteTick> { + pub fn quote(&self, instrument_id: &InstrumentId) -> Option<&QuoteTick> { self.quotes .get(instrument_id) .and_then(|quotes| quotes.front()) @@ -2468,7 +2468,7 @@ impl Cache { /// Gets a refernece to the latest trade tick for the given `instrument_id`. #[must_use] - pub fn trade_tick(&self, instrument_id: &InstrumentId) -> Option<&TradeTick> { + pub fn trade(&self, instrument_id: &InstrumentId) -> Option<&TradeTick> { self.trades .get(instrument_id) .and_then(|trades| trades.front()) @@ -2488,7 +2488,7 @@ impl Cache { /// Gets the quote tick count for the given `instrument_id`. #[must_use] - pub fn quote_tick_count(&self, instrument_id: &InstrumentId) -> usize { + pub fn quote_count(&self, instrument_id: &InstrumentId) -> usize { self.quotes .get(instrument_id) .map_or(0, std::collections::VecDeque::len) @@ -2496,7 +2496,7 @@ impl Cache { /// Gets the trade tick count for the given `instrument_id`. #[must_use] - pub fn trade_tick_count(&self, instrument_id: &InstrumentId) -> usize { + pub fn trade_count(&self, instrument_id: &InstrumentId) -> usize { self.trades .get(instrument_id) .map_or(0, std::collections::VecDeque::len) @@ -2519,13 +2519,13 @@ impl Cache { /// Returns whether the cache contains quote ticks for the given `instrument_id`. #[must_use] pub fn has_quote_ticks(&self, instrument_id: &InstrumentId) -> bool { - self.quote_tick_count(instrument_id) > 0 + self.quote_count(instrument_id) > 0 } /// Returns whether the cache contains trade ticks for the given `instrument_id`. #[must_use] pub fn has_trade_ticks(&self, instrument_id: &InstrumentId) -> bool { - self.trade_tick_count(instrument_id) > 0 + self.trade_count(instrument_id) > 0 } /// Returns whether the cache contains bars for the given `bar_type`. @@ -3101,7 +3101,7 @@ mod tests { #[rstest] fn test_quote_tick_when_empty(cache: Cache, audusd_sim: CurrencyPair) { - let result = cache.quote_tick(&audusd_sim.id); + let result = cache.quote(&audusd_sim.id); assert!(result.is_none()); } @@ -3109,13 +3109,13 @@ mod tests { fn test_quote_tick_when_some(mut cache: Cache) { let quote = QuoteTick::default(); cache.add_quote(quote).unwrap(); - let result = cache.quote_tick("e.instrument_id); + let result = cache.quote("e.instrument_id); assert_eq!(result, Some("e)); } #[rstest] fn test_quote_ticks_when_empty(cache: Cache, audusd_sim: CurrencyPair) { - let result = cache.quote_ticks(&audusd_sim.id); + let result = cache.quotes(&audusd_sim.id); assert!(result.is_none()); } @@ -3127,13 +3127,13 @@ mod tests { QuoteTick::default(), ]; cache.add_quotes("es).unwrap(); - let result = cache.quote_ticks("es[0].instrument_id); + let result = cache.quotes("es[0].instrument_id); assert_eq!(result, Some(quotes)); } #[rstest] fn test_trade_tick_when_empty(cache: Cache, audusd_sim: CurrencyPair) { - let result = cache.trade_tick(&audusd_sim.id); + let result = cache.trade(&audusd_sim.id); assert!(result.is_none()); } @@ -3141,13 +3141,13 @@ mod tests { fn test_trade_tick_when_some(mut cache: Cache) { let trade = TradeTick::default(); cache.add_trade(trade).unwrap(); - let result = cache.trade_tick(&trade.instrument_id); + let result = cache.trade(&trade.instrument_id); assert_eq!(result, Some(&trade)); } #[rstest] fn test_trade_ticks_when_empty(cache: Cache, audusd_sim: CurrencyPair) { - let result = cache.trade_ticks(&audusd_sim.id); + let result = cache.trades(&audusd_sim.id); assert!(result.is_none()); } @@ -3159,7 +3159,7 @@ mod tests { TradeTick::default(), ]; cache.add_trades(&trades).unwrap(); - let result = cache.trade_ticks(&trades[0].instrument_id); + let result = cache.trades(&trades[0].instrument_id); assert_eq!(result, Some(trades)); } diff --git a/nautilus_core/data/src/engine/mod.rs b/nautilus_core/data/src/engine/mod.rs index 77a52bbee80b..1fe45ccdf747 100644 --- a/nautilus_core/data/src/engine/mod.rs +++ b/nautilus_core/data/src/engine/mod.rs @@ -1430,7 +1430,7 @@ mod tests { let cache = &data_engine.cache.borrow(); let messages = get_saved_messages::(handler); - assert_eq!(cache.quote_tick("e.instrument_id), Some(quote).as_ref()); + assert_eq!(cache.quote("e.instrument_id), Some(quote).as_ref()); assert_eq!(messages.len(), 1); assert!(messages.contains("e)); } @@ -1481,7 +1481,7 @@ mod tests { let cache = &data_engine.cache.borrow(); let messages = get_saved_messages::(handler); - assert_eq!(cache.trade_tick(&trade.instrument_id), Some(trade).as_ref()); + assert_eq!(cache.trade(&trade.instrument_id), Some(trade).as_ref()); assert_eq!(messages.len(), 1); assert!(messages.contains(&trade)); } diff --git a/nautilus_core/indicators/src/average/ama.rs b/nautilus_core/indicators/src/average/ama.rs index 2600b1e30ad0..ab7ff62f7dac 100644 --- a/nautilus_core/indicators/src/average/ama.rs +++ b/nautilus_core/indicators/src/average/ama.rs @@ -83,12 +83,12 @@ impl Indicator for AdaptiveMovingAverage { self.initialized } - fn handle_quote_tick(&mut self, tick: &QuoteTick) { - self.update_raw(tick.extract_price(self.price_type).into()); + fn handle_quote(&mut self, quote: &QuoteTick) { + self.update_raw(quote.extract_price(self.price_type).into()); } - fn handle_trade_tick(&mut self, tick: &TradeTick) { - self.update_raw((&tick.price).into()); + fn handle_trade(&mut self, trade: &TradeTick) { + self.update_raw((&trade.price).into()); } fn handle_bar(&mut self, bar: &Bar) { @@ -247,8 +247,8 @@ mod tests { } #[rstest] - fn test_handle_quote_tick(mut indicator_ama_10: AdaptiveMovingAverage, quote_tick: QuoteTick) { - indicator_ama_10.handle_quote_tick("e_tick); + fn test_handle_quote_tick(mut indicator_ama_10: AdaptiveMovingAverage, stub_quote: QuoteTick) { + indicator_ama_10.handle_quote(&stub_quote); assert!(indicator_ama_10.has_inputs); assert!(!indicator_ama_10.initialized); assert_eq!(indicator_ama_10.value, 1501.0); @@ -257,9 +257,9 @@ mod tests { #[rstest] fn test_handle_trade_tick_update( mut indicator_ama_10: AdaptiveMovingAverage, - trade_tick: TradeTick, + stub_trade: TradeTick, ) { - indicator_ama_10.handle_trade_tick(&trade_tick); + indicator_ama_10.handle_trade(&stub_trade); assert!(indicator_ama_10.has_inputs); assert!(!indicator_ama_10.initialized); assert_eq!(indicator_ama_10.value, 1500.0); diff --git a/nautilus_core/indicators/src/average/dema.rs b/nautilus_core/indicators/src/average/dema.rs index 981871fe9ae2..c90a953d89fb 100644 --- a/nautilus_core/indicators/src/average/dema.rs +++ b/nautilus_core/indicators/src/average/dema.rs @@ -66,11 +66,11 @@ impl Indicator for DoubleExponentialMovingAverage { self.initialized } - fn handle_quote_tick(&mut self, quote: &QuoteTick) { + fn handle_quote(&mut self, quote: &QuoteTick) { self.update_raw(quote.extract_price(self.price_type).into()); } - fn handle_trade_tick(&mut self, trade: &TradeTick) { + fn handle_trade(&mut self, trade: &TradeTick) { self.update_raw((&trade.price).into()); } @@ -176,20 +176,20 @@ mod tests { } #[rstest] - fn test_handle_quote_tick( + fn test_handle_quote( mut indicator_dema_10: DoubleExponentialMovingAverage, - quote_tick: QuoteTick, + stub_quote: QuoteTick, ) { - indicator_dema_10.handle_quote_tick("e_tick); + indicator_dema_10.handle_quote(&stub_quote); assert_eq!(indicator_dema_10.value, 1501.0); } #[rstest] - fn test_handle_trade_tick( + fn test_handle_trade( mut indicator_dema_10: DoubleExponentialMovingAverage, - trade_tick: TradeTick, + stub_trade: TradeTick, ) { - indicator_dema_10.handle_trade_tick(&trade_tick); + indicator_dema_10.handle_trade(&stub_trade); assert_eq!(indicator_dema_10.value, 1500.0); } diff --git a/nautilus_core/indicators/src/average/ema.rs b/nautilus_core/indicators/src/average/ema.rs index 72c3fbfbd91e..aaa71c874c5b 100644 --- a/nautilus_core/indicators/src/average/ema.rs +++ b/nautilus_core/indicators/src/average/ema.rs @@ -57,11 +57,11 @@ impl Indicator for ExponentialMovingAverage { self.initialized } - fn handle_quote_tick(&mut self, quote: &QuoteTick) { + fn handle_quote(&mut self, quote: &QuoteTick) { self.update_raw(quote.extract_price(self.price_type).into()); } - fn handle_trade_tick(&mut self, trade: &TradeTick) { + fn handle_trade(&mut self, trade: &TradeTick) { self.update_raw((&trade.price).into()); } @@ -187,29 +187,29 @@ mod tests { #[rstest] fn test_handle_quote_tick_single( indicator_ema_10: ExponentialMovingAverage, - quote_tick: QuoteTick, + stub_quote: QuoteTick, ) { let mut ema = indicator_ema_10; - ema.handle_quote_tick("e_tick); + ema.handle_quote(&stub_quote); assert!(ema.has_inputs()); assert_eq!(ema.value, 1501.0); } #[rstest] fn test_handle_quote_tick_multi(mut indicator_ema_10: ExponentialMovingAverage) { - let tick1 = quote_tick("1500.0", "1502.0"); - let tick2 = quote_tick("1502.0", "1504.0"); + let tick1 = stub_quote("1500.0", "1502.0"); + let tick2 = stub_quote("1502.0", "1504.0"); - indicator_ema_10.handle_quote_tick(&tick1); - indicator_ema_10.handle_quote_tick(&tick2); + indicator_ema_10.handle_quote(&tick1); + indicator_ema_10.handle_quote(&tick2); assert_eq!(indicator_ema_10.count, 2); assert_eq!(indicator_ema_10.value, 1_501.363_636_363_636_3); } #[rstest] - fn test_handle_trade_tick(indicator_ema_10: ExponentialMovingAverage, trade_tick: TradeTick) { + fn test_handle_trade_tick(indicator_ema_10: ExponentialMovingAverage, stub_trade: TradeTick) { let mut ema = indicator_ema_10; - ema.handle_trade_tick(&trade_tick); + ema.handle_trade(&stub_trade); assert!(ema.has_inputs()); assert_eq!(ema.value, 1500.0); } diff --git a/nautilus_core/indicators/src/average/hma.rs b/nautilus_core/indicators/src/average/hma.rs index 69ab215c559f..2a680deb428f 100644 --- a/nautilus_core/indicators/src/average/hma.rs +++ b/nautilus_core/indicators/src/average/hma.rs @@ -65,11 +65,11 @@ impl Indicator for HullMovingAverage { self.initialized } - fn handle_quote_tick(&mut self, quote: &QuoteTick) { + fn handle_quote(&mut self, quote: &QuoteTick) { self.update_raw(quote.extract_price(self.price_type).into()); } - fn handle_trade_tick(&mut self, trade: &TradeTick) { + fn handle_trade(&mut self, trade: &TradeTick) { self.update_raw((&trade.price).into()); } @@ -217,14 +217,14 @@ mod tests { } #[rstest] - fn test_handle_quote_tick(mut indicator_hma_10: HullMovingAverage, quote_tick: QuoteTick) { - indicator_hma_10.handle_quote_tick("e_tick); + fn test_handle_quote_tick(mut indicator_hma_10: HullMovingAverage, stub_quote: QuoteTick) { + indicator_hma_10.handle_quote(&stub_quote); assert_eq!(indicator_hma_10.value, 1501.0); } #[rstest] - fn test_handle_trade_tick(mut indicator_hma_10: HullMovingAverage, trade_tick: TradeTick) { - indicator_hma_10.handle_trade_tick(&trade_tick); + fn test_handle_trade_tick(mut indicator_hma_10: HullMovingAverage, stub_trade: TradeTick) { + indicator_hma_10.handle_trade(&stub_trade); assert_eq!(indicator_hma_10.value, 1500.0); } diff --git a/nautilus_core/indicators/src/average/rma.rs b/nautilus_core/indicators/src/average/rma.rs index c9d5dbe682c9..85c199635f6e 100644 --- a/nautilus_core/indicators/src/average/rma.rs +++ b/nautilus_core/indicators/src/average/rma.rs @@ -57,11 +57,11 @@ impl Indicator for WilderMovingAverage { self.initialized } - fn handle_quote_tick(&mut self, quote: &QuoteTick) { + fn handle_quote(&mut self, quote: &QuoteTick) { self.update_raw(quote.extract_price(self.price_type).into()); } - fn handle_trade_tick(&mut self, trade: &TradeTick) { + fn handle_trade(&mut self, trade: &TradeTick) { self.update_raw((&trade.price).into()); } @@ -189,28 +189,28 @@ mod tests { } #[rstest] - fn test_handle_quote_tick_single(indicator_rma_10: WilderMovingAverage, quote_tick: QuoteTick) { + fn test_handle_quote_tick_single(indicator_rma_10: WilderMovingAverage, stub_quote: QuoteTick) { let mut rma = indicator_rma_10; - rma.handle_quote_tick("e_tick); + rma.handle_quote(&stub_quote); assert!(rma.has_inputs()); assert_eq!(rma.value, 1501.0); } #[rstest] fn test_handle_quote_tick_multi(mut indicator_rma_10: WilderMovingAverage) { - let tick1 = quote_tick("1500.0", "1502.0"); - let tick2 = quote_tick("1502.0", "1504.0"); + let tick1 = stub_quote("1500.0", "1502.0"); + let tick2 = stub_quote("1502.0", "1504.0"); - indicator_rma_10.handle_quote_tick(&tick1); - indicator_rma_10.handle_quote_tick(&tick2); + indicator_rma_10.handle_quote(&tick1); + indicator_rma_10.handle_quote(&tick2); assert_eq!(indicator_rma_10.count, 2); assert_eq!(indicator_rma_10.value, 1_501.2); } #[rstest] - fn test_handle_trade_tick(indicator_rma_10: WilderMovingAverage, trade_tick: TradeTick) { + fn test_handle_trade_tick(indicator_rma_10: WilderMovingAverage, stub_trade: TradeTick) { let mut rma = indicator_rma_10; - rma.handle_trade_tick(&trade_tick); + rma.handle_trade(&stub_trade); assert!(rma.has_inputs()); assert_eq!(rma.value, 1500.0); } diff --git a/nautilus_core/indicators/src/average/sma.rs b/nautilus_core/indicators/src/average/sma.rs index 0d87277239f6..7fdfc2a5983a 100644 --- a/nautilus_core/indicators/src/average/sma.rs +++ b/nautilus_core/indicators/src/average/sma.rs @@ -56,11 +56,11 @@ impl Indicator for SimpleMovingAverage { self.initialized } - fn handle_quote_tick(&mut self, quote: &QuoteTick) { + fn handle_quote(&mut self, quote: &QuoteTick) { self.update_raw(quote.extract_price(self.price_type).into()); } - fn handle_trade_tick(&mut self, trade: &TradeTick) { + fn handle_trade(&mut self, trade: &TradeTick) { self.update_raw((&trade.price).into()); } @@ -174,9 +174,9 @@ mod tests { } #[rstest] - fn test_handle_quote_tick_single(indicator_sma_10: SimpleMovingAverage, quote_tick: QuoteTick) { + fn test_handle_quote_tick_single(indicator_sma_10: SimpleMovingAverage, stub_quote: QuoteTick) { let mut sma = indicator_sma_10; - sma.handle_quote_tick("e_tick); + sma.handle_quote(&stub_quote); assert_eq!(sma.count, 1); assert_eq!(sma.value, 1501.0); } @@ -184,19 +184,19 @@ mod tests { #[rstest] fn test_handle_quote_tick_multi(indicator_sma_10: SimpleMovingAverage) { let mut sma = indicator_sma_10; - let tick1 = quote_tick("1500.0", "1502.0"); - let tick2 = quote_tick("1502.0", "1504.0"); + let tick1 = stub_quote("1500.0", "1502.0"); + let tick2 = stub_quote("1502.0", "1504.0"); - sma.handle_quote_tick(&tick1); - sma.handle_quote_tick(&tick2); + sma.handle_quote(&tick1); + sma.handle_quote(&tick2); assert_eq!(sma.count, 2); assert_eq!(sma.value, 1502.0); } #[rstest] - fn test_handle_trade_tick(indicator_sma_10: SimpleMovingAverage, trade_tick: TradeTick) { + fn test_handle_trade_tick(indicator_sma_10: SimpleMovingAverage, stub_trade: TradeTick) { let mut sma = indicator_sma_10; - sma.handle_trade_tick(&trade_tick); + sma.handle_trade(&stub_trade); assert_eq!(sma.count, 1); assert_eq!(sma.value, 1500.0); } diff --git a/nautilus_core/indicators/src/average/vidya.rs b/nautilus_core/indicators/src/average/vidya.rs index 5be0b3c006cf..5a912df18567 100644 --- a/nautilus_core/indicators/src/average/vidya.rs +++ b/nautilus_core/indicators/src/average/vidya.rs @@ -63,11 +63,11 @@ impl Indicator for VariableIndexDynamicAverage { self.initialized } - fn handle_quote_tick(&mut self, quote: &QuoteTick) { + fn handle_quote(&mut self, quote: &QuoteTick) { self.update_raw(quote.extract_price(self.price_type).into()); } - fn handle_trade_tick(&mut self, trade: &TradeTick) { + fn handle_trade(&mut self, trade: &TradeTick) { self.update_raw((&trade.price).into()); } @@ -199,18 +199,18 @@ mod tests { #[rstest] fn test_handle_quote_tick( mut indicator_vidya_10: VariableIndexDynamicAverage, - quote_tick: QuoteTick, + stub_quote: QuoteTick, ) { - indicator_vidya_10.handle_quote_tick("e_tick); + indicator_vidya_10.handle_quote(&stub_quote); assert_eq!(indicator_vidya_10.value, 0.0); } #[rstest] fn test_handle_trade_tick( mut indicator_vidya_10: VariableIndexDynamicAverage, - trade_tick: TradeTick, + stub_trade: TradeTick, ) { - indicator_vidya_10.handle_trade_tick(&trade_tick); + indicator_vidya_10.handle_trade(&stub_trade); assert_eq!(indicator_vidya_10.value, 0.0); } diff --git a/nautilus_core/indicators/src/average/wma.rs b/nautilus_core/indicators/src/average/wma.rs index 4e5a0c896858..873581e1e67b 100644 --- a/nautilus_core/indicators/src/average/wma.rs +++ b/nautilus_core/indicators/src/average/wma.rs @@ -105,11 +105,11 @@ impl Indicator for WeightedMovingAverage { self.initialized } - fn handle_quote_tick(&mut self, quote: &QuoteTick) { + fn handle_quote(&mut self, quote: &QuoteTick) { self.update_raw(quote.extract_price(self.price_type).into()); } - fn handle_trade_tick(&mut self, trade: &TradeTick) { + fn handle_trade(&mut self, trade: &TradeTick) { self.update_raw((&trade.price).into()); } diff --git a/nautilus_core/indicators/src/indicator.rs b/nautilus_core/indicators/src/indicator.rs index 2b323baf0dd7..6b1758e96573 100644 --- a/nautilus_core/indicators/src/indicator.rs +++ b/nautilus_core/indicators/src/indicator.rs @@ -51,11 +51,11 @@ pub trait Indicator { panic!("`handle_book_mbo` {} `{}`", IMPL_ERR, self.name()); } - fn handle_quote_tick(&mut self, quote: &QuoteTick) { + fn handle_quote(&mut self, quote: &QuoteTick) { panic!("`handle_quote_tick` {} `{}`", IMPL_ERR, self.name()); } - fn handle_trade_tick(&mut self, trade: &TradeTick) { + fn handle_trade(&mut self, trade: &TradeTick) { panic!("`handle_trade_tick` {} `{}`", IMPL_ERR, self.name()); } diff --git a/nautilus_core/indicators/src/momentum/aroon.rs b/nautilus_core/indicators/src/momentum/aroon.rs index 68fe2b466100..7d9e26c0fa96 100644 --- a/nautilus_core/indicators/src/momentum/aroon.rs +++ b/nautilus_core/indicators/src/momentum/aroon.rs @@ -64,13 +64,13 @@ impl Indicator for AroonOscillator { self.initialized } - fn handle_quote_tick(&mut self, tick: &QuoteTick) { - let price = tick.extract_price(PriceType::Mid).into(); + fn handle_quote(&mut self, quote: &QuoteTick) { + let price = quote.extract_price(PriceType::Mid).into(); self.update_raw(price, price); } - fn handle_trade_tick(&mut self, tick: &TradeTick) { - let price = tick.price.into(); + fn handle_trade(&mut self, trade: &TradeTick) { + let price = trade.price.into(); self.update_raw(price, price); } diff --git a/nautilus_core/indicators/src/momentum/bb.rs b/nautilus_core/indicators/src/momentum/bb.rs index 2bc498bfce45..abbdedfab942 100644 --- a/nautilus_core/indicators/src/momentum/bb.rs +++ b/nautilus_core/indicators/src/momentum/bb.rs @@ -70,15 +70,15 @@ impl Indicator for BollingerBands { self.initialized } - fn handle_quote_tick(&mut self, tick: &QuoteTick) { - let bid = tick.bid_price.raw as f64; - let ask = tick.ask_price.raw as f64; + fn handle_quote(&mut self, quote: &QuoteTick) { + let bid = quote.bid_price.raw as f64; + let ask = quote.ask_price.raw as f64; let mid = (bid + ask) / 2.0; self.update_raw(ask, bid, mid); } - fn handle_trade_tick(&mut self, tick: &TradeTick) { - let price = tick.price.raw as f64; + fn handle_trade(&mut self, trade: &TradeTick) { + let price = trade.price.raw as f64; self.update_raw(price, price, price); } diff --git a/nautilus_core/indicators/src/momentum/cmo.rs b/nautilus_core/indicators/src/momentum/cmo.rs index 7969cc23fcf5..1c9da79d567b 100644 --- a/nautilus_core/indicators/src/momentum/cmo.rs +++ b/nautilus_core/indicators/src/momentum/cmo.rs @@ -59,11 +59,11 @@ impl Indicator for ChandeMomentumOscillator { self.initialized } - fn handle_quote_tick(&mut self, _tick: &QuoteTick) { + fn handle_quote(&mut self, _quote: &QuoteTick) { // Function body intentionally left blank. } - fn handle_trade_tick(&mut self, _tick: &TradeTick) { + fn handle_trade(&mut self, _trade: &TradeTick) { // Function body intentionally left blank. } @@ -201,8 +201,8 @@ mod tests { } #[rstest] - fn test_handle_quote_tick(mut cmo_10: ChandeMomentumOscillator, quote_tick: QuoteTick) { - cmo_10.handle_quote_tick("e_tick); + fn test_handle_quote_tick(mut cmo_10: ChandeMomentumOscillator, stub_quote: QuoteTick) { + cmo_10.handle_quote(&stub_quote); assert_eq!(cmo_10.count, 0); assert_eq!(cmo_10.value, 0.0); } diff --git a/nautilus_core/indicators/src/momentum/macd.rs b/nautilus_core/indicators/src/momentum/macd.rs index 4ab4207766bd..fbccf10d1183 100644 --- a/nautilus_core/indicators/src/momentum/macd.rs +++ b/nautilus_core/indicators/src/momentum/macd.rs @@ -71,12 +71,12 @@ impl Indicator for MovingAverageConvergenceDivergence { self.initialized } - fn handle_quote_tick(&mut self, quote: &QuoteTick) { + fn handle_quote(&mut self, quote: &QuoteTick) { self.update_raw(quote.extract_price(self.price_type).into()); } - fn handle_trade_tick(&mut self, tick: &TradeTick) { - self.update_raw((&tick.price).into()); + fn handle_trade(&mut self, trade: &TradeTick) { + self.update_raw((&trade.price).into()); } fn handle_bar(&mut self, bar: &Bar) { @@ -216,18 +216,18 @@ mod tests { #[rstest] fn test_handle_quote_tick( mut macd_10: MovingAverageConvergenceDivergence, - quote_tick: QuoteTick, + stub_quote: QuoteTick, ) { - macd_10.handle_quote_tick("e_tick); + macd_10.handle_quote(&stub_quote); assert_eq!(macd_10.value, 0.0); } #[rstest] fn test_handle_trade_tick( mut macd_10: MovingAverageConvergenceDivergence, - trade_tick: TradeTick, + stub_trade: TradeTick, ) { - macd_10.handle_trade_tick(&trade_tick); + macd_10.handle_trade(&stub_trade); assert_eq!(macd_10.value, 0.0); } diff --git a/nautilus_core/indicators/src/momentum/rsi.rs b/nautilus_core/indicators/src/momentum/rsi.rs index 09c1b67ab170..b67974b3e2b5 100644 --- a/nautilus_core/indicators/src/momentum/rsi.rs +++ b/nautilus_core/indicators/src/momentum/rsi.rs @@ -64,11 +64,11 @@ impl Indicator for RelativeStrengthIndex { self.initialized } - fn handle_quote_tick(&mut self, quote: &QuoteTick) { + fn handle_quote(&mut self, quote: &QuoteTick) { self.update_raw(quote.extract_price(PriceType::Mid).into()); } - fn handle_trade_tick(&mut self, trade: &TradeTick) { + fn handle_trade(&mut self, trade: &TradeTick) { self.update_raw((trade.price).into()); } @@ -225,15 +225,15 @@ mod tests { } #[rstest] - fn test_handle_quote_tick(mut rsi_10: RelativeStrengthIndex, quote_tick: QuoteTick) { - rsi_10.handle_quote_tick("e_tick); + fn test_handle_quote_tick(mut rsi_10: RelativeStrengthIndex, stub_quote: QuoteTick) { + rsi_10.handle_quote(&stub_quote); assert_eq!(rsi_10.count, 1); assert_eq!(rsi_10.value, 1.0); } #[rstest] - fn test_handle_trade_tick(mut rsi_10: RelativeStrengthIndex, trade_tick: TradeTick) { - rsi_10.handle_trade_tick(&trade_tick); + fn test_handle_trade_tick(mut rsi_10: RelativeStrengthIndex, stub_trade: TradeTick) { + rsi_10.handle_trade(&stub_trade); assert_eq!(rsi_10.count, 1); assert_eq!(rsi_10.value, 1.0); } diff --git a/nautilus_core/indicators/src/python/average/ama.rs b/nautilus_core/indicators/src/python/average/ama.rs index 9cecac7061cb..31feab8af866 100644 --- a/nautilus_core/indicators/src/python/average/ama.rs +++ b/nautilus_core/indicators/src/python/average/ama.rs @@ -77,13 +77,13 @@ impl AdaptiveMovingAverage { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, tick: &QuoteTick) { - self.py_update_raw(tick.extract_price(self.price_type).into()); + fn py_handle_quote_tick(&mut self, quote: &QuoteTick) { + self.py_update_raw(quote.extract_price(self.price_type).into()); } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, tick: &TradeTick) { - self.update_raw((&tick.price).into()); + fn py_handle_trade_tick(&mut self, trade: &TradeTick) { + self.update_raw((&trade.price).into()); } #[pyo3(name = "handle_bar")] diff --git a/nautilus_core/indicators/src/python/average/dema.rs b/nautilus_core/indicators/src/python/average/dema.rs index d7a099b37803..4e34182c4855 100644 --- a/nautilus_core/indicators/src/python/average/dema.rs +++ b/nautilus_core/indicators/src/python/average/dema.rs @@ -73,13 +73,13 @@ impl DoubleExponentialMovingAverage { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, tick: &QuoteTick) { - self.py_update_raw(tick.extract_price(self.price_type).into()); + fn py_handle_quote_tick(&mut self, quote: &QuoteTick) { + self.py_update_raw(quote.extract_price(self.price_type).into()); } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, tick: &TradeTick) { - self.update_raw((&tick.price).into()); + fn py_handle_trade_tick(&mut self, trade: &TradeTick) { + self.update_raw((&trade.price).into()); } #[pyo3(name = "handle_bar")] diff --git a/nautilus_core/indicators/src/python/average/ema.rs b/nautilus_core/indicators/src/python/average/ema.rs index 8c2916e5d4d5..92a4568df41b 100644 --- a/nautilus_core/indicators/src/python/average/ema.rs +++ b/nautilus_core/indicators/src/python/average/ema.rs @@ -79,13 +79,13 @@ impl ExponentialMovingAverage { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, tick: &QuoteTick) { - self.py_update_raw(tick.extract_price(self.price_type).into()); + fn py_handle_quote_tick(&mut self, quote: &QuoteTick) { + self.py_update_raw(quote.extract_price(self.price_type).into()); } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, tick: &TradeTick) { - self.update_raw((&tick.price).into()); + fn py_handle_trade_tick(&mut self, trade: &TradeTick) { + self.update_raw((&trade.price).into()); } #[pyo3(name = "handle_bar")] diff --git a/nautilus_core/indicators/src/python/average/hma.rs b/nautilus_core/indicators/src/python/average/hma.rs index 414675bfd1f6..11e28f5cf295 100644 --- a/nautilus_core/indicators/src/python/average/hma.rs +++ b/nautilus_core/indicators/src/python/average/hma.rs @@ -73,13 +73,13 @@ impl HullMovingAverage { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, tick: &QuoteTick) { - self.py_update_raw(tick.extract_price(self.price_type).into()); + fn py_handle_quote_tick(&mut self, quote: &QuoteTick) { + self.py_update_raw(quote.extract_price(self.price_type).into()); } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, tick: &TradeTick) { - self.update_raw((&tick.price).into()); + fn py_handle_trade_tick(&mut self, trade: &TradeTick) { + self.update_raw((&trade.price).into()); } #[pyo3(name = "handle_bar")] diff --git a/nautilus_core/indicators/src/python/average/rma.rs b/nautilus_core/indicators/src/python/average/rma.rs index 3c3f4f66462b..231a468ca147 100644 --- a/nautilus_core/indicators/src/python/average/rma.rs +++ b/nautilus_core/indicators/src/python/average/rma.rs @@ -79,13 +79,13 @@ impl WilderMovingAverage { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, tick: &QuoteTick) { - self.py_update_raw(tick.extract_price(self.price_type).into()); + fn py_handle_quote_tick(&mut self, quote: &QuoteTick) { + self.py_update_raw(quote.extract_price(self.price_type).into()); } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, tick: &TradeTick) { - self.update_raw((&tick.price).into()); + fn py_handle_trade_tick(&mut self, trade: &TradeTick) { + self.update_raw((&trade.price).into()); } #[pyo3(name = "handle_bar")] diff --git a/nautilus_core/indicators/src/python/average/sma.rs b/nautilus_core/indicators/src/python/average/sma.rs index b81681cd3794..c35c27027210 100644 --- a/nautilus_core/indicators/src/python/average/sma.rs +++ b/nautilus_core/indicators/src/python/average/sma.rs @@ -73,13 +73,13 @@ impl SimpleMovingAverage { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, tick: &QuoteTick) { - self.py_update_raw(tick.extract_price(self.price_type).into()); + fn py_handle_quote_tick(&mut self, quote: &QuoteTick) { + self.py_update_raw(quote.extract_price(self.price_type).into()); } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, tick: &TradeTick) { - self.update_raw((&tick.price).into()); + fn py_handle_trade_tick(&mut self, trade: &TradeTick) { + self.update_raw((&trade.price).into()); } #[pyo3(name = "handle_bar")] diff --git a/nautilus_core/indicators/src/python/average/vidya.rs b/nautilus_core/indicators/src/python/average/vidya.rs index c5269b698f34..df5a330671a0 100644 --- a/nautilus_core/indicators/src/python/average/vidya.rs +++ b/nautilus_core/indicators/src/python/average/vidya.rs @@ -92,13 +92,13 @@ impl VariableIndexDynamicAverage { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, tick: &QuoteTick) { - self.py_update_raw(tick.extract_price(self.price_type).into()); + fn py_handle_quote_tick(&mut self, quote: &QuoteTick) { + self.py_update_raw(quote.extract_price(self.price_type).into()); } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, tick: &TradeTick) { - self.update_raw((&tick.price).into()); + fn py_handle_trade_tick(&mut self, trade: &TradeTick) { + self.update_raw((&trade.price).into()); } #[pyo3(name = "handle_bar")] diff --git a/nautilus_core/indicators/src/python/average/wma.rs b/nautilus_core/indicators/src/python/average/wma.rs index 560e067b8291..bf772e9cdcfa 100644 --- a/nautilus_core/indicators/src/python/average/wma.rs +++ b/nautilus_core/indicators/src/python/average/wma.rs @@ -71,13 +71,13 @@ impl WeightedMovingAverage { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, tick: &QuoteTick) { - self.py_update_raw(tick.extract_price(self.price_type).into()); + fn py_handle_quote_tick(&mut self, quote: &QuoteTick) { + self.py_update_raw(quote.extract_price(self.price_type).into()); } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, tick: &TradeTick) { - self.update_raw((&tick.price).into()); + fn py_handle_trade_tick(&mut self, trade: &TradeTick) { + self.update_raw((&trade.price).into()); } #[pyo3(name = "handle_bar")] diff --git a/nautilus_core/indicators/src/python/momentum/amat.rs b/nautilus_core/indicators/src/python/momentum/amat.rs index 99947331b7d6..53ea712ab562 100644 --- a/nautilus_core/indicators/src/python/momentum/amat.rs +++ b/nautilus_core/indicators/src/python/momentum/amat.rs @@ -94,12 +94,12 @@ impl ArcherMovingAveragesTrends { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, _tick: &QuoteTick) { + fn py_handle_quote_tick(&mut self, _quote: &QuoteTick) { // Function body intentionally left blank. } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, _tick: &TradeTick) { + fn py_handle_trade_tick(&mut self, _trade: &TradeTick) { // Function body intentionally left blank. } diff --git a/nautilus_core/indicators/src/python/momentum/aroon.rs b/nautilus_core/indicators/src/python/momentum/aroon.rs index e22171b75fb9..5966fc3b74c9 100644 --- a/nautilus_core/indicators/src/python/momentum/aroon.rs +++ b/nautilus_core/indicators/src/python/momentum/aroon.rs @@ -84,12 +84,12 @@ impl AroonOscillator { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, _tick: &QuoteTick) { + fn py_handle_quote_tick(&mut self, _quote: &QuoteTick) { // Function body intentionally left blank. } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, _tick: &TradeTick) { + fn py_handle_trade_tick(&mut self, _trade: &TradeTick) { // Function body intentionally left blank. } diff --git a/nautilus_core/indicators/src/python/momentum/bb.rs b/nautilus_core/indicators/src/python/momentum/bb.rs index 4a14a8531468..9503bbf89856 100644 --- a/nautilus_core/indicators/src/python/momentum/bb.rs +++ b/nautilus_core/indicators/src/python/momentum/bb.rs @@ -84,13 +84,13 @@ impl BollingerBands { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, tick: &QuoteTick) { - self.handle_quote_tick(tick); + fn py_handle_quote_tick(&mut self, quote: &QuoteTick) { + self.handle_quote(quote); } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, tick: &TradeTick) { - self.handle_trade_tick(tick); + fn py_handle_trade_tick(&mut self, trade: &TradeTick) { + self.handle_trade(trade); } #[pyo3(name = "handle_bar")] diff --git a/nautilus_core/indicators/src/python/momentum/bias.rs b/nautilus_core/indicators/src/python/momentum/bias.rs index ebc252ecdb10..952306474449 100644 --- a/nautilus_core/indicators/src/python/momentum/bias.rs +++ b/nautilus_core/indicators/src/python/momentum/bias.rs @@ -72,12 +72,12 @@ impl Bias { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, _tick: &QuoteTick) { + fn py_handle_quote_tick(&mut self, _quote: &QuoteTick) { // Function body intentionally left blank. } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, _tick: &TradeTick) { + fn py_handle_trade_tick(&mut self, _trade: &TradeTick) { // Function body intentionally left blank. } diff --git a/nautilus_core/indicators/src/python/momentum/cmo.rs b/nautilus_core/indicators/src/python/momentum/cmo.rs index 18965e530811..17e75eb0ba36 100644 --- a/nautilus_core/indicators/src/python/momentum/cmo.rs +++ b/nautilus_core/indicators/src/python/momentum/cmo.rs @@ -70,12 +70,12 @@ impl ChandeMomentumOscillator { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, _tick: &QuoteTick) { + fn py_handle_quote_tick(&mut self, _quote: &QuoteTick) { // Function body intentionally left blank. } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, _tick: &TradeTick) { + fn py_handle_trade_tick(&mut self, _trade: &TradeTick) { // Function body intentionally left blank. } diff --git a/nautilus_core/indicators/src/python/momentum/macd.rs b/nautilus_core/indicators/src/python/momentum/macd.rs index 6af976d311db..274d07ef84da 100644 --- a/nautilus_core/indicators/src/python/momentum/macd.rs +++ b/nautilus_core/indicators/src/python/momentum/macd.rs @@ -93,8 +93,8 @@ impl MovingAverageConvergenceDivergence { } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, tick: &TradeTick) { - self.update_raw((&tick.price).into()); + fn py_handle_trade_tick(&mut self, trade: &TradeTick) { + self.update_raw((&trade.price).into()); } #[pyo3(name = "handle_bar")] diff --git a/nautilus_core/indicators/src/python/momentum/roc.rs b/nautilus_core/indicators/src/python/momentum/roc.rs index 997cc8f53005..dcc291cf6d8a 100644 --- a/nautilus_core/indicators/src/python/momentum/roc.rs +++ b/nautilus_core/indicators/src/python/momentum/roc.rs @@ -72,12 +72,12 @@ impl RateOfChange { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, _tick: &QuoteTick) { + fn py_handle_quote_tick(&mut self, _quote: &QuoteTick) { // Function body intentionally left blank. } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, _tick: &TradeTick) { + fn py_handle_trade_tick(&mut self, _trade: &TradeTick) { // Function body intentionally left blank. } diff --git a/nautilus_core/indicators/src/python/momentum/rsi.rs b/nautilus_core/indicators/src/python/momentum/rsi.rs index d70085f6ee28..75633a154901 100644 --- a/nautilus_core/indicators/src/python/momentum/rsi.rs +++ b/nautilus_core/indicators/src/python/momentum/rsi.rs @@ -71,8 +71,8 @@ impl RelativeStrengthIndex { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, tick: &QuoteTick) { - self.py_update_raw(tick.extract_price(PriceType::Mid).into()); + fn py_handle_quote_tick(&mut self, quote: &QuoteTick) { + self.py_update_raw(quote.extract_price(PriceType::Mid).into()); } #[pyo3(name = "handle_bar")] @@ -81,7 +81,7 @@ impl RelativeStrengthIndex { } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, tick: &TradeTick) { - self.update_raw((&tick.price).into()); + fn py_handle_trade_tick(&mut self, trade: &TradeTick) { + self.update_raw((&trade.price).into()); } } diff --git a/nautilus_core/indicators/src/python/momentum/swings.rs b/nautilus_core/indicators/src/python/momentum/swings.rs index 7ba7a95e0b55..3945e3979df1 100644 --- a/nautilus_core/indicators/src/python/momentum/swings.rs +++ b/nautilus_core/indicators/src/python/momentum/swings.rs @@ -120,12 +120,12 @@ impl Swings { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, _tick: &QuoteTick) { + fn py_handle_quote_tick(&mut self, _quote: &QuoteTick) { // Function body intentionally left blank. } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, _tick: &TradeTick) { + fn py_handle_trade_tick(&mut self, _trade: &TradeTick) { // Function body intentionally left blank. } diff --git a/nautilus_core/indicators/src/python/momentum/vhf.rs b/nautilus_core/indicators/src/python/momentum/vhf.rs index 27cab6a0fb04..304414a49a6a 100644 --- a/nautilus_core/indicators/src/python/momentum/vhf.rs +++ b/nautilus_core/indicators/src/python/momentum/vhf.rs @@ -68,12 +68,12 @@ impl VerticalHorizontalFilter { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, _tick: &QuoteTick) { + fn py_handle_quote_tick(&mut self, _quote: &QuoteTick) { // Function body intentionally left blank. } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, _tick: &TradeTick) { + fn py_handle_trade_tick(&mut self, _trade: &TradeTick) { // Function body intentionally left blank. } diff --git a/nautilus_core/indicators/src/python/ratio/spread_analyzer.rs b/nautilus_core/indicators/src/python/ratio/spread_analyzer.rs index 9880f5f9ae21..e5f76c0c733b 100644 --- a/nautilus_core/indicators/src/python/ratio/spread_analyzer.rs +++ b/nautilus_core/indicators/src/python/ratio/spread_analyzer.rs @@ -70,7 +70,7 @@ impl SpreadAnalyzer { #[pyo3(name = "handle_quote_tick")] fn py_handle_quote_tick(&mut self, quote: &QuoteTick) { - self.handle_quote_tick(quote); + self.handle_quote(quote); } #[pyo3(name = "reset")] diff --git a/nautilus_core/indicators/src/python/volatility/atr.rs b/nautilus_core/indicators/src/python/volatility/atr.rs index 5d598656190b..e9a3f92ceb92 100644 --- a/nautilus_core/indicators/src/python/volatility/atr.rs +++ b/nautilus_core/indicators/src/python/volatility/atr.rs @@ -80,12 +80,12 @@ impl AverageTrueRange { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, _tick: &QuoteTick) { + fn py_handle_quote_tick(&mut self, _quote: &QuoteTick) { // Function body intentionally left blank. } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, _tick: &TradeTick) { + fn py_handle_trade_tick(&mut self, _trade: &TradeTick) { // Function body intentionally left blank. } diff --git a/nautilus_core/indicators/src/python/volatility/rvi.rs b/nautilus_core/indicators/src/python/volatility/rvi.rs index 2677de9c4983..5c7f0d5e32b4 100644 --- a/nautilus_core/indicators/src/python/volatility/rvi.rs +++ b/nautilus_core/indicators/src/python/volatility/rvi.rs @@ -77,12 +77,12 @@ impl RelativeVolatilityIndex { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, _tick: &QuoteTick) { + fn py_handle_quote_tick(&mut self, _quote: &QuoteTick) { // Function body intentionally left blank. } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, _tick: &TradeTick) { + fn py_handle_trade_tick(&mut self, _trade: &TradeTick) { // Function body intentionally left blank. } diff --git a/nautilus_core/indicators/src/python/volatility/vr.rs b/nautilus_core/indicators/src/python/volatility/vr.rs index ebb056d546ca..4c2be590ade2 100644 --- a/nautilus_core/indicators/src/python/volatility/vr.rs +++ b/nautilus_core/indicators/src/python/volatility/vr.rs @@ -90,12 +90,12 @@ impl VolatilityRatio { } #[pyo3(name = "handle_quote_tick")] - fn py_handle_quote_tick(&mut self, tick: &QuoteTick) { + fn py_handle_quote_tick(&mut self, quote: &QuoteTick) { // Function body intentionally left blank. } #[pyo3(name = "handle_trade_tick")] - fn py_handle_trade_tick(&mut self, tick: &TradeTick) { + fn py_handle_trade_tick(&mut self, trade: &TradeTick) { // Function body intentionally left blank. } diff --git a/nautilus_core/indicators/src/ratio/efficiency_ratio.rs b/nautilus_core/indicators/src/ratio/efficiency_ratio.rs index 6dfad760d9d1..925dc8cdc1d0 100644 --- a/nautilus_core/indicators/src/ratio/efficiency_ratio.rs +++ b/nautilus_core/indicators/src/ratio/efficiency_ratio.rs @@ -60,11 +60,11 @@ impl Indicator for EfficiencyRatio { self.initialized } - fn handle_quote_tick(&mut self, quote: &QuoteTick) { + fn handle_quote(&mut self, quote: &QuoteTick) { self.update_raw(quote.extract_price(self.price_type).into()); } - fn handle_trade_tick(&mut self, trade: &TradeTick) { + fn handle_trade(&mut self, trade: &TradeTick) { self.update_raw((&trade.price).into()); } @@ -215,11 +215,11 @@ mod tests { #[rstest] fn test_handle_quote_tick(mut efficiency_ratio_10: EfficiencyRatio) { - let quote_tick1 = quote_tick("1500.0", "1502.0"); - let quote_tick2 = quote_tick("1502.0", "1504.0"); + let quote_tick1 = stub_quote("1500.0", "1502.0"); + let quote_tick2 = stub_quote("1502.0", "1504.0"); - efficiency_ratio_10.handle_quote_tick("e_tick1); - efficiency_ratio_10.handle_quote_tick("e_tick2); + efficiency_ratio_10.handle_quote("e_tick1); + efficiency_ratio_10.handle_quote("e_tick2); assert_eq!(efficiency_ratio_10.value, 1.0); } diff --git a/nautilus_core/indicators/src/ratio/spread_analyzer.rs b/nautilus_core/indicators/src/ratio/spread_analyzer.rs index 7b0093275f75..ad5fa4994fcd 100644 --- a/nautilus_core/indicators/src/ratio/spread_analyzer.rs +++ b/nautilus_core/indicators/src/ratio/spread_analyzer.rs @@ -63,8 +63,8 @@ impl Indicator for SpreadAnalyzer { self.initialized } - fn handle_quote_tick(&mut self, tick: &QuoteTick) { - if tick.instrument_id != self.instrument_id { + fn handle_quote(&mut self, quote: &QuoteTick) { + if quote.instrument_id != self.instrument_id { return; } @@ -76,8 +76,8 @@ impl Indicator for SpreadAnalyzer { } } - let bid: f64 = tick.bid_price.into(); - let ask: f64 = tick.ask_price.into(); + let bid: f64 = quote.bid_price.into(); + let ask: f64 = quote.ask_price.into(); let spread = ask - bid; self.current = spread; @@ -180,14 +180,14 @@ mod tests { "100.54", "100.56", ]; for i in 1..10 { - spread_analyzer_10.handle_quote_tick("e_tick(bid_price[i], ask_price[i])); + spread_analyzer_10.handle_quote(&stub_quote(bid_price[i], ask_price[i])); } assert!(!spread_analyzer_10.initialized); } #[rstest] fn test_value_with_one_input(mut spread_analyzer_10: SpreadAnalyzer) { - spread_analyzer_10.handle_quote_tick("e_tick("100.50", "100.55")); + spread_analyzer_10.handle_quote(&stub_quote("100.50", "100.55")); assert_eq!(spread_analyzer_10.average, 0.049_999_999_999_997_16); } @@ -205,7 +205,7 @@ mod tests { "100.54", "100.56", "100.59", "100.61", "100.63", "100.55", "100.57", ]; for i in 0..10 { - spread_analyzer_10.handle_quote_tick("e_tick(bid_price[i], ask_price[i])); + spread_analyzer_10.handle_quote(&stub_quote(bid_price[i], ask_price[i])); } assert_eq!(spread_analyzer_10.average, 0.050_000_000_000_001_9); @@ -215,7 +215,7 @@ mod tests { fn test_reset_successfully_returns_indicator_to_fresh_state( mut spread_analyzer_10: SpreadAnalyzer, ) { - spread_analyzer_10.handle_quote_tick("e_tick("100.50", "100.55")); + spread_analyzer_10.handle_quote(&stub_quote("100.50", "100.55")); spread_analyzer_10.reset(); assert!(!spread_analyzer_10.initialized()); assert_eq!(spread_analyzer_10.current, 0.0); diff --git a/nautilus_core/indicators/src/stubs.rs b/nautilus_core/indicators/src/stubs.rs index d32de51418fc..07007de64384 100644 --- a/nautilus_core/indicators/src/stubs.rs +++ b/nautilus_core/indicators/src/stubs.rs @@ -53,7 +53,7 @@ use crate::{ // Common //////////////////////////////////////////////////////////////////////////////// #[fixture] -pub fn quote_tick( +pub fn stub_quote( #[default("1500")] bid_price: &str, #[default("1502")] ask_price: &str, ) -> QuoteTick { @@ -69,7 +69,7 @@ pub fn quote_tick( } #[fixture] -pub fn trade_tick() -> TradeTick { +pub fn stub_trade() -> TradeTick { TradeTick { instrument_id: InstrumentId::from("ETHUSDT-PERP.BINANCE"), price: Price::from("1500.0000"), diff --git a/nautilus_core/model/src/ffi/data/quote.rs b/nautilus_core/model/src/ffi/data/quote.rs index 512129fc17d7..2df3a04d8fb5 100644 --- a/nautilus_core/model/src/ffi/data/quote.rs +++ b/nautilus_core/model/src/ffi/data/quote.rs @@ -74,6 +74,6 @@ pub extern "C" fn quote_tick_hash(delta: &QuoteTick) -> u64 { /// Returns a [`QuoteTick`] as a C string pointer. #[no_mangle] -pub extern "C" fn quote_tick_to_cstr(tick: &QuoteTick) -> *const c_char { - str_to_cstr(&tick.to_string()) +pub extern "C" fn quote_tick_to_cstr(quote: &QuoteTick) -> *const c_char { + str_to_cstr("e.to_string()) } diff --git a/nautilus_core/model/src/ffi/data/trade.rs b/nautilus_core/model/src/ffi/data/trade.rs index e53d4e79e958..4ed85da3eaea 100644 --- a/nautilus_core/model/src/ffi/data/trade.rs +++ b/nautilus_core/model/src/ffi/data/trade.rs @@ -65,6 +65,6 @@ pub extern "C" fn trade_tick_hash(delta: &TradeTick) -> u64 { /// Returns a [`TradeTick`] as a C string pointer. #[no_mangle] -pub extern "C" fn trade_tick_to_cstr(tick: &TradeTick) -> *const c_char { - str_to_cstr(&tick.to_string()) +pub extern "C" fn trade_tick_to_cstr(trade: &TradeTick) -> *const c_char { + str_to_cstr(&trade.to_string()) } diff --git a/nautilus_core/model/src/ffi/orderbook/book.rs b/nautilus_core/model/src/ffi/orderbook/book.rs index 8d03de8b30cd..b05ba1fc750c 100644 --- a/nautilus_core/model/src/ffi/orderbook/book.rs +++ b/nautilus_core/model/src/ffi/orderbook/book.rs @@ -264,8 +264,8 @@ pub extern "C" fn orderbook_update_quote_tick(book: &mut OrderBook_API, quote: & /// This function panics: /// - If book type is not `L1_MBP`. #[no_mangle] -pub extern "C" fn orderbook_update_trade_tick(book: &mut OrderBook_API, tick: &TradeTick) { - book.update_trade_tick(tick).unwrap(); +pub extern "C" fn orderbook_update_trade_tick(book: &mut OrderBook_API, trade: &TradeTick) { + book.update_trade_tick(trade).unwrap(); } #[no_mangle] diff --git a/nautilus_trader/core/includes/model.h b/nautilus_trader/core/includes/model.h index 9a635d7ed7e1..d9c0c68054f3 100644 --- a/nautilus_trader/core/includes/model.h +++ b/nautilus_trader/core/includes/model.h @@ -1726,7 +1726,7 @@ uint64_t quote_tick_hash(const struct QuoteTick_t *delta); /** * Returns a [`QuoteTick`] as a C string pointer. */ -const char *quote_tick_to_cstr(const struct QuoteTick_t *tick); +const char *quote_tick_to_cstr(const struct QuoteTick_t *quote); struct TradeTick_t trade_tick_new(struct InstrumentId_t instrument_id, int64_t price_raw, @@ -1745,7 +1745,7 @@ uint64_t trade_tick_hash(const struct TradeTick_t *delta); /** * Returns a [`TradeTick`] as a C string pointer. */ -const char *trade_tick_to_cstr(const struct TradeTick_t *tick); +const char *trade_tick_to_cstr(const struct TradeTick_t *trade); const char *account_type_to_cstr(enum AccountType value); @@ -2438,7 +2438,7 @@ void orderbook_update_quote_tick(struct OrderBook_API *book, const struct QuoteT * This function panics: * - If book type is not `L1_MBP`. */ -void orderbook_update_trade_tick(struct OrderBook_API *book, const struct TradeTick_t *tick); +void orderbook_update_trade_tick(struct OrderBook_API *book, const struct TradeTick_t *trade); CVec orderbook_simulate_fills(const struct OrderBook_API *book, struct BookOrder_t order); diff --git a/nautilus_trader/core/rust/model.pxd b/nautilus_trader/core/rust/model.pxd index 849200782f67..3d558c6fc23f 100644 --- a/nautilus_trader/core/rust/model.pxd +++ b/nautilus_trader/core/rust/model.pxd @@ -1064,7 +1064,7 @@ cdef extern from "../includes/model.h": uint64_t quote_tick_hash(const QuoteTick_t *delta); # Returns a [`QuoteTick`] as a C string pointer. - const char *quote_tick_to_cstr(const QuoteTick_t *tick); + const char *quote_tick_to_cstr(const QuoteTick_t *quote); TradeTick_t trade_tick_new(InstrumentId_t instrument_id, int64_t price_raw, @@ -1081,7 +1081,7 @@ cdef extern from "../includes/model.h": uint64_t trade_tick_hash(const TradeTick_t *delta); # Returns a [`TradeTick`] as a C string pointer. - const char *trade_tick_to_cstr(const TradeTick_t *tick); + const char *trade_tick_to_cstr(const TradeTick_t *trade); const char *account_type_to_cstr(AccountType value); @@ -1671,7 +1671,7 @@ cdef extern from "../includes/model.h": # # This function panics: # - If book type is not `L1_MBP`. - void orderbook_update_trade_tick(OrderBook_API *book, const TradeTick_t *tick); + void orderbook_update_trade_tick(OrderBook_API *book, const TradeTick_t *trade); CVec orderbook_simulate_fills(const OrderBook_API *book, BookOrder_t order); From 55a414dd505539f9ec503b8a8c0229d234b2e096 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 07:29:13 +1100 Subject: [PATCH 021/224] Add submit multiple limit orders test --- .../backtest/test_exchange_margin.py | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tests/unit_tests/backtest/test_exchange_margin.py b/tests/unit_tests/backtest/test_exchange_margin.py index c040b6dc52f9..d07d9208c82b 100644 --- a/tests/unit_tests/backtest/test_exchange_margin.py +++ b/tests/unit_tests/backtest/test_exchange_margin.py @@ -349,6 +349,31 @@ def test_submit_limit_order_with_immediate_modify( assert isinstance(self.strategy.store[3], OrderAccepted) assert isinstance(self.strategy.store[4], OrderUpdated) + def test_submit_multiple_limit_orders_then_accepts_both(self) -> None: + # Arrange + order1 = self.strategy.order_factory.limit( + _USDJPY_SIM.id, + OrderSide.BUY, + Quantity.from_int(100_000), + Price.from_str("110.010"), + ) + + order2 = self.strategy.order_factory.limit( + _USDJPY_SIM.id, + OrderSide.SELL, + Quantity.from_int(100_000), + Price.from_str("110.011"), + ) + + # Act + self.strategy.submit_order(order1) + self.strategy.submit_order(order2) + self.exchange.process(0) + + # Assert + assert order1.status == OrderStatus.ACCEPTED + assert order2.status == OrderStatus.ACCEPTED + @pytest.mark.parametrize( ("side", "price"), [ From 90d4f49504e34d257a1dc7f5c701c50fd4f3b839 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 07:59:08 +1100 Subject: [PATCH 022/224] Upgrade black --- .pre-commit-config.yaml | 2 +- poetry.lock | 52 ++++++++++++++++++++--------------------- pyproject.toml | 2 +- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 91664d919681..e98e2f67aef3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -74,7 +74,7 @@ repos: types: [python] - repo: https://github.com/psf/black - rev: 24.8.0 + rev: 24.10.0 hooks: - id: black types_or: [python, pyi] diff --git a/poetry.lock b/poetry.lock index bd69ed384895..ca0b65f88569 100644 --- a/poetry.lock +++ b/poetry.lock @@ -401,33 +401,33 @@ files = [ [[package]] name = "black" -version = "24.8.0" +version = "24.10.0" description = "The uncompromising code formatter." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, - {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, - {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, - {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, - {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, - {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, - {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, - {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, - {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, - {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, - {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, - {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, - {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, - {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, - {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, - {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, - {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, - {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, - {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, - {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, - {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, - {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, + {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"}, + {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"}, + {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"}, + {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"}, + {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"}, + {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"}, + {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"}, + {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"}, + {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"}, + {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"}, + {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"}, + {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"}, + {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"}, + {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"}, + {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"}, + {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"}, + {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"}, + {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"}, + {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"}, + {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"}, + {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"}, + {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"}, ] [package.dependencies] @@ -439,7 +439,7 @@ platformdirs = ">=2" [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -3875,4 +3875,4 @@ polymarket = ["py-clob-client"] [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.13" -content-hash = "1e55bb3fe81659413ac2d4f99805c05dd53544003bdca48808cb9775989cb4ab" +content-hash = "011483cdedbd9cd6487a57b1c3a1960fa92af03980d284b9d6e82f8f6b89b44a" diff --git a/pyproject.toml b/pyproject.toml index 915d69d50b0f..8329f3276975 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -87,7 +87,7 @@ polymarket = ["py-clob-client"] optional = true [tool.poetry.group.dev.dependencies] -black = "^24.8.0" +black = "^24.10.0" docformatter = "^1.7.5" mypy = "^1.11.2" pandas-stubs = "^2.2.2" From 669e2f66f84c4444ab04667952279a84a2d19875 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 08:27:53 +1100 Subject: [PATCH 023/224] Standardize numpydoc spec for type stubs --- nautilus_trader/core/nautilus_pyo3.pyi | 161 +++++++++++++++++-------- 1 file changed, 109 insertions(+), 52 deletions(-) diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index a4c2dfcbb0e5..093917d80392 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -3981,62 +3981,119 @@ class ImplyVolAndGreeksResult: theta: float -def black_scholes_greeks(s: float, r: float, b: float, sigma: float, is_call: bool, k: float, t: float, - multiplier: float) -> BlackScholesGreeksResult: +def black_scholes_greeks( + s: float, + r: float, + b: float, + sigma: float, + is_call: bool, + k: float, + t: float, + multiplier: float, +) -> BlackScholesGreeksResult: """ Calculate the Black-Scholes Greeks for a given option contract. - Args: - s (float): The current price of the underlying asset. - r (float): The risk-free interest rate. - b (float): The cost of carry of the underlying asset. - sigma (float): The volatility of the underlying asset. - is_call (bool): Whether the option is a call (True) or a put (False). - k (float): The strike price of the option. - t (float): The time to expiration of the option in years. - multiplier (float): The multiplier for the option contract. - - Returns: - BlackScholesGreeksResult: A named tuple containing the calculated option price, delta, gamma, vega, and theta. + Parameters + ---------- + s : float + The current price of the underlying asset. + r : float + The risk-free interest rate. + b : float + The cost of carry of the underlying asset. + sigma : float + The volatility of the underlying asset. + is_call : bool + Whether the option is a call (True) or a put (False). + k : float + The strike price of the option. + t : float + The time to expiration of the option in years. + multiplier : float + The multiplier for the option contract. + + Returns + ------- + BlackScholesGreeksResult + A named tuple containing the calculated option price, delta, gamma, vega, and theta. """ -def imply_vol(s: float, r: float, b: float, is_call: bool, k: float, t: float, price: float) -> float: +def imply_vol( + s: float, + r: float, + b: float, + is_call: bool, + k: float, + t: float, + price: float, +) -> float: """ Calculate the implied volatility and Greeks for an option contract. - Args: - s (float): The current price of the underlying asset. - r (float): The risk-free interest rate. - b (float): The cost of carry of the underlying asset. - is_call (bool): Whether the option is a call (True) or a put (False). - k (float): The strike price of the option. - t (float): The time to expiration of the option in years. - price (float): The current market price of the option. - multiplier (float): The multiplier for the option contract. - - Returns: - float: An implied volatility value. + Parameters + ---------- + s : float + The current price of the underlying asset. + r : float + The risk-free interest rate. + b : float + The cost of carry of the underlying asset. + is_call : bool + Whether the option is a call (True) or a put (False). + k : float + The strike price of the option. + t : float + The time to expiration of the option in years. + price : float + The current market price of the option. + multiplier : float + The multiplier for the option contract. + + Returns + ------- + float + An implied volatility value. """ -def imply_vol_and_greeks(s: float, r: float, b: float, is_call: bool, k: float, t: float, - price: float, multiplier: float) -> ImplyVolAndGreeksResult : +def imply_vol_and_greeks( + s: float, + r: float, + b: float, + is_call: bool, + k: float, + t: float, + price: float, + multiplier: float, +) -> ImplyVolAndGreeksResult : """ Calculate the implied volatility and Greeks for an option contract. - Args: - s (float): The current price of the underlying asset. - r (float): The risk-free interest rate. - b (float): The cost of carry of the underlying asset. - is_call (bool): Whether the option is a call (True) or a put (False). - k (float): The strike price of the option. - t (float): The time to expiration of the option in years. - price (float): The current market price of the option. - multiplier (float): The multiplier for the option contract. - - Returns: - ImplyVolAndGreeksResult: A named tuple containing the calculated implied volatility, option price, delta, gamma, vega, and theta. + Parameters + ---------- + s : float + The current price of the underlying asset. + r : float + The risk-free interest rate. + b : float + The cost of carry of the underlying asset. + is_call : bool + Whether the option is a call (True) or a put (False). + k : float + The strike price of the option. + t : float + The time to expiration of the option in years. + price : float + The current market price of the option. + multiplier : float + The multiplier for the option contract. + + Returns + ------- + ImplyVolAndGreeksResult + A named tuple containing the calculated implied volatility, option price, delta, gamma, vega, and theta """ @@ -4102,11 +4159,11 @@ class InterestRateData(Data): interest_rate: float def __init__( - self, - ts_event: int = 0, - ts_init: int = 0, - curve_name: str = "USD", - interest_rate: float = 0.05, + self, + ts_event: int = 0, + ts_init: int = 0, + curve_name: str = "USD", + interest_rate: float = 0.05, ): ... @@ -4116,12 +4173,12 @@ class InterestRateCurveData(Data): interest_rates: np.ndarray def __init__( - self, - ts_event: int, - ts_init: int, - curve_name: str, - tenors: np.ndarray, - interest_rates: np.ndarray, + self, + ts_event: int, + ts_init: int, + curve_name: str, + tenors: np.ndarray, + interest_rates: np.ndarray, ): ... ################################################################################################### From 102ea05fe3c0e7b767d895afe61c202566bab180 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 08:38:56 +1100 Subject: [PATCH 024/224] Update Databento docs with BBO schemas --- docs/integrations/databento.md | 6 ++++++ nautilus_core/adapters/src/databento/loader.rs | 5 ++++- nautilus_trader/adapters/databento/loaders.py | 4 +++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/docs/integrations/databento.md b/docs/integrations/databento.md index 3f85bf9df45c..a8c34c240c9c 100644 --- a/docs/integrations/databento.md +++ b/docs/integrations/databento.md @@ -63,6 +63,8 @@ The following Databento schemas are supported by NautilusTrader: | MBO | `OrderBookDelta` | | MBP_1 | `(QuoteTick, Option)` | | MBP_10 | `OrderBookDepth10` | +| BBO_1S | `QuoteTick` | +| BBO_1M | `QuoteTick` | | TBBO | `(QuoteTick, TradeTick)` | | TRADES | `TradeTick` | | OHLCV_1S | `Bar` | @@ -74,6 +76,10 @@ The following Databento schemas are supported by NautilusTrader: | STATISTICS | `DatabentoStatistics` | | STATUS | `InstrumentStatus` | +:::info +See also the Databento [Schemas and data formats](https://databento.com/docs/schemas-and-data-formats) guide. +::: + ## Instrument IDs and symbology Databento market data includes an `instrument_id` field which is an integer assigned diff --git a/nautilus_core/adapters/src/databento/loader.rs b/nautilus_core/adapters/src/databento/loader.rs index db90e5ded99f..ea51b4a593ee 100644 --- a/nautilus_core/adapters/src/databento/loader.rs +++ b/nautilus_core/adapters/src/databento/loader.rs @@ -48,6 +48,8 @@ use super::{ /// - MBO -> `OrderBookDelta` /// - MBP_1 -> `(QuoteTick, Option)` /// - MBP_10 -> `OrderBookDepth10` +/// - BBO_1S -> `QuoteTick` +/// - BBO_1M -> `QuoteTick` /// - TBBO -> `(QuoteTick, TradeTick)` /// - TRADES -> `TradeTick` /// - OHLCV_1S -> `Bar` @@ -60,7 +62,8 @@ use super::{ /// - STATUS -> `InstrumentStatus` /// /// # References -/// +/// +/// #[cfg_attr( feature = "python", pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.databento") diff --git a/nautilus_trader/adapters/databento/loaders.py b/nautilus_trader/adapters/databento/loaders.py index ea082c8cdc6d..1558b2dcdf88 100644 --- a/nautilus_trader/adapters/databento/loaders.py +++ b/nautilus_trader/adapters/databento/loaders.py @@ -36,6 +36,8 @@ class DatabentoDataLoader: - MBO -> `OrderBookDelta` - MBP_1 -> `(QuoteTick, TradeTick | None)` - MBP_10 -> `OrderBookDepth10` + - BBO_1S -> `QuoteTick` + - BBO_1M -> `QuoteTick` - TBBO -> `(QuoteTick, TradeTick)` - TRADES -> `TradeTick` - OHLCV_1S -> `Bar` @@ -49,7 +51,7 @@ class DatabentoDataLoader: References ---------- - https://databento.com/docs/knowledge-base/new-users/dbn-encoding + https://databento.com/docs/schemas-and-data-formats """ From e8abdf6e6aa1fe1ecfc8011648db16ef504eddbd Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 09:14:37 +1100 Subject: [PATCH 025/224] Standardize log message syntax in Rust --- RELEASES.md | 1 + nautilus_core/adapters/src/databento/live.rs | 6 +- .../adapters/src/databento/python/live.rs | 2 +- nautilus_core/backtest/src/exchange.rs | 5 +- nautilus_core/backtest/src/matching_engine.rs | 3 +- nautilus_core/cli/src/bin/cli.rs | 2 +- nautilus_core/common/src/cache/mod.rs | 156 +++++------------- nautilus_core/common/src/logging/writer.rs | 4 +- nautilus_core/common/src/throttler/mod.rs | 6 +- nautilus_core/common/src/timer.rs | 6 +- nautilus_core/execution/src/engine.rs | 2 +- .../infrastructure/src/redis/cache.rs | 6 +- .../infrastructure/src/redis/msgbus.rs | 14 +- .../infrastructure/src/sql/cache_database.rs | 138 ++++++---------- nautilus_core/infrastructure/src/sql/pg.rs | 101 ++++-------- nautilus_core/network/src/python/websocket.rs | 6 +- nautilus_core/network/src/websocket.rs | 2 +- 17 files changed, 155 insertions(+), 305 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index e7375bd9e5fa..dbe043427706 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -9,6 +9,7 @@ Released on TBD (UTC). ### Internal Improvements - Ported `Throttler` to Rust (#1988), thanks @Pushkarm029 and @twitu - Refined `WebSocketClient` to close existing tasks on reconnect (#1986), thanks @davidsblom +- Standardized log and error message syntax in Rust ### Breaking Changes None diff --git a/nautilus_core/adapters/src/databento/live.rs b/nautilus_core/adapters/src/databento/live.rs index dc3f506aea5b..a5c062d94069 100644 --- a/nautilus_core/adapters/src/databento/live.rs +++ b/nautilus_core/adapters/src/databento/live.rs @@ -147,7 +147,7 @@ impl DatabentoFeedHandler { match self.cmd_rx.try_recv() { Ok(cmd) => { - tracing::debug!("Received command: {:?}", cmd); + tracing::debug!("Received command: {cmd:?}"); match cmd { LiveCommand::Subscribe(sub) => { if !self.replay & sub.start.is_some() { @@ -269,10 +269,8 @@ impl DatabentoFeedHandler { // TODO: Temporary for debugging deltas_count += 1; tracing::trace!( - "Buffering delta: {} {} {:?} flags={}", - deltas_count, + "Buffering delta: {deltas_count} {} {buffering_start:?} flags={}", delta.ts_event, - buffering_start, msg.flags.raw(), ); diff --git a/nautilus_core/adapters/src/databento/python/live.rs b/nautilus_core/adapters/src/databento/python/live.rs index 3a1f03154b14..c2f9155ece03 100644 --- a/nautilus_core/adapters/src/databento/python/live.rs +++ b/nautilus_core/adapters/src/databento/python/live.rs @@ -62,7 +62,7 @@ impl DatabentoLiveClient { tracing::debug!("Processing messages..."); // Continue to process messages until channel is hung up while let Some(msg) = msg_rx.recv().await { - tracing::trace!("Received message: {:?}", msg); + tracing::trace!("Received message: {msg:?}"); let result = match msg { LiveMessage::Data(data) => Python::with_gil(|py| { let py_obj = data_to_pycapsule(py, data); diff --git a/nautilus_core/backtest/src/exchange.rs b/nautilus_core/backtest/src/exchange.rs index 594ef45b3b76..4fec326a1a69 100644 --- a/nautilus_core/backtest/src/exchange.rs +++ b/nautilus_core/backtest/src/exchange.rs @@ -208,10 +208,7 @@ impl SimulatedExchange { ); self.matching_engines.insert(instrument_id, matching_engine); - log::info!( - "Added instrument {} and created matching engine", - instrument_id - ); + log::info!("Added instrument {instrument_id} and created matching engine"); Ok(()) } diff --git a/nautilus_core/backtest/src/matching_engine.rs b/nautilus_core/backtest/src/matching_engine.rs index f4fc48d68fa3..6f7798d18083 100644 --- a/nautilus_core/backtest/src/matching_engine.rs +++ b/nautilus_core/backtest/src/matching_engine.rs @@ -545,9 +545,8 @@ impl OrderMatchingEngine { && parent_order.status() == OrderStatus::Triggered { log::info!( - "Pending OTO order {} triggers from {}", + "Pending OTO order {} triggers from {parent_order_id}", order.client_order_id(), - parent_order_id ); return; } diff --git a/nautilus_core/cli/src/bin/cli.rs b/nautilus_core/cli/src/bin/cli.rs index f83d1aa6d723..3d30cf95a7fe 100644 --- a/nautilus_core/cli/src/bin/cli.rs +++ b/nautilus_core/cli/src/bin/cli.rs @@ -25,6 +25,6 @@ async fn main() { .init() .unwrap(); if let Err(e) = nautilus_cli::run(NautilusCli::parse()).await { - log::error!("Error executing Nautilus CLI: {}", e); + log::error!("Error executing Nautilus CLI: {e}"); } } diff --git a/nautilus_core/common/src/cache/mod.rs b/nautilus_core/common/src/cache/mod.rs index 1086b6564b42..a64876489034 100644 --- a/nautilus_core/common/src/cache/mod.rs +++ b/nautilus_core/common/src/cache/mod.rs @@ -575,9 +575,7 @@ impl Cache { .contains_key(&account_id.get_issuer()) { log::error!( - "{} in accounts: {} not found in `self.index.venue_account`", - failure, - account_id + "{failure} in accounts: {account_id} not found in `self.index.venue_account`", ); error_count += 1; } @@ -586,41 +584,31 @@ impl Cache { for (client_order_id, order) in &self.orders { if !self.index.order_strategy.contains_key(client_order_id) { log::error!( - "{} in orders: {} not found in `self.index.order_strategy`", - failure, - client_order_id + "{failure} in orders: {client_order_id} not found in `self.index.order_strategy`" ); error_count += 1; } if !self.index.orders.contains(client_order_id) { log::error!( - "{} in orders: {} not found in `self.index.orders`", - failure, - client_order_id + "{failure} in orders: {client_order_id} not found in `self.index.orders`", ); error_count += 1; } if order.is_inflight() && !self.index.orders_inflight.contains(client_order_id) { log::error!( - "{} in orders: {} not found in `self.index.orders_inflight`", - failure, - client_order_id + "{failure} in orders: {client_order_id} not found in `self.index.orders_inflight`", ); error_count += 1; } if order.is_open() && !self.index.orders_open.contains(client_order_id) { log::error!( - "{} in orders: {} not found in `self.index.orders_open`", - failure, - client_order_id + "{failure} in orders: {client_order_id} not found in `self.index.orders_open`", ); error_count += 1; } if order.is_closed() && !self.index.orders_closed.contains(client_order_id) { log::error!( - "{} in orders: {} not found in `self.index.orders_closed`", - failure, - client_order_id + "{failure} in orders: {client_order_id} not found in `self.index.orders_closed`", ); error_count += 1; } @@ -631,9 +619,7 @@ impl Cache { .contains_key(&exec_algorithm_id) { log::error!( - "{} in orders: {} not found in `self.index.exec_algorithm_orders`", - failure, - exec_algorithm_id + "{failure} in orders: {client_order_id} not found in `self.index.exec_algorithm_orders`", ); error_count += 1; } @@ -641,9 +627,7 @@ impl Cache { && !self.index.exec_spawn_orders.contains_key(client_order_id) { log::error!( - "{} in orders: {} not found in `self.index.exec_spawn_orders`", - failure, - exec_algorithm_id + "{failure} in orders: {client_order_id} not found in `self.index.exec_spawn_orders`", ); error_count += 1; } @@ -653,41 +637,31 @@ impl Cache { for (position_id, position) in &self.positions { if !self.index.position_strategy.contains_key(position_id) { log::error!( - "{} in positions: {} not found in `self.index.position_strategy`", - failure, - position_id + "{failure} in positions: {position_id} not found in `self.index.position_strategy`", ); error_count += 1; } if !self.index.position_orders.contains_key(position_id) { log::error!( - "{} in positions: {} not found in `self.index.position_orders`", - failure, - position_id + "{failure} in positions: {position_id} not found in `self.index.position_orders`", ); error_count += 1; } if !self.index.positions.contains(position_id) { log::error!( - "{} in positions: {} not found in `self.index.positions`", - failure, - position_id + "{failure} in positions: {position_id} not found in `self.index.positions`", ); error_count += 1; } if position.is_open() && !self.index.positions_open.contains(position_id) { log::error!( - "{} in positions: {} not found in `self.index.positions_open`", - failure, - position_id + "{failure} in positions: {position_id} not found in `self.index.positions_open`", ); error_count += 1; } if position.is_closed() && !self.index.positions_closed.contains(position_id) { log::error!( - "{} in positions: {} not found in `self.index.positions_closed`", - failure, - position_id + "{failure} in positions: {position_id} not found in `self.index.positions_closed`", ); error_count += 1; } @@ -697,9 +671,7 @@ impl Cache { for account_id in self.index.venue_account.values() { if !self.accounts.contains_key(account_id) { log::error!( - "{} in `index.venue_account`: {} not found in `self.accounts`", - failure, - account_id + "{failure} in `index.venue_account`: {account_id} not found in `self.accounts`", ); error_count += 1; } @@ -708,9 +680,7 @@ impl Cache { for client_order_id in self.index.venue_order_ids.values() { if !self.orders.contains_key(client_order_id) { log::error!( - "{} in `index.venue_order_ids`: {} not found in `self.orders`", - failure, - client_order_id + "{failure} in `index.venue_order_ids`: {client_order_id} not found in `self.orders`", ); error_count += 1; } @@ -719,9 +689,7 @@ impl Cache { for client_order_id in self.index.client_order_ids.keys() { if !self.orders.contains_key(client_order_id) { log::error!( - "{} in `index.client_order_ids`: {} not found in `self.orders`", - failure, - client_order_id + "{failure} in `index.client_order_ids`: {client_order_id} not found in `self.orders`", ); error_count += 1; } @@ -730,9 +698,7 @@ impl Cache { for client_order_id in self.index.order_position.keys() { if !self.orders.contains_key(client_order_id) { log::error!( - "{} in `index.order_position`: {} not found in `self.orders`", - failure, - client_order_id + "{failure} in `index.order_position`: {client_order_id} not found in `self.orders`", ); error_count += 1; } @@ -742,9 +708,7 @@ impl Cache { for client_order_id in self.index.order_strategy.keys() { if !self.orders.contains_key(client_order_id) { log::error!( - "{} in `index.order_strategy`: {} not found in `self.orders`", - failure, - client_order_id + "{failure} in `index.order_strategy`: {client_order_id} not found in `self.orders`", ); error_count += 1; } @@ -753,9 +717,7 @@ impl Cache { for position_id in self.index.position_strategy.keys() { if !self.positions.contains_key(position_id) { log::error!( - "{} in `index.position_strategy`: {} not found in `self.positions`", - failure, - position_id + "{failure} in `index.position_strategy`: {position_id} not found in `self.positions`", ); error_count += 1; } @@ -764,9 +726,7 @@ impl Cache { for position_id in self.index.position_orders.keys() { if !self.positions.contains_key(position_id) { log::error!( - "{} in `index.position_orders`: {} not found in `self.positions`", - failure, - position_id + "{failure} in `index.position_orders`: {position_id} not found in `self.positions`", ); error_count += 1; } @@ -776,9 +736,7 @@ impl Cache { for client_order_id in client_order_ids { if !self.orders.contains_key(client_order_id) { log::error!( - "{} in `index.instrument_orders`: {} not found in `self.orders`", - failure, - instrument_id + "{failure} in `index.instrument_orders`: {instrument_id} not found in `self.orders`", ); error_count += 1; } @@ -788,9 +746,7 @@ impl Cache { for instrument_id in self.index.instrument_positions.keys() { if !self.index.instrument_orders.contains_key(instrument_id) { log::error!( - "{} in `index.instrument_positions`: {} not found in `index.instrument_orders`", - failure, - instrument_id + "{failure} in `index.instrument_positions`: {instrument_id} not found in `index.instrument_orders`", ); error_count += 1; } @@ -800,9 +756,7 @@ impl Cache { for client_order_id in client_order_ids { if !self.orders.contains_key(client_order_id) { log::error!( - "{} in `index.strategy_orders`: {} not found in `self.orders`", - failure, - client_order_id + "{failure} in `index.strategy_orders`: {client_order_id} not found in `self.orders`", ); error_count += 1; } @@ -813,9 +767,7 @@ impl Cache { for position_id in position_ids { if !self.positions.contains_key(position_id) { log::error!( - "{} in `index.strategy_positions`: {} not found in `self.positions`", - failure, - position_id + "{failure} in `index.strategy_positions`: {position_id} not found in `self.positions`", ); error_count += 1; } @@ -825,9 +777,7 @@ impl Cache { for client_order_id in &self.index.orders { if !self.orders.contains_key(client_order_id) { log::error!( - "{} in `index.orders`: {} not found in `self.orders`", - failure, - client_order_id + "{failure} in `index.orders`: {client_order_id} not found in `self.orders`", ); error_count += 1; } @@ -836,9 +786,7 @@ impl Cache { for client_order_id in &self.index.orders_emulated { if !self.orders.contains_key(client_order_id) { log::error!( - "{} in `index.orders_emulated`: {} not found in `self.orders`", - failure, - client_order_id + "{failure} in `index.orders_emulated`: {client_order_id} not found in `self.orders`", ); error_count += 1; } @@ -847,9 +795,7 @@ impl Cache { for client_order_id in &self.index.orders_inflight { if !self.orders.contains_key(client_order_id) { log::error!( - "{} in `index.orders_inflight`: {} not found in `self.orders`", - failure, - client_order_id + "{failure} in `index.orders_inflight`: {client_order_id} not found in `self.orders`", ); error_count += 1; } @@ -858,9 +804,7 @@ impl Cache { for client_order_id in &self.index.orders_open { if !self.orders.contains_key(client_order_id) { log::error!( - "{} in `index.orders_open`: {} not found in `self.orders`", - failure, - client_order_id + "{failure} in `index.orders_open`: {client_order_id} not found in `self.orders`", ); error_count += 1; } @@ -869,9 +813,7 @@ impl Cache { for client_order_id in &self.index.orders_closed { if !self.orders.contains_key(client_order_id) { log::error!( - "{} in `index.orders_closed`: {} not found in `self.orders`", - failure, - client_order_id + "{failure} in `index.orders_closed`: {client_order_id} not found in `self.orders`", ); error_count += 1; } @@ -880,9 +822,7 @@ impl Cache { for position_id in &self.index.positions { if !self.positions.contains_key(position_id) { log::error!( - "{} in `index.positions`: {} not found in `self.positions`", - failure, - position_id + "{failure} in `index.positions`: {position_id} not found in `self.positions`", ); error_count += 1; } @@ -891,9 +831,7 @@ impl Cache { for position_id in &self.index.positions_open { if !self.positions.contains_key(position_id) { log::error!( - "{} in `index.positions_open`: {} not found in `self.positions`", - failure, - position_id + "{failure} in `index.positions_open`: {position_id} not found in `self.positions`", ); error_count += 1; } @@ -902,9 +840,7 @@ impl Cache { for position_id in &self.index.positions_closed { if !self.positions.contains_key(position_id) { log::error!( - "{} in `index.positions_closed`: {} not found in `self.positions`", - failure, - position_id + "{failure} in `index.positions_closed`: {position_id} not found in `self.positions`", ); error_count += 1; } @@ -913,9 +849,7 @@ impl Cache { for strategy_id in &self.index.strategies { if !self.index.strategy_orders.contains_key(strategy_id) { log::error!( - "{} in `index.strategies`: {} not found in `index.strategy_orders`", - failure, - strategy_id + "{failure} in `index.strategies`: {strategy_id} not found in `index.strategy_orders`", ); error_count += 1; } @@ -928,9 +862,7 @@ impl Cache { .contains_key(exec_algorithm_id) { log::error!( - "{} in `index.exec_algorithms`: {} not found in `index.exec_algorithm_orders`", - failure, - exec_algorithm_id + "{failure} in `index.exec_algorithms`: {exec_algorithm_id} not found in `index.exec_algorithm_orders`", ); error_count += 1; } @@ -943,14 +875,12 @@ impl Cache { - timestamp_us; if error_count == 0 { - log::info!("Integrity check passed in {}μs", total_us); + log::info!("Integrity check passed in {total_us}μs"); true } else { log::error!( - "Integrity check failed with {} error{} in {}μs", - error_count, + "Integrity check failed with {error_count} error{} in {total_us}μs", if error_count == 1 { "" } else { "s" }, - total_us ); false } @@ -968,13 +898,13 @@ impl Cache { // Check for any open orders for order in self.orders_open(None, None, None, None) { residuals = true; - log::warn!("Residual {:?}", order); + log::warn!("Residual {order:?}"); } // Check for any open positions for position in self.positions_open(None, None, None, None) { residuals = true; - log::warn!("Residual {}", position); + log::warn!("Residual {position}"); } residuals @@ -1079,7 +1009,7 @@ impl Cache { check_slice_not_empty(quotes, stringify!(quotes)).unwrap(); let instrument_id = quotes[0].instrument_id; - log::debug!("Adding `QuoteTick`[{}] {}", quotes.len(), instrument_id); + log::debug!("Adding `QuoteTick`[{}] {instrument_id}", quotes.len()); if self.config.save_market_data { if let Some(database) = &mut self.database { @@ -1123,7 +1053,7 @@ impl Cache { check_slice_not_empty(trades, stringify!(trades)).unwrap(); let instrument_id = trades[0].instrument_id; - log::debug!("Adding `TradeTick`[{}] {}", trades.len(), instrument_id); + log::debug!("Adding `TradeTick`[{}] {instrument_id}", trades.len()); if self.config.save_market_data { if let Some(database) = &mut self.database { @@ -1167,7 +1097,7 @@ impl Cache { check_slice_not_empty(bars, stringify!(bars)).unwrap(); let bar_type = bars[0].bar_type; - log::debug!("Adding `Bar`[{}] {}", bars.len(), bar_type); + log::debug!("Adding `Bar`[{}] {bar_type}", bars.len()); if self.config.save_market_data { if let Some(database) = &mut self.database { @@ -1327,7 +1257,7 @@ impl Cache { .expect(FAILED); }; - log::debug!("Adding {:?}", order); + log::debug!("Adding {order:?}"); self.index.orders.insert(client_order_id); self.index @@ -1396,7 +1326,7 @@ impl Cache { // Index client ID if provided if let Some(client_id) = client_id { self.index.order_client.insert(client_order_id, client_id); - log::debug!("Indexed {:?}", client_id); + log::debug!("Indexed {client_id:?}"); } if let Some(database) = &mut self.database { diff --git a/nautilus_core/common/src/logging/writer.rs b/nautilus_core/common/src/logging/writer.rs index c4b33cf448f3..df98f0c36bd3 100644 --- a/nautilus_core/common/src/logging/writer.rs +++ b/nautilus_core/common/src/logging/writer.rs @@ -186,7 +186,7 @@ impl FileWriter { level: fileout_level, }), Err(e) => { - tracing::error!("Error creating log file: {}", e); + tracing::error!("Error creating log file: {e}"); None } } @@ -258,7 +258,7 @@ impl LogWriter for FileWriter { self.buf = BufWriter::new(file); self.path = file_path; } - Err(e) => tracing::error!("Error creating log file: {}", e), + Err(e) => tracing::error!("Error creating log file: {e}"), } } diff --git a/nautilus_core/common/src/throttler/mod.rs b/nautilus_core/common/src/throttler/mod.rs index 0e47c2919425..4435b3568c01 100644 --- a/nautilus_core/common/src/throttler/mod.rs +++ b/nautilus_core/common/src/throttler/mod.rs @@ -131,7 +131,7 @@ mod tests { #[fixture] pub fn test_throttler_buffered() -> TestThrottler { let output_send: Box = Box::new(|msg: u64| { - log::debug!("Sent: {}", msg); + log::debug!("Sent: {msg}"); }); let clock = Rc::new(RefCell::new(TestClock::new())); let inner_clock = Rc::clone(&clock); @@ -154,10 +154,10 @@ mod tests { #[fixture] pub fn test_throttler_unbuffered() -> TestThrottler { let output_send: Box = Box::new(|msg: u64| { - log::debug!("Sent: {}", msg); + log::debug!("Sent: {msg}"); }); let output_drop: Box = Box::new(|msg: u64| { - log::debug!("Dropped: {}", msg); + log::debug!("Dropped: {msg}"); }); let clock = Rc::new(RefCell::new(TestClock::new())); let inner_clock = Rc::clone(&clock); diff --git a/nautilus_core/common/src/timer.rs b/nautilus_core/common/src/timer.rs index 99b0b7cee162..a38587f13682 100644 --- a/nautilus_core/common/src/timer.rs +++ b/nautilus_core/common/src/timer.rs @@ -346,7 +346,7 @@ impl LiveTimer { // SAFETY: Guaranteed to be non-zero let interval_ns = NonZeroU64::new(std::cmp::max(interval_ns, 1)).unwrap(); - log::debug!("Creating timer '{}'", name); + log::debug!("Creating timer '{name}'"); Self { name: Ustr::from(name), interval_ns, @@ -459,7 +459,7 @@ impl LiveTimer { if !self.is_expired.load(atomic::Ordering::SeqCst) { if let Some(sender) = self.canceler.take() { // Send cancellation signal - sender.send(()).map_err(|e| anyhow::anyhow!("{:?}", e))?; + sender.send(()).map_err(|e| anyhow::anyhow!("{e:?}"))?; } } Ok(()) @@ -484,7 +484,7 @@ fn call_python_with_time_event( match callback.call1(py, (capsule,)) { Ok(_) => {} - Err(e) => tracing::error!("Error on callback: {:?}", e), + Err(e) => tracing::error!("Error on callback: {e:?}"), }; }); } diff --git a/nautilus_core/execution/src/engine.rs b/nautilus_core/execution/src/engine.rs index 43686c668718..97b7a427967d 100644 --- a/nautilus_core/execution/src/engine.rs +++ b/nautilus_core/execution/src/engine.rs @@ -149,7 +149,7 @@ where // -- COMMAND HANDLERS ---------------------------------------------------- fn execute_command(&self, command: TradingCommand) { - log::debug!("<--[CMD] {:?}", command); // TODO: Log constants + log::debug!("<--[CMD] {command:?}"); // TODO: Log constants let client = self .clients diff --git a/nautilus_core/infrastructure/src/redis/cache.rs b/nautilus_core/infrastructure/src/redis/cache.rs index dcff6130f423..475260864fde 100644 --- a/nautilus_core/infrastructure/src/redis/cache.rs +++ b/nautilus_core/infrastructure/src/redis/cache.rs @@ -175,7 +175,7 @@ impl RedisCacheDatabase { log::debug!("Awaiting task '{CACHE_WRITE}'"); tokio::task::block_in_place(|| { if let Err(e) = get_runtime().block_on(&mut self.handle) { - log::error!("Error awaiting task '{CACHE_WRITE}': {:?}", e); + log::error!("Error awaiting task '{CACHE_WRITE}': {e:?}"); } }); @@ -184,12 +184,12 @@ impl RedisCacheDatabase { pub fn flushdb(&mut self) { if let Err(e) = redis::cmd(REDIS_FLUSHDB).query::<()>(&mut self.con) { - log::error!("Failed to flush database: {:?}", e); + log::error!("Failed to flush database: {e:?}"); } } pub fn keys(&mut self, pattern: &str) -> anyhow::Result> { - let pattern = format!("{}{REDIS_DELIMITER}{}", self.trader_key, pattern); + let pattern = format!("{}{REDIS_DELIMITER}{pattern}", self.trader_key); log::debug!("Querying keys: {pattern}"); match self.con.keys(pattern) { Ok(keys) => Ok(keys), diff --git a/nautilus_core/infrastructure/src/redis/msgbus.rs b/nautilus_core/infrastructure/src/redis/msgbus.rs index 1bc1da62fc7b..38eeffa96b3b 100644 --- a/nautilus_core/infrastructure/src/redis/msgbus.rs +++ b/nautilus_core/infrastructure/src/redis/msgbus.rs @@ -379,12 +379,12 @@ pub async fn stream_messages( match decode_bus_message(array) { Ok(msg) => { if let Err(e) = tx.send(msg).await { - tracing::debug!("Channel closed: {:?}", e); + tracing::debug!("Channel closed: {e:?}"); break 'outer; // End streaming } } Err(e) => { - tracing::error!("{:?}", e); + tracing::error!("{e:?}"); continue; } } @@ -394,7 +394,7 @@ pub async fn stream_messages( } } Err(e) => { - return Err(anyhow::anyhow!("Error reading from stream: {:?}", e)); + return Err(anyhow::anyhow!("Error reading from stream: {e:?}")); } } } @@ -406,7 +406,7 @@ pub async fn stream_messages( fn decode_bus_message(stream_msg: &redis::Value) -> anyhow::Result { if let redis::Value::Array(stream_msg) = stream_msg { if stream_msg.len() < 4 { - anyhow::bail!("Invalid stream message format: {:?}", stream_msg); + anyhow::bail!("Invalid stream message format: {stream_msg:?}"); } let topic = match &stream_msg[1] { @@ -414,20 +414,20 @@ fn decode_bus_message(stream_msg: &redis::Value) -> anyhow::Result { String::from_utf8(bytes.clone()).expect("Error parsing topic") } _ => { - anyhow::bail!("Invalid topic format: {:?}", stream_msg); + anyhow::bail!("Invalid topic format: {stream_msg:?}"); } }; let payload = match &stream_msg[3] { redis::Value::BulkString(bytes) => Bytes::copy_from_slice(bytes), _ => { - anyhow::bail!("Invalid payload format: {:?}", stream_msg); + anyhow::bail!("Invalid payload format: {stream_msg:?}"); } }; Ok(BusMessage { topic, payload }) } else { - anyhow::bail!("Invalid stream message format: {:?}", stream_msg) + anyhow::bail!("Invalid stream message format: {stream_msg:?}") } } diff --git a/nautilus_core/infrastructure/src/sql/cache_database.rs b/nautilus_core/infrastructure/src/sql/cache_database.rs index e52ba4d68c34..a9dd8bb86e31 100644 --- a/nautilus_core/infrastructure/src/sql/cache_database.rs +++ b/nautilus_core/infrastructure/src/sql/cache_database.rs @@ -319,7 +319,7 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { tokio::spawn(async move { let result = pool.close().await; if let Err(e) = tx.send(()) { - log::error!("Failed to send close result: {:?}", e); + log::error!("Failed to send close result: {e:?}"); } }); Ok(rx.recv()?) @@ -331,7 +331,7 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { tokio::spawn(async move { let result = DatabaseQueries::truncate(&pool).await; if let Err(e) = tx.send(()) { - log::error!("Failed to send flush result: {:?}", e); + log::error!("Failed to send flush result: {e:?}"); } }); Ok(rx.recv()?) @@ -349,13 +349,13 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { .map(|(k, v)| (k, Bytes::from(v))) .collect(); if let Err(e) = tx.send(mapping) { - log::error!("Failed to send general items: {:?}", e); + log::error!("Failed to send general items: {e:?}"); } } Err(e) => { - log::error!("Failed to load general items: {:?}", e); + log::error!("Failed to load general items: {e:?}"); if let Err(e) = tx.send(HashMap::new()) { - log::error!("Failed to send empty general items: {:?}", e); + log::error!("Failed to send empty general items: {e:?}"); } } } @@ -375,13 +375,13 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { .map(|currency| (currency.code, currency)) .collect(); if let Err(e) = tx.send(mapping) { - log::error!("Failed to send currencies: {:?}", e); + log::error!("Failed to send currencies: {e:?}"); } } Err(e) => { - log::error!("Failed to load currencies: {:?}", e); + log::error!("Failed to load currencies: {e:?}"); if let Err(e) = tx.send(HashMap::new()) { - log::error!("Failed to send empty currencies: {:?}", e); + log::error!("Failed to send empty currencies: {e:?}"); } } } @@ -401,13 +401,13 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { .map(|instrument| (instrument.id(), instrument)) .collect(); if let Err(e) = tx.send(mapping) { - log::error!("Failed to send instruments: {:?}", e); + log::error!("Failed to send instruments: {e:?}"); } } Err(e) => { - log::error!("Failed to load instruments: {:?}", e); + log::error!("Failed to load instruments: {e:?}"); if let Err(e) = tx.send(HashMap::new()) { - log::error!("Failed to send empty instruments: {:?}", e); + log::error!("Failed to send empty instruments: {e:?}"); } } } @@ -431,13 +431,13 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { .map(|account| (account.id(), account)) .collect(); if let Err(e) = tx.send(mapping) { - log::error!("Failed to send accounts: {:?}", e); + log::error!("Failed to send accounts: {e:?}"); } } Err(e) => { - log::error!("Failed to load accounts: {:?}", e); + log::error!("Failed to load accounts: {e:?}"); if let Err(e) = tx.send(HashMap::new()) { - log::error!("Failed to send empty accounts: {:?}", e); + log::error!("Failed to send empty accounts: {e:?}"); } } } @@ -457,13 +457,13 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { .map(|order| (order.client_order_id(), order)) .collect(); if let Err(e) = tx.send(mapping) { - log::error!("Failed to send orders: {:?}", e); + log::error!("Failed to send orders: {e:?}"); } } Err(e) => { - log::error!("Failed to load orders: {:?}", e); + log::error!("Failed to load orders: {e:?}"); if let Err(e) = tx.send(HashMap::new()) { - log::error!("Failed to send empty orders: {:?}", e); + log::error!("Failed to send empty orders: {e:?}"); } } } @@ -487,19 +487,13 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { match result { Ok(currency) => { if let Err(e) = tx.send(currency) { - log::error!("Failed to send load_index_order_client result : {:?}", e); + log::error!("Failed to send load_index_order_client result: {e:?}"); } } Err(e) => { - log::error!( - "Failed to run query load_distinct_order_event_client_ids: {:?}", - e - ); + log::error!("Failed to run query load_distinct_order_event_client_ids: {e:?}"); if let Err(e) = tx.send(HashMap::new()) { - log::error!( - "Failed to send empty load_index_order_client result : {:?}", - e - ); + log::error!("Failed to send empty load_index_order_client result: {e:?}"); } } } @@ -516,13 +510,13 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { match result { Ok(currency) => { if let Err(e) = tx.send(currency) { - log::error!("Failed to send currency {}: {:?}", code, e); + log::error!("Failed to send currency {code}: {e:?}"); } } Err(e) => { - log::error!("Failed to load currency {}: {:?}", code, e); + log::error!("Failed to load currency {code}: {e:?}"); if let Err(e) = tx.send(None) { - log::error!("Failed to send None for currency {}: {:?}", code, e); + log::error!("Failed to send None for currency {code}: {e:?}"); } } } @@ -542,17 +536,13 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { match result { Ok(instrument) => { if let Err(e) = tx.send(instrument) { - log::error!("Failed to send instrument {}: {:?}", instrument_id, e); + log::error!("Failed to send instrument {instrument_id}: {e:?}"); } } Err(e) => { - log::error!("Failed to load instrument {}: {:?}", instrument_id, e); + log::error!("Failed to load instrument {instrument_id}: {e:?}"); if let Err(e) = tx.send(None) { - log::error!( - "Failed to send None for instrument {}: {:?}", - instrument_id, - e - ); + log::error!("Failed to send None for instrument {instrument_id}: {e:?}"); } } } @@ -576,13 +566,13 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { match result { Ok(account) => { if let Err(e) = tx.send(account) { - log::error!("Failed to send account {}: {:?}", account_id, e); + log::error!("Failed to send account {account_id}: {e:?}"); } } Err(e) => { - log::error!("Failed to load account {}: {:?}", account_id, e); + log::error!("Failed to load account {account_id}: {e:?}"); if let Err(e) = tx.send(None) { - log::error!("Failed to send None for account {}: {:?}", account_id, e); + log::error!("Failed to send None for account {account_id}: {e:?}"); } } } @@ -599,11 +589,11 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { match result { Ok(order) => { if let Err(e) = tx.send(order) { - log::error!("Failed to send order {}: {:?}", client_order_id, e); + log::error!("Failed to send order {client_order_id}: {e:?}"); } } Err(e) => { - log::error!("Failed to load order {}: {:?}", client_order_id, e); + log::error!("Failed to load order {client_order_id}: {e:?}"); let _ = tx.send(None); } } @@ -698,25 +688,15 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { let result = DatabaseQueries::load_quotes(&pool, &instrument_id).await; match result { Ok(quotes) => { - if let Err(er) = tx.send(quotes) { - log::error!( - "Failed to send quotes for instrument {}: {:?}", - instrument_id, - er - ); + if let Err(e) = tx.send(quotes) { + log::error!("Failed to send quotes for instrument {instrument_id}: {e:?}"); } } Err(e) => { - log::error!( - "Failed to load quotes for instrument {}: {:?}", - instrument_id, - e - ); + log::error!("Failed to load quotes for instrument {instrument_id}: {e:?}"); if let Err(e) = tx.send(Vec::new()) { log::error!( - "Failed to send empty quotes for instrument {}: {:?}", - instrument_id, - e + "Failed to send empty quotes for instrument {instrument_id}: {e:?}" ); } } @@ -727,8 +707,8 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { fn add_trade(&mut self, trade: &TradeTick) -> anyhow::Result<()> { let query = DatabaseQuery::AddTrade(trade.to_owned()); - self.tx.send(query).map_err(|err| { - anyhow::anyhow!("Failed to send query add_trade to database message handler: {err}") + self.tx.send(query).map_err(|e| { + anyhow::anyhow!("Failed to send query add_trade to database message handler: {e}") }) } @@ -741,24 +721,14 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { match result { Ok(trades) => { if let Err(e) = tx.send(trades) { - log::error!( - "Failed to send trades for instrument {}: {:?}", - instrument_id, - e - ); + log::error!("Failed to send trades for instrument {instrument_id}: {e:?}"); } } Err(e) => { - log::error!( - "Failed to load trades for instrument {}: {:?}", - instrument_id, - e - ); + log::error!("Failed to load trades for instrument {instrument_id}: {e:?}"); if let Err(e) = tx.send(Vec::new()) { log::error!( - "Failed to send empty trades for instrument {}: {:?}", - instrument_id, - e + "Failed to send empty trades for instrument {instrument_id}: {e:?}" ); } } @@ -769,8 +739,8 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { fn add_bar(&mut self, bar: &Bar) -> anyhow::Result<()> { let query = DatabaseQuery::AddBar(bar.to_owned()); - self.tx.send(query).map_err(|err| { - anyhow::anyhow!("Failed to send query add_bar to database message handler: {err}") + self.tx.send(query).map_err(|e| { + anyhow::anyhow!("Failed to send query add_bar to database message handler: {e}") }) } @@ -783,24 +753,14 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { match result { Ok(bars) => { if let Err(e) = tx.send(bars) { - log::error!( - "Failed to send bars for instrument {}: {:?}", - instrument_id, - e - ); + log::error!("Failed to send bars for instrument {instrument_id}: {e:?}"); } } Err(e) => { - log::error!( - "Failed to load bars for instrument {}: {:?}", - instrument_id, - e - ); + log::error!("Failed to load bars for instrument {instrument_id}: {e:?}"); if let Err(e) = tx.send(Vec::new()) { log::error!( - "Failed to send empty bars for instrument {}: {:?}", - instrument_id, - e + "Failed to send empty bars for instrument {instrument_id}: {e:?}" ); } } @@ -835,15 +795,15 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { fn update_account(&mut self, account: &AccountAny) -> anyhow::Result<()> { let query = DatabaseQuery::AddAccount(account.clone(), true); - self.tx.send(query).map_err(|err| { - anyhow::anyhow!("Failed to send query add_account to database message handler: {err}") + self.tx.send(query).map_err(|e| { + anyhow::anyhow!("Failed to send query add_account to database message handler: {e}") }) } fn update_order(&mut self, order: &OrderAny) -> anyhow::Result<()> { let query = DatabaseQuery::AddOrder(order.clone(), None, true); - self.tx.send(query).map_err(|err| { - anyhow::anyhow!("Failed to send query add_order to database message handler: {err}") + self.tx.send(query).map_err(|e| { + anyhow::anyhow!("Failed to send query add_order to database message handler: {e}") }) } diff --git a/nautilus_core/infrastructure/src/sql/pg.rs b/nautilus_core/infrastructure/src/sql/pg.rs index 2ff1a5e1e10b..4b0236bcec2f 100644 --- a/nautilus_core/infrastructure/src/sql/pg.rs +++ b/nautilus_core/infrastructure/src/sql/pg.rs @@ -145,20 +145,20 @@ pub async fn init_postgres( .await { Ok(_) => log::info!("Schema public created successfully"), - Err(e) => log::error!("Error creating schema public: {:?}", e), + Err(e) => log::error!("Error creating schema public: {e:?}"), } // Create role if not exists - match sqlx::query(format!("CREATE ROLE {} PASSWORD '{}' LOGIN;", database, password).as_str()) + match sqlx::query(format!("CREATE ROLE {database} PASSWORD '{password}' LOGIN;").as_str()) .execute(pg) .await { - Ok(_) => log::info!("Role {} created successfully", database), + Ok(_) => log::info!("Role {database} created successfully"), Err(e) => { if e.to_string().contains("already exists") { - log::info!("Role {} already exists", database); + log::info!("Role {database} already exists"); } else { - log::error!("Error creating role {}: {:?}", database, e); + log::error!("Error creating role {database}: {e:?}"); } } } @@ -169,7 +169,7 @@ pub async fn init_postgres( std::fs::read_dir(schema_dir)?.collect::, std::io::Error>>()?; for file in &mut sql_files { let file_name = file.file_name(); - log::info!("Executing schema file: {:?}", file_name); + log::info!("Executing schema file: {file_name:?}"); let file_path = file.path(); let sql_content = std::fs::read_to_string(file_path.clone())?; // if filename is functions.sql, split by plpgsql; if not then by ; @@ -180,20 +180,17 @@ pub async fn init_postgres( let sql_statements = sql_content .split(delimiter) .filter(|s| !s.trim().is_empty()) - .map(|s| format!("{}{}", s, delimiter)); + .map(|s| format!("{s}{delimiter}")); for sql_statement in sql_statements { sqlx::query(&sql_statement) .execute(pg) .await - .map_err(|err| { - if err.to_string().contains("already exists") { + .map_err(|e| { + if e.to_string().contains("already exists") { log::info!("Already exists error on statement, skipping"); } else { - panic!( - "Error executing statement {} with error: {:?}", - sql_statement, err - ) + panic!("Error executing statement {sql_statement} with error: {e:?}") } }) .unwrap(); @@ -205,25 +202,17 @@ pub async fn init_postgres( .execute(pg) .await { - Ok(_) => log::info!("Connect privileges granted to role {}", database), - Err(e) => log::error!( - "Error granting connect privileges to role {}: {:?}", - database, - e - ), + Ok(_) => log::info!("Connect privileges granted to role {database}"), + Err(e) => log::error!("Error granting connect privileges to role {database}: {e:?}"), } // Grant all schema privileges to the role - match sqlx::query(format!("GRANT ALL PRIVILEGES ON SCHEMA public TO {};", database).as_str()) + match sqlx::query(format!("GRANT ALL PRIVILEGES ON SCHEMA public TO {database};").as_str()) .execute(pg) .await { - Ok(_) => log::info!("All schema privileges granted to role {}", database), - Err(e) => log::error!( - "Error granting all privileges to role {}: {:?}", - database, - e - ), + Ok(_) => log::info!("All schema privileges granted to role {database}"), + Err(e) => log::error!("Error granting all privileges to role {database}: {e:?}"), } // Grant all table privileges to the role @@ -237,31 +226,19 @@ pub async fn init_postgres( .execute(pg) .await { - Ok(_) => log::info!("All tables privileges granted to role {}", database), - Err(e) => log::error!( - "Error granting all privileges to role {}: {:?}", - database, - e - ), + Ok(_) => log::info!("All tables privileges granted to role {database}"), + Err(e) => log::error!("Error granting all privileges to role {database}: {e:?}"), } // Grant all sequence privileges to the role match sqlx::query( - format!( - "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO {};", - database - ) - .as_str(), + format!("GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO {database};").as_str(), ) .execute(pg) .await { - Ok(_) => log::info!("All sequences privileges granted to role {}", database), - Err(e) => log::error!( - "Error granting all privileges to role {}: {:?}", - database, - e - ), + Ok(_) => log::info!("All sequences privileges granted to role {database}"), + Err(e) => log::error!("Error granting all privileges to role {database}: {e:?}"), } // Grant all function privileges to the role @@ -275,12 +252,8 @@ pub async fn init_postgres( .execute(pg) .await { - Ok(_) => log::info!("All functions privileges granted to role {}", database), - Err(e) => log::error!( - "Error granting all privileges to role {}: {:?}", - database, - e - ), + Ok(_) => log::info!("All functions privileges granted to role {database}"), + Err(e) => log::error!("Error granting all privileges to role {database}: {e:?}"), } Ok(()) @@ -288,12 +261,12 @@ pub async fn init_postgres( pub async fn drop_postgres(pg: &PgPool, database: String) -> anyhow::Result<()> { // Execute drop owned - match sqlx::query(format!("DROP OWNED BY {}", database).as_str()) + match sqlx::query(format!("DROP OWNED BY {database}").as_str()) .execute(pg) .await { - Ok(_) => log::info!("Dropped owned objects by role {}", database), - Err(e) => log::error!("Error dropping owned by role {}: {:?}", database, e), + Ok(_) => log::info!("Dropped owned objects by role {database}"), + Err(e) => log::error!("Error dropping owned by role {database}: {e:?}"), } // Revoke connect @@ -301,12 +274,8 @@ pub async fn drop_postgres(pg: &PgPool, database: String) -> anyhow::Result<()> .execute(pg) .await { - Ok(_) => log::info!("Revoked connect privileges from role {}", database), - Err(e) => log::error!( - "Error revoking connect privileges from role {}: {:?}", - database, - e - ), + Ok(_) => log::info!("Revoked connect privileges from role {database}"), + Err(e) => log::error!("Error revoking connect privileges from role {database}: {e:?}"), } // Revoke privileges @@ -314,12 +283,8 @@ pub async fn drop_postgres(pg: &PgPool, database: String) -> anyhow::Result<()> .execute(pg) .await { - Ok(_) => log::info!("Revoked all privileges from role {}", database), - Err(e) => log::error!( - "Error revoking all privileges from role {}: {:?}", - database, - e - ), + Ok(_) => log::info!("Revoked all privileges from role {database}"), + Err(e) => log::error!("Error revoking all privileges from role {database}: {e:?}"), } // Execute drop schema @@ -328,16 +293,16 @@ pub async fn drop_postgres(pg: &PgPool, database: String) -> anyhow::Result<()> .await { Ok(_) => log::info!("Dropped schema public"), - Err(e) => log::error!("Error dropping schema public: {:?}", e), + Err(e) => log::error!("Error dropping schema public: {e:?}"), } // Drop role - match sqlx::query(format!("DROP ROLE IF EXISTS {};", database).as_str()) + match sqlx::query(format!("DROP ROLE IF EXISTS {database};").as_str()) .execute(pg) .await { - Ok(_) => log::info!("Dropped role {}", database), - Err(e) => log::error!("Error dropping role {}: {:?}", database, e), + Ok(_) => log::info!("Dropped role {database}"), + Err(e) => log::error!("Error dropping role {database}: {e:?}"), } Ok(()) } diff --git a/nautilus_core/network/src/python/websocket.rs b/nautilus_core/network/src/python/websocket.rs index a18a065dc018..598342025aff 100644 --- a/nautilus_core/network/src/python/websocket.rs +++ b/nautilus_core/network/src/python/websocket.rs @@ -132,7 +132,7 @@ impl WebSocketClient { data: Vec, py: Python<'py>, ) -> PyResult> { - tracing::trace!("Sending binary: {:?}", data); + tracing::trace!("Sending binary: {data:?}"); let writer = slf.writer.clone(); pyo3_asyncio_0_21::tokio::future_into_py(py, async move { let mut guard = writer.lock().await; @@ -155,7 +155,7 @@ impl WebSocketClient { py: Python<'py>, ) -> PyResult> { let data = String::from_utf8(data).map_err(to_pyvalue_err)?; - tracing::trace!("Sending text: {}", data); + tracing::trace!("Sending text: {data}"); let writer = slf.writer.clone(); pyo3_asyncio_0_21::tokio::future_into_py(py, async move { let mut guard = writer.lock().await; @@ -178,7 +178,7 @@ impl WebSocketClient { py: Python<'py>, ) -> PyResult> { let data_str = String::from_utf8(data.clone()).map_err(to_pyvalue_err)?; - tracing::trace!("Sending pong: {}", data_str); + tracing::trace!("Sending pong: {data_str}"); let writer = slf.writer.clone(); pyo3_asyncio_0_21::tokio::future_into_py(py, async move { let mut guard = writer.lock().await; diff --git a/nautilus_core/network/src/websocket.rs b/nautilus_core/network/src/websocket.rs index d4c9c1da2f57..8902f56dcdfa 100644 --- a/nautilus_core/network/src/websocket.rs +++ b/nautilus_core/network/src/websocket.rs @@ -386,7 +386,7 @@ impl WebSocketClient { } pub async fn send_bytes(&self, data: Vec) -> Result<(), Error> { - tracing::trace!("Sending bytes: {:?}", data); + tracing::trace!("Sending bytes: {data:?}"); let mut guard = self.writer.lock().await; guard.send(Message::Binary(data)).await } From c624480d38698316b3b373b0d9e4127f1a725e55 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 09:20:19 +1100 Subject: [PATCH 026/224] Standardize error variable naming in Rust --- .../infrastructure/src/sql/cache_database.rs | 28 ++++----- .../infrastructure/src/sql/queries.rs | 60 +++++++++---------- nautilus_core/model/src/types/price.rs | 2 +- .../src/python/backend/transformer.rs | 6 +- 4 files changed, 47 insertions(+), 49 deletions(-) diff --git a/nautilus_core/infrastructure/src/sql/cache_database.rs b/nautilus_core/infrastructure/src/sql/cache_database.rs index a9dd8bb86e31..d291b6da2937 100644 --- a/nautilus_core/infrastructure/src/sql/cache_database.rs +++ b/nautilus_core/infrastructure/src/sql/cache_database.rs @@ -626,24 +626,22 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { fn add(&mut self, key: String, value: Bytes) -> anyhow::Result<()> { let query = DatabaseQuery::Add(key, value.into()); - self.tx.send(query).map_err(|err| { - anyhow::anyhow!("Failed to send query to database message handler: {err}") - }) + self.tx + .send(query) + .map_err(|e| anyhow::anyhow!("Failed to send query to database message handler: {e}")) } fn add_currency(&mut self, currency: &Currency) -> anyhow::Result<()> { let query = DatabaseQuery::AddCurrency(*currency); - self.tx.send(query).map_err(|err| { - anyhow::anyhow!("Failed to query add_currency to database message handler: {err}") + self.tx.send(query).map_err(|e| { + anyhow::anyhow!("Failed to query add_currency to database message handler: {e}") }) } fn add_instrument(&mut self, instrument: &InstrumentAny) -> anyhow::Result<()> { let query = DatabaseQuery::AddInstrument(instrument.clone()); - self.tx.send(query).map_err(|err| { - anyhow::anyhow!( - "Failed to send query add_instrument to database message handler: {err}" - ) + self.tx.send(query).map_err(|e| { + anyhow::anyhow!("Failed to send query add_instrument to database message handler: {e}") }) } @@ -653,15 +651,15 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { fn add_account(&mut self, account: &AccountAny) -> anyhow::Result<()> { let query = DatabaseQuery::AddAccount(account.clone(), false); - self.tx.send(query).map_err(|err| { - anyhow::anyhow!("Failed to send query add_account to database message handler: {err}") + self.tx.send(query).map_err(|e| { + anyhow::anyhow!("Failed to send query add_account to database message handler: {e}") }) } fn add_order(&mut self, order: &OrderAny, client_id: Option) -> anyhow::Result<()> { let query = DatabaseQuery::AddOrder(order.clone(), client_id, false); - self.tx.send(query).map_err(|err| { - anyhow::anyhow!("Failed to send query add_order to database message handler: {err}") + self.tx.send(query).map_err(|e| { + anyhow::anyhow!("Failed to send query add_order to database message handler: {e}") }) } @@ -675,8 +673,8 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { fn add_quote(&mut self, quote: &QuoteTick) -> anyhow::Result<()> { let query = DatabaseQuery::AddQuote(quote.to_owned()); - self.tx.send(query).map_err(|err| { - anyhow::anyhow!("Failed to send query add_quote to database message handler: {err}") + self.tx.send(query).map_err(|e| { + anyhow::anyhow!("Failed to send query add_quote to database message handler: {e}") }) } diff --git a/nautilus_core/infrastructure/src/sql/queries.rs b/nautilus_core/infrastructure/src/sql/queries.rs index 53b58e9997a3..afc23ffa1deb 100644 --- a/nautilus_core/infrastructure/src/sql/queries.rs +++ b/nautilus_core/infrastructure/src/sql/queries.rs @@ -53,7 +53,7 @@ impl DatabaseQueries { .execute(pool) .await .map(|_| ()) - .map_err(|err| anyhow::anyhow!("Failed to truncate tables: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to truncate tables: {e}")) } pub async fn add(pool: &PgPool, key: String, value: Vec) -> anyhow::Result<()> { @@ -63,7 +63,7 @@ impl DatabaseQueries { .execute(pool) .await .map(|_| ()) - .map_err(|err| anyhow::anyhow!("Failed to insert into general table: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to insert into general table: {e}")) } pub async fn load(pool: &PgPool) -> anyhow::Result>> { @@ -77,7 +77,7 @@ impl DatabaseQueries { } cache }) - .map_err(|err| anyhow::anyhow!("Failed to load general table: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to load general table: {e}")) } pub async fn add_currency(pool: &PgPool, currency: Currency) -> anyhow::Result<()> { @@ -92,7 +92,7 @@ impl DatabaseQueries { .execute(pool) .await .map(|_| ()) - .map_err(|err| anyhow::anyhow!("Failed to insert into currency table: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to insert into currency table: {e}")) } pub async fn load_currencies(pool: &PgPool) -> anyhow::Result> { @@ -100,7 +100,7 @@ impl DatabaseQueries { .fetch_all(pool) .await .map(|rows| rows.into_iter().map(|row| row.0).collect()) - .map_err(|err| anyhow::anyhow!("Failed to load currencies: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to load currencies: {e}")) } pub async fn load_currency(pool: &PgPool, code: &str) -> anyhow::Result> { @@ -109,7 +109,7 @@ impl DatabaseQueries { .fetch_optional(pool) .await .map(|currency| currency.map(|row| row.0)) - .map_err(|err| anyhow::anyhow!("Failed to load currency: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to load currency: {e}")) } pub async fn add_instrument( @@ -168,7 +168,7 @@ impl DatabaseQueries { .execute(pool) .await .map(|_| ()) - .map_err(|err| anyhow::anyhow!(format!("Failed to insert item {} into instrument table: {:?}", instrument.id().to_string(), err))) + .map_err(|e| anyhow::anyhow!(format!("Failed to insert item {} into instrument table: {:?}", instrument.id().to_string(), e))) } pub async fn load_instrument( @@ -180,8 +180,8 @@ impl DatabaseQueries { .fetch_optional(pool) .await .map(|instrument| instrument.map(|row| row.0)) - .map_err(|err| { - anyhow::anyhow!("Failed to load instrument with id {instrument_id},error is: {err}") + .map_err(|e| { + anyhow::anyhow!("Failed to load instrument with id {instrument_id},error is: {e}") }) } @@ -190,7 +190,7 @@ impl DatabaseQueries { .fetch_all(pool) .await .map(|rows| rows.into_iter().map(|row| row.0).collect()) - .map_err(|err| anyhow::anyhow!("Failed to load instruments: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to load instruments: {e}")) } pub async fn add_order( @@ -278,7 +278,7 @@ impl DatabaseQueries { .fetch_one(pool) .await .map(|row| row.get(0)) - .map_err(|err| anyhow::anyhow!("Failed to check if order initialized exists: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to check if order initialized exists: {e}")) } pub async fn check_if_account_event_exists( @@ -294,7 +294,7 @@ impl DatabaseQueries { .fetch_one(pool) .await .map(|row| row.get(0)) - .map_err(|err| anyhow::anyhow!("Failed to check if account event exists: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to check if account event exists: {e}")) } pub async fn add_order_event( @@ -315,7 +315,7 @@ impl DatabaseQueries { .execute(&mut *transaction) .await .map(|_| ()) - .map_err(|err| anyhow::anyhow!("Failed to insert into trader table: {err}"))?; + .map_err(|e| anyhow::anyhow!("Failed to insert into trader table: {e}"))?; // Insert client if it does not exist // TODO remove this when client initialization is implemented @@ -329,7 +329,7 @@ impl DatabaseQueries { .execute(&mut *transaction) .await .map(|_| ()) - .map_err(|err| anyhow::anyhow!("Failed to insert into client table: {err}"))?; + .map_err(|e| anyhow::anyhow!("Failed to insert into client table: {e}"))?; } sqlx::query(r#" @@ -399,11 +399,11 @@ impl DatabaseQueries { .execute(&mut *transaction) .await .map(|_| ()) - .map_err(|err| anyhow::anyhow!("Failed to insert into order_event table: {err}"))?; + .map_err(|e| anyhow::anyhow!("Failed to insert into order_event table: {e}"))?; transaction .commit() .await - .map_err(|err| anyhow::anyhow!("Failed to commit transaction: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to commit transaction: {e}")) } pub async fn load_order_events( @@ -415,7 +415,7 @@ impl DatabaseQueries { .fetch_all(pool) .await .map(|rows| rows.into_iter().map(|row| row.0).collect()) - .map_err(|err| anyhow::anyhow!("Failed to load order events: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to load order events: {e}")) } pub async fn load_order( @@ -450,7 +450,7 @@ impl DatabaseQueries { .map(|row| ClientOrderId::from(row.get::<&str, _>(0))) .collect() }) - .map_err(|err| anyhow::anyhow!("Failed to load order ids: {err}"))?; + .map_err(|e| anyhow::anyhow!("Failed to load order ids: {e}"))?; for id in client_order_ids { let order = DatabaseQueries::load_order(pool, &id).await.unwrap(); match order { @@ -491,7 +491,7 @@ impl DatabaseQueries { .execute(&mut *transaction) .await .map(|_| ()) - .map_err(|err| anyhow::anyhow!("Failed to insert into account table: {err}"))?; + .map_err(|e| anyhow::anyhow!("Failed to insert into account table: {e}"))?; let account_event = account.last_event().unwrap(); sqlx::query(r#" @@ -518,11 +518,11 @@ impl DatabaseQueries { .execute(&mut *transaction) .await .map(|_| ()) - .map_err(|err| anyhow::anyhow!("Failed to insert into account_event table: {err}"))?; + .map_err(|e| anyhow::anyhow!("Failed to insert into account_event table: {e}"))?; transaction .commit() .await - .map_err(|err| anyhow::anyhow!("Failed to commit add_account transaction: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to commit add_account transaction: {e}")) } pub async fn load_account_events( @@ -536,7 +536,7 @@ impl DatabaseQueries { .fetch_all(pool) .await .map(|rows| rows.into_iter().map(|row| row.0).collect()) - .map_err(|err| anyhow::anyhow!("Failed to load account events: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to load account events: {e}")) } pub async fn load_account( @@ -570,7 +570,7 @@ impl DatabaseQueries { .map(|row| AccountId::from(row.get::<&str, _>(0))) .collect() }) - .map_err(|err| anyhow::anyhow!("Failed to load account ids: {err}"))?; + .map_err(|e| anyhow::anyhow!("Failed to load account ids: {e}"))?; for id in account_ids { let account = DatabaseQueries::load_account(pool, &id).await.unwrap(); match account { @@ -609,7 +609,7 @@ impl DatabaseQueries { .execute(pool) .await .map(|_| ()) - .map_err(|err| anyhow::anyhow!("Failed to insert into trade table: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to insert into trade table: {e}")) } pub async fn load_trades( @@ -623,7 +623,7 @@ impl DatabaseQueries { .fetch_all(pool) .await .map(|rows| rows.into_iter().map(|row| row.0).collect()) - .map_err(|err| anyhow::anyhow!("Failed to load trades: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to load trades: {e}")) } pub async fn add_quote(pool: &PgPool, quote: &QuoteTick) -> anyhow::Result<()> { @@ -649,7 +649,7 @@ impl DatabaseQueries { .execute(pool) .await .map(|_| ()) - .map_err(|err| anyhow::anyhow!("Failed to insert into quote table: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to insert into quote table: {e}")) } pub async fn load_quotes( @@ -663,7 +663,7 @@ impl DatabaseQueries { .fetch_all(pool) .await .map(|rows| rows.into_iter().map(|row| row.0).collect()) - .map_err(|err| anyhow::anyhow!("Failed to load quotes: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to load quotes: {e}")) } pub async fn add_bar(pool: &PgPool, bar: &Bar) -> anyhow::Result<()> { @@ -695,7 +695,7 @@ impl DatabaseQueries { .execute(pool) .await .map(|_| ()) - .map_err(|err| anyhow::anyhow!("Failed to insert into bar table: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to insert into bar table: {e}")) } pub async fn load_bars( @@ -709,7 +709,7 @@ impl DatabaseQueries { .fetch_all(pool) .await .map(|rows| rows.into_iter().map(|row| row.0).collect()) - .map_err(|err| anyhow::anyhow!("Failed to load bars: {err}")) + .map_err(|e| anyhow::anyhow!("Failed to load bars: {e}")) } pub async fn load_distinct_order_event_client_ids( @@ -726,7 +726,7 @@ impl DatabaseQueries { ) .fetch_all(pool) .await - .map_err(|err| anyhow::anyhow!("Failed to load account ids: {err}"))?; + .map_err(|e| anyhow::anyhow!("Failed to load account ids: {e}"))?; for id in result { map.insert(id.order_id, id.client_id); } diff --git a/nautilus_core/model/src/types/price.rs b/nautilus_core/model/src/types/price.rs index 3a8f3a1d808b..6edd470556f3 100644 --- a/nautilus_core/model/src/types/price.rs +++ b/nautilus_core/model/src/types/price.rs @@ -201,7 +201,7 @@ impl FromStr for Price { let float_from_input = input .replace('_', "") .parse::() - .map_err(|err| format!("Error parsing `input` string '{input}' as f64: {err}"))?; + .map_err(|e| format!("Error parsing `input` string '{input}' as f64: {e}"))?; Ok(Self::new(float_from_input, precision_from_str(input))) } diff --git a/nautilus_core/persistence/src/python/backend/transformer.rs b/nautilus_core/persistence/src/python/backend/transformer.rs index c8fefefa71f9..eef1e0560d30 100644 --- a/nautilus_core/persistence/src/python/backend/transformer.rs +++ b/nautilus_core/persistence/src/python/backend/transformer.rs @@ -111,15 +111,15 @@ impl DataTransformer { let mut cursor = Cursor::new(Vec::new()); { let mut writer = StreamWriter::try_new(&mut cursor, &schema) - .map_err(|err| PyRuntimeError::new_err(format!("{err}")))?; + .map_err(|e| PyRuntimeError::new_err(format!("{e}")))?; writer .write(&batch) - .map_err(|err| PyRuntimeError::new_err(format!("{err}")))?; + .map_err(|e| PyRuntimeError::new_err(format!("{e}")))?; writer .finish() - .map_err(|err| PyRuntimeError::new_err(format!("{err}")))?; + .map_err(|e| PyRuntimeError::new_err(format!("{e}")))?; } let buffer = cursor.into_inner(); From 296841aa3ec5c2a5c2f6efd63baa99c66f1028d4 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 09:28:24 +1100 Subject: [PATCH 027/224] Standardize panic message syntax --- nautilus_core/indicators/src/indicator.rs | 14 +++++++------- .../infrastructure/src/sql/models/orders.rs | 5 +---- nautilus_core/model/src/orders/any.rs | 3 +-- nautilus_core/model/src/orders/limit.rs | 3 +-- nautilus_core/model/src/orders/limit_if_touched.rs | 3 +-- nautilus_core/model/src/orders/market.rs | 3 +-- .../model/src/orders/market_if_touched.rs | 3 +-- nautilus_core/model/src/orders/stop_limit.rs | 3 +-- .../model/src/orders/trailing_stop_limit.rs | 3 +-- .../model/src/orders/trailing_stop_market.rs | 3 +-- 10 files changed, 16 insertions(+), 27 deletions(-) diff --git a/nautilus_core/indicators/src/indicator.rs b/nautilus_core/indicators/src/indicator.rs index 6b1758e96573..e35d2d417056 100644 --- a/nautilus_core/indicators/src/indicator.rs +++ b/nautilus_core/indicators/src/indicator.rs @@ -36,31 +36,31 @@ pub trait Indicator { fn initialized(&self) -> bool; fn handle_delta(&mut self, delta: &OrderBookDelta) { - panic!("`handle_delta` {} `{}`", IMPL_ERR, self.name()); + panic!("`handle_delta` {IMPL_ERR} `{}`", self.name()); } fn handle_deltas(&mut self, deltas: &OrderBookDeltas) { - panic!("`handle_deltas` {} `{}`", IMPL_ERR, self.name()); + panic!("`handle_deltas` {IMPL_ERR} `{}`", self.name()); } fn handle_depth(&mut self, depth: &OrderBookDepth10) { - panic!("`handle_depth` {} `{}`", IMPL_ERR, self.name()); + panic!("`handle_depth` {IMPL_ERR} `{}`", self.name()); } fn handle_book(&mut self, book: &OrderBook) { - panic!("`handle_book_mbo` {} `{}`", IMPL_ERR, self.name()); + panic!("`handle_book_mbo` {IMPL_ERR} `{}`", self.name()); } fn handle_quote(&mut self, quote: &QuoteTick) { - panic!("`handle_quote_tick` {} `{}`", IMPL_ERR, self.name()); + panic!("`handle_quote_tick` {IMPL_ERR} `{}`", self.name()); } fn handle_trade(&mut self, trade: &TradeTick) { - panic!("`handle_trade_tick` {} `{}`", IMPL_ERR, self.name()); + panic!("`handle_trade_tick` {IMPL_ERR} `{}`", self.name()); } fn handle_bar(&mut self, bar: &Bar) { - panic!("`handle_bar` {} `{}`", IMPL_ERR, self.name()); + panic!("`handle_bar` {IMPL_ERR} `{}`", self.name()); } fn reset(&mut self); diff --git a/nautilus_core/infrastructure/src/sql/models/orders.rs b/nautilus_core/infrastructure/src/sql/models/orders.rs index 67102ebb20bb..d9dd34d8a303 100644 --- a/nautilus_core/infrastructure/src/sql/models/orders.rs +++ b/nautilus_core/infrastructure/src/sql/models/orders.rs @@ -105,10 +105,7 @@ impl<'r> FromRow<'r, PgRow> for OrderEventAnyModel { let model = OrderUpdatedModel::from_row(row)?; Ok(OrderEventAnyModel(OrderEventAny::Updated(model.0))) } else { - panic!( - "Unknown order event kind: {} in Postgres transformation", - kind - ) + panic!("Unknown order event kind: {kind} in Postgres transformation",) } } } diff --git a/nautilus_core/model/src/orders/any.rs b/nautilus_core/model/src/orders/any.rs index 00d35f950bdf..8c9167f51dbb 100644 --- a/nautilus_core/model/src/orders/any.rs +++ b/nautilus_core/model/src/orders/any.rs @@ -686,9 +686,8 @@ impl AsRef for OrderAny { match self { OrderAny::StopMarket(ref order) => order, _ => panic!( - "Invalid `OrderAny` not `{}`, was {:?}", + "Invalid `OrderAny` not `{}`, was {self:?}", stringify!(StopMarketOrder), - self ), } } diff --git a/nautilus_core/model/src/orders/limit.rs b/nautilus_core/model/src/orders/limit.rs index 4667ac5614e5..c39a04b469c3 100644 --- a/nautilus_core/model/src/orders/limit.rs +++ b/nautilus_core/model/src/orders/limit.rs @@ -434,9 +434,8 @@ impl From for LimitOrder { match order { OrderAny::Limit(order) => order, _ => panic!( - "Invalid `OrderAny` not `{}`, was {:?}", + "Invalid `OrderAny` not `{}`, was {order:?}", stringify!(LimitOrder), - order ), } } diff --git a/nautilus_core/model/src/orders/limit_if_touched.rs b/nautilus_core/model/src/orders/limit_if_touched.rs index fa67910bcbab..48d8c8ce7384 100644 --- a/nautilus_core/model/src/orders/limit_if_touched.rs +++ b/nautilus_core/model/src/orders/limit_if_touched.rs @@ -381,9 +381,8 @@ impl From for LimitIfTouchedOrder { OrderAny::LimitIfTouched(order) => order, _ => { panic!( - "Invalid `OrderAny` not `{}`, was {:?}", + "Invalid `OrderAny` not `{}`, was {order:?}", stringify!(LimitIfTouchedOrder), - order ) } } diff --git a/nautilus_core/model/src/orders/market.rs b/nautilus_core/model/src/orders/market.rs index be45875aa65f..4c12a790d138 100644 --- a/nautilus_core/model/src/orders/market.rs +++ b/nautilus_core/model/src/orders/market.rs @@ -455,9 +455,8 @@ impl From for MarketOrder { OrderAny::Market(order) => order, _ => { panic!( - "Invalid `OrderAny` not `{}`, was {:?}", + "Invalid `OrderAny` not `{}`, was {order:?}", stringify!(MarketOrder), - order ) } } diff --git a/nautilus_core/model/src/orders/market_if_touched.rs b/nautilus_core/model/src/orders/market_if_touched.rs index b346bd530d91..03022b65d86e 100644 --- a/nautilus_core/model/src/orders/market_if_touched.rs +++ b/nautilus_core/model/src/orders/market_if_touched.rs @@ -373,9 +373,8 @@ impl From for MarketIfTouchedOrder { OrderAny::MarketIfTouched(order) => order, _ => { panic!( - "Invalid `OrderAny` not `{}`, was {:?}", + "Invalid `OrderAny` not `{}`, was {order:?}", stringify!(MarketIfTouchedOrder), - order ) } } diff --git a/nautilus_core/model/src/orders/stop_limit.rs b/nautilus_core/model/src/orders/stop_limit.rs index d59ae15dc96f..eb794a7b2f8a 100644 --- a/nautilus_core/model/src/orders/stop_limit.rs +++ b/nautilus_core/model/src/orders/stop_limit.rs @@ -390,9 +390,8 @@ impl From for StopLimitOrder { OrderAny::StopLimit(order) => order, _ => { panic!( - "Invalid `OrderAny` not `{}`, was {:?}", + "Invalid `OrderAny` not `{}`, was {order:?}", stringify!(StopLimitOrder), - order ) } } diff --git a/nautilus_core/model/src/orders/trailing_stop_limit.rs b/nautilus_core/model/src/orders/trailing_stop_limit.rs index 5def471cf5c1..8ff1f295bb34 100644 --- a/nautilus_core/model/src/orders/trailing_stop_limit.rs +++ b/nautilus_core/model/src/orders/trailing_stop_limit.rs @@ -390,9 +390,8 @@ impl From for TrailingStopLimitOrder { OrderAny::TrailingStopLimit(order) => order, _ => { panic!( - "Invalid `OrderAny` not `{}`, was {:?}", + "Invalid `OrderAny` not `{}`, was {order:?}", stringify!(TrailingStopLimitOrder), - order ) } } diff --git a/nautilus_core/model/src/orders/trailing_stop_market.rs b/nautilus_core/model/src/orders/trailing_stop_market.rs index f29e319e2509..e56d9ff486e8 100644 --- a/nautilus_core/model/src/orders/trailing_stop_market.rs +++ b/nautilus_core/model/src/orders/trailing_stop_market.rs @@ -380,9 +380,8 @@ impl From for TrailingStopMarketOrder { OrderAny::TrailingStopMarket(order) => order, _ => { panic!( - "Invalid `OrderAny` not `{}`, was {:?}", + "Invalid `OrderAny` not `{}`, was {order:?}", stringify!(TrailingStopMarketOrder), - order ) } } From 31474172d4050d91f66f5d147bb02d08362af317 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 11:51:42 +1100 Subject: [PATCH 028/224] Update CLA --- .pre-commit-config.yaml | 2 +- CLA.md | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 CLA.md diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e98e2f67aef3..97430197bdde 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: - id: codespell description: Checks for common misspellings. types_or: [python, cython, rst, markdown] - args: ["-L", "crate,ot,socio-economic,zar"] + args: ["-L", "ACN,crate,ot,socio-economic,zar"] ############################################################################## # Rust formatting and linting diff --git a/CLA.md b/CLA.md new file mode 100644 index 000000000000..36883f47e96d --- /dev/null +++ b/CLA.md @@ -0,0 +1,36 @@ +# CONTRIBUTOR LICENSE Agreement + +1. This contributor license agreement (**Agreement**) is between Nautech Systems Pty Ltd (ACN 609 589 237 (**We, Us, Our**) and the individual contributing to Our open source Software (**You**, **Your**). +2. By submitting a Contribution to Our Software, You accept and agree to be bound by this Agreement. + +## Grant of Licence + +3. You have agreed to provide Your Contribution to Our Software. +4. We own all rights in the Software. We grant You a non-exclusive, revocable, royalty-free, worldwide, non-sublicensable and non-transferable right and licence to access our Software for the purpose of making Your Contributions. +5. By making Contributions to Our Software, you hereby grant to Us a perpetual, worldwide, non-exclusive, royalty-free, irrevocable, transferable and sub-licensable right and licence to use, reproduce, modify, adapt, publish, translate, commercialise, create derivative works from, distribute, perform, and display the Contributions in any form, medium, or technology. +6. If You have any Moral Rights in any Contributions, you agree to waive those Moral Rights and consent to Our use or infringement of those Moral Rights. This is common for open source projects and helps to streamline software development and usage. +7. You acknowledge and agree that You are submitting Contributions voluntarily and that We are not required to provide any compensation or remuneration for Your Contributions. + +## Representations and Warranties + +8. You represent and warrant that: +- (i) You have all the necessary rights, power and authority to licence the Contributions to Us; +- (ii) that Our use of the Contributions will not infringe the intellectual property rights of any third party; and +- (iii) You are not aware of any actual or potential conflicts of interest by accepting this Agreement, including at law or under any other instrument binding on You. + +## General + +9. **Assignment**: You agree that we may assign, novate or deal with the whole or any part the rights and obligations under this Agreement without your prior written consent. +10. **No Obligation**: You acknowledge and agree that We are under no obligation to use or incorporate Your Contributions into the Software. We reserve the right to modify or remove any Contributions at Our sole discretion. +11. **Consequential Loss**: Despite anything to the contrary, to the maximum extent permitted by law, neither party will be liable under this Agreement for any consequential loss, special or indirect loss, real or anticipated loss of profit, loss of benefit, loss of revenue, loss of business, loss of goodwill, loss of opportunity, loss of savings, loss of reputation, loss of use and/or loss or corruption of data, whether under statute, contract, equity, tort (including negligence), indemnity or otherwise. +12. **Relationship of Parties**: This Agreement is not intended to create a partnership, joint venture, employment or agency relationship between the parties. +13. **Jurisdiction**: This Agreement is governed by the laws of New South Wales. Each Party irrevocably and unconditionally submits to the exclusive jurisdiction of the courts operating in New South Wales and any courts entitled to hear appeals from those courts and waives any right to object to proceedings being brought in those courts. +14. **Dispute Resolution**: In the event of a dispute, You must contact Us and attempt to resolve the dispute in good faith. If the matter can’t be resolved, either party may refer the matter to a mediator. The costs of the mediation will be shared equally between the parties. + +## Definitions + +15. In this Agreement: +- (i) **Contributions** means any know-how, processes, circuit layouts, software, computer programs, databases, source codes, tools, data, documentation, feedback, information or any other work that You submit, in any form or manner, to Our Software. +- (ii) **Moral Rights** has the meaning given in the _Copyright Act 1968_ (Cth) and includes any similar rights in any jurisdiction in the world. +- (iii) **Software** means Our open source software project licensed under LGPL v3.0, available at https://github.com/nautechsystems/nautilus_trader. +16. **Last updated**: 4th October 2024. From c3731955fd295b362f8b3719c559732385795399 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 12:15:57 +1100 Subject: [PATCH 029/224] Update contributing guide --- CONTRIBUTING.md | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a47e5fc263f2..1f093d1818b7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,32 +1,35 @@ # Contributing to NautilusTrader -Involvement from the trading community is a goal for this project, and all help is welcome! +We highly value involvement from the trading community, and all contributions are greatly appreciated as they help us continually improve NautilusTrader! + +## Steps + To contribute, follow these steps: 1. Open an issue on GitHub to discuss your proposed changes or enhancements. -2. Once everyone is on the same page, take a fork of the develop branch (or ensure all upstream changes are merged). +2. Once everyone is aligned, fork the `develop` branch and ensure your fork is up-to-date by regularly merging any upstream changes. -3. Install and set up [pre-commit](https://pre-commit.com/) to ensure that the pre-commit hook is picked up on your local machine. This will automatically run various checks, auto-formatters, and linting tools. +3. Install and configure [pre-commit](https://pre-commit.com/) on your local machine to automatically run code checks, formatters, and linters before each commit. You can install pre-commit via: + ```bash + pip install pre-commit + pre-commit install + ``` -4. It is recommended to install Redis using the default configuration so that integration tests will pass on your machine. +4. Open a pull request (PR) on the `develop` branch with a summary comment and reference to any relevant GitHub issue(s). -5. Open a pull request (PR) on the `develop` branch with a summary comment. +5. The CI system will run the full test suite over your code including all unit and integration tests, so include appropriate tests with the PR. -6. The CI system will run the full test-suite over your code including all unit and integration tests, so include appropriate tests - with the PR. +6. [Deepsource](https://deepsource.io) will perform an automated code review. Fix any issues which cause a failed check, and add the commit to your PR. -7. [Deepsource](https://deepsource.io) will perform an automated code review. - Fix any issues which cause a failed check, and add the commit to your PR. +7. Read and understand the Contributor License Agreement (CLA), available at https://github.com/nautechsystems/nautilus_trader/blob/develop/CLA.md. -8. You will also be required to sign a standard Contributor License Agreement (CLA), which is administered automatically through [CLA Assistant](https://cla-assistant.io/). +8. You will also be required to sign the CLA, which is administered automatically through [CLA Assistant](https://cla-assistant.io/). -9. We will review your code as quickly as possible and may provide feedback on needed changes before merging. +9. We will review your code as quickly as possible and provide feedback if any changes are needed before merging. ## Tips -- Follow the established coding practices outlined in the [Developer Guide](https://nautilustrader.io/docs/developer_guide/index.html). -- Keep PR's small and focused. -- Reference the related GitHub issue(s) in the PR comment. - -Thank you for your interest in NautilusTrader! +- Follow the established coding practices in the [Developer Guide](https://nautilustrader.io/docs/developer_guide/index.html). +- Keep PRs small and focused for easier review. +- Reference the relevant GitHub issue(s) in your PR comment. From 81bd44c8e20f2b5c6265f30046ec4d14cb52aac6 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 13:18:39 +1100 Subject: [PATCH 030/224] Prevent pytest collecting non-test classes --- nautilus_trader/common/component.pyx | 2 +- nautilus_trader/test_kit/providers.py | 7 +++++++ tests/unit_tests/serialization/test_base.py | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/nautilus_trader/common/component.pyx b/nautilus_trader/common/component.pyx index 3bdd21d9e329..dbc8d321d6fa 100644 --- a/nautilus_trader/common/component.pyx +++ b/nautilus_trader/common/component.pyx @@ -547,7 +547,7 @@ cdef class TestClock(Clock): """ - __test__ = False # Required so pytest does not consider this a test class + __test__ = False # Prevents pytest from collecting this as a test class def __init__(self): self._mem = test_clock_new() diff --git a/nautilus_trader/test_kit/providers.py b/nautilus_trader/test_kit/providers.py index 12ec3d8d47cb..f18678ba6a6d 100644 --- a/nautilus_trader/test_kit/providers.py +++ b/nautilus_trader/test_kit/providers.py @@ -71,6 +71,8 @@ class TestInstrumentProvider: Provides instrument template methods for backtesting. """ + __test__ = False # Prevents pytest from collecting this as a test class + @staticmethod def adabtc_binance() -> CurrencyPair: """ @@ -783,6 +785,8 @@ class TestDataProvider: """ + __test__ = False # Prevents pytest from collecting this as a test class + def __init__(self, branch: str = "develop") -> None: self.fs: fsspec.AbstractFileSystem | None = None self.root: str | None = None @@ -853,6 +857,9 @@ def read_parquet_bars(self, path: str) -> pd.DataFrame: class TestDataGenerator: + + __test__ = False # Prevents pytest from collecting this as a test class + @staticmethod def simulate_value_diffs( count: int, diff --git a/tests/unit_tests/serialization/test_base.py b/tests/unit_tests/serialization/test_base.py index 1a7f6ffeb16d..909508da30ba 100644 --- a/tests/unit_tests/serialization/test_base.py +++ b/tests/unit_tests/serialization/test_base.py @@ -23,6 +23,8 @@ class TestObject: Represents some generic user object which implements serialization value dicts. """ + __test__ = False # Prevents pytest from collecting this as a test class + def __init__(self, value): self.value = value From 6522ba4f40db6fda53d9319c255fb0d9b751b79d Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 14:47:19 +1100 Subject: [PATCH 031/224] Add validation for venue book_type vs data --- nautilus_trader/backtest/engine.pxd | 1 + nautilus_trader/backtest/engine.pyx | 56 ++++++++++++------- .../adapters/betfair/test_betfair_backtest.py | 7 +-- .../adapters/betfair/test_kit.py | 7 ++- tests/unit_tests/backtest/test_engine.py | 32 ++++++++++- .../unit_tests/persistence/test_streaming.py | 34 ++++++----- 6 files changed, 96 insertions(+), 41 deletions(-) diff --git a/nautilus_trader/backtest/engine.pxd b/nautilus_trader/backtest/engine.pxd index ac2316b96acb..be91fa363419 100644 --- a/nautilus_trader/backtest/engine.pxd +++ b/nautilus_trader/backtest/engine.pxd @@ -43,6 +43,7 @@ cdef class BacktestEngine: cdef datetime _backtest_end cdef dict[Venue, SimulatedExchange] _venues + cdef set[InstrumentId] _has_book_data cdef list[Data] _data cdef uint64_t _data_len cdef uint64_t _index diff --git a/nautilus_trader/backtest/engine.pyx b/nautilus_trader/backtest/engine.pyx index 63ef476a4793..b3404748a287 100644 --- a/nautilus_trader/backtest/engine.pyx +++ b/nautilus_trader/backtest/engine.pyx @@ -28,6 +28,7 @@ from nautilus_trader.config import CacheConfig from nautilus_trader.core import nautilus_pyo3 from nautilus_trader.data.config import DataEngineConfig from nautilus_trader.execution.config import ExecEngineConfig +from nautilus_trader.model import BOOK_DATA_TYPES from nautilus_trader.model import NAUTILUS_PYO3_DATA_TYPES from nautilus_trader.risk.config import RiskEngineConfig from nautilus_trader.system.kernel import NautilusKernel @@ -86,6 +87,7 @@ from nautilus_trader.model.data cimport OrderBookDelta from nautilus_trader.model.data cimport OrderBookDeltas from nautilus_trader.model.data cimport QuoteTick from nautilus_trader.model.data cimport TradeTick +from nautilus_trader.model.functions cimport book_type_to_str from nautilus_trader.model.identifiers cimport ClientId from nautilus_trader.model.identifiers cimport InstrumentId from nautilus_trader.model.identifiers cimport TraderId @@ -130,6 +132,7 @@ cdef class BacktestEngine: # Venues and data self._venues: dict[Venue, SimulatedExchange] = {} + self._has_book_data: set[InstrumentId] = set() self._data: list[Data] = [] self._data_len: uint64_t = 0 self._index: uint64_t = 0 @@ -626,9 +629,9 @@ cdef class BacktestEngine: cdef str data_added_str = "data" - if validate: - first = data[0] + first = data[0] + if validate: if hasattr(first, "instrument_id"): Condition.is_true( first.instrument_id in self.kernel.cache.instrument_ids(), @@ -664,6 +667,9 @@ cdef class BacktestEngine: if sort: self._data = sorted(self._data, key=lambda x: x.ts_init) + if type(first) in BOOK_DATA_TYPES: + self._has_book_data.add(first.instrument_id) + self._log.info( f"Added {len(data):_} {data_added_str} element{'' if len(data) == 1 else 's'}", ) @@ -844,6 +850,7 @@ cdef class BacktestEngine: Does not clear added instruments. """ + self._has_book_data.clear() self._data.clear() self._data_len = 0 self._index = 0 @@ -1002,6 +1009,19 @@ cdef class BacktestEngine: end: datetime | str | int | None = None, run_config_id: str | None = None, ): + # Validate data + cdef: + SimulatedExchange exchange + InstrumentId instrument_id + for exchange in self._venues.values(): + for instrument_id in exchange.instruments: + if exchange.book_type > BookType.L1_MBP and instrument_id not in self._has_book_data: + raise InvalidConfiguration( + f"No order book data found for instrument '{instrument_id }' when `book_type` is '{book_type_to_str(exchange.book_type)}'. " + "Either set the venue `book_type` to 'L1_MBP' (for top-of-book data like quotes, trades, and bars) or ensure that order book data is provided for this instrument. " + f"If order book data has been added for instrument '{instrument_id}', consider increasing the `chunk_size` for streaming." + ) + cdef uint64_t start_ns cdef uint64_t end_ns # Time range check and set @@ -1027,7 +1047,6 @@ cdef class BacktestEngine: for clock in get_component_clocks(self._instance_id): clock.set_time(start_ns) - cdef SimulatedExchange exchange if self._iteration == 0: # Initialize run self._run_config_id = run_config_id # Can be None @@ -1078,7 +1097,6 @@ cdef class BacktestEngine: cdef uint64_t raw_handlers_count = 0 cdef Data data = self._next() cdef CVec raw_handlers - cdef SimulatedExchange venue try: while data is not None: if data.ts_init > end_ns: @@ -1089,28 +1107,28 @@ cdef class BacktestEngine: raw_handlers = self._advance_time(data.ts_init) raw_handlers_count = raw_handlers.len - # Process data through venue + # Process data through exchange if isinstance(data, OrderBookDelta): - venue = self._venues[data.instrument_id.venue] - venue.process_order_book_delta(data) + exchange = self._venues[data.instrument_id.venue] + exchange.process_order_book_delta(data) elif isinstance(data, OrderBookDeltas): - venue = self._venues[data.instrument_id.venue] - venue.process_order_book_deltas(data) + exchange = self._venues[data.instrument_id.venue] + exchange.process_order_book_deltas(data) elif isinstance(data, QuoteTick): - venue = self._venues[data.instrument_id.venue] - venue.process_quote_tick(data) + exchange = self._venues[data.instrument_id.venue] + exchange.process_quote_tick(data) elif isinstance(data, TradeTick): - venue = self._venues[data.instrument_id.venue] - venue.process_trade_tick(data) + exchange = self._venues[data.instrument_id.venue] + exchange.process_trade_tick(data) elif isinstance(data, Bar): - venue = self._venues[data.bar_type.instrument_id.venue] - venue.process_bar(data) + exchange = self._venues[data.bar_type.instrument_id.venue] + exchange.process_bar(data) elif isinstance(data, InstrumentClose): - venue = self._venues[data.instrument_id.venue] - venue.process_instrument_close(data) + exchange = self._venues[data.instrument_id.venue] + exchange.process_instrument_close(data) elif isinstance(data, InstrumentStatus): - venue = self._venues[data.instrument_id.venue] - venue.process_instrument_status(data) + exchange = self._venues[data.instrument_id.venue] + exchange.process_instrument_status(data) self._data_engine.process(data) diff --git a/tests/integration_tests/adapters/betfair/test_betfair_backtest.py b/tests/integration_tests/adapters/betfair/test_betfair_backtest.py index 45dbfc35b7a0..892e0b308049 100644 --- a/tests/integration_tests/adapters/betfair/test_betfair_backtest.py +++ b/tests/integration_tests/adapters/betfair/test_betfair_backtest.py @@ -13,7 +13,6 @@ # limitations under the License. # ------------------------------------------------------------------------------------------------- - from nautilus_trader.adapters.betfair.constants import BETFAIR_VENUE from nautilus_trader.adapters.betfair.parsing.core import BetfairParser from nautilus_trader.backtest.engine import BacktestEngine @@ -50,7 +49,7 @@ def test_betfair_backtest(): account_type=AccountType.CASH, # Spot CASH account (not for perpetuals or futures) base_currency=GBP, # Multi-currency account starting_balances=[Money(100_000, GBP)], - book_type=BookType.L2_MBP, + book_type=BookType.L1_MBP, ) # Add instruments @@ -95,6 +94,6 @@ def test_betfair_backtest(): account = engine.trader.generate_account_report(BETFAIR_VENUE) fills = engine.trader.generate_order_fills_report() positions = engine.trader.generate_positions_report() - assert account.iloc[-1]["total"] == "49039.65" - assert len(fills) == 2708 + assert account.iloc[-1]["total"] == "1630955.72" + assert len(fills) == 1223 assert len(positions) == 2 diff --git a/tests/integration_tests/adapters/betfair/test_kit.py b/tests/integration_tests/adapters/betfair/test_kit.py index 42349eedf29b..948fe4937063 100644 --- a/tests/integration_tests/adapters/betfair/test_kit.py +++ b/tests/integration_tests/adapters/betfair/test_kit.py @@ -190,7 +190,7 @@ def parse_betfair(line): @staticmethod def betfair_venue_config( name: str = "BETFAIR", - book_type: str = "L2_MBP", + book_type: str = "L1_MBP", ) -> BacktestVenueConfig: return BacktestVenueConfig( name=name, @@ -216,7 +216,7 @@ def streaming_config( ) @staticmethod - def betfair_backtest_run_config( + def backtest_run_config( catalog_path: str, instrument_id: InstrumentId, catalog_fs_protocol: str = "memory", @@ -227,6 +227,7 @@ def betfair_backtest_run_config( bypass_logging: bool = True, log_level: str = "WARNING", venue_name: str = "BETFAIR", + book_type: str = "L2_MBP", ) -> BacktestRunConfig: engine_config = BacktestEngineConfig( logging=LoggingConfig( @@ -260,7 +261,7 @@ def betfair_backtest_run_config( ) run_config = BacktestRunConfig( engine=engine_config, - venues=[BetfairTestStubs.betfair_venue_config(name=venue_name)], + venues=[BetfairTestStubs.betfair_venue_config(name=venue_name, book_type=book_type)], data=[ BacktestDataConfig( data_cls=TradeTick.fully_qualified_name(), diff --git a/tests/unit_tests/backtest/test_engine.py b/tests/unit_tests/backtest/test_engine.py index b921b5504480..5e0683d6acf6 100644 --- a/tests/unit_tests/backtest/test_engine.py +++ b/tests/unit_tests/backtest/test_engine.py @@ -48,6 +48,7 @@ from nautilus_trader.model.enums import AggregationSource from nautilus_trader.model.enums import BarAggregation from nautilus_trader.model.enums import BookAction +from nautilus_trader.model.enums import BookType from nautilus_trader.model.enums import MarketStatusAction from nautilus_trader.model.enums import OmsType from nautilus_trader.model.enums import OrderSide @@ -235,7 +236,34 @@ def test_persistence_files_cleaned_up(self, tmp_path: Path) -> None: # Assert assert all(f.closed for f in engine.kernel.writer._files.values()) - def test_backtest_engine_multiple_runs(self): + def test_run_with_venue_config_raises_invalid_config( + self, + config: BacktestEngineConfig | None = None, + ) -> BacktestEngine: + engine = BacktestEngine(config) + engine.add_venue( + venue=Venue("SIM"), + oms_type=OmsType.HEDGING, + book_type=BookType.L2_MBP, # <-- Invalid for data + account_type=AccountType.MARGIN, + base_currency=USD, + starting_balances=[Money(1_000_000, USD)], + fill_model=FillModel(), + ) + + # Set up data + wrangler = QuoteTickDataWrangler(self.usdjpy) + provider = TestDataProvider() + ticks = wrangler.process_bar_data( + bid_data=provider.read_csv_bars("fxcm/usdjpy-m1-bid-2013.csv")[:2000], + ask_data=provider.read_csv_bars("fxcm/usdjpy-m1-ask-2013.csv")[:2000], + ) + engine.add_instrument(USDJPY_SIM) + engine.add_data(ticks) + with pytest.raises(InvalidConfiguration): + engine.run() + + def test_multiple_runs(self): for _ in range(2): config = SignalStrategyConfig(instrument_id=USDJPY_SIM.id) strategy = SignalStrategy(config) @@ -249,7 +277,7 @@ def test_backtest_engine_multiple_runs(self): engine.run() engine.dispose() - def test_backtest_engine_strategy_timestamps(self): + def test_strategy_timestamps(self): # Arrange config = SignalStrategyConfig(instrument_id=USDJPY_SIM.id) strategy = SignalStrategy(config) diff --git a/tests/unit_tests/persistence/test_streaming.py b/tests/unit_tests/persistence/test_streaming.py index 29c70e310b6b..8cdc77a16c06 100644 --- a/tests/unit_tests/persistence/test_streaming.py +++ b/tests/unit_tests/persistence/test_streaming.py @@ -41,21 +41,26 @@ class TestPersistenceStreaming: def setup(self) -> None: self.catalog: ParquetDataCatalog | None = None - def _run_default_backtest(self, catalog_betfair: ParquetDataCatalog) -> list[BacktestResult]: + def _run_default_backtest( + self, + catalog_betfair: ParquetDataCatalog, + book_type: str = "L1_MBP", + ) -> list[BacktestResult]: self.catalog = catalog_betfair instrument = self.catalog.instruments()[0] - run_config = BetfairTestStubs.betfair_backtest_run_config( + run_config = BetfairTestStubs.backtest_run_config( catalog_path=catalog_betfair.path, catalog_fs_protocol="file", instrument_id=instrument.id, flush_interval_ms=5_000, bypass_logging=True, + book_type=book_type, ) node = BacktestNode(configs=[run_config]) # Act - backtest_result = node.run() + backtest_result = node.run(raise_exception=True) return backtest_result @@ -71,19 +76,21 @@ def test_feather_writer(self, catalog_betfair: ParquetDataCatalog) -> None: ) result = dict(Counter([r.__class__.__name__ for r in result])) # type: ignore [assignment] + # TODO: Backtest needs to be reconfigured to use either deltas or trades expected = { - "AccountState": 400, + "AccountState": 380, "BettingInstrument": 1, "ComponentStateChanged": 27, "OrderAccepted": 189, "OrderBookDelta": 1307, + "OrderCanceled": 79, "OrderDenied": 3, - "OrderFilled": 211, + "OrderFilled": 112, "OrderInitialized": 193, "OrderSubmitted": 190, - "PositionChanged": 206, - "PositionClosed": 4, - "PositionOpened": 5, + "PositionChanged": 108, + "PositionClosed": 3, + "PositionOpened": 3, "TradeTick": 179, } @@ -410,18 +417,19 @@ def test_read_backtest( # Assert expected = { - "AccountState": 400, + "AccountState": 380, "BettingInstrument": 1, "ComponentStateChanged": 27, "OrderAccepted": 189, "OrderBookDelta": 1307, + "OrderCanceled": 79, "OrderDenied": 3, - "OrderFilled": 211, + "OrderFilled": 112, "OrderInitialized": 193, "OrderSubmitted": 190, - "PositionChanged": 206, - "PositionClosed": 4, - "PositionOpened": 5, + "PositionChanged": 108, + "PositionClosed": 3, + "PositionOpened": 3, "TradeTick": 179, } assert counts == expected From 92c4a86a7471d49f6b278a2d785773bc13009c79 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 14:54:32 +1100 Subject: [PATCH 032/224] Update CLA --- CLA.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLA.md b/CLA.md index 36883f47e96d..a12016528891 100644 --- a/CLA.md +++ b/CLA.md @@ -1,6 +1,6 @@ # CONTRIBUTOR LICENSE Agreement -1. This contributor license agreement (**Agreement**) is between Nautech Systems Pty Ltd (ACN 609 589 237 (**We, Us, Our**) and the individual contributing to Our open source Software (**You**, **Your**). +1. This contributor license agreement (**Agreement**) is between Nautech Systems Pty Ltd (ACN 609 589 237 (**We**, **Us**, **Our**) and the individual contributing to Our open source Software (**You**, **Your**). 2. By submitting a Contribution to Our Software, You accept and agree to be bound by this Agreement. ## Grant of Licence From 31f7caebb24933c34bb65480b9a2558c8bc2f526 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 14:56:34 +1100 Subject: [PATCH 033/224] Update release notes --- RELEASES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASES.md b/RELEASES.md index dbe043427706..25fa267a335f 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -4,6 +4,7 @@ Released on TBD (UTC). ### Enhancements - Added support for `bbo-1s` and `bbo-1m` quote schemas for Databento adapter (#1990), thanks @faysou +- Added validation for venue `book_type` configuration vs data (prevents an issue where top-of-book data is used when order book data is expected) - Standardized Betfair symbology to use hyphens instead of periods (prevents Betfair symbols being treated as composite) ### Internal Improvements From 748075ddb466c0bba60d9e464b2c8b03a2ca8875 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 20:03:44 +1100 Subject: [PATCH 034/224] Refine validation for venue book_type vs data --- nautilus_trader/backtest/engine.pxd | 1 + nautilus_trader/backtest/engine.pyx | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/nautilus_trader/backtest/engine.pxd b/nautilus_trader/backtest/engine.pxd index be91fa363419..80c0d2bb928f 100644 --- a/nautilus_trader/backtest/engine.pxd +++ b/nautilus_trader/backtest/engine.pxd @@ -43,6 +43,7 @@ cdef class BacktestEngine: cdef datetime _backtest_end cdef dict[Venue, SimulatedExchange] _venues + cdef set[InstrumentId] _has_data cdef set[InstrumentId] _has_book_data cdef list[Data] _data cdef uint64_t _data_len diff --git a/nautilus_trader/backtest/engine.pyx b/nautilus_trader/backtest/engine.pyx index b3404748a287..f22fb59e5c42 100644 --- a/nautilus_trader/backtest/engine.pyx +++ b/nautilus_trader/backtest/engine.pyx @@ -132,6 +132,7 @@ cdef class BacktestEngine: # Venues and data self._venues: dict[Venue, SimulatedExchange] = {} + self._has_data: set[InstrumentId] = set() self._has_book_data: set[InstrumentId] = set() self._data: list[Data] = [] self._data_len: uint64_t = 0 @@ -667,6 +668,11 @@ cdef class BacktestEngine: if sort: self._data = sorted(self._data, key=lambda x: x.ts_init) + if hasattr(first, "instrument_id"): + self._has_data.add(first.instrument_id) + elif isinstance(first, Bar): + self._has_data.add(first.bar_type.instrument_id) + if type(first) in BOOK_DATA_TYPES: self._has_book_data.add(first.instrument_id) @@ -850,6 +856,7 @@ cdef class BacktestEngine: Does not clear added instruments. """ + self._has_data.clear() self._has_book_data.clear() self._data.clear() self._data_len = 0 @@ -1013,13 +1020,18 @@ cdef class BacktestEngine: cdef: SimulatedExchange exchange InstrumentId instrument_id + bint has_data + bint missing_book_data + bint book_type_has_depth for exchange in self._venues.values(): for instrument_id in exchange.instruments: - if exchange.book_type > BookType.L1_MBP and instrument_id not in self._has_book_data: + has_data = instrument_id in self._has_data + missing_book_data = instrument_id not in self._has_book_data + book_type_has_depth = exchange.book_type > BookType.L1_MBP + if book_type_has_depth and has_data and missing_book_data: raise InvalidConfiguration( f"No order book data found for instrument '{instrument_id }' when `book_type` is '{book_type_to_str(exchange.book_type)}'. " - "Either set the venue `book_type` to 'L1_MBP' (for top-of-book data like quotes, trades, and bars) or ensure that order book data is provided for this instrument. " - f"If order book data has been added for instrument '{instrument_id}', consider increasing the `chunk_size` for streaming." + "Set the venue `book_type` to 'L1_MBP' (for top-of-book data like quotes, trades, and bars) or provide order book data for this instrument." ) cdef uint64_t start_ns From a3729bf224793aa99280175869a357d084789d6b Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 20:06:44 +1100 Subject: [PATCH 035/224] Update CLA --- CLA.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLA.md b/CLA.md index a12016528891..efde08171e5b 100644 --- a/CLA.md +++ b/CLA.md @@ -1,6 +1,6 @@ # CONTRIBUTOR LICENSE Agreement -1. This contributor license agreement (**Agreement**) is between Nautech Systems Pty Ltd (ACN 609 589 237 (**We**, **Us**, **Our**) and the individual contributing to Our open source Software (**You**, **Your**). +1. This contributor license agreement (**Agreement**) is between Nautech Systems Pty Ltd (ACN 609 589 237) (**We**, **Us**, **Our**) and the individual contributing to Our open source Software (**You**, **Your**). 2. By submitting a Contribution to Our Software, You accept and agree to be bound by this Agreement. ## Grant of Licence From d6524bd7085cfea059b1cc763640bf35e13bda87 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 20:25:05 +1100 Subject: [PATCH 036/224] Update dependencies --- poetry.lock | 125 ++++++++++++++++++++++++++-------------------------- 1 file changed, 63 insertions(+), 62 deletions(-) diff --git a/poetry.lock b/poetry.lock index ca0b65f88569..62ed91c7745e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1830,71 +1830,72 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.5" +version = "3.0.0" description = "Safely add untrusted strings to HTML/XML markup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" files = [ - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, + {file = "MarkupSafe-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:380faf314c3c84c1682ca672e6280c6c59e92d0bc13dc71758ffa2de3cd4e252"}, + {file = "MarkupSafe-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ee9790be6f62121c4c58bbced387b0965ab7bffeecb4e17cc42ef290784e363"}, + {file = "MarkupSafe-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddf5cb8e9c00d9bf8b0c75949fb3ff9ea2096ba531693e2e87336d197fdb908"}, + {file = "MarkupSafe-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b36473a2d3e882d1873ea906ce54408b9588dc2c65989664e6e7f5a2de353d7"}, + {file = "MarkupSafe-3.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dba0f83119b9514bc37272ad012f0cc03f0805cc6a2bea7244e19250ac8ff29f"}, + {file = "MarkupSafe-3.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:409535e0521c4630d5b5a1bf284e9d3c76d2fc2f153ebb12cf3827797798cc99"}, + {file = "MarkupSafe-3.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64a7c7856c3a409011139b17d137c2924df4318dab91ee0530800819617c4381"}, + {file = "MarkupSafe-3.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4deea1d9169578917d1f35cdb581bc7bab56a7e8c5be2633bd1b9549c3c22a01"}, + {file = "MarkupSafe-3.0.0-cp310-cp310-win32.whl", hash = "sha256:3cd0bba31d484fe9b9d77698ddb67c978704603dc10cdc905512af308cfcca6b"}, + {file = "MarkupSafe-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:4ca04c60006867610a06575b46941ae616b19da0adc85b9f8f3d9cbd7a3da385"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e64b390a306f9e849ee809f92af6a52cda41741c914358e0e9f8499d03741526"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c524203207f5b569df06c96dafdc337228921ee8c3cc5f6e891d024c6595352"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c409691696bec2b5e5c9efd9593c99025bf2f317380bf0d993ee0213516d908a"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64f7d04410be600aa5ec0626d73d43e68a51c86500ce12917e10fd013e258df5"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:105ada43a61af22acb8774514c51900dc820c481cc5ba53f17c09d294d9c07ca"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a5fd5500d4e4f7cc88d8c0f2e45126c4307ed31e08f8ec521474f2fd99d35ac3"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25396abd52b16900932e05b7104bcdc640a4d96c914f39c3b984e5a17b01fba0"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3efde9a8c56c3b6e5f3fa4baea828f8184970c7c78480fedb620d804b1c31e5c"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-win32.whl", hash = "sha256:12ddac720b8965332d36196f6f83477c6351ba6a25d4aff91e30708c729350d7"}, + {file = "MarkupSafe-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:658fdf6022740896c403d45148bf0c36978c6b48c9ef8b1f8d0c7a11b6cdea86"}, + {file = "MarkupSafe-3.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d261ec38b8a99a39b62e0119ed47fe3b62f7691c500bc1e815265adc016438c1"}, + {file = "MarkupSafe-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e363440c8534bf2f2ef1b8fdc02037eb5fff8fce2a558519b22d6a3a38b3ec5e"}, + {file = "MarkupSafe-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7835de4c56066e096407a1852e5561f6033786dd987fa90dc384e45b9bd21295"}, + {file = "MarkupSafe-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6cc46a27d904c9be5732029769acf4b0af69345172ed1ef6d4db0c023ff603b"}, + {file = "MarkupSafe-3.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0411641d31aa6f7f0cc13f0f18b63b8dc08da5f3a7505972a42ab059f479ba3"}, + {file = "MarkupSafe-3.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b2a7afd24d408b907672015555bc10be2382e6c5f62a488e2d452da670bbd389"}, + {file = "MarkupSafe-3.0.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c8ab7efeff1884c5da8e18f743b667215300e09043820d11723718de0b7db934"}, + {file = "MarkupSafe-3.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8219e2207f6c188d15614ea043636c2b36d2d79bf853639c124a179412325a13"}, + {file = "MarkupSafe-3.0.0-cp312-cp312-win32.whl", hash = "sha256:59420b5a9a5d3fee483a32adb56d7369ae0d630798da056001be1e9f674f3aa6"}, + {file = "MarkupSafe-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:7ed789d0f7f11fcf118cf0acb378743dfdd4215d7f7d18837c88171405c9a452"}, + {file = "MarkupSafe-3.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:27d6a73682b99568916c54a4bfced40e7d871ba685b580ea04bbd2e405dfd4c5"}, + {file = "MarkupSafe-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:494a64efc535e147fcc713dba58eecfce3a79f1e93ebe81995b387f5cd9bc2e1"}, + {file = "MarkupSafe-3.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5243044a927e8a6bb28517838662a019cd7f73d7f106bbb37ab5e7fa8451a92"}, + {file = "MarkupSafe-3.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63dae84964a9a3d2610808cee038f435d9a111620c37ccf872c2fcaeca6865b3"}, + {file = "MarkupSafe-3.0.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dcbee57fedc9b2182c54ffc1c5eed316c3da8bbfeda8009e1b5d7220199d15da"}, + {file = "MarkupSafe-3.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f846fd7c241e5bd4161e2a483663eb66e4d8e12130fcdc052f310f388f1d61c6"}, + {file = "MarkupSafe-3.0.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:678fbceb202382aae42c1f0cd9f56b776bc20a58ae5b553ee1fe6b802983a1d6"}, + {file = "MarkupSafe-3.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bd9b8e458e2bab52f9ad3ab5dc8b689a3c84b12b2a2f64cd9a0dfe209fb6b42f"}, + {file = "MarkupSafe-3.0.0-cp313-cp313-win32.whl", hash = "sha256:1fd02f47596e00a372f5b4af2b4c45f528bade65c66dfcbc6e1ea1bfda758e98"}, + {file = "MarkupSafe-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:b94bec9eda10111ec7102ef909eca4f3c2df979643924bfe58375f560713a7d1"}, + {file = "MarkupSafe-3.0.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:509c424069dd037d078925b6815fc56b7271f3aaec471e55e6fa513b0a80d2aa"}, + {file = "MarkupSafe-3.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:81be2c0084d8c69e97e3c5d73ce9e2a6e523556f2a19c4e195c09d499be2f808"}, + {file = "MarkupSafe-3.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b43ac1eb9f91e0c14aac1d2ef0f76bc7b9ceea51de47536f61268191adf52ad7"}, + {file = "MarkupSafe-3.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b231255770723f1e125d63c14269bcd8b8136ecfb620b9a18c0297e046d0736"}, + {file = "MarkupSafe-3.0.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c182d45600556917f811aa019d834a89fe4b6f6255da2fd0bdcf80e970f95918"}, + {file = "MarkupSafe-3.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f91c90f8f3bf436f81c12eeb4d79f9ddd263c71125e6ad71341906832a34386"}, + {file = "MarkupSafe-3.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a7171d2b869e9be238ea318c196baf58fbf272704e9c1cd4be8c380eea963342"}, + {file = "MarkupSafe-3.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cb244adf2499aa37d5dc43431990c7f0b632d841af66a51d22bd89c437b60264"}, + {file = "MarkupSafe-3.0.0-cp313-cp313t-win32.whl", hash = "sha256:96e3ed550600185d34429477f1176cedea8293fa40e47fe37a05751bcb64c997"}, + {file = "MarkupSafe-3.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:1d151b9cf3307e259b749125a5a08c030ba15a8f1d567ca5bfb0e92f35e761f5"}, + {file = "MarkupSafe-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:23efb2be7221105c8eb0e905433414d2439cb0a8c5d5ca081c1c72acef0f5613"}, + {file = "MarkupSafe-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81ee9c967956b9ea39b3a5270b7cb1740928d205b0dc72629164ce621b4debf9"}, + {file = "MarkupSafe-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5509a8373fed30b978557890a226c3d30569746c565b9daba69df80c160365a5"}, + {file = "MarkupSafe-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1c13c6c908811f867a8e9e66efb2d6c03d1cdd83e92788fe97f693c457dc44f"}, + {file = "MarkupSafe-3.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7e63d1977d3806ce0a1a3e0099b089f61abdede5238ca6a3f3bf8877b46d095"}, + {file = "MarkupSafe-3.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d2c099be5274847d606574234e494f23a359e829ba337ea9037c3a72b0851942"}, + {file = "MarkupSafe-3.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e042ccf8fe5bf8b6a4b38b3f7d618eb10ea20402b0c9f4add9293408de447974"}, + {file = "MarkupSafe-3.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:98fb3a2bf525ad66db96745707b93ba0f78928b7a1cb2f1cb4b143bc7e2ba3b3"}, + {file = "MarkupSafe-3.0.0-cp39-cp39-win32.whl", hash = "sha256:a80c6740e1bfbe50cea7cbf74f48823bb57bd59d914ee22ff8a81963b08e62d2"}, + {file = "MarkupSafe-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:5d207ff5cceef77796f8aacd44263266248cf1fbc601441524d7835613f8abec"}, + {file = "markupsafe-3.0.0.tar.gz", hash = "sha256:03ff62dea2fef3eadf2f1853bc6332bcb0458d9608b11dfb1cd5aeda1c178ea6"}, ] [[package]] From 580e58cc210102b3f6bfc5764bb0c288c997a6a0 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 20:26:50 +1100 Subject: [PATCH 037/224] Adjust clippy cognitive-complexity-threshold --- nautilus_core/clippy.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_core/clippy.toml b/nautilus_core/clippy.toml index 4c4175b05adc..373da847a4cc 100644 --- a/nautilus_core/clippy.toml +++ b/nautilus_core/clippy.toml @@ -1,3 +1,3 @@ -cognitive-complexity-threshold = 15 +cognitive-complexity-threshold = 10 allow-expect-in-tests = true allow-unwrap-in-tests = true From b214dc9367629ddc8db86a9847197dd098dc08ed Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 8 Oct 2024 20:46:39 +1100 Subject: [PATCH 038/224] Refine data docs --- docs/concepts/data.md | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/docs/concepts/data.md b/docs/concepts/data.md index 132982ab2458..7a0a52fa003e 100644 --- a/docs/concepts/data.md +++ b/docs/concepts/data.md @@ -1,28 +1,27 @@ # Data -The NautilusTrader platform defines a range of built-in data types crafted specifically to represent -a trading domain: +The NautilusTrader platform provides a set of built-in data types specifically designed to represent a trading domain. These data types include: -- `OrderBookDelta` (L1/L2/L3): Most granular order book updates -- `OrderBookDeltas` (L1/L2/L3): Batches multiple order book deltas -- `OrderBookDepth10`: Aggregated order book snapshot (10 levels per side) -- `QuoteTick`: Top-of-book best bid and ask prices and sizes -- `TradeTick`: A single trade/match event between counterparties -- `Bar`: OHLCV bar data, aggregated using a specific *aggregation method* -- `Instrument`: General base class for a tradable instrument -- `InstrumentStatus`: An instrument level status event -- `InstrumentClose`: An instrument closing price +- `OrderBookDelta` (L1/L2/L3): Represents the most granular order book updates. +- `OrderBookDeltas` (L1/L2/L3): Batches multiple order book deltas for more efficient processing. +- `OrderBookDepth10`: Aggregated order book snapshot (10 levels per bid and ask side). +- `QuoteTick`: Represents the best bid and ask prices along with their sizes at the top-of-book. +- `TradeTick`: A single trade/match event between counterparties. +- `Bar`: OHLCV (Open, High, Low, Close, Volume) bar data, aggregated using a specified *aggregation method*. +- `Instrument`: A common instrument definition. +- `InstrumentStatus`: An instrument level status event. +- `InstrumentClose`: An instrument closing price. -Each of these data types inherits from `Data`, which defines two fields: -- `ts_event`: UNIX timestamp (nanoseconds) when the data event occurred -- `ts_init`: UNIX timestamp (nanoseconds) when the object was initialized +Each of these data types defines two fields that are critical for accurate data handling: +- `ts_event`: UNIX timestamp (nanoseconds) representing when the data event occurred. +- `ts_init`: UNIX timestamp (nanoseconds) marking when the object was initialized. -This inheritance ensures chronological data ordering (vital for backtesting), while also enhancing analytics. +These timestamps ensure proper data ordering, which is crucial for backtesting and enhances analytics. -Consistency is key; data flows through the platform in exactly the same way for all system [environment contexts](/concepts/architecture.md#environment-contexts) (`backtest`, `sandbox`, `live`) -primarily through the `MessageBus` to the `DataEngine` and onto subscribed or registered handlers. +The platform ensures consistency by flowing data through the same pathways across all system [environment contexts](/concepts/architecture.md#environment-contexts) +(e.g., `backtest`, `sandbox`, `live`). Data is primarily transported via the `MessageBus` to the `DataEngine` and then distributed to subscribed or registered handlers. -For those seeking customization, the platform supports user-defined data types. Refer to the advanced [Custom data guide](advanced/custom_data.md) for further details. +For users who need more flexibility, the platform also supports the creation of custom data types. For details on how to implement user-defined data types, refer to the advanced [Custom data guide](advanced/custom_data.md). ## Loading data From e85b20a1908fe4ac41cb23db3141392f9d1c8247 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 9 Oct 2024 04:49:18 +1100 Subject: [PATCH 039/224] Fix pre-commit by disabling docformatter --- .github/workflows/build.yml | 6 +++--- .pre-commit-config.yaml | 27 ++++++++++++++------------- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7d69db749efd..a9a4dd2c08a6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -96,7 +96,7 @@ jobs: version: ${{ env.POETRY_VERSION }} - name: Install build dependencies - run: python -m pip install --upgrade pip setuptools wheel pre-commit==3.8.0 msgspec # Temporarily pin pre-commit + run: python -m pip install --upgrade pip setuptools wheel pre-commit msgspec # ta-lib Python install currently broken # https://github.com/TA-Lib/ta-lib-python/issues/655 @@ -235,7 +235,7 @@ jobs: version: ${{ env.POETRY_VERSION }} - name: Install build dependencies - run: python -m pip install --upgrade pip setuptools wheel pre-commit==3.8.0 msgspec + run: python -m pip install --upgrade pip setuptools wheel pre-commit msgspec - name: Cached pre-commit id: cached-pre-commit @@ -352,7 +352,7 @@ jobs: version: ${{ env.POETRY_VERSION }} - name: Install build dependencies - run: python -m pip install --upgrade pip setuptools wheel pre-commit==3.8.0 msgspec + run: python -m pip install --upgrade pip setuptools wheel pre-commit msgspec - name: Cached pre-commit id: cached-pre-commit diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 97430197bdde..942d231e3375 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -97,19 +97,20 @@ repos: entry: "isort" args: ["--settings-file", "pyproject.toml"] - - repo: https://github.com/PyCQA/docformatter - rev: v1.7.5 - hooks: - - id: docformatter - additional_dependencies: [tomli] - args: [ - "--black", - "--make-summary-multi-line", - "--pre-summary-newline", - "--blank", - "--recursive", - "--in-place", - ] + # Disable until updated for pre-commit v4.x + # - repo: https://github.com/PyCQA/docformatter + # rev: v1.7.5 + # hooks: + # - id: docformatter + # additional_dependencies: [tomli] + # args: [ + # "--black", + # "--make-summary-multi-line", + # "--pre-summary-newline", + # "--blank", + # "--recursive", + # "--in-place", + # ] - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.11.2 diff --git a/poetry.lock b/poetry.lock index 62ed91c7745e..4754479bbedb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2453,13 +2453,13 @@ pytest = "*" [[package]] name = "pre-commit" -version = "3.8.0" +version = "4.0.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" files = [ - {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, - {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, + {file = "pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878"}, + {file = "pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2"}, ] [package.dependencies] @@ -3876,4 +3876,4 @@ polymarket = ["py-clob-client"] [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.13" -content-hash = "011483cdedbd9cd6487a57b1c3a1960fa92af03980d284b9d6e82f8f6b89b44a" +content-hash = "1a116a21f5d78658771d0a19d929107f8f3c073720b75508b00d2566604c9718" diff --git a/pyproject.toml b/pyproject.toml index 8329f3276975..b9dcae5a84b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -91,7 +91,7 @@ black = "^24.10.0" docformatter = "^1.7.5" mypy = "^1.11.2" pandas-stubs = "^2.2.2" -pre-commit = "^3.8.0" +pre-commit = "^4.0.1" ruff = "^0.6.9" types-pytz = "^2024.1" types-requests = "^2.32" From 200119aded793ac37482d598d40ce88f668db3ce Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 9 Oct 2024 05:04:15 +1100 Subject: [PATCH 040/224] Update dependencies --- nautilus_core/Cargo.lock | 24 +- nautilus_core/Cargo.toml | 2 +- nautilus_core/cli/Cargo.toml | 4 +- poetry.lock | 418 ++++++++++++++++++++++------------- 4 files changed, 278 insertions(+), 170 deletions(-) diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 964d01355109..375ec25fb406 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -573,9 +573,9 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.69.4" +version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ "bitflags 2.6.0", "cexpr", @@ -893,9 +893,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.19" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be5744db7978a28d9df86a214130d106a89ce49644cbc4e3f0c22c3fba30615" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -903,9 +903,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.19" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5fbc17d3ef8278f55b282b2a2e75ae6f6c7d4bb70ed3d0382375104bfafdb4b" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -1618,18 +1618,18 @@ dependencies = [ [[package]] name = "derive_builder" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd33f37ee6a119146a1781d3356a7c26028f83d779b2e04ecd45fdc75c76877b" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" dependencies = [ "derive_builder_macro", ] [[package]] name = "derive_builder_core" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7431fa049613920234f22c47fdc33e6cf3ee83067091ea4277a3f8c4587aae38" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ "darling", "proc-macro2", @@ -1639,9 +1639,9 @@ dependencies = [ [[package]] name = "derive_builder_macro" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4abae7035bf79b9877b779505d8cf3749285b80c43941eda66604841889451dc" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", "syn 2.0.79", diff --git a/nautilus_core/Cargo.toml b/nautilus_core/Cargo.toml index f00d4d7bcf21..c7592f6a678a 100644 --- a/nautilus_core/Cargo.toml +++ b/nautilus_core/Cargo.toml @@ -30,7 +30,7 @@ documentation = "https://nautilustrader.io/docs" anyhow = "1.0.89" bytes = { version = "1.7.2", features = ["serde"] } chrono = "0.4.38" -derive_builder = "0.20.1" +derive_builder = "0.20.2" futures = "0.3.31" hex = "0.4.3" indexmap = { version = "2.6.0", features = ["serde"] } diff --git a/nautilus_core/cli/Cargo.toml b/nautilus_core/cli/Cargo.toml index 051153e16503..932c7f7b5c62 100644 --- a/nautilus_core/cli/Cargo.toml +++ b/nautilus_core/cli/Cargo.toml @@ -17,8 +17,8 @@ nautilus-core = { path = "../core" } nautilus-infrastructure = { path = "../infrastructure" , features = ["postgres"] } anyhow = { workspace = true } log = { workspace = true } -tokio = {workspace = true} -clap = { version = "4.5.19", features = ["derive", "env"] } +tokio = { workspace = true } +clap = { version = "4.5.20", features = ["derive", "env"] } clap_derive = { version = "4.5.18" } dotenvy = { version = "0.15.7" } simple_logger = "5.0.0" diff --git a/poetry.lock b/poetry.lock index 4754479bbedb..494905ac4147 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1830,72 +1830,72 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "3.0.0" +version = "3.0.1" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" files = [ - {file = "MarkupSafe-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:380faf314c3c84c1682ca672e6280c6c59e92d0bc13dc71758ffa2de3cd4e252"}, - {file = "MarkupSafe-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ee9790be6f62121c4c58bbced387b0965ab7bffeecb4e17cc42ef290784e363"}, - {file = "MarkupSafe-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ddf5cb8e9c00d9bf8b0c75949fb3ff9ea2096ba531693e2e87336d197fdb908"}, - {file = "MarkupSafe-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b36473a2d3e882d1873ea906ce54408b9588dc2c65989664e6e7f5a2de353d7"}, - {file = "MarkupSafe-3.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dba0f83119b9514bc37272ad012f0cc03f0805cc6a2bea7244e19250ac8ff29f"}, - {file = "MarkupSafe-3.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:409535e0521c4630d5b5a1bf284e9d3c76d2fc2f153ebb12cf3827797798cc99"}, - {file = "MarkupSafe-3.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64a7c7856c3a409011139b17d137c2924df4318dab91ee0530800819617c4381"}, - {file = "MarkupSafe-3.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4deea1d9169578917d1f35cdb581bc7bab56a7e8c5be2633bd1b9549c3c22a01"}, - {file = "MarkupSafe-3.0.0-cp310-cp310-win32.whl", hash = "sha256:3cd0bba31d484fe9b9d77698ddb67c978704603dc10cdc905512af308cfcca6b"}, - {file = "MarkupSafe-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:4ca04c60006867610a06575b46941ae616b19da0adc85b9f8f3d9cbd7a3da385"}, - {file = "MarkupSafe-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e64b390a306f9e849ee809f92af6a52cda41741c914358e0e9f8499d03741526"}, - {file = "MarkupSafe-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c524203207f5b569df06c96dafdc337228921ee8c3cc5f6e891d024c6595352"}, - {file = "MarkupSafe-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c409691696bec2b5e5c9efd9593c99025bf2f317380bf0d993ee0213516d908a"}, - {file = "MarkupSafe-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64f7d04410be600aa5ec0626d73d43e68a51c86500ce12917e10fd013e258df5"}, - {file = "MarkupSafe-3.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:105ada43a61af22acb8774514c51900dc820c481cc5ba53f17c09d294d9c07ca"}, - {file = "MarkupSafe-3.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a5fd5500d4e4f7cc88d8c0f2e45126c4307ed31e08f8ec521474f2fd99d35ac3"}, - {file = "MarkupSafe-3.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25396abd52b16900932e05b7104bcdc640a4d96c914f39c3b984e5a17b01fba0"}, - {file = "MarkupSafe-3.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3efde9a8c56c3b6e5f3fa4baea828f8184970c7c78480fedb620d804b1c31e5c"}, - {file = "MarkupSafe-3.0.0-cp311-cp311-win32.whl", hash = "sha256:12ddac720b8965332d36196f6f83477c6351ba6a25d4aff91e30708c729350d7"}, - {file = "MarkupSafe-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:658fdf6022740896c403d45148bf0c36978c6b48c9ef8b1f8d0c7a11b6cdea86"}, - {file = "MarkupSafe-3.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d261ec38b8a99a39b62e0119ed47fe3b62f7691c500bc1e815265adc016438c1"}, - {file = "MarkupSafe-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e363440c8534bf2f2ef1b8fdc02037eb5fff8fce2a558519b22d6a3a38b3ec5e"}, - {file = "MarkupSafe-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7835de4c56066e096407a1852e5561f6033786dd987fa90dc384e45b9bd21295"}, - {file = "MarkupSafe-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6cc46a27d904c9be5732029769acf4b0af69345172ed1ef6d4db0c023ff603b"}, - {file = "MarkupSafe-3.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0411641d31aa6f7f0cc13f0f18b63b8dc08da5f3a7505972a42ab059f479ba3"}, - {file = "MarkupSafe-3.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b2a7afd24d408b907672015555bc10be2382e6c5f62a488e2d452da670bbd389"}, - {file = "MarkupSafe-3.0.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c8ab7efeff1884c5da8e18f743b667215300e09043820d11723718de0b7db934"}, - {file = "MarkupSafe-3.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8219e2207f6c188d15614ea043636c2b36d2d79bf853639c124a179412325a13"}, - {file = "MarkupSafe-3.0.0-cp312-cp312-win32.whl", hash = "sha256:59420b5a9a5d3fee483a32adb56d7369ae0d630798da056001be1e9f674f3aa6"}, - {file = "MarkupSafe-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:7ed789d0f7f11fcf118cf0acb378743dfdd4215d7f7d18837c88171405c9a452"}, - {file = "MarkupSafe-3.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:27d6a73682b99568916c54a4bfced40e7d871ba685b580ea04bbd2e405dfd4c5"}, - {file = "MarkupSafe-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:494a64efc535e147fcc713dba58eecfce3a79f1e93ebe81995b387f5cd9bc2e1"}, - {file = "MarkupSafe-3.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5243044a927e8a6bb28517838662a019cd7f73d7f106bbb37ab5e7fa8451a92"}, - {file = "MarkupSafe-3.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63dae84964a9a3d2610808cee038f435d9a111620c37ccf872c2fcaeca6865b3"}, - {file = "MarkupSafe-3.0.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dcbee57fedc9b2182c54ffc1c5eed316c3da8bbfeda8009e1b5d7220199d15da"}, - {file = "MarkupSafe-3.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f846fd7c241e5bd4161e2a483663eb66e4d8e12130fcdc052f310f388f1d61c6"}, - {file = "MarkupSafe-3.0.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:678fbceb202382aae42c1f0cd9f56b776bc20a58ae5b553ee1fe6b802983a1d6"}, - {file = "MarkupSafe-3.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bd9b8e458e2bab52f9ad3ab5dc8b689a3c84b12b2a2f64cd9a0dfe209fb6b42f"}, - {file = "MarkupSafe-3.0.0-cp313-cp313-win32.whl", hash = "sha256:1fd02f47596e00a372f5b4af2b4c45f528bade65c66dfcbc6e1ea1bfda758e98"}, - {file = "MarkupSafe-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:b94bec9eda10111ec7102ef909eca4f3c2df979643924bfe58375f560713a7d1"}, - {file = "MarkupSafe-3.0.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:509c424069dd037d078925b6815fc56b7271f3aaec471e55e6fa513b0a80d2aa"}, - {file = "MarkupSafe-3.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:81be2c0084d8c69e97e3c5d73ce9e2a6e523556f2a19c4e195c09d499be2f808"}, - {file = "MarkupSafe-3.0.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b43ac1eb9f91e0c14aac1d2ef0f76bc7b9ceea51de47536f61268191adf52ad7"}, - {file = "MarkupSafe-3.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b231255770723f1e125d63c14269bcd8b8136ecfb620b9a18c0297e046d0736"}, - {file = "MarkupSafe-3.0.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c182d45600556917f811aa019d834a89fe4b6f6255da2fd0bdcf80e970f95918"}, - {file = "MarkupSafe-3.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f91c90f8f3bf436f81c12eeb4d79f9ddd263c71125e6ad71341906832a34386"}, - {file = "MarkupSafe-3.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a7171d2b869e9be238ea318c196baf58fbf272704e9c1cd4be8c380eea963342"}, - {file = "MarkupSafe-3.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cb244adf2499aa37d5dc43431990c7f0b632d841af66a51d22bd89c437b60264"}, - {file = "MarkupSafe-3.0.0-cp313-cp313t-win32.whl", hash = "sha256:96e3ed550600185d34429477f1176cedea8293fa40e47fe37a05751bcb64c997"}, - {file = "MarkupSafe-3.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:1d151b9cf3307e259b749125a5a08c030ba15a8f1d567ca5bfb0e92f35e761f5"}, - {file = "MarkupSafe-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:23efb2be7221105c8eb0e905433414d2439cb0a8c5d5ca081c1c72acef0f5613"}, - {file = "MarkupSafe-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81ee9c967956b9ea39b3a5270b7cb1740928d205b0dc72629164ce621b4debf9"}, - {file = "MarkupSafe-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5509a8373fed30b978557890a226c3d30569746c565b9daba69df80c160365a5"}, - {file = "MarkupSafe-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1c13c6c908811f867a8e9e66efb2d6c03d1cdd83e92788fe97f693c457dc44f"}, - {file = "MarkupSafe-3.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7e63d1977d3806ce0a1a3e0099b089f61abdede5238ca6a3f3bf8877b46d095"}, - {file = "MarkupSafe-3.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d2c099be5274847d606574234e494f23a359e829ba337ea9037c3a72b0851942"}, - {file = "MarkupSafe-3.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e042ccf8fe5bf8b6a4b38b3f7d618eb10ea20402b0c9f4add9293408de447974"}, - {file = "MarkupSafe-3.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:98fb3a2bf525ad66db96745707b93ba0f78928b7a1cb2f1cb4b143bc7e2ba3b3"}, - {file = "MarkupSafe-3.0.0-cp39-cp39-win32.whl", hash = "sha256:a80c6740e1bfbe50cea7cbf74f48823bb57bd59d914ee22ff8a81963b08e62d2"}, - {file = "MarkupSafe-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:5d207ff5cceef77796f8aacd44263266248cf1fbc601441524d7835613f8abec"}, - {file = "markupsafe-3.0.0.tar.gz", hash = "sha256:03ff62dea2fef3eadf2f1853bc6332bcb0458d9608b11dfb1cd5aeda1c178ea6"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:db842712984e91707437461930e6011e60b39136c7331e971952bb30465bc1a1"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ffb4a8e7d46ed96ae48805746755fadd0909fea2306f93d5d8233ba23dda12a"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67c519635a4f64e495c50e3107d9b4075aec33634272b5db1cde839e07367589"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48488d999ed50ba8d38c581d67e496f955821dc183883550a6fbc7f1aefdc170"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f31ae06f1328595d762c9a2bf29dafd8621c7d3adc130cbb46278079758779ca"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80fcbf3add8790caddfab6764bde258b5d09aefbe9169c183f88a7410f0f6dea"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3341c043c37d78cc5ae6e3e305e988532b072329639007fd408a476642a89fd6"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cb53e2a99df28eee3b5f4fea166020d3ef9116fdc5764bc5117486e6d1211b25"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-win32.whl", hash = "sha256:db15ce28e1e127a0013dfb8ac243a8e392db8c61eae113337536edb28bdc1f97"}, + {file = "MarkupSafe-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:4ffaaac913c3f7345579db4f33b0020db693f302ca5137f106060316761beea9"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b954093679d5750495725ea6f88409946d69cfb25ea7b4c846eef5044194f583"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d98e66a24497637dd31ccab090b34392dddb1f2f811c4b4cd80c230205c074a3"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad91738f14eb8da0ff82f2acd0098b6257621410dcbd4df20aaa5b4233d75a50"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7044312a928a66a4c2a22644147bc61a199c1709712069a344a3fb5cfcf16915"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a4792d3b3a6dfafefdf8e937f14906a51bd27025a36f4b188728a73382231d91"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-win32.whl", hash = "sha256:fa7d686ed9883f3d664d39d5a8e74d3c5f63e603c2e3ff0abcba23eac6542635"}, + {file = "MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8ae369e84466aa70f3154ee23c1451fda10a8ee1b63923ce76667e3077f2b0c4"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40f1e10d51c92859765522cbd79c5c8989f40f0419614bcdc5015e7b6bf97fc5"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a4cb365cb49b750bdb60b846b0c0bc49ed62e59a76635095a179d440540c346"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee3941769bd2522fe39222206f6dd97ae83c442a94c90f2b7a25d847d40f4729"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62fada2c942702ef8952754abfc1a9f7658a4d5460fabe95ac7ec2cbe0d02abc"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c2d64fdba74ad16138300815cfdc6ab2f4647e23ced81f59e940d7d4a1469d9"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fb532dd9900381d2e8f48172ddc5a59db4c445a11b9fab40b3b786da40d3b56b"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0f84af7e813784feb4d5e4ff7db633aba6c8ca64a833f61d8e4eade234ef0c38"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-win32.whl", hash = "sha256:cbf445eb5628981a80f54087f9acdbf84f9b7d862756110d172993b9a5ae81aa"}, + {file = "MarkupSafe-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:a10860e00ded1dd0a65b83e717af28845bb7bd16d8ace40fe5531491de76b79f"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e81c52638315ff4ac1b533d427f50bc0afc746deb949210bc85f05d4f15fd772"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:312387403cd40699ab91d50735ea7a507b788091c416dd007eac54434aee51da"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ae99f31f47d849758a687102afdd05bd3d3ff7dbab0a8f1587981b58a76152a"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97ff7fedf56d86bae92fa0a646ce1a0ec7509a7578e1ed238731ba13aabcd1c"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7420ceda262dbb4b8d839a4ec63d61c261e4e77677ed7c66c99f4e7cb5030dd"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45d42d132cff577c92bfba536aefcfea7e26efb975bd455db4e6602f5c9f45e7"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c8817557d0de9349109acb38b9dd570b03cc5014e8aabf1cbddc6e81005becd"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a54c43d3ec4cf2a39f4387ad044221c66a376e58c0d0e971d47c475ba79c6b5"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-win32.whl", hash = "sha256:c91b394f7601438ff79a4b93d16be92f216adb57d813a78be4446fe0f6bc2d8c"}, + {file = "MarkupSafe-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:fe32482b37b4b00c7a52a07211b479653b7fe4f22b2e481b9a9b099d8a430f2f"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:17b2aea42a7280db02ac644db1d634ad47dcc96faf38ab304fe26ba2680d359a"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:852dc840f6d7c985603e60b5deaae1d89c56cb038b577f6b5b8c808c97580f1d"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0778de17cff1acaeccc3ff30cd99a3fd5c50fc58ad3d6c0e0c4c58092b859396"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:800100d45176652ded796134277ecb13640c1a537cad3b8b53da45aa96330453"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d06b24c686a34c86c8c1fba923181eae6b10565e4d80bdd7bc1c8e2f11247aa4"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:33d1c36b90e570ba7785dacd1faaf091203d9942bc036118fab8110a401eb1a8"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:beeebf760a9c1f4c07ef6a53465e8cfa776ea6a2021eda0d0417ec41043fe984"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bbde71a705f8e9e4c3e9e33db69341d040c827c7afa6789b14c6e16776074f5a"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-win32.whl", hash = "sha256:82b5dba6eb1bcc29cc305a18a3c5365d2af06ee71b123216416f7e20d2a84e5b"}, + {file = "MarkupSafe-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:730d86af59e0e43ce277bb83970530dd223bf7f2a838e086b50affa6ec5f9295"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4935dd7883f1d50e2ffecca0aa33dc1946a94c8f3fdafb8df5c330e48f71b132"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e9393357f19954248b00bed7c56f29a25c930593a77630c719653d51e7669c2a"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40621d60d0e58aa573b68ac5e2d6b20d44392878e0bfc159012a5787c4e35bc8"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f94190df587738280d544971500b9cafc9b950d32efcb1fba9ac10d84e6aa4e6"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6a387d61fe41cdf7ea95b38e9af11cfb1a63499af2759444b99185c4ab33f5b"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8ad4ad1429cd4f315f32ef263c1342166695fad76c100c5d979c45d5570ed58b"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e24bfe89c6ac4c31792793ad9f861b8f6dc4546ac6dc8f1c9083c7c4f2b335cd"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2a4b34a8d14649315c4bc26bbfa352663eb51d146e35eef231dd739d54a5430a"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-win32.whl", hash = "sha256:242d6860f1fd9191aef5fae22b51c5c19767f93fb9ead4d21924e0bcb17619d8"}, + {file = "MarkupSafe-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:93e8248d650e7e9d49e8251f883eed60ecbc0e8ffd6349e18550925e31bd029b"}, + {file = "markupsafe-3.0.1.tar.gz", hash = "sha256:3e683ee4f5d0fa2dde4db77ed8dd8a876686e3fc417655c2ece9a90576905344"}, ] [[package]] @@ -2469,6 +2469,113 @@ nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" +[[package]] +name = "propcache" +version = "0.2.0" +description = "Accelerated property cache" +optional = false +python-versions = ">=3.8" +files = [ + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336"}, + {file = "propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad"}, + {file = "propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"}, + {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"}, + {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348"}, + {file = "propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5"}, + {file = "propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544"}, + {file = "propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032"}, + {file = "propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed"}, + {file = "propcache-0.2.0-cp38-cp38-win32.whl", hash = "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d"}, + {file = "propcache-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798"}, + {file = "propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9"}, + {file = "propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df"}, + {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"}, + {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"}, +] + [[package]] name = "protobuf" version = "5.27.1" @@ -3763,108 +3870,109 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "yarl" -version = "1.13.1" +version = "1.14.0" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ - {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:82e692fb325013a18a5b73a4fed5a1edaa7c58144dc67ad9ef3d604eccd451ad"}, - {file = "yarl-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df4e82e68f43a07735ae70a2d84c0353e58e20add20ec0af611f32cd5ba43fb4"}, - {file = "yarl-1.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec9dd328016d8d25702a24ee274932aebf6be9787ed1c28d021945d264235b3c"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5820bd4178e6a639b3ef1db8b18500a82ceab6d8b89309e121a6859f56585b05"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86c438ce920e089c8c2388c7dcc8ab30dfe13c09b8af3d306bcabb46a053d6f7"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3de86547c820e4f4da4606d1c8ab5765dd633189791f15247706a2eeabc783ae"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca53632007c69ddcdefe1e8cbc3920dd88825e618153795b57e6ebcc92e752a"}, - {file = "yarl-1.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4ee1d240b84e2f213565f0ec08caef27a0e657d4c42859809155cf3a29d1735"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c49f3e379177f4477f929097f7ed4b0622a586b0aa40c07ac8c0f8e40659a1ac"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5c5e32fef09ce101fe14acd0f498232b5710effe13abac14cd95de9c274e689e"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab9524e45ee809a083338a749af3b53cc7efec458c3ad084361c1dbf7aaf82a2"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b1481c048fe787f65e34cb06f7d6824376d5d99f1231eae4778bbe5c3831076d"}, - {file = "yarl-1.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:31497aefd68036d8e31bfbacef915826ca2e741dbb97a8d6c7eac66deda3b606"}, - {file = "yarl-1.13.1-cp310-cp310-win32.whl", hash = "sha256:1fa56f34b2236f5192cb5fceba7bbb09620e5337e0b6dfe2ea0ddbd19dd5b154"}, - {file = "yarl-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bbb418f46c7f7355084833051701b2301092e4611d9e392360c3ba2e3e69f88"}, - {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51"}, - {file = "yarl-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e"}, - {file = "yarl-1.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74"}, - {file = "yarl-1.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da"}, - {file = "yarl-1.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246"}, - {file = "yarl-1.13.1-cp311-cp311-win32.whl", hash = "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a"}, - {file = "yarl-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2"}, - {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f452cc1436151387d3d50533523291d5f77c6bc7913c116eb985304abdbd9ec9"}, - {file = "yarl-1.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9cec42a20eae8bebf81e9ce23fb0d0c729fc54cf00643eb251ce7c0215ad49fe"}, - {file = "yarl-1.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d959fe96e5c2712c1876d69af0507d98f0b0e8d81bee14cfb3f6737470205419"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8c837ab90c455f3ea8e68bee143472ee87828bff19ba19776e16ff961425b57"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94a993f976cdcb2dc1b855d8b89b792893220db8862d1a619efa7451817c836b"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2442a415a5f4c55ced0fade7b72123210d579f7d950e0b5527fc598866e62c"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fdbf0418489525231723cdb6c79e7738b3cbacbaed2b750cb033e4ea208f220"}, - {file = "yarl-1.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b7f6e699304717fdc265a7e1922561b02a93ceffdaefdc877acaf9b9f3080b8"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bcd5bf4132e6a8d3eb54b8d56885f3d3a38ecd7ecae8426ecf7d9673b270de43"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2a93a4557f7fc74a38ca5a404abb443a242217b91cd0c4840b1ebedaad8919d4"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:22b739f99c7e4787922903f27a892744189482125cc7b95b747f04dd5c83aa9f"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2db874dd1d22d4c2c657807562411ffdfabec38ce4c5ce48b4c654be552759dc"}, - {file = "yarl-1.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4feaaa4742517eaceafcbe74595ed335a494c84634d33961214b278126ec1485"}, - {file = "yarl-1.13.1-cp312-cp312-win32.whl", hash = "sha256:bbf9c2a589be7414ac4a534d54e4517d03f1cbb142c0041191b729c2fa23f320"}, - {file = "yarl-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:d07b52c8c450f9366c34aa205754355e933922c79135125541daae6cbf31c799"}, - {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95c6737f28069153c399d875317f226bbdea939fd48a6349a3b03da6829fb550"}, - {file = "yarl-1.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cd66152561632ed4b2a9192e7f8e5a1d41e28f58120b4761622e0355f0fe034c"}, - {file = "yarl-1.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6a2acde25be0cf9be23a8f6cbd31734536a264723fca860af3ae5e89d771cd71"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18595e6a2ee0826bf7dfdee823b6ab55c9b70e8f80f8b77c37e694288f5de1"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a31d21089894942f7d9a8df166b495101b7258ff11ae0abec58e32daf8088813"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45f209fb4bbfe8630e3d2e2052535ca5b53d4ce2d2026bed4d0637b0416830da"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f722f30366474a99745533cc4015b1781ee54b08de73260b2bbe13316079851"}, - {file = "yarl-1.13.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3bf60444269345d712838bb11cc4eadaf51ff1a364ae39ce87a5ca8ad3bb2c8"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:942c80a832a79c3707cca46bd12ab8aa58fddb34b1626d42b05aa8f0bcefc206"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:44b07e1690f010c3c01d353b5790ec73b2f59b4eae5b0000593199766b3f7a5c"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:396e59b8de7e4d59ff5507fb4322d2329865b909f29a7ed7ca37e63ade7f835c"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3bb83a0f12701c0b91112a11148b5217617982e1e466069d0555be9b372f2734"}, - {file = "yarl-1.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c92b89bffc660f1274779cb6fbb290ec1f90d6dfe14492523a0667f10170de26"}, - {file = "yarl-1.13.1-cp313-cp313-win32.whl", hash = "sha256:269c201bbc01d2cbba5b86997a1e0f73ba5e2f471cfa6e226bcaa7fd664b598d"}, - {file = "yarl-1.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:1d0828e17fa701b557c6eaed5edbd9098eb62d8838344486248489ff233998b8"}, - {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8be8cdfe20787e6a5fcbd010f8066227e2bb9058331a4eccddec6c0db2bb85b2"}, - {file = "yarl-1.13.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08d7148ff11cb8e886d86dadbfd2e466a76d5dd38c7ea8ebd9b0e07946e76e4b"}, - {file = "yarl-1.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4afdf84610ca44dcffe8b6c22c68f309aff96be55f5ea2fa31c0c225d6b83e23"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0d12fe78dcf60efa205e9a63f395b5d343e801cf31e5e1dda0d2c1fb618073d"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298c1eecfd3257aa16c0cb0bdffb54411e3e831351cd69e6b0739be16b1bdaa8"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c14c16831b565707149c742d87a6203eb5597f4329278446d5c0ae7a1a43928e"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9bacedbb99685a75ad033fd4de37129449e69808e50e08034034c0bf063f99"}, - {file = "yarl-1.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:658e8449b84b92a4373f99305de042b6bd0d19bf2080c093881e0516557474a5"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:373f16f38721c680316a6a00ae21cc178e3a8ef43c0227f88356a24c5193abd6"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:45d23c4668d4925688e2ea251b53f36a498e9ea860913ce43b52d9605d3d8177"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f7917697bcaa3bc3e83db91aa3a0e448bf5cde43c84b7fc1ae2427d2417c0224"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5989a38ba1281e43e4663931a53fbf356f78a0325251fd6af09dd03b1d676a09"}, - {file = "yarl-1.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11b3ca8b42a024513adce810385fcabdd682772411d95bbbda3b9ed1a4257644"}, - {file = "yarl-1.13.1-cp38-cp38-win32.whl", hash = "sha256:dcaef817e13eafa547cdfdc5284fe77970b891f731266545aae08d6cce52161e"}, - {file = "yarl-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:7addd26594e588503bdef03908fc207206adac5bd90b6d4bc3e3cf33a829f57d"}, - {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a0ae6637b173d0c40b9c1462e12a7a2000a71a3258fa88756a34c7d38926911c"}, - {file = "yarl-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:576365c9f7469e1f6124d67b001639b77113cfd05e85ce0310f5f318fd02fe85"}, - {file = "yarl-1.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78f271722423b2d4851cf1f4fa1a1c4833a128d020062721ba35e1a87154a049"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d74f3c335cfe9c21ea78988e67f18eb9822f5d31f88b41aec3a1ec5ecd32da5"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1891d69a6ba16e89473909665cd355d783a8a31bc84720902c5911dbb6373465"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb382fd7b4377363cc9f13ba7c819c3c78ed97c36a82f16f3f92f108c787cbbf"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c8854b9f80693d20cec797d8e48a848c2fb273eb6f2587b57763ccba3f3bd4b"}, - {file = "yarl-1.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbf2c3f04ff50f16404ce70f822cdc59760e5e2d7965905f0e700270feb2bbfc"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fb9f59f3848edf186a76446eb8bcf4c900fe147cb756fbbd730ef43b2e67c6a7"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ef9b85fa1bc91c4db24407e7c4da93a5822a73dd4513d67b454ca7064e8dc6a3"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:098b870c18f1341786f290b4d699504e18f1cd050ed179af8123fd8232513424"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8c723c91c94a3bc8033dd2696a0f53e5d5f8496186013167bddc3fb5d9df46a3"}, - {file = "yarl-1.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:44a4c40a6f84e4d5955b63462a0e2a988f8982fba245cf885ce3be7618f6aa7d"}, - {file = "yarl-1.13.1-cp39-cp39-win32.whl", hash = "sha256:84bbcdcf393139f0abc9f642bf03f00cac31010f3034faa03224a9ef0bb74323"}, - {file = "yarl-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:fc2931ac9ce9c61c9968989ec831d3a5e6fcaaff9474e7cfa8de80b7aff5a093"}, - {file = "yarl-1.13.1-py3-none-any.whl", hash = "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0"}, - {file = "yarl-1.13.1.tar.gz", hash = "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0"}, + {file = "yarl-1.14.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1bfc25aa6a7c99cf86564210f79a0b7d4484159c67e01232b116e445b3036547"}, + {file = "yarl-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0cf21f46a15d445417de8fc89f2568852cf57fe8ca1ab3d19ddb24d45c0383ae"}, + {file = "yarl-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1dda53508df0de87b6e6b0a52d6718ff6c62a5aca8f5552748404963df639269"}, + {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:587c3cc59bc148a9b1c07a019346eda2549bc9f468acd2f9824d185749acf0a6"}, + {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3007a5b75cb50140708420fe688c393e71139324df599434633019314ceb8b59"}, + {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06ff23462398333c78b6f4f8d3d70410d657a471c2c5bbe6086133be43fc8f1a"}, + {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689a99a42ee4583fcb0d3a67a0204664aa1539684aed72bdafcbd505197a91c4"}, + {file = "yarl-1.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0547ab1e9345dc468cac8368d88ea4c5bd473ebc1d8d755347d7401982b5dd8"}, + {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:742aef0a99844faaac200564ea6f5e08facb285d37ea18bd1a5acf2771f3255a"}, + {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:176110bff341b6730f64a1eb3a7070e12b373cf1c910a9337e7c3240497db76f"}, + {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:46a9772a1efa93f9cd170ad33101c1817c77e0e9914d4fe33e2da299d7cf0f9b"}, + {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ee2c68e4f2dd1b1c15b849ba1c96fac105fca6ffdb7c1e8be51da6fabbdeafb9"}, + {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:047b258e00b99091b6f90355521f026238c63bd76dcf996d93527bb13320eefd"}, + {file = "yarl-1.14.0-cp310-cp310-win32.whl", hash = "sha256:0aa92e3e30a04f9462a25077db689c4ac5ea9ab6cc68a2e563881b987d42f16d"}, + {file = "yarl-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:d9baec588f015d0ee564057aa7574313c53a530662ffad930b7886becc85abdf"}, + {file = "yarl-1.14.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:07f9eaf57719d6721ab15805d85f4b01a5b509a0868d7320134371bcb652152d"}, + {file = "yarl-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c14b504a74e58e2deb0378b3eca10f3d076635c100f45b113c18c770b4a47a50"}, + {file = "yarl-1.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16a682a127930f3fc4e42583becca6049e1d7214bcad23520c590edd741d2114"}, + {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73bedd2be05f48af19f0f2e9e1353921ce0c83f4a1c9e8556ecdcf1f1eae4892"}, + {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3ab950f8814f3b7b5e3eebc117986f817ec933676f68f0a6c5b2137dd7c9c69"}, + {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b693c63e7e64b524f54aa4888403c680342d1ad0d97be1707c531584d6aeeb4f"}, + {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85cb3e40eaa98489f1e2e8b29f5ad02ee1ee40d6ce6b88d50cf0f205de1d9d2c"}, + {file = "yarl-1.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f24f08b6c9b9818fd80612c97857d28f9779f0d1211653ece9844fc7b414df2"}, + {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:29a84a46ec3ebae7a1c024c055612b11e9363a8a23238b3e905552d77a2bc51b"}, + {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5cd5dad8366e0168e0fd23d10705a603790484a6dbb9eb272b33673b8f2cce72"}, + {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a152751af7ef7b5d5fa6d215756e508dd05eb07d0cf2ba51f3e740076aa74373"}, + {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:3d569f877ed9a708e4c71a2d13d2940cb0791da309f70bd970ac1a5c088a0a92"}, + {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6a615cad11ec3428020fb3c5a88d85ce1b5c69fd66e9fcb91a7daa5e855325dd"}, + {file = "yarl-1.14.0-cp311-cp311-win32.whl", hash = "sha256:bab03192091681d54e8225c53f270b0517637915d9297028409a2a5114ff4634"}, + {file = "yarl-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:985623575e5c4ea763056ffe0e2d63836f771a8c294b3de06d09480538316b13"}, + {file = "yarl-1.14.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fc2c80bc87fba076e6cbb926216c27fba274dae7100a7b9a0983b53132dd99f2"}, + {file = "yarl-1.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:55c144d363ad4626ca744556c049c94e2b95096041ac87098bb363dcc8635e8d"}, + {file = "yarl-1.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b03384eed107dbeb5f625a99dc3a7de8be04fc8480c9ad42fccbc73434170b20"}, + {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f72a0d746d38cb299b79ce3d4d60ba0892c84bbc905d0d49c13df5bace1b65f8"}, + {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8648180b34faaea4aa5b5ca7e871d9eb1277033fa439693855cf0ea9195f85f1"}, + {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9557c9322aaa33174d285b0c1961fb32499d65ad1866155b7845edc876c3c835"}, + {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f50eb3837012a937a2b649ec872b66ba9541ad9d6f103ddcafb8231cfcafd22"}, + {file = "yarl-1.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8892fa575ac9b1b25fae7b221bc4792a273877b9b56a99ee2d8d03eeb3dbb1d2"}, + {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6a2c5c5bb2556dfbfffffc2bcfb9c235fd2b566d5006dfb2a37afc7e3278a07"}, + {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ab3abc0b78a5dfaa4795a6afbe7b282b6aa88d81cf8c1bb5e394993d7cae3457"}, + {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:47eede5d11d669ab3759b63afb70d28d5328c14744b8edba3323e27dc52d298d"}, + {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fe4d2536c827f508348d7b40c08767e8c7071614250927233bf0c92170451c0a"}, + {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0fd7b941dd1b00b5f0acb97455fea2c4b7aac2dd31ea43fb9d155e9bc7b78664"}, + {file = "yarl-1.14.0-cp312-cp312-win32.whl", hash = "sha256:99ff3744f5fe48288be6bc402533b38e89749623a43208e1d57091fc96b783b9"}, + {file = "yarl-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:1ca3894e9e9f72da93544f64988d9c052254a338a9f855165f37f51edb6591de"}, + {file = "yarl-1.14.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5d02d700705d67e09e1f57681f758f0b9d4412eeb70b2eb8d96ca6200b486db3"}, + {file = "yarl-1.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:30600ba5db60f7c0820ef38a2568bb7379e1418ecc947a0f76fd8b2ff4257a97"}, + {file = "yarl-1.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e85d86527baebb41a214cc3b45c17177177d900a2ad5783dbe6f291642d4906f"}, + {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37001e5d4621cef710c8dc1429ca04e189e572f128ab12312eab4e04cf007132"}, + {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4f4547944d4f5cfcdc03f3f097d6f05bbbc915eaaf80a2ee120d0e756de377d"}, + {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75ff4c819757f9bdb35de049a509814d6ce851fe26f06eb95a392a5640052482"}, + {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68ac1a09392ed6e3fd14be880d39b951d7b981fd135416db7d18a6208c536561"}, + {file = "yarl-1.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96952f642ac69075e44c7d0284528938fdff39422a1d90d3e45ce40b72e5e2d9"}, + {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a56fbe3d7f3bce1d060ea18d2413a2ca9ca814eea7cedc4d247b5f338d54844e"}, + {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7e2637d75e92763d1322cb5041573279ec43a80c0f7fbbd2d64f5aee98447b17"}, + {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9abe80ae2c9d37c17599557b712e6515f4100a80efb2cda15f5f070306477cd2"}, + {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:217a782020b875538eebf3948fac3a7f9bbbd0fd9bf8538f7c2ad7489e80f4e8"}, + {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9cfef3f14f75bf6aba73a76caf61f9d00865912a04a4393c468a7ce0981b519"}, + {file = "yarl-1.14.0-cp313-cp313-win32.whl", hash = "sha256:d8361c7d04e6a264481f0b802e395f647cd3f8bbe27acfa7c12049efea675bd1"}, + {file = "yarl-1.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:bc24f968b82455f336b79bf37dbb243b7d76cd40897489888d663d4e028f5069"}, + {file = "yarl-1.14.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:91d875f75fabf76b3018c5f196bf3d308ed2b49ddcb46c1576d6b075754a1393"}, + {file = "yarl-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4009def9be3a7e5175db20aa2d7307ecd00bbf50f7f0f989300710eee1d0b0b9"}, + {file = "yarl-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:582cedde49603f139be572252a318b30dc41039bc0b8165f070f279e5d12187f"}, + {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbd9ff43a04f8ffe8a959a944c2dca10d22f5f99fc6a459f49c3ebfb409309d9"}, + {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9f805e37ed16cc212fdc538a608422d7517e7faf539bedea4fe69425bc55d76"}, + {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95e16e9eaa2d7f5d87421b8fe694dd71606aa61d74b824c8d17fc85cc51983d1"}, + {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:816d24f584edefcc5ca63428f0b38fee00b39fe64e3c5e558f895a18983efe96"}, + {file = "yarl-1.14.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd2660c01367eb3ef081b8fa0a5da7fe767f9427aa82023a961a5f28f0d4af6c"}, + {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:94b2bb9bcfd5be9d27004ea4398fb640373dd0c1a9e219084f42c08f77a720ab"}, + {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c2089a9afef887664115f7fa6d3c0edd6454adaca5488dba836ca91f60401075"}, + {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:2192f718db4a8509f63dd6d950f143279211fa7e6a2c612edc17d85bf043d36e"}, + {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:8385ab36bf812e9d37cf7613999a87715f27ef67a53f0687d28c44b819df7cb0"}, + {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b4c1ecba93e7826dc71ddba75fb7740cdb52e7bd0be9f03136b83f54e6a1f511"}, + {file = "yarl-1.14.0-cp38-cp38-win32.whl", hash = "sha256:e749af6c912a7bb441d105c50c1a3da720474e8acb91c89350080dd600228f0e"}, + {file = "yarl-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:147e36331f6f63e08a14640acf12369e041e0751bb70d9362df68c2d9dcf0c87"}, + {file = "yarl-1.14.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a9f917966d27f7ce30039fe8d900f913c5304134096554fd9bea0774bcda6d1"}, + {file = "yarl-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a2f8fb7f944bcdfecd4e8d855f84c703804a594da5123dd206f75036e536d4d"}, + {file = "yarl-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f4e475f29a9122f908d0f1f706e1f2fc3656536ffd21014ff8a6f2e1b14d1d8"}, + {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8089d4634d8fa2b1806ce44fefa4979b1ab2c12c0bc7ef3dfa45c8a374811348"}, + {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b16f6c75cffc2dc0616ea295abb0e1967601bd1fb1e0af6a1de1c6c887f3439"}, + {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498b3c55087b9d762636bca9b45f60d37e51d24341786dc01b81253f9552a607"}, + {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3f8bfc1db82589ef965ed234b87de30d140db8b6dc50ada9e33951ccd8ec07a"}, + {file = "yarl-1.14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:625f207b1799e95e7c823f42f473c1e9dbfb6192bd56bba8695656d92be4535f"}, + {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:781e2495e408a81e4eaeedeb41ba32b63b1980dddf8b60dbbeff6036bcd35049"}, + {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:659603d26d40dd4463200df9bfbc339fbfaed3fe32e5c432fe1dc2b5d4aa94b4"}, + {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4e0d45ebf975634468682c8bec021618b3ad52c37619e5c938f8f831fa1ac5c0"}, + {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a2e4725a08cb2b4794db09e350c86dee18202bb8286527210e13a1514dc9a59a"}, + {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:19268b4fec1d7760134f2de46ef2608c2920134fb1fa61e451f679e41356dc55"}, + {file = "yarl-1.14.0-cp39-cp39-win32.whl", hash = "sha256:337912bcdcf193ade64b9aae5a4017a0a1950caf8ca140362e361543c6773f21"}, + {file = "yarl-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:b6d0147574ce2e7b812c989e50fa72bbc5338045411a836bd066ce5fc8ac0bce"}, + {file = "yarl-1.14.0-py3-none-any.whl", hash = "sha256:c8ed4034f0765f8861620c1f2f2364d2e58520ea288497084dae880424fc0d9f"}, + {file = "yarl-1.14.0.tar.gz", hash = "sha256:88c7d9d58aab0724b979ab5617330acb1c7030b79379c8138c1c8c94e121d1b3"}, ] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" +propcache = ">=0.2.0" [extras] betfair = ["betfair_parser"] From e1851e82e31aaa8ad451c5dbf53bf6bde3711f24 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 9 Oct 2024 06:25:47 +1100 Subject: [PATCH 041/224] Improve Betfair docs and example --- docs/integrations/betfair.md | 73 ++++++++++++++++++++++---------- examples/live/betfair/betfair.py | 16 +++---- 2 files changed, 59 insertions(+), 30 deletions(-) diff --git a/docs/integrations/betfair.md b/docs/integrations/betfair.md index 447b32cd0aeb..da47f6fb2447 100644 --- a/docs/integrations/betfair.md +++ b/docs/integrations/betfair.md @@ -1,6 +1,9 @@ # Betfair -NautilusTrader offers adapters for integrating with the Betfair REST API and +Founded in 2000, Betfair operates the world’s largest online betting exchange, +with its headquarters in London and satellite offices across the globe. + +NautilusTrader provides an adapter for integrating with the Betfair REST API and Exchange Streaming API. ## Installation @@ -17,6 +20,44 @@ To install from source using poetry: poetry install --extras betfair ``` +## Betfair documentation + +Betfair provides extensive [documentation](https://developer.betfair.com/en/get-started/) for developers integrating with their exchange APIs. +This resource is valuable for gaining background information, understanding the APIs, and troubleshooting integration issues. + +## Application Keys + +Betfair uses Application Keys (App keys) to manage interactions with its APIs. +Initially, you will be given a "Delayed" App key (data delayed 1-180 seconds), later you can apply for a "Live" App key. + +After setting up a funded Betfair account, you will need to obtain your App key. +You can do this through the [Accounts API Demo Tool](https://apps.betfair.com/visualisers/api-ng-account-operations/). Follow these steps: + +1. Log in to your Betfair account. With your browser's developer tools open, inspect the initial POST request to https://identitysso.betfair.com.au/api/login, and find the `ssoid` in the response headers (set in the cookie). +2. Open the Betfair API tool and enter your `ssoid` into the Session Token (ssoid) field. +3. In the left-hand navigation, select `getDeveloperAppKeys`, then click the Execute button at the bottom to retrieve your App key. + +:::info +See also the [Betfair Getting Started - Application Keys](https://betfair-developer-docs.atlassian.net/wiki/spaces/1smk3cen4v3lu3yomq5qye0ni/pages/2687105/Application+Keys) guide. +::: + +### API credentials + +There are two options for supplying your credentials to the Betfair clients. +Either pass the corresponding values to the config dictionaries, or +set the following environment variables: +- `BETFAIR_USERNAME` +- `BETFAIR_PASSWORD` +- `BETFAIR_APP_KEY` +- `BETFAIR_CERT_DIR` + +When starting the trading node, you'll receive immediate confirmation of whether your +credentials are valid and have trading permissions. + +:::tip +Best practice is to manage your credentials using environment variables. +::: + ## Overview The following adapter classes are available: @@ -25,6 +66,7 @@ The following adapter classes are available: - `BetfairExecutionClient` which enables the retrieval of account information and execution and updates for orders (or bets). ## Configuration + The most common use case is to configure a live `TradingNode` to include Betfair data and execution clients. To achieve this, add a `BETFAIR` section to your client configuration(s): @@ -36,18 +78,18 @@ config = TradingNodeConfig( ..., # Omitted data_clients={ "BETFAIR": { - "username": "YOUR_BETFAIR_USERNAME", - "password": "YOUR_BETFAIR_PASSWORD", - "app_key": "YOUR_BETFAIR_APP_KEY", - "cert_dir": "YOUR_BETFAIR_CERT_DIR", + # username=None, # 'BETFAIR_USERNAME' env var + # password=None, # 'BETFAIR_PASSWORD' env var + # app_key=None, # 'BETFAIR_APP_KEY' env var + # cert_dir=None, # 'BETFAIR_CERT_DIR' env var }, }, exec_clients={ "BETFAIR": { - "username": "YOUR_BETFAIR_USERNAME", - "password": "YOUR_BETFAIR_PASSWORD", - "app_key": "YOUR_BETFAIR_APP_KEY", - "cert_dir": "YOUR_BETFAIR_CERT_DIR", + # username=None, # 'BETFAIR_USERNAME' env var + # password=None, # 'BETFAIR_PASSWORD' env var + # app_key=None, # 'BETFAIR_APP_KEY' env var + # cert_dir=None, # 'BETFAIR_CERT_DIR' env var "base_currency": "AUD", }, } @@ -71,16 +113,3 @@ node.add_exec_client_factory("BETFAIR", BetfairLiveExecClientFactory) # Finally build the node node.build() ``` - -### API credentials - -There are two options for supplying your credentials to the Betfair clients. -Either pass the corresponding `api_key` and `api_secret` values to the config dictionaries, or -set the following environment variables: -- `BETFAIR_API_KEY` -- `BETFAIR_API_SECRET` -- `BETFAIR_APP_KEY` -- `BETFAIR_CERT_DIR` - -When starting the trading node, you'll receive immediate confirmation of whether your -credentials are valid and have trading permissions. diff --git a/examples/live/betfair/betfair.py b/examples/live/betfair/betfair.py index bdec36a696e3..5b6a1befc99e 100644 --- a/examples/live/betfair/betfair.py +++ b/examples/live/betfair/betfair.py @@ -73,10 +73,10 @@ async def main( "BETFAIR": BetfairDataClientConfig( account_currency=account.currency_code, instrument_config=instrument_config, - # username="YOUR_BETFAIR_USERNAME", - # password="YOUR_BETFAIR_PASSWORD", - # app_key="YOUR_BETFAIR_APP_KEY", - # cert_dir="YOUR_BETFAIR_CERT_DIR", + # username=None, # 'BETFAIR_USERNAME' env var + # password=None, # 'BETFAIR_PASSWORD' env var + # app_key=None, # 'BETFAIR_APP_KEY' env var + # cert_dir=None, # 'BETFAIR_CERT_DIR' env var ), }, exec_clients={ @@ -84,10 +84,10 @@ async def main( "BETFAIR": BetfairExecClientConfig( account_currency=account.currency_code, instrument_config=instrument_config, - # "username": "YOUR_BETFAIR_USERNAME", - # "password": "YOUR_BETFAIR_PASSWORD", - # "app_key": "YOUR_BETFAIR_APP_KEY", - # "cert_dir": "YOUR_BETFAIR_CERT_DIR", + # username=None, # 'BETFAIR_USERNAME' env var + # password=None, # 'BETFAIR_PASSWORD' env var + # app_key=None, # 'BETFAIR_APP_KEY' env var + # cert_dir=None, # 'BETFAIR_CERT_DIR' env var ), }, ) From 02f076d7bd9f70fa2059d5cae8f0b24f2b788f0d Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 9 Oct 2024 09:54:00 +1100 Subject: [PATCH 042/224] Refine Betfair live example --- examples/live/betfair/betfair.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/live/betfair/betfair.py b/examples/live/betfair/betfair.py index 5b6a1befc99e..19e01b0ea5f2 100644 --- a/examples/live/betfair/betfair.py +++ b/examples/live/betfair/betfair.py @@ -25,8 +25,6 @@ from nautilus_trader.adapters.betfair.factories import get_cached_betfair_client from nautilus_trader.adapters.betfair.factories import get_cached_betfair_instrument_provider from nautilus_trader.adapters.betfair.providers import BetfairInstrumentProviderConfig -from nautilus_trader.common.component import init_logging -from nautilus_trader.common.component import log_level_from_str from nautilus_trader.config import LoggingConfig from nautilus_trader.config import TradingNodeConfig from nautilus_trader.examples.strategies.orderbook_imbalance import OrderBookImbalance @@ -42,8 +40,11 @@ async def main( instrument_config: BetfairInstrumentProviderConfig, log_level: str = "INFO", ) -> TradingNode: + # from nautilus_trader.common.component import init_logging + # from nautilus_trader.common.component import log_level_from_str # Connect to Betfair client early to load instruments and account currency - init_logging(level_stdout=log_level_from_str(log_level)) + # Keep a reference to the log guard to prevent it from being immediately garbage collected + # _ = init_logging(level_stdout=log_level_from_str(log_level), print_config=True) client = get_cached_betfair_client( username=None, # Pass here or will source from the `BETFAIR_USERNAME` env var password=None, # Pass here or will source from the `BETFAIR_PASSWORD` env var @@ -58,7 +59,7 @@ async def main( ) await provider.load_all_async() instruments = provider.list_all() - print(f"Found instruments:\n{[ins.id for ins in instruments]}") + print(f"Found instruments:\n{[inst.id for inst in instruments]}") # Determine account currency - used in execution client account = await client.get_account_details() @@ -68,7 +69,7 @@ async def main( timeout_connection=30.0, timeout_disconnection=30.0, timeout_post_stop=30.0, - logging=LoggingConfig(log_level=log_level), + logging=LoggingConfig(log_level=log_level, use_pyo3=True), data_clients={ "BETFAIR": BetfairDataClientConfig( account_currency=account.currency_code, @@ -132,5 +133,5 @@ async def main( account_currency="GBP", market_ids=["1.176878927"], ) - node = asyncio.run(main(instrument_config=config, log_level="DEBUG")) + node = asyncio.run(main(instrument_config=config, log_level="INFO")) node.dispose() From dc3aec7a3ee09c8774729d4db21f87c5fc06db30 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 9 Oct 2024 09:57:36 +1100 Subject: [PATCH 043/224] Fix SocketClient TLS implementation --- RELEASES.md | 1 + nautilus_core/Cargo.lock | 1 + nautilus_core/network/Cargo.toml | 3 ++- nautilus_core/network/src/socket.rs | 14 ++++++++++---- nautilus_core/network/src/tls.rs | 14 ++++++++++++-- nautilus_core/network/src/websocket.rs | 9 ++++++--- 6 files changed, 32 insertions(+), 10 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index 25fa267a335f..7dfb7e5d5fdd 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -16,6 +16,7 @@ Released on TBD (UTC). None ### Fixes +- Fixed `SocketClient` TLS implementation - Fixed resubscribing to orderbook in batched mode for dYdX (#1985), thanks @davidsblom - Fixed Betfair tests related to symbology (#1988), thanks @limx0 diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 375ec25fb406..d8bad68558d3 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -2959,6 +2959,7 @@ dependencies = [ "reqwest", "rstest", "rustls", + "rustls-native-certs 0.8.0", "serde_json", "thiserror", "tokio", diff --git a/nautilus_core/network/Cargo.toml b/nautilus_core/network/Cargo.toml index ad85b5e3a26b..c4f8e166e02e 100644 --- a/nautilus_core/network/Cargo.toml +++ b/nautilus_core/network/Cargo.toml @@ -26,7 +26,8 @@ futures-util = "0.3.30" http = "1.1.0" hyper = "1.4.1" nonzero_ext = "0.3.0" -rustls = "0.23.13" +rustls = { version = "0.23.14", features = ["ring"] } +rustls-native-certs = "0.8.0" tokio-rustls = "0.26.0" tokio-tungstenite = { version = "0.24.0", features = ["rustls-tls-native-roots"] } tungstenite = "0.24.0" diff --git a/nautilus_core/network/src/socket.rs b/nautilus_core/network/src/socket.rs index eedca1a47996..7775641f739a 100644 --- a/nautilus_core/network/src/socket.rs +++ b/nautilus_core/network/src/socket.rs @@ -25,7 +25,10 @@ use std::{ use nautilus_core::python::to_pyruntime_err; use pyo3::prelude::*; -use rustls::crypto::{aws_lc_rs, CryptoProvider}; +use rustls::{ + crypto::{aws_lc_rs, ring, CryptoProvider}, + ClientConfig, RootCertStore, +}; use tokio::{ io::{split, AsyncReadExt, AsyncWriteExt, ReadHalf, WriteHalf}, net::TcpStream, @@ -92,9 +95,12 @@ struct SocketClientInner { impl SocketClientInner { pub async fn connect_url(config: SocketConfig) -> Result { if CryptoProvider::get_default().is_none() { - aws_lc_rs::default_provider() - .install_default() - .expect("Error installing crypto provider"); + tracing::debug!("Installing `ring` cryptographic provider"); + // An error can occur on install if there is a race condition with another component + match ring::default_provider().install_default() { + Ok(_) => tracing::debug!("Cryptographic provider installed successfully"), + Err(e) => tracing::debug!("Error installing cryptographic provider: {e:?}"), + } } let SocketConfig { diff --git a/nautilus_core/network/src/tls.rs b/nautilus_core/network/src/tls.rs index 05ed2d7a58f4..36fc961a87b8 100644 --- a/nautilus_core/network/src/tls.rs +++ b/nautilus_core/network/src/tls.rs @@ -15,8 +15,12 @@ //! Module for wrapping raw socket streams with TLS encryption. -use rustls; +use std::sync::Arc; + +use rustls::{self, pki_types::TrustAnchor, ClientConfig, RootCertStore}; +use rustls_native_certs::load_native_certs; use tokio::io::{AsyncRead, AsyncWrite}; +use tokio_rustls::TlsConnector; use tokio_tungstenite::{ tungstenite::{ client::IntoClientRequest, @@ -47,6 +51,7 @@ mod encryption { pub use rustls::ClientConfig; use rustls::{pki_types::ServerName, RootCertStore}; + use rustls_native_certs::load_native_certs; use tokio::io::{AsyncRead, AsyncWrite}; use tokio_rustls::TlsConnector as TokioTlsConnector; use tokio_tungstenite::{ @@ -69,8 +74,13 @@ mod encryption { let config = match tls_connector { Some(config) => config, None => { - #[allow(unused_mut)] + tracing::info!("Loading native certificates"); let mut root_store = RootCertStore::empty(); + let cert_result = load_native_certs(); + for e in cert_result.errors { + tracing::error!("Error loading certificates: {e}"); + } + root_store.add_parsable_certificates(cert_result.certs); Arc::new( ClientConfig::builder() diff --git a/nautilus_core/network/src/websocket.rs b/nautilus_core/network/src/websocket.rs index 8902f56dcdfa..0d49446b7ce8 100644 --- a/nautilus_core/network/src/websocket.rs +++ b/nautilus_core/network/src/websocket.rs @@ -82,9 +82,12 @@ impl WebSocketClientInner { /// Create an inner websocket client. pub async fn connect_url(config: WebSocketConfig) -> Result { if CryptoProvider::get_default().is_none() { - aws_lc_rs::default_provider() - .install_default() - .expect("Error installing crypto provider"); + tracing::debug!("Installing `aws_lc_rs` cryptographic provider"); + // An error can occur on install if there is a race condition with another component + match aws_lc_rs::default_provider().install_default() { + Ok(_) => tracing::debug!("Cryptographic provider installed successfully"), + Err(e) => tracing::debug!("Error installing cryptographic provider: {e:?}"), + } } let WebSocketConfig { From 35600dd281b95740df1445388e0e8f27412a6c2f Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 9 Oct 2024 10:17:22 +1100 Subject: [PATCH 044/224] Upgrade databento crate --- nautilus_core/Cargo.lock | 12 ++++++------ nautilus_core/adapters/Cargo.toml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index d8bad68558d3..3607c4f1e92d 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -1235,9 +1235,9 @@ checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "databento" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f6c48c9b7e4f8f46857031811f17f8e289d1f0a408a6f529528054deb1c48a" +checksum = "b0a8e10687f1087612c9b9041e58084cb293cb3b17aa76df9e7aa7a70adff57e" dependencies = [ "dbn", "futures", @@ -1565,9 +1565,9 @@ dependencies = [ [[package]] name = "dbn" -version = "0.21.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b98e42b50ac7e2af044bb0f35c5bdde8629cc2a986dce3837306be9beca796a" +checksum = "8aa7989e82a5f401c984beec175ef64e451fd815c13762f4a94a8d58ddb2400a" dependencies = [ "async-compression", "csv", @@ -1585,9 +1585,9 @@ dependencies = [ [[package]] name = "dbn-macros" -version = "0.21.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418fa244bde106364095a1a9498452ff03081a8dcbedbf84007e7a144f91817c" +checksum = "32f915c673fd5d1fa8a9ca66512cbcd789667bb7655eaebf9699ca1b6c8334de" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/nautilus_core/adapters/Cargo.toml b/nautilus_core/adapters/Cargo.toml index b405b58dfd66..5a7ef2056d3c 100644 --- a/nautilus_core/adapters/Cargo.toml +++ b/nautilus_core/adapters/Cargo.toml @@ -36,7 +36,7 @@ tokio = { workspace = true } tracing = { workspace = true } thiserror = { workspace = true } ustr = { workspace = true } -databento = { version = "0.14.0", optional = true } +databento = { version = "0.14.1", optional = true } fallible-streaming-iterator = "0.1.9" base64 = "0.22.1" pem = "3.0.4" From 1a9c429b09dafe7df20b70588919dc9887cd451c Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 9 Oct 2024 11:47:48 +1100 Subject: [PATCH 045/224] Add compute_effective_deltas for Polymarket --- RELEASES.md | 1 + .../polymarket/polymarket_market_maker.py | 1 + .../live/polymarket/polymarket_subscriber.py | 1 + .../adapters/polymarket/common/deltas.py | 211 ++++++++++++++++++ nautilus_trader/adapters/polymarket/config.py | 4 + nautilus_trader/adapters/polymarket/data.py | 36 ++- 6 files changed, 253 insertions(+), 1 deletion(-) create mode 100644 nautilus_trader/adapters/polymarket/common/deltas.py diff --git a/RELEASES.md b/RELEASES.md index 7dfb7e5d5fdd..18c664fa5f53 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -5,6 +5,7 @@ Released on TBD (UTC). ### Enhancements - Added support for `bbo-1s` and `bbo-1m` quote schemas for Databento adapter (#1990), thanks @faysou - Added validation for venue `book_type` configuration vs data (prevents an issue where top-of-book data is used when order book data is expected) +- Added `compute_effective_deltas` config setting for `PolymarketDataClientConfig`, reducing snapshot size (`False` by default to maintain current behavior) - Standardized Betfair symbology to use hyphens instead of periods (prevents Betfair symbols being treated as composite) ### Internal Improvements diff --git a/examples/live/polymarket/polymarket_market_maker.py b/examples/live/polymarket/polymarket_market_maker.py index fd4240a40ff0..065868404724 100644 --- a/examples/live/polymarket/polymarket_market_maker.py +++ b/examples/live/polymarket/polymarket_market_maker.py @@ -107,6 +107,7 @@ passphrase=None, # 'POLYMARKET_PASSPHRASE' env var instrument_provider=instrument_provider_config, ws_connection_delay_secs=5, + compute_effective_deltas=True, ), }, exec_clients={ diff --git a/examples/live/polymarket/polymarket_subscriber.py b/examples/live/polymarket/polymarket_subscriber.py index 02eb04024c60..c2d2100d187a 100644 --- a/examples/live/polymarket/polymarket_subscriber.py +++ b/examples/live/polymarket/polymarket_subscriber.py @@ -97,6 +97,7 @@ api_secret=None, # 'POLYMARKET_API_SECRET' env var passphrase=None, # 'POLYMARKET_PASSPHRASE' env var instrument_provider=instrument_provider_config, + compute_effective_deltas=True, ), }, timeout_connection=60.0, diff --git a/nautilus_trader/adapters/polymarket/common/deltas.py b/nautilus_trader/adapters/polymarket/common/deltas.py new file mode 100644 index 000000000000..d6a9f6a6ea79 --- /dev/null +++ b/nautilus_trader/adapters/polymarket/common/deltas.py @@ -0,0 +1,211 @@ +# ------------------------------------------------------------------------------------------------- +# Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +# https://nautechsystems.io +# +# Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +# You may not use this file except in compliance with the License. +# You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ------------------------------------------------------------------------------------------------- + +from nautilus_trader.model.book import Level +from nautilus_trader.model.book import OrderBook +from nautilus_trader.model.data import BookOrder +from nautilus_trader.model.data import OrderBookDelta +from nautilus_trader.model.data import OrderBookDeltas +from nautilus_trader.model.enums import BookAction +from nautilus_trader.model.enums import OrderSide +from nautilus_trader.model.enums import RecordFlag +from nautilus_trader.model.instruments import BinaryOption +from nautilus_trader.model.objects import Price + + +def compute_effective_deltas( + book_old: OrderBook, + book_new: OrderBook, + instrument: BinaryOption, +) -> OrderBookDeltas | None: + """ + Compare the old and new order book states and generate a list of effective deltas. + + Parameters + ---------- + book_old : OrderBook + The previous state of the order book. + book_new : OrderBook + The new state of the order book after applying deltas. + instrument : BinaryOption + The instrument associated with the order book. + + Returns + ------- + OrderBookDeltas or `None` + A collection of deltas representing the changes between the old and new book states. + If no change between book states, then `None` is returned. + + """ + deltas: list[OrderBookDelta] = [] + instrument_id = instrument.id + assert instrument_id == book_old.instrument_id + assert instrument_id == book_new.instrument_id + ts_event = book_new.ts_event + ts_init = book_new.ts_init + + old_bids: dict[Price, Level] = {level.price: level for level in book_old.bids()} + old_asks: dict[Price, Level] = {level.price: level for level in book_old.asks()} + + new_bids = book_new.bids() + for bid in new_bids: + price = bid.price + size = instrument.make_qty(bid.size()) + + if bid.price not in old_bids: + # New bid (ADD) + order = BookOrder( + side=OrderSide.BUY, + price=price, + size=size, + order_id=0, # Not applicable for L2 data + ) + deltas.append( + OrderBookDelta( + instrument_id=instrument_id, + action=BookAction.ADD, + order=order, + flags=0, + sequence=0, + ts_event=ts_event, + ts_init=ts_init, + ), + ) + elif instrument.make_qty(old_bids[bid.price].size()) != size: + # Updated bid (UPDATE) + order = BookOrder( + side=OrderSide.BUY, + price=price, + size=size, + order_id=0, # Not applicable for L2 data + ) + deltas.append( + OrderBookDelta( + instrument_id=instrument_id, + action=BookAction.UPDATE, + order=order, + flags=0, + sequence=0, + ts_event=ts_event, + ts_init=ts_init, + ), + ) + + old_bids.pop(bid.price, None) + + new_asks = book_new.asks() + for ask in new_asks: + price = ask.price + size = instrument.make_qty(ask.size()) + + if ask.price not in old_asks: + # New ask (ADD) + order = BookOrder( + side=OrderSide.SELL, + price=price, + size=size, + order_id=0, # Not applicable for L2 data + ) + deltas.append( + OrderBookDelta( + instrument_id=instrument_id, + action=BookAction.ADD, + order=order, + flags=0, + sequence=0, + ts_event=ts_event, + ts_init=ts_init, + ), + ) + elif instrument.make_qty(old_asks[ask.price].size()) != size: + # Updated ask (UPDATE) + order = BookOrder( + side=OrderSide.SELL, + price=price, + size=size, + order_id=0, # Not applicable for L2 data + ) + deltas.append( + OrderBookDelta( + instrument_id=instrument_id, + action=BookAction.UPDATE, + order=order, + flags=0, + sequence=0, + ts_event=ts_event, + ts_init=ts_init, + ), + ) + old_asks.pop(ask.price, None) + + # Process remaining old bids as removals + for old_price, old_level in old_bids.items(): + order = BookOrder( + side=OrderSide.BUY, + price=old_price, + size=instrument.make_qty(old_level.size()), + order_id=0, # Not applicable for L2 data + ) + deltas.append( + OrderBookDelta( + instrument_id=instrument_id, + action=BookAction.DELETE, + order=order, + flags=0, + sequence=0, + ts_event=ts_event, + ts_init=ts_init, + ), + ) + + # Process remaining old asks as removals + for old_price, old_level in old_asks.items(): + order = BookOrder( + side=OrderSide.SELL, + price=old_price, + size=instrument.make_qty(old_level.size()), + order_id=0, # Not applicable for L2 data + ) + deltas.append( + OrderBookDelta( + instrument_id=instrument_id, + action=BookAction.DELETE, + order=order, + flags=0, + sequence=0, + ts_event=ts_event, + ts_init=ts_init, + ), + ) + + # Return None if there are no deltas + if not deltas: + return None + + # Mark the last delta in the batch with the F_LAST flag + last_delta = deltas[-1] + last_delta = OrderBookDelta( + instrument_id=last_delta.instrument_id, + action=last_delta.action, + order=last_delta.order, + flags=RecordFlag.F_LAST, + sequence=last_delta.sequence, + ts_event=last_delta.ts_event, + ts_init=last_delta.ts_init, + ) + + deltas[-1] = last_delta + + return OrderBookDeltas(instrument_id=instrument_id, deltas=deltas) diff --git a/nautilus_trader/adapters/polymarket/config.py b/nautilus_trader/adapters/polymarket/config.py index e5f17141fe39..b219becaf86f 100644 --- a/nautilus_trader/adapters/polymarket/config.py +++ b/nautilus_trader/adapters/polymarket/config.py @@ -54,6 +54,9 @@ class PolymarketDataClientConfig(LiveDataClientConfig, frozen=True): The delay (seconds) prior to main websocket connection to allow initial subscriptions to arrive. update_instruments_interval_mins : PositiveInt, default 60 The interval (minutes) between updating Polymarket instruments. + compute_effective_deltas : bool, default False + If True, computes effective deltas by comparing old and new order book states, + reducing snapshot size. This takes ~1 millisecond, so is not recommended for latency-sensitive strategies. """ @@ -68,6 +71,7 @@ class PolymarketDataClientConfig(LiveDataClientConfig, frozen=True): base_url_ws: str | None = None ws_connection_delay_secs: PositiveInt = 5 update_instrument_interval_mins: PositiveInt = 60 + compute_effective_deltas: bool = False class PolymarketExecClientConfig(LiveExecClientConfig, frozen=True): diff --git a/nautilus_trader/adapters/polymarket/data.py b/nautilus_trader/adapters/polymarket/data.py index 3ff9cf45b051..4997d4a83c41 100644 --- a/nautilus_trader/adapters/polymarket/data.py +++ b/nautilus_trader/adapters/polymarket/data.py @@ -22,6 +22,7 @@ from py_clob_client.client import ClobClient from nautilus_trader.adapters.polymarket.common.constants import POLYMARKET_VENUE +from nautilus_trader.adapters.polymarket.common.deltas import compute_effective_deltas from nautilus_trader.adapters.polymarket.common.enums import PolymarketOrderSide from nautilus_trader.adapters.polymarket.common.symbol import get_polymarket_instrument_id from nautilus_trader.adapters.polymarket.common.symbol import get_polymarket_token_id @@ -39,8 +40,10 @@ from nautilus_trader.common.enums import LogColor from nautilus_trader.core.uuid import UUID4 from nautilus_trader.live.data_client import LiveMarketDataClient +from nautilus_trader.model.book import OrderBook from nautilus_trader.model.data import BarType from nautilus_trader.model.data import DataType +from nautilus_trader.model.data import OrderBookDeltas from nautilus_trader.model.data import QuoteTick from nautilus_trader.model.enums import BookType from nautilus_trader.model.identifiers import ClientId @@ -118,6 +121,7 @@ def __init__( # Hot caches self._last_quotes: dict[InstrumentId, QuoteTick] = {} + self._local_books: dict[InstrumentId, OrderBook] = {} async def _connect(self) -> None: self._log.info("Initializing instruments...") @@ -229,6 +233,10 @@ async def _subscribe_order_book_deltas( ) return + if self._config.compute_effective_deltas: + local_book = OrderBook(instrument_id, book_type=BookType.L2_MBP) + self._local_books[instrument_id] = local_book + await self._subscribe_asset_book(instrument_id) async def _subscribe_quote_ticks(self, instrument_id: InstrumentId) -> None: @@ -394,13 +402,33 @@ def _handle_book_snapshot( ts_event=now_ns, ts_init=now_ns, ) - self._handle_data(deltas) + + self._handle_deltas(instrument, deltas) if instrument.id in self.subscribed_quote_ticks(): quote = ws_message.parse_to_quote_tick(instrument=instrument, ts_init=now_ns) self._last_quotes[instrument.id] = quote self._handle_data(quote) + def _handle_deltas(self, instrument: BinaryOption, deltas: OrderBookDeltas) -> None: + if self._config.compute_effective_deltas: + # Compute effective deltas (reduce snapshot based on old and new book states), + # prioritizing a smaller data footprint over computational efficiency. + t0 = self._clock.timestamp_ns() + book_old = self._local_books.get(instrument.id) + book_new = OrderBook(instrument.id, book_type=BookType.L2_MBP) + book_new.apply_deltas(deltas) + self._local_books[instrument.id] = book_new + deltas = compute_effective_deltas(book_old, book_new, instrument) + + interval = (self._clock.timestamp_ns() - t0) / 1_000_000 + self._log.info(f"Computed effective deltas in {interval:.3f}ms", LogColor.BLUE) + # self._log.warning(book_new.pprint()) # Uncomment for development + + # Check if any effective deltas remain + if deltas: + self._handle_data(deltas) + def _handle_quote( self, instrument: BinaryOption, @@ -408,6 +436,12 @@ def _handle_quote( ) -> None: now_ns = self._clock.timestamp_ns() delta = ws_message.parse_to_delta(instrument=instrument, ts_init=now_ns) + + if self._config.compute_effective_deltas: + local_book = self._local_books.get(instrument.id) + if local_book: + local_book.apply_delta(delta) + self._handle_data(delta) if instrument.id in self.subscribed_quote_ticks(): From df1230d7224016e71b310e262754a04c6879124b Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 9 Oct 2024 12:58:39 +1100 Subject: [PATCH 046/224] Standardize Python versioning in CI workflows --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a9a4dd2c08a6..7a85e1fd1e0d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -242,7 +242,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/pre-commit - key: ${{ runner.os }}-${{ matrix.python-version }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }} + key: ${{ runner.os }}-${{ env.PYTHON_VERSION }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }} - name: Cached cargo id: cached-cargo @@ -265,7 +265,7 @@ jobs: uses: actions/cache@v4 with: path: ${{ env.POETRY_CACHE_DIR }} - key: ${{ runner.os }}-${{ matrix.python-version }}-poetry-${{ hashFiles('**/poetry.lock') }} + key: ${{ runner.os }}-${{ env.PYTHON_VERSION }}-poetry-${{ hashFiles('**/poetry.lock') }} - name: Cached test data id: cached-testdata-large From b6463e837f2a4ba21d00fdf8b9c32a625bf1bbf6 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 9 Oct 2024 15:04:20 +1100 Subject: [PATCH 047/224] Standardize constructor returns --- nautilus_trader/adapters/binance/futures/providers.py | 2 +- nautilus_trader/adapters/binance/spot/providers.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_trader/adapters/binance/futures/providers.py b/nautilus_trader/adapters/binance/futures/providers.py index a8a5e915f7d6..684ec231d274 100644 --- a/nautilus_trader/adapters/binance/futures/providers.py +++ b/nautilus_trader/adapters/binance/futures/providers.py @@ -72,7 +72,7 @@ def __init__( account_type: BinanceAccountType = BinanceAccountType.USDT_FUTURE, config: InstrumentProviderConfig | None = None, venue: Venue = BINANCE_VENUE, - ): + ) -> None: super().__init__(config=config) self._clock = clock diff --git a/nautilus_trader/adapters/binance/spot/providers.py b/nautilus_trader/adapters/binance/spot/providers.py index c9c381805905..b2b07c7e3167 100644 --- a/nautilus_trader/adapters/binance/spot/providers.py +++ b/nautilus_trader/adapters/binance/spot/providers.py @@ -73,7 +73,7 @@ def __init__( is_testnet: bool = False, config: InstrumentProviderConfig | None = None, venue: Venue = BINANCE_VENUE, - ): + ) -> None: super().__init__(config=config) self._clock = clock From 3826df2195172ef9955a51417bdbe35d44cff380 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 9 Oct 2024 15:07:34 +1100 Subject: [PATCH 048/224] Refine DatabentoInstrumentProvider parent symbols --- RELEASES.md | 1 + .../adapters/databento/providers.py | 36 +++++++++++++------ 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index 18c664fa5f53..65767e6feba9 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -6,6 +6,7 @@ Released on TBD (UTC). - Added support for `bbo-1s` and `bbo-1m` quote schemas for Databento adapter (#1990), thanks @faysou - Added validation for venue `book_type` configuration vs data (prevents an issue where top-of-book data is used when order book data is expected) - Added `compute_effective_deltas` config setting for `PolymarketDataClientConfig`, reducing snapshot size (`False` by default to maintain current behavior) +- Refined `DatabentoInstrumentProvider` handling of large bulks of instrument definitions (improved parent symbol support) - Standardized Betfair symbology to use hyphens instead of periods (prevents Betfair symbols being treated as composite) ### Internal Improvements diff --git a/nautilus_trader/adapters/databento/providers.py b/nautilus_trader/adapters/databento/providers.py index 3aa6223b0351..e0d3eae20eed 100644 --- a/nautilus_trader/adapters/databento/providers.py +++ b/nautilus_trader/adapters/databento/providers.py @@ -65,7 +65,7 @@ def __init__( live_gateway: str | None = None, loader: DatabentoDataLoader | None = None, config: InstrumentProviderConfig | None = None, - ): + ) -> None: super().__init__(config=config) self._clock = clock @@ -83,7 +83,7 @@ async def load_all_async(self, filters: dict | None = None) -> None: "(potentially millions)", ) - async def load_ids_async( + async def load_ids_async( # noqa: C901 (too complex) self, instrument_ids: list[InstrumentId], filters: dict | None = None, @@ -127,17 +127,26 @@ async def load_ids_async( parent_symbols = list(filters.get("parent_symbols", [])) if filters is not None else None pyo3_instruments = [] + success_msg = "All instruments received and decoded" - timeout_secs = 10.0 + timeout_secs = 2.0 # Inactivity timeout when receiving instruments + check_interval_secs = 0.1 # Check for inactivity interval + started_receiving = False + last_received_time = self._clock.timestamp() self._log.info( - f"Awaiting instrument definitions ({timeout_secs}s timeout)...", + "Awaiting instrument definitions...", LogColor.BLUE, ) def receive_instruments(pyo3_instrument: Any) -> None: + nonlocal last_received_time, started_receiving + started_receiving = True pyo3_instruments.append(pyo3_instrument) instrument_ids_to_decode.discard(pyo3_instrument.id.value) + last_received_time = self._clock.timestamp() + + # Cancel task once all expected instruments received if not parent_symbols and not instrument_ids_to_decode: raise asyncio.CancelledError(success_msg) @@ -155,19 +164,27 @@ def receive_instruments(pyo3_instrument: Any) -> None: start=0, # From start of current week (latest definitions) ) + async def monitor_inactivity(): + nonlocal last_received_time + while True: + await asyncio.sleep(check_interval_secs) + if started_receiving and ( + self._clock.timestamp() - last_received_time > timeout_secs + ): + raise asyncio.CancelledError(success_msg) + try: - await asyncio.wait_for( + await asyncio.gather( asyncio.ensure_future( live_client.start(callback=receive_instruments, callback_pyo3=print), ), - timeout=10.0, + monitor_inactivity(), ) - except TimeoutError: - pass # Expected for parent and continuous for now except asyncio.CancelledError as e: if success_msg in str(e): - # Expected on decode completion, continue self._log.info(success_msg) + else: + self._log.warning(str(e)) except Exception as e: self._log.error(repr(e)) @@ -177,7 +194,6 @@ def receive_instruments(pyo3_instrument: Any) -> None: self.add(instrument=instrument) self._log.debug(f"Added instrument {instrument.id}") - await asyncio.sleep(1.0) live_client.close() async def load_async( From 9a82fe45b7c422b159bacdb60b31b17a384b4b4b Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 9 Oct 2024 18:12:16 +1100 Subject: [PATCH 049/224] Standardize Python versioning in CI workflows --- .github/workflows/build-wheels.yml | 7 ++++++- .github/workflows/coverage.yml | 9 +++++++-- .github/workflows/release.yml | 21 ++++++++++++++++++--- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index 96f6fc069340..e9cf0a6eee1e 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -63,6 +63,11 @@ jobs: with: python-version: ${{ matrix.python-version }} + - name: Get Python version + run: | + version=$(python -c "import sys; print('.'.join(map(str, sys.version_info[:3])))") + echo "PYTHON_VERSION=$version" >> $GITHUB_ENV + - name: Get Poetry version from poetry-version run: | version=$(cat poetry-version) @@ -84,7 +89,7 @@ jobs: uses: actions/cache@v4 with: path: ${{ env.POETRY_CACHE_DIR }} - key: ${{ runner.os }}-${{ matrix.python-version }}-poetry-${{ hashFiles('**/poetry.lock') }} + key: ${{ runner.os }}-${{ env.PYTHON_VERSION }}-poetry-${{ hashFiles('**/poetry.lock') }} - name: Install / Build run: | diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 9b6fa15c45e1..85e37719b0f6 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -71,6 +71,11 @@ jobs: with: python-version: ${{ matrix.python-version }} + - name: Get Python version + run: | + version=$(python -c "import sys; print('.'.join(map(str, sys.version_info[:3])))") + echo "PYTHON_VERSION=$version" >> $GITHUB_ENV + - name: Get Poetry version from poetry-version run: | version=$(cat poetry-version) @@ -96,7 +101,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/pre-commit - key: ${{ runner.os }}-${{ matrix.python-version }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }} + key: ${{ runner.os }}-${{ env.PYTHON_VERSION }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }} - name: Run pre-commit run: pre-commit run --all-files @@ -109,7 +114,7 @@ jobs: uses: actions/cache@v4 with: path: ${{ env.POETRY_CACHE_DIR }} - key: ${{ runner.os }}-${{ matrix.python-version }}-poetry-${{ hashFiles('**/poetry.lock') }} + key: ${{ runner.os }}-${{ env.PYTHON_VERSION }}-poetry-${{ hashFiles('**/poetry.lock') }} - name: Cached test data id: cached-testdata-large diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c4e34bced1aa..ffc06038c505 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -147,6 +147,11 @@ jobs: with: python-version: "3.11" + - name: Get Python version + run: | + version=$(python -c "import sys; print('.'.join(map(str, sys.version_info[:3])))") + echo "PYTHON_VERSION=$version" >> $GITHUB_ENV + - name: Get Poetry version from poetry-version run: | version=$(cat poetry-version) @@ -168,7 +173,7 @@ jobs: uses: actions/cache@v4 with: path: ${{ env.POETRY_CACHE_DIR }} - key: ${{ runner.os }}-${{ matrix.python-version }}-poetry-${{ hashFiles('**/poetry.lock') }} + key: ${{ runner.os }}-${{ env.PYTHON_VERSION }}-poetry-${{ hashFiles('**/poetry.lock') }} - name: Install run: poetry install @@ -241,6 +246,11 @@ jobs: with: python-version: "3.11" + - name: Get Python version + run: | + version=$(python -c "import sys; print('.'.join(map(str, sys.version_info[:3])))") + echo "PYTHON_VERSION=$version" >> $GITHUB_ENV + - name: Get Poetry version from poetry-version run: | version=$(cat poetry-version) @@ -262,7 +272,7 @@ jobs: uses: actions/cache@v4 with: path: ${{ env.POETRY_CACHE_DIR }} - key: ${{ runner.os }}-${{ matrix.python-version }}-poetry-${{ hashFiles('**/poetry.lock') }} + key: ${{ runner.os }}-${{ env.PYTHON_VERSION }}-poetry-${{ hashFiles('**/poetry.lock') }} - name: Install / Build run: | @@ -368,6 +378,11 @@ jobs: with: python-version: ${{ matrix.python-version }} + - name: Get Python version + run: | + version=$(python -c "import sys; print('.'.join(map(str, sys.version_info[:3])))") + echo "PYTHON_VERSION=$version" >> $GITHUB_ENV + - name: Get Poetry version from poetry-version run: | version=$(cat poetry-version) @@ -389,7 +404,7 @@ jobs: uses: actions/cache@v4 with: path: ${{ env.POETRY_CACHE_DIR }} - key: ${{ runner.os }}-${{ matrix.python-version }}-poetry-${{ hashFiles('**/poetry.lock') }} + key: ${{ runner.os }}-${{ env.PYTHON_VERSION }}-poetry-${{ hashFiles('**/poetry.lock') }} - name: Install / Build run: | From 5eb47adb66f821c92d054d9b59dee5408e26e15f Mon Sep 17 00:00:00 2001 From: Farookh Zaheer Siddiqui <129654632+FarukhS52@users.noreply.github.com> Date: Wed, 9 Oct 2024 15:30:25 +0530 Subject: [PATCH 050/224] Docs update (#1991) --- README.md | 10 +++++----- docs/integrations/binance.md | 8 ++++---- docs/integrations/bybit.md | 4 ++-- docs/integrations/polymarket.md | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index e0d121d54b9a..ff0ee3c73ef1 100644 --- a/README.md +++ b/README.md @@ -44,15 +44,15 @@ including FX, Equities, Futures, Options, CFDs, Crypto and Betting - across mult ## Features -- **Fast**: Core written in Rust with asynchronous networking using [tokio](https://crates.io/crates/tokio) -- **Reliable**: Type safety and thread safety through Rust. Redis backed performant state persistence -- **Portable**: OS independent, runs on Linux, macOS, Windows. Deploy using Docker +- **Fast**: Core is written in Rust with asynchronous networking using [tokio](https://crates.io/crates/tokio) +- **Reliable**: Type safety and thread safety through Rust. Redis-backed performant state persistence +- **Portable**: OS independent, runs on Linux, macOS, and Windows. Deploy using Docker - **Flexible**: Modular adapters mean any REST, WebSocket, or FIX API can be integrated - **Advanced**: Time in force `IOC`, `FOK`, `GTD`, `AT_THE_OPEN`, `AT_THE_CLOSE`, advanced order types and conditional triggers. Execution instructions `post-only`, `reduce-only`, and icebergs. Contingency order lists including `OCO`, `OTO` - **Customizable**: Add user-defined custom components, or assemble entire systems from scratch leveraging the cache and message bus - **Backtesting**: Run with multiple venues, instruments and strategies simultaneously using historical quote tick, trade tick, bar, order book and custom data with nanosecond resolution - **Live**: Use identical strategy implementations between backtesting and live deployments -- **Multi-venue**: Multiple venue capabilities facilitate market making and statistical arbitrage strategies +- **Multi-venue**: Multiple venue capabilities facilitate market-making and statistical arbitrage strategies - **AI Training**: Backtest engine fast enough to be used to train AI trading agents (RL/ES) ![Alt text](https://github.com/nautechsystems/nautilus_trader/blob/develop/docs/_images/nautilus-art.png?raw=true "nautilus") @@ -313,7 +313,7 @@ class EMACross(Strategy): """ A simple moving average cross example strategy. - When the fast EMA crosses the slow EMA then enter a position at the market + When the fast EMA crosses the slow EMA then enters a position at the market in that direction. Cancels all orders and closes all positions on stop. diff --git a/docs/integrations/binance.md b/docs/integrations/binance.md index 3fb58beafa01..813d3b7f298c 100644 --- a/docs/integrations/binance.md +++ b/docs/integrations/binance.md @@ -23,7 +23,7 @@ poetry install --extras binance The following documentation assumes a trader is setting up for both live market data feeds, and trade execution. The full Binance integration consists of an assortment of components, -which can be used together or separately depending on the users needs. +which can be used together or separately depending on the user's needs. - `BinanceHttpClient`: Low-level HTTP API connectivity - `BinanceWebSocketClient`: Low-level WebSocket API connectivity @@ -54,7 +54,7 @@ As per the Nautilus unification policy for symbols, the native Binance symbols a spot assets and futures contracts. Because NautilusTrader is capable of multi-venue + multi-account trading, it's necessary to explicitly clarify the difference between `BTCUSDT` as the spot and margin traded pair, and the `BTCUSDT` perpetual futures contract (this symbol is used for _both_ natively by Binance). Therefore, NautilusTrader appends `-PERP` to all native perpetual symbols. -E.g. for Binance Futures, the said instruments symbol is `BTCUSDT-PERP` within the Nautilus system boundary. +E.g. for Binance Futures, the said instrument's symbol is `BTCUSDT-PERP` within the Nautilus system boundary. ## Order types @@ -215,7 +215,7 @@ config = TradingNodeConfig( ### Aggregated trades -Binance provide aggregated trade data endpoints as an alternative source of trade ticks. +Binance provides aggregated trade data endpoints as an alternative source of trade ticks. In comparison to the default trade endpoints, aggregated trade data endpoints can return all ticks between a `start_time` and `end_time`. @@ -353,7 +353,7 @@ methods may eventually become first-class (not requiring custom/generic subscrip ### BinanceFuturesMarkPriceUpdate -You can subscribe to `BinanceFuturesMarkPriceUpdate` (included funding rating info) +You can subscribe to `BinanceFuturesMarkPriceUpdate` (including funding rating info) data streams by subscribing in the following way from your actor or strategy: ```python diff --git a/docs/integrations/bybit.md b/docs/integrations/bybit.md index b30c79474f0c..8706de1379cc 100644 --- a/docs/integrations/bybit.md +++ b/docs/integrations/bybit.md @@ -27,7 +27,7 @@ poetry install --extras bybit The following documentation assumes a trader is setting up for both live market data feeds, and trade execution. The full Bybit integration consists of an assortment of components, -which can be used together or separately depending on the users needs. +which can be used together or separately depending on the user's needs. - `BybitHttpClient`: Low-level HTTP API connectivity - `BybitWebSocketClient`: Low-level WebSocket API connectivity @@ -67,7 +67,7 @@ Options contracts are not currently supported (will be implemented in a future v ## Symbology -To distinguish between different product types on Bybit, the following instrument ID suffix’s are used: +To distinguish between different product types on Bybit, the following instrument ID suffixes are used: - `-SPOT`: Spot cryptocurrencies - `-LINEAR`: Perpetual and futures contracts diff --git a/docs/integrations/polymarket.md b/docs/integrations/polymarket.md index 497dceffc2ff..e82b6c9a5d5e 100644 --- a/docs/integrations/polymarket.md +++ b/docs/integrations/polymarket.md @@ -47,7 +47,7 @@ Polymarket offers comprehensive resources for different audiences: The following documentation assumes a trader is setting up for both live market data feeds, and trade execution. The full Polymarket integration consists of an assortment of components, -which can be used together or separately depending on the users needs. +which can be used together or separately depending on the user's needs. - `PolymarketWebSocketClient`: Low-level WebSocket API connectivity (built on top of the Nautilus `WebSocketClient` written in Rust). - `PolymarketInstrumentProvider`: Instrument parsing and loading functionality for `BinaryOption` instruments. @@ -195,7 +195,7 @@ The following time in force options are available: Trades on Polymarket can have the following statuses: - `MATCHED`: Trade has been matched and sent to the executor service by the operator, the executor service submits the trade as a transaction to the Exchange contract. -- `MINED`: Trade is observed to be mined into the chain, no finality threshold established. +- `MINED`: Trade is observed to be mined into the chain, and no finality threshold is established. - `CONFIRMED`: Trade has achieved strong probabilistic finality and was successful. - `RETRYING`: Trade transaction has failed (revert or reorg) and is being retried/resubmitted by the operator. - `FAILED`: Trade has failed and is not being retried. From c0c1ca5fd771bf64c52f576279e0d1620bfa08d2 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 9 Oct 2024 21:07:56 +1100 Subject: [PATCH 051/224] Update release notes --- RELEASES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASES.md b/RELEASES.md index 65767e6feba9..e77feed37451 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -8,6 +8,7 @@ Released on TBD (UTC). - Added `compute_effective_deltas` config setting for `PolymarketDataClientConfig`, reducing snapshot size (`False` by default to maintain current behavior) - Refined `DatabentoInstrumentProvider` handling of large bulks of instrument definitions (improved parent symbol support) - Standardized Betfair symbology to use hyphens instead of periods (prevents Betfair symbols being treated as composite) +- Integration guide docs fixes (#1991), thanks @FarukhS52 ### Internal Improvements - Ported `Throttler` to Rust (#1988), thanks @Pushkarm029 and @twitu From 854952e988cf9a59e739e7f7fc32861d2e2e7ab8 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 05:59:02 +1100 Subject: [PATCH 052/224] Update dependencies --- poetry.lock | 432 +++++++++++++++++++++++++------------------------ pyproject.toml | 2 +- 2 files changed, 223 insertions(+), 211 deletions(-) diff --git a/poetry.lock b/poetry.lock index 494905ac4147..5d8ff6b4412d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -445,48 +445,55 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "cbor2" -version = "5.6.4" +version = "5.6.5" description = "CBOR (de)serializer with extensive tag support" optional = true python-versions = ">=3.8" files = [ - {file = "cbor2-5.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c40c68779a363f47a11ded7b189ba16767391d5eae27fac289e7f62b730ae1fc"}, - {file = "cbor2-5.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0625c8d3c487e509458459de99bf052f62eb5d773cc9fc141c6a6ea9367726d"}, - {file = "cbor2-5.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de7137622204168c3a57882f15dd09b5135bda2bcb1cf8b56b58d26b5150dfca"}, - {file = "cbor2-5.6.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3545e1e62ec48944b81da2c0e0a736ca98b9e4653c2365cae2f10ae871e9113"}, - {file = "cbor2-5.6.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d6749913cd00a24eba17406a0bfc872044036c30a37eb2fcde7acfd975317e8a"}, - {file = "cbor2-5.6.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:57db966ab08443ee54b6f154f72021a41bfecd4ba897fe108728183ad8784a2a"}, - {file = "cbor2-5.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:380e0c7f4db574dcd86e6eee1b0041863b0aae7efd449d49b0b784cf9a481b9b"}, - {file = "cbor2-5.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5c763d50a1714e0356b90ad39194fc8ef319356b89fb001667a2e836bfde88e3"}, - {file = "cbor2-5.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:58a7ac8861857a9f9b0de320a4808a2a5f68a2599b4c14863e2748d5a4686c99"}, - {file = "cbor2-5.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d715b2f101730335e84a25fe0893e2b6adf049d6d44da123bf243b8c875ffd8"}, - {file = "cbor2-5.6.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f53a67600038cb9668720b309fdfafa8c16d1a02570b96d2144d58d66774318"}, - {file = "cbor2-5.6.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f898bab20c4f42dca3688c673ff97c2f719b1811090430173c94452603fbcf13"}, - {file = "cbor2-5.6.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e5d50fb9f47d295c1b7f55592111350424283aff4cc88766c656aad0300f11f"}, - {file = "cbor2-5.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:7f9d867dcd814ab8383ad132eb4063e2b69f6a9f688797b7a8ca34a4eadb3944"}, - {file = "cbor2-5.6.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e0860ca88edf8aaec5461ce0e498eb5318f1bcc70d93f90091b7a1f1d351a167"}, - {file = "cbor2-5.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c38a0ed495a63a8bef6400158746a9cb03c36f89aeed699be7ffebf82720bf86"}, - {file = "cbor2-5.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c8d8c2f208c223a61bed48dfd0661694b891e423094ed30bac2ed75032142aa"}, - {file = "cbor2-5.6.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24cd2ce6136e1985da989e5ba572521023a320dcefad5d1fff57fba261de80ca"}, - {file = "cbor2-5.6.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7facce04aed2bf69ef43bdffb725446fe243594c2451921e89cc305bede16f02"}, - {file = "cbor2-5.6.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f9c8ee0d89411e5e039a4f3419befe8b43c0dd8746eedc979e73f4c06fe0ef97"}, - {file = "cbor2-5.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:9b45d554daa540e2f29f1747df9f08f8d98ade65a67b1911791bc193d33a5923"}, - {file = "cbor2-5.6.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0a5cb2c16687ccd76b38cfbfdb34468ab7d5635fb92c9dc5e07831c1816bd0a9"}, - {file = "cbor2-5.6.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6f985f531f7495527153c4f66c8c143e4cf8a658ec9e87b14bc5438e0a8d0911"}, - {file = "cbor2-5.6.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9d9c7b4bd7c3ea7e5587d4f1bbe073b81719530ddadb999b184074f064896e2"}, - {file = "cbor2-5.6.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d06184dcdc275c389fee3cd0ea80b5e1769763df15f93ecd0bf4c281817365"}, - {file = "cbor2-5.6.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e9ba7116f201860fb4c3e80ef36be63851ec7e4a18af70fea22d09cab0b000bf"}, - {file = "cbor2-5.6.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:341468ae58bdedaa05c907ab16e90dd0d5c54d7d1e66698dfacdbc16a31e815b"}, - {file = "cbor2-5.6.4-cp38-cp38-win_amd64.whl", hash = "sha256:bcb4994be1afcc81f9167c220645d878b608cae92e19f6706e770f9bc7bbff6c"}, - {file = "cbor2-5.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:41c43abffe217dce70ae51c7086530687670a0995dfc90cc35f32f2cf4d86392"}, - {file = "cbor2-5.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:227a7e68ba378fe53741ed892b5b03fe472b5bd23ef26230a71964accebf50a2"}, - {file = "cbor2-5.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13521b7c9a0551fcc812d36afd03fc554fa4e1b193659bb5d4d521889aa81154"}, - {file = "cbor2-5.6.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4816d290535d20c7b7e2663b76da5b0deb4237b90275c202c26343d8852b8a"}, - {file = "cbor2-5.6.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1e98d370106821335efcc8fbe4136ea26b4747bf29ca0e66512b6c4f6f5cc59f"}, - {file = "cbor2-5.6.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:68743a18e16167ff37654a29321f64f0441801dba68359c82dc48173cc6c87e1"}, - {file = "cbor2-5.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:7ba5e9c6ed17526d266a1116c045c0941f710860c5f2495758df2e0d848c1b6d"}, - {file = "cbor2-5.6.4-py3-none-any.whl", hash = "sha256:fe411c4bf464f5976605103ebcd0f60b893ac3e4c7c8d8bc8f4a0cb456e33c60"}, - {file = "cbor2-5.6.4.tar.gz", hash = "sha256:1c533c50dde86bef1c6950602054a0ffa3c376e8b0e20c7b8f5b108793f6983e"}, + {file = "cbor2-5.6.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e16c4a87fc999b4926f5c8f6c696b0d251b4745bc40f6c5aee51d69b30b15ca2"}, + {file = "cbor2-5.6.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87026fc838370d69f23ed8572939bd71cea2b3f6c8f8bb8283f573374b4d7f33"}, + {file = "cbor2-5.6.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a88f029522aec5425fc2f941b3df90da7688b6756bd3f0472ab886d21208acbd"}, + {file = "cbor2-5.6.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9d15b638539b68aa5d5eacc56099b4543a38b2d2c896055dccf7e83d24b7955"}, + {file = "cbor2-5.6.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:47261f54a024839ec649b950013c4de5b5f521afe592a2688eebbe22430df1dc"}, + {file = "cbor2-5.6.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:559dcf0d897260a9e95e7b43556a62253e84550b77147a1ad4d2c389a2a30192"}, + {file = "cbor2-5.6.5-cp310-cp310-win_amd64.whl", hash = "sha256:5b856fda4c50c5bc73ed3664e64211fa4f015970ed7a15a4d6361bd48462feaf"}, + {file = "cbor2-5.6.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:863e0983989d56d5071270790e7ed8ddbda88c9e5288efdb759aba2efee670bc"}, + {file = "cbor2-5.6.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5cff06464b8f4ca6eb9abcba67bda8f8334a058abc01005c8e616728c387ad32"}, + {file = "cbor2-5.6.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4c7dbcdc59ea7f5a745d3e30ee5e6b6ff5ce7ac244aa3de6786391b10027bb3"}, + {file = "cbor2-5.6.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34cf5ab0dc310c3d0196caa6ae062dc09f6c242e2544bea01691fe60c0230596"}, + {file = "cbor2-5.6.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6797b824b26a30794f2b169c0575301ca9b74ae99064e71d16e6ba0c9057de51"}, + {file = "cbor2-5.6.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:73b9647eed1493097db6aad61e03d8f1252080ee041a1755de18000dd2c05f37"}, + {file = "cbor2-5.6.5-cp311-cp311-win_amd64.whl", hash = "sha256:6e14a1bf6269d25e02ef1d4008e0ce8880aa271d7c6b4c329dba48645764f60e"}, + {file = "cbor2-5.6.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e25c2aebc9db99af7190e2261168cdde8ed3d639ca06868e4f477cf3a228a8e9"}, + {file = "cbor2-5.6.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fde21ac1cf29336a31615a2c469a9cb03cf0add3ae480672d4d38cda467d07fc"}, + {file = "cbor2-5.6.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8947c102cac79d049eadbd5e2ffb8189952890df7cbc3ee262bbc2f95b011a9"}, + {file = "cbor2-5.6.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38886c41bebcd7dca57739439455bce759f1e4c551b511f618b8e9c1295b431b"}, + {file = "cbor2-5.6.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ae2b49226224e92851c333b91d83292ec62eba53a19c68a79890ce35f1230d70"}, + {file = "cbor2-5.6.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2764804ffb6553283fc4afb10a280715905a4cea4d6dc7c90d3e89c4a93bc8d"}, + {file = "cbor2-5.6.5-cp312-cp312-win_amd64.whl", hash = "sha256:a3ac50485cf67dfaab170a3e7b527630e93cb0a6af8cdaa403054215dff93adf"}, + {file = "cbor2-5.6.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f0d0a9c5aabd48ecb17acf56004a7542a0b8d8212be52f3102b8218284bd881e"}, + {file = "cbor2-5.6.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61ceb77e6aa25c11c814d4fe8ec9e3bac0094a1f5bd8a2a8c95694596ea01e08"}, + {file = "cbor2-5.6.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97a7e409b864fecf68b2ace8978eb5df1738799a333ec3ea2b9597bfcdd6d7d2"}, + {file = "cbor2-5.6.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f6d69f38f7d788b04c09ef2b06747536624b452b3c8b371ab78ad43b0296fab"}, + {file = "cbor2-5.6.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f91e6d74fa6917df31f8757fdd0e154203b0dd0609ec53eb957016a2b474896a"}, + {file = "cbor2-5.6.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5ce13a27ef8fddf643fc17a753fe34aa72b251d03c23da6a560c005dc171085b"}, + {file = "cbor2-5.6.5-cp313-cp313-win_amd64.whl", hash = "sha256:54c72a3207bb2d4480c2c39dad12d7971ce0853a99e3f9b8d559ce6eac84f66f"}, + {file = "cbor2-5.6.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4586a4f65546243096e56a3f18f29d60752ee9204722377021b3119a03ed99ff"}, + {file = "cbor2-5.6.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d1a18b3a58dcd9b40ab55c726160d4a6b74868f2a35b71f9e726268b46dc6a2"}, + {file = "cbor2-5.6.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a83b76367d1c3e69facbcb8cdf65ed6948678e72f433137b41d27458aa2a40cb"}, + {file = "cbor2-5.6.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90bfa36944caccec963e6ab7e01e64e31cc6664535dc06e6295ee3937c999cbb"}, + {file = "cbor2-5.6.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:37096663a5a1c46a776aea44906cbe5fa3952f29f50f349179c00525d321c862"}, + {file = "cbor2-5.6.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93676af02bd9a0b4a62c17c5b20f8e9c37b5019b1a24db70a2ee6cb770423568"}, + {file = "cbor2-5.6.5-cp38-cp38-win_amd64.whl", hash = "sha256:8f747b7a9aaa58881a0c5b4cd4a9b8fb27eca984ed261a769b61de1f6b5bd1e6"}, + {file = "cbor2-5.6.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:94885903105eec66d7efb55f4ce9884fdc5a4d51f3bd75b6fedc68c5c251511b"}, + {file = "cbor2-5.6.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fe11c2eb518c882cfbeed456e7a552e544893c17db66fe5d3230dbeaca6b615c"}, + {file = "cbor2-5.6.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66dd25dd919cddb0b36f97f9ccfa51947882f064729e65e6bef17c28535dc459"}, + {file = "cbor2-5.6.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa61a02995f3a996c03884cf1a0b5733f88cbfd7fa0e34944bf678d4227ee712"}, + {file = "cbor2-5.6.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:824f202b556fc204e2e9a67d6d6d624e150fbd791278ccfee24e68caec578afd"}, + {file = "cbor2-5.6.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7488aec919f8408f9987a3a32760bd385d8628b23a35477917aa3923ff6ad45f"}, + {file = "cbor2-5.6.5-cp39-cp39-win_amd64.whl", hash = "sha256:a34ee99e86b17444ecbe96d54d909dd1a20e2da9f814ae91b8b71cf1ee2a95e4"}, + {file = "cbor2-5.6.5-py3-none-any.whl", hash = "sha256:3038523b8fc7de312bb9cdcbbbd599987e64307c4db357cd2030c472a6c7d468"}, + {file = "cbor2-5.6.5.tar.gz", hash = "sha256:b682820677ee1dbba45f7da11898d2720f92e06be36acec290867d5ebf3d7e09"}, ] [package.extras] @@ -597,101 +604,116 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -890,83 +912,73 @@ files = [ [[package]] name = "coverage" -version = "7.6.1" +version = "7.6.2" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, - {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, - {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, - {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, - {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, - {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, - {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, - {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, - {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, - {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, - {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, - {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, - {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, - {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, - {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, - {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, - {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, - {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, + {file = "coverage-7.6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9df1950fb92d49970cce38100d7e7293c84ed3606eaa16ea0b6bc27175bb667"}, + {file = "coverage-7.6.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:24500f4b0e03aab60ce575c85365beab64b44d4db837021e08339f61d1fbfe52"}, + {file = "coverage-7.6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a663b180b6669c400b4630a24cc776f23a992d38ce7ae72ede2a397ce6b0f170"}, + {file = "coverage-7.6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfde025e2793a22efe8c21f807d276bd1d6a4bcc5ba6f19dbdfc4e7a12160909"}, + {file = "coverage-7.6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:087932079c065d7b8ebadd3a0160656c55954144af6439886c8bcf78bbbcde7f"}, + {file = "coverage-7.6.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9c6b0c1cafd96213a0327cf680acb39f70e452caf8e9a25aeb05316db9c07f89"}, + {file = "coverage-7.6.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6e85830eed5b5263ffa0c62428e43cb844296f3b4461f09e4bdb0d44ec190bc2"}, + {file = "coverage-7.6.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:62ab4231c01e156ece1b3a187c87173f31cbeee83a5e1f6dff17f288dca93345"}, + {file = "coverage-7.6.2-cp310-cp310-win32.whl", hash = "sha256:7b80fbb0da3aebde102a37ef0138aeedff45997e22f8962e5f16ae1742852676"}, + {file = "coverage-7.6.2-cp310-cp310-win_amd64.whl", hash = "sha256:d20c3d1f31f14d6962a4e2f549c21d31e670b90f777ef4171be540fb7fb70f02"}, + {file = "coverage-7.6.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bb21bac7783c1bf6f4bbe68b1e0ff0d20e7e7732cfb7995bc8d96e23aa90fc7b"}, + {file = "coverage-7.6.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a7b2e437fbd8fae5bc7716b9c7ff97aecc95f0b4d56e4ca08b3c8d8adcaadb84"}, + {file = "coverage-7.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:536f77f2bf5797983652d1d55f1a7272a29afcc89e3ae51caa99b2db4e89d658"}, + {file = "coverage-7.6.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f361296ca7054f0936b02525646b2731b32c8074ba6defab524b79b2b7eeac72"}, + {file = "coverage-7.6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7926d8d034e06b479797c199747dd774d5e86179f2ce44294423327a88d66ca7"}, + {file = "coverage-7.6.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0bbae11c138585c89fb4e991faefb174a80112e1a7557d507aaa07675c62e66b"}, + {file = "coverage-7.6.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fcad7d5d2bbfeae1026b395036a8aa5abf67e8038ae7e6a25c7d0f88b10a8e6a"}, + {file = "coverage-7.6.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f01e53575f27097d75d42de33b1b289c74b16891ce576d767ad8c48d17aeb5e0"}, + {file = "coverage-7.6.2-cp311-cp311-win32.whl", hash = "sha256:7781f4f70c9b0b39e1b129b10c7d43a4e0c91f90c60435e6da8288efc2b73438"}, + {file = "coverage-7.6.2-cp311-cp311-win_amd64.whl", hash = "sha256:9bcd51eeca35a80e76dc5794a9dd7cb04b97f0e8af620d54711793bfc1fbba4b"}, + {file = "coverage-7.6.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ebc94fadbd4a3f4215993326a6a00e47d79889391f5659bf310f55fe5d9f581c"}, + {file = "coverage-7.6.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9681516288e3dcf0aa7c26231178cc0be6cac9705cac06709f2353c5b406cfea"}, + {file = "coverage-7.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d9c5d13927d77af4fbe453953810db766f75401e764727e73a6ee4f82527b3e"}, + {file = "coverage-7.6.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b92f9ca04b3e719d69b02dc4a69debb795af84cb7afd09c5eb5d54b4a1ae2191"}, + {file = "coverage-7.6.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ff2ef83d6d0b527b5c9dad73819b24a2f76fdddcfd6c4e7a4d7e73ecb0656b4"}, + {file = "coverage-7.6.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:47ccb6e99a3031ffbbd6e7cc041e70770b4fe405370c66a54dbf26a500ded80b"}, + {file = "coverage-7.6.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a867d26f06bcd047ef716175b2696b315cb7571ccb951006d61ca80bbc356e9e"}, + {file = "coverage-7.6.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cdfcf2e914e2ba653101157458afd0ad92a16731eeba9a611b5cbb3e7124e74b"}, + {file = "coverage-7.6.2-cp312-cp312-win32.whl", hash = "sha256:f9035695dadfb397bee9eeaf1dc7fbeda483bf7664a7397a629846800ce6e276"}, + {file = "coverage-7.6.2-cp312-cp312-win_amd64.whl", hash = "sha256:5ed69befa9a9fc796fe015a7040c9398722d6b97df73a6b608e9e275fa0932b0"}, + {file = "coverage-7.6.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eea60c79d36a8f39475b1af887663bc3ae4f31289cd216f514ce18d5938df40"}, + {file = "coverage-7.6.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa68a6cdbe1bc6793a9dbfc38302c11599bbe1837392ae9b1d238b9ef3dafcf1"}, + {file = "coverage-7.6.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ec528ae69f0a139690fad6deac8a7d33629fa61ccce693fdd07ddf7e9931fba"}, + {file = "coverage-7.6.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed5ac02126f74d190fa2cc14a9eb2a5d9837d5863920fa472b02eb1595cdc925"}, + {file = "coverage-7.6.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21c0ea0d4db8a36b275cb6fb2437a3715697a4ba3cb7b918d3525cc75f726304"}, + {file = "coverage-7.6.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:35a51598f29b2a19e26d0908bd196f771a9b1c5d9a07bf20be0adf28f1ad4f77"}, + {file = "coverage-7.6.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c9192925acc33e146864b8cf037e2ed32a91fdf7644ae875f5d46cd2ef086a5f"}, + {file = "coverage-7.6.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf4eeecc9e10f5403ec06138978235af79c9a79af494eb6b1d60a50b49ed2869"}, + {file = "coverage-7.6.2-cp313-cp313-win32.whl", hash = "sha256:e4ee15b267d2dad3e8759ca441ad450c334f3733304c55210c2a44516e8d5530"}, + {file = "coverage-7.6.2-cp313-cp313-win_amd64.whl", hash = "sha256:c71965d1ced48bf97aab79fad56df82c566b4c498ffc09c2094605727c4b7e36"}, + {file = "coverage-7.6.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7571e8bbecc6ac066256f9de40365ff833553e2e0c0c004f4482facb131820ef"}, + {file = "coverage-7.6.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:078a87519057dacb5d77e333f740708ec2a8f768655f1db07f8dfd28d7a005f0"}, + {file = "coverage-7.6.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5e92e3e84a8718d2de36cd8387459cba9a4508337b8c5f450ce42b87a9e760"}, + {file = "coverage-7.6.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebabdf1c76593a09ee18c1a06cd3022919861365219ea3aca0247ededf6facd6"}, + {file = "coverage-7.6.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12179eb0575b8900912711688e45474f04ab3934aaa7b624dea7b3c511ecc90f"}, + {file = "coverage-7.6.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:39d3b964abfe1519b9d313ab28abf1d02faea26cd14b27f5283849bf59479ff5"}, + {file = "coverage-7.6.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:84c4315577f7cd511d6250ffd0f695c825efe729f4205c0340f7004eda51191f"}, + {file = "coverage-7.6.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ff797320dcbff57caa6b2301c3913784a010e13b1f6cf4ab3f563f3c5e7919db"}, + {file = "coverage-7.6.2-cp313-cp313t-win32.whl", hash = "sha256:2b636a301e53964550e2f3094484fa5a96e699db318d65398cfba438c5c92171"}, + {file = "coverage-7.6.2-cp313-cp313t-win_amd64.whl", hash = "sha256:d03a060ac1a08e10589c27d509bbdb35b65f2d7f3f8d81cf2fa199877c7bc58a"}, + {file = "coverage-7.6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c37faddc8acd826cfc5e2392531aba734b229741d3daec7f4c777a8f0d4993e5"}, + {file = "coverage-7.6.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab31fdd643f162c467cfe6a86e9cb5f1965b632e5e65c072d90854ff486d02cf"}, + {file = "coverage-7.6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97df87e1a20deb75ac7d920c812e9326096aa00a9a4b6d07679b4f1f14b06c90"}, + {file = "coverage-7.6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:343056c5e0737487a5291f5691f4dfeb25b3e3c8699b4d36b92bb0e586219d14"}, + {file = "coverage-7.6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4ef1c56b47b6b9024b939d503ab487231df1f722065a48f4fc61832130b90e"}, + {file = "coverage-7.6.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fca4a92c8a7a73dee6946471bce6d1443d94155694b893b79e19ca2a540d86e"}, + {file = "coverage-7.6.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69f251804e052fc46d29d0e7348cdc5fcbfc4861dc4a1ebedef7e78d241ad39e"}, + {file = "coverage-7.6.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e8ea055b3ea046c0f66217af65bc193bbbeca1c8661dc5fd42698db5795d2627"}, + {file = "coverage-7.6.2-cp39-cp39-win32.whl", hash = "sha256:6c2ba1e0c24d8fae8f2cf0aeb2fc0a2a7f69b6d20bd8d3749fd6b36ecef5edf0"}, + {file = "coverage-7.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:2186369a654a15628e9c1c9921409a6b3eda833e4b91f3ca2a7d9f77abb4987c"}, + {file = "coverage-7.6.2-pp39.pp310-none-any.whl", hash = "sha256:667952739daafe9616db19fbedbdb87917eee253ac4f31d70c7587f7ab531b4e"}, + {file = "coverage-7.6.2.tar.gz", hash = "sha256:a5f81e68aa62bc0cfca04f7b19eaa8f9c826b53fc82ab9e2121976dc74f131f3"}, ] [package.extras] @@ -1171,13 +1183,13 @@ files = [ [[package]] name = "distlib" -version = "0.3.8" +version = "0.3.9" description = "Distribution utilities" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, - {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, + {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, + {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, ] [[package]] @@ -2366,13 +2378,13 @@ xml = ["lxml (>=4.9.2)"] [[package]] name = "pandas-stubs" -version = "2.2.2.240909" +version = "2.2.3.241009" description = "Type annotations for pandas" optional = false python-versions = ">=3.10" files = [ - {file = "pandas_stubs-2.2.2.240909-py3-none-any.whl", hash = "sha256:e230f5fa4065f9417804f4d65cd98f86c002efcc07933e8abcd48c3fad9c30a2"}, - {file = "pandas_stubs-2.2.2.240909.tar.gz", hash = "sha256:3c0951a2c3e45e3475aed9d80b7147ae82f176b9e42e9fb321cfdebf3d411b3d"}, + {file = "pandas_stubs-2.2.3.241009-py3-none-any.whl", hash = "sha256:3a6f8f142105a42550be677ba741ba532621f4e0acad2155c0e7b2450f114cfa"}, + {file = "pandas_stubs-2.2.3.241009.tar.gz", hash = "sha256:d4ab618253f0acf78a5d0d2bfd6dffdd92d91a56a69bdc8144e5a5c6d25be3b5"}, ] [package.dependencies] @@ -3984,4 +3996,4 @@ polymarket = ["py-clob-client"] [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.13" -content-hash = "1a116a21f5d78658771d0a19d929107f8f3c073720b75508b00d2566604c9718" +content-hash = "f9423d4361fbc964d995c27e3dfea9458e95ec8fca231d13123484ead28da2c2" diff --git a/pyproject.toml b/pyproject.toml index b9dcae5a84b2..315450381575 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,7 +101,7 @@ types-toml = "^0.10.2" optional = true [tool.poetry.group.test.dependencies] -coverage = "^7.6.1" +coverage = "^7.6.2" pytest = "^7.4.4" pytest-aiohttp = "^1.0.5" pytest-asyncio = "==0.21.1" # Pinned due Cython: cannot set '__pytest_asyncio_scoped_event_loop' attribute of immutable type From 8f11406ef1844f03c9149bfcb0534e4eaa2da10f Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 06:11:51 +1100 Subject: [PATCH 053/224] Add Clock.timestamp_us UNIX timestamp microseconds --- RELEASES.md | 1 + nautilus_core/common/src/ffi/clock.rs | 4 ++-- nautilus_trader/common/component.pxd | 1 + nautilus_trader/common/component.pyx | 27 +++++++++++++++++++++++--- tests/unit_tests/common/test_clock.py | 28 +++++++++++++++++++++++++++ 5 files changed, 56 insertions(+), 5 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index e77feed37451..f421479988df 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -3,6 +3,7 @@ Released on TBD (UTC). ### Enhancements +- Added `Clock.timestamp_us()` method for UNIX timestamps in microseconds (μs) - Added support for `bbo-1s` and `bbo-1m` quote schemas for Databento adapter (#1990), thanks @faysou - Added validation for venue `book_type` configuration vs data (prevents an issue where top-of-book data is used when order book data is expected) - Added `compute_effective_deltas` config setting for `PolymarketDataClientConfig`, reducing snapshot size (`False` by default to maintain current behavior) diff --git a/nautilus_core/common/src/ffi/clock.rs b/nautilus_core/common/src/ffi/clock.rs index 4b6e73a87a06..6163f35fc084 100644 --- a/nautilus_core/common/src/ffi/clock.rs +++ b/nautilus_core/common/src/ffi/clock.rs @@ -104,7 +104,7 @@ pub extern "C" fn test_clock_timestamp_ms(clock: &TestClock_API) -> u64 { #[no_mangle] pub extern "C" fn test_clock_timestamp_us(clock: &TestClock_API) -> u64 { - clock.get_time_ms() + clock.get_time_us() } #[no_mangle] @@ -310,7 +310,7 @@ pub extern "C" fn live_clock_timestamp_ms(clock: &mut LiveClock_API) -> u64 { #[no_mangle] pub extern "C" fn live_clock_timestamp_us(clock: &mut LiveClock_API) -> u64 { - clock.get_time_ms() + clock.get_time_us() } #[no_mangle] diff --git a/nautilus_trader/common/component.pxd b/nautilus_trader/common/component.pxd index 54947f648195..6f0bf145a187 100644 --- a/nautilus_trader/common/component.pxd +++ b/nautilus_trader/common/component.pxd @@ -43,6 +43,7 @@ from nautilus_trader.serialization.base cimport Serializer cdef class Clock: cpdef double timestamp(self) cpdef uint64_t timestamp_ms(self) + cpdef uint64_t timestamp_us(self) cpdef uint64_t timestamp_ns(self) cpdef datetime utc_now(self) cpdef datetime local_now(self, tzinfo tz=*) diff --git a/nautilus_trader/common/component.pyx b/nautilus_trader/common/component.pyx index dbc8d321d6fa..64f50af51303 100644 --- a/nautilus_trader/common/component.pyx +++ b/nautilus_trader/common/component.pyx @@ -165,7 +165,7 @@ cdef class Clock: cpdef double timestamp(self): """ - Return the current UNIX time in seconds. + Return the current UNIX timestamp in seconds. Returns ------- @@ -180,7 +180,7 @@ cdef class Clock: cpdef uint64_t timestamp_ms(self): """ - Return the current UNIX time in milliseconds (ms). + Return the current UNIX timestamp in milliseconds (ms). Returns ------- @@ -193,9 +193,24 @@ cdef class Clock: """ raise NotImplementedError("method `timestamp_ms` must be implemented in the subclass") # pragma: no cover + cpdef uint64_t timestamp_us(self): + """ + Return the current UNIX timestamp in microseconds (μs). + + Returns + ------- + uint64_t + + References + ---------- + https://en.wikipedia.org/wiki/Unix_time + + """ + raise NotImplementedError("method `timestamp_us` must be implemented in the subclass") # pragma: no cover + cpdef uint64_t timestamp_ns(self): """ - Return the current UNIX time in nanoseconds (ns). + Return the current UNIX timestamp in nanoseconds (ns). Returns ------- @@ -570,6 +585,9 @@ cdef class TestClock(Clock): cpdef uint64_t timestamp_ms(self): return test_clock_timestamp_ms(&self._mem) + cpdef uint64_t timestamp_us(self): + return test_clock_timestamp_us(&self._mem) + cpdef uint64_t timestamp_ns(self): return test_clock_timestamp_ns(&self._mem) @@ -734,6 +752,9 @@ cdef class LiveClock(Clock): cpdef uint64_t timestamp_ms(self): return live_clock_timestamp_ms(&self._mem) + cpdef uint64_t timestamp_us(self): + return live_clock_timestamp_us(&self._mem) + cpdef uint64_t timestamp_ns(self): return live_clock_timestamp_ns(&self._mem) diff --git a/tests/unit_tests/common/test_clock.py b/tests/unit_tests/common/test_clock.py index 49b5e2009321..34fce6f9c093 100644 --- a/tests/unit_tests/common/test_clock.py +++ b/tests/unit_tests/common/test_clock.py @@ -301,6 +301,18 @@ def test_timestamp_ms_returns_expected_datetime(self): assert isinstance(result, int) assert result == 1000 + def test_timestamp_us_returns_expected_datetime(self): + # Arrange + clock = TestClock() + clock.advance_time(1_000_000_000) + + # Act + result = clock.timestamp_us() + + # Assert + assert isinstance(result, int) + assert result == 1_000_000 + def test_timestamp_ns_returns_expected_datetime(self): # Arrange clock = TestClock() @@ -600,6 +612,22 @@ def test_timestamp_ms_is_monotonic(self): assert result3 >= result2 assert result2 >= result1 + def test_timestamp_us_is_monotonic(self): + # Arrange, Act + result1 = self.clock.timestamp_us() + result2 = self.clock.timestamp_us() + result3 = self.clock.timestamp_us() + result4 = self.clock.timestamp_us() + result5 = self.clock.timestamp_us() + + # Assert + assert isinstance(result1, int) + assert result1 > 0 + assert result5 >= result4 + assert result4 >= result3 + assert result3 >= result2 + assert result2 >= result1 + def test_timestamp_ns_is_monotonic(self): # Arrange, Act result1 = self.clock.timestamp_ns() From 5057e5082dca6e56f6902e5105040e476fa9dc4c Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 06:16:00 +1100 Subject: [PATCH 054/224] Use clock.timestamp_us() --- nautilus_trader/adapters/polymarket/execution.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_trader/adapters/polymarket/execution.py b/nautilus_trader/adapters/polymarket/execution.py index d6fb3f17d2dd..e9ff03d5debb 100644 --- a/nautilus_trader/adapters/polymarket/execution.py +++ b/nautilus_trader/adapters/polymarket/execution.py @@ -747,10 +747,10 @@ def _handle_ws_message(self, raw: bytes) -> None: self._log.error(f"Error handling websocket message: {e} {raw.decode()}") def _add_trade_to_cache(self, msg: PolymarketUserTrade, raw: bytes) -> None: - start_ns = self._clock.timestamp_ns() + start_us = self._clock.timestamp_us() cache_key = get_polymarket_trades_key(msg.taker_order_id, msg.id) self._cache.add(cache_key, raw) - interval_us = int((self._clock.timestamp_ns() - start_ns) / 1_000) + interval_us = self._clock.timestamp_us() - start_us self._log.info( f"Added trade {msg.id} {msg.status.value} to {cache_key} in {interval_us}μs", LogColor.BLUE, From 0a338ba1b640195ff3f5adc7b100a95c86f99ad8 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 06:19:21 +1100 Subject: [PATCH 055/224] Use time conversion constant --- nautilus_trader/backtest/models.pyx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/nautilus_trader/backtest/models.pyx b/nautilus_trader/backtest/models.pyx index 4389bfcd1784..d30e7141736d 100644 --- a/nautilus_trader/backtest/models.pyx +++ b/nautilus_trader/backtest/models.pyx @@ -18,6 +18,7 @@ import random from libc.stdint cimport uint64_t from nautilus_trader.core.correctness cimport Condition +from nautilus_trader.core.rust.core cimport NANOSECONDS_IN_MILLISECOND from nautilus_trader.core.rust.model cimport LiquiditySide from nautilus_trader.model.functions cimport liquidity_side_to_str from nautilus_trader.model.instruments.base cimport Instrument @@ -27,9 +28,6 @@ from nautilus_trader.model.objects cimport Quantity from nautilus_trader.model.orders.base cimport Order -cdef uint64_t NANOSECONDS_IN_MILLISECOND = 1_000_000 - - cdef class FillModel: """ Provides probabilistic modeling for order fill dynamics including probability From 8760f539cc0f02545217031ac5c5debd818102c0 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 06:29:40 +1100 Subject: [PATCH 056/224] Refine Rust docs --- nautilus_core/adapters/src/lib.rs | 8 ++++---- nautilus_core/analysis/src/lib.rs | 4 ++-- nautilus_core/backtest/src/lib.rs | 4 ++-- nautilus_core/common/src/lib.rs | 6 +++--- nautilus_core/core/src/correctness.rs | 4 ++-- nautilus_core/core/src/lib.rs | 4 ++-- nautilus_core/data/src/lib.rs | 4 ++-- nautilus_core/execution/src/lib.rs | 4 ++-- nautilus_core/indicators/src/lib.rs | 2 +- nautilus_core/infrastructure/src/lib.rs | 6 +++--- nautilus_core/model/src/accounts/mod.rs | 2 ++ nautilus_core/model/src/lib.rs | 6 +++--- nautilus_core/network/src/lib.rs | 2 +- nautilus_core/persistence/src/lib.rs | 4 ++-- nautilus_core/pyo3/src/lib.rs | 2 +- 15 files changed, 32 insertions(+), 30 deletions(-) diff --git a/nautilus_core/adapters/src/lib.rs b/nautilus_core/adapters/src/lib.rs index e4d8473aa9de..79b27270e528 100644 --- a/nautilus_core/adapters/src/lib.rs +++ b/nautilus_core/adapters/src/lib.rs @@ -28,10 +28,10 @@ //! depending on the intended use case, i.e. whether to provide Python bindings //! for the main `nautilus_trader` Python package, or as part of a Rust only build. //! -//! - `databento`: Includes the Databento integration adapter -//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen` -//! - `python`: Enables Python bindings from `pyo3` -//! - `tardis`: Includes the Tardis data loader +//! - `databento`: Includes the Databento integration adapter. +//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen`. +//! - `python`: Enables Python bindings from `pyo3`. +//! - `tardis`: Includes the Tardis data loader. pub mod crypto; diff --git a/nautilus_core/analysis/src/lib.rs b/nautilus_core/analysis/src/lib.rs index e159f7acd2f7..483d3a212ed7 100644 --- a/nautilus_core/analysis/src/lib.rs +++ b/nautilus_core/analysis/src/lib.rs @@ -28,5 +28,5 @@ //! depending on the intended use case, i.e. whether to provide Python bindings //! for the main `nautilus_trader` Python package, or as part of a Rust only build. //! -//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen` -//! - `python`: Enables Python bindings from `pyo3` +//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen`. +//! - `python`: Enables Python bindings from `pyo3`. diff --git a/nautilus_core/backtest/src/lib.rs b/nautilus_core/backtest/src/lib.rs index b2a54623c2ad..a73107df0377 100644 --- a/nautilus_core/backtest/src/lib.rs +++ b/nautilus_core/backtest/src/lib.rs @@ -24,8 +24,8 @@ //! depending on the intended use case, i.e. whether to provide Python bindings //! for the main `nautilus_trader` Python package, or as part of a Rust only build. //! -//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen` -//! - `python`: Enables Python bindings from `pyo3` +//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen`. +//! - `python`: Enables Python bindings from `pyo3`. pub mod data_client; pub mod engine; diff --git a/nautilus_core/common/src/lib.rs b/nautilus_core/common/src/lib.rs index b687c6270956..9c6710d6f1f7 100644 --- a/nautilus_core/common/src/lib.rs +++ b/nautilus_core/common/src/lib.rs @@ -24,9 +24,9 @@ //! depending on the intended use case, i.e. whether to provide Python bindings //! for the main `nautilus_trader` Python package, or as part of a Rust only build. //! -//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen` -//! - `python`: Enables Python bindings from `pyo3` -//! - `stubs`: Enables type stubs for use in testing scenarios +//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen`. +//! - `python`: Enables Python bindings from `pyo3`. +//! - `stubs`: Enables type stubs for use in testing scenarios. pub mod actor; pub mod cache; diff --git a/nautilus_core/core/src/correctness.rs b/nautilus_core/core/src/correctness.rs index e5cfc5792516..87155cf9a53f 100644 --- a/nautilus_core/core/src/correctness.rs +++ b/nautilus_core/core/src/correctness.rs @@ -13,8 +13,8 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- -//! Functions for static condition checks similar to the *design by contract* philosophy -//! to help ensure logical correctness. +//! Functions for condition checks similar to the *design by contract* philosophy +//! to ensure logical correctness. //! //! This module provides validation checking of function or method conditions. //! diff --git a/nautilus_core/core/src/lib.rs b/nautilus_core/core/src/lib.rs index 19b5849459bb..7425dca78c53 100644 --- a/nautilus_core/core/src/lib.rs +++ b/nautilus_core/core/src/lib.rs @@ -24,8 +24,8 @@ //! depending on the intended use case, i.e. whether to provide Python bindings //! for the main `nautilus_trader` Python package, or as part of a Rust only build. //! -//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen` -//! - `python`: Enables Python bindings from `pyo3` +//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen`. +//! - `python`: Enables Python bindings from `pyo3`. pub mod correctness; pub mod datetime; diff --git a/nautilus_core/data/src/lib.rs b/nautilus_core/data/src/lib.rs index 5498f37004c7..f642d3266066 100644 --- a/nautilus_core/data/src/lib.rs +++ b/nautilus_core/data/src/lib.rs @@ -24,8 +24,8 @@ //! depending on the intended use case, i.e. whether to provide Python bindings //! for the main `nautilus_trader` Python package, or as part of a Rust only build. //! -//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen` -//! - `python`: Enables Python bindings from `pyo3` +//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen`. +//! - `python`: Enables Python bindings from `pyo3`. pub mod aggregation; pub mod client; diff --git a/nautilus_core/execution/src/lib.rs b/nautilus_core/execution/src/lib.rs index 26b0b9de9813..459acefd88a0 100644 --- a/nautilus_core/execution/src/lib.rs +++ b/nautilus_core/execution/src/lib.rs @@ -24,8 +24,8 @@ //! depending on the intended use case, i.e. whether to provide Python bindings //! for the main `nautilus_trader` Python package, or as part of a Rust only build. //! -//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen` -//! - `python`: Enables Python bindings from `pyo3` +//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen`. +//! - `python`: Enables Python bindings from `pyo3`. pub mod client; pub mod engine; diff --git a/nautilus_core/indicators/src/lib.rs b/nautilus_core/indicators/src/lib.rs index 80b5902aa5ad..e1b8b645d10a 100644 --- a/nautilus_core/indicators/src/lib.rs +++ b/nautilus_core/indicators/src/lib.rs @@ -24,7 +24,7 @@ //! depending on the intended use case, i.e. whether to provide Python bindings //! for the main `nautilus_trader` Python package, or as part of a Rust only build. //! -//! - `python`: Enables Python bindings from `pyo3` +//! - `python`: Enables Python bindings from `pyo3`. pub mod average; pub mod book; diff --git a/nautilus_core/infrastructure/src/lib.rs b/nautilus_core/infrastructure/src/lib.rs index 09a02246c974..79f267b81f5d 100644 --- a/nautilus_core/infrastructure/src/lib.rs +++ b/nautilus_core/infrastructure/src/lib.rs @@ -24,9 +24,9 @@ //! depending on the intended use case, i.e. whether to provide Python bindings //! for the main `nautilus_trader` Python package, or as part of a Rust only build. //! -//! - `python`: Enables Python bindings from `pyo3` -//! - `redis`: Enables the Redis cache database and message bus backing implementations -//! - `sql`: Enables the SQL models and cache database +//! - `python`: Enables Python bindings from `pyo3`. +//! - `redis`: Enables the Redis cache database and message bus backing implementations. +//! - `sql`: Enables the SQL models and cache database. #![allow(deprecated)] // TODO: Temporary for pyo3 upgrade diff --git a/nautilus_core/model/src/accounts/mod.rs b/nautilus_core/model/src/accounts/mod.rs index 2e92456f2b4a..69daf3c3b6a6 100644 --- a/nautilus_core/model/src/accounts/mod.rs +++ b/nautilus_core/model/src/accounts/mod.rs @@ -13,6 +13,8 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- +//! Account types such as `CashAccount` and `MarginAccount`. + pub mod any; pub mod base; pub mod cash; diff --git a/nautilus_core/model/src/lib.rs b/nautilus_core/model/src/lib.rs index 61643054ac57..22d027cded61 100644 --- a/nautilus_core/model/src/lib.rs +++ b/nautilus_core/model/src/lib.rs @@ -24,9 +24,9 @@ //! depending on the intended use case, i.e. whether to provide Python bindings //! for the main `nautilus_trader` Python package, or as part of a Rust only build. //! -//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen` -//! - `python`: Enables Python bindings from `pyo3` -//! - `stubs`: Enables type stubs for use in testing scenarios +//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen`. +//! - `python`: Enables Python bindings from `pyo3`. +//! - `stubs`: Enables type stubs for use in testing scenarios. pub mod accounts; pub mod currencies; diff --git a/nautilus_core/network/src/lib.rs b/nautilus_core/network/src/lib.rs index 2715be4616fc..9fa4381dbd04 100644 --- a/nautilus_core/network/src/lib.rs +++ b/nautilus_core/network/src/lib.rs @@ -24,7 +24,7 @@ //! depending on the intended use case, i.e. whether to provide Python bindings //! for the main `nautilus_trader` Python package, or as part of a Rust only build. //! -//! - `python`: Enables Python bindings from `pyo3` +//! - `python`: Enables Python bindings from `pyo3`. #![allow(warnings)] // TODO: non-local `impl` definition, temporary allow until pyo3 upgrade diff --git a/nautilus_core/persistence/src/lib.rs b/nautilus_core/persistence/src/lib.rs index 7c96f3e35c74..9d6ce5542195 100644 --- a/nautilus_core/persistence/src/lib.rs +++ b/nautilus_core/persistence/src/lib.rs @@ -24,8 +24,8 @@ //! depending on the intended use case, i.e. whether to provide Python bindings //! for the main `nautilus_trader` Python package, or as part of a Rust only build. //! -//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen` -//! - `python`: Enables Python bindings from `pyo3` +//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen`. +//! - `python`: Enables Python bindings from `pyo3`. #![allow(deprecated)] // TODO: Temporary for pyo3 upgrade diff --git a/nautilus_core/pyo3/src/lib.rs b/nautilus_core/pyo3/src/lib.rs index 39bd0ccf8d93..1aee35b2350d 100644 --- a/nautilus_core/pyo3/src/lib.rs +++ b/nautilus_core/pyo3/src/lib.rs @@ -24,7 +24,7 @@ //! depending on the intended use case, i.e. whether to provide Python bindings //! for the main `nautilus_trader` Python package, or as part of a Rust only build. //! -//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen` +//! - `ffi`: Enables the C foreign function interface (FFI) from `cbindgen`. #![allow(deprecated)] // TODO: Temporary for pyo3 upgrade From dd378fea793ebcb956a8753068134a91ce8fd8db Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 07:27:46 +1100 Subject: [PATCH 057/224] Refine DatabentoDataLoader --- .../adapters/src/databento/decode.rs | 33 ++-- .../adapters/src/databento/loader.rs | 165 +++++++++++++++--- .../adapters/src/databento/python/loader.rs | 38 ++-- 3 files changed, 181 insertions(+), 55 deletions(-) diff --git a/nautilus_core/adapters/src/databento/decode.rs b/nautilus_core/adapters/src/databento/decode.rs index 54c1f062dffb..1e5b18951be6 100644 --- a/nautilus_core/adapters/src/databento/decode.rs +++ b/nautilus_core/adapters/src/databento/decode.rs @@ -1213,7 +1213,7 @@ pub fn decode_statistics_msg( //////////////////////////////////////////////////////////////////////////////// #[cfg(test)] mod tests { - use std::path::PathBuf; + use std::path::{Path, PathBuf}; use databento::dbn::decode::{dbn::Decoder, DecodeStream}; use fallible_streaming_iterator::FallibleStreamingIterator; @@ -1221,8 +1221,9 @@ mod tests { use super::*; - pub const TEST_DATA_PATH: &str = - concat!(env!("CARGO_MANIFEST_DIR"), "/src/databento/test_data"); + fn test_data_path() -> PathBuf { + Path::new(env!("CARGO_MANIFEST_DIR")).join("src/databento/test_data") + } #[rstest] fn test_decode_price() { @@ -1232,7 +1233,7 @@ mod tests { #[rstest] fn test_decode_mbo_msg() { - let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.mbo.dbn.zst")); + let path = test_data_path().join("test_data.mbo.dbn.zst"); let mut dbn_stream = Decoder::from_zstd_file(path) .unwrap() .decode_stream::(); @@ -1257,7 +1258,7 @@ mod tests { #[rstest] fn test_decode_mbp1_msg() { - let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.mbp-1.dbn.zst")); + let path = test_data_path().join("test_data.mbp-1.dbn.zst"); let mut dbn_stream = Decoder::from_zstd_file(path) .unwrap() .decode_stream::(); @@ -1278,7 +1279,7 @@ mod tests { #[rstest] fn test_decode_bbo_1s_msg() { - let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.bbo-1s.dbn.zst")); + let path = test_data_path().join("test_data.bbo-1s.dbn.zst"); let mut dbn_stream = Decoder::from_zstd_file(path) .unwrap() .decode_stream::(); @@ -1299,7 +1300,7 @@ mod tests { #[rstest] fn test_decode_bbo_1m_msg() { - let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.bbo-1m.dbn.zst")); + let path = test_data_path().join("test_data.bbo-1m.dbn.zst"); let mut dbn_stream = Decoder::from_zstd_file(path) .unwrap() .decode_stream::(); @@ -1320,7 +1321,7 @@ mod tests { #[rstest] fn test_decode_mbp10_msg() { - let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.mbp-10.dbn.zst")); + let path = test_data_path().join("test_data.mbp-10.dbn.zst"); let mut dbn_stream = Decoder::from_zstd_file(path) .unwrap() .decode_stream::(); @@ -1343,7 +1344,7 @@ mod tests { #[rstest] fn test_decode_trade_msg() { - let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.trades.dbn.zst")); + let path = test_data_path().join("test_data.trades.dbn.zst"); let mut dbn_stream = Decoder::from_zstd_file(path) .unwrap() .decode_stream::(); @@ -1364,7 +1365,7 @@ mod tests { #[rstest] fn test_decode_tbbo_msg() { - let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.tbbo.dbn.zst")); + let path = test_data_path().join("test_data.tbbo.dbn.zst"); let mut dbn_stream = Decoder::from_zstd_file(path) .unwrap() .decode_stream::(); @@ -1395,7 +1396,7 @@ mod tests { #[ignore] // TODO: Requires updated test data #[rstest] fn test_decode_ohlcv_msg() { - let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.ohlcv-1s.dbn.zst")); + let path = test_data_path().join("test_data.ohlcv-1s.dbn.zst"); let mut dbn_stream = Decoder::from_zstd_file(path) .unwrap() .decode_stream::(); @@ -1418,7 +1419,7 @@ mod tests { #[rstest] fn test_decode_definition_msg() { - let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.definition.dbn.zst")); + let path = test_data_path().join("test_data.definition.dbn.zst"); let mut dbn_stream = Decoder::from_zstd_file(path) .unwrap() .decode_stream::(); @@ -1432,7 +1433,7 @@ mod tests { #[rstest] fn test_decode_definition_v1_msg() { - let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.definition.v1.dbn.zst")); + let path = test_data_path().join("test_data.definition.v1.dbn.zst"); let mut dbn_stream = Decoder::from_zstd_file(path) .unwrap() .decode_stream::(); @@ -1446,7 +1447,7 @@ mod tests { #[rstest] fn test_decode_status_msg() { - let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.status.dbn.zst")); + let path = test_data_path().join("test_data.status.dbn.zst"); let mut dbn_stream = Decoder::from_zstd_file(path) .unwrap() .decode_stream::(); @@ -1468,7 +1469,7 @@ mod tests { #[rstest] fn test_decode_imbalance_msg() { - let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.imbalance.dbn.zst")); + let path = test_data_path().join("test_data.imbalance.dbn.zst"); let mut dbn_stream = Decoder::from_zstd_file(path) .unwrap() .decode_stream::(); @@ -1492,7 +1493,7 @@ mod tests { #[rstest] fn test_decode_statistics_msg() { - let path = PathBuf::from(format!("{TEST_DATA_PATH}/test_data.statistics.dbn.zst")); + let path = test_data_path().join("test_data.statistics.dbn.zst"); let mut dbn_stream = Decoder::from_zstd_file(path) .unwrap() .decode_stream::(); diff --git a/nautilus_core/adapters/src/databento/loader.rs b/nautilus_core/adapters/src/databento/loader.rs index ea51b4a593ee..12f359f36c33 100644 --- a/nautilus_core/adapters/src/databento/loader.rs +++ b/nautilus_core/adapters/src/databento/loader.rs @@ -13,7 +13,10 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- -use std::{env, fs, path::PathBuf}; +use std::{ + env, fs, + path::{Path, PathBuf}, +}; use databento::dbn; use dbn::{ @@ -153,7 +156,7 @@ impl DatabentoDataLoader { self.publisher_venue_map.get(&publisher_id) } - pub fn schema_from_file(&self, filepath: PathBuf) -> anyhow::Result> { + pub fn schema_from_file(&self, filepath: &Path) -> anyhow::Result> { let decoder = Decoder::from_zstd_file(filepath)?; let metadata = decoder.metadata(); Ok(metadata.schema.map(|schema| schema.to_string())) @@ -161,7 +164,7 @@ impl DatabentoDataLoader { pub fn read_definition_records( &mut self, - filepath: PathBuf, + filepath: &Path, ) -> anyhow::Result> + '_> { let mut decoder = Decoder::from_zstd_file(filepath)?; decoder.set_upgrade_policy(dbn::VersionUpgradePolicy::Upgrade); @@ -200,7 +203,7 @@ impl DatabentoDataLoader { pub fn read_records( &self, - filepath: PathBuf, + filepath: &Path, instrument_id: Option, include_trades: bool, ) -> anyhow::Result, Option)>> + '_> @@ -227,7 +230,7 @@ impl DatabentoDataLoader { &metadata, &self.publisher_venue_map, ) - .unwrap(), // TODO: Panic on error for now + .expect("Failed to decode record"), }; match decode_record( @@ -246,7 +249,7 @@ impl DatabentoDataLoader { })) } - pub fn load_instruments(&mut self, filepath: PathBuf) -> anyhow::Result> { + pub fn load_instruments(&mut self, filepath: &Path) -> anyhow::Result> { self.read_definition_records(filepath)? .collect::, _>>() } @@ -254,7 +257,7 @@ impl DatabentoDataLoader { // Cannot include trades pub fn load_order_book_deltas( &self, - filepath: PathBuf, + filepath: &Path, instrument_id: Option, ) -> anyhow::Result> { self.read_records::(filepath, instrument_id, false)? @@ -274,7 +277,7 @@ impl DatabentoDataLoader { pub fn load_order_book_depth10( &self, - filepath: PathBuf, + filepath: &Path, instrument_id: Option, ) -> anyhow::Result> { self.read_records::(filepath, instrument_id, false)? @@ -294,7 +297,7 @@ impl DatabentoDataLoader { pub fn load_quotes( &self, - filepath: PathBuf, + filepath: &Path, instrument_id: Option, ) -> anyhow::Result> { self.read_records::(filepath, instrument_id, false)? @@ -314,7 +317,7 @@ impl DatabentoDataLoader { pub fn load_bbo_quotes( &self, - filepath: PathBuf, + filepath: &Path, instrument_id: Option, ) -> anyhow::Result> { self.read_records::(filepath, instrument_id, false)? @@ -334,7 +337,7 @@ impl DatabentoDataLoader { pub fn load_tbbo_trades( &self, - filepath: PathBuf, + filepath: &Path, instrument_id: Option, ) -> anyhow::Result> { self.read_records::(filepath, instrument_id, false)? @@ -353,7 +356,7 @@ impl DatabentoDataLoader { pub fn load_trades( &self, - filepath: PathBuf, + filepath: &Path, instrument_id: Option, ) -> anyhow::Result> { self.read_records::(filepath, instrument_id, false)? @@ -373,7 +376,7 @@ impl DatabentoDataLoader { pub fn load_bars( &self, - filepath: PathBuf, + filepath: &Path, instrument_id: Option, ) -> anyhow::Result> { self.read_records::(filepath, instrument_id, false)? @@ -391,9 +394,9 @@ impl DatabentoDataLoader { .collect() } - pub fn read_status_records( + pub fn load_status_records( &self, - filepath: PathBuf, + filepath: &Path, instrument_id: Option, ) -> anyhow::Result> + '_> where @@ -417,7 +420,7 @@ impl DatabentoDataLoader { &metadata, &self.publisher_venue_map, ) - .unwrap(), // TODO: Panic on error for now + .expect("Failed to decode record"), }; let msg = record.get::().expect("Invalid `StatusMsg`"); @@ -433,7 +436,7 @@ impl DatabentoDataLoader { pub fn read_imbalance_records( &self, - filepath: PathBuf, + filepath: &Path, instrument_id: Option, ) -> anyhow::Result> + '_> where @@ -459,7 +462,7 @@ impl DatabentoDataLoader { &metadata, &self.publisher_venue_map, ) - .unwrap(), // TODO: Panic on error for now + .expect("Failed to decode record"), }; let msg = record @@ -482,7 +485,7 @@ impl DatabentoDataLoader { pub fn read_statistics_records( &self, - filepath: PathBuf, + filepath: &Path, instrument_id: Option, ) -> anyhow::Result> + '_> where @@ -508,7 +511,7 @@ impl DatabentoDataLoader { &metadata, &self.publisher_venue_map, ) - .unwrap(), // TODO: Panic on error for now + .expect("Failed to decode record"), }; let msg = record.get::().expect("Invalid `StatMsg`"); @@ -527,3 +530,125 @@ impl DatabentoDataLoader { })) } } + +//////////////////////////////////////////////////////////////////////////////// +// Tests +//////////////////////////////////////////////////////////////////////////////// +#[cfg(test)] +mod tests { + use std::path::{Path, PathBuf}; + + use rstest::*; + + use super::*; + + fn test_data_path() -> PathBuf { + Path::new(env!("CARGO_MANIFEST_DIR")).join("src/databento/test_data") + } + + fn data_loader() -> DatabentoDataLoader { + let publishers_filepath = Path::new(env!("CARGO_MANIFEST_DIR")) + .join("src") + .join("databento") + .join("publishers.json"); + + DatabentoDataLoader::new(Some(publishers_filepath)).unwrap() + } + + // TODO: Improve the below assertions that we've actually read the records we expected + + #[rstest] + // #[case(test_data_path().join("test_data.definition.dbn.zst"))] // TODO: Fails + #[case(test_data_path().join("test_data.definition.v1.dbn.zst"))] + fn test_load_instruments(#[case] path: PathBuf) { + let mut loader = data_loader(); + let instruments = loader.load_instruments(&path).unwrap(); + + assert_eq!(instruments.len(), 2); + } + + #[rstest] + fn test_load_order_book_deltas() { + let path = test_data_path().join("test_data.mbo.dbn.zst"); + let loader = data_loader(); + let instrument_id = InstrumentId::from("ESM4.GLBX"); + + let deltas = loader + .load_order_book_deltas(&path, Some(instrument_id)) + .unwrap(); + + assert_eq!(deltas.len(), 2); + } + + #[rstest] + fn test_load_order_book_depth10() { + let path = test_data_path().join("test_data.mbp-10.dbn.zst"); + let loader = data_loader(); + let instrument_id = InstrumentId::from("ESM4.GLBX"); + + let depths = loader + .load_order_book_depth10(&path, Some(instrument_id)) + .unwrap(); + + assert_eq!(depths.len(), 2); + } + + #[rstest] + fn test_load_quotes() { + let path = test_data_path().join("test_data.mbp-1.dbn.zst"); + let loader = data_loader(); + let instrument_id = InstrumentId::from("ESM4.GLBX"); + + let quotes = loader.load_quotes(&path, Some(instrument_id)).unwrap(); + + assert_eq!(quotes.len(), 2); + } + + #[rstest] + #[case(test_data_path().join("test_data.bbo-1s.dbn.zst"))] + #[case(test_data_path().join("test_data.bbo-1m.dbn.zst"))] + fn test_load_bbo_quotes(#[case] path: PathBuf) { + let loader = data_loader(); + let instrument_id = InstrumentId::from("ESM4.GLBX"); + + let quotes = loader.load_bbo_quotes(&path, Some(instrument_id)).unwrap(); + + assert_eq!(quotes.len(), 2); + } + + #[rstest] + fn test_load_tbbo_trades() { + let path = test_data_path().join("test_data.tbbo.dbn.zst"); + let loader = data_loader(); + let instrument_id = InstrumentId::from("ESM4.GLBX"); + + let _trades = loader.load_tbbo_trades(&path, Some(instrument_id)).unwrap(); + + // assert_eq!(trades.len(), 2); TODO: No records? + } + + #[rstest] + fn test_load_trades() { + let path = test_data_path().join("test_data.trades.dbn.zst"); + let loader = data_loader(); + + let instrument_id = InstrumentId::from("ESM4.GLBX"); + let trades = loader.load_trades(&path, Some(instrument_id)).unwrap(); + + assert_eq!(trades.len(), 2); + } + + #[rstest] + // #[case(test_data_path().join("test_data.ohlcv-1d.dbn.zst"))] // TODO: Needs new data + #[case(test_data_path().join("test_data.ohlcv-1h.dbn.zst"))] + #[case(test_data_path().join("test_data.ohlcv-1m.dbn.zst"))] + #[case(test_data_path().join("test_data.ohlcv-1s.dbn.zst"))] + fn test_load_bars(#[case] path: PathBuf) { + let loader = data_loader(); + + let instrument_id = InstrumentId::from("ESM4.GLBX"); + let bars = loader.load_bars(&path, Some(instrument_id)).unwrap(); + + assert_eq!(bars.len(), 2); + } +} diff --git a/nautilus_core/adapters/src/databento/python/loader.rs b/nautilus_core/adapters/src/databento/python/loader.rs index 68153e56b020..93418d4cdc89 100644 --- a/nautilus_core/adapters/src/databento/python/loader.rs +++ b/nautilus_core/adapters/src/databento/python/loader.rs @@ -76,12 +76,12 @@ impl DatabentoDataLoader { #[pyo3(name = "schema_for_file")] fn py_schema_for_file(&self, filepath: PathBuf) -> PyResult> { - self.schema_from_file(filepath).map_err(to_pyvalue_err) + self.schema_from_file(&filepath).map_err(to_pyvalue_err) } #[pyo3(name = "load_instruments")] fn py_load_instruments(&mut self, py: Python, filepath: PathBuf) -> PyResult { - let iter = self.load_instruments(filepath).map_err(to_pyvalue_err)?; + let iter = self.load_instruments(&filepath).map_err(to_pyvalue_err)?; let mut data = Vec::new(); for instrument in iter { @@ -100,7 +100,7 @@ impl DatabentoDataLoader { instrument_id: Option, ) -> PyResult> { Ok(self - .load_order_book_deltas(filepath, instrument_id) + .load_order_book_deltas(&filepath, instrument_id) .map_err(to_pyvalue_err)?) } @@ -113,7 +113,7 @@ impl DatabentoDataLoader { include_trades: Option, ) -> PyResult { let iter = self - .read_records::(filepath, instrument_id, include_trades.unwrap_or(false)) + .read_records::(&filepath, instrument_id, include_trades.unwrap_or(false)) .map_err(to_pyvalue_err)?; exhaust_data_iter_to_pycapsule(py, iter).map_err(to_pyvalue_err) @@ -126,7 +126,7 @@ impl DatabentoDataLoader { instrument_id: Option, ) -> PyResult> { Ok(self - .load_order_book_depth10(filepath, instrument_id) + .load_order_book_depth10(&filepath, instrument_id) .map_err(to_pyvalue_err)?) } @@ -138,7 +138,7 @@ impl DatabentoDataLoader { instrument_id: Option, ) -> PyResult { let iter = self - .read_records::(filepath, instrument_id, false) + .read_records::(&filepath, instrument_id, false) .map_err(to_pyvalue_err)?; exhaust_data_iter_to_pycapsule(py, iter).map_err(to_pyvalue_err) @@ -151,7 +151,7 @@ impl DatabentoDataLoader { instrument_id: Option, ) -> PyResult> { Ok(self - .load_quotes(filepath, instrument_id) + .load_quotes(&filepath, instrument_id) .map_err(to_pyvalue_err)?) } @@ -164,7 +164,7 @@ impl DatabentoDataLoader { include_trades: Option, ) -> PyResult { let iter = self - .read_records::(filepath, instrument_id, include_trades.unwrap_or(false)) + .read_records::(&filepath, instrument_id, include_trades.unwrap_or(false)) .map_err(to_pyvalue_err)?; exhaust_data_iter_to_pycapsule(py, iter).map_err(to_pyvalue_err) @@ -177,7 +177,7 @@ impl DatabentoDataLoader { instrument_id: Option, ) -> PyResult> { Ok(self - .load_bbo_quotes(filepath, instrument_id) + .load_bbo_quotes(&filepath, instrument_id) .map_err(to_pyvalue_err)?) } @@ -189,7 +189,7 @@ impl DatabentoDataLoader { instrument_id: Option, ) -> PyResult { let iter = self - .read_records::(filepath, instrument_id, false) + .read_records::(&filepath, instrument_id, false) .map_err(to_pyvalue_err)?; exhaust_data_iter_to_pycapsule(py, iter).map_err(to_pyvalue_err) @@ -202,7 +202,7 @@ impl DatabentoDataLoader { instrument_id: Option, ) -> PyResult> { Ok(self - .load_tbbo_trades(filepath, instrument_id) + .load_tbbo_trades(&filepath, instrument_id) .map_err(to_pyvalue_err)?) } @@ -214,7 +214,7 @@ impl DatabentoDataLoader { instrument_id: Option, ) -> PyResult { let iter = self - .read_records::(filepath, instrument_id, false) + .read_records::(&filepath, instrument_id, false) .map_err(to_pyvalue_err)?; exhaust_data_iter_to_pycapsule(py, iter).map_err(to_pyvalue_err) @@ -227,7 +227,7 @@ impl DatabentoDataLoader { instrument_id: Option, ) -> PyResult> { Ok(self - .load_trades(filepath, instrument_id) + .load_trades(&filepath, instrument_id) .map_err(to_pyvalue_err)?) } @@ -239,7 +239,7 @@ impl DatabentoDataLoader { instrument_id: Option, ) -> PyResult { let iter = self - .read_records::(filepath, instrument_id, false) + .read_records::(&filepath, instrument_id, false) .map_err(to_pyvalue_err)?; exhaust_data_iter_to_pycapsule(py, iter).map_err(to_pyvalue_err) @@ -252,7 +252,7 @@ impl DatabentoDataLoader { instrument_id: Option, ) -> PyResult> { Ok(self - .load_bars(filepath, instrument_id) + .load_bars(&filepath, instrument_id) .map_err(to_pyvalue_err)?) } @@ -264,7 +264,7 @@ impl DatabentoDataLoader { instrument_id: Option, ) -> PyResult { let iter = self - .read_records::(filepath, instrument_id, false) + .read_records::(&filepath, instrument_id, false) .map_err(to_pyvalue_err)?; exhaust_data_iter_to_pycapsule(py, iter).map_err(to_pyvalue_err) @@ -277,7 +277,7 @@ impl DatabentoDataLoader { instrument_id: Option, ) -> PyResult> { let iter = self - .read_status_records::(filepath, instrument_id) + .load_status_records::(&filepath, instrument_id) .map_err(to_pyvalue_err)?; let mut data = Vec::new(); @@ -298,7 +298,7 @@ impl DatabentoDataLoader { instrument_id: Option, ) -> PyResult> { let iter = self - .read_imbalance_records::(filepath, instrument_id) + .read_imbalance_records::(&filepath, instrument_id) .map_err(to_pyvalue_err)?; let mut data = Vec::new(); @@ -319,7 +319,7 @@ impl DatabentoDataLoader { instrument_id: Option, ) -> PyResult> { let iter = self - .read_statistics_records::(filepath, instrument_id) + .read_statistics_records::(&filepath, instrument_id) .map_err(to_pyvalue_err)?; let mut data = Vec::new(); From fd37cb71a363efaeeaeb7d1f5ee3b513a21a32dd Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 15:03:47 +1100 Subject: [PATCH 058/224] Improve usability of OrderBookDepth10 --- RELEASES.md | 1 + nautilus_trader/model/data.pyx | 33 ++++++++++--------- nautilus_trader/test_kit/stubs/data.py | 9 ++--- tests/unit_tests/model/test_orderbook_data.py | 22 +++++++++++++ 4 files changed, 45 insertions(+), 20 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index f421479988df..d30c66806ea1 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -7,6 +7,7 @@ Released on TBD (UTC). - Added support for `bbo-1s` and `bbo-1m` quote schemas for Databento adapter (#1990), thanks @faysou - Added validation for venue `book_type` configuration vs data (prevents an issue where top-of-book data is used when order book data is expected) - Added `compute_effective_deltas` config setting for `PolymarketDataClientConfig`, reducing snapshot size (`False` by default to maintain current behavior) +- Improved usability of `OrderBookDepth10` by filling partial levels with null orders and zero counts - Refined `DatabentoInstrumentProvider` handling of large bulks of instrument definitions (improved parent symbol support) - Standardized Betfair symbology to use hyphens instead of periods (prevents Betfair symbols being treated as composite) - Integration guide docs fixes (#1991), thanks @FarukhS52 diff --git a/nautilus_trader/model/data.pyx b/nautilus_trader/model/data.pyx index ec420e9657c0..9392381f27c7 100644 --- a/nautilus_trader/model/data.pyx +++ b/nautilus_trader/model/data.pyx @@ -29,6 +29,7 @@ from cpython.pycapsule cimport PyCapsule_New from libc.stdint cimport uint8_t from libc.stdint cimport uint32_t from libc.stdint cimport uint64_t +from libc.stdint cimport uintptr_t from nautilus_trader.core.correctness cimport Condition from nautilus_trader.core.data cimport Data @@ -2774,17 +2775,9 @@ cdef class OrderBookDepth10(Data): Raises ------ ValueError - If `bids` is empty. + If `bids`, `asks`, `bid_counts`, `ask_counts` lengths are greater than 10. ValueError - If `asks` is empty. - ValueError - If `bids` length is not equal to 10. - ValueError - If `asks` length is not equal to 10. - ValueError - If `bid_counts` length is not equal to 10. - ValueError - If `ask_counts` length is not equal to 10. + If `bids`, `asks`, `bid_counts`, `ask_counts` lengths are not equal. """ @@ -2800,12 +2793,20 @@ cdef class OrderBookDepth10(Data): uint64_t ts_event, uint64_t ts_init, ) -> None: - Condition.not_empty(bids, "bids") - Condition.not_empty(asks, "asks") - Condition.is_true(len(bids) == DEPTH10_LEN, f"`bids` length != 10, was {len(bids)}") - Condition.is_true(len(asks) == DEPTH10_LEN, f"`asks` length != 10, was {len(asks)}") - Condition.is_true(len(bid_counts) == DEPTH10_LEN, f"`bid_counts` length != 10, was {len(bid_counts)}") - Condition.is_true(len(ask_counts) == DEPTH10_LEN, f"`ask_counts` length != 10, was {len(ask_counts)}") + cdef uint32_t bids_len = len(bids) + cdef uint32_t asks_len = len(asks) + Condition.is_true(bids_len <= 10, f"bids length greater than maximum 10, was {bids_len}") + Condition.is_true(asks_len <= 10, f"asks length greater than maximum 10, was {asks_len}") + Condition.equal(bids_len, asks_len, "bids length", "asks length") + Condition.equal(bids_len, len(bid_counts), "len(bids)", "len(bid_counts)") + Condition.equal(asks_len, len(ask_counts), "len(asks)", "len(ask_counts)") + + if bids_len < 10: + # Fill remaining levels with with null orders and zero counts + bids.extend([NULL_ORDER] * (10 - bids_len)) + asks.extend([NULL_ORDER] * (10 - asks_len)) + bid_counts.extend([0] * (10 - bids_len)) + ask_counts.extend([0] * (10 - asks_len)) # Create temporary arrays to copy data to Rust cdef BookOrder_t *bids_array = PyMem_Malloc(DEPTH10_LEN * sizeof(BookOrder_t)) diff --git a/nautilus_trader/test_kit/stubs/data.py b/nautilus_trader/test_kit/stubs/data.py index 9e04a46de81d..7e36b7fc48f1 100644 --- a/nautilus_trader/test_kit/stubs/data.py +++ b/nautilus_trader/test_kit/stubs/data.py @@ -358,6 +358,7 @@ def order_book_depth10( sequence: int = 0, ts_event: int = 0, ts_init: int = 0, + levels: int = 10, ) -> OrderBookDepth10: bids: list[BookOrder] = [] asks: list[BookOrder] = [] @@ -367,7 +368,7 @@ def order_book_depth10( quantity = 100.0 order_id = 1 - for _ in range(10): + for _ in range(levels): order = BookOrder( OrderSide.BUY, Price(price, 2), @@ -386,7 +387,7 @@ def order_book_depth10( quantity = 100.0 order_id = 11 - for _ in range(10): + for _ in range(levels): order = BookOrder( OrderSide.SELL, Price(price, 2), @@ -400,8 +401,8 @@ def order_book_depth10( quantity += 100.0 order_id += 1 - bid_counts = [1] * 10 - ask_counts = [1] * 10 + bid_counts = [1] * levels + ask_counts = [1] * levels return OrderBookDepth10( instrument_id=instrument_id or TestIdStubs.aapl_xnas_id(), diff --git a/tests/unit_tests/model/test_orderbook_data.py b/tests/unit_tests/model/test_orderbook_data.py index 09810abfa675..e33d31567bd6 100644 --- a/tests/unit_tests/model/test_orderbook_data.py +++ b/tests/unit_tests/model/test_orderbook_data.py @@ -702,6 +702,28 @@ def test_depth10_new() -> None: assert depth.ts_init == 3 +def test_depth10_partial_levels() -> None: + # Arrange, Act + instrument_id = TestIdStubs.aapl_xnas_id() + depth = TestDataStubs.order_book_depth10( + instrument_id=instrument_id, + flags=0, + sequence=1, + ts_event=2, + ts_init=3, + levels=3, + ) + + # Assert + assert depth.instrument_id == instrument_id + assert len(depth.bids) == 10 + assert len(depth.asks) == 10 + assert depth.flags == 0 + assert depth.sequence == 1 + assert depth.ts_event == 2 + assert depth.ts_init == 3 + + def test_depth10_pickle_round_trip() -> None: # Arrange depth = TestDataStubs.order_book_depth10() From feb7fd62fc3ddab26097dea198f48df26ea935ec Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 15:46:18 +1100 Subject: [PATCH 059/224] Refine data docs --- docs/concepts/data.md | 75 ++++++++++++++----- .../model/src/instruments/binary_option.rs | 1 + .../model/src/instruments/crypto_future.rs | 1 + .../model/src/instruments/crypto_perpetual.rs | 1 + .../model/src/instruments/currency_pair.rs | 1 + nautilus_core/model/src/instruments/equity.rs | 1 + .../model/src/instruments/futures_contract.rs | 1 + .../model/src/instruments/futures_spread.rs | 1 + .../model/src/instruments/options_contract.rs | 1 + .../model/src/instruments/options_spread.rs | 1 + .../model/instruments/crypto_future.pyx | 2 +- .../model/instruments/crypto_perpetual.pyx | 3 +- nautilus_trader/model/instruments/equity.pyx | 2 +- nautilus_trader/model/instruments/index.pyx | 4 +- 14 files changed, 69 insertions(+), 26 deletions(-) diff --git a/docs/concepts/data.md b/docs/concepts/data.md index 7a0a52fa003e..52bd95c7e9cd 100644 --- a/docs/concepts/data.md +++ b/docs/concepts/data.md @@ -1,22 +1,49 @@ # Data -The NautilusTrader platform provides a set of built-in data types specifically designed to represent a trading domain. These data types include: +The NautilusTrader platform provides a set of built-in data types specifically designed to represent a trading domain. +These data types include: - `OrderBookDelta` (L1/L2/L3): Represents the most granular order book updates. - `OrderBookDeltas` (L1/L2/L3): Batches multiple order book deltas for more efficient processing. -- `OrderBookDepth10`: Aggregated order book snapshot (10 levels per bid and ask side). +- `OrderBookDepth10`: Aggregated order book snapshot (up to 10 levels per bid and ask side). - `QuoteTick`: Represents the best bid and ask prices along with their sizes at the top-of-book. - `TradeTick`: A single trade/match event between counterparties. -- `Bar`: OHLCV (Open, High, Low, Close, Volume) bar data, aggregated using a specified *aggregation method*. -- `Instrument`: A common instrument definition. +- `Bar`: OHLCV (Open, High, Low, Close, Volume) bar/candle, aggregated using a specified *aggregation method*. - `InstrumentStatus`: An instrument level status event. - `InstrumentClose`: An instrument closing price. -Each of these data types defines two fields that are critical for accurate data handling: +## Timestamps + +Each of these data types defines two timestamp fields: + - `ts_event`: UNIX timestamp (nanoseconds) representing when the data event occurred. - `ts_init`: UNIX timestamp (nanoseconds) marking when the object was initialized. -These timestamps ensure proper data ordering, which is crucial for backtesting and enhances analytics. +For backtesting, data is ordered by `ts_init` using a stable sort. For persisted data, the `ts_init` field indicates when the message was originally received. + +The `ts_event` timestamp enhances analytics by enabling some latency analysis. Relative latency can be measured as the difference between `ts_init` and `ts_event`, +though it's important to remember that the clocks producing these timestamps are likely not synchronized. + +## Instruments + +The following instrument definitions are available: + +- `Betting`: Represents an instrument in a betting market. +- `BinaryOption`: Represents a generic binary option instrument. +- `Cfd`: Represents a Contract for Difference (CFD) instrument. +- `Commodity`: Represents a commodity instrument in a spot/cash market. +- `CryptoFuture`: Represents a deliverable futures contract instrument, with crypto assets as underlying and for settlement. +- `CryptoPerpetual`: Represents a crypto perpetual futures contract instrument (a.k.a. perpetual swap). +- `CurrencyPair`: Represents a generic currency pair instrument in a spot/cash market. +- `Equity`: Represents a generic equity instrument. +- `FuturesContract`: Represents a generic deliverable futures contract instrument. +- `FuturesSpread`: Represents a generic deliverable futures spread instrument. +- `Index`: Represents a generic index instrument. +- `OptionsContract`: Represents a generic options contract instrument. +- `OptionsSpread`: Represents a generic options spread instrument. +- `Synthetic`: Represents a synthetic instrument with prices derived from component instruments using a formula. + +## Data flow The platform ensures consistency by flowing data through the same pathways across all system [environment contexts](/concepts/architecture.md#environment-contexts) (e.g., `backtest`, `sandbox`, `live`). Data is primarily transported via the `MessageBus` to the `DataEngine` and then distributed to subscribed or registered handlers. @@ -26,9 +53,10 @@ For users who need more flexibility, the platform also supports the creation of ## Loading data NautilusTrader facilitates data loading and conversion for three main use cases: -- Populating the `BacktestEngine` directly to run backtests -- Persisting the Nautilus-specific Parquet format for the data catalog via `ParquetDataCatalog.write_data(...)` to be later used with a `BacktestNode` -- For research purposes (to ensure data is consistent between research and backtesting) + +- Providing data for a `BacktestEngine` to run backtests. +- Persisting the Nautilus-specific Parquet format for the data catalog via `ParquetDataCatalog.write_data(...)` to be later used with a `BacktestNode`. +- For research purposes (to ensure data is consistent between research and backtesting). Regardless of the destination, the process remains the same: converting diverse external data formats into Nautilus data structures. @@ -45,6 +73,7 @@ an entirely different format to [Databento Binary Encoding (DBN)](https://databe Data wranglers are implemented per specific Nautilus data type, and can be found in the `nautilus_trader.persistence.wranglers` module. Currently there exists: + - `OrderBookDeltaDataWrangler` - `QuoteTickDataWrangler` - `TradeTickDataWrangler` @@ -61,12 +90,13 @@ of the Nautilus core, currently in development. ### Transformation pipeline **Process flow**: -1. Raw data (e.g., CSV) is input into the pipeline -2. DataLoader processes the raw data and converts it into a `pd.DataFrame` -3. DataWrangler further processes the `pd.DataFrame` to generate a list of Nautilus objects -4. The Nautilus `list[Data]` is the output of the data loading process -This diagram illustrates how raw data is transformed into Nautilus data structures. +1. Raw data (e.g., CSV) is input into the pipeline. +2. DataLoader processes the raw data and converts it into a `pd.DataFrame`. +3. DataWrangler further processes the `pd.DataFrame` to generate a list of Nautilus objects. +4. The Nautilus `list[Data]` is the output of the data loading process. + +The following diagram illustrates how raw data is transformed into Nautilus data structures: ``` ┌──────────┐ ┌──────────────────────┐ ┌──────────────────────┐ │ │ │ │ │ │ @@ -81,8 +111,9 @@ This diagram illustrates how raw data is transformed into Nautilus data structur ``` Conceretely, this would involve: -- `BinanceOrderBookDeltaDataLoader.load(...)` which reads CSV files provided by Binance from disk, and returns a `pd.DataFrame` -- `OrderBookDeltaDataWrangler.process(...)` which takes the `pd.DataFrame` and returns `list[OrderBookDelta]` + +- `BinanceOrderBookDeltaDataLoader.load(...)` which reads CSV files provided by Binance from disk, and returns a `pd.DataFrame`. +- `OrderBookDeltaDataWrangler.process(...)` which takes the `pd.DataFrame` and returns `list[OrderBookDelta]`. The following example shows how to accomplish the above in Python: ```python @@ -109,9 +140,10 @@ deltas = wrangler.process(df) The data catalog is a central store for Nautilus data, persisted in the [Parquet](https://parquet.apache.org) file format. We have chosen Parquet as the storage format for the following reasons: -- It performs much better than CSV/JSON/HDF5/etc in terms of compression ratio (storage size) and read performance -- It does not require any separate running components (for example a database) -- It is quick and simple to get up and running with + +- It performs much better than CSV/JSON/HDF5/etc in terms of compression ratio (storage size) and read performance. +- It does not require any separate running components (for example a database). +- It is quick and simple to get up and running with. The Arrow schemas used for the Parquet format are either single sourced in the core `persistence` Rust crate, or available from the `/serialization/arrow/schema.py` module. @@ -142,7 +174,8 @@ catalog = ParquetDataCatalog(CATALOG_PATH) New data can be stored in the catalog, which is effectively writing the given data to disk in the Nautilus-specific Parquet format. All Nautilus built-in `Data` objects are supported, and any data which inherits from `Data` can be written. -The following example shows the above list of Binance `OrderBookDelta` objects being written. +The following example shows the above list of Binance `OrderBookDelta` objects being written: + ```python catalog.write_data(deltas) ``` @@ -170,6 +203,7 @@ generates unique filenames for different data sets. ::: Rust Arrow schema implementations are available for the follow data types (enhanced performance): + - `OrderBookDelta` - `QuoteTick` - `TradeTick` @@ -193,6 +227,7 @@ deltas = catalog.order_book_deltas(instrument_ids=[instrument.id.value], start=s When running backtests in streaming mode with a `BacktestNode`, the data catalog can be used to stream the data in batches. The following example shows how to achieve this by initializing a `BacktestDataConfig` configuration object: + ```python from nautilus_trader.config import BacktestDataConfig from nautilus_trader.model.data import OrderBookDelta diff --git a/nautilus_core/model/src/instruments/binary_option.rs b/nautilus_core/model/src/instruments/binary_option.rs index 64da6cad75dd..7ca2a023f08b 100644 --- a/nautilus_core/model/src/instruments/binary_option.rs +++ b/nautilus_core/model/src/instruments/binary_option.rs @@ -30,6 +30,7 @@ use crate::{ types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, }; +/// Represents a generic binary option instrument. #[repr(C)] #[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr( diff --git a/nautilus_core/model/src/instruments/crypto_future.rs b/nautilus_core/model/src/instruments/crypto_future.rs index 2935c27ad138..9da18d44a31e 100644 --- a/nautilus_core/model/src/instruments/crypto_future.rs +++ b/nautilus_core/model/src/instruments/crypto_future.rs @@ -30,6 +30,7 @@ use crate::{ types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, }; +/// Represents a deliverable futures contract instrument, with crypto assets as underlying and for settlement. #[repr(C)] #[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr( diff --git a/nautilus_core/model/src/instruments/crypto_perpetual.rs b/nautilus_core/model/src/instruments/crypto_perpetual.rs index b75b1ebfa39a..112318c43dcc 100644 --- a/nautilus_core/model/src/instruments/crypto_perpetual.rs +++ b/nautilus_core/model/src/instruments/crypto_perpetual.rs @@ -31,6 +31,7 @@ use crate::{ types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, }; +/// Represents a crypto perpetual futures contract instrument (a.k.a. perpetual swap). #[repr(C)] #[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr( diff --git a/nautilus_core/model/src/instruments/currency_pair.rs b/nautilus_core/model/src/instruments/currency_pair.rs index 133ccf7d387e..d8da23620994 100644 --- a/nautilus_core/model/src/instruments/currency_pair.rs +++ b/nautilus_core/model/src/instruments/currency_pair.rs @@ -30,6 +30,7 @@ use crate::{ types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, }; +/// Represents a generic currency pair instrument in a spot/cash market. #[repr(C)] #[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr( diff --git a/nautilus_core/model/src/instruments/equity.rs b/nautilus_core/model/src/instruments/equity.rs index 48efaceece31..8d4e7b87f09a 100644 --- a/nautilus_core/model/src/instruments/equity.rs +++ b/nautilus_core/model/src/instruments/equity.rs @@ -30,6 +30,7 @@ use crate::{ types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, }; +/// Represents a generic equity instrument. #[repr(C)] #[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr( diff --git a/nautilus_core/model/src/instruments/futures_contract.rs b/nautilus_core/model/src/instruments/futures_contract.rs index 44aed80fcf5e..1a6660d9a35b 100644 --- a/nautilus_core/model/src/instruments/futures_contract.rs +++ b/nautilus_core/model/src/instruments/futures_contract.rs @@ -32,6 +32,7 @@ use crate::{ types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, }; +/// Represents a generic deliverable futures contract instrument. #[repr(C)] #[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr( diff --git a/nautilus_core/model/src/instruments/futures_spread.rs b/nautilus_core/model/src/instruments/futures_spread.rs index a97d073810fa..4c93379a5db7 100644 --- a/nautilus_core/model/src/instruments/futures_spread.rs +++ b/nautilus_core/model/src/instruments/futures_spread.rs @@ -32,6 +32,7 @@ use crate::{ types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, }; +/// Represents a generic deliverable futures spread instrument. #[repr(C)] #[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr( diff --git a/nautilus_core/model/src/instruments/options_contract.rs b/nautilus_core/model/src/instruments/options_contract.rs index fdcde47b3448..2d81333f9e24 100644 --- a/nautilus_core/model/src/instruments/options_contract.rs +++ b/nautilus_core/model/src/instruments/options_contract.rs @@ -32,6 +32,7 @@ use crate::{ types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, }; +/// Represents a generic options contract instrument. #[repr(C)] #[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr( diff --git a/nautilus_core/model/src/instruments/options_spread.rs b/nautilus_core/model/src/instruments/options_spread.rs index d53afca9f257..a6322cfd3baa 100644 --- a/nautilus_core/model/src/instruments/options_spread.rs +++ b/nautilus_core/model/src/instruments/options_spread.rs @@ -32,6 +32,7 @@ use crate::{ types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, }; +/// Represents a generic options spread instrument. #[repr(C)] #[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr( diff --git a/nautilus_trader/model/instruments/crypto_future.pyx b/nautilus_trader/model/instruments/crypto_future.pyx index 5029bab53756..86c8bc2241b3 100644 --- a/nautilus_trader/model/instruments/crypto_future.pyx +++ b/nautilus_trader/model/instruments/crypto_future.pyx @@ -34,7 +34,7 @@ from nautilus_trader.model.objects cimport Quantity cdef class CryptoFuture(Instrument): """ - Represents a `Deliverable Futures Contract` instrument, with crypto assets + Represents a deliverable futures contract instrument, with crypto assets as underlying and for settlement. Parameters diff --git a/nautilus_trader/model/instruments/crypto_perpetual.pyx b/nautilus_trader/model/instruments/crypto_perpetual.pyx index 731bd64c94f1..efd136937482 100644 --- a/nautilus_trader/model/instruments/crypto_perpetual.pyx +++ b/nautilus_trader/model/instruments/crypto_perpetual.pyx @@ -31,8 +31,7 @@ from nautilus_trader.model.objects cimport Quantity cdef class CryptoPerpetual(Instrument): """ - Represents a Crypto `Perpetual Futures` contract instrument (a.k.a. `Perpetual - Swap`). + Represents a crypto perpetual futures contract instrument (a.k.a. perpetual swap). Parameters ---------- diff --git a/nautilus_trader/model/instruments/equity.pyx b/nautilus_trader/model/instruments/equity.pyx index fadfce11cea2..326ab3e3a708 100644 --- a/nautilus_trader/model/instruments/equity.pyx +++ b/nautilus_trader/model/instruments/equity.pyx @@ -30,7 +30,7 @@ from nautilus_trader.model.objects cimport Quantity cdef class Equity(Instrument): """ - Represents a generic Equity instrument. + Represents a generic equity instrument. Parameters ---------- diff --git a/nautilus_trader/model/instruments/index.pyx b/nautilus_trader/model/instruments/index.pyx index 69fad8074d56..9d8830a6fbaa 100644 --- a/nautilus_trader/model/instruments/index.pyx +++ b/nautilus_trader/model/instruments/index.pyx @@ -29,9 +29,9 @@ from nautilus_trader.model.objects cimport Quantity cdef class IndexInstrument(Instrument): """ - Represents a generic Index instrument. + Represents a generic index instrument. - This instrument is not tradable. + This instrument is *typically* not tradable. Parameters ---------- From f96374545e607f03cb81d43b72a9d880eda1345d Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 08:08:52 +1100 Subject: [PATCH 060/224] Fix markdown heading --- docs/integrations/betfair.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations/betfair.md b/docs/integrations/betfair.md index da47f6fb2447..24ff57613f04 100644 --- a/docs/integrations/betfair.md +++ b/docs/integrations/betfair.md @@ -41,7 +41,7 @@ You can do this through the [Accounts API Demo Tool](https://apps.betfair.com/vi See also the [Betfair Getting Started - Application Keys](https://betfair-developer-docs.atlassian.net/wiki/spaces/1smk3cen4v3lu3yomq5qye0ni/pages/2687105/Application+Keys) guide. ::: -### API credentials +## API credentials There are two options for supplying your credentials to the Betfair clients. Either pass the corresponding values to the config dictionaries, or From 2172fdfbcfb1663beb7ba8278337727570f42cf6 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 12:01:54 +1100 Subject: [PATCH 061/224] Add Tardis CSV reader --- nautilus_core/Cargo.lock | 3 + nautilus_core/Cargo.toml | 1 + nautilus_core/adapters/Cargo.toml | 5 +- nautilus_core/adapters/src/tardis/mod.rs | 4 + nautilus_core/adapters/src/tardis/parse.rs | 130 ++++++++++++++ nautilus_core/adapters/src/tardis/read.rs | 188 ++++++++++++++++++++ nautilus_core/adapters/src/tardis/record.rs | 58 ++++++ tests/test_data/large/checksums.json | 4 +- 8 files changed, 391 insertions(+), 2 deletions(-) create mode 100644 nautilus_core/adapters/src/tardis/parse.rs create mode 100644 nautilus_core/adapters/src/tardis/read.rs create mode 100644 nautilus_core/adapters/src/tardis/record.rs diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 3607c4f1e92d..15a8bab888b9 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -2678,14 +2678,17 @@ dependencies = [ "base64", "chrono", "criterion", + "csv", "databento", "fallible-streaming-iterator", + "flate2", "hex", "indexmap", "itoa", "nautilus-common", "nautilus-core", "nautilus-model", + "nautilus-test-kit", "pem", "pyo3", "pyo3-asyncio-0-21", diff --git a/nautilus_core/Cargo.toml b/nautilus_core/Cargo.toml index c7592f6a678a..720c5502e650 100644 --- a/nautilus_core/Cargo.toml +++ b/nautilus_core/Cargo.toml @@ -28,6 +28,7 @@ documentation = "https://nautilustrader.io/docs" [workspace.dependencies] anyhow = "1.0.89" +base64 = "0.22.1" bytes = { version = "1.7.2", features = ["serde"] } chrono = "0.4.38" derive_builder = "0.20.2" diff --git a/nautilus_core/adapters/Cargo.toml b/nautilus_core/adapters/Cargo.toml index 5a7ef2056d3c..6f1d0413e00f 100644 --- a/nautilus_core/adapters/Cargo.toml +++ b/nautilus_core/adapters/Cargo.toml @@ -19,6 +19,7 @@ nautilus-common = { path = "../common" } nautilus-core = { path = "../core" } nautilus-model = { path = "../model", features = ["stubs"] } anyhow = { workspace = true } +base64 = { workspace = true } chrono = { workspace = true } hex = { workspace = true } indexmap = { workspace = true } @@ -37,12 +38,14 @@ tracing = { workspace = true } thiserror = { workspace = true } ustr = { workspace = true } databento = { version = "0.14.1", optional = true } +csv = "1.3.0" fallible-streaming-iterator = "0.1.9" -base64 = "0.22.1" +flate2 = "1.0.34" pem = "3.0.4" time = "0.3.36" [dev-dependencies] +nautilus-test-kit = { path = "../test_kit" } criterion = { workspace = true } rstest = { workspace = true } diff --git a/nautilus_core/adapters/src/tardis/mod.rs b/nautilus_core/adapters/src/tardis/mod.rs index 76673eca4553..cceddf81e575 100644 --- a/nautilus_core/adapters/src/tardis/mod.rs +++ b/nautilus_core/adapters/src/tardis/mod.rs @@ -15,5 +15,9 @@ //! The [Tardis](https://tardis.dev) integration adapter. +pub mod parse; +pub mod read; +pub mod record; + #[cfg(feature = "python")] pub mod python; diff --git a/nautilus_core/adapters/src/tardis/parse.rs b/nautilus_core/adapters/src/tardis/parse.rs new file mode 100644 index 000000000000..932094d4bca0 --- /dev/null +++ b/nautilus_core/adapters/src/tardis/parse.rs @@ -0,0 +1,130 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use std::str::FromStr; + +use nautilus_core::{datetime::NANOSECONDS_IN_MICROSECOND, nanos::UnixNanos}; +use nautilus_model::{ + enums::{AggressorSide, BookAction, OrderSide}, + identifiers::InstrumentId, +}; + +/// Parse an instrument ID from the given venue and symbol values. +pub fn parse_instrument_id(exchange: &str, symbol: &str) -> InstrumentId { + let venue = exchange.split('-').next().unwrap_or(exchange); + InstrumentId::from_str(&format!("{}.{}", symbol, venue)) + .expect("Failed to parse `instrument_id`") +} + +/// Parse an order side from the given string. +pub fn parse_order_side(value: &str) -> OrderSide { + match value { + "bid" => OrderSide::Buy, + "ask" => OrderSide::Sell, + _ => OrderSide::NoOrderSide, + } +} + +/// Parse an aggressor side from the given string. +pub fn parse_aggressor_side(value: &str) -> AggressorSide { + match value { + "buy" => AggressorSide::Buyer, + "sell" => AggressorSide::Seller, + _ => AggressorSide::NoAggressor, + } +} + +/// Parse a Tardis timestamp in UNIX microseconds to UNIX nanoseconds. +pub fn parse_timestamp(value: u64) -> UnixNanos { + UnixNanos::from(value * NANOSECONDS_IN_MICROSECOND) +} + +/// Parse book action inferred from the given values. +pub fn parse_book_action(is_snapshot: bool, amount: f64) -> BookAction { + if is_snapshot { + BookAction::Add + } else if amount == 0.0 { + BookAction::Delete + } else { + BookAction::Update + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Tests +//////////////////////////////////////////////////////////////////////////////// +#[cfg(test)] +mod tests { + use nautilus_model::enums::AggressorSide; + use rstest::rstest; + + use super::*; + + #[rstest] + #[case("okex-futures", "BTC-USD-200313", "BTC-USD-200313.okex")] + #[case("binance", "ETH-USDT", "ETH-USDT.binance")] + #[case("bitmex-perp", "XBTUSD", "XBTUSD.bitmex")] + #[case("exchange-with-hyphen", "FOO-BAR", "FOO-BAR.exchange")] + fn test_parse_instrument_id( + #[case] exchange: &str, + #[case] symbol: &str, + #[case] expected: &str, + ) { + let instrument_id = parse_instrument_id(exchange, symbol); + let expected_instrument_id = InstrumentId::from_str(expected).unwrap(); + assert_eq!(instrument_id, expected_instrument_id); + } + + #[rstest] + #[case("bid", OrderSide::Buy)] + #[case("ask", OrderSide::Sell)] + #[case("unknown", OrderSide::NoOrderSide)] + #[case("", OrderSide::NoOrderSide)] + #[case("random", OrderSide::NoOrderSide)] + fn test_parse_order_side(#[case] input: &str, #[case] expected: OrderSide) { + assert_eq!(parse_order_side(input), expected); + } + + #[rstest] + #[case("buy", AggressorSide::Buyer)] + #[case("sell", AggressorSide::Seller)] + #[case("unknown", AggressorSide::NoAggressor)] + #[case("", AggressorSide::NoAggressor)] + #[case("random", AggressorSide::NoAggressor)] + fn test_parse_aggressor_side(#[case] input: &str, #[case] expected: AggressorSide) { + assert_eq!(parse_aggressor_side(input), expected); + } + + #[rstest] + fn test_parse_timestamp() { + let input_timestamp: u64 = 1583020803145000; + let expected_nanos: UnixNanos = + UnixNanos::from(input_timestamp * NANOSECONDS_IN_MICROSECOND); + + assert_eq!(parse_timestamp(input_timestamp), expected_nanos); + } + + #[rstest] + #[case(true, 10.0, BookAction::Add)] + #[case(false, 0.0, BookAction::Delete)] + #[case(false, 10.0, BookAction::Update)] + fn test_parse_book_action( + #[case] is_snapshot: bool, + #[case] amount: f64, + #[case] expected: BookAction, + ) { + assert_eq!(parse_book_action(is_snapshot, amount), expected); + } +} diff --git a/nautilus_core/adapters/src/tardis/read.rs b/nautilus_core/adapters/src/tardis/read.rs new file mode 100644 index 000000000000..1ec93ca7cf6a --- /dev/null +++ b/nautilus_core/adapters/src/tardis/read.rs @@ -0,0 +1,188 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use std::{error::Error, fs::File, io::BufReader, path::Path}; + +use csv::{Reader, ReaderBuilder}; +use flate2::read::GzDecoder; +use nautilus_core::nanos::UnixNanos; +use nautilus_model::{ + data::{delta::OrderBookDelta, order::BookOrder, trade::TradeTick}, + enums::RecordFlag, + identifiers::TradeId, + types::{price::Price, quantity::Quantity}, +}; + +use super::{ + parse::{ + parse_aggressor_side, parse_book_action, parse_instrument_id, parse_order_side, + parse_timestamp, + }, + record::{TardisBookUpdateRecord, TardisTradeRecord}, +}; + +/// Creates a new CSV reader which can handle gzip compression. +pub fn create_csv_reader>( + filepath: P, +) -> anyhow::Result>> { + let file = File::open(filepath.as_ref())?; + let buf_reader = BufReader::new(file); + + // Determine if the file is gzipped by its extension + let reader: Box = + if filepath.as_ref().extension().unwrap_or_default() == "gz" { + Box::new(GzDecoder::new(buf_reader)) // Decompress the gzipped file + } else { + Box::new(buf_reader) // Regular file reader + }; + + Ok(ReaderBuilder::new().has_headers(true).from_reader(reader)) +} + +/// Load [`OrderBookDelta`]s from a Tardis format CSV at the given `filepath`. +pub fn load_deltas>( + filepath: P, + price_precision: u8, + size_precision: u8, +) -> Result, Box> { + let mut csv_reader = create_csv_reader(filepath).expect("Failed to create CSV reader"); + let mut deltas: Vec = Vec::new(); + let mut last_ts_event = UnixNanos::default(); + + for result in csv_reader.deserialize() { + let record: TardisBookUpdateRecord = result?; + + let instrument_id = parse_instrument_id(&record.exchange, &record.symbol); + let side = parse_order_side(&record.side); + let price = Price::new(record.price, price_precision); + let size = Quantity::new(record.amount, size_precision); + let order_id = 0; // Not applicable for L2 data + let order = BookOrder::new(side, price, size, order_id); + + let action = parse_book_action(record.is_snapshot, record.amount); + let flags = 0; // Flags always zero until timestamp changes + let sequence = 0; // Sequence not available + let ts_event = parse_timestamp(record.timestamp); + let ts_init = parse_timestamp(record.local_timestamp); + + // Check if timestamp is different from last timestamp + if last_ts_event != ts_event { + if let Some(last_delta) = deltas.last_mut() { + // Set previous delta flags as F_LAST + last_delta.flags = RecordFlag::F_LAST.value(); + } + } + + last_ts_event = ts_event; + + let delta = OrderBookDelta::new( + instrument_id, + action, + order, + flags, + sequence, + ts_event, + ts_init, + ); + + deltas.push(delta); + } + + // Set F_LAST flag for final delta + if let Some(last_delta) = deltas.last_mut() { + last_delta.flags = RecordFlag::F_LAST.value(); + } + + Ok(deltas) +} + +/// Load [`TradeTick`]s from a Tardis format CSV at the given `filepath`. +pub fn load_trade_ticks>( + filepath: P, + price_precision: u8, + size_precision: u8, +) -> Result, Box> { + let mut csv_reader = create_csv_reader(filepath).expect("Failed to create CSV reader"); + let mut trades = Vec::new(); + + for result in csv_reader.deserialize() { + let record: TardisTradeRecord = result?; + + let instrument_id = parse_instrument_id(&record.exchange, &record.symbol); + let price = Price::new(record.price, price_precision); + let size = Quantity::new(record.amount, size_precision); + let aggressor_side = parse_aggressor_side(&record.side); + let trade_id = TradeId::new(&record.id); + let ts_event = parse_timestamp(record.timestamp); + let ts_init = parse_timestamp(record.local_timestamp); + + let trade = TradeTick::new( + instrument_id, + price, + size, + aggressor_side, + trade_id, + ts_event, + ts_init, + ); + + trades.push(trade); + } + + Ok(trades) +} + +//////////////////////////////////////////////////////////////////////////////// +// Tests +//////////////////////////////////////////////////////////////////////////////// +#[cfg(test)] +mod tests { + use nautilus_test_kit::{ + common::{get_project_testdata_path, get_testdata_large_checksums_filepath}, + files::ensure_file_exists_or_download_http, + }; + use rstest::*; + + use super::*; + + #[ignore] // Currently slow due number of records + #[rstest] + pub fn test_read_deltas() { + let testdata = get_project_testdata_path(); + let checksums = get_testdata_large_checksums_filepath(); + let filename = "tardis_deribit_incremental_book_L2_2020-04-01_BTC-PERPETUAL.csv.gz"; + let filepath = testdata.join("large").join(filename); + let url = "https://datasets.tardis.dev/v1/deribit/incremental_book_L2/2020/04/01/BTC-PERPETUAL.csv.gz"; + ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); + + let deltas = load_deltas(filepath, 1, 0).unwrap(); + + assert_eq!(deltas.len(), 19_239_594) + } + + #[rstest] + pub fn test_read_trades() { + let testdata = get_project_testdata_path(); + let checksums = get_testdata_large_checksums_filepath(); + let filename = "tardis_bitmex_trades_2020-03-01_XBTUSD.csv.gz"; + let filepath = testdata.join("large").join(filename); + let url = "https://datasets.tardis.dev/v1/bitmex/trades/2020/03/01/XBTUSD.csv.gz"; + ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); + + let trades = load_trade_ticks(filepath, 1, 0).unwrap(); + + assert_eq!(trades.len(), 736_828) + } +} diff --git a/nautilus_core/adapters/src/tardis/record.rs b/nautilus_core/adapters/src/tardis/record.rs new file mode 100644 index 000000000000..76a6b5f50d5c --- /dev/null +++ b/nautilus_core/adapters/src/tardis/record.rs @@ -0,0 +1,58 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use serde::Deserialize; + +/// Represents a Tardis format order book update record. +#[derive(Debug, Deserialize)] +pub struct TardisBookUpdateRecord { + /// The exchande ID. + pub exchange: String, + /// The instrument symbol as provided by the exchange. + pub symbol: String, + // UNIX microseconds timestamp provided by the exchange. + pub timestamp: u64, + // UNIX microseconds timestamp of message received. + pub local_timestamp: u64, + /// If update was a part of initial order book snapshot. + pub is_snapshot: bool, + /// The book side the update belongs to. + pub side: String, + /// The price identifying book level being updated. + pub price: f64, + /// The updated price level amount. + pub amount: f64, +} + +/// Represents a Tardis format trade record. +#[derive(Debug, Deserialize)] +pub struct TardisTradeRecord { + /// The exchande ID. + pub exchange: String, + /// The instrument symbol as provided by the exchange. + pub symbol: String, + // UNIX microseconds timestamp provided by the exchange. + pub timestamp: u64, + // UNIX microseconds timestamp of message received. + pub local_timestamp: u64, + /// The trade ID provided by the exchange. + pub id: String, + /// The liquidity taker (aggressor) side provided by the exchange. + pub side: String, + /// The trade price as provided by the exchange. + pub price: f64, + /// The trade amount as provided by the exchange. + pub amount: f64, +} diff --git a/tests/test_data/large/checksums.json b/tests/test_data/large/checksums.json index 4acaf44913e2..9ab7ee21b638 100644 --- a/tests/test_data/large/checksums.json +++ b/tests/test_data/large/checksums.json @@ -1,3 +1,5 @@ { - "databento_mbo_xnas_itch.csv": "sha256:5481466e7776659f7f093b1ca8b05c7e88b8d586036692089cca5decc7965099" + "databento_mbo_xnas_itch.csv": "sha256:5481466e7776659f7f093b1ca8b05c7e88b8d586036692089cca5decc7965099", + "tardis_bitmex_trades_2020-03-01_XBTUSD.csv.gz": "sha256:bafdeba528965322baeb0a01b8c3d6bac73891c5a929713b6a6a2f75361200ab", + "tardis_deribit_incremental_book_L2_2020-04-01_BTC-PERPETUAL.csv.gz": "sha256:a15aa5d6c52adbdc2e3c5593b487106e1a3fc78f151f939b4d86dbcb5f116876" } From 46013abf7b552db350eb28f93a9b1e3a9c56503a Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 16:39:23 +1100 Subject: [PATCH 062/224] Add Tardis CSV reader --- nautilus_core/adapters/src/tardis/read.rs | 88 ++++++++++++++++++--- nautilus_core/adapters/src/tardis/record.rs | 21 +++++ tests/test_data/large/checksums.json | 3 +- 3 files changed, 102 insertions(+), 10 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/read.rs b/nautilus_core/adapters/src/tardis/read.rs index 1ec93ca7cf6a..8d5e84b01092 100644 --- a/nautilus_core/adapters/src/tardis/read.rs +++ b/nautilus_core/adapters/src/tardis/read.rs @@ -19,7 +19,7 @@ use csv::{Reader, ReaderBuilder}; use flate2::read::GzDecoder; use nautilus_core::nanos::UnixNanos; use nautilus_model::{ - data::{delta::OrderBookDelta, order::BookOrder, trade::TradeTick}, + data::{delta::OrderBookDelta, order::BookOrder, quote::QuoteTick, trade::TradeTick}, enums::RecordFlag, identifiers::TradeId, types::{price::Price, quantity::Quantity}, @@ -30,7 +30,7 @@ use super::{ parse_aggressor_side, parse_book_action, parse_instrument_id, parse_order_side, parse_timestamp, }, - record::{TardisBookUpdateRecord, TardisTradeRecord}, + record::{TardisBookUpdateRecord, TardisQuoteRecord, TardisTradeRecord}, }; /// Creates a new CSV reader which can handle gzip compression. @@ -56,8 +56,9 @@ pub fn load_deltas>( filepath: P, price_precision: u8, size_precision: u8, + limit: Option, ) -> Result, Box> { - let mut csv_reader = create_csv_reader(filepath).expect("Failed to create CSV reader"); + let mut csv_reader = create_csv_reader(filepath)?; let mut deltas: Vec = Vec::new(); let mut last_ts_event = UnixNanos::default(); @@ -98,6 +99,12 @@ pub fn load_deltas>( ); deltas.push(delta); + + if let Some(limit) = limit { + if deltas.len() >= limit { + break; + } + } } // Set F_LAST flag for final delta @@ -108,13 +115,57 @@ pub fn load_deltas>( Ok(deltas) } +/// Load [`QuoteTick`]s from a Tardis format CSV at the given `filepath`. +pub fn load_quote_ticks>( + filepath: P, + price_precision: u8, + size_precision: u8, + limit: Option, +) -> Result, Box> { + let mut csv_reader = create_csv_reader(filepath)?; + let mut quotes = Vec::new(); + + for result in csv_reader.deserialize() { + let record: TardisQuoteRecord = result?; + + let instrument_id = parse_instrument_id(&record.exchange, &record.symbol); + let bid_price = Price::new(record.bid_price.unwrap_or(0.0), price_precision); + let bid_size = Quantity::new(record.bid_amount.unwrap_or(0.0), size_precision); + let ask_price = Price::new(record.ask_price.unwrap_or(0.0), price_precision); + let ask_size = Quantity::new(record.ask_amount.unwrap_or(0.0), size_precision); + let ts_event = parse_timestamp(record.timestamp); + let ts_init = parse_timestamp(record.local_timestamp); + + let quote = QuoteTick::new( + instrument_id, + bid_price, + ask_price, + bid_size, + ask_size, + ts_event, + ts_init, + ); + + quotes.push(quote); + + if let Some(limit) = limit { + if quotes.len() >= limit { + break; + } + } + } + + Ok(quotes) +} + /// Load [`TradeTick`]s from a Tardis format CSV at the given `filepath`. pub fn load_trade_ticks>( filepath: P, price_precision: u8, size_precision: u8, + limit: Option, ) -> Result, Box> { - let mut csv_reader = create_csv_reader(filepath).expect("Failed to create CSV reader"); + let mut csv_reader = create_csv_reader(filepath)?; let mut trades = Vec::new(); for result in csv_reader.deserialize() { @@ -139,6 +190,12 @@ pub fn load_trade_ticks>( ); trades.push(trade); + + if let Some(limit) = limit { + if trades.len() >= limit { + break; + } + } } Ok(trades) @@ -157,7 +214,6 @@ mod tests { use super::*; - #[ignore] // Currently slow due number of records #[rstest] pub fn test_read_deltas() { let testdata = get_project_testdata_path(); @@ -167,9 +223,23 @@ mod tests { let url = "https://datasets.tardis.dev/v1/deribit/incremental_book_L2/2020/04/01/BTC-PERPETUAL.csv.gz"; ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); - let deltas = load_deltas(filepath, 1, 0).unwrap(); + let deltas = load_deltas(filepath, 1, 0, Some(1_000)).unwrap(); + + assert_eq!(deltas.len(), 1_000) + } + + #[rstest] + pub fn test_read_quotes() { + let testdata = get_project_testdata_path(); + let checksums = get_testdata_large_checksums_filepath(); + let filename = "tardis_huobi-dm-swap_quotes_2020-05-01_BTC-USD.csv.gz"; + let filepath = testdata.join("large").join(filename); + let url = "https://datasets.tardis.dev/v1/huobi-dm-swap/quotes/2020/05/01/BTC-USD.csv.gz"; + ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); + + let quotes = load_quote_ticks(filepath, 1, 0, Some(1_000)).unwrap(); - assert_eq!(deltas.len(), 19_239_594) + assert_eq!(quotes.len(), 1_000) } #[rstest] @@ -181,8 +251,8 @@ mod tests { let url = "https://datasets.tardis.dev/v1/bitmex/trades/2020/03/01/XBTUSD.csv.gz"; ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); - let trades = load_trade_ticks(filepath, 1, 0).unwrap(); + let trades = load_trade_ticks(filepath, 1, 0, Some(1_000)).unwrap(); - assert_eq!(trades.len(), 736_828) + assert_eq!(trades.len(), 1_000) } } diff --git a/nautilus_core/adapters/src/tardis/record.rs b/nautilus_core/adapters/src/tardis/record.rs index 76a6b5f50d5c..f79f532f1622 100644 --- a/nautilus_core/adapters/src/tardis/record.rs +++ b/nautilus_core/adapters/src/tardis/record.rs @@ -36,6 +36,27 @@ pub struct TardisBookUpdateRecord { pub amount: f64, } +/// Represents a Tardis format quote record. +#[derive(Debug, Deserialize)] +pub struct TardisQuoteRecord { + /// The exchande ID. + pub exchange: String, + /// The instrument symbol as provided by the exchange. + pub symbol: String, + // UNIX microseconds timestamp provided by the exchange. + pub timestamp: u64, + // UNIX microseconds timestamp of message received. + pub local_timestamp: u64, + // The best ask amount as provided by exchange, empty if there aren't any asks. + pub ask_amount: Option, + // The best ask price as provided by exchange, empty if there aren't any asks. + pub ask_price: Option, + // The best bid price as provided by exchange, empty if there aren't any bids. + pub bid_price: Option, + // The best bid amount as provided by exchange, empty if there aren't any bids. + pub bid_amount: Option, +} + /// Represents a Tardis format trade record. #[derive(Debug, Deserialize)] pub struct TardisTradeRecord { diff --git a/tests/test_data/large/checksums.json b/tests/test_data/large/checksums.json index 9ab7ee21b638..2b0cff9457c1 100644 --- a/tests/test_data/large/checksums.json +++ b/tests/test_data/large/checksums.json @@ -1,5 +1,6 @@ { "databento_mbo_xnas_itch.csv": "sha256:5481466e7776659f7f093b1ca8b05c7e88b8d586036692089cca5decc7965099", "tardis_bitmex_trades_2020-03-01_XBTUSD.csv.gz": "sha256:bafdeba528965322baeb0a01b8c3d6bac73891c5a929713b6a6a2f75361200ab", - "tardis_deribit_incremental_book_L2_2020-04-01_BTC-PERPETUAL.csv.gz": "sha256:a15aa5d6c52adbdc2e3c5593b487106e1a3fc78f151f939b4d86dbcb5f116876" + "tardis_deribit_incremental_book_L2_2020-04-01_BTC-PERPETUAL.csv.gz": "sha256:a15aa5d6c52adbdc2e3c5593b487106e1a3fc78f151f939b4d86dbcb5f116876", + "tardis_huobi-dm-swap_quotes_2020-05-01_BTC-USD.csv.gz": "sha256:edd2d2f4491c21dd604c98389f2f94779b05104d684d97f4b3ec148f43cfcd67" } From a21faec8a8a0970e80d336c0d9daca8808510fd0 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 17:34:46 +1100 Subject: [PATCH 063/224] Add Tardis CSV reader --- nautilus_core/adapters/src/tardis/read.rs | 286 +++++++++++++++++++- nautilus_core/adapters/src/tardis/record.rs | 193 ++++++++++++- tests/test_data/large/checksums.json | 2 + 3 files changed, 477 insertions(+), 4 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/read.rs b/nautilus_core/adapters/src/tardis/read.rs index 8d5e84b01092..d0679633b5be 100644 --- a/nautilus_core/adapters/src/tardis/read.rs +++ b/nautilus_core/adapters/src/tardis/read.rs @@ -19,8 +19,14 @@ use csv::{Reader, ReaderBuilder}; use flate2::read::GzDecoder; use nautilus_core::nanos::UnixNanos; use nautilus_model::{ - data::{delta::OrderBookDelta, order::BookOrder, quote::QuoteTick, trade::TradeTick}, - enums::RecordFlag, + data::{ + delta::OrderBookDelta, + depth::{OrderBookDepth10, DEPTH10_LEN}, + order::{BookOrder, NULL_ORDER}, + quote::QuoteTick, + trade::TradeTick, + }, + enums::{OrderSide, RecordFlag}, identifiers::TradeId, types::{price::Price, quantity::Quantity}, }; @@ -30,7 +36,10 @@ use super::{ parse_aggressor_side, parse_book_action, parse_instrument_id, parse_order_side, parse_timestamp, }, - record::{TardisBookUpdateRecord, TardisQuoteRecord, TardisTradeRecord}, + record::{ + TardisBookUpdateRecord, TardisOrderBookSnapshot25Record, TardisOrderBookSnapshot5Record, + TardisQuoteRecord, TardisTradeRecord, + }, }; /// Creates a new CSV reader which can handle gzip compression. @@ -115,6 +124,249 @@ pub fn load_deltas>( Ok(deltas) } +fn create_book_order( + side: OrderSide, + price: Option, + amount: Option, + price_precision: u8, + size_precision: u8, +) -> (BookOrder, u32) { + match price { + Some(price) => ( + BookOrder::new( + side, + Price::new(price, price_precision), + Quantity::new(amount.unwrap_or(0.0), size_precision), + 0, + ), + 1, // Count set to 1 if order exists + ), + None => (NULL_ORDER, 0), // NULL_ORDER if price is None + } +} + +/// Load [`OrderBookDepth10`]s from a Tardis format CSV at the given `filepath`. +pub fn load_depth10_from_snapshot5>( + filepath: P, + price_precision: u8, + size_precision: u8, + limit: Option, +) -> Result, Box> { + let mut csv_reader = create_csv_reader(filepath)?; + let mut depths: Vec = Vec::new(); + + for result in csv_reader.deserialize() { + let record: TardisOrderBookSnapshot5Record = result?; + + let instrument_id = parse_instrument_id(&record.exchange, &record.symbol); + let flags = RecordFlag::F_LAST.value(); + let sequence = 0; // Sequence not available + let ts_event = parse_timestamp(record.timestamp); + let ts_init = parse_timestamp(record.local_timestamp); + + // Initialize empty arrays + let mut bids = [NULL_ORDER; DEPTH10_LEN]; + let mut asks = [NULL_ORDER; DEPTH10_LEN]; + let mut bid_counts = [0u32; DEPTH10_LEN]; + let mut ask_counts = [0u32; DEPTH10_LEN]; + + for i in 0..=4 { + // Create bids + let (bid_order, bid_count) = create_book_order( + OrderSide::Buy, + match i { + 0 => record.bids_0_price, + 1 => record.bids_1_price, + 2 => record.bids_2_price, + 3 => record.bids_3_price, + 4 => record.bids_4_price, + _ => None, // Unreachable, but for safety + }, + match i { + 0 => record.bids_0_amount, + 1 => record.bids_1_amount, + 2 => record.bids_2_amount, + 3 => record.bids_3_amount, + 4 => record.bids_4_amount, + _ => None, // Unreachable, but for safety + }, + price_precision, + size_precision, + ); + bids[i] = bid_order; + bid_counts[i] = bid_count; + + // Create asks + let (ask_order, ask_count) = create_book_order( + OrderSide::Sell, + match i { + 0 => record.asks_0_price, + 1 => record.asks_1_price, + 2 => record.asks_2_price, + 3 => record.asks_3_price, + 4 => record.asks_4_price, + _ => None, // Unreachable, but for safety + }, + match i { + 0 => record.asks_0_amount, + 1 => record.asks_1_amount, + 2 => record.asks_2_amount, + 3 => record.asks_3_amount, + 4 => record.asks_4_amount, + _ => None, // Unreachable, but for safety + }, + price_precision, + size_precision, + ); + asks[i] = ask_order; + ask_counts[i] = ask_count; + } + + let depth = OrderBookDepth10::new( + instrument_id, + bids, + asks, + bid_counts, + ask_counts, + flags, + sequence, + ts_event, + ts_init, + ); + + depths.push(depth); + + if let Some(limit) = limit { + if depths.len() >= limit { + break; + } + } + } + + Ok(depths) +} + +pub fn load_depth10_from_snapshot25>( + filepath: P, + price_precision: u8, + size_precision: u8, + limit: Option, +) -> Result, Box> { + let mut csv_reader = create_csv_reader(filepath)?; + let mut depths: Vec = Vec::new(); + + for result in csv_reader.deserialize() { + let record: TardisOrderBookSnapshot25Record = result?; + + let instrument_id = parse_instrument_id(&record.exchange, &record.symbol); + let flags = RecordFlag::F_LAST.value(); + let sequence = 0; // Sequence not available + let ts_event = parse_timestamp(record.timestamp); + let ts_init = parse_timestamp(record.local_timestamp); + + // Initialize empty arrays for the first 10 levels only + let mut bids = [NULL_ORDER; DEPTH10_LEN]; + let mut asks = [NULL_ORDER; DEPTH10_LEN]; + let mut bid_counts = [0u32; DEPTH10_LEN]; + let mut ask_counts = [0u32; DEPTH10_LEN]; + + // Fill only the first 10 levels from the 25-level record + for i in 0..DEPTH10_LEN { + // Create bids + let (bid_order, bid_count) = create_book_order( + OrderSide::Buy, + match i { + 0 => record.bids_0_price, + 1 => record.bids_1_price, + 2 => record.bids_2_price, + 3 => record.bids_3_price, + 4 => record.bids_4_price, + 5 => record.bids_5_price, + 6 => record.bids_6_price, + 7 => record.bids_7_price, + 8 => record.bids_8_price, + 9 => record.bids_9_price, + _ => None, // Unreachable, but for safety + }, + match i { + 0 => record.bids_0_amount, + 1 => record.bids_1_amount, + 2 => record.bids_2_amount, + 3 => record.bids_3_amount, + 4 => record.bids_4_amount, + 5 => record.bids_5_amount, + 6 => record.bids_6_amount, + 7 => record.bids_7_amount, + 8 => record.bids_8_amount, + 9 => record.bids_9_amount, + _ => None, // Unreachable, but for safety + }, + price_precision, + size_precision, + ); + bids[i] = bid_order; + bid_counts[i] = bid_count; + + // Create asks + let (ask_order, ask_count) = create_book_order( + OrderSide::Sell, + match i { + 0 => record.asks_0_price, + 1 => record.asks_1_price, + 2 => record.asks_2_price, + 3 => record.asks_3_price, + 4 => record.asks_4_price, + 5 => record.asks_5_price, + 6 => record.asks_6_price, + 7 => record.asks_7_price, + 8 => record.asks_8_price, + 9 => record.asks_9_price, + _ => None, // Unreachable, but for safety + }, + match i { + 0 => record.asks_0_amount, + 1 => record.asks_1_amount, + 2 => record.asks_2_amount, + 3 => record.asks_3_amount, + 4 => record.asks_4_amount, + 5 => record.asks_5_amount, + 6 => record.asks_6_amount, + 7 => record.asks_7_amount, + 8 => record.asks_8_amount, + 9 => record.asks_9_amount, + _ => None, // Unreachable, but for safety + }, + price_precision, + size_precision, + ); + asks[i] = ask_order; + ask_counts[i] = ask_count; + } + + let depth = OrderBookDepth10::new( + instrument_id, + bids, + asks, + bid_counts, + ask_counts, + flags, + sequence, + ts_event, + ts_init, + ); + + depths.push(depth); + + if let Some(limit) = limit { + if depths.len() >= limit { + break; + } + } + } + + Ok(depths) +} + /// Load [`QuoteTick`]s from a Tardis format CSV at the given `filepath`. pub fn load_quote_ticks>( filepath: P, @@ -228,6 +480,34 @@ mod tests { assert_eq!(deltas.len(), 1_000) } + #[rstest] + pub fn test_read_depth10s_from_snapshot5() { + let testdata = get_project_testdata_path(); + let checksums = get_testdata_large_checksums_filepath(); + let filename = "tardis_binance-futures_book_snapshot_5_2020-09-01_BTCUSDT.csv.gz"; + let filepath = testdata.join("large").join(filename); + let url = "https://datasets.tardis.dev/v1/binance-futures/book_snapshot_5/2020/09/01/BTCUSDT.csv.gz"; + ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); + + let depths = load_depth10_from_snapshot5(filepath, 1, 0, Some(1_000)).unwrap(); + + assert_eq!(depths.len(), 1_000) + } + + #[rstest] + pub fn test_read_depth10s_from_snapshot25() { + let testdata = get_project_testdata_path(); + let checksums = get_testdata_large_checksums_filepath(); + let filename = "tardis_binance-futures_book_snapshot_25_2020-09-01_BTCUSDT.csv.gz"; + let filepath = testdata.join("large").join(filename); + let url = "https://datasets.tardis.dev/v1/binance-futures/book_snapshot_25/2020/09/01/BTCUSDT.csv.gz"; + ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); + + let depths = load_depth10_from_snapshot25(filepath, 1, 0, Some(1_000)).unwrap(); + + assert_eq!(depths.len(), 1_000) + } + #[rstest] pub fn test_read_quotes() { let testdata = get_project_testdata_path(); diff --git a/nautilus_core/adapters/src/tardis/record.rs b/nautilus_core/adapters/src/tardis/record.rs index f79f532f1622..5fd7171600de 100644 --- a/nautilus_core/adapters/src/tardis/record.rs +++ b/nautilus_core/adapters/src/tardis/record.rs @@ -18,7 +18,7 @@ use serde::Deserialize; /// Represents a Tardis format order book update record. #[derive(Debug, Deserialize)] pub struct TardisBookUpdateRecord { - /// The exchande ID. + /// The exchange ID. pub exchange: String, /// The instrument symbol as provided by the exchange. pub symbol: String, @@ -36,6 +36,197 @@ pub struct TardisBookUpdateRecord { pub amount: f64, } +/// Represents a Tardis format order book 5 level snapshot record. +#[derive(Debug, Deserialize)] +pub struct TardisOrderBookSnapshot5Record { + /// The exchange ID. + pub exchange: String, + /// The instrument symbol as provided by the exchange. + pub symbol: String, + // UNIX microseconds timestamp provided by the exchange. + pub timestamp: u64, + // UNIX microseconds timestamp of message received. + pub local_timestamp: u64, + /// The price of the first ask. + pub asks_0_price: Option, + /// The amount of the first ask. + pub asks_0_amount: Option, + /// The price of the first bid. + pub bids_0_price: Option, + /// The amount of the first bid. + pub bids_0_amount: Option, + /// The price of the second ask. + pub asks_1_price: Option, + /// The amount of the second ask. + pub asks_1_amount: Option, + /// The price of the second bid. + pub bids_1_price: Option, + /// The amount of the second bid. + pub bids_1_amount: Option, + /// The price of the third ask. + pub asks_2_price: Option, + /// The amount of the third ask. + pub asks_2_amount: Option, + /// The price of the third bid. + pub bids_2_price: Option, + /// The amount of the third bid. + pub bids_2_amount: Option, + /// The price of the fourth ask. + pub asks_3_price: Option, + /// The amount of the fourth ask. + pub asks_3_amount: Option, + /// The price of the fourth bid. + pub bids_3_price: Option, + /// The amount of the fourth bid. + pub bids_3_amount: Option, + /// The price of the fifth ask. + pub asks_4_price: Option, + /// The amount of the fifth ask. + pub asks_4_amount: Option, + /// The price of the fifth bid. + pub bids_4_price: Option, + /// The amount of the fifth bid. + pub bids_4_amount: Option, +} + +/// Represents a Tardis format order book 25 level snapshot record. +#[derive(Debug, Deserialize)] +pub struct TardisOrderBookSnapshot25Record { + /// The exchange ID. + pub exchange: String, + /// The instrument symbol as provided by the exchange. + pub symbol: String, + // UNIX microseconds timestamp provided by the exchange. + pub timestamp: u64, + // UNIX microseconds timestamp of message received. + pub local_timestamp: u64, + + pub asks_0_price: Option, + pub asks_0_amount: Option, + pub bids_0_price: Option, + pub bids_0_amount: Option, + + pub asks_1_price: Option, + pub asks_1_amount: Option, + pub bids_1_price: Option, + pub bids_1_amount: Option, + + pub asks_2_price: Option, + pub asks_2_amount: Option, + pub bids_2_price: Option, + pub bids_2_amount: Option, + + pub asks_3_price: Option, + pub asks_3_amount: Option, + pub bids_3_price: Option, + pub bids_3_amount: Option, + + pub asks_4_price: Option, + pub asks_4_amount: Option, + pub bids_4_price: Option, + pub bids_4_amount: Option, + + pub asks_5_price: Option, + pub asks_5_amount: Option, + pub bids_5_price: Option, + pub bids_5_amount: Option, + + pub asks_6_price: Option, + pub asks_6_amount: Option, + pub bids_6_price: Option, + pub bids_6_amount: Option, + + pub asks_7_price: Option, + pub asks_7_amount: Option, + pub bids_7_price: Option, + pub bids_7_amount: Option, + + pub asks_8_price: Option, + pub asks_8_amount: Option, + pub bids_8_price: Option, + pub bids_8_amount: Option, + + pub asks_9_price: Option, + pub asks_9_amount: Option, + pub bids_9_price: Option, + pub bids_9_amount: Option, + + pub asks_10_price: Option, + pub asks_10_amount: Option, + pub bids_10_price: Option, + pub bids_10_amount: Option, + + pub asks_11_price: Option, + pub asks_11_amount: Option, + pub bids_11_price: Option, + pub bids_11_amount: Option, + + pub asks_12_price: Option, + pub asks_12_amount: Option, + pub bids_12_price: Option, + pub bids_12_amount: Option, + + pub asks_13_price: Option, + pub asks_13_amount: Option, + pub bids_13_price: Option, + pub bids_13_amount: Option, + + pub asks_14_price: Option, + pub asks_14_amount: Option, + pub bids_14_price: Option, + pub bids_14_amount: Option, + + pub asks_15_price: Option, + pub asks_15_amount: Option, + pub bids_15_price: Option, + pub bids_15_amount: Option, + + pub asks_16_price: Option, + pub asks_16_amount: Option, + pub bids_16_price: Option, + pub bids_16_amount: Option, + + pub asks_17_price: Option, + pub asks_17_amount: Option, + pub bids_17_price: Option, + pub bids_17_amount: Option, + + pub asks_18_price: Option, + pub asks_18_amount: Option, + pub bids_18_price: Option, + pub bids_18_amount: Option, + + pub asks_19_price: Option, + pub asks_19_amount: Option, + pub bids_19_price: Option, + pub bids_19_amount: Option, + + pub asks_20_price: Option, + pub asks_20_amount: Option, + pub bids_20_price: Option, + pub bids_20_amount: Option, + + pub asks_21_price: Option, + pub asks_21_amount: Option, + pub bids_21_price: Option, + pub bids_21_amount: Option, + + pub asks_22_price: Option, + pub asks_22_amount: Option, + pub bids_22_price: Option, + pub bids_22_amount: Option, + + pub asks_23_price: Option, + pub asks_23_amount: Option, + pub bids_23_price: Option, + pub bids_23_amount: Option, + + pub asks_24_price: Option, + pub asks_24_amount: Option, + pub bids_24_price: Option, + pub bids_24_amount: Option, +} + /// Represents a Tardis format quote record. #[derive(Debug, Deserialize)] pub struct TardisQuoteRecord { diff --git a/tests/test_data/large/checksums.json b/tests/test_data/large/checksums.json index 2b0cff9457c1..6e219ff40c61 100644 --- a/tests/test_data/large/checksums.json +++ b/tests/test_data/large/checksums.json @@ -1,5 +1,7 @@ { "databento_mbo_xnas_itch.csv": "sha256:5481466e7776659f7f093b1ca8b05c7e88b8d586036692089cca5decc7965099", + "tardis_binance-futures_book_snapshot_25_2020-09-01_BTCUSDT.csv.gz": "sha256:c9ce8ae07da3fe22ed2b8bca00290c8875f9234cbe9e7734ff3ef662eb4d4712", + "tardis_binance-futures_book_snapshot_5_2020-09-01_BTCUSDT.csv.gz": "sha256:d62035442308aa139b7771bb22c8cdb3be989cfc88693507a306c35b98b630de", "tardis_bitmex_trades_2020-03-01_XBTUSD.csv.gz": "sha256:bafdeba528965322baeb0a01b8c3d6bac73891c5a929713b6a6a2f75361200ab", "tardis_deribit_incremental_book_L2_2020-04-01_BTC-PERPETUAL.csv.gz": "sha256:a15aa5d6c52adbdc2e3c5593b487106e1a3fc78f151f939b4d86dbcb5f116876", "tardis_huobi-dm-swap_quotes_2020-05-01_BTC-USD.csv.gz": "sha256:edd2d2f4491c21dd604c98389f2f94779b05104d684d97f4b3ec148f43cfcd67" From 029a15e9b4c3df7f55489e08a0705ee3a098ca57 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 18:37:37 +1100 Subject: [PATCH 064/224] Add Tardis CSV loading functions --- .../adapters/src/tardis/{read.rs => load.rs} | 0 nautilus_core/adapters/src/tardis/mod.rs | 2 +- .../adapters/src/tardis/python/load.rs | 169 ++++++++++++++++++ .../adapters/src/tardis/python/mod.rs | 45 +++++ 4 files changed, 215 insertions(+), 1 deletion(-) rename nautilus_core/adapters/src/tardis/{read.rs => load.rs} (100%) create mode 100644 nautilus_core/adapters/src/tardis/python/load.rs diff --git a/nautilus_core/adapters/src/tardis/read.rs b/nautilus_core/adapters/src/tardis/load.rs similarity index 100% rename from nautilus_core/adapters/src/tardis/read.rs rename to nautilus_core/adapters/src/tardis/load.rs diff --git a/nautilus_core/adapters/src/tardis/mod.rs b/nautilus_core/adapters/src/tardis/mod.rs index cceddf81e575..216f5edb29d2 100644 --- a/nautilus_core/adapters/src/tardis/mod.rs +++ b/nautilus_core/adapters/src/tardis/mod.rs @@ -15,8 +15,8 @@ //! The [Tardis](https://tardis.dev) integration adapter. +pub mod load; pub mod parse; -pub mod read; pub mod record; #[cfg(feature = "python")] diff --git a/nautilus_core/adapters/src/tardis/python/load.rs b/nautilus_core/adapters/src/tardis/python/load.rs new file mode 100644 index 000000000000..0900ece80e5d --- /dev/null +++ b/nautilus_core/adapters/src/tardis/python/load.rs @@ -0,0 +1,169 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use std::path::PathBuf; + +use nautilus_core::{ffi::cvec::CVec, python::to_pyvalue_err}; +use nautilus_model::data::{ + delta::OrderBookDelta, depth::OrderBookDepth10, quote::QuoteTick, trade::TradeTick, +}; +use pyo3::{prelude::*, types::PyCapsule}; + +use crate::tardis::load::{ + load_deltas, load_depth10_from_snapshot25, load_depth10_from_snapshot5, load_quote_ticks, + load_trade_ticks, +}; + +#[must_use] +#[pyfunction(name = "load_tardis_deltas")] +pub fn py_load_tardis_deltas( + filepath: PathBuf, + price_precision: u8, + size_precision: u8, + limit: Option, +) -> PyResult> { + load_deltas(filepath, price_precision, size_precision, limit).map_err(to_pyvalue_err) +} + +#[must_use] +#[pyfunction(name = "load_tardis_deltas_as_pycapsule")] +pub fn py_load_tardis_deltas_as_pycapsule( + py: Python, + filepath: PathBuf, + price_precision: u8, + size_precision: u8, + limit: Option, +) -> PyResult { + let deltas = + load_deltas(filepath, price_precision, size_precision, limit).map_err(to_pyvalue_err)?; + + let cvec: CVec = deltas.into(); + let capsule = PyCapsule::new_bound::(py, cvec, None)?; + Ok(capsule.into_py(py)) +} + +#[must_use] +#[pyfunction(name = "load_tardis_depth10_from_snapshot5")] +pub fn py_load_tardis_depth10_from_snapshot5( + filepath: PathBuf, + price_precision: u8, + size_precision: u8, + limit: Option, +) -> PyResult> { + load_depth10_from_snapshot5(filepath, price_precision, size_precision, limit) + .map_err(to_pyvalue_err) +} + +#[must_use] +#[pyfunction(name = "load_tardis_depth10_from_snapshot5_as_pycapsule")] +pub fn py_load_tardis_depth10_from_snapshot5_as_pycapsule( + py: Python, + filepath: PathBuf, + price_precision: u8, + size_precision: u8, + limit: Option, +) -> PyResult { + let depths = load_depth10_from_snapshot5(filepath, price_precision, size_precision, limit) + .map_err(to_pyvalue_err)?; + + let cvec: CVec = depths.into(); + let capsule = PyCapsule::new_bound::(py, cvec, None)?; + Ok(capsule.into_py(py)) +} + +#[must_use] +#[pyfunction(name = "load_tardis_depth10_from_snapshot25")] +pub fn py_load_tardis_depth10_from_snapshot25( + filepath: PathBuf, + price_precision: u8, + size_precision: u8, + limit: Option, +) -> PyResult> { + load_depth10_from_snapshot25(filepath, price_precision, size_precision, limit) + .map_err(to_pyvalue_err) +} + +#[must_use] +#[pyfunction(name = "load_tardis_depth10_from_snapshot25_as_pycapsule")] +pub fn py_load_tardis_depth10_from_snapshot25_as_pycapsule( + py: Python, + filepath: PathBuf, + price_precision: u8, + size_precision: u8, + limit: Option, +) -> PyResult { + let depths = load_depth10_from_snapshot25(filepath, price_precision, size_precision, limit) + .map_err(to_pyvalue_err)?; + + let cvec: CVec = depths.into(); + let capsule = PyCapsule::new_bound::(py, cvec, None)?; + Ok(capsule.into_py(py)) +} + +#[must_use] +#[pyfunction(name = "load_tardis_quotes")] +pub fn py_load_tardis_quotes( + filepath: PathBuf, + price_precision: u8, + size_precision: u8, + limit: Option, +) -> PyResult> { + load_quote_ticks(filepath, price_precision, size_precision, limit).map_err(to_pyvalue_err) +} + +#[must_use] +#[pyfunction(name = "load_tardis_quotes_as_pycapsule")] +pub fn py_load_tardis_quotes_as_pycapsule( + py: Python, + filepath: PathBuf, + price_precision: u8, + size_precision: u8, + limit: Option, +) -> PyResult { + let quotes = load_quote_ticks(filepath, price_precision, size_precision, limit) + .map_err(to_pyvalue_err)?; + + let cvec: CVec = quotes.into(); + let capsule = PyCapsule::new_bound::(py, cvec, None)?; + Ok(capsule.into_py(py)) +} + +#[must_use] +#[pyfunction(name = "load_tardis_trades")] +pub fn py_load_tardis_trades( + filepath: PathBuf, + price_precision: u8, + size_precision: u8, + limit: Option, +) -> PyResult> { + load_trade_ticks(filepath, price_precision, size_precision, limit).map_err(to_pyvalue_err) +} + +#[must_use] +#[pyfunction(name = "load_tardis_trades_as_pycapsule")] +pub fn py_load_tardis_trades_as_pycapsule( + py: Python, + filepath: PathBuf, + price_precision: u8, + size_precision: u8, + limit: Option, +) -> PyResult { + let trades = load_trade_ticks(filepath, price_precision, size_precision, limit) + .map_err(to_pyvalue_err)?; + + let cvec: CVec = trades.into(); + let capsule = PyCapsule::new_bound::(py, cvec, None)?; + Ok(capsule.into_py(py)) +} diff --git a/nautilus_core/adapters/src/tardis/python/mod.rs b/nautilus_core/adapters/src/tardis/python/mod.rs index 97d459d8d1e8..5520c6d3265b 100644 --- a/nautilus_core/adapters/src/tardis/python/mod.rs +++ b/nautilus_core/adapters/src/tardis/python/mod.rs @@ -12,3 +12,48 @@ // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------------------------------- + +//! Python bindings from `pyo3`. + +#![allow(warnings)] // non-local `impl` definition, temporary allow until pyo3 upgrade + +pub mod load; + +use pyo3::prelude::*; + +/// Loaded as nautilus_pyo3.tardis +#[pymodule] +pub fn tardis(_: Python<'_>, m: &PyModule) -> PyResult<()> { + m.add_function(wrap_pyfunction!(load::py_load_tardis_deltas, m)?)?; + m.add_function(wrap_pyfunction!( + load::py_load_tardis_deltas_as_pycapsule, + m + )?)?; + m.add_function(wrap_pyfunction!( + load::py_load_tardis_depth10_from_snapshot5, + m + )?)?; + m.add_function(wrap_pyfunction!( + load::py_load_tardis_depth10_from_snapshot5_as_pycapsule, + m + )?)?; + m.add_function(wrap_pyfunction!( + load::py_load_tardis_depth10_from_snapshot25, + m + )?)?; + m.add_function(wrap_pyfunction!( + load::py_load_tardis_depth10_from_snapshot25_as_pycapsule, + m + )?)?; + m.add_function(wrap_pyfunction!(load::py_load_tardis_quotes, m)?)?; + m.add_function(wrap_pyfunction!( + load::py_load_tardis_quotes_as_pycapsule, + m + )?)?; + m.add_function(wrap_pyfunction!(load::py_load_tardis_trades, m)?)?; + m.add_function(wrap_pyfunction!( + load::py_load_tardis_trades_as_pycapsule, + m + )?)?; + Ok(()) +} From c5d2841284be3da6735ef5176fb47ee9513cd1c7 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 18:49:34 +1100 Subject: [PATCH 065/224] Fix WebSocketClient error handling on writer close --- RELEASES.md | 1 + nautilus_core/network/src/websocket.rs | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index d30c66806ea1..3fb6909c9f77 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -22,6 +22,7 @@ None ### Fixes - Fixed `SocketClient` TLS implementation +- Fixed `WebSocketClient` error handling on writer close, thanks for reporting @davidsblom - Fixed resubscribing to orderbook in batched mode for dYdX (#1985), thanks @davidsblom - Fixed Betfair tests related to symbology (#1988), thanks @limx0 diff --git a/nautilus_core/network/src/websocket.rs b/nautilus_core/network/src/websocket.rs index 0d49446b7ce8..6f29dde7ff2b 100644 --- a/nautilus_core/network/src/websocket.rs +++ b/nautilus_core/network/src/websocket.rs @@ -125,9 +125,9 @@ impl WebSocketClientInner { // Hacky solution to overcome the new `http` trait bounds for (key, val) in headers { - let header_value = HeaderValue::from_str(&val).unwrap(); + let header_value = HeaderValue::from_str(&val)?; use http::header::HeaderName; - let header_name: HeaderName = key.parse().unwrap(); + let header_name: HeaderName = key.parse()?; let header_name_string = header_name.to_string(); let header_name_str: &'static str = Box::leak(header_name_string.into_boxed_str()); req_headers.insert(header_name_str, header_value); @@ -252,8 +252,11 @@ impl WebSocketClientInner { tracing::debug!("Closing writer"); let mut write_half = self.writer.lock().await; - write_half.close().await.unwrap(); - tracing::debug!("Closed connection"); + if let Err(e) = write_half.close().await { + tracing::error!("Error closing writer: {e:?}"); + } else { + tracing::debug!("Closed connection"); + } } /// Reconnect with server. From e873be205767da5e5daa00bed0f26ece62612005 Mon Sep 17 00:00:00 2001 From: David Blom Date: Thu, 10 Oct 2024 10:10:53 +0200 Subject: [PATCH 066/224] Add error logs to websocket for dYdX (#1993) --- nautilus_trader/adapters/dydx/websocket/client.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/nautilus_trader/adapters/dydx/websocket/client.py b/nautilus_trader/adapters/dydx/websocket/client.py index 2c07580a8bcb..6f7e8e5f6346 100644 --- a/nautilus_trader/adapters/dydx/websocket/client.py +++ b/nautilus_trader/adapters/dydx/websocket/client.py @@ -178,10 +178,22 @@ async def _reconnect_guard(self) -> None: if self.is_disconnected() or time_since_previous_msg > pd.Timedelta( seconds=self._msg_timeout_secs, ): + if self.is_disconnected(): + self._log.error("Websocket disconnected. Reconnecting.") + + # Print error if no message has been received for twice the timeout time + # to reduce log noise. + if time_since_previous_msg > pd.Timedelta(seconds=2 * self._msg_timeout_secs): + self._log.error( + f"{time_since_previous_msg} since previous received message. Reconnecting.", + ) + try: await self.disconnect() await self.connect() self.reconnect() + + self._log.info("Websocket connected") except Exception as e: self._log.error(f"Failed to connect the websocket: {e}") self._client = None From 8499a0becbef609dd2041917106884af6e4a4dfb Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 19:33:39 +1100 Subject: [PATCH 067/224] Add Tardis websocket messages --- .../adapters/src/tardis/{load.rs => csv.rs} | 0 nautilus_core/adapters/src/tardis/message.rs | 244 ++++++++++++++++++ nautilus_core/adapters/src/tardis/mod.rs | 3 +- .../src/tardis/python/{load.rs => csv.rs} | 2 +- .../adapters/src/tardis/python/mod.rs | 22 +- 5 files changed, 258 insertions(+), 13 deletions(-) rename nautilus_core/adapters/src/tardis/{load.rs => csv.rs} (100%) create mode 100644 nautilus_core/adapters/src/tardis/message.rs rename nautilus_core/adapters/src/tardis/python/{load.rs => csv.rs} (99%) diff --git a/nautilus_core/adapters/src/tardis/load.rs b/nautilus_core/adapters/src/tardis/csv.rs similarity index 100% rename from nautilus_core/adapters/src/tardis/load.rs rename to nautilus_core/adapters/src/tardis/csv.rs diff --git a/nautilus_core/adapters/src/tardis/message.rs b/nautilus_core/adapters/src/tardis/message.rs new file mode 100644 index 000000000000..c58fbc07f092 --- /dev/null +++ b/nautilus_core/adapters/src/tardis/message.rs @@ -0,0 +1,244 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use serde::{Deserialize, Serialize}; + +/// Represents the type of Tardis WebSocket message. +#[derive(Debug, PartialEq, Deserialize, Serialize)] +#[serde(rename_all = "snake_case")] +pub enum MessageType { + BookChange, + BookSnapshot, + Trade, + Unknown(String), +} + +/// Represents a single level in the order book (bid or ask). +#[derive(Debug, Deserialize, Serialize)] +pub struct OrderBookLevel { + /// The price at this level. + pub price: f64, + /// The amount at this level. + pub amount: f64, +} + +/// Represents a Tardis WebSocket message for book changes. +#[derive(Debug, Deserialize, Serialize)] +#[serde(tag = "type")] +#[serde(rename_all = "camelCase")] +pub struct BookChangeMessage { + /// The type of message (tagged union). + #[serde(rename = "type")] + pub msg_type: MessageType, + /// The instrument symbol as provided by the exchange. + pub symbol: String, + /// The exchange ID. + pub exchange: String, + /// Indicates whether this is an initial order book snapshot. + pub is_snapshot: bool, + /// Updated bids, with price and amount levels. + pub bids: Vec, + /// Updated asks, with price and amount levels. + pub asks: Vec, + /// The order book update timestamp provided by the exchange (ISO 8601 format). + pub timestamp: String, + /// The local timestamp when the message was received (ISO 8601 format). + pub local_timestamp: String, +} + +/// Represents a Tardis WebSocket message for book snapshots. +#[derive(Debug, Deserialize, Serialize)] +#[serde(tag = "type")] +#[serde(rename_all = "camelCase")] +pub struct BookSnapshotMessage { + /// The type of message (tagged union). + #[serde(rename = "type")] + pub msg_type: MessageType, + /// The instrument symbol as provided by the exchange. + pub symbol: String, + /// The exchange ID. + pub exchange: String, + /// The name of the snapshot, e.g., `book_snapshot_{depth}_{interval}{time_unit}`. + pub name: String, + /// The requested number of levels (top bids/asks). + pub depth: u32, + /// The requested snapshot interval in milliseconds. + pub interval: u32, + /// The top bids price-amount levels. + pub bids: Vec, + /// The top asks price-amount levels. + pub asks: Vec, + /// The snapshot timestamp based on the last book change message processed timestamp. + pub timestamp: String, + /// The local timestamp when the message was received. + pub local_timestamp: String, +} + +/// Represents a Tardis WebSocket message for trades. +#[derive(Debug, Deserialize, Serialize)] +#[serde(tag = "type")] +#[serde(rename_all = "camelCase")] +pub struct TradeMessage { + /// The type of message (tagged union). + #[serde(rename = "type")] + pub msg_type: MessageType, + /// The instrument symbol as provided by the exchange. + pub symbol: String, + /// The exchange ID. + pub exchange: String, + /// The trade ID provided by the exchange (optional). + pub id: Option, + /// The trade price as provided by the exchange. + pub price: f64, + /// The trade amount as provided by the exchange. + pub amount: f64, + /// The liquidity taker side (aggressor) for the trade. + pub side: String, + /// The trade timestamp provided by the exchange (ISO 8601 format). + pub timestamp: String, + /// The local timestamp when the message was received (ISO 8601 format). + pub local_timestamp: String, +} + +//////////////////////////////////////////////////////////////////////////////// +// Tests +//////////////////////////////////////////////////////////////////////////////// +#[cfg(test)] +mod tests { + use rstest::rstest; + + use super::*; + + #[rstest] + fn test_parse_book_change_message() { + let json_data = r#" + { + "type": "book_change", + "symbol": "XBTUSD", + "exchange": "bitmex", + "isSnapshot": false, + "bids": [], + "asks": [ + { + "price": 7985, + "amount": 283318 + } + ], + "timestamp": "2019-10-23T11:29:53.469Z", + "localTimestamp": "2019-10-23T11:29:53.469Z" + } + "#; + + let message: BookChangeMessage = + serde_json::from_str(json_data).expect("Failed to parse JSON"); + + assert_eq!(message.msg_type, MessageType::BookChange); + assert_eq!(message.symbol, "XBTUSD"); + assert_eq!(message.exchange, "bitmex"); + assert_eq!(message.is_snapshot, false); + assert!(message.bids.is_empty()); + assert_eq!(message.asks.len(), 1); + assert_eq!(message.asks[0].price, 7985.0); + assert_eq!(message.asks[0].amount, 283318.0); + assert_eq!(message.timestamp, "2019-10-23T11:29:53.469Z"); + assert_eq!(message.local_timestamp, "2019-10-23T11:29:53.469Z"); + } + + #[rstest] + fn test_parse_book_snapshot_message() { + let json_data = r#" + { + "type": "book_snapshot", + "symbol": "XBTUSD", + "exchange": "bitmex", + "name": "book_snapshot_2_50ms", + "depth": 2, + "interval": 50, + "bids": [ + { + "price": 7633.5, + "amount": 1906067 + }, + { + "price": 7633, + "amount": 65319 + } + ], + "asks": [ + { + "price": 7634, + "amount": 1467849 + }, + { + "price": 7634.5, + "amount": 67939 + } + ], + "timestamp": "2019-10-25T13:39:46.950Z", + "localTimestamp": "2019-10-25T13:39:46.961Z" + } + "#; + + let message: BookSnapshotMessage = + serde_json::from_str(json_data).expect("Failed to parse JSON"); + + assert_eq!(message.msg_type, MessageType::BookSnapshot); + assert_eq!(message.symbol, "XBTUSD"); + assert_eq!(message.exchange, "bitmex"); + assert_eq!(message.name, "book_snapshot_2_50ms"); + assert_eq!(message.depth, 2); + assert_eq!(message.interval, 50); + assert_eq!(message.bids.len(), 2); + assert_eq!(message.asks.len(), 2); + assert_eq!(message.bids[0].price, 7633.5); + assert_eq!(message.bids[0].amount, 1906067.0); + assert_eq!(message.asks[0].price, 7634.0); + assert_eq!(message.asks[0].amount, 1467849.0); + assert_eq!(message.timestamp, "2019-10-25T13:39:46.950Z"); + assert_eq!(message.local_timestamp, "2019-10-25T13:39:46.961Z"); + } + + #[rstest] + fn test_parse_trade_message() { + let json_data = r#" + { + "type": "trade", + "symbol": "XBTUSD", + "exchange": "bitmex", + "id": "282a0445-0e3a-abeb-f403-11003204ea1b", + "price": 7996, + "amount": 50, + "side": "sell", + "timestamp": "2019-10-23T10:32:49.669Z", + "localTimestamp": "2019-10-23T10:32:49.740Z" + } + "#; + + let message: TradeMessage = serde_json::from_str(json_data).expect("Failed to parse JSON"); + + assert_eq!(message.msg_type, MessageType::Trade); + assert_eq!(message.symbol, "XBTUSD"); + assert_eq!(message.exchange, "bitmex"); + assert_eq!( + message.id, + Some("282a0445-0e3a-abeb-f403-11003204ea1b".to_string()) + ); + assert_eq!(message.price, 7996.0); + assert_eq!(message.amount, 50.0); + assert_eq!(message.side, "sell"); + assert_eq!(message.timestamp, "2019-10-23T10:32:49.669Z"); + assert_eq!(message.local_timestamp, "2019-10-23T10:32:49.740Z"); + } +} diff --git a/nautilus_core/adapters/src/tardis/mod.rs b/nautilus_core/adapters/src/tardis/mod.rs index 216f5edb29d2..52f7a69fc25d 100644 --- a/nautilus_core/adapters/src/tardis/mod.rs +++ b/nautilus_core/adapters/src/tardis/mod.rs @@ -15,7 +15,8 @@ //! The [Tardis](https://tardis.dev) integration adapter. -pub mod load; +pub mod csv; +pub mod message; pub mod parse; pub mod record; diff --git a/nautilus_core/adapters/src/tardis/python/load.rs b/nautilus_core/adapters/src/tardis/python/csv.rs similarity index 99% rename from nautilus_core/adapters/src/tardis/python/load.rs rename to nautilus_core/adapters/src/tardis/python/csv.rs index 0900ece80e5d..89a4488f7080 100644 --- a/nautilus_core/adapters/src/tardis/python/load.rs +++ b/nautilus_core/adapters/src/tardis/python/csv.rs @@ -21,7 +21,7 @@ use nautilus_model::data::{ }; use pyo3::{prelude::*, types::PyCapsule}; -use crate::tardis::load::{ +use crate::tardis::csv::{ load_deltas, load_depth10_from_snapshot25, load_depth10_from_snapshot5, load_quote_ticks, load_trade_ticks, }; diff --git a/nautilus_core/adapters/src/tardis/python/mod.rs b/nautilus_core/adapters/src/tardis/python/mod.rs index 5520c6d3265b..67e3da816e8e 100644 --- a/nautilus_core/adapters/src/tardis/python/mod.rs +++ b/nautilus_core/adapters/src/tardis/python/mod.rs @@ -17,42 +17,42 @@ #![allow(warnings)] // non-local `impl` definition, temporary allow until pyo3 upgrade -pub mod load; +pub mod csv; use pyo3::prelude::*; /// Loaded as nautilus_pyo3.tardis #[pymodule] pub fn tardis(_: Python<'_>, m: &PyModule) -> PyResult<()> { - m.add_function(wrap_pyfunction!(load::py_load_tardis_deltas, m)?)?; + m.add_function(wrap_pyfunction!(csv::py_load_tardis_deltas, m)?)?; m.add_function(wrap_pyfunction!( - load::py_load_tardis_deltas_as_pycapsule, + csv::py_load_tardis_deltas_as_pycapsule, m )?)?; m.add_function(wrap_pyfunction!( - load::py_load_tardis_depth10_from_snapshot5, + csv::py_load_tardis_depth10_from_snapshot5, m )?)?; m.add_function(wrap_pyfunction!( - load::py_load_tardis_depth10_from_snapshot5_as_pycapsule, + csv::py_load_tardis_depth10_from_snapshot5_as_pycapsule, m )?)?; m.add_function(wrap_pyfunction!( - load::py_load_tardis_depth10_from_snapshot25, + csv::py_load_tardis_depth10_from_snapshot25, m )?)?; m.add_function(wrap_pyfunction!( - load::py_load_tardis_depth10_from_snapshot25_as_pycapsule, + csv::py_load_tardis_depth10_from_snapshot25_as_pycapsule, m )?)?; - m.add_function(wrap_pyfunction!(load::py_load_tardis_quotes, m)?)?; + m.add_function(wrap_pyfunction!(csv::py_load_tardis_quotes, m)?)?; m.add_function(wrap_pyfunction!( - load::py_load_tardis_quotes_as_pycapsule, + csv::py_load_tardis_quotes_as_pycapsule, m )?)?; - m.add_function(wrap_pyfunction!(load::py_load_tardis_trades, m)?)?; + m.add_function(wrap_pyfunction!(csv::py_load_tardis_trades, m)?)?; m.add_function(wrap_pyfunction!( - load::py_load_tardis_trades_as_pycapsule, + csv::py_load_tardis_trades_as_pycapsule, m )?)?; Ok(()) From 2c2f09452ec9b2d39648c45dd5ae710563fcbaa4 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 10 Oct 2024 19:36:31 +1100 Subject: [PATCH 068/224] Update release notes --- RELEASES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASES.md b/RELEASES.md index 3fb6909c9f77..37cb9b4bd229 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -15,6 +15,7 @@ Released on TBD (UTC). ### Internal Improvements - Ported `Throttler` to Rust (#1988), thanks @Pushkarm029 and @twitu - Refined `WebSocketClient` to close existing tasks on reconnect (#1986), thanks @davidsblom +- Improved error logs for dYdX websocket subscriptions (#1993), thanks @davidsblom - Standardized log and error message syntax in Rust ### Breaking Changes From 19c5777b07019910659bedc0055eb6c4994f233d Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 11 Oct 2024 06:53:45 +1100 Subject: [PATCH 069/224] Update GitHub workflows --- .github/workflows/build-wheels.yml | 28 +------ .github/workflows/build.yml | 52 +++--------- .github/workflows/coverage.yml | 16 +--- .github/workflows/release.yml | 80 +++++-------------- ...rust-toolchain.toml => rust-toolchain.toml | 0 scripts/python-version.sh | 3 + 6 files changed, 41 insertions(+), 138 deletions(-) rename nautilus_core/rust-toolchain.toml => rust-toolchain.toml (100%) create mode 100644 scripts/python-version.sh diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index e9cf0a6eee1e..db01b07e21f9 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -34,29 +34,9 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Get Rust version from rust-toolchain.toml - id: rust-version + - name: Set up Rust toolchain run: | - version=$(awk -F\" '/version/ {print $2}' nautilus_core/rust-toolchain.toml) - echo "Rust toolchain version $version" - echo "RUST_VERSION=$version" >> $GITHUB_ENV - working-directory: ${{ github.workspace }} - - - name: Set up Rust tool-chain (Linux, Windows) stable - if: (runner.os == 'Linux') || (runner.os == 'Windows') - uses: actions-rust-lang/setup-rust-toolchain@v1.8 - with: - toolchain: ${{ env.RUST_VERSION }} - components: rustfmt, clippy - - # Work around as actions-rust-lang does not seem to work on macOS yet - - name: Set up Rust tool-chain (macOS) stable - if: runner.os == 'macOS' - uses: actions-rs/toolchain@v1 - with: - toolchain: ${{ env.RUST_VERSION }} - override: true - components: rustfmt, clippy + rustup toolchain add --profile minimal stable --component clippy,rustfmt - name: Set up Python environment uses: actions/setup-python@v5 @@ -65,7 +45,7 @@ jobs: - name: Get Python version run: | - version=$(python -c "import sys; print('.'.join(map(str, sys.version_info[:3])))") + version=$(bash scripts/python-version.sh) echo "PYTHON_VERSION=$version" >> $GITHUB_ENV - name: Get Poetry version from poetry-version @@ -104,7 +84,7 @@ jobs: echo "ASSET_NAME=$(printf '%s\0' * | awk 'BEGIN{RS="\0"} {print; exit}')" >> $GITHUB_ENV - name: Upload wheel artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ env.ASSET_NAME }} path: ${{ env.ASSET_PATH }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7a85e1fd1e0d..b07375572ca9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -61,19 +61,9 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Get Rust version from rust-toolchain.toml - id: rust-version + - name: Set up Rust toolchain run: | - version=$(awk -F\" '/version/ {print $2}' nautilus_core/rust-toolchain.toml) - echo "Rust toolchain version $version" - echo "RUST_VERSION=$version" >> $GITHUB_ENV - working-directory: ${{ github.workspace }} - - - name: Set up Rust tool-chain (Linux, Windows) stable - uses: actions-rust-lang/setup-rust-toolchain@v1.8 - with: - toolchain: ${{ env.RUST_VERSION }} - components: rustfmt, clippy + rustup toolchain add --profile minimal stable --component clippy,rustfmt - name: Set up Python environment uses: actions/setup-python@v5 @@ -82,7 +72,7 @@ jobs: - name: Get Python version run: | - version=$(python -c "import sys; print('.'.join(map(str, sys.version_info[:3])))") + version=$(bash scripts/python-version.sh) echo "PYTHON_VERSION=$version" >> $GITHUB_ENV - name: Get Poetry version from poetry-version @@ -200,19 +190,9 @@ jobs: rm -rf "/c/Program Files/dotnet" rm -rf "/c/Program Files (x86)/Microsoft Visual Studio/2019" - - name: Get Rust version from rust-toolchain.toml - id: rust-version + - name: Set up Rust toolchain run: | - version=$(awk -F\" '/version/ {print $2}' nautilus_core/rust-toolchain.toml) - echo "Rust toolchain version $version" - echo "RUST_VERSION=$version" >> $GITHUB_ENV - working-directory: ${{ github.workspace }} - - - name: Set up Rust tool-chain (Linux, Windows) stable - uses: actions-rust-lang/setup-rust-toolchain@v1.8 - with: - toolchain: ${{ env.RUST_VERSION }} - components: rustfmt, clippy + rustup toolchain add --profile minimal stable --component clippy,rustfmt - name: Set up Python environment uses: actions/setup-python@v5 @@ -221,7 +201,7 @@ jobs: - name: Get Python version run: | - version=$(python -c "import sys; print('.'.join(map(str, sys.version_info[:3])))") + version=$(bash scripts/python-version.sh) echo "PYTHON_VERSION=$version" >> $GITHUB_ENV - name: Get Poetry version from poetry-version @@ -314,22 +294,10 @@ jobs: sudo rm -rf ~/Library/Developer/Xcode/DerivedData/* sudo rm -rf /Library/Developer/CommandLineTools - - name: Get Rust version from rust-toolchain.toml - id: rust-version + - name: Set up Rust toolchain run: | - version=$(awk -F\" '/version/ {print $2}' nautilus_core/rust-toolchain.toml) - echo "Rust toolchain version $version" - echo "RUST_VERSION=$version" >> $GITHUB_ENV - working-directory: ${{ github.workspace }} - - # Work around as actions-rust-lang does not seem to work on macOS yet - - name: Set up Rust tool-chain (macOS) stable - uses: actions-rs/toolchain@v1 - with: - toolchain: ${{ env.RUST_VERSION }} - override: true - components: rustfmt, clippy - target: aarch64-apple-darwin + rustup toolchain add --profile minimal stable --component clippy,rustfmt + rustup target add aarch64-apple-darwin - name: Set up Python environment uses: actions/setup-python@v5 @@ -338,7 +306,7 @@ jobs: - name: Get Python version run: | - version=$(python -c "import sys; print('.'.join(map(str, sys.version_info[:3])))") + version=$(bash scripts/python-version.sh) echo "PYTHON_VERSION=$version" >> $GITHUB_ENV - name: Get Poetry version from poetry-version diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 85e37719b0f6..b7deec2db5aa 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -52,19 +52,9 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Get Rust version from rust-toolchain.toml - id: rust-version + - name: Set up Rust toolchain run: | - version=$(awk -F\" '/version/ {print $2}' nautilus_core/rust-toolchain.toml) - echo "Rust toolchain version $version" - echo "RUST_VERSION=$version" >> $GITHUB_ENV - working-directory: ${{ github.workspace }} - - - name: Set up Rust tool-chain (Linux, Windows) stable - uses: actions-rust-lang/setup-rust-toolchain@v1.8 - with: - toolchain: ${{ env.RUST_VERSION }} - components: rustfmt, clippy + rustup toolchain add --profile minimal stable --component clippy,rustfmt - name: Set up Python environment uses: actions/setup-python@v5 @@ -73,7 +63,7 @@ jobs: - name: Get Python version run: | - version=$(python -c "import sys; print('.'.join(map(str, sys.version_info[:3])))") + version=$(bash scripts/python-version.sh) echo "PYTHON_VERSION=$version" >> $GITHUB_ENV - name: Get Poetry version from poetry-version diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ffc06038c505..4ec2e4d11481 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -63,21 +63,16 @@ jobs: echo "RUST_VERSION=$version" >> $GITHUB_ENV working-directory: ${{ github.workspace }} - - name: Set up Rust tool-chain (Linux, Windows) stable + - name: Set up Rust toolchain (Linux, Windows) if: (runner.os == 'Linux') || (runner.os == 'Windows') - uses: actions-rust-lang/setup-rust-toolchain@v1.8 - with: - toolchain: ${{ env.RUST_VERSION }} - components: rustfmt, clippy + run: | + rustup toolchain add --profile minimal stable --component clippy,rustfmt - # Work around as actions-rust-lang does not seem to work on macOS yet - - name: Set up Rust tool-chain (macOS) stable + - name: Set up Rust toolchain (macOS) if: runner.os == 'macOS' - uses: actions-rs/toolchain@v1 - with: - toolchain: ${{ env.RUST_VERSION }} - override: true - components: rustfmt, clippy + run: | + rustup toolchain add --profile minimal stable --component clippy,rustfmt + rustup target add aarch64-apple-darwin - name: Set up Python environment uses: actions/setup-python@v5 @@ -128,19 +123,9 @@ jobs: with: fetch-depth: 2 - - name: Get Rust version from rust-toolchain.toml - id: rust-version + - name: Set up Rust toolchain run: | - version=$(awk -F\" '/version/ {print $2}' nautilus_core/rust-toolchain.toml) - echo "Rust toolchain version $version" - echo "RUST_VERSION=$version" >> $GITHUB_ENV - working-directory: ${{ github.workspace }} - - - name: Set up Rust tool-chain - uses: actions-rust-lang/setup-rust-toolchain@v1.8 - with: - toolchain: ${{ env.RUST_VERSION }} - components: rustfmt, clippy + rustup toolchain add --profile minimal stable --component clippy,rustfmt - name: Set up Python environment uses: actions/setup-python@v5 @@ -149,7 +134,7 @@ jobs: - name: Get Python version run: | - version=$(python -c "import sys; print('.'.join(map(str, sys.version_info[:3])))") + version=$(bash scripts/python-version.sh) echo "PYTHON_VERSION=$version" >> $GITHUB_ENV - name: Get Poetry version from poetry-version @@ -227,19 +212,9 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Get Rust version from rust-toolchain.toml - id: rust-version + - name: Set up Rust toolchain run: | - version=$(awk -F\" '/version/ {print $2}' nautilus_core/rust-toolchain.toml) - echo "Rust toolchain version $version" - echo "RUST_VERSION=$version" >> $GITHUB_ENV - working-directory: ${{ github.workspace }} - - - name: Set up Rust tool-chain - uses: actions-rust-lang/setup-rust-toolchain@v1.8 - with: - toolchain: ${{ env.RUST_VERSION }} - components: rustfmt, clippy + rustup toolchain add --profile minimal stable --component clippy,rustfmt - name: Set up Python environment uses: actions/setup-python@v5 @@ -248,7 +223,7 @@ jobs: - name: Get Python version run: | - version=$(python -c "import sys; print('.'.join(map(str, sys.version_info[:3])))") + version=$(bash scripts/python-version.sh) echo "PYTHON_VERSION=$version" >> $GITHUB_ENV - name: Get Poetry version from poetry-version @@ -349,29 +324,16 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Get Rust version from rust-toolchain.toml - id: rust-version - run: | - version=$(awk -F\" '/version/ {print $2}' nautilus_core/rust-toolchain.toml) - echo "Rust toolchain version $version" - echo "RUST_VERSION=$version" >> $GITHUB_ENV - working-directory: ${{ github.workspace }} - - - name: Set up Rust tool-chain (Linux, Windows) stable + - name: Set up Rust toolchain (Linux, Windows) if: (runner.os == 'Linux') || (runner.os == 'Windows') - uses: actions-rust-lang/setup-rust-toolchain@v1.8 - with: - toolchain: ${{ env.RUST_VERSION }} - components: rustfmt, clippy + run: | + rustup toolchain add --profile minimal stable --component clippy,rustfmt - # Work around as actions-rust-lang does not seem to work on macOS yet - - name: Set up Rust tool-chain (macOS) stable + - name: Set up Rust toolchain (macOS) if: runner.os == 'macOS' - uses: actions-rs/toolchain@v1 - with: - toolchain: ${{ env.RUST_VERSION }} - override: true - components: rustfmt, clippy + run: | + rustup toolchain add --profile minimal stable --component clippy,rustfmt + rustup target add aarch64-apple-darwin - name: Set up Python environment uses: actions/setup-python@v5 @@ -380,7 +342,7 @@ jobs: - name: Get Python version run: | - version=$(python -c "import sys; print('.'.join(map(str, sys.version_info[:3])))") + version=$(bash scripts/python-version.sh) echo "PYTHON_VERSION=$version" >> $GITHUB_ENV - name: Get Poetry version from poetry-version diff --git a/nautilus_core/rust-toolchain.toml b/rust-toolchain.toml similarity index 100% rename from nautilus_core/rust-toolchain.toml rename to rust-toolchain.toml diff --git a/scripts/python-version.sh b/scripts/python-version.sh new file mode 100644 index 000000000000..6be32cff606b --- /dev/null +++ b/scripts/python-version.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "$(python --version | cut -d' ' -f2 | tr -d '\n')" From 6f949274cc5db3fca3fe2e64991060863265c62d Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 11 Oct 2024 06:58:09 +1100 Subject: [PATCH 070/224] Update dependencies --- nautilus_core/Cargo.lock | 40 ++-- nautilus_core/infrastructure/Cargo.toml | 2 +- poetry.lock | 261 +++++++++++++----------- 3 files changed, 159 insertions(+), 144 deletions(-) diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 15a8bab888b9..74c939899c2b 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -383,9 +383,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e614738943d3f68c628ae3dbce7c3daffb196665f82f8c8ea6b65de73c79429" +checksum = "998282f8f49ccd6116b0ed8a4de0fbd3151697920e7c7533416d6e25e76434a7" dependencies = [ "bzip2", "flate2", @@ -2399,9 +2399,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "0cb94a0ffd3f3ee755c20f7d8752f45cac88605a4dcf808abcff72873296ec7b" dependencies = [ "wasm-bindgen", ] @@ -3898,9 +3898,9 @@ dependencies = [ [[package]] name = "redis" -version = "0.27.3" +version = "0.27.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92f61607c4c4442b575fbc3f31a5dd4e5dd69cfea8f6afec5b83e24f61c126ab" +checksum = "dc6baebe319ef5e4b470f248335620098d1c2e9261e995be05f56f719ca4bdb2" dependencies = [ "arc-swap", "async-trait", @@ -5604,9 +5604,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "ef073ced962d62984fb38a36e5fdc1a2b23c9e0e1fa0689bb97afa4202ef6887" dependencies = [ "cfg-if", "once_cell", @@ -5615,9 +5615,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "c4bfab14ef75323f4eb75fa52ee0a3fb59611977fd3240da19b2cf36ff85030e" dependencies = [ "bumpalo", "log", @@ -5630,9 +5630,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "65471f79c1022ffa5291d33520cbbb53b7687b01c2f8e83b57d102eed7ed479d" dependencies = [ "cfg-if", "js-sys", @@ -5642,9 +5642,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "a7bec9830f60924d9ceb3ef99d55c155be8afa76954edffbb5936ff4509474e7" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5652,9 +5652,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "4c74f6e152a76a2ad448e223b0fc0b6b5747649c3d769cc6bf45737bf97d0ed6" dependencies = [ "proc-macro2", "quote", @@ -5665,9 +5665,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "a42f6c679374623f295a8623adfe63d9284091245c3504bde47c17a3ce2777d9" [[package]] name = "wasm-streams" @@ -5684,9 +5684,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "44188d185b5bdcae1052d08bcbcf9091a5524038d4572cc4f4f2bb9d5554ddd9" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/nautilus_core/infrastructure/Cargo.toml b/nautilus_core/infrastructure/Cargo.toml index 1d720e3388d8..9028d5d3208b 100644 --- a/nautilus_core/infrastructure/Cargo.toml +++ b/nautilus_core/infrastructure/Cargo.toml @@ -30,7 +30,7 @@ serde_json = { workspace = true } tokio = { workspace = true } tracing = {workspace = true } ustr = { workspace = true } -redis = { version = "0.27.3", features = [ +redis = { version = "0.27.4", features = [ "connection-manager", "keep-alive", "sentinel", diff --git a/poetry.lock b/poetry.lock index 5d8ff6b4412d..5bdd619b25df 100644 --- a/poetry.lock +++ b/poetry.lock @@ -270,133 +270,148 @@ develop = ["coverage (>=5.3)", "flake8 (>=3.8)", "isort (>=5.8)", "mypy (>=0.900 [[package]] name = "bitarray" -version = "2.9.2" +version = "2.9.3" description = "efficient arrays of booleans -- C extension" optional = true python-versions = "*" files = [ - {file = "bitarray-2.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:917905de565d9576eb20f53c797c15ba88b9f4f19728acabec8d01eee1d3756a"}, - {file = "bitarray-2.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b35bfcb08b7693ab4bf9059111a6e9f14e07d57ac93cd967c420db58ab9b71e1"}, - {file = "bitarray-2.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ea1923d2e7880f9e1959e035da661767b5a2e16a45dfd57d6aa831e8b65ee1bf"}, - {file = "bitarray-2.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0b63a565e8a311cc8348ff1262d5784df0f79d64031d546411afd5dd7ef67d"}, - {file = "bitarray-2.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf0620da2b81946d28c0b16f3e3704d38e9837d85ee4f0652816e2609aaa4fed"}, - {file = "bitarray-2.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79a9b8b05f2876c7195a2b698c47528e86a73c61ea203394ff8e7a4434bda5c8"}, - {file = "bitarray-2.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:345c76b349ff145549652436235c5532e5bfe9db690db6f0a6ad301c62b9ef21"}, - {file = "bitarray-2.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e2936f090bf3f4d1771f44f9077ebccdbc0415d2b598d51a969afcb519df505"}, - {file = "bitarray-2.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f9346e98fc2abcef90b942973087e2462af6d3e3710e82938078d3493f7fef52"}, - {file = "bitarray-2.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e6ec283d4741befb86e8c3ea2e9ac1d17416c956d392107e45263e736954b1f7"}, - {file = "bitarray-2.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:962892646599529917ef26266091e4cb3077c88b93c3833a909d68dcc971c4e3"}, - {file = "bitarray-2.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e8da5355d7d75a52df5b84750989e34e39919ec7e59fafc4c104cc1607ab2d31"}, - {file = "bitarray-2.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:603e7d640e54ad764d2b4da6b61e126259af84f253a20f512dd10689566e5478"}, - {file = "bitarray-2.9.2-cp310-cp310-win32.whl", hash = "sha256:f00079f8e69d75c2a417de7961a77612bb77ef46c09bc74607d86de4740771ef"}, - {file = "bitarray-2.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:1bb33673e7f7190a65f0a940c1ef63266abdb391f4a3e544a47542d40a81f536"}, - {file = "bitarray-2.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fe71fd4b76380c2772f96f1e53a524da7063645d647a4fcd3b651bdd80ca0f2e"}, - {file = "bitarray-2.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d527172919cdea1e13994a66d9708a80c3d33dedcf2f0548e4925e600fef3a3a"}, - {file = "bitarray-2.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:052c5073bdcaa9dd10628d99d37a2f33ec09364b86dd1f6281e2d9f8d3db3060"}, - {file = "bitarray-2.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e064caa55a6ed493aca1eda06f8b3f689778bc780a75e6ad7724642ba5dc62f7"}, - {file = "bitarray-2.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:508069a04f658210fdeee85a7a0ca84db4bcc110cbb1d21f692caa13210f24a7"}, - {file = "bitarray-2.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4da73ebd537d75fa7bccfc2228fcaedea0803f21dd9d0bf0d3b67fef3c4af294"}, - {file = "bitarray-2.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cb378eaa65cd43098f11ff5d27e48ee3b956d2c00d2d6b5bfc2a09fe183be47"}, - {file = "bitarray-2.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d14c790b91f6cbcd9b718f88ed737c78939980c69ac8c7f03dd7e60040c12951"}, - {file = "bitarray-2.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7eea9318293bc0ea6447e9ebfba600a62f3428bea7e9c6d42170ae4f481dbab3"}, - {file = "bitarray-2.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b76ffec27c7450b8a334f967366a9ebadaea66ee43f5b530c12861b1a991f503"}, - {file = "bitarray-2.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:76b76a07d4ee611405045c6950a1e24c4362b6b44808d4ad6eea75e0dbc59af4"}, - {file = "bitarray-2.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c7d16beeaaab15b075990cd26963d6b5b22e8c5becd131781514a00b8bdd04bd"}, - {file = "bitarray-2.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60df43e868a615c7e15117a1e1c2e5e11f48f6457280eba6ddf8fbefbec7da99"}, - {file = "bitarray-2.9.2-cp311-cp311-win32.whl", hash = "sha256:e788608ed7767b7b3bbde6d49058bccdf94df0de9ca75d13aa99020cc7e68095"}, - {file = "bitarray-2.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:a23397da092ef0a8cfe729571da64c2fc30ac18243caa82ac7c4f965087506ff"}, - {file = "bitarray-2.9.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:90e3a281ffe3897991091b7c46fca38c2675bfd4399ffe79dfeded6c52715436"}, - {file = "bitarray-2.9.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bed637b674db5e6c8a97a4a321e3e4d73e72d50b5c6b29950008a93069cc64cd"}, - {file = "bitarray-2.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e49066d251dbbe4e6e3a5c3937d85b589e40e2669ad0eef41a00f82ec17d844b"}, - {file = "bitarray-2.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c4344e96642e2211fb3a50558feff682c31563a4c64529a931769d40832ca79"}, - {file = "bitarray-2.9.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aeb60962ec4813c539a59fbd4f383509c7222b62c3fb1faa76b54943a613e33a"}, - {file = "bitarray-2.9.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed0f7982f10581bb16553719e5e8f933e003f5b22f7d25a68bdb30fac630a6ff"}, - {file = "bitarray-2.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c71d1cabdeee0cdda4669168618f0e46b7dace207b29da7b63aaa1adc2b54081"}, - {file = "bitarray-2.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0ef2d0a6f1502d38d911d25609b44c6cc27bee0a4363dd295df78b075041b60"}, - {file = "bitarray-2.9.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6f71d92f533770fb027388b35b6e11988ab89242b883f48a6fe7202d238c61f8"}, - {file = "bitarray-2.9.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ba0734aa300757c924f3faf8148e1b8c247176a0ac8e16aefdf9c1eb19e868f7"}, - {file = "bitarray-2.9.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:d91406f413ccbf4af6ab5ae7bc78f772a95609f9ddd14123db36ef8c37116d95"}, - {file = "bitarray-2.9.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:87abb7f80c0a042f3fe8e5264da1a2756267450bb602110d5327b8eaff7682e7"}, - {file = "bitarray-2.9.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b558ce85579b51a2e38703877d1e93b7728a7af664dd45a34e833534f0b755d"}, - {file = "bitarray-2.9.2-cp312-cp312-win32.whl", hash = "sha256:dac2399ee2889fbdd3472bfc2ede74c34cceb1ccf29a339964281a16eb1d3188"}, - {file = "bitarray-2.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:48a30d718d1a6dfc22a49547450107abe8f4afdf2abdcbe76eb9ed88edc49498"}, - {file = "bitarray-2.9.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2c6be1b651fad8f3adb7a5aa12c65b612cd9b89530969af941844ae680f7d981"}, - {file = "bitarray-2.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5b399ae6ab975257ec359f03b48fc00b1c1cd109471e41903548469b8feae5c"}, - {file = "bitarray-2.9.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b3543c8a1cb286ad105f11c25d8d0f712f41c5c55f90be39f0e5a1376c7d0b0"}, - {file = "bitarray-2.9.2-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:03adaacb79e2fb8f483ab3a67665eec53bb3fd0cd5dbd7358741aef124688db3"}, - {file = "bitarray-2.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ae5b0657380d2581e13e46864d147a52c1e2bbac9f59b59c576e42fa7d10cf0"}, - {file = "bitarray-2.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c1f4bf6ea8eb9d7f30808c2e9894237a96650adfecbf5f3643862dc5982f89e"}, - {file = "bitarray-2.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a8873089be2aa15494c0f81af1209f6e1237d762c5065bc4766c1b84321e1b50"}, - {file = "bitarray-2.9.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:677e67f50e2559efc677a4366707070933ad5418b8347a603a49a070890b19bc"}, - {file = "bitarray-2.9.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:a620d8ce4ea2f1c73c6b6b1399e14cb68c6915e2be3fad5808c2998ed55b4acf"}, - {file = "bitarray-2.9.2-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:64115ccabbdbe279c24c367b629c6b1d3da9ed36c7420129e27c338a3971bfee"}, - {file = "bitarray-2.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5d6fb422772e75385b76ad1c52f45a68bd4efafd8be8d0061c11877be74c4d43"}, - {file = "bitarray-2.9.2-cp36-cp36m-win32.whl", hash = "sha256:852e202875dd6dfd6139ce7ec4e98dac2b17d8d25934dc99900831e81c3adaef"}, - {file = "bitarray-2.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:7dfefdcb0dc6a3ba9936063cec65a74595571b375beabe18742b3d91d087eefd"}, - {file = "bitarray-2.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b306c4cf66912511422060f7f5e1149c8bdb404f8e00e600561b0749fdd45659"}, - {file = "bitarray-2.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a09c4f81635408e3387348f415521d4b94198c562c23330f560596a6aaa26eaf"}, - {file = "bitarray-2.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5361413fd2ecfdf44dc8f065177dc6aba97fa80a91b815586cb388763acf7f8d"}, - {file = "bitarray-2.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e8a9475d415ef1eaae7942df6f780fa4dcd48fce32825eda591a17abba869299"}, - {file = "bitarray-2.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9b87baa7bfff9a5878fcc1bffe49ecde6e647a72a64b39a69cd8a2992a43a34"}, - {file = "bitarray-2.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb6b86cfdfc503e92cb71c68766a24565359136961642504a7cc9faf936d9c88"}, - {file = "bitarray-2.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cd56b8ae87ebc71bcacbd73615098e8a8de952ecbb5785b6b4e2b07da8a06e1f"}, - {file = "bitarray-2.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3fa909cfd675004aed8b4cc9df352415933656e0155a6209d878b7cb615c787e"}, - {file = "bitarray-2.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b069ca9bf728e0c5c5b60e00a89df9af34cc170c695c3bfa3b372d8f40288efb"}, - {file = "bitarray-2.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:6067f2f07a7121749858c7daa93c8774325c91590b3e81a299621e347740c2ae"}, - {file = "bitarray-2.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:321841cdad1dd0f58fe62e80e9c9c7531f8ebf8be93f047401e930dc47425b1e"}, - {file = "bitarray-2.9.2-cp37-cp37m-win32.whl", hash = "sha256:54e16e32e60973bb83c315de9975bc1bcfc9bd50bb13001c31da159bc49b0ca1"}, - {file = "bitarray-2.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:f4dcadb7b8034aa3491ee8f5a69b3d9ba9d7d1e55c3cc1fc45be313e708277f8"}, - {file = "bitarray-2.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c8919fdbd3bb596b104388b56ae4b266eb28da1f2f7dff2e1f9334a21840fe96"}, - {file = "bitarray-2.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb7a9d8a2e400a1026de341ad48e21670a6261a75b06df162c5c39b0d0e7c8f4"}, - {file = "bitarray-2.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6ec84668dd7b937874a2b2c293cd14ba84f37be0d196dead852e0ada9815d807"}, - {file = "bitarray-2.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2de9a31c34e543ae089fd2a5ced01292f725190e379921384f695e2d7184bd3"}, - {file = "bitarray-2.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9521f49ae121a17c0a41e5112249e6fa7f6a571245b1118de81fb86e7c1bc1ce"}, - {file = "bitarray-2.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6cc6545d6d76542aee3d18c1c9485fb7b9812b8df4ebe52c4535ec42081b48f"}, - {file = "bitarray-2.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:856bbe1616425f71c0df5ef2e8755e878d9504d5a531acba58ab4273c52c117a"}, - {file = "bitarray-2.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4bba8042ea6ab331ade91bc435d81ad72fddb098e49108610b0ce7780c14e68"}, - {file = "bitarray-2.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a035da89c959d98afc813e3c62f052690d67cfd55a36592f25d734b70de7d4b0"}, - {file = "bitarray-2.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6d70b1579da7fb71be5a841a1f965d19aca0ef27f629cfc07d06b09aafd0a333"}, - {file = "bitarray-2.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:405b83bed28efaae6d86b6ab287c75712ead0adbfab2a1075a1b7ab47dad4d62"}, - {file = "bitarray-2.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7eb8be687c50da0b397d5e0ab7ca200b5ebb639e79a9f5e285851d1944c94be9"}, - {file = "bitarray-2.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eceb551dfeaf19c609003a69a0cf8264b0efd7abc3791a11dfabf4788daf0d19"}, - {file = "bitarray-2.9.2-cp38-cp38-win32.whl", hash = "sha256:bb198c6ed1edbcdaf3d1fa3c9c9d1cdb7e179a5134ef5ee660b53cdec43b34e7"}, - {file = "bitarray-2.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:648d2f2685590b0103c67a937c2fb9e09bcc8dfb166f0c7c77bd341902a6f5b3"}, - {file = "bitarray-2.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ea816dc8f8e65841a8bbdd30e921edffeeb6f76efe6a1eb0da147b60d539d1cf"}, - {file = "bitarray-2.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4d0e32530f941c41eddfc77600ec89b65184cb909c549336463a738fab3ed285"}, - {file = "bitarray-2.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4a22266fb416a3b6c258bf7f83c9fe531ba0b755a56986a81ad69dc0f3bcc070"}, - {file = "bitarray-2.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc6d3e80dd8239850f2604833ff3168b28909c8a9357abfed95632cccd17e3e7"}, - {file = "bitarray-2.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f135e804986b12bf14f2cd1eb86674c47dea86c4c5f0fa13c88978876b97ebe6"}, - {file = "bitarray-2.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87580c7f7d14f7ec401eda7adac1e2a25e95153e9c339872c8ae61b3208819a1"}, - {file = "bitarray-2.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64b433e26993127732ac7b66a7821b2537c3044355798de7c5fcb0af34b8296f"}, - {file = "bitarray-2.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e497c535f2a9b68c69d36631bf2dba243e05eb343b00b9c7bbdc8c601c6802d"}, - {file = "bitarray-2.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e40b3cb9fa1edb4e0175d7c06345c49c7925fe93e39ef55ecb0bc40c906b0c09"}, - {file = "bitarray-2.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f2f8692f95c9e377eb19ca519d30d1f884b02feb7e115f798de47570a359e43f"}, - {file = "bitarray-2.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f0b84fc50b6dbeced4fa390688c07c10a73222810fb0e08392bd1a1b8259de36"}, - {file = "bitarray-2.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d656ad38c942e38a470ddbce26b5020e08e1a7ea86b8fd413bb9024b5189993a"}, - {file = "bitarray-2.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6ab0f1dbfe5070db98771a56aa14797595acd45a1af9eadfb193851a270e7996"}, - {file = "bitarray-2.9.2-cp39-cp39-win32.whl", hash = "sha256:0a99b23ac845a9ea3157782c97465e6ae026fe0c7c4c1ed1d88f759fd6ea52d9"}, - {file = "bitarray-2.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:9bbcfc7c279e8d74b076e514e669b683f77b4a2a328585b3f16d4c5259c91222"}, - {file = "bitarray-2.9.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:43847799461d8ba71deb4d97b47250c2c2fb66d82cd3cb8b4caf52bb97c03034"}, - {file = "bitarray-2.9.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4f44381b0a4bdf64416082f4f0e7140377ae962c0ced6f983c6d7bbfc034040"}, - {file = "bitarray-2.9.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a484061616fb4b158b80789bd3cb511f399d2116525a8b29b6334c68abc2310f"}, - {file = "bitarray-2.9.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ff9e38356cc803e06134cf8ae9758e836ccd1b793135ef3db53c7c5d71e93bc"}, - {file = "bitarray-2.9.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b44105792fbdcfbda3e26ee88786790fda409da4c71f6c2b73888108cf8f062f"}, - {file = "bitarray-2.9.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7e913098de169c7fc890638ce5e171387363eb812579e637c44261460ac00aa2"}, - {file = "bitarray-2.9.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6fe315355cdfe3ed22ef355b8bdc81a805ca4d0949d921576560e5b227a1112"}, - {file = "bitarray-2.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f708e91fdbe443f3bec2df394ed42328fb9b0446dff5cb4199023ac6499e09fd"}, - {file = "bitarray-2.9.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b7b09489b71f9f1f64c0fa0977e250ec24500767dab7383ba9912495849cadf"}, - {file = "bitarray-2.9.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:128cc3488176145b9b137fdcf54c1c201809bbb8dd30b260ee40afe915843b43"}, - {file = "bitarray-2.9.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:21f21e7f56206be346bdbda2a6bdb2165a5e6a11821f88fd4911c5a6bbbdc7e2"}, - {file = "bitarray-2.9.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f4dd3af86dd8a617eb6464622fb64ca86e61ce99b59b5c35d8cd33f9c30603d"}, - {file = "bitarray-2.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6465de861aff7a2559f226b37982007417eab8c3557543879987f58b453519bd"}, - {file = "bitarray-2.9.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbaf2bb71d6027152d603f1d5f31e0dfd5e50173d06f877bec484e5396d4594b"}, - {file = "bitarray-2.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2f32948c86e0d230a296686db28191b67ed229756f84728847daa0c7ab7406e3"}, - {file = "bitarray-2.9.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be94e5a685e60f9d24532af8fe5c268002e9016fa80272a94727f435de3d1003"}, - {file = "bitarray-2.9.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5cc9381fd54f3c23ae1039f977bfd6d041a5c3c1518104f616643c3a5a73b15"}, - {file = "bitarray-2.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd926e8ae4d1ed1ac4a8f37212a62886292f692bc1739fde98013bf210c2d175"}, - {file = "bitarray-2.9.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:461a3dafb9d5fda0bb3385dc507d78b1984b49da3fe4c6d56c869a54373b7008"}, - {file = "bitarray-2.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:393cb27fd859af5fd9c16eb26b1c59b17b390ff66b3ae5d0dd258270191baf13"}, - {file = "bitarray-2.9.2.tar.gz", hash = "sha256:a8f286a51a32323715d77755ed959f94bef13972e9a2fe71b609e40e6d27957e"}, + {file = "bitarray-2.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2cf5f5400636c7dda797fd681795ce63932458620fe8c40955890380acba9f62"}, + {file = "bitarray-2.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3487b4718ffa5942fab777835ee36085f8dda7ec4bd0b28433efb117f84852b6"}, + {file = "bitarray-2.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10f44b1e4994035408bea54d7bf0aec79744cad709706bedf28091a48bb7f1a4"}, + {file = "bitarray-2.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb5c16f97c65add6535748a9c98c70e7ca79759c38a2eb990127fef72f76111a"}, + {file = "bitarray-2.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13dbfc42971ba84e9c4ba070f720df6570285a3f89187f07ef422efcb611c19f"}, + {file = "bitarray-2.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c28076acfbe7f9a5494d7ae98094a6e209c390c340938845f294818ebf5e4d3"}, + {file = "bitarray-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7cdd21835936d9a66477836ca23b2cb63295142cb9d9158883e2c0f1f8f6bd"}, + {file = "bitarray-2.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f60887ab3a46e507fa6f8544d8d4b0748da48718591dfe3fe80c62bdea60f10"}, + {file = "bitarray-2.9.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f75e1abd4a37cba3002521d3f5e2b50ef4f4a74342207cad3f52468411d5d8ba"}, + {file = "bitarray-2.9.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dc63da9695383c048b83f5ab77eab35a55bbb2e77c7b6e762eba219929b45b84"}, + {file = "bitarray-2.9.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6fe5a57b859d9bc9c2fd27c78c4b7b83158faf984202de6fb44618caeebfff10"}, + {file = "bitarray-2.9.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1fe5a37bd9441a5ecc2f6e71b43df7176fa376a542ef97484310b8b46a45649a"}, + {file = "bitarray-2.9.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8a16e42c169ca818d6a15b5dd5acd5d2a26af0fa0588e1036e0e58d01f8387d4"}, + {file = "bitarray-2.9.3-cp310-cp310-win32.whl", hash = "sha256:5e6b5e7940af3474ffaa930cd1ce8215181cbe864d6b5ddb67a15d3c15e935cd"}, + {file = "bitarray-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:c63dbb99ef2ab1281871678624f9c9a5f1682b826e668ce559275ec488b3fa8b"}, + {file = "bitarray-2.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:49fb93b488d180f5c84b79fe687c585a84bf0295ff035d63e09ee24ce1da0558"}, + {file = "bitarray-2.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c2944fb83bbc2aa7f29a713bc4f8c1318e54fa0d06a72bedd350a3fb4a4b91d8"}, + {file = "bitarray-2.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3612d9d3788dc62f1922c917b1539f1cdf02cecc9faef8ae213a8b36093136ca"}, + {file = "bitarray-2.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90a9300cdb7c99b1e692bb790cba8acecee1a345a83e58e28c94a0d87c522237"}, + {file = "bitarray-2.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1211ed66acbbb221fd7554abf4206a384d79e6192d5cb95325c5c361bbb52a74"}, + {file = "bitarray-2.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67757279386accf93eba76b8f97b5acf1664a3e350cbea5f300f53490f8764fd"}, + {file = "bitarray-2.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64e19c6a99c32f460c2613f797f77aa37d8e298891d00ea5355158cce80e11ec"}, + {file = "bitarray-2.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72734bd3775f43c5a75385730abb9f84fee6c627eb14f579de4be478f1615c8c"}, + {file = "bitarray-2.9.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a92703471b5d3316c7481bc1852f620f42f7a1b62be27f39d13694827635786f"}, + {file = "bitarray-2.9.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d5d77c81300ca430d4b195ccfbb629d6858258f541b6e96c6b11ec1563cd2681"}, + {file = "bitarray-2.9.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3ba8a29c0d091c952ced1607ce715f5e0524899f24333a493807d00f5938463d"}, + {file = "bitarray-2.9.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:418171d035b191dbe5e86cd2bfb5c3e1ae7d947edc22857a897d1c7251674ae5"}, + {file = "bitarray-2.9.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e0bd272eba256183be2a17488f9cb096d2e6d3435ecf2e28c1e0857c6d20749"}, + {file = "bitarray-2.9.3-cp311-cp311-win32.whl", hash = "sha256:cc3fd2b0637a619cf13e122bbcf4729ae214d5f25623675597e67c25f9edfe61"}, + {file = "bitarray-2.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:e1fc2a81a585dbe5e367682156e6350d908a56e2ffd6ca651b0af01994db596f"}, + {file = "bitarray-2.9.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dc47be026f76f1728af00dc7140cec8483fe2f0c476bbf2a59ef47865e00ff96"}, + {file = "bitarray-2.9.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:82b091742ff511cdb06f90af0d2c22e7af3dbff9b8212e2e0d88dfef6a8570b3"}, + {file = "bitarray-2.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d5edb4302a0e3a3d1d0eeb891de3c615d4cb7a446fb41c21eecdcfb29400a6f"}, + {file = "bitarray-2.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4786c5525069c19820549dd2f42d33632bc42959ad167138bd8ee5024b922b"}, + {file = "bitarray-2.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bfe2de2b4df61ccb9244871a0fdf1fff83be0c1bd7187048c3cf7f81c5fe631"}, + {file = "bitarray-2.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:31e4f69538f95d2934587d957eea0d283162322dd1af29e57122b20b8cd60f92"}, + {file = "bitarray-2.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca44908b2bc08d8995770018638d62626706864f9c599b7818225a12f3dbc2c"}, + {file = "bitarray-2.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:279f8de5d251ee521e365df29c927d9b5732f1ed4f373d2dbbd278fcbad94ff5"}, + {file = "bitarray-2.9.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49bb631b38431c09ecd534d56ef04264397d24d18c4ee6653c84e14ae09d92d"}, + {file = "bitarray-2.9.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:192bffc93ee9a5b6c833c98d1dcc81f5633ddd726b85e18341387d0c1d51f691"}, + {file = "bitarray-2.9.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c516cec28c6511df51d87033f40ec420324a2247469b0c989d344f4d27ea37d2"}, + {file = "bitarray-2.9.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:66241cb9a1c1db294f46cd440141e57e8242874e38f3f61877f72d92ae14768a"}, + {file = "bitarray-2.9.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab1f0e7631110c89bea7b605c0c35832333eb9cc97e5de05d71c76d42a1858c9"}, + {file = "bitarray-2.9.3-cp312-cp312-win32.whl", hash = "sha256:42aa5bee6fe8ad3385eaf5c6585016bbc38a7b75efb52ce5c6f8e00e05237dfa"}, + {file = "bitarray-2.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:dc3fd647d845b94fac3652390866f921f914a17f3807a031c826f68dae3f43e3"}, + {file = "bitarray-2.9.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fcfcc1989e3e021a282624017b7fb754210f5332e933b1c3ebc79643727b6551"}, + {file = "bitarray-2.9.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:71b1e229a706798a9e106ca7b03d4c63455deb40b18c92950ec073a05a8f8285"}, + {file = "bitarray-2.9.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4bb49556d3d505d24c942a4206ad4d0d40e89fa3016a7ea6edc994d5c08d4a8e"}, + {file = "bitarray-2.9.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4466aa1e533a59d5f7fd37219d154ec3f2ba73fce3d8a2e11080ec475bc15fb"}, + {file = "bitarray-2.9.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a9b75adc0fd0bf278bea89dc3d679d74e10d2df98d3d074b7f3d36f323138818"}, + {file = "bitarray-2.9.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:701582bbbeac372b1cd8a3c9daf6c2336dc2d22e14373a6271d788bc4f2b6edc"}, + {file = "bitarray-2.9.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ea1f119668bbdbd68008031491515e84441e505163918819994b28f295f762c"}, + {file = "bitarray-2.9.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f400bc18a70bfdb073532c3054ecd78a0e64f96ff7b6140adde5b122580ec2b"}, + {file = "bitarray-2.9.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aacff5656fb3e15cede7d02903da2634d376aa928d7a81ec8df19b0724d7972a"}, + {file = "bitarray-2.9.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8a2ae42a14cbf766d4478d7101da6359b0648dd813e60eb3486ac56ad2f5add3"}, + {file = "bitarray-2.9.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:616698edb547d10f0b960cb9f2e8629c55a420dd4c2b1ab46706f49a1815621d"}, + {file = "bitarray-2.9.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f277c50ba184929dfeed39b6cf9468e3446093521b0aeb52bd54a21ca08f5473"}, + {file = "bitarray-2.9.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:661237739b385c90d8837d5e96b06de093cc6e610236977e198f88f5a979686e"}, + {file = "bitarray-2.9.3-cp313-cp313-win32.whl", hash = "sha256:68acec6c19d798051f178a1197b76f891985f683f95a4b12811b68e58b080f5a"}, + {file = "bitarray-2.9.3-cp313-cp313-win_amd64.whl", hash = "sha256:3055720afdcfd7e8f630fa16db7bed7e55c9d0a1f4756195e3b250e203f3b436"}, + {file = "bitarray-2.9.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:72bf17d0e7d8a4f645655a07999d23e42472cbf2100b8dad7ce26586075241d7"}, + {file = "bitarray-2.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cfd332b5f1ad8c4dc3cc79ecef33c19b42d8d8e6a39fd5c9ecb5855be0b9723"}, + {file = "bitarray-2.9.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5b466ef1e48f25621c9d27e95deb5e33b8656827ed8aa530b972de73870bd1f"}, + {file = "bitarray-2.9.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:938cf26fdaf4d0adfac82d830c025523c5d36ddead0470b735286028231c1784"}, + {file = "bitarray-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0f766669e768ef9a2b23ecfa710b38b6a48da3f91755113c79320b207ae255d"}, + {file = "bitarray-2.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b6337c0c64044f35ddfb241143244aac707a68f34ae31a71dad115f773ccc8b"}, + {file = "bitarray-2.9.3-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:731b59540167f8b2b20f69f487ecee2339fc4657059906a16cb51acac17f89c3"}, + {file = "bitarray-2.9.3-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:4feed0539a9d6432361fc4d3820eea3a81fa631d542f166cf8430aad81a971da"}, + {file = "bitarray-2.9.3-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:eb65c96a42e73f35175ec738d67992ffdf054c20abee3933cfcfa2343fa1187d"}, + {file = "bitarray-2.9.3-cp36-cp36m-musllinux_1_2_s390x.whl", hash = "sha256:4f40ceac94d182de6135759d81289683ff3e4cf0da709bc5826a7fe00d754114"}, + {file = "bitarray-2.9.3-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:5b29f7844080a281635a231a37e99f0bd6f567af6cf19f4f6d212137f99a9cdf"}, + {file = "bitarray-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:947cf522a3b339b73114d12417fd848fa01303dbaa7883ced4c87688dba5637c"}, + {file = "bitarray-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:ea794ea60d514d68777a87a74106110db7a4bbc2c46720e67010e3071afefb95"}, + {file = "bitarray-2.9.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c7bc7cb79dcac8bdce23b305e671c06eaeffb012fa065b8c33bc51df7e1733f0"}, + {file = "bitarray-2.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6380ad0f929ad9220abadd1c9b7234271c4b6ea9c753a88611d489e93a8f2e"}, + {file = "bitarray-2.9.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05f4e2451e2ad450b41ede8440e52c1fd798e81027e1dc2256292ec0787d3bf1"}, + {file = "bitarray-2.9.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7267885c98138f3707c710d5b08eedef150a3e5112c760cfe1200f3366fd7064"}, + {file = "bitarray-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:976957423cb41df8fe0eb811dbb53d8c5ab1ca3beec7a3ca7ff679be44a72714"}, + {file = "bitarray-2.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0ec5141a69f73ed6ff17ea7344d5cc166e087095bfe3661dbb42b519e76aa16"}, + {file = "bitarray-2.9.3-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:218a1b7c0652a3c1020f903ded0f9768c3719fb6d43a6e9d346e985292992d35"}, + {file = "bitarray-2.9.3-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:cf0c9ebf2df280794244e1e12ed626357506ddaa2f0d6f69efe493ae7bbf4bf7"}, + {file = "bitarray-2.9.3-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:c450a04a7e091b57d4c0bd1531648522cd0ef26913ad0e5dea0432ea29b0e5c1"}, + {file = "bitarray-2.9.3-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:a212eb89a50e32ef4969387e44a7410447dc59587615e3966d090edc338a1b85"}, + {file = "bitarray-2.9.3-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:4269232026212ee6b73379b88a578107a6b36a6182307a49d5509686c7495261"}, + {file = "bitarray-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:8a0fb358e6a43f216c3fb0871e2ac14c16563aec363c23bc2fbbb18f6201285d"}, + {file = "bitarray-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:a8368774cdc737eec8fce6f28d0abc095fbc0edccf8fab8d29fddc264b68def9"}, + {file = "bitarray-2.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7d0724a4fef6ded914075a3385ea2d05afdeed567902f83490ed4e7e7e75d9bf"}, + {file = "bitarray-2.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0e11b37c6dff6f41ebc49914628824ceb8c8d6ebd0fda2ebe3c0fe0c63e8621e"}, + {file = "bitarray-2.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:085f4081d72c7468f82f722a9f113e03a1f7a4c132ef4c2a4e680c5d78b7db00"}, + {file = "bitarray-2.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b530b5fbed2900634fbc43f546e384abd72ad9c49795ff5bd6a93cac1aa9c4d8"}, + {file = "bitarray-2.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09ff88e4385967571146fb0d270442de39393d44198f4d108f3350cfd6486f0b"}, + {file = "bitarray-2.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344bb212ddf87db4976a6711d274660a5d887da4fd3faafcdaa092152f85a6d"}, + {file = "bitarray-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc569c96b990f92fd5946d5b50501fee48b01a116a286d1de7961ebd9c6f06f3"}, + {file = "bitarray-2.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2fbbe7938ef8a7abe3e8519fa0578b51d2787f7171d3144e7d373551b5851fd"}, + {file = "bitarray-2.9.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0b5912fab904507b47217509b01aa903d7f98b6e725e490a7f01661f4d9a4fa7"}, + {file = "bitarray-2.9.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:0c836ccfca9cf60927256738ef234dfe500565492eff269610cdd1bca56801d0"}, + {file = "bitarray-2.9.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:af0e4441ebf51c18fc450962f1e201c96f444d63b17cc8dcf7c0b05111bd4486"}, + {file = "bitarray-2.9.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:9e9b57175fb6fe76d7ddd0647e06a25f6e23f4b54b5febf337c5a840ab37dc3b"}, + {file = "bitarray-2.9.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:7f7de81721ae9492926bd067007ac974692182bb83fc8f0ba330a67f37a018bd"}, + {file = "bitarray-2.9.3-cp38-cp38-win32.whl", hash = "sha256:4beafb6b6e344385480df6611fdebfcb3579bbb40636ce1ddf5e72fb744e095f"}, + {file = "bitarray-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:d8eaeca98900bd6f06a29cdef57999813a67d314f661d14901d71e04f4cf9f00"}, + {file = "bitarray-2.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:413965d9d384aef90e58b959f4a39f1d5060b145c26080297b7b4cf23cf38faa"}, + {file = "bitarray-2.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2fbb56f2bb89c3a15304a6c0ea56013dc340a98337d9bbd7fc5c21451dc05f8c"}, + {file = "bitarray-2.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8a84f39f7885627711473872d8fc58fc7a0a1e4ecd9ddf42daf9a3643432742"}, + {file = "bitarray-2.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45147a9c8580e857c1344d15bd49d2b4387777bd582a2ede11be2ba740653f28"}, + {file = "bitarray-2.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed255423dc60c6b2d5c0d90c13dea2962a31929767fdf1c525ab3210269e75c5"}, + {file = "bitarray-2.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f5bd02671ea5c4ad52bbfe0e8e8197b6e8fa85dec1e93a4a05448c19354cc65"}, + {file = "bitarray-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1c99c58f044549c93fb6d4cda22678deccaed19845eaa2e6917b5b7ca058f2d"}, + {file = "bitarray-2.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:921ee87681e32e17d1849e11c96eb6a8a7edaa1269dd26831013daf8546bde05"}, + {file = "bitarray-2.9.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2ed97d8ec40c4658d9f9aa8f26cb473f44fa1dbccba3fa3fbe4a102e38c6a8d7"}, + {file = "bitarray-2.9.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9d7f7db37edb9c50c9aad6a18f2e87dd7dc5ff2a33406821804a03263fedb2ca"}, + {file = "bitarray-2.9.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:292f726cdb9efc744ed0a1d7453c44151526648148a28d9a2495cc7c7b2c62a8"}, + {file = "bitarray-2.9.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2cc94784238782a9376f307b1aa9a85ce77b6eded9f82d2fe062db7fdb02c645"}, + {file = "bitarray-2.9.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5051436b1d318f6ce0df3b2f8a60bfa66a54c1d9e8719d6cb6b448140e7061f2"}, + {file = "bitarray-2.9.3-cp39-cp39-win32.whl", hash = "sha256:a3d436c686ce59fd0b93438ed2c0e1d3e1716e56bce64b874d05b9f49f1ca5d1"}, + {file = "bitarray-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:f168fc45664266a560f2cb28a327041b7f69d4a7faad8ab89e0a1dd7c270a70d"}, + {file = "bitarray-2.9.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ae36787299cff41f212aee33cfe1defee13979a41552665a412b6ca3fa8f7eb8"}, + {file = "bitarray-2.9.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42afe48abb8eeb386d93e7f1165ace1dd027f136a8a31edd2b20bc57a0c071d7"}, + {file = "bitarray-2.9.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451ceecdb86bb95ae101b0d65c8c4524d692ae3666662fef8c89877ce17748c5"}, + {file = "bitarray-2.9.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4d67d3e3de2aede737b12cd75a84963700c941b77b579c14bd05517e05d7a9f"}, + {file = "bitarray-2.9.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2406d13ded84049b4238815a5821e44d6f58ba00fbb6b705b6ef8ccd88be8f03"}, + {file = "bitarray-2.9.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0db944fc2a048020fc940841ef46c0295b045d45a5a582cba69f78962a49a384"}, + {file = "bitarray-2.9.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25c603f141171a7d108773d5136d14e572c473e4cdb3fb464c39c8a138522eb2"}, + {file = "bitarray-2.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86c06b02705305cab0914d209caa24effda81316e2f2555a71a9aa399b75c5a5"}, + {file = "bitarray-2.9.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ddda45b24a802eaaca8f794e6267ff2b62de5fe7b900b76d6f662d95192bebf"}, + {file = "bitarray-2.9.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:81490623950d04870c6dd4d7e6df2eb68dd04eca8bec327895ebee8bbe0cc3c7"}, + {file = "bitarray-2.9.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a9e69ac6a514cc574891c24a50847022dac2fef8c3f4df530f92820a07337755"}, + {file = "bitarray-2.9.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:545c695ee69d26b41351ced4c76244d8b6225669fc0af3652ff8ed5a6b28325d"}, + {file = "bitarray-2.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbb2e6daabd2a64d091ac7460b0c5c5f9268199ae9a8ce32737cf5273987f1fa"}, + {file = "bitarray-2.9.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a969e5cf63144b944ee8d0a0739f53ef1ae54725b5e01258d690a8995d880526"}, + {file = "bitarray-2.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:73bbb9301ac9000f869c51db2cc5fcc6541985d3fcdcfe6e02f90c9e672a00be"}, + {file = "bitarray-2.9.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c07e346926488a85a48542d898f4168f3587ec42379fef0d18be301e08a3f27"}, + {file = "bitarray-2.9.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a26d8a14cd8ee496306f2afac34833502dd1ae826355af309333b6f252b23fe"}, + {file = "bitarray-2.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cef148ed37c892395ca182d6a235524165a9f765f4283d0a1ced891e7c43c67a"}, + {file = "bitarray-2.9.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94f35a8f0c8a50ee98a8bef9a070d0b68ecf623f20a2148cc039aba5557346a6"}, + {file = "bitarray-2.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b03207460daae828e2743874c84264e8d96a8c6156490279092b624cd5d2de08"}, + {file = "bitarray-2.9.3.tar.gz", hash = "sha256:9eff55cf189b0c37ba97156a00d640eb7392db58a8049be6f26ff2712b93fa89"}, ] [[package]] From 44400412b8b2f1af25688a412a448338e8852531 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 11 Oct 2024 07:29:27 +1100 Subject: [PATCH 071/224] Add download-wheel script --- scripts/download-wheel.sh | 55 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 scripts/download-wheel.sh diff --git a/scripts/download-wheel.sh b/scripts/download-wheel.sh new file mode 100644 index 000000000000..95039c9246d4 --- /dev/null +++ b/scripts/download-wheel.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +# Set variables +REPO="nautechsystems/nautilus_trader" +PYTHON_VERSION="cp311" # Specify Python version (either "cp311" or "cp312") +WORKFLOW_NAME="build-wheels.yml" +GITHUB_API_URL="https://api.github.com" +TOKEN="${GITHUB_TOKEN}" # Assumes you have a GitHub PAT set in the 'GITHUB_TOKEN' env var + +# Check if TOKEN is set +if [[ -z "$TOKEN" ]]; then + echo "Error: The 'GITHUB_TOKEN' environment variable is not set. Set it with a GitHub personal access token." + exit 1 +fi + +# Fetch the latest successful workflow run for the specified workflow +workflow_run_id=$(curl -s -H "Authorization: token $TOKEN" "${GITHUB_API_URL}/repos/${REPO}/actions/workflows/${WORKFLOW_NAME}/runs?status=success" | + grep '"id":' | head -n 1 | awk '{print $2}' | tr -d ',') + +if [[ -z "$workflow_run_id" ]]; then + echo "Error: No successful workflow run found." + exit 1 +fi + +echo "Latest successful workflow run ID: $workflow_run_id" + +# Fetch the list of artifacts for the latest successful workflow run and print all artifact names +echo "Fetching artifacts for workflow run $workflow_run_id..." + +artifacts=$(curl -s -H "Authorization: token $TOKEN" "${GITHUB_API_URL}/repos/${REPO}/actions/runs/${workflow_run_id}/artifacts") +echo "Artifacts returned by API:" +echo "$artifacts" | grep '"name":' + +# Try to find the artifact matching the specified Python version +artifact_name=$(echo "$artifacts" | grep "\"name\": \"nautilus_trader-.*-${PYTHON_VERSION}-.*whl\"" | awk -F'"' '{print $4}') + +# Debugging: Print the artifact name that we're trying to find +echo "Trying to find artifact with name matching: nautilus_trader-.*-${PYTHON_VERSION}-.*whl" +echo "Found artifact: $artifact_name" + +# Fetch the archive_download_url directly from the artifacts response +artifact_url=$(echo "$artifacts" | grep -A 5 "\"name\": \"$artifact_name\"" | grep '"archive_download_url":' | awk -F'"' '{print $4}') + +if [[ -z "$artifact_url" ]]; then + echo "Error: No artifact URL found for artifact $artifact_name." + exit 1 +fi + +echo "Artifact URL: $artifact_url" + +# Download the artifact as a zip file +echo "Downloading artifact as zip: $artifact_name.zip" +curl -L -H "Authorization: token $TOKEN" -o "$artifact_name.zip" "$artifact_url" + +echo "Downloaded artifact to $artifact_name.zip" From 8a2858d0e72516aeae89cf0b32a257f18f06ddd5 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 11 Oct 2024 08:26:01 +1100 Subject: [PATCH 072/224] Cleanup release workflow --- .github/workflows/release.yml | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4ec2e4d11481..584e5d4f4060 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -48,21 +48,9 @@ jobs: rm -rf "/c/Program Files/dotnet" rm -rf "/c/Program Files (x86)/Microsoft Visual Studio/2019" - - name: Install nasm dependency (Windows) - uses: ilammy/setup-nasm@v1 - if: runner.os == 'Windows' - - name: Checkout repository uses: actions/checkout@v4 - - name: Get Rust version from rust-toolchain.toml - id: rust-version - run: | - version=$(awk -F\" '/version/ {print $2}' nautilus_core/rust-toolchain.toml) - echo "Rust toolchain version $version" - echo "RUST_VERSION=$version" >> $GITHUB_ENV - working-directory: ${{ github.workspace }} - - name: Set up Rust toolchain (Linux, Windows) if: (runner.os == 'Linux') || (runner.os == 'Windows') run: | @@ -313,10 +301,6 @@ jobs: rm -rf "/c/Program Files/dotnet" rm -rf "/c/Program Files (x86)/Microsoft Visual Studio/2019" - - name: Install nasm dependency (Windows) - uses: ilammy/setup-nasm@v1 - if: runner.os == 'Windows' - - name: Install runner dependencies (Linux) if: runner.os == 'Linux' run: sudo apt-get install -y curl clang git libssl-dev make pkg-config From 730e631541cd88d6d7b1139e449923671875eb39 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 11 Oct 2024 09:37:37 +1100 Subject: [PATCH 073/224] Add TardisCSVDataLoader --- RELEASES.md | 4 +- nautilus_core/adapters/src/tardis/csv.rs | 27 +- nautilus_core/adapters/src/tardis/parse.rs | 10 +- .../adapters/src/tardis/python/csv.rs | 7 +- nautilus_core/pyo3/src/lib.rs | 6 + nautilus_trader/adapters/tardis/loaders.py | 136 +- nautilus_trader/core/nautilus_pyo3.pyi | 13 + .../adapters/tardis/test_loaders.py | 103 +- tests/test_data/tardis/quotes.csv | 10000 ---------------- tests/test_data/tardis/trades.csv | 10000 ---------------- 10 files changed, 192 insertions(+), 20114 deletions(-) delete mode 100644 tests/test_data/tardis/quotes.csv delete mode 100644 tests/test_data/tardis/trades.csv diff --git a/RELEASES.md b/RELEASES.md index 37cb9b4bd229..6c636dd476b9 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -3,6 +3,7 @@ Released on TBD (UTC). ### Enhancements +- Added `TardisCSVDataLoader` for loading data from Tardis format CSV files as either legacy Cython or pyo3 objects - Added `Clock.timestamp_us()` method for UNIX timestamps in microseconds (μs) - Added support for `bbo-1s` and `bbo-1m` quote schemas for Databento adapter (#1990), thanks @faysou - Added validation for venue `book_type` configuration vs data (prevents an issue where top-of-book data is used when order book data is expected) @@ -19,7 +20,8 @@ Released on TBD (UTC). - Standardized log and error message syntax in Rust ### Breaking Changes -None +- Removed legacy `TardisQuoteDataLoader` (now redundant with new Rust implemented loader) +- Removed legacy `TardisTradeDataLoader` (now redundant with new Rust implemented loader) ### Fixes - Fixed `SocketClient` TLS implementation diff --git a/nautilus_core/adapters/src/tardis/csv.rs b/nautilus_core/adapters/src/tardis/csv.rs index d0679633b5be..9591b7768296 100644 --- a/nautilus_core/adapters/src/tardis/csv.rs +++ b/nautilus_core/adapters/src/tardis/csv.rs @@ -458,6 +458,7 @@ pub fn load_trade_ticks>( //////////////////////////////////////////////////////////////////////////////// #[cfg(test)] mod tests { + use nautilus_model::{enums::BookAction, identifiers::InstrumentId}; use nautilus_test_kit::{ common::{get_project_testdata_path, get_testdata_large_checksums_filepath}, files::ensure_file_exists_or_download_http, @@ -477,7 +478,19 @@ mod tests { let deltas = load_deltas(filepath, 1, 0, Some(1_000)).unwrap(); - assert_eq!(deltas.len(), 1_000) + assert_eq!(deltas.len(), 1_000); + assert_eq!( + deltas[0].instrument_id, + InstrumentId::from("BTC-PERPETUAL.DERIBIT") + ); + assert_eq!(deltas[0].action, BookAction::Add); + assert_eq!(deltas[0].order.side, OrderSide::Sell); + assert_eq!(deltas[0].order.price, Price::from("6421.5")); + assert_eq!(deltas[0].order.size, Quantity::from("18640")); + assert_eq!(deltas[0].flags, 0); + assert_eq!(deltas[0].sequence, 0); + assert_eq!(deltas[0].ts_event, 1585699200245000000); + assert_eq!(deltas[0].ts_init, 1585699200355684000); } #[rstest] @@ -491,7 +504,8 @@ mod tests { let depths = load_depth10_from_snapshot5(filepath, 1, 0, Some(1_000)).unwrap(); - assert_eq!(depths.len(), 1_000) + assert_eq!(depths.len(), 1_000); + // TODO: Assert every field } #[rstest] @@ -505,7 +519,8 @@ mod tests { let depths = load_depth10_from_snapshot25(filepath, 1, 0, Some(1_000)).unwrap(); - assert_eq!(depths.len(), 1_000) + assert_eq!(depths.len(), 1_000); + // TODO: Assert every field } #[rstest] @@ -519,7 +534,8 @@ mod tests { let quotes = load_quote_ticks(filepath, 1, 0, Some(1_000)).unwrap(); - assert_eq!(quotes.len(), 1_000) + assert_eq!(quotes.len(), 1_000); + // TODO: Assert every field } #[rstest] @@ -533,6 +549,7 @@ mod tests { let trades = load_trade_ticks(filepath, 1, 0, Some(1_000)).unwrap(); - assert_eq!(trades.len(), 1_000) + assert_eq!(trades.len(), 1_000); + // TODO: Assert every field } } diff --git a/nautilus_core/adapters/src/tardis/parse.rs b/nautilus_core/adapters/src/tardis/parse.rs index 932094d4bca0..4bb0bb28352a 100644 --- a/nautilus_core/adapters/src/tardis/parse.rs +++ b/nautilus_core/adapters/src/tardis/parse.rs @@ -24,7 +24,7 @@ use nautilus_model::{ /// Parse an instrument ID from the given venue and symbol values. pub fn parse_instrument_id(exchange: &str, symbol: &str) -> InstrumentId { let venue = exchange.split('-').next().unwrap_or(exchange); - InstrumentId::from_str(&format!("{}.{}", symbol, venue)) + InstrumentId::from_str(&format!("{}.{}", symbol, venue).to_uppercase()) .expect("Failed to parse `instrument_id`") } @@ -73,10 +73,10 @@ mod tests { use super::*; #[rstest] - #[case("okex-futures", "BTC-USD-200313", "BTC-USD-200313.okex")] - #[case("binance", "ETH-USDT", "ETH-USDT.binance")] - #[case("bitmex-perp", "XBTUSD", "XBTUSD.bitmex")] - #[case("exchange-with-hyphen", "FOO-BAR", "FOO-BAR.exchange")] + #[case("okex-futures", "BTC-USD-200313", "BTC-USD-200313.OKEX")] + #[case("binance", "ETH-USDT", "ETH-USDT.BINANCE")] + #[case("bitmex-perp", "XBTUSD", "XBTUSD.BITMEX")] + #[case("exchange-with-hyphen", "FOO-BAR", "FOO-BAR.EXCHANGE")] fn test_parse_instrument_id( #[case] exchange: &str, #[case] symbol: &str, diff --git a/nautilus_core/adapters/src/tardis/python/csv.rs b/nautilus_core/adapters/src/tardis/python/csv.rs index 89a4488f7080..0633a4ff770e 100644 --- a/nautilus_core/adapters/src/tardis/python/csv.rs +++ b/nautilus_core/adapters/src/tardis/python/csv.rs @@ -17,7 +17,7 @@ use std::path::PathBuf; use nautilus_core::{ffi::cvec::CVec, python::to_pyvalue_err}; use nautilus_model::data::{ - delta::OrderBookDelta, depth::OrderBookDepth10, quote::QuoteTick, trade::TradeTick, + delta::OrderBookDelta, depth::OrderBookDepth10, quote::QuoteTick, trade::TradeTick, Data, }; use pyo3::{prelude::*, types::PyCapsule}; @@ -48,6 +48,7 @@ pub fn py_load_tardis_deltas_as_pycapsule( ) -> PyResult { let deltas = load_deltas(filepath, price_precision, size_precision, limit).map_err(to_pyvalue_err)?; + let deltas: Vec = deltas.into_iter().map(Data::Delta).collect(); let cvec: CVec = deltas.into(); let capsule = PyCapsule::new_bound::(py, cvec, None)?; @@ -77,6 +78,7 @@ pub fn py_load_tardis_depth10_from_snapshot5_as_pycapsule( ) -> PyResult { let depths = load_depth10_from_snapshot5(filepath, price_precision, size_precision, limit) .map_err(to_pyvalue_err)?; + let depths: Vec = depths.into_iter().map(Data::Depth10).collect(); let cvec: CVec = depths.into(); let capsule = PyCapsule::new_bound::(py, cvec, None)?; @@ -106,6 +108,7 @@ pub fn py_load_tardis_depth10_from_snapshot25_as_pycapsule( ) -> PyResult { let depths = load_depth10_from_snapshot25(filepath, price_precision, size_precision, limit) .map_err(to_pyvalue_err)?; + let depths: Vec = depths.into_iter().map(Data::Depth10).collect(); let cvec: CVec = depths.into(); let capsule = PyCapsule::new_bound::(py, cvec, None)?; @@ -134,6 +137,7 @@ pub fn py_load_tardis_quotes_as_pycapsule( ) -> PyResult { let quotes = load_quote_ticks(filepath, price_precision, size_precision, limit) .map_err(to_pyvalue_err)?; + let quotes: Vec = quotes.into_iter().map(Data::Quote).collect(); let cvec: CVec = quotes.into(); let capsule = PyCapsule::new_bound::(py, cvec, None)?; @@ -162,6 +166,7 @@ pub fn py_load_tardis_trades_as_pycapsule( ) -> PyResult { let trades = load_trade_ticks(filepath, price_precision, size_precision, limit) .map_err(to_pyvalue_err)?; + let trades: Vec = trades.into_iter().map(Data::Trade).collect(); let cvec: CVec = trades.into(); let capsule = PyCapsule::new_bound::(py, cvec, None)?; diff --git a/nautilus_core/pyo3/src/lib.rs b/nautilus_core/pyo3/src/lib.rs index 1aee35b2350d..7bdb012e5584 100644 --- a/nautilus_core/pyo3/src/lib.rs +++ b/nautilus_core/pyo3/src/lib.rs @@ -107,6 +107,12 @@ fn nautilus_pyo3(py: Python<'_>, m: &PyModule) -> PyResult<()> { sys_modules.set_item(format!("{module_name}.{n}"), m.getattr(n)?)?; re_export_module_attributes(m, n)?; + let n = "tardis"; + let submodule = pyo3::wrap_pymodule!(nautilus_adapters::tardis::python::tardis); + m.add_wrapped(submodule)?; + sys_modules.set_item(format!("{module_name}.{n}"), m.getattr(n)?)?; + re_export_module_attributes(m, n)?; + Ok(()) } diff --git a/nautilus_trader/adapters/tardis/loaders.py b/nautilus_trader/adapters/tardis/loaders.py index ea23264ac29a..903fcb0b46d6 100644 --- a/nautilus_trader/adapters/tardis/loaders.py +++ b/nautilus_trader/adapters/tardis/loaders.py @@ -13,81 +13,115 @@ # limitations under the License. # ------------------------------------------------------------------------------------------------- -from datetime import datetime from os import PathLike +from pathlib import Path -import pandas as pd +from nautilus_trader.core import nautilus_pyo3 +from nautilus_trader.core.nautilus_pyo3 import drop_cvec_pycapsule +from nautilus_trader.model.data import OrderBookDelta +from nautilus_trader.model.data import TradeTick +from nautilus_trader.model.data import capsule_to_list -def _ts_parser(time_in_secs: str) -> datetime: - return datetime.utcfromtimestamp(int(time_in_secs) / 1_000_000.0) - - -class TardisTradeDataLoader: +class TardisCSVDataLoader: """ - Provides a means of loading trade data pandas DataFrames from Tardis CSV files. + Provides a means of loading data from CSV files in Tardis format. """ - @staticmethod - def load(file_path: PathLike[str] | str) -> pd.DataFrame: + def __init__(self, price_precision: int, size_precision: int) -> None: + self._price_precision = price_precision + self._size_precision = size_precision + + def load_deltas( + self, + filepath: PathLike[str] | str, + as_legacy_cython: bool = True, + limit: int | None = None, + ) -> list[OrderBookDelta] | list[nautilus_pyo3.OrderBookDelta]: """ - Return the trade pandas.DataFrame loaded from the given csv file. + Load order book deltas data from the given `filepath`. Parameters ---------- - file_path : str, path object or file-like object - The path to the CSV file. + filepath : PathLike[str] | str + The path for the CSV data file (must be Tardis trades format). + as_legacy_cython : bool, True + If data should be converted to 'legacy Cython' objects. + You would typically only set this False if passing the objects + directly to a data catalog for the data to then be written in Nautilus Parquet format. + limit : int, optional + The limit for the number of records to read. Returns ------- - pd.DataFrame + list[OrderBookDelta] | list[nautilus_pyo3.OrderBookDelta] """ - df = pd.read_csv(file_path) - df["local_timestamp"] = df["local_timestamp"].apply(_ts_parser) - df = df.set_index("local_timestamp") - - df = df.rename(columns={"id": "trade_id", "amount": "quantity"}) - df["side"] = df.side.str.upper() - df = df[["symbol", "trade_id", "price", "quantity", "side"]] - - assert isinstance(df, pd.DataFrame) - - return df - - -class TardisQuoteDataLoader: - """ - Provides a means of loading quote tick data pandas DataFrames from Tardis CSV files. - """ + if isinstance(filepath, Path): + filepath = str(filepath.resolve()) + + if as_legacy_cython: + capsule = nautilus_pyo3.load_tardis_deltas_as_pycapsule( + filepath=str(filepath), + price_precision=self._price_precision, + size_precision=self._size_precision, + limit=limit, + ) + data = capsule_to_list(capsule) + # Drop encapsulated `CVec` as data is now transferred + drop_cvec_pycapsule(capsule) + return data + + return nautilus_pyo3.load_tardis_deltas( + filepath=str(filepath), + price_precision=self._price_precision, + size_precision=self._size_precision, + limit=limit, + ) - @staticmethod - def load(file_path: PathLike[str] | str) -> pd.DataFrame: + def load_trades( + self, + filepath: PathLike[str] | str, + as_legacy_cython: bool = True, + limit: int | None = None, + ) -> list[TradeTick] | list[nautilus_pyo3.TradeTick]: """ - Return the quote pandas.DataFrame loaded from the given csv file. + Load trade ticks data from the given `filepath`. Parameters ---------- - file_path : str, path object or file-like object - The path to the CSV file. + filepath : PathLike[str] | str + The path for the CSV data file (must be Tardis trades format). + as_legacy_cython : bool, True + If data should be converted to 'legacy Cython' objects. + You would typically only set this False if passing the objects + directly to a data catalog for the data to then be written in Nautilus Parquet format. + limit : int, optional + The limit for the number of records to read. Returns ------- - pd.DataFrame + list[TradeTick] | list[nautilus_pyo3.TradeTick] """ - df = pd.read_csv(file_path) - df["local_timestamp"] = df["local_timestamp"].apply(_ts_parser) - df = df.set_index("local_timestamp") - - df = df.rename( - columns={ - "ask_amount": "ask_size", - "bid_amount": "bid_size", - }, + if isinstance(filepath, Path): + filepath = str(filepath.resolve()) + + if as_legacy_cython: + capsule = nautilus_pyo3.load_tardis_trades_as_pycapsule( + filepath=str(filepath), + price_precision=self._price_precision, + size_precision=self._size_precision, + limit=limit, + ) + data = capsule_to_list(capsule) + # Drop encapsulated `CVec` as data is now transferred + drop_cvec_pycapsule(capsule) + return data + + return nautilus_pyo3.load_tardis_trades( + filepath=str(filepath), + price_precision=self._price_precision, + size_precision=self._size_precision, + limit=limit, ) - - df = df[["bid_price", "ask_price", "bid_size", "ask_size"]] - assert isinstance(df, pd.DataFrame) - - return df diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index 093917d80392..707b6ec1f215 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -3958,10 +3958,23 @@ class DatabentoLiveClient: def close(self) -> None: ... # Crypto + def hmac_sign(secret: str, data: str) -> str: ... def rsa_signature(private_key_pem: str, data: str) -> str: ... def ed25519_signature(private_key: bytes, data: str) -> str: ... +# Tardis + +def load_tardis_deltas(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> list[OrderBookDelta]: ... +def load_tardis_depth10_from_snapshot5(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> list[OrderBookDepth10]: ... # noqa +def load_tardis_depth10_from_snapshot25(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> list[OrderBookDepth10]: ... # noqa +def load_tardis_quotes(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> list[QuoteTick]: ... +def load_tardis_trades(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> list[TradeTick]: ... +def load_tardis_deltas_as_pycapsule(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> object: ... +def load_tardis_depth10_from_snapshot5_as_pycapsule(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> object: ... +def load_tardis_depth10_from_snapshot25_as_pycapsule(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> object: ... # noqa +def load_tardis_quotes_as_pycapsule(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> object: ... +def load_tardis_trades_as_pycapsule(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> object: ... # Greeks diff --git a/tests/integration_tests/adapters/tardis/test_loaders.py b/tests/integration_tests/adapters/tardis/test_loaders.py index b2e878ba76e8..227d6dce1a78 100644 --- a/tests/integration_tests/adapters/tardis/test_loaders.py +++ b/tests/integration_tests/adapters/tardis/test_loaders.py @@ -13,74 +13,75 @@ # limitations under the License. # ------------------------------------------------------------------------------------------------- -from nautilus_trader.adapters.tardis.loaders import TardisQuoteDataLoader -from nautilus_trader.adapters.tardis.loaders import TardisTradeDataLoader +from nautilus_trader.adapters.tardis.loaders import TardisCSVDataLoader +from nautilus_trader.core import nautilus_pyo3 from nautilus_trader.model.enums import AggressorSide +from nautilus_trader.model.enums import BookAction +from nautilus_trader.model.enums import OrderSide +from nautilus_trader.model.identifiers import InstrumentId from nautilus_trader.model.identifiers import TradeId from nautilus_trader.model.objects import Price from nautilus_trader.model.objects import Quantity -from nautilus_trader.persistence.wranglers import QuoteTickDataWrangler -from nautilus_trader.persistence.wranglers import TradeTickDataWrangler -from nautilus_trader.test_kit.providers import TestInstrumentProvider from tests import TEST_DATA_DIR -def test_tardis_quote_data_loader(): - # Arrange, Act - path = TEST_DATA_DIR / "tardis/quotes.csv" - ticks = TardisQuoteDataLoader.load(path) - - # Assert - assert len(ticks) == 9999 - - -def test_pre_process_with_quote_tick_data(): +def test_tardis_load_deltas(): # Arrange - instrument = TestInstrumentProvider.btcusdt_binance() - wrangler = QuoteTickDataWrangler(instrument=instrument) - path = TEST_DATA_DIR / "tardis/quotes.csv" - data = TardisQuoteDataLoader.load(path) - - # Act - ticks = wrangler.process( - data, - ts_init_delta=1_000_501, + filepath = ( + TEST_DATA_DIR + / "large" + / "tardis_deribit_incremental_book_L2_2020-04-01_BTC-PERPETUAL.csv.gz" + ) + checksums = TEST_DATA_DIR / "large" / "checksums.json" + url = ( + "https://datasets.tardis.dev/v1/deribit/incremental_book_L2/2020/04/01/BTC-PERPETUAL.csv.gz" + ) + nautilus_pyo3.ensure_file_exists_or_download_http( + str(filepath.resolve()), + url, + str(checksums.resolve()), ) - # Assert - assert len(ticks) == 9999 - assert ticks[0].bid_price == Price.from_str("9681.92") - assert ticks[0].ask_price == Price.from_str("9682.00") - assert ticks[0].bid_size == Quantity.from_str("0.670000") - assert ticks[0].ask_size == Quantity.from_str("0.840000") - assert ticks[0].ts_event == 1582329603502092000 - assert ticks[0].ts_init == 1582329603503092501 - + loader = TardisCSVDataLoader(price_precision=1, size_precision=0) -def test_tardis_trade_tick_loader(): - # Arrange, Act - path = TEST_DATA_DIR / "tardis/trades.csv" - ticks = TardisTradeDataLoader.load(path) + # Act + deltas = loader.load_deltas(filepath, limit=1_000) # Assert - assert len(ticks) == 9999 + assert len(deltas) == 1_000 + assert deltas[0].instrument_id == InstrumentId.from_str("BTC-PERPETUAL.DERIBIT") + assert deltas[0].action == BookAction.ADD + assert deltas[0].order.side == OrderSide.SELL + assert deltas[0].order.price == Price.from_str("6421.5") + assert deltas[0].order.size == Quantity.from_str("18640") + assert deltas[0].flags == 0 + assert deltas[0].sequence == 0 + assert deltas[0].ts_event == 1585699200245000000 + assert deltas[0].ts_init == 1585699200355684000 -def test_pre_process_with_trade_tick_data(): +def test_tardis_load_trades(): # Arrange - instrument = TestInstrumentProvider.btcusdt_binance() - wrangler = TradeTickDataWrangler(instrument=instrument) - path = TEST_DATA_DIR / "tardis/trades.csv" - data = TardisTradeDataLoader.load(path) + filepath = TEST_DATA_DIR / "large" / "tardis_bitmex_trades_2020-03-01_XBTUSD.csv.gz" + checksums = TEST_DATA_DIR / "large" / "checksums.json" + url = "https://datasets.tardis.dev/v1/bitmex/trades/2020/03/01/XBTUSD.csv.gz" + nautilus_pyo3.ensure_file_exists_or_download_http( + str(filepath.resolve()), + url, + str(checksums.resolve()), + ) + + loader = TardisCSVDataLoader(price_precision=1, size_precision=0) # Act - ticks = wrangler.process(data) + trades = loader.load_trades(filepath, limit=1_000) # Assert - assert len(ticks) == 9999 - assert ticks[0].price == Price.from_str("9682.00") - assert ticks[0].size == Quantity.from_str("0.132000") - assert ticks[0].aggressor_side == AggressorSide.BUYER - assert ticks[0].trade_id == TradeId("42377944") - assert ticks[0].ts_event == 1582329602418379000 - assert ticks[0].ts_init == 1582329602418379000 + assert len(trades) == 1_000 + assert trades[0].instrument_id == InstrumentId.from_str("XBTUSD.BITMEX") + assert trades[0].price == Price.from_str("8531.5") + assert trades[0].size == Quantity.from_str("2152") + assert trades[0].aggressor_side == AggressorSide.SELLER + assert trades[0].trade_id == TradeId("ccc3c1fa-212c-e8b0-1706-9b9c4f3d5ecf") + assert trades[0].ts_event == 1583020803145000000 + assert trades[0].ts_init == 1583020803307160000 diff --git a/tests/test_data/tardis/quotes.csv b/tests/test_data/tardis/quotes.csv deleted file mode 100644 index 75bd87ede49b..000000000000 --- a/tests/test_data/tardis/quotes.csv +++ /dev/null @@ -1,10000 +0,0 @@ -exchange,symbol,timestamp,local_timestamp,ask_amount,ask_price,bid_price,bid_amount -binance-futures,BTCUSDT,1582329601096000,1582329603502092,0.84,9682,9681.92,0.67 -binance-futures,BTCUSDT,1582329603401000,1582329603522418,0.84,9682,9681.83,0.003 -binance-futures,BTCUSDT,1582329603542000,1582329603663688,0.84,9682,9681.44,0.363 -binance-futures,BTCUSDT,1582329603611000,1582329603729552,0.84,9682,9681.42,0.031 -binance-futures,BTCUSDT,1582329603688000,1582329603807376,0.84,9682,9681.42,3.681 -binance-futures,BTCUSDT,1582329603712000,1582329603832326,0.84,9682,9681.43,0.67 -binance-futures,BTCUSDT,1582329603730000,1582329603850262,0.84,9682,9681.43,4.62 -binance-futures,BTCUSDT,1582329603741000,1582329603861054,0.84,9682,9681.46,0.363 -binance-futures,BTCUSDT,1582329603759000,1582329603884818,0.84,9682,9681.46,3.963 -binance-futures,BTCUSDT,1582329603790000,1582329603924017,0.84,9682,9681.48,0.363 -binance-futures,BTCUSDT,1582329603826000,1582329603946691,0.84,9682,9681.48,3.963 -binance-futures,BTCUSDT,1582329603842000,1582329603965117,0.84,9682,9681.49,0.67 -binance-futures,BTCUSDT,1582329603883000,1582329604008036,1.487,9681.5,9681.49,0.67 -binance-futures,BTCUSDT,1582329603886000,1582329604008093,12.197,9681.5,9681.49,0.67 -binance-futures,BTCUSDT,1582329603952000,1582329604071653,11.126,9681.5,9681.49,0.67 -binance-futures,BTCUSDT,1582329603954000,1582329604074173,10.71,9681.5,9681.49,0.67 -binance-futures,BTCUSDT,1582329603954000,1582329604074200,0.84,9682,9681.49,0.67 -binance-futures,BTCUSDT,1582329603966000,1582329604091369,0.84,9682,9681.53,4.68 -binance-futures,BTCUSDT,1582329604001000,1582329604122717,0.84,9682,9681.54,0.67 -binance-futures,BTCUSDT,1582329604012000,1582329604136344,0.84,9682,9681.57,2 -binance-futures,BTCUSDT,1582329604034000,1582329604154358,0.84,9682,9681.57,4.55 -binance-futures,BTCUSDT,1582329604043000,1582329604163959,0.84,9682,9681.58,0.363 -binance-futures,BTCUSDT,1582329604047000,1582329604168807,0.84,9682,9681.58,0.374 -binance-futures,BTCUSDT,1582329604049000,1582329604169507,0.84,9682,9681.58,0.377 -binance-futures,BTCUSDT,1582329604051000,1582329604171103,0.84,9682,9681.58,0.393 -binance-futures,BTCUSDT,1582329604061000,1582329604182592,0.84,9682,9681.62,2 -binance-futures,BTCUSDT,1582329604065000,1582329604188278,0.84,9682,9681.62,1.999 -binance-futures,BTCUSDT,1582329604077000,1582329604199808,0.84,9682,9681.63,0.363 -binance-futures,BTCUSDT,1582329604095000,1582329604223047,0.84,9682,9681.63,1.033 -binance-futures,BTCUSDT,1582329604126000,1582329604254853,0.84,9682,9681.81,0.363 -binance-futures,BTCUSDT,1582329604157000,1582329604281728,0.84,9682,9681.58,0.03 -binance-futures,BTCUSDT,1582329604241000,1582329604362272,0.84,9682,9681.59,0.67 -binance-futures,BTCUSDT,1582329604269000,1582329604409444,0.84,9682,9681.58,0.03 -binance-futures,BTCUSDT,1582329604278000,1582329604414287,0.84,9682,9681.6,0.363 -binance-futures,BTCUSDT,1582329604310000,1582329604430120,0.84,9682,9681.58,0.03 -binance-futures,BTCUSDT,1582329604312000,1582329604433766,0.84,9682,9681.58,0.014 -binance-futures,BTCUSDT,1582329604314000,1582329604435233,0.84,9682,9681.58,0.011 -binance-futures,BTCUSDT,1582329604316000,1582329604437230,0.84,9682,9681.54,0.003 -binance-futures,BTCUSDT,1582329604327000,1582329604448944,0.84,9682,9681.61,0.67 -binance-futures,BTCUSDT,1582329604355000,1582329604476868,0.84,9682,9681.61,3.02 -binance-futures,BTCUSDT,1582329604367000,1582329604487947,0.84,9682,9681.61,0.67 -binance-futures,BTCUSDT,1582329604369000,1582329604490104,0.84,9682,9681.63,0.363 -binance-futures,BTCUSDT,1582329604397000,1582329604518126,0.84,9682,9681.86,4.262 -binance-futures,BTCUSDT,1582329604477000,1582329604597708,0.84,9682,9681.87,0.67 -binance-futures,BTCUSDT,1582329604512000,1582329604635770,0.84,9682,9681.88,0.363 -binance-futures,BTCUSDT,1582329604541000,1582329604663198,0.84,9682,9681.88,1.033 -binance-futures,BTCUSDT,1582329604551000,1582329604674393,0.84,9682,9681.89,0.011 -binance-futures,BTCUSDT,1582329604555000,1582329604680734,0.84,9682,9681.89,0.031 -binance-futures,BTCUSDT,1582329604684000,1582329604806922,0.84,9682,9681.89,0.014 -binance-futures,BTCUSDT,1582329604713000,1582329604833051,0.84,9682,9681.89,0.031 -binance-futures,BTCUSDT,1582329604802000,1582329604922852,0.84,9682,9681.89,0.02 -binance-futures,BTCUSDT,1582329604802000,1582329604922859,0.84,9682,9681.9,0.017 -binance-futures,BTCUSDT,1582329605032000,1582329605157039,0.84,9682,9681.9,0.011 -binance-futures,BTCUSDT,1582329605062000,1582329605182518,0.84,9682,9681.91,0.67 -binance-futures,BTCUSDT,1582329605088000,1582329605207356,0.84,9682,9681.54,0.014 -binance-futures,BTCUSDT,1582329605223000,1582329605349743,0.84,9682,9681.53,4.501 -binance-futures,BTCUSDT,1582329605354000,1582329605478891,0.84,9682,9681.54,0.002 -binance-futures,BTCUSDT,1582329605354000,1582329605478918,0.84,9682,9681.54,0.004 -binance-futures,BTCUSDT,1582329605361000,1582329605483338,0.013,9682.29,9682,3.718 -binance-futures,BTCUSDT,1582329605408000,1582329605533637,0.013,9682.29,9681.54,0.004 -binance-futures,BTCUSDT,1582329605410000,1582329605533780,0.013,9682.29,9681.87,4.471 -binance-futures,BTCUSDT,1582329605421000,1582329605542207,0.013,9682.29,9681.54,0.004 -binance-futures,BTCUSDT,1582329605423000,1582329605549168,0.013,9682.29,9682.06,4.763 -binance-futures,BTCUSDT,1582329605425000,1582329605550391,0.031,9682.27,9682.06,4.763 -binance-futures,BTCUSDT,1582329605430000,1582329605553741,0.031,9682.26,9682.06,4.763 -binance-futures,BTCUSDT,1582329605436000,1582329605560301,0.031,9682.26,9681.87,2.919 -binance-futures,BTCUSDT,1582329605448000,1582329605572369,0.031,9682.26,9681.54,0.004 -binance-futures,BTCUSDT,1582329605449000,1582329605573064,0.031,9682.26,9682.06,5.523 -binance-futures,BTCUSDT,1582329605457000,1582329605579024,0.031,9682.26,9681.54,0.004 -binance-futures,BTCUSDT,1582329605459000,1582329605583681,0.031,9682.26,9681.87,4.586 -binance-futures,BTCUSDT,1582329605468000,1582329605592252,0.013,9682.29,9681.87,4.586 -binance-futures,BTCUSDT,1582329605525000,1582329605648016,0.014,9682.29,9681.87,4.586 -binance-futures,BTCUSDT,1582329605552000,1582329605674487,0.014,9682.29,9681.91,0.031 -binance-futures,BTCUSDT,1582329605584000,1582329605703882,0.003,9682.29,9681.91,0.031 -binance-futures,BTCUSDT,1582329605586000,1582329605706306,0.003,9682.29,9681.92,0.002 -binance-futures,BTCUSDT,1582329605588000,1582329605708882,0.001,9682.29,9681.92,0.002 -binance-futures,BTCUSDT,1582329605605000,1582329605724764,0.001,9682.29,9681.94,0.031 -binance-futures,BTCUSDT,1582329605623000,1582329605742114,0.014,9682.85,9681.94,0.031 -binance-futures,BTCUSDT,1582329605642000,1582329605765531,0.253,9682.81,9681.94,0.031 -binance-futures,BTCUSDT,1582329605663000,1582329605785497,7.953,9682.81,9681.94,0.031 -binance-futures,BTCUSDT,1582329605664000,1582329605787330,7.953,9682.81,9681.96,0.031 -binance-futures,BTCUSDT,1582329605688000,1582329605809192,7.7,9682.81,9681.96,0.031 -binance-futures,BTCUSDT,1582329605690000,1582329605812324,0.253,9682.75,9681.96,0.031 -binance-futures,BTCUSDT,1582329605711000,1582329605832261,7.953,9682.75,9681.96,0.031 -binance-futures,BTCUSDT,1582329605735000,1582329605860010,0.253,9682.48,9681.96,0.031 -binance-futures,BTCUSDT,1582329605752000,1582329605875671,0.253,9682.48,9681.96,0.024 -binance-futures,BTCUSDT,1582329605759000,1582329605883712,5.503,9682.48,9681.96,0.024 -binance-futures,BTCUSDT,1582329605763000,1582329605886978,5.25,9682.48,9681.96,0.024 -binance-futures,BTCUSDT,1582329605772000,1582329605895449,8.9,9682.48,9681.96,0.024 -binance-futures,BTCUSDT,1582329605783000,1582329605905477,5.25,9682.48,9681.96,0.024 -binance-futures,BTCUSDT,1582329605842000,1582329605965486,0.012,9682.47,9681.97,0.003 -binance-futures,BTCUSDT,1582329605846000,1582329605970016,0.012,9682.47,9681.97,0.005 -binance-futures,BTCUSDT,1582329605848000,1582329605970511,0.014,9682.47,9681.97,0.005 -binance-futures,BTCUSDT,1582329605864000,1582329605984808,6.114,9682.47,9681.97,0.005 -binance-futures,BTCUSDT,1582329605868000,1582329605989044,6.114,9682.47,9682.01,0.031 -binance-futures,BTCUSDT,1582329605875000,1582329605997204,9.347,9682.47,9682.01,0.031 -binance-futures,BTCUSDT,1582329605888000,1582329606013287,9.347,9682.47,9682,0.031 -binance-futures,BTCUSDT,1582329605891000,1582329606014257,9.347,9682.47,9681.97,0.005 -binance-futures,BTCUSDT,1582329605906000,1582329606029351,0.74,9682.45,9681.97,0.005 -binance-futures,BTCUSDT,1582329605908000,1582329606033471,2.09,9682.45,9681.97,0.005 -binance-futures,BTCUSDT,1582329605911000,1582329606035300,2.81,9682.45,9681.97,0.005 -binance-futures,BTCUSDT,1582329605916000,1582329606039807,0.031,9682.43,9681.97,0.005 -binance-futures,BTCUSDT,1582329605936000,1582329606056677,8.031,9682.43,9681.97,0.005 -binance-futures,BTCUSDT,1582329605962000,1582329606081638,0.68,9682.42,9681.97,0.005 -binance-futures,BTCUSDT,1582329605971000,1582329606097933,0.031,9682.39,9681.97,0.005 -binance-futures,BTCUSDT,1582329605995000,1582329606116475,8.781,9682.39,9681.97,0.005 -binance-futures,BTCUSDT,1582329605999000,1582329606120628,0.68,9682.38,9681.97,0.005 -binance-futures,BTCUSDT,1582329606015000,1582329606135837,10.98,9682.38,9681.97,0.005 -binance-futures,BTCUSDT,1582329606019000,1582329606142824,0.031,9682.35,9681.97,0.005 -binance-futures,BTCUSDT,1582329606033000,1582329606154227,0.253,9682.33,9681.97,0.005 -binance-futures,BTCUSDT,1582329606053000,1582329606178601,9.653,9682.33,9681.97,0.005 -binance-futures,BTCUSDT,1582329606080000,1582329606200665,0.031,9682.29,9681.97,0.005 -binance-futures,BTCUSDT,1582329606100000,1582329606225539,7.581,9682.29,9681.97,0.005 -binance-futures,BTCUSDT,1582329606109000,1582329606248610,7.581,9682.29,9681.97,0.003 -binance-futures,BTCUSDT,1582329606116000,1582329606259837,7.581,9682.29,9681.84,0.005 -binance-futures,BTCUSDT,1582329606127000,1582329606262998,0.031,9682.25,9681.84,0.005 -binance-futures,BTCUSDT,1582329606157000,1582329606296418,7.081,9682.25,9681.84,0.005 -binance-futures,BTCUSDT,1582329606169000,1582329606313853,0.253,9682.19,9681.84,0.005 -binance-futures,BTCUSDT,1582329606206000,1582329606332384,6.653,9682.19,9681.84,0.005 -binance-futures,BTCUSDT,1582329606231000,1582329606352314,6.4,9682.19,9681.84,0.005 -binance-futures,BTCUSDT,1582329606241000,1582329606360857,0.253,9682.15,9681.84,0.005 -binance-futures,BTCUSDT,1582329606243000,1582329606364037,0.283,9682.15,9681.84,0.005 -binance-futures,BTCUSDT,1582329606254000,1582329606375249,0.03,9682.15,9681.84,0.005 -binance-futures,BTCUSDT,1582329606258000,1582329606380653,4.361,9682.15,9681.84,0.005 -binance-futures,BTCUSDT,1582329606263000,1582329606388453,4.361,9682.15,9681.83,2.98 -binance-futures,BTCUSDT,1582329606283000,1582329606404358,4.8,9682.14,9681.83,2.98 -binance-futures,BTCUSDT,1582329606295000,1582329606415424,0.72,9682.13,9681.83,2.98 -binance-futures,BTCUSDT,1582329606301000,1582329606420257,1.4,9682.13,9681.83,2.98 -binance-futures,BTCUSDT,1582329606304000,1582329606422992,2.14,9682.13,9681.83,2.98 -binance-futures,BTCUSDT,1582329606306000,1582329606427068,0.031,9682.1,9681.83,2.98 -binance-futures,BTCUSDT,1582329606319000,1582329606438045,0.284,9682.1,9681.83,2.98 -binance-futures,BTCUSDT,1582329606325000,1582329606445120,6.184,9682.1,9681.83,2.98 -binance-futures,BTCUSDT,1582329606348000,1582329606467834,0.003,9682.09,9681.83,2.98 -binance-futures,BTCUSDT,1582329606352000,1582329606473688,0.253,9682.07,9681.83,2.98 -binance-futures,BTCUSDT,1582329606371000,1582329606490899,0.031,9682.05,9681.83,2.98 -binance-futures,BTCUSDT,1582329606377000,1582329606501226,0.031,9682.05,9681.8,0.1 -binance-futures,BTCUSDT,1582329606379000,1582329606503360,0.031,9682.05,9681.97,2.633 -binance-futures,BTCUSDT,1582329606388000,1582329606509887,6.081,9682.05,9681.97,2.633 -binance-futures,BTCUSDT,1582329606400000,1582329606524492,0.68,9682.03,9681.97,2.633 -binance-futures,BTCUSDT,1582329606403000,1582329606525384,0.253,9682,9681.97,2.633 -binance-futures,BTCUSDT,1582329606419000,1582329606543838,0.253,9682,9681.84,5.431 -binance-futures,BTCUSDT,1582329606422000,1582329606543870,6.303,9682,9681.84,5.431 -binance-futures,BTCUSDT,1582329606426000,1582329606547819,6.334,9682,9681.84,5.431 -binance-futures,BTCUSDT,1582329606430000,1582329606550638,0.031,9681.99,9681.84,5.431 -binance-futures,BTCUSDT,1582329606443000,1582329606567458,0.711,9681.99,9681.84,5.431 -binance-futures,BTCUSDT,1582329606450000,1582329606573486,0.253,9681.97,9681.84,5.431 -binance-futures,BTCUSDT,1582329606465000,1582329606584575,7.361,9681.99,9681.84,5.431 -binance-futures,BTCUSDT,1582329606471000,1582329606592597,8.15,9681.97,9681.84,5.431 -binance-futures,BTCUSDT,1582329606475000,1582329606596599,0.031,9681.93,9681.84,5.431 -binance-futures,BTCUSDT,1582329606502000,1582329606622914,8.231,9681.93,9681.84,5.431 -binance-futures,BTCUSDT,1582329606505000,1582329606626720,0.253,9681.85,9681.84,5.431 -binance-futures,BTCUSDT,1582329606528000,1582329606648787,8.603,9681.85,9681.84,5.431 -binance-futures,BTCUSDT,1582329606605000,1582329606725502,0.253,9681.85,9681.84,5.431 -binance-futures,BTCUSDT,1582329606631000,1582329606750251,0.031,9681.89,9681.84,5.431 -binance-futures,BTCUSDT,1582329606652000,1582329606772216,0.031,9681.87,9681.84,5.431 -binance-futures,BTCUSDT,1582329606672000,1582329606793308,5.781,9681.87,9681.84,5.431 -binance-futures,BTCUSDT,1582329606697000,1582329606815746,0.031,9681.85,9681.84,5.431 -binance-futures,BTCUSDT,1582329606717000,1582329606837716,6.781,9681.85,9681.84,5.431 -binance-futures,BTCUSDT,1582329606820000,1582329606941082,0.031,9681.85,9681.84,5.431 -binance-futures,BTCUSDT,1582329606874000,1582329606996981,0.001,9681.85,9681.84,5.431 -binance-futures,BTCUSDT,1582329606927000,1582329607051626,0.001,9681.85,9681.7,2.67 -binance-futures,BTCUSDT,1582329606933000,1582329607053922,0.254,9681.85,9681.7,2.67 -binance-futures,BTCUSDT,1582329606945000,1582329607070353,0.031,9681.82,9681.7,2.67 -binance-futures,BTCUSDT,1582329606969000,1582329607091128,2.881,9681.82,9681.7,2.67 -binance-futures,BTCUSDT,1582329606993000,1582329607114318,0.03,9681.78,9681.7,2.67 -binance-futures,BTCUSDT,1582329607014000,1582329607137802,3.08,9681.78,9681.7,2.67 -binance-futures,BTCUSDT,1582329607018000,1582329607140211,0.031,9681.76,9681.7,2.67 -binance-futures,BTCUSDT,1582329607020000,1582329607143881,0.031,9681.75,9681.7,2.67 -binance-futures,BTCUSDT,1582329607044000,1582329607169436,3.781,9681.75,9681.7,2.67 -binance-futures,BTCUSDT,1582329607056000,1582329607176443,3.75,9681.75,9681.7,2.67 -binance-futures,BTCUSDT,1582329607073000,1582329607195528,0.031,9681.72,9681.7,2.67 -binance-futures,BTCUSDT,1582329607075000,1582329607195932,0.031,9681.71,9681.7,2.67 -binance-futures,BTCUSDT,1582329607151000,1582329607276079,0.031,9681.73,9681.7,2.67 -binance-futures,BTCUSDT,1582329607153000,1582329607276721,0.031,9681.75,9681.7,2.67 -binance-futures,BTCUSDT,1582329607583000,1582329607702401,0.253,9681.71,9681.7,2.67 -binance-futures,BTCUSDT,1582329607640000,1582329607760464,0.031,9681.75,9681.7,2.67 -binance-futures,BTCUSDT,1582329607657000,1582329607776912,0.031,9681.75,9681.54,0.001 -binance-futures,BTCUSDT,1582329607663000,1582329607783531,0.031,9681.73,9681.54,0.001 -binance-futures,BTCUSDT,1582329607681000,1582329607800738,3.281,9681.73,9681.54,0.001 -binance-futures,BTCUSDT,1582329607692000,1582329607813738,0.253,9681.61,9681.54,0.001 -binance-futures,BTCUSDT,1582329607701000,1582329607822526,3.281,9681.73,9681.54,0.001 -binance-futures,BTCUSDT,1582329607705000,1582329607824967,0.031,9681.69,9681.54,0.001 -binance-futures,BTCUSDT,1582329607712000,1582329607832227,2,9681.55,9681.54,0.001 -binance-futures,BTCUSDT,1582329607723000,1582329607845072,3.5,9681.61,9681.54,0.001 -binance-futures,BTCUSDT,1582329607729000,1582329607850608,2.75,9681.55,9681.54,0.001 -binance-futures,BTCUSDT,1582329607747000,1582329607868170,3.43,9681.55,9681.54,0.001 -binance-futures,BTCUSDT,1582329607755000,1582329607876670,4.15,9681.55,9681.54,0.001 -binance-futures,BTCUSDT,1582329607755000,1582329607876685,4.82,9681.55,9681.54,0.001 -binance-futures,BTCUSDT,1582329607757000,1582329607879131,2.81,9681.55,9681.54,0.001 -binance-futures,BTCUSDT,1582329607761000,1582329607881770,2.814,9681.55,9681.54,0.001 -binance-futures,BTCUSDT,1582329607765000,1582329607886232,2.827,9681.55,9681.54,0.001 -binance-futures,BTCUSDT,1582329607777000,1582329607899376,2.147,9681.55,9681.54,0.001 -binance-futures,BTCUSDT,1582329607789000,1582329607909832,2.138,9681.55,9681.54,0.001 -binance-futures,BTCUSDT,1582329607793000,1582329607917678,1.398,9681.55,9681.54,0.001 -binance-futures,BTCUSDT,1582329607806000,1582329607925281,0.674,9681.55,9681.54,0.001 -binance-futures,BTCUSDT,1582329607808000,1582329607927199,0.004,9681.55,9681.54,0.001 -binance-futures,BTCUSDT,1582329607813000,1582329607932506,0.253,9681.6,9681.54,0.001 -binance-futures,BTCUSDT,1582329607817000,1582329607937714,4.938,9682.38,9681.54,0.001 -binance-futures,BTCUSDT,1582329607821000,1582329607941803,0.253,9682.1,9681.54,0.001 -binance-futures,BTCUSDT,1582329607826000,1582329607947343,0.253,9682.03,9681.56,5.612 -binance-futures,BTCUSDT,1582329607834000,1582329607954737,0.253,9682.33,9681.56,5.612 -binance-futures,BTCUSDT,1582329607844000,1582329607964832,2,9682,9681.56,5.612 -binance-futures,BTCUSDT,1582329607847000,1582329607970251,2,9681.97,9681.56,5.612 -binance-futures,BTCUSDT,1582329607858000,1582329607978934,0.031,9681.99,9681.56,5.612 -binance-futures,BTCUSDT,1582329607867000,1582329607985064,0.751,9681.99,9681.56,5.612 -binance-futures,BTCUSDT,1582329607867000,1582329607989326,1.004,9681.99,9681.56,5.612 -binance-futures,BTCUSDT,1582329607869000,1582329607989383,2,9681.93,9681.57,0.001 -binance-futures,BTCUSDT,1582329607878000,1582329607997367,2,9681.91,9681.57,0.001 -binance-futures,BTCUSDT,1582329607893000,1582329608013874,4,9681.91,9681.57,0.001 -binance-futures,BTCUSDT,1582329607899000,1582329608020929,0.031,9681.87,9681.57,0.001 -binance-futures,BTCUSDT,1582329607910000,1582329608043322,2,9681.85,9681.57,0.001 -binance-futures,BTCUSDT,1582329607916000,1582329608048621,2,9681.85,9681.72,0.1 -binance-futures,BTCUSDT,1582329607943000,1582329608062443,2,9681.81,9681.72,0.1 -binance-futures,BTCUSDT,1582329607947000,1582329608065004,2.031,9681.81,9681.72,0.1 -binance-futures,BTCUSDT,1582329607956000,1582329608075523,2.031,9681.81,9681.57,0.001 -binance-futures,BTCUSDT,1582329607962000,1582329608082729,2,9681.75,9681.57,0.001 -binance-futures,BTCUSDT,1582329607985000,1582329608105261,4.4,9681.75,9681.57,0.001 -binance-futures,BTCUSDT,1582329607995000,1582329608114924,0.253,9681.68,9681.57,0.001 -binance-futures,BTCUSDT,1582329608013000,1582329608131484,2,9681.62,9681.57,0.001 -binance-futures,BTCUSDT,1582329608028000,1582329608148786,4.3,9681.62,9681.57,0.001 -binance-futures,BTCUSDT,1582329608034000,1582329608155267,0.74,9681.61,9681.57,0.001 -binance-futures,BTCUSDT,1582329608036000,1582329608156668,1.46,9681.61,9681.57,0.001 -binance-futures,BTCUSDT,1582329608038000,1582329608160244,2.81,9681.61,9681.57,0.001 -binance-futures,BTCUSDT,1582329608044000,1582329608163045,2,9681.58,9681.57,0.001 -binance-futures,BTCUSDT,1582329608057000,1582329608175626,2.031,9681.58,9681.57,0.001 -binance-futures,BTCUSDT,1582329608062000,1582329608185458,4.781,9681.58,9681.57,0.001 -binance-futures,BTCUSDT,1582329608072000,1582329608193036,5.461,9681.58,9681.57,0.001 -binance-futures,BTCUSDT,1582329608074000,1582329608193455,6.131,9681.58,9681.57,0.001 -binance-futures,BTCUSDT,1582329608076000,1582329608195319,3.381,9681.58,9681.57,0.001 -binance-futures,BTCUSDT,1582329608079000,1582329608197698,4.121,9681.58,9681.57,0.001 -binance-futures,BTCUSDT,1582329608087000,1582329608206783,4.841,9681.58,9681.57,0.001 -binance-futures,BTCUSDT,1582329608110000,1582329608232480,4.161,9681.58,9681.57,0.001 -binance-futures,BTCUSDT,1582329608121000,1582329608244004,4.161,9681.58,9681.56,5.612 -binance-futures,BTCUSDT,1582329608121000,1582329608244162,3.421,9681.58,9681.56,5.612 -binance-futures,BTCUSDT,1582329608125000,1582329608244747,2.751,9681.58,9681.56,5.612 -binance-futures,BTCUSDT,1582329608129000,1582329608248316,2.834,9681.58,9681.56,5.612 -binance-futures,BTCUSDT,1582329608139000,1582329608260376,2.114,9681.58,9681.56,5.612 -binance-futures,BTCUSDT,1582329608153000,1582329608278251,2.794,9681.58,9681.56,5.612 -binance-futures,BTCUSDT,1582329608160000,1582329608279992,0.74,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608175000,1582329608293655,0.993,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608178000,1582329608298721,4.393,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608188000,1582329608329068,5.063,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608189000,1582329608332229,5.783,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608191000,1582329608332251,5.043,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608193000,1582329608332272,5.723,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608199000,1582329608332315,2.323,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608228000,1582329608346697,1.603,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608230000,1582329608350191,0.923,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608230000,1582329608350224,1.663,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608241000,1582329608362676,0.993,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608252000,1582329608371732,0.253,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608276000,1582329608393629,0.031,9681.58,9681.56,5.612 -binance-futures,BTCUSDT,1582329608296000,1582329608415858,0.031,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608311000,1582329608431643,4.031,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608313000,1582329608435780,11.231,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608321000,1582329608442857,9.231,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608323000,1582329608448987,7.231,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608334000,1582329608457999,4.701,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608336000,1582329608459069,5.381,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608342000,1582329608463693,6.121,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608345000,1582329608466740,6.841,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608396000,1582329608516506,6.924,9681.57,9681.56,5.612 -binance-futures,BTCUSDT,1582329608838000,1582329608957415,6.924,9681.57,9681.4,3.845 -binance-futures,BTCUSDT,1582329608854000,1582329608974100,2,9681.51,9681.4,3.845 -binance-futures,BTCUSDT,1582329608870000,1582329608991051,5.9,9681.51,9681.4,3.845 -binance-futures,BTCUSDT,1582329608884000,1582329609010112,4.87,9681.51,9681.4,3.845 -binance-futures,BTCUSDT,1582329608890000,1582329609012621,2,9681.45,9681.4,3.845 -binance-futures,BTCUSDT,1582329608916000,1582329609041055,2,9681.45,9681.27,4.539 -binance-futures,BTCUSDT,1582329608940000,1582329609060980,0.72,9681.44,9681.27,4.539 -binance-futures,BTCUSDT,1582329608943000,1582329609066067,1.46,9681.44,9681.27,4.539 -binance-futures,BTCUSDT,1582329608948000,1582329609069282,2.13,9681.44,9681.27,4.539 -binance-futures,BTCUSDT,1582329608962000,1582329609083293,0.031,9681.41,9681.27,4.539 -binance-futures,BTCUSDT,1582329608981000,1582329609101761,2.931,9681.41,9681.27,4.539 -binance-futures,BTCUSDT,1582329608988000,1582329609107340,0.031,9681.38,9681.27,4.539 -binance-futures,BTCUSDT,1582329609005000,1582329609126969,3.131,9681.38,9681.27,4.539 -binance-futures,BTCUSDT,1582329609012000,1582329609133280,0.74,9681.37,9681.27,4.539 -binance-futures,BTCUSDT,1582329609029000,1582329609151365,1.41,9681.37,9681.27,4.539 -binance-futures,BTCUSDT,1582329609033000,1582329609152097,4.11,9681.37,9681.27,4.539 -binance-futures,BTCUSDT,1582329609035000,1582329609154774,0.031,9681.33,9681.27,4.539 -binance-futures,BTCUSDT,1582329609055000,1582329609176866,2.981,9681.33,9681.27,4.539 -binance-futures,BTCUSDT,1582329609070000,1582329609192437,0.031,9681.33,9681.27,4.539 -binance-futures,BTCUSDT,1582329609096000,1582329609217166,0.031,9681.32,9681.27,4.539 -binance-futures,BTCUSDT,1582329609115000,1582329609235044,0.751,9681.32,9681.27,4.539 -binance-futures,BTCUSDT,1582329609129000,1582329609254669,1.421,9681.32,9681.27,4.539 -binance-futures,BTCUSDT,1582329609139000,1582329609270704,0.031,9681.29,9681.27,4.539 -binance-futures,BTCUSDT,1582329609143000,1582329609271664,0.031,9681.28,9681.27,4.539 -binance-futures,BTCUSDT,1582329609169000,1582329609309248,2.531,9681.28,9681.27,4.539 -binance-futures,BTCUSDT,1582329609176000,1582329609312452,2.784,9681.28,9681.27,4.539 -binance-futures,BTCUSDT,1582329609218000,1582329609340370,3.464,9681.28,9681.27,4.539 -binance-futures,BTCUSDT,1582329609220000,1582329609341253,4.134,9681.28,9681.27,4.539 -binance-futures,BTCUSDT,1582329609224000,1582329609346743,1.634,9681.28,9681.27,4.539 -binance-futures,BTCUSDT,1582329609228000,1582329609349383,2.374,9681.28,9681.27,4.539 -binance-futures,BTCUSDT,1582329609243000,1582329609364705,1.704,9681.28,9681.27,4.539 -binance-futures,BTCUSDT,1582329609247000,1582329609369081,2.424,9681.28,9681.27,4.539 -binance-futures,BTCUSDT,1582329609249000,1582329609369449,1.744,9681.28,9681.27,4.539 -binance-futures,BTCUSDT,1582329609258000,1582329609400249,1.004,9681.28,9681.27,4.539 -binance-futures,BTCUSDT,1582329609279000,1582329609415663,0.031,9681.28,9681.27,4.539 -binance-futures,BTCUSDT,1582329609311000,1582329609439798,0.031,9681.33,9681.32,1.907 -binance-futures,BTCUSDT,1582329609330000,1582329609454299,4.015,9682.81,9681.33,1.969 -binance-futures,BTCUSDT,1582329609339000,1582329609460247,4.015,9682.81,9681.4,2.932 -binance-futures,BTCUSDT,1582329609355000,1582329609481352,4.015,9682.81,9681.85,0.031 -binance-futures,BTCUSDT,1582329609357000,1582329609481610,4.015,9682.81,9681.87,0.031 -binance-futures,BTCUSDT,1582329609359000,1582329609482682,0.253,9682.8,9681.87,0.031 -binance-futures,BTCUSDT,1582329609368000,1582329609490120,0.68,9682.79,9681.87,0.031 -binance-futures,BTCUSDT,1582329609379000,1582329609501744,1.35,9682.79,9681.89,2 -binance-futures,BTCUSDT,1582329609384000,1582329609504020,5.531,9682.6,9681.89,2 -binance-futures,BTCUSDT,1582329609396000,1582329609522954,4.704,9682.6,9681.89,5.65 -binance-futures,BTCUSDT,1582329609402000,1582329609524507,4.704,9682.6,9681.93,0.031 -binance-futures,BTCUSDT,1582329609420000,1582329609543724,0.827,9682.6,9681.93,0.031 -binance-futures,BTCUSDT,1582329609425000,1582329609547768,0.827,9682.6,9681.93,6.381 -binance-futures,BTCUSDT,1582329609430000,1582329609552137,0.005,9682.59,9681.93,6.381 -binance-futures,BTCUSDT,1582329609435000,1582329609555951,0.005,9682.59,9681.95,0.466 -binance-futures,BTCUSDT,1582329609441000,1582329609566381,0.021,9682.8,9682.6,3.168 -binance-futures,BTCUSDT,1582329609443000,1582329609566403,0.021,9682.8,9682.6,5.168 -binance-futures,BTCUSDT,1582329609453000,1582329609577710,0.021,9682.8,9682.6,9.168 -binance-futures,BTCUSDT,1582329609460000,1582329609581294,0.021,9682.8,9682.6,6 -binance-futures,BTCUSDT,1582329609462000,1582329609584585,0.021,9682.8,9682.6,4 -binance-futures,BTCUSDT,1582329609464000,1582329609588235,0.021,9682.8,9682.71,1 -binance-futures,BTCUSDT,1582329609485000,1582329609609252,0.021,9682.8,9682.77,1 -binance-futures,BTCUSDT,1582329609487000,1582329609612477,0.021,9682.8,9682.79,1 -binance-futures,BTCUSDT,1582329609506000,1582329609628987,0.021,9682.8,9682.79,13.6 -binance-futures,BTCUSDT,1582329609512000,1582329609637908,0.021,9682.8,9682.79,13.631 -binance-futures,BTCUSDT,1582329609527000,1582329609646827,0.021,9682.8,9682.79,9.031 -binance-futures,BTCUSDT,1582329609529000,1582329609651392,0.021,9682.8,9682.79,9.048 -binance-futures,BTCUSDT,1582329609573000,1582329609701030,0.262,9682.86,9682.79,9.048 -binance-futures,BTCUSDT,1582329609578000,1582329609701786,0.262,9682.86,9682.8,0.464 -binance-futures,BTCUSDT,1582329609592000,1582329609715292,0.262,9682.86,9682.85,7 -binance-futures,BTCUSDT,1582329609592000,1582329609716023,0.262,9682.86,9682.85,11 -binance-futures,BTCUSDT,1582329609612000,1582329609733612,0.262,9682.86,9682.85,16.85 -binance-futures,BTCUSDT,1582329609620000,1582329609741015,0.262,9682.86,9682.85,17.287 -binance-futures,BTCUSDT,1582329609625000,1582329609744983,0.262,9682.86,9682.85,11.437 -binance-futures,BTCUSDT,1582329609669000,1582329609791346,0.262,9682.86,9682.85,12.107 -binance-futures,BTCUSDT,1582329609785000,1582329609904503,0.002,9683.09,9682.94,0.388 -binance-futures,BTCUSDT,1582329609803000,1582329609943385,0.002,9683.09,9682.94,4.938 -binance-futures,BTCUSDT,1582329609805000,1582329609944393,0.002,9683.09,9683,2 -binance-futures,BTCUSDT,1582329609807000,1582329609946487,3.764,9683.09,9683,2 -binance-futures,BTCUSDT,1582329609824000,1582329609951120,3.764,9683.09,9683.05,1 -binance-futures,BTCUSDT,1582329609839000,1582329609959492,0.002,9683.09,9683.05,1 -binance-futures,BTCUSDT,1582329609845000,1582329609966530,0.002,9683.09,9683.08,1 -binance-futures,BTCUSDT,1582329609847000,1582329609970942,0.002,9683.09,9683.08,1.429 -binance-futures,BTCUSDT,1582329609853000,1582329609973720,0.002,9683.09,9683.08,3.429 -binance-futures,BTCUSDT,1582329609861000,1582329609988169,2.884,9683.1,9683.08,3.429 -binance-futures,BTCUSDT,1582329609865000,1582329609991116,2.884,9683.1,9683.08,13.029 -binance-futures,BTCUSDT,1582329609885000,1582329610007362,2.884,9683.1,9683.09,5.65 -binance-futures,BTCUSDT,1582329609887000,1582329610008283,2.884,9683.1,9683.09,6.65 -binance-futures,BTCUSDT,1582329609907000,1582329610027478,2.884,9683.1,9683.09,10.45 -binance-futures,BTCUSDT,1582329609941000,1582329610063079,2.884,9683.1,9683.09,11.12 -binance-futures,BTCUSDT,1582329609950000,1582329610073650,2.884,9683.1,9683.09,7.32 -binance-futures,BTCUSDT,1582329610022000,1582329610143198,2.884,9683.1,9683.09,6.36 -binance-futures,BTCUSDT,1582329610114000,1582329610234505,2.884,9683.1,9683.09,1.67 -binance-futures,BTCUSDT,1582329610182000,1582329610304923,2.884,9683.1,9683.09,6.52 -binance-futures,BTCUSDT,1582329610460000,1582329610584669,2.884,9683.1,9683.09,1.67 -binance-futures,BTCUSDT,1582329610464000,1582329610587617,2.884,9683.1,9683.09,1.659 -binance-futures,BTCUSDT,1582329610492000,1582329610611605,2.884,9683.1,9683.09,1.646 -binance-futures,BTCUSDT,1582329610847000,1582329610972640,2.884,9683.1,9683.09,3.716 -binance-futures,BTCUSDT,1582329610871000,1582329610994500,3.137,9683.1,9683.09,3.716 -binance-futures,BTCUSDT,1582329610875000,1582329610999837,2.884,9683.1,9683.09,3.716 -binance-futures,BTCUSDT,1582329610881000,1582329611001547,3.137,9683.1,9683.09,3.716 -binance-futures,BTCUSDT,1582329610917000,1582329611042665,3.137,9683.1,9683.09,4.173 -binance-futures,BTCUSDT,1582329610921000,1582329611043127,2.884,9683.1,9683.09,4.173 -binance-futures,BTCUSDT,1582329611025000,1582329611146226,2.884,9683.1,9683.09,4.19 -binance-futures,BTCUSDT,1582329611067000,1582329611188379,2.884,9683.1,9683.09,3.733 -binance-futures,BTCUSDT,1582329611079000,1582329611199165,2.884,9683.1,9683.09,4.2 -binance-futures,BTCUSDT,1582329611276000,1582329611413898,2.884,9683.1,9683.09,3.733 -binance-futures,BTCUSDT,1582329611282000,1582329611414853,3.137,9683.1,9683.09,3.733 -binance-futures,BTCUSDT,1582329611290000,1582329611414886,2.884,9683.1,9683.09,3.733 -binance-futures,BTCUSDT,1582329611331000,1582329611450085,3.137,9683.1,9683.09,3.733 -binance-futures,BTCUSDT,1582329611336000,1582329611454725,2.884,9683.1,9683.09,3.733 -binance-futures,BTCUSDT,1582329611338000,1582329611457048,2.884,9683.1,9683.09,4.164 -binance-futures,BTCUSDT,1582329611710000,1582329611828457,3.137,9683.1,9683.09,4.164 -binance-futures,BTCUSDT,1582329611710000,1582329611828908,3.137,9683.1,9683.09,3.733 -binance-futures,BTCUSDT,1582329611746000,1582329611865413,3.137,9683.1,9683.09,4.161 -binance-futures,BTCUSDT,1582329611749000,1582329611868390,2.884,9683.1,9683.09,4.161 -binance-futures,BTCUSDT,1582329611903000,1582329612023425,2.884,9683.1,9683.09,3.733 -binance-futures,BTCUSDT,1582329611923000,1582329612041383,2.884,9683.1,9683.09,4.165 -binance-futures,BTCUSDT,1582329611984000,1582329612107820,2.884,9683.1,9683.09,2.095 -binance-futures,BTCUSDT,1582329611989000,1582329612109282,2.884,9683.1,9683.09,2.195 -binance-futures,BTCUSDT,1582329611995000,1582329612114217,2.884,9683.1,9683.09,1.763 -binance-futures,BTCUSDT,1582329611998000,1582329612118414,3.137,9683.1,9683.09,1.763 -binance-futures,BTCUSDT,1582329612012000,1582329612132851,3.137,9683.1,9683.09,3.823 -binance-futures,BTCUSDT,1582329612079000,1582329612201901,2.884,9683.1,9683.09,4.278 -binance-futures,BTCUSDT,1582329612100000,1582329612220886,3.137,9683.1,9683.09,3.823 -binance-futures,BTCUSDT,1582329612195000,1582329612547191,2.884,9683.1,9683.09,3.823 -binance-futures,BTCUSDT,1582329612199000,1582329612547217,2.884,9683.1,9683.09,4.291 -binance-futures,BTCUSDT,1582329612199000,1582329612547232,2.884,9683.1,9683.09,2.231 -binance-futures,BTCUSDT,1582329612222000,1582329612547331,2.884,9683.1,9683.09,1.763 -binance-futures,BTCUSDT,1582329612224000,1582329612547338,3.137,9683.1,9683.09,1.763 -binance-futures,BTCUSDT,1582329612255000,1582329612547617,3.137,9683.1,9683.09,1.093 -binance-futures,BTCUSDT,1582329612291000,1582329612547826,3.137,9683.1,9683.09,1.763 -binance-futures,BTCUSDT,1582329612297000,1582329612547864,3.137,9683.1,9683.09,1.746 -binance-futures,BTCUSDT,1582329612315000,1582329612547936,3.137,9683.1,9683.09,3.796 -binance-futures,BTCUSDT,1582329612329000,1582329612547988,3.137,9683.1,9683.09,3.126 -binance-futures,BTCUSDT,1582329612355000,1582329612548100,3.137,9683.1,9683.09,3.796 -binance-futures,BTCUSDT,1582329612381000,1582329612548342,2.884,9683.1,9683.09,3.796 -binance-futures,BTCUSDT,1582329612398000,1582329612548445,3.137,9683.1,9683.09,3.796 -binance-futures,BTCUSDT,1582329612439000,1582329612557237,2.884,9683.1,9683.09,3.796 -binance-futures,BTCUSDT,1582329612479000,1582329612601683,2.884,9683.1,9683.09,4.264 -binance-futures,BTCUSDT,1582329612507000,1582329612628519,2.884,9683.1,9683.09,2.214 -binance-futures,BTCUSDT,1582329612531000,1582329612652282,2.884,9683.1,9683.09,1.544 -binance-futures,BTCUSDT,1582329612533000,1582329612654926,2.884,9683.1,9683.09,3.594 -binance-futures,BTCUSDT,1582329612558000,1582329612679767,2.884,9683.1,9683.09,4.264 -binance-futures,BTCUSDT,1582329612606000,1582329612733910,2.884,9683.1,9683.09,2.214 -binance-futures,BTCUSDT,1582329612639000,1582329612759511,2.884,9683.1,9683.09,3.876 -binance-futures,BTCUSDT,1582329612641000,1582329612762342,3.137,9683.1,9683.09,3.876 -binance-futures,BTCUSDT,1582329612667000,1582329612786300,2.884,9683.1,9683.09,3.876 -binance-futures,BTCUSDT,1582329612672000,1582329612792069,2.884,9683.1,9683.09,4.343 -binance-futures,BTCUSDT,1582329612707000,1582329612830770,3.137,9683.1,9683.09,4.343 -binance-futures,BTCUSDT,1582329612710000,1582329612831611,3.137,9683.1,9683.09,3.893 -binance-futures,BTCUSDT,1582329612759000,1582329612878699,2.884,9683.1,9683.09,4.354 -binance-futures,BTCUSDT,1582329612807000,1582329612925682,2.884,9683.1,9683.09,3.893 -binance-futures,BTCUSDT,1582329612811000,1582329612931464,3.137,9683.1,9683.09,3.893 -binance-futures,BTCUSDT,1582329612854000,1582329612973851,3.137,9683.1,9683.09,4.335 -binance-futures,BTCUSDT,1582329612856000,1582329612974927,2.884,9683.1,9683.09,4.335 -binance-futures,BTCUSDT,1582329612910000,1582329613030264,2.884,9683.1,9683.09,2.205 -binance-futures,BTCUSDT,1582329612912000,1582329613031937,3.137,9683.1,9683.09,1.763 -binance-futures,BTCUSDT,1582329612956000,1582329613077523,2.884,9683.1,9683.09,2.206 -binance-futures,BTCUSDT,1582329612974000,1582329613094365,2.884,9683.1,9683.09,4.336 -binance-futures,BTCUSDT,1582329613009000,1582329613128902,2.884,9683.1,9683.09,2.206 -binance-futures,BTCUSDT,1582329613018000,1582329613142598,2.655,9683.1,9683.09,2.206 -binance-futures,BTCUSDT,1582329613066000,1582329613185134,2.655,9683.1,9683.09,1.763 -binance-futures,BTCUSDT,1582329613091000,1582329613211874,2.655,9683.1,9683.09,2.196 -binance-futures,BTCUSDT,1582329613448000,1582329613567313,2.908,9683.1,9683.09,2.196 -binance-futures,BTCUSDT,1582329613450000,1582329613571318,2.908,9683.1,9683.09,1.763 -binance-futures,BTCUSDT,1582329613515000,1582329613634666,2.908,9683.1,9683.09,3.893 -binance-futures,BTCUSDT,1582329613647000,1582329613766078,2.908,9683.1,9683.09,1.763 -binance-futures,BTCUSDT,1582329613675000,1582329613793290,2.908,9683.1,9683.09,1.093 -binance-futures,BTCUSDT,1582329613764000,1582329613884824,2.908,9683.1,9683.09,3.213 -binance-futures,BTCUSDT,1582329613813000,1582329613935083,2.908,9683.1,9683.09,1.093 -binance-futures,BTCUSDT,1582329613838000,1582329613956457,2.655,9683.1,9683.09,1.548 -binance-futures,BTCUSDT,1582329613860000,1582329613981548,2.655,9683.1,9683.09,5.328 -binance-futures,BTCUSDT,1582329613870000,1582329613989341,2.655,9683.1,9683.09,5.998 -binance-futures,BTCUSDT,1582329613931000,1582329614050891,2.655,9683.1,9683.09,5.543 -binance-futures,BTCUSDT,1582329613939000,1582329614058391,2.908,9683.1,9683.09,5.543 -binance-futures,BTCUSDT,1582329614115000,1582329614239079,2.655,9683.1,9683.09,5.543 -binance-futures,BTCUSDT,1582329614146000,1582329614266462,2.908,9683.1,9683.09,5.543 -binance-futures,BTCUSDT,1582329614218000,1582329614343235,2.655,9683.1,9683.09,5.543 -binance-futures,BTCUSDT,1582329614220000,1582329614343242,2.655,9683.1,9683.09,5.981 -binance-futures,BTCUSDT,1582329614556000,1582329614680728,2.655,9683.1,9683.09,5.543 -binance-futures,BTCUSDT,1582329614558000,1582329614680742,2.908,9683.1,9683.09,5.543 -binance-futures,BTCUSDT,1582329614583000,1582329614704860,2.655,9683.1,9683.09,5.997 -binance-futures,BTCUSDT,1582329614713000,1582329614832590,2.655,9683.1,9683.09,8.107 -binance-futures,BTCUSDT,1582329615445000,1582329615566445,2.655,9683.1,9683.09,5.997 -binance-futures,BTCUSDT,1582329615515000,1582329615641952,2.455,9683.1,9683.09,5.997 -binance-futures,BTCUSDT,1582329615611000,1582329615732887,2.455,9683.1,9683.09,8.107 -binance-futures,BTCUSDT,1582329615655000,1582329615776439,2.428,9683.1,9683.09,8.107 -binance-futures,BTCUSDT,1582329615673000,1582329615796202,1.425,9683.1,9683.09,8.107 -binance-futures,BTCUSDT,1582329615691000,1582329615810614,1.425,9683.1,9683.09,11.707 -binance-futures,BTCUSDT,1582329615789000,1582329615912776,1.678,9683.1,9683.09,7.653 -binance-futures,BTCUSDT,1582329615817000,1582329615939680,1.425,9683.1,9683.09,7.653 -binance-futures,BTCUSDT,1582329615819000,1582329615940400,1.425,9683.1,9683.09,8.111 -binance-futures,BTCUSDT,1582329615910000,1582329616031179,1.425,9683.1,9683.09,7.653 -binance-futures,BTCUSDT,1582329615941000,1582329616062535,1.425,9683.1,9683.09,8.101 -binance-futures,BTCUSDT,1582329616236000,1582329616354666,1.425,9683.1,9683.09,7.653 -binance-futures,BTCUSDT,1582329616254000,1582329616374076,1.678,9683.1,9683.09,7.653 -binance-futures,BTCUSDT,1582329616269000,1582329616390628,1.425,9683.1,9683.09,7.653 -binance-futures,BTCUSDT,1582329616283000,1582329616403843,1.425,9683.1,9683.09,8.105 -binance-futures,BTCUSDT,1582329616319000,1582329616449084,1.425,9683.1,9683.09,7.653 -binance-futures,BTCUSDT,1582329616343000,1582329616463538,1.678,9683.1,9683.09,7.653 -binance-futures,BTCUSDT,1582329616358000,1582329616479654,1.678,9683.1,9683.09,8.081 -binance-futures,BTCUSDT,1582329616362000,1582329616483064,1.425,9683.1,9683.09,8.081 -binance-futures,BTCUSDT,1582329616400000,1582329616521737,1.425,9683.1,9683.09,5.971 -binance-futures,BTCUSDT,1582329616428000,1582329616549885,1.425,9683.1,9683.09,8.081 -binance-futures,BTCUSDT,1582329616706000,1582329616826873,1.425,9683.1,9683.09,7.653 -binance-futures,BTCUSDT,1582329616712000,1582329616832064,1.425,9683.1,9683.09,8.121 -binance-futures,BTCUSDT,1582329616736000,1582329616856525,1.425,9683.1,9683.09,7.451 -binance-futures,BTCUSDT,1582329616810000,1582329616927774,1.678,9683.1,9683.09,6.983 -binance-futures,BTCUSDT,1582329616900000,1582329617030870,1.425,9683.1,9683.09,7.412 -binance-futures,BTCUSDT,1582329616920000,1582329617043740,1.325,9683.1,9683.09,7.412 -binance-futures,BTCUSDT,1582329616927000,1582329617047213,1.325,9683.1,9683.09,6.983 -binance-futures,BTCUSDT,1582329616931000,1582329617050600,1.578,9683.1,9683.09,6.983 -binance-futures,BTCUSDT,1582329616947000,1582329617067079,1.578,9683.1,9683.09,7.653 -binance-futures,BTCUSDT,1582329616969000,1582329617089038,1.325,9683.1,9683.09,8.109 -binance-futures,BTCUSDT,1582329616971000,1582329617091811,1.325,9683.1,9683.09,5.999 -binance-futures,BTCUSDT,1582329617046000,1582329617165828,1.325,9683.1,9683.09,8.109 -binance-futures,BTCUSDT,1582329617248000,1582329617366154,1.325,9683.1,9683.09,5.999 -binance-futures,BTCUSDT,1582329617267000,1582329617386760,1.325,9683.1,9683.09,5.543 -binance-futures,BTCUSDT,1582329617270000,1582329617389220,1.325,9683.1,9683.09,7.653 -binance-futures,BTCUSDT,1582329617292000,1582329617412997,1.578,9683.1,9683.09,7.653 -binance-futures,BTCUSDT,1582329617304000,1582329617422117,1.578,9683.1,9683.09,5.543 -binance-futures,BTCUSDT,1582329617322000,1582329617440396,1.578,9683.1,9683.09,7.653 -binance-futures,BTCUSDT,1582329617372000,1582329617492508,1.578,9683.1,9683.09,5.543 -binance-futures,BTCUSDT,1582329617410000,1582329617529379,1.325,9683.1,9683.09,5.543 -binance-futures,BTCUSDT,1582329617410000,1582329617529387,1.325,9683.1,9683.09,7.653 -binance-futures,BTCUSDT,1582329617425000,1582329617544279,1.325,9683.1,9683.09,5.543 -binance-futures,BTCUSDT,1582329617429000,1582329617548829,1.578,9683.1,9683.09,5.543 -binance-futures,BTCUSDT,1582329617431000,1582329617557793,0.001,9684.68,9683.09,5.543 -binance-futures,BTCUSDT,1582329617447000,1582329617569116,0.001,9684.68,9683.13,0.031 -binance-futures,BTCUSDT,1582329617452000,1582329617574094,0.155,9683.17,9683.13,0.031 -binance-futures,BTCUSDT,1582329617462000,1582329617583666,0.001,9684.68,9683.13,0.031 -binance-futures,BTCUSDT,1582329617463000,1582329617585299,0.155,9684.56,9683.13,0.031 -binance-futures,BTCUSDT,1582329617467000,1582329617588077,0.155,9684.56,9683.13,7.931 -binance-futures,BTCUSDT,1582329617471000,1582329617593674,0.155,9684.56,9683.16,4 -binance-futures,BTCUSDT,1582329617475000,1582329617596983,0.155,9684.56,9683.16,6 -binance-futures,BTCUSDT,1582329617476000,1582329617598171,0.001,9684.68,9683.16,10 -binance-futures,BTCUSDT,1582329617491000,1582329617614206,0.001,9684.68,9683.16,21.8 -binance-futures,BTCUSDT,1582329617493000,1582329617614218,0.001,9684.68,9683.19,2.11 -binance-futures,BTCUSDT,1582329617495000,1582329617616749,0.001,9684.68,9683.19,2.141 -binance-futures,BTCUSDT,1582329617497000,1582329617620120,0.001,9684.68,9683.2,0.031 -binance-futures,BTCUSDT,1582329617499000,1582329617622206,0.001,9684.68,9683.27,0.445 -binance-futures,BTCUSDT,1582329617520000,1582329617641167,0.001,9684.68,9683.27,13.545 -binance-futures,BTCUSDT,1582329617544000,1582329617665677,0.001,9684.68,9683.29,0.031 -binance-futures,BTCUSDT,1582329617545000,1582329617667442,0.001,9684.68,9683.38,0.45 -binance-futures,BTCUSDT,1582329617565000,1582329617685639,0.001,9684.68,9683.38,12.35 -binance-futures,BTCUSDT,1582329617571000,1582329617693229,0.005,9684.7,9683.38,12.35 -binance-futures,BTCUSDT,1582329617588000,1582329617710659,0.005,9684.7,9683.38,11.9 -binance-futures,BTCUSDT,1582329617590000,1582329617712366,0.005,9684.7,9683.48,0.443 -binance-futures,BTCUSDT,1582329617608000,1582329617729528,0.005,9684.7,9683.48,12.443 -binance-futures,BTCUSDT,1582329617632000,1582329617753948,0.005,9684.7,9683.48,12 -binance-futures,BTCUSDT,1582329617634000,1582329617754018,0.005,9684.7,9683.56,0.455 -binance-futures,BTCUSDT,1582329617651000,1582329617774256,0.005,9684.7,9683.56,12.105 -binance-futures,BTCUSDT,1582329617682000,1582329617802327,0.005,9684.7,9683.6,0.466 -binance-futures,BTCUSDT,1582329617703000,1582329617824509,0.005,9684.7,9683.64,0.031 -binance-futures,BTCUSDT,1582329617724000,1582329617843756,0.005,9684.7,9683.64,11.281 -binance-futures,BTCUSDT,1582329617731000,1582329617851647,0.005,9684.7,9683.69,0.443 -binance-futures,BTCUSDT,1582329617751000,1582329617871892,0.005,9684.7,9683.69,10.793 -binance-futures,BTCUSDT,1582329617755000,1582329617877607,0.005,9684.7,9683.73,0.031 -binance-futures,BTCUSDT,1582329617774000,1582329617893329,0.005,9684.7,9683.73,10.281 -binance-futures,BTCUSDT,1582329617778000,1582329617896315,0.005,9684.7,9683.8,0.44 -binance-futures,BTCUSDT,1582329617793000,1582329617913516,0.005,9684.7,9683.84,2 -binance-futures,BTCUSDT,1582329617813000,1582329617932603,0.005,9684.7,9683.84,10.7 -binance-futures,BTCUSDT,1582329617816000,1582329617936640,0.005,9684.7,9683.87,0.031 -binance-futures,BTCUSDT,1582329617818000,1582329617937712,0.005,9684.7,9683.93,0.461 -binance-futures,BTCUSDT,1582329617832000,1582329617951376,0.005,9684.7,9683.88,0.031 -binance-futures,BTCUSDT,1582329617833000,1582329617954030,0.005,9684.7,9683.99,2.16 -binance-futures,BTCUSDT,1582329617854000,1582329617977376,0.005,9684.7,9683.99,8.51 -binance-futures,BTCUSDT,1582329617863000,1582329617984092,0.005,9684.7,9684.03,2 -binance-futures,BTCUSDT,1582329617874000,1582329617995292,0.005,9684.7,9684.03,2.031 -binance-futures,BTCUSDT,1582329617883000,1582329618001536,0.005,9684.7,9684.03,11.281 -binance-futures,BTCUSDT,1582329617888000,1582329618007690,0.005,9684.7,9684.07,0.468 -binance-futures,BTCUSDT,1582329617905000,1582329618026540,0.005,9684.7,9684.07,8.668 -binance-futures,BTCUSDT,1582329617906000,1582329618027150,0.005,9684.7,9684.11,2 -binance-futures,BTCUSDT,1582329617926000,1582329618048962,0.005,9684.7,9684.11,2.031 -binance-futures,BTCUSDT,1582329617926000,1582329618049809,0.005,9684.7,9684.11,9.581 -binance-futures,BTCUSDT,1582329617930000,1582329618049857,0.005,9684.7,9684.17,0.446 -binance-futures,BTCUSDT,1582329617949000,1582329618070323,0.005,9684.7,9684.17,8.996 -binance-futures,BTCUSDT,1582329617968000,1582329618090957,0.005,9684.7,9684.21,2 -binance-futures,BTCUSDT,1582329617972000,1582329618092586,0.005,9684.7,9684.21,2.031 -binance-futures,BTCUSDT,1582329617973000,1582329618092937,0.005,9684.7,9684.27,0.47 -binance-futures,BTCUSDT,1582329617992000,1582329618114081,0.005,9684.7,9684.27,7.87 -binance-futures,BTCUSDT,1582329618013000,1582329618133189,0.005,9684.7,9684.29,2 -binance-futures,BTCUSDT,1582329618026000,1582329618146265,0.005,9684.7,9684.32,0.448 -binance-futures,BTCUSDT,1582329618035000,1582329618157549,0.005,9684.7,9684.32,0.479 -binance-futures,BTCUSDT,1582329618037000,1582329618158134,0.005,9684.7,9684.33,0.031 -binance-futures,BTCUSDT,1582329618045000,1582329618165311,0.005,9684.7,9684.34,2 -binance-futures,BTCUSDT,1582329618061000,1582329618182685,0.005,9684.7,9684.68,2.16 -binance-futures,BTCUSDT,1582329618081000,1582329618201274,0.005,9684.7,9684.68,5.56 -binance-futures,BTCUSDT,1582329618086000,1582329618209948,0.005,9684.7,9684.69,0.432 -binance-futures,BTCUSDT,1582329618108000,1582329618229714,0.005,9684.7,9684.69,4.982 -binance-futures,BTCUSDT,1582329618139000,1582329618259590,0.005,9684.7,9684.69,5.652 -binance-futures,BTCUSDT,1582329618147000,1582329618270921,0.005,9684.7,9684.69,1.102 -binance-futures,BTCUSDT,1582329618171000,1582329618306787,0.005,9684.7,9684.69,0.432 -binance-futures,BTCUSDT,1582329618213000,1582329618332694,0.005,9684.7,9684.68,2.16 -binance-futures,BTCUSDT,1582329618237000,1582329618389393,0.005,9684.7,9684.69,0.43 -binance-futures,BTCUSDT,1582329618282000,1582329618401837,0.005,9684.7,9684.69,3.68 -binance-futures,BTCUSDT,1582329618331000,1582329618449756,0.005,9684.7,9684.69,0.43 -binance-futures,BTCUSDT,1582329618352000,1582329618470969,0.005,9684.7,9684.34,2.16 -binance-futures,BTCUSDT,1582329618359000,1582329618480594,0.005,9684.7,9684.37,0.464 -binance-futures,BTCUSDT,1582329618377000,1582329618495543,0.005,9684.7,9684.37,4.464 -binance-futures,BTCUSDT,1582329618386000,1582329618508145,0.005,9684.7,9684.38,0.67 -binance-futures,BTCUSDT,1582329618399000,1582329618519534,0.005,9684.7,9684.39,0.031 -binance-futures,BTCUSDT,1582329618399000,1582329618519544,0.005,9684.7,9684.41,0.031 -binance-futures,BTCUSDT,1582329618417000,1582329618536238,0.005,9684.7,9684.41,4.581 -binance-futures,BTCUSDT,1582329618423000,1582329618542891,0.005,9684.7,9684.41,5.028 -binance-futures,BTCUSDT,1582329618429000,1582329618551261,0.005,9684.7,9684.43,0.463 -binance-futures,BTCUSDT,1582329618436000,1582329618557627,0.005,9684.7,9684.69,2.32 -binance-futures,BTCUSDT,1582329618454000,1582329618574285,0.005,9684.7,9684.45,0.031 -binance-futures,BTCUSDT,1582329618460000,1582329618581520,0.005,9684.7,9684.56,0.444 -binance-futures,BTCUSDT,1582329618469000,1582329618591210,0.005,9684.7,9684.45,0.031 -binance-futures,BTCUSDT,1582329618472000,1582329618592197,0.005,9684.7,9684.62,0.461 -binance-futures,BTCUSDT,1582329618490000,1582329618610321,0.005,9684.7,9684.62,3.561 -binance-futures,BTCUSDT,1582329618520000,1582329618639891,0.005,9684.7,9684.64,0.458 -binance-futures,BTCUSDT,1582329618543000,1582329618663067,0.005,9684.7,9684.68,0.031 -binance-futures,BTCUSDT,1582329618569000,1582329618688608,0.005,9684.7,9684.69,0.46 -binance-futures,BTCUSDT,1582329618593000,1582329618714908,0.005,9684.7,9684.68,0.031 -binance-futures,BTCUSDT,1582329618614000,1582329618734004,2,9684.69,9684.68,0.031 -binance-futures,BTCUSDT,1582329618677000,1582329618801254,2,9684.69,9684.68,0.03 -binance-futures,BTCUSDT,1582329618758000,1582329618875882,2.155,9684.69,9684.68,0.03 -binance-futures,BTCUSDT,1582329618786000,1582329618905644,2,9684.69,9684.68,0.03 -binance-futures,BTCUSDT,1582329618913000,1582329619034905,2,9684.69,9684.68,3.879 -binance-futures,BTCUSDT,1582329619184000,1582329619302354,2.155,9684.69,9684.68,3.879 -binance-futures,BTCUSDT,1582329619298000,1582329619419596,2.105,9684.69,9684.68,3.879 -binance-futures,BTCUSDT,1582329619343000,1582329619481914,1.95,9684.69,9684.68,3.879 -binance-futures,BTCUSDT,1582329619369000,1582329619499059,1.95,9684.69,9684.68,0.03 -binance-futures,BTCUSDT,1582329619508000,1582329619629530,2.105,9684.69,9684.68,0.03 -binance-futures,BTCUSDT,1582329619532000,1582329619652150,2.105,9684.69,9684.56,2.949 -binance-futures,BTCUSDT,1582329619539000,1582329619659646,1.95,9684.69,9684.56,2.949 -binance-futures,BTCUSDT,1582329619541000,1582329619661783,1.95,9684.69,9684.67,0.435 -binance-futures,BTCUSDT,1582329619593000,1582329619714625,1.95,9684.69,9684.6,0.031 -binance-futures,BTCUSDT,1582329619597000,1582329619717923,0.155,9684.61,9684.6,0.031 -binance-futures,BTCUSDT,1582329619645000,1582329619765984,0.005,9684.7,9684.6,0.031 -binance-futures,BTCUSDT,1582329619666000,1582329619786749,0.005,9684.7,9684.61,0.031 -binance-futures,BTCUSDT,1582329619771000,1582329619894353,0.005,9684.7,9684.62,0.031 -binance-futures,BTCUSDT,1582329619773000,1582329619894364,0.005,9684.7,9684.64,0.031 -binance-futures,BTCUSDT,1582329619876000,1582329619996967,0.005,9684.7,9684.65,0.031 -binance-futures,BTCUSDT,1582329619878000,1582329619996982,0.005,9684.7,9684.67,0.031 -binance-futures,BTCUSDT,1582329619994000,1582329620115350,0.005,9684.7,9684.66,0.031 -binance-futures,BTCUSDT,1582329619995000,1582329620116642,0.005,9684.7,9684.61,0.031 -binance-futures,BTCUSDT,1582329620020000,1582329620142293,0.005,9684.7,9684.69,0.031 -binance-futures,BTCUSDT,1582329620045000,1582329620166810,0.005,9684.7,9684.56,2.949 -binance-futures,BTCUSDT,1582329620067000,1582329620190236,0.005,9684.7,9684.6,0.031 -binance-futures,BTCUSDT,1582329620186000,1582329620305993,0.005,9684.7,9684.61,0.031 -binance-futures,BTCUSDT,1582329620355000,1582329620476538,11.936,9684.62,9684.61,0.031 -binance-futures,BTCUSDT,1582329620572000,1582329620723585,0.005,9684.7,9684.61,0.031 -binance-futures,BTCUSDT,1582329620617000,1582329620743407,0.005,9684.7,9684.61,0.43 -binance-futures,BTCUSDT,1582329620619000,1582329620743483,0.005,9684.7,9684.65,0.031 -binance-futures,BTCUSDT,1582329620642000,1582329620763523,0.005,9684.7,9684.63,0.031 -binance-futures,BTCUSDT,1582329620649000,1582329620768816,0.005,9684.7,9684.69,0.465 -binance-futures,BTCUSDT,1582329620670000,1582329620792309,0.005,9684.7,9684.66,0.031 -binance-futures,BTCUSDT,1582329620695000,1582329620816131,0.005,9684.7,9684.69,0.445 -binance-futures,BTCUSDT,1582329620845000,1582329620963554,0.005,9684.7,9684.66,0.031 -binance-futures,BTCUSDT,1582329620867000,1582329620985843,0.005,9684.7,9684.67,0.031 -binance-futures,BTCUSDT,1582329620899000,1582329621020745,0.005,9684.7,9684.69,0.429 -binance-futures,BTCUSDT,1582329620924000,1582329621046875,0.005,9684.7,9684.67,0.031 -binance-futures,BTCUSDT,1582329621059000,1582329621191326,1.827,9684,9683.09,4.463 -binance-futures,BTCUSDT,1582329621096000,1582329621218248,0.031,9683.96,9683.09,4.463 -binance-futures,BTCUSDT,1582329621111000,1582329621233606,0.031,9683.96,9683.21,0.44 -binance-futures,BTCUSDT,1582329621117000,1582329621238168,2.381,9683.96,9683.21,0.44 -binance-futures,BTCUSDT,1582329621121000,1582329621241910,2.35,9683.96,9683.21,0.44 -binance-futures,BTCUSDT,1582329621125000,1582329621244012,2.35,9683.96,9683.1,0.023 -binance-futures,BTCUSDT,1582329621129000,1582329621252956,2.35,9683.96,9683.14,0.449 -binance-futures,BTCUSDT,1582329621135000,1582329621257882,2.35,9683.96,9683.1,0.023 -binance-futures,BTCUSDT,1582329621143000,1582329621264034,0.031,9683.92,9683.1,0.023 -binance-futures,BTCUSDT,1582329621155000,1582329621276759,0.031,9683.92,9683.1,0.487 -binance-futures,BTCUSDT,1582329621159000,1582329621288962,0.031,9683.92,9683.13,0.447 -binance-futures,BTCUSDT,1582329621188000,1582329621306891,0.031,9683.92,9683.13,2.797 -binance-futures,BTCUSDT,1582329621189000,1582329621310908,0.031,9683.91,9683.13,2.797 -binance-futures,BTCUSDT,1582329621189000,1582329621310919,0.031,9683.9,9683.13,2.797 -binance-futures,BTCUSDT,1582329621198000,1582329621318870,0.031,9683.9,9683.13,2.35 -binance-futures,BTCUSDT,1582329621206000,1582329621327769,0.031,9683.9,9683.1,0.023 -binance-futures,BTCUSDT,1582329621211000,1582329621332758,0.031,9683.9,9683.21,0.466 -binance-futures,BTCUSDT,1582329621232000,1582329621352729,0.031,9683.91,9683.21,0.466 -binance-futures,BTCUSDT,1582329621235000,1582329621356298,0.031,9683.86,9683.13,0.67 -binance-futures,BTCUSDT,1582329621255000,1582329621373261,0.031,9683.91,9683.13,0.67 -binance-futures,BTCUSDT,1582329621258000,1582329621379161,0.031,9683.91,9683.1,0.023 -binance-futures,BTCUSDT,1582329621273000,1582329621419953,0.031,9683.91,9683.18,0.447 -binance-futures,BTCUSDT,1582329621275000,1582329621419972,0.031,9683.88,9683.18,0.447 -binance-futures,BTCUSDT,1582329621294000,1582329621420223,0.031,9683.88,9683.1,0.023 -binance-futures,BTCUSDT,1582329621344000,1582329621465487,0.031,9683.88,9683.14,0.446 -binance-futures,BTCUSDT,1582329621351000,1582329621471149,0.031,9683.88,9683.1,0.023 -binance-futures,BTCUSDT,1582329621366000,1582329621487840,0.003,9683.87,9683.1,0.023 -binance-futures,BTCUSDT,1582329621375000,1582329621496851,0.003,9683.87,9683.13,0.443 -binance-futures,BTCUSDT,1582329621387000,1582329621507998,0.031,9683.83,9683.13,0.443 -binance-futures,BTCUSDT,1582329621438000,1582329621558108,0.031,9683.83,9683.1,0.023 -binance-futures,BTCUSDT,1582329621454000,1582329621574830,0.031,9683.83,9683.12,0.456 -binance-futures,BTCUSDT,1582329621507000,1582329621625462,0.031,9683.83,9683.1,0.023 -binance-futures,BTCUSDT,1582329621529000,1582329621649654,0.031,9683.83,9683.1,0.466 -binance-futures,BTCUSDT,1582329621532000,1582329621651920,0.031,9683.83,9683.1,0.023 -binance-futures,BTCUSDT,1582329621613000,1582329621733046,0.003,9683.82,9683.1,0.023 -binance-futures,BTCUSDT,1582329621656000,1582329621776659,0.003,9683.82,9683.11,0.462 -binance-futures,BTCUSDT,1582329621679000,1582329621802973,0.031,9683.8,9683.11,0.462 -binance-futures,BTCUSDT,1582329621679000,1582329621802985,0.031,9683.78,9683.11,0.462 -binance-futures,BTCUSDT,1582329621746000,1582329621866626,0.031,9683.77,9683.11,0.462 -binance-futures,BTCUSDT,1582329621872000,1582329621990966,0.031,9683.77,9683.12,0.004 -binance-futures,BTCUSDT,1582329621873000,1582329621993733,0.003,9683.76,9683.12,0.023 -binance-futures,BTCUSDT,1582329621898000,1582329622020120,0.003,9683.76,9683.13,0.435 -binance-futures,BTCUSDT,1582329621921000,1582329622041210,0.031,9683.72,9683.13,0.435 -binance-futures,BTCUSDT,1582329621947000,1582329622067086,0.031,9683.72,9683.12,0.023 -binance-futures,BTCUSDT,1582329621964000,1582329622087082,0.031,9683.72,9683.15,0.462 -binance-futures,BTCUSDT,1582329621968000,1582329622090183,0.031,9683.71,9683.15,0.462 -binance-futures,BTCUSDT,1582329622141000,1582329622263831,0.031,9683.71,9683.16,0.019 -binance-futures,BTCUSDT,1582329622142000,1582329622263868,0.031,9683.71,9683.16,0.023 -binance-futures,BTCUSDT,1582329622173000,1582329622292050,0.031,9683.71,9683.16,0.474 -binance-futures,BTCUSDT,1582329622196000,1582329622318135,0.003,9683.99,9683.22,0.44 -binance-futures,BTCUSDT,1582329622217000,1582329622367011,0.031,9683.69,9683.22,0.44 -binance-futures,BTCUSDT,1582329622221000,1582329622369939,0.031,9683.68,9683.22,0.44 -binance-futures,BTCUSDT,1582329622267000,1582329622387430,0.031,9683.69,9683.22,0.44 -binance-futures,BTCUSDT,1582329622268000,1582329622390379,0.003,9683.99,9683.22,0.44 -binance-futures,BTCUSDT,1582329622272000,1582329622394546,0.031,9683.64,9683.22,0.44 -binance-futures,BTCUSDT,1582329622290000,1582329622411483,0.031,9683.65,9683.22,0.44 -binance-futures,BTCUSDT,1582329622292000,1582329622414872,0.003,9683.99,9683.22,0.44 -binance-futures,BTCUSDT,1582329622317000,1582329622437903,0.031,9683.97,9683.22,0.44 -binance-futures,BTCUSDT,1582329622317000,1582329622438972,0.031,9683.95,9683.22,0.44 -binance-futures,BTCUSDT,1582329622337000,1582329622456131,2.431,9683.95,9683.22,0.44 -binance-futures,BTCUSDT,1582329622360000,1582329622479259,0.031,9683.95,9683.22,0.44 -binance-futures,BTCUSDT,1582329622361000,1582329622484518,0.74,9683.94,9683.22,0.44 -binance-futures,BTCUSDT,1582329622363000,1582329622485683,1.41,9683.94,9683.22,0.44 -binance-futures,BTCUSDT,1582329622368000,1582329622487928,2.13,9683.94,9683.22,0.44 -binance-futures,BTCUSDT,1582329622369000,1582329622490910,2.81,9683.94,9683.22,0.44 -binance-futures,BTCUSDT,1582329622382000,1582329622501682,2.841,9683.94,9683.22,0.44 -binance-futures,BTCUSDT,1582329622382000,1582329622501692,6.391,9683.94,9683.22,0.44 -binance-futures,BTCUSDT,1582329622390000,1582329622510060,5.711,9683.94,9683.22,0.44 -binance-futures,BTCUSDT,1582329622392000,1582329622513169,1.421,9683.94,9683.22,0.44 -binance-futures,BTCUSDT,1582329622393000,1582329622516993,0.751,9683.94,9683.22,0.44 -binance-futures,BTCUSDT,1582329622395000,1582329622517024,0.003,9683.93,9683.23,0.023 -binance-futures,BTCUSDT,1582329622404000,1582329622523995,0.031,9683.9,9683.23,0.023 -binance-futures,BTCUSDT,1582329622422000,1582329622541266,3.031,9683.9,9683.23,0.023 -binance-futures,BTCUSDT,1582329622486000,1582329622608021,0.031,9683.86,9683.23,0.023 -binance-futures,BTCUSDT,1582329622504000,1582329622625233,4.381,9683.86,9683.23,0.023 -binance-futures,BTCUSDT,1582329622528000,1582329622648630,0.74,9683.85,9683.23,0.023 -binance-futures,BTCUSDT,1582329622539000,1582329622658107,1.42,9683.85,9683.23,0.023 -binance-futures,BTCUSDT,1582329622541000,1582329622661765,2.14,9683.85,9683.23,0.023 -binance-futures,BTCUSDT,1582329622543000,1582329622667064,2.81,9683.85,9683.23,0.023 -binance-futures,BTCUSDT,1582329622543000,1582329622667074,2.51,9683.85,9683.23,0.023 -binance-futures,BTCUSDT,1582329622546000,1582329622668034,6.56,9683.85,9683.23,0.023 -binance-futures,BTCUSDT,1582329622552000,1582329622673596,0.031,9683.81,9683.23,0.023 -binance-futures,BTCUSDT,1582329622576000,1582329622695522,3.981,9683.81,9683.23,0.023 -binance-futures,BTCUSDT,1582329622590000,1582329622712915,2.51,9683.8,9683.23,0.023 -binance-futures,BTCUSDT,1582329622597000,1582329622724436,0.031,9683.77,9683.23,0.023 -binance-futures,BTCUSDT,1582329622621000,1582329622744529,3.881,9683.77,9683.23,0.023 -binance-futures,BTCUSDT,1582329622652000,1582329622774303,0.031,9683.73,9683.23,0.023 -binance-futures,BTCUSDT,1582329622654000,1582329622776818,0.031,9683.73,9683.23,0.004 -binance-futures,BTCUSDT,1582329622658000,1582329622781601,0.031,9683.73,9683.11,0.023 -binance-futures,BTCUSDT,1582329622676000,1582329622800307,0.031,9683.71,9683.11,0.023 -binance-futures,BTCUSDT,1582329622684000,1582329622808935,0.031,9683.71,9683.11,0.456 -binance-futures,BTCUSDT,1582329622696000,1582329622817443,0.031,9683.71,9683.11,0.023 -binance-futures,BTCUSDT,1582329622698000,1582329622820453,3.781,9683.71,9683.11,0.023 -binance-futures,BTCUSDT,1582329622703000,1582329622823475,0.031,9683.68,9683.11,0.023 -binance-futures,BTCUSDT,1582329622722000,1582329622843258,3.131,9683.68,9683.11,0.023 -binance-futures,BTCUSDT,1582329622729000,1582329622849991,3.131,9683.68,9683.24,2.14 -binance-futures,BTCUSDT,1582329622738000,1582329622858694,0.031,9683.68,9683.24,2.14 -binance-futures,BTCUSDT,1582329622746000,1582329622866611,0.031,9683.68,9683.11,0.023 -binance-futures,BTCUSDT,1582329622748000,1582329622869007,0.031,9683.65,9683.11,0.023 -binance-futures,BTCUSDT,1582329622748000,1582329622869019,0.031,9683.64,9683.11,0.023 -binance-futures,BTCUSDT,1582329622765000,1582329622886708,0.031,9683.64,9683.2,0.45 -binance-futures,BTCUSDT,1582329622767000,1582329622889738,0.031,9683.65,9683.2,0.45 -binance-futures,BTCUSDT,1582329622769000,1582329622889832,0.031,9683.68,9683.2,0.45 -binance-futures,BTCUSDT,1582329622771000,1582329622892272,0.031,9683.68,9683.11,0.023 -binance-futures,BTCUSDT,1582329622788000,1582329622909395,0.031,9683.68,9683.13,0.432 -binance-futures,BTCUSDT,1582329622788000,1582329622909426,0.031,9683.6,9683.13,0.432 -binance-futures,BTCUSDT,1582329622810000,1582329622933188,0.031,9683.67,9683.13,0.432 -binance-futures,BTCUSDT,1582329622812000,1582329622933211,0.031,9683.65,9683.13,0.432 -binance-futures,BTCUSDT,1582329622840000,1582329622961304,0.031,9683.65,9683.24,2.14 -binance-futures,BTCUSDT,1582329622864000,1582329622986934,0.003,9683.76,9683.26,0.453 -binance-futures,BTCUSDT,1582329622889000,1582329623014684,0.031,9683.65,9683.26,0.453 -binance-futures,BTCUSDT,1582329622891000,1582329623015336,0.031,9683.64,9683.26,0.453 -binance-futures,BTCUSDT,1582329622904000,1582329623026485,0.031,9683.64,9683.27,0.019 -binance-futures,BTCUSDT,1582329622906000,1582329623028885,0.031,9683.64,9683.27,0.023 -binance-futures,BTCUSDT,1582329622929000,1582329623050917,0.031,9683.65,9683.27,0.023 -binance-futures,BTCUSDT,1582329622929000,1582329623051508,0.002,9683.76,9683.27,0.023 -binance-futures,BTCUSDT,1582329623036000,1582329623156077,0.031,9683.72,9683.27,0.023 -binance-futures,BTCUSDT,1582329623090000,1582329623209398,0.031,9683.72,9683.27,0.024 -binance-futures,BTCUSDT,1582329623110000,1582329623230479,2,9683.66,9683.27,0.024 -binance-futures,BTCUSDT,1582329623129000,1582329623248362,2,9683.64,9683.27,0.024 -binance-futures,BTCUSDT,1582329623133000,1582329623252457,0.031,9683.62,9683.27,0.024 -binance-futures,BTCUSDT,1582329623147000,1582329623267467,2,9683.58,9683.27,0.024 -binance-futures,BTCUSDT,1582329623225000,1582329623346677,2,9683.54,9683.27,0.024 -binance-futures,BTCUSDT,1582329623243000,1582329623362616,2,9683.52,9683.27,0.024 -binance-futures,BTCUSDT,1582329623245000,1582329623365177,2,9683.48,9683.27,0.024 -binance-futures,BTCUSDT,1582329623259000,1582329623380930,4,9683.48,9683.27,0.024 -binance-futures,BTCUSDT,1582329623268000,1582329623389790,2,9683.44,9683.27,0.024 -binance-futures,BTCUSDT,1582329623278000,1582329623399617,2,9683.42,9683.27,0.024 -binance-futures,BTCUSDT,1582329623297000,1582329623419226,2,9683.38,9683.27,0.024 -binance-futures,BTCUSDT,1582329623302000,1582329623424154,4.031,9683.38,9683.27,0.024 -binance-futures,BTCUSDT,1582329623317000,1582329623441236,2,9683.32,9683.27,0.024 -binance-futures,BTCUSDT,1582329623340000,1582329623461273,2,9683.28,9683.27,0.024 -binance-futures,BTCUSDT,1582329623368000,1582329623490794,2,9683.28,9683.27,0.694 -binance-futures,BTCUSDT,1582329623394000,1582329623513512,2,9683.28,9683.27,1.124 -binance-futures,BTCUSDT,1582329623405000,1582329623525168,2,9683.28,9683.27,3.116 -binance-futures,BTCUSDT,1582329623411000,1582329623536585,0.005,9683.61,9683.27,3.116 -binance-futures,BTCUSDT,1582329623413000,1582329623538730,0.005,9683.61,9683.27,3.115 -binance-futures,BTCUSDT,1582329623415000,1582329623539074,0.005,9683.61,9683.27,3.111 -binance-futures,BTCUSDT,1582329623431000,1582329623553212,0.001,9683.61,9683.27,3.111 -binance-futures,BTCUSDT,1582329623432000,1582329623554534,0.004,9683.99,9683.27,3.111 -binance-futures,BTCUSDT,1582329623438000,1582329623561694,0.004,9683.99,9683.3,0.439 -binance-futures,BTCUSDT,1582329623442000,1582329623563949,0.004,9683.99,9683.31,0.031 -binance-futures,BTCUSDT,1582329623463000,1582329623585787,0.004,9683.99,9683.3,0.439 -binance-futures,BTCUSDT,1582329623467000,1582329623587641,0.004,9683.99,9683.39,0.46 -binance-futures,BTCUSDT,1582329623492000,1582329623627335,0.031,9683.95,9683.39,0.46 -binance-futures,BTCUSDT,1582329623524000,1582329623642552,3.681,9683.95,9683.39,0.46 -binance-futures,BTCUSDT,1582329623545000,1582329623668527,0.031,9683.92,9683.39,0.46 -binance-futures,BTCUSDT,1582329623545000,1582329623668675,0.031,9683.91,9683.39,0.46 -binance-futures,BTCUSDT,1582329623568000,1582329623686122,4.231,9683.91,9683.39,0.46 -binance-futures,BTCUSDT,1582329623578000,1582329623694845,2,9683.87,9683.39,0.46 -binance-futures,BTCUSDT,1582329623591000,1582329623712239,2,9683.81,9683.39,0.46 -binance-futures,BTCUSDT,1582329623591000,1582329623712246,4,9683.81,9683.39,0.46 -binance-futures,BTCUSDT,1582329623595000,1582329623714487,6,9683.81,9683.39,0.46 -binance-futures,BTCUSDT,1582329623611000,1582329623732862,4,9683.75,9683.39,0.46 -binance-futures,BTCUSDT,1582329623622000,1582329623742657,4,9683.75,9683.27,1.992 -binance-futures,BTCUSDT,1582329623627000,1582329623747995,4,9683.75,9683.28,0.458 -binance-futures,BTCUSDT,1582329623629000,1582329623751018,2,9683.69,9683.28,0.458 -binance-futures,BTCUSDT,1582329623649000,1582329623784383,4,9683.69,9683.28,0.458 -binance-futures,BTCUSDT,1582329623653000,1582329623788158,6.3,9683.69,9683.28,0.458 -binance-futures,BTCUSDT,1582329623675000,1582329623800734,0.004,9683.68,9683.29,0.02 -binance-futures,BTCUSDT,1582329623675000,1582329623801189,0.005,9683.68,9683.29,0.024 -binance-futures,BTCUSDT,1582329623684000,1582329623804346,2,9683.63,9683.29,0.024 -binance-futures,BTCUSDT,1582329623686000,1582329623807961,4,9683.63,9683.29,0.024 -binance-futures,BTCUSDT,1582329623703000,1582329623824639,4,9683.63,9683.36,0.439 -binance-futures,BTCUSDT,1582329623706000,1582329623827253,2,9683.57,9683.36,0.439 -binance-futures,BTCUSDT,1582329623715000,1582329623835974,4,9683.57,9683.36,0.439 -binance-futures,BTCUSDT,1582329623738000,1582329623860410,0.031,9683.53,9683.36,0.439 -binance-futures,BTCUSDT,1582329623742000,1582329623861746,2,9683.51,9683.36,0.439 -binance-futures,BTCUSDT,1582329623758000,1582329623876576,2,9683.49,9683.36,0.439 -binance-futures,BTCUSDT,1582329623775000,1582329623893208,2,9683.43,9683.36,0.439 -binance-futures,BTCUSDT,1582329623797000,1582329623917796,0.031,9683.39,9683.36,0.439 -binance-futures,BTCUSDT,1582329623837000,1582329623958283,2,9683.38,9683.36,0.439 -binance-futures,BTCUSDT,1582329623932000,1582329624053840,2,9683.38,9683.36,1.109 -binance-futures,BTCUSDT,1582329623965000,1582329624087093,2,9683.38,9683.36,0.439 -binance-futures,BTCUSDT,1582329624002000,1582329624125828,2,9683.38,9683.36,1.109 -binance-futures,BTCUSDT,1582329624323000,1582329624449524,2,9683.38,9683.36,0.67 -binance-futures,BTCUSDT,1582329624364000,1582329624488353,2,9683.38,9683.37,0.436 -binance-futures,BTCUSDT,1582329624418000,1582329624542746,2,9683.38,9683.36,0.67 -binance-futures,BTCUSDT,1582329624451000,1582329624569704,2,9683.38,9683.37,0.43 -binance-futures,BTCUSDT,1582329624482000,1582329624603839,2,9683.38,9683.36,0.67 -binance-futures,BTCUSDT,1582329624499000,1582329624619885,2,9683.38,9683.37,0.444 -binance-futures,BTCUSDT,1582329624540000,1582329624661405,0.004,9683.99,9683.37,0.444 -binance-futures,BTCUSDT,1582329624566000,1582329624686334,0.004,9683.99,9683.46,0.467 -binance-futures,BTCUSDT,1582329624589000,1582329624709538,0.004,9683.99,9683.49,0.031 -binance-futures,BTCUSDT,1582329624590000,1582329624710526,0.004,9683.99,9683.5,0.031 -binance-futures,BTCUSDT,1582329624611000,1582329624732693,0.004,9683.99,9683.5,0.472 -binance-futures,BTCUSDT,1582329624619000,1582329624740064,0.004,9683.99,9683.61,0.441 -binance-futures,BTCUSDT,1582329624682000,1582329624801747,0.004,9683.99,9683.62,0.004 -binance-futures,BTCUSDT,1582329624684000,1582329624804737,0.004,9683.99,9683.62,0.024 -binance-futures,BTCUSDT,1582329624705000,1582329624824777,0.004,9683.99,9683.66,0.449 -binance-futures,BTCUSDT,1582329624705000,1582329624826673,0.004,9683.99,9683.66,0.48 -binance-futures,BTCUSDT,1582329624728000,1582329624847709,0.004,9683.99,9683.66,0.031 -binance-futures,BTCUSDT,1582329624749000,1582329624869039,0.004,9683.99,9683.68,0.031 -binance-futures,BTCUSDT,1582329624757000,1582329624875376,0.004,9683.99,9683.69,0.031 -binance-futures,BTCUSDT,1582329624774000,1582329624897182,0.004,9683.99,9683.76,0.446 -binance-futures,BTCUSDT,1582329624800000,1582329624919872,0.004,9683.99,9683.79,0.031 -binance-futures,BTCUSDT,1582329624802000,1582329624922608,0.004,9683.99,9683.8,0.031 -binance-futures,BTCUSDT,1582329624826000,1582329624949494,0.004,9683.99,9683.87,0.428 -binance-futures,BTCUSDT,1582329624854000,1582329624972730,0.004,9683.99,9683.9,0.031 -binance-futures,BTCUSDT,1582329624854000,1582329624975052,0.004,9683.99,9683.91,0.031 -binance-futures,BTCUSDT,1582329624881000,1582329625001184,0.004,9683.99,9683.96,0.429 -binance-futures,BTCUSDT,1582329624907000,1582329625029242,0.004,9683.99,9683.98,0.031 -binance-futures,BTCUSDT,1582329624934000,1582329625057471,0.724,9683.99,9683.98,0.031 -binance-futures,BTCUSDT,1582329624934000,1582329625057934,1.394,9683.99,9683.98,0.464 -binance-futures,BTCUSDT,1582329624942000,1582329625061716,1.394,9683.99,9683.98,0.031 -binance-futures,BTCUSDT,1582329624961000,1582329625081071,1.394,9683.99,9683.98,0.481 -binance-futures,BTCUSDT,1582329624963000,1582329625083839,1.834,9683.99,9683.98,0.481 -binance-futures,BTCUSDT,1582329624963000,1582329625084516,1.83,9683.99,9683.98,0.45 -binance-futures,BTCUSDT,1582329624967000,1582329625088472,1.83,9683.99,9683.87,3.933 -binance-futures,BTCUSDT,1582329624973000,1582329625093720,2.51,9683.99,9683.87,3.933 -binance-futures,BTCUSDT,1582329624980000,1582329625099102,2.51,9683.99,9683.94,0.461 -binance-futures,BTCUSDT,1582329624987000,1582329625107940,1.4,9683.99,9683.94,0.461 -binance-futures,BTCUSDT,1582329624996000,1582329625119216,0.68,9683.99,9683.94,0.461 -binance-futures,BTCUSDT,1582329625019000,1582329625139831,1.827,9684,9683.94,0.461 -binance-futures,BTCUSDT,1582329625019000,1582329625139842,0.44,9683.97,9683.94,0.461 -binance-futures,BTCUSDT,1582329625026000,1582329625146880,1.16,9683.97,9683.94,0.461 -binance-futures,BTCUSDT,1582329625035000,1582329625154505,1.83,9683.97,9683.94,0.461 -binance-futures,BTCUSDT,1582329625044000,1582329625164712,1.83,9683.97,9683.96,0.031 -binance-futures,BTCUSDT,1582329625046000,1582329625165074,1.39,9683.97,9683.96,0.031 -binance-futures,BTCUSDT,1582329625048000,1582329625167316,0.67,9683.97,9683.96,0.031 -binance-futures,BTCUSDT,1582329625063000,1582329625182208,0.44,9683.95,9683.94,0.461 -binance-futures,BTCUSDT,1582329625086000,1582329625207579,0.44,9683.95,9683.87,3.933 -binance-futures,BTCUSDT,1582329625094000,1582329625215039,0.67,9683.95,9683.87,3.933 -binance-futures,BTCUSDT,1582329625113000,1582329625235295,0.031,9683.93,9683.87,3.933 -binance-futures,BTCUSDT,1582329625115000,1582329625235888,0.031,9683.91,9683.87,3.933 -binance-futures,BTCUSDT,1582329625165000,1582329625285037,0.031,9683.9,9683.87,3.933 -binance-futures,BTCUSDT,1582329625186000,1582329625308780,2,9683.88,9683.87,3.933 -binance-futures,BTCUSDT,1582329625205000,1582329625324514,4,9683.88,9683.87,3.933 -binance-futures,BTCUSDT,1582329625244000,1582329625363379,4,9683.88,9683.87,4.387 -binance-futures,BTCUSDT,1582329625324000,1582329625443078,4.083,9683.88,9683.87,4.387 -binance-futures,BTCUSDT,1582329625346000,1582329625475021,4.753,9683.88,9683.87,4.387 -binance-futures,BTCUSDT,1582329625350000,1582329625476138,5.193,9683.88,9683.87,4.387 -binance-futures,BTCUSDT,1582329625353000,1582329625476419,5.913,9683.88,9683.87,4.387 -binance-futures,BTCUSDT,1582329625360000,1582329625477529,6.593,9683.88,9683.87,4.387 -binance-futures,BTCUSDT,1582329625420000,1582329625536452,6.593,9683.88,9683.87,3.933 -binance-futures,BTCUSDT,1582329625472000,1582329625592160,6.593,9683.88,9683.87,4.363 -binance-futures,BTCUSDT,1582329625478000,1582329625598194,6.593,9683.88,9683.87,3.933 -binance-futures,BTCUSDT,1582329625540000,1582329625659810,6.593,9683.88,9683.87,4.378 -binance-futures,BTCUSDT,1582329625598000,1582329625721641,6.593,9683.88,9683.87,3.933 -binance-futures,BTCUSDT,1582329625820000,1582329625939600,4.593,9683.88,9683.87,3.933 -binance-futures,BTCUSDT,1582329626336000,1582329626454952,4.51,9683.88,9683.87,3.933 -binance-futures,BTCUSDT,1582329626354000,1582329626474306,3.79,9683.88,9683.87,3.933 -binance-futures,BTCUSDT,1582329626361000,1582329626479460,2.68,9683.88,9683.87,3.933 -binance-futures,BTCUSDT,1582329626364000,1582329626482873,2,9683.88,9683.87,3.933 -binance-futures,BTCUSDT,1582329626649000,1582329626767286,2.083,9683.88,9683.87,3.933 -binance-futures,BTCUSDT,1582329626781000,1582329626901942,2.083,9683.88,9683.1,0.024 -binance-futures,BTCUSDT,1582329626781000,1582329626904877,2.083,9683.88,9683.71,3.203 -binance-futures,BTCUSDT,1582329626799000,1582329626921516,2,9683.85,9683.71,3.203 -binance-futures,BTCUSDT,1582329626803000,1582329626923746,2,9683.82,9683.71,3.203 -binance-futures,BTCUSDT,1582329626861000,1582329626982747,0.083,9683.72,9683.71,3.203 -binance-futures,BTCUSDT,1582329626889000,1582329627010185,0.083,9683.72,9683.71,3.637 -binance-futures,BTCUSDT,1582329626998000,1582329627121023,0.081,9683.72,9683.71,3.637 -binance-futures,BTCUSDT,1582329627055000,1582329627175046,0.004,9683.99,9683.71,3.637 -binance-futures,BTCUSDT,1582329627077000,1582329627203908,0.031,9683.97,9683.74,0.467 -binance-futures,BTCUSDT,1582329627079000,1582329627204938,0.031,9683.95,9683.74,0.467 -binance-futures,BTCUSDT,1582329627083000,1582329627206116,0.031,9683.95,9683.71,3.203 -binance-futures,BTCUSDT,1582329627103000,1582329627225646,2,9683.89,9683.71,3.203 -binance-futures,BTCUSDT,1582329627124000,1582329627266739,6.45,9683.89,9683.71,3.203 -binance-futures,BTCUSDT,1582329627134000,1582329627283184,0.031,9683.85,9683.71,3.203 -binance-futures,BTCUSDT,1582329627164000,1582329627287238,2,9683.83,9683.71,3.203 -binance-futures,BTCUSDT,1582329627186000,1582329627308113,5.45,9683.83,9683.71,3.203 -binance-futures,BTCUSDT,1582329627199000,1582329627319815,0.72,9683.82,9683.71,3.203 -binance-futures,BTCUSDT,1582329627204000,1582329627337455,2,9683.77,9683.71,3.203 -binance-futures,BTCUSDT,1582329627208000,1582329627338347,2,9683.77,9683.71,2.203 -binance-futures,BTCUSDT,1582329627233000,1582329627356115,4,9683.75,9683.71,2.203 -binance-futures,BTCUSDT,1582329627235000,1582329627356690,2,9683.72,9683.71,2.203 -binance-futures,BTCUSDT,1582329627239000,1582329627361996,4,9683.72,9683.71,2.203 -binance-futures,BTCUSDT,1582329627256000,1582329627379755,10.5,9683.72,9683.71,2.203 -binance-futures,BTCUSDT,1582329627256000,1582329627380639,14.5,9683.72,9683.71,2.203 -binance-futures,BTCUSDT,1582329627269000,1582329627392313,12.5,9683.72,9683.71,2.203 -binance-futures,BTCUSDT,1582329627275000,1582329627397542,6,9683.72,9683.71,2.203 -binance-futures,BTCUSDT,1582329627297000,1582329627418880,6.081,9683.72,9683.71,2.203 -binance-futures,BTCUSDT,1582329627542000,1582329627662691,4.081,9683.72,9683.71,2.203 -binance-futures,BTCUSDT,1582329627544000,1582329627665092,2.081,9683.72,9683.71,2.203 -binance-futures,BTCUSDT,1582329627710000,1582329627830744,2.081,9683.72,9683.71,2.631 -binance-futures,BTCUSDT,1582329627733000,1582329627857035,2.081,9683.72,9683.71,2.203 -binance-futures,BTCUSDT,1582329627791000,1582329627912215,2,9683.72,9683.71,2.203 -binance-futures,BTCUSDT,1582329627825000,1582329627943674,2,9683.72,9683.71,2.635 -binance-futures,BTCUSDT,1582329627833000,1582329627952080,2,9683.72,9683.71,2.203 -binance-futures,BTCUSDT,1582329627864000,1582329627983931,2,9683.72,9683.71,2.672 -binance-futures,BTCUSDT,1582329627881000,1582329628002848,2,9683.72,9683.71,2.203 -binance-futures,BTCUSDT,1582329628047000,1582329628166074,2,9683.72,9683.71,2.661 -binance-futures,BTCUSDT,1582329628067000,1582329628187836,2,9683.72,9683.71,2.203 -binance-futures,BTCUSDT,1582329628096000,1582329628219394,2,9683.72,9683.69,0.447 -binance-futures,BTCUSDT,1582329628099000,1582329628221330,2,9683.72,9683.71,0.447 -binance-futures,BTCUSDT,1582329628105000,1582329628226985,2,9683.72,9683.53,2.043 -binance-futures,BTCUSDT,1582329628122000,1582329628244654,0.031,9683.7,9683.53,2.043 -binance-futures,BTCUSDT,1582329628123000,1582329628246238,0.031,9683.68,9683.53,2.043 -binance-futures,BTCUSDT,1582329628144000,1582329628263719,2,9683.67,9683.53,2.043 -binance-futures,BTCUSDT,1582329628192000,1582329628323673,0.72,9683.66,9683.53,2.043 -binance-futures,BTCUSDT,1582329628210000,1582329628337607,1.83,9683.66,9683.53,2.043 -binance-futures,BTCUSDT,1582329628222000,1582329628342586,2,9683.6,9683.53,2.043 -binance-futures,BTCUSDT,1582329628243000,1582329628362727,2,9683.6,9683.55,0.43 -binance-futures,BTCUSDT,1582329628248000,1582329628369246,0.44,9683.59,9683.55,0.43 -binance-futures,BTCUSDT,1582329628258000,1582329628381812,1.12,9683.59,9683.55,0.43 -binance-futures,BTCUSDT,1582329628260000,1582329628383246,1.79,9683.59,9683.55,0.43 -binance-futures,BTCUSDT,1582329628264000,1582329628384741,2.51,9683.59,9683.55,0.43 -binance-futures,BTCUSDT,1582329628267000,1582329628387191,2,9683.56,9683.55,0.43 -binance-futures,BTCUSDT,1582329628271000,1582329628392744,2.031,9683.56,9683.55,0.43 -binance-futures,BTCUSDT,1582329628284000,1582329628405285,2.031,9683.56,9683.53,2.043 -binance-futures,BTCUSDT,1582329628297000,1582329628425275,2.031,9683.56,9683.55,0.435 -binance-futures,BTCUSDT,1582329628308000,1582329628440742,2.031,9683.56,9683.53,2.043 -binance-futures,BTCUSDT,1582329628319000,1582329628441804,0.44,9683.55,9683.54,0.447 -binance-futures,BTCUSDT,1582329628323000,1582329628442020,0.44,9683.55,9683.53,2.043 -binance-futures,BTCUSDT,1582329628328000,1582329628447936,0.031,9683.54,9683.53,2.043 -binance-futures,BTCUSDT,1582329628337000,1582329628456454,0.751,9683.54,9683.53,2.043 -binance-futures,BTCUSDT,1582329628347000,1582329628469180,2.751,9683.54,9683.53,2.043 -binance-futures,BTCUSDT,1582329628349000,1582329628472215,4.751,9683.54,9683.53,2.043 -binance-futures,BTCUSDT,1582329628366000,1582329628488431,4.751,9683.54,9683.53,2.496 -binance-futures,BTCUSDT,1582329628368000,1582329628488445,5.421,9683.54,9683.53,2.496 -binance-futures,BTCUSDT,1582329628371000,1582329628493472,5.425,9683.54,9683.53,2.496 -binance-futures,BTCUSDT,1582329628375000,1582329628496663,5.425,9683.54,9683.53,0.453 -binance-futures,BTCUSDT,1582329628376000,1582329628499638,4.705,9683.54,9683.53,0.453 -binance-futures,BTCUSDT,1582329628380000,1582329628501733,5.825,9683.54,9683.37,5.362 -binance-futures,BTCUSDT,1582329628388000,1582329628508629,5.829,9683.54,9683.37,5.362 -binance-futures,BTCUSDT,1582329628396000,1582329628516128,5.829,9683.54,9683.44,0.465 -binance-futures,BTCUSDT,1582329628400000,1582329628520542,5.829,9683.54,9683.37,5.362 -binance-futures,BTCUSDT,1582329628400000,1582329628520553,2,9683.48,9683.37,5.362 -binance-futures,BTCUSDT,1582329628418000,1582329628539079,2,9683.48,9683.38,0.44 -binance-futures,BTCUSDT,1582329628425000,1582329628546725,0.031,9683.45,9683.38,0.44 -binance-futures,BTCUSDT,1582329628425000,1582329628548074,0.031,9683.44,9683.38,0.44 -binance-futures,BTCUSDT,1582329628467000,1582329628588261,0.701,9683.44,9683.38,0.44 -binance-futures,BTCUSDT,1582329628485000,1582329628605092,1.421,9683.44,9683.38,0.44 -binance-futures,BTCUSDT,1582329628490000,1582329628613879,0.031,9683.41,9683.38,0.44 -binance-futures,BTCUSDT,1582329628494000,1582329628614744,0.031,9683.4,9683.38,0.44 -binance-futures,BTCUSDT,1582329628539000,1582329628661101,0.031,9683.39,9683.38,0.44 -binance-futures,BTCUSDT,1582329628644000,1582329628761063,0.031,9683.4,9683.38,0.44 -binance-futures,BTCUSDT,1582329628647000,1582329628765432,0.031,9683.44,9683.38,0.44 -binance-futures,BTCUSDT,1582329628672000,1582329628791234,0.44,9683.43,9683.38,0.44 -binance-futures,BTCUSDT,1582329628679000,1582329628799827,1.16,9683.43,9683.38,0.44 -binance-futures,BTCUSDT,1582329628682000,1582329628802183,1.83,9683.43,9683.38,0.44 -binance-futures,BTCUSDT,1582329628686000,1582329628808393,2.51,9683.43,9683.38,0.44 -binance-futures,BTCUSDT,1582329628695000,1582329628815919,0.031,9683.4,9683.38,0.44 -binance-futures,BTCUSDT,1582329628701000,1582329628822832,0.031,9683.39,9683.38,0.44 -binance-futures,BTCUSDT,1582329628709000,1582329628830335,0.031,9683.39,9683.37,5.362 -binance-futures,BTCUSDT,1582329628727000,1582329628849272,2,9683.38,9683.37,5.362 -binance-futures,BTCUSDT,1582329628749000,1582329628870990,2.031,9683.38,9683.37,5.362 -binance-futures,BTCUSDT,1582329628755000,1582329628874618,2.031,9683.38,9683.37,5.791 -binance-futures,BTCUSDT,1582329629107000,1582329629228045,2.031,9683.38,9683.37,0.429 -binance-futures,BTCUSDT,1582329629329000,1582329629449183,2.031,9683.38,9683.1,0.022 -binance-futures,BTCUSDT,1582329629348000,1582329629471894,2,9683.32,9683.1,0.022 -binance-futures,BTCUSDT,1582329629368000,1582329629489708,2,9683.28,9683.1,0.022 -binance-futures,BTCUSDT,1582329629375000,1582329629498696,2.031,9683.28,9683.1,0.022 -binance-futures,BTCUSDT,1582329629390000,1582329629509512,2,9683.22,9683.1,0.022 -binance-futures,BTCUSDT,1582329629441000,1582329629560488,0.44,9683.2,9683.1,0.022 -binance-futures,BTCUSDT,1582329629450000,1582329629572668,1.16,9683.2,9683.1,0.022 -binance-futures,BTCUSDT,1582329629456000,1582329629575938,1.16,9683.2,9683.12,0.43 -binance-futures,BTCUSDT,1582329629461000,1582329629582768,0.72,9683.2,9683.12,0.43 -binance-futures,BTCUSDT,1582329629465000,1582329629586647,0.031,9683.16,9683.12,0.43 -binance-futures,BTCUSDT,1582329629532000,1582329629655089,0.031,9683.14,9683.12,0.43 -binance-futures,BTCUSDT,1582329629534000,1582329629657763,0.031,9683.13,9683.12,0.43 -binance-futures,BTCUSDT,1582329629556000,1582329629677742,0.711,9683.13,9683.12,0.43 -binance-futures,BTCUSDT,1582329629561000,1582329629683718,1.381,9683.13,9683.12,0.43 -binance-futures,BTCUSDT,1582329629589000,1582329629709865,2.101,9683.13,9683.12,0.43 -binance-futures,BTCUSDT,1582329629639000,1582329629758147,2.541,9683.13,9683.12,0.43 -binance-futures,BTCUSDT,1582329629753000,1582329629872492,2.541,9683.13,9683.09,4.463 -binance-futures,BTCUSDT,1582329629768000,1582329629888432,2.541,9683.13,9683.12,0.43 -binance-futures,BTCUSDT,1582329630235000,1582329630354697,2.541,9683.13,9683.09,4.463 -binance-futures,BTCUSDT,1582329630252000,1582329630370525,2,9683.1,9683.09,4.463 -binance-futures,BTCUSDT,1582329630252000,1582329630371294,4,9683.1,9683.09,4.463 -binance-futures,BTCUSDT,1582329630274000,1582329630417646,4.44,9683.1,9683.09,4.463 -binance-futures,BTCUSDT,1582329630279000,1582329630421509,5.16,9683.1,9683.09,4.463 -binance-futures,BTCUSDT,1582329630286000,1582329630422331,6.51,9683.1,9683.09,4.463 -binance-futures,BTCUSDT,1582329630328000,1582329630449385,6.51,9683.1,9683.09,4.909 -binance-futures,BTCUSDT,1582329630370000,1582329630488906,6.591,9683.1,9683.09,4.909 -binance-futures,BTCUSDT,1582329630485000,1582329630604913,6.51,9683.1,9683.09,4.909 -binance-futures,BTCUSDT,1582329630556000,1582329630675318,6.591,9683.1,9683.09,4.909 -binance-futures,BTCUSDT,1582329630573000,1582329630691794,4.591,9683.1,9683.09,4.909 -binance-futures,BTCUSDT,1582329630578000,1582329630700512,2.591,9683.1,9683.09,4.909 -binance-futures,BTCUSDT,1582329630592000,1582329630713905,2.151,9683.1,9683.09,4.909 -binance-futures,BTCUSDT,1582329630595000,1582329630716939,1.471,9683.1,9683.09,4.909 -binance-futures,BTCUSDT,1582329630599000,1582329630720886,0.751,9683.1,9683.09,4.909 -binance-futures,BTCUSDT,1582329630607000,1582329630728807,0.081,9683.1,9683.09,4.909 -binance-futures,BTCUSDT,1582329630641000,1582329630761508,0.081,9683.1,9683.09,7.019 -binance-futures,BTCUSDT,1582329630663000,1582329630784035,0.081,9683.1,9683.09,4.909 -binance-futures,BTCUSDT,1582329630675000,1582329630794442,0.031,9683.13,9683.09,4.909 -binance-futures,BTCUSDT,1582329630698000,1582329630818148,0.031,9683.13,9683.09,4.463 -binance-futures,BTCUSDT,1582329630698000,1582329630818168,0.031,9683.13,9683.12,0.44 -binance-futures,BTCUSDT,1582329630798000,1582329630918384,0.031,9683.13,9683.12,0.459 -binance-futures,BTCUSDT,1582329630821000,1582329630941509,0.031,9683.15,9683.12,0.459 -binance-futures,BTCUSDT,1582329630823000,1582329630943515,0.002,9683.99,9683.12,0.459 -binance-futures,BTCUSDT,1582329630844000,1582329630966318,0.002,9683.99,9683.12,0.019 -binance-futures,BTCUSDT,1582329630846000,1582329630970061,0.031,9683.97,9683.14,0.47 -binance-futures,BTCUSDT,1582329630848000,1582329630970662,0.031,9683.95,9683.14,0.47 -binance-futures,BTCUSDT,1582329630867000,1582329630990558,6.181,9683.95,9683.14,0.47 -binance-futures,BTCUSDT,1582329630870000,1582329630993544,6.621,9683.95,9683.14,0.47 -binance-futures,BTCUSDT,1582329630876000,1582329631000365,7.301,9683.95,9683.14,0.47 -binance-futures,BTCUSDT,1582329630878000,1582329631000382,8.021,9683.95,9683.14,0.47 -binance-futures,BTCUSDT,1582329630884000,1582329631007339,8.691,9683.95,9683.14,0.47 -binance-futures,BTCUSDT,1582329630893000,1582329631015108,0.031,9683.92,9683.14,0.47 -binance-futures,BTCUSDT,1582329630893000,1582329631015119,0.031,9683.91,9683.14,0.47 -binance-futures,BTCUSDT,1582329630913000,1582329631033758,5.181,9683.91,9683.14,0.47 -binance-futures,BTCUSDT,1582329630929000,1582329631061179,0.045,9683,9682.3,3.256 -binance-futures,BTCUSDT,1582329630951000,1582329631070942,0.045,9683,9682.87,0.448 -binance-futures,BTCUSDT,1582329630953000,1582329631073005,0.045,9683,9682.3,3.256 -binance-futures,BTCUSDT,1582329630959000,1582329631081972,2,9682.96,9682.3,3.256 -binance-futures,BTCUSDT,1582329630969000,1582329631090920,2,9682.96,9682.32,0.459 -binance-futures,BTCUSDT,1582329630973000,1582329631096086,2,9682.94,9682.32,0.459 -binance-futures,BTCUSDT,1582329630979000,1582329631102161,2,9682.94,9682.88,0.67 -binance-futures,BTCUSDT,1582329630997000,1582329631122864,2,9682.9,9682.88,0.67 -binance-futures,BTCUSDT,1582329631000000,1582329631126736,2.031,9682.9,9682.3,3.256 -binance-futures,BTCUSDT,1582329631003000,1582329631129054,0.072,9682.89,9682.3,3.256 -binance-futures,BTCUSDT,1582329631014000,1582329631137325,4.031,9682.9,9682.3,3.256 -binance-futures,BTCUSDT,1582329631018000,1582329631142944,4.031,9682.9,9682.46,0.47 -binance-futures,BTCUSDT,1582329631020000,1582329631145086,2,9682.89,9682.46,0.47 -binance-futures,BTCUSDT,1582329631025000,1582329631148706,2,9682.85,9682.46,0.47 -binance-futures,BTCUSDT,1582329631027000,1582329631155748,2,9682.85,9682.3,3.256 -binance-futures,BTCUSDT,1582329631039000,1582329631165257,7.4,9682.89,9682.31,0.464 -binance-futures,BTCUSDT,1582329631045000,1582329631171829,0.031,9682.87,9682.31,0.464 -binance-futures,BTCUSDT,1582329631049000,1582329631173778,2,9682.79,9682.31,0.464 -binance-futures,BTCUSDT,1582329631053000,1582329631177522,2,9682.79,9682.3,3.256 -binance-futures,BTCUSDT,1582329631063000,1582329631188632,0.031,9682.86,9682.3,3.256 -binance-futures,BTCUSDT,1582329631065000,1582329631188930,2,9682.81,9682.3,3.256 -binance-futures,BTCUSDT,1582329631071000,1582329631196267,2,9682.75,9682.3,3.256 -binance-futures,BTCUSDT,1582329631082000,1582329631206367,2,9682.73,9682.3,3.256 -binance-futures,BTCUSDT,1582329631091000,1582329631212804,2,9682.73,9682.36,2.1 -binance-futures,BTCUSDT,1582329631105000,1582329631226710,2,9682.71,9682.36,2.1 -binance-futures,BTCUSDT,1582329631111000,1582329631235135,2.031,9682.71,9682.36,2.1 -binance-futures,BTCUSDT,1582329631112000,1582329631236243,0.031,9682.7,9682.36,2.1 -binance-futures,BTCUSDT,1582329631114000,1582329631236281,0.031,9682.69,9682.36,2.1 -binance-futures,BTCUSDT,1582329631126000,1582329631249460,0.031,9682.69,9682.45,0.437 -binance-futures,BTCUSDT,1582329631188000,1582329631312008,0.031,9682.68,9682.45,0.437 -binance-futures,BTCUSDT,1582329631388000,1582329631508770,0.031,9682.68,9682.67,2.1 -binance-futures,BTCUSDT,1582329631412000,1582329631533613,0.031,9682.68,9682.67,2.528 -binance-futures,BTCUSDT,1582329631502000,1582329631623822,0.031,9682.68,9682.67,2.1 -binance-futures,BTCUSDT,1582329631515000,1582329631635718,0.031,9682.68,9682.67,2.561 -binance-futures,BTCUSDT,1582329631518000,1582329631638644,0.031,9682.68,9682.67,6.464 -binance-futures,BTCUSDT,1582329631566000,1582329631687773,0.103,9682.68,9682.67,6.464 -binance-futures,BTCUSDT,1582329631570000,1582329631691092,0.103,9682.68,9682.67,6.003 -binance-futures,BTCUSDT,1582329631583000,1582329631720366,0.386,9684,9682.67,6.003 -binance-futures,BTCUSDT,1582329631596000,1582329631726108,0.072,9683.53,9682.67,3.903 -binance-futures,BTCUSDT,1582329631624000,1582329631744628,0.003,9683.99,9682.68,0.02 -binance-futures,BTCUSDT,1582329631625000,1582329631746708,0.047,9683.99,9682.68,0.02 -binance-futures,BTCUSDT,1582329631627000,1582329631751307,0.487,9683.99,9682.68,0.02 -binance-futures,BTCUSDT,1582329631629000,1582329631753808,1.833,9683.99,9682.68,0.02 -binance-futures,BTCUSDT,1582329631631000,1582329631754524,1.833,9683.99,9682.79,0.463 -binance-futures,BTCUSDT,1582329631635000,1582329631756618,2.513,9683.99,9682.79,0.463 -binance-futures,BTCUSDT,1582329631654000,1582329631775635,1.123,9683.99,9682.79,2.763 -binance-futures,BTCUSDT,1582329631660000,1582329631781325,1.123,9683.99,9682.79,2.3 -binance-futures,BTCUSDT,1582329631663000,1582329631786299,0.044,9683.98,9682.79,2.3 -binance-futures,BTCUSDT,1582329631667000,1582329631787581,0.044,9683.98,9682.68,2.127 -binance-futures,BTCUSDT,1582329631669000,1582329631789033,0.044,9683.98,9682.71,0.44 -binance-futures,BTCUSDT,1582329631675000,1582329631797898,0.003,9683.99,9682.71,0.44 -binance-futures,BTCUSDT,1582329631681000,1582329631800483,0.003,9683.99,9682.85,0.467 -binance-futures,BTCUSDT,1582329631696000,1582329631812073,2.8,9683.98,9682.85,0.467 -binance-futures,BTCUSDT,1582329631861000,1582329631979553,0.003,9683.99,9682.85,0.467 -binance-futures,BTCUSDT,1582329631866000,1582329631989210,0.386,9684,9682.85,0.467 -binance-futures,BTCUSDT,1582329631867000,1582329631991501,0.003,9683.97,9682.85,0.467 -binance-futures,BTCUSDT,1582329631869000,1582329631991853,0.003,9683.97,9682.86,0.017 -binance-futures,BTCUSDT,1582329631869000,1582329631991861,0.003,9683.97,9682.86,0.037 -binance-futures,BTCUSDT,1582329631883000,1582329632003661,0.003,9683.97,9682.88,0.031 -binance-futures,BTCUSDT,1582329631884000,1582329632005298,0.003,9683.97,9682.89,0.031 -binance-futures,BTCUSDT,1582329631887000,1582329632008158,3.603,9683.97,9682.89,0.031 -binance-futures,BTCUSDT,1582329631897000,1582329632017316,0.044,9683.84,9682.89,0.031 -binance-futures,BTCUSDT,1582329631911000,1582329632031884,0.003,9683.97,9682.89,0.031 -binance-futures,BTCUSDT,1582329631914000,1582329632037079,2.55,9683.84,9682.97,0.438 -binance-futures,BTCUSDT,1582329631928000,1582329632050087,0.007,9683.97,9682.97,0.438 -binance-futures,BTCUSDT,1582329632059000,1582329632178464,0.007,9683.97,9683,0.031 -binance-futures,BTCUSDT,1582329632061000,1582329632180631,0.007,9683.97,9683.01,0.031 -binance-futures,BTCUSDT,1582329632077000,1582329632197996,0.044,9683.84,9683.01,0.031 -binance-futures,BTCUSDT,1582329632083000,1582329632204533,0.007,9683.97,9683.01,0.031 -binance-futures,BTCUSDT,1582329632091000,1582329632210249,0.007,9683.97,9683.07,0.436 -binance-futures,BTCUSDT,1582329632116000,1582329632236477,0.004,9683.97,9683.07,0.436 -binance-futures,BTCUSDT,1582329632119000,1582329632241555,0.004,9683.97,9683.08,0.02 -binance-futures,BTCUSDT,1582329632119000,1582329632241585,0.386,9684,9683.08,0.02 -binance-futures,BTCUSDT,1582329632138000,1582329632258535,0.386,9684,9683.11,0.031 -binance-futures,BTCUSDT,1582329632168000,1582329632292728,0.386,9684,9683.12,0.432 -binance-futures,BTCUSDT,1582329632186000,1582329632308986,0.386,9684,9683.11,0.031 -binance-futures,BTCUSDT,1582329632194000,1582329632316024,0.044,9683.85,9683.11,0.031 -binance-futures,BTCUSDT,1582329632195000,1582329632319639,0.044,9683.85,9683.16,0.031 -binance-futures,BTCUSDT,1582329632218000,1582329632365836,0.044,9683.85,9683.11,0.031 -binance-futures,BTCUSDT,1582329632227000,1582329632377353,0.386,9684,9683.19,0.467 -binance-futures,BTCUSDT,1582329632271000,1582329632393423,0.44,9683.99,9683.19,0.467 -binance-futures,BTCUSDT,1582329632278000,1582329632401105,1.84,9683.99,9683.14,0.031 -binance-futures,BTCUSDT,1582329632285000,1582329632406322,2.51,9683.99,9683.14,0.031 -binance-futures,BTCUSDT,1582329632292000,1582329632414846,5.11,9683.99,9683.14,0.031 -binance-futures,BTCUSDT,1582329632294000,1582329632417529,5.11,9683.99,9683.14,0.483 -binance-futures,BTCUSDT,1582329632296000,1582329632418267,5.11,9683.99,9683.14,0.452 -binance-futures,BTCUSDT,1582329632305000,1582329632425635,2.51,9683.99,9683.14,0.452 -binance-futures,BTCUSDT,1582329632305000,1582329632428956,2.51,9683.99,9683.08,0.02 -binance-futures,BTCUSDT,1582329632307000,1582329632429065,2.51,9683.99,9683.18,0.447 -binance-futures,BTCUSDT,1582329632322000,1582329632441869,2.51,9683.99,9683.08,0.02 -binance-futures,BTCUSDT,1582329632330000,1582329632451684,1.83,9683.99,9683.08,0.02 -binance-futures,BTCUSDT,1582329632338000,1582329632476825,0.44,9683.99,9683.08,0.02 -binance-futures,BTCUSDT,1582329632342000,1582329632476862,0.386,9684,9683.08,0.02 -binance-futures,BTCUSDT,1582329632375000,1582329632494775,0.003,9683.98,9683.08,0.02 -binance-futures,BTCUSDT,1582329632379000,1582329632501542,0.007,9683.98,9683.08,0.02 -binance-futures,BTCUSDT,1582329632383000,1582329632505315,0.007,9683.98,9683.12,0.031 -binance-futures,BTCUSDT,1582329632394000,1582329632516972,3.107,9683.98,9683.12,0.031 -binance-futures,BTCUSDT,1582329632403000,1582329632525656,3.151,9683.98,9683.12,0.031 -binance-futures,BTCUSDT,1582329632403000,1582329632525681,3.151,9683.98,9683.1,0.031 -binance-futures,BTCUSDT,1582329632405000,1582329632528295,3.151,9683.98,9682.88,0.02 -binance-futures,BTCUSDT,1582329632411000,1582329632534180,3.107,9683.98,9683.12,0.466 -binance-futures,BTCUSDT,1582329632421000,1582329632545210,0.68,9683.96,9683.12,0.466 -binance-futures,BTCUSDT,1582329632421000,1582329632545221,0.68,9683.96,9683.12,0.057 -binance-futures,BTCUSDT,1582329632427000,1582329632548311,0.68,9683.96,9682.88,0.02 -binance-futures,BTCUSDT,1582329632427000,1582329632548344,1.79,9683.96,9682.88,0.02 -binance-futures,BTCUSDT,1582329632430000,1582329632552985,2.51,9683.96,9682.88,0.02 -binance-futures,BTCUSDT,1582329632444000,1582329632567387,6.96,9683.96,9682.88,0.489 -binance-futures,BTCUSDT,1582329632447000,1582329632567653,6.29,9683.96,9682.88,0.489 -binance-futures,BTCUSDT,1582329632450000,1582329632572694,5.61,9683.96,9682.88,0.02 -binance-futures,BTCUSDT,1582329632452000,1582329632574174,5.61,9683.96,9683.01,2.016 -binance-futures,BTCUSDT,1582329632453000,1582329632577175,5.17,9683.96,9683.01,2.016 -binance-futures,BTCUSDT,1582329632455000,1582329632577551,0.204,9683.94,9683.01,2.016 -binance-futures,BTCUSDT,1582329632475000,1582329632596733,5.354,9683.94,9683.01,2.016 -binance-futures,BTCUSDT,1582329632485000,1582329632605267,6.024,9683.94,9683.01,2.016 -binance-futures,BTCUSDT,1582329632490000,1582329632610906,5.82,9683.94,9683.01,2.016 -binance-futures,BTCUSDT,1582329632494000,1582329632615396,0.68,9683.93,9683.01,2.016 -binance-futures,BTCUSDT,1582329632500000,1582329632621938,1.35,9683.93,9683.01,2.016 -binance-futures,BTCUSDT,1582329632501000,1582329632623503,2.07,9683.93,9683.01,2.016 -binance-futures,BTCUSDT,1582329632505000,1582329632625546,2.51,9683.93,9683.01,2.016 -binance-futures,BTCUSDT,1582329632516000,1582329632637414,7.064,9683.93,9683.01,2.016 -binance-futures,BTCUSDT,1582329632519000,1582329632639928,0.031,9683.9,9683.01,2.016 -binance-futures,BTCUSDT,1582329632539000,1582329632659644,4.531,9683.9,9683.01,2.016 -binance-futures,BTCUSDT,1582329632562000,1582329632682861,0.204,9683.87,9683.01,2.016 -binance-futures,BTCUSDT,1582329632581000,1582329632700253,4.654,9683.87,9683.01,2.016 -binance-futures,BTCUSDT,1582329632602000,1582329632722156,4.45,9683.87,9683.01,2.016 -binance-futures,BTCUSDT,1582329632604000,1582329632724043,0.204,9683.84,9683.01,2.016 -binance-futures,BTCUSDT,1582329632623000,1582329632741706,4.054,9683.84,9683.01,2.016 -binance-futures,BTCUSDT,1582329632626000,1582329632745708,4.054,9683.84,9683.02,0.02 -binance-futures,BTCUSDT,1582329632633000,1582329632751633,0.204,9683.84,9683.02,0.02 -binance-futures,BTCUSDT,1582329632644000,1582329632763472,0.031,9683.82,9683.02,0.02 -binance-futures,BTCUSDT,1582329632646000,1582329632765627,0.031,9683.8,9683.02,0.02 -binance-futures,BTCUSDT,1582329632663000,1582329632783604,3.181,9683.8,9683.02,0.02 -binance-futures,BTCUSDT,1582329632667000,1582329632785938,3.15,9683.8,9683.02,0.02 -binance-futures,BTCUSDT,1582329632708000,1582329632826710,0.007,9683.86,9683.02,0.02 -binance-futures,BTCUSDT,1582329632856000,1582329632976237,0.007,9683.86,9683.02,0.451 -binance-futures,BTCUSDT,1582329632871000,1582329632990794,0.004,9683.86,9683.02,0.451 -binance-futures,BTCUSDT,1582329632874000,1582329632993778,0.386,9684,9683.02,0.451 -binance-futures,BTCUSDT,1582329632878000,1582329632998841,0.386,9684,9683.02,0.02 -binance-futures,BTCUSDT,1582329632878000,1582329632999286,0.386,9684,9683.07,0.436 -binance-futures,BTCUSDT,1582329633124000,1582329633238542,0.003,9683.99,9683.07,0.436 -binance-futures,BTCUSDT,1582329633126000,1582329633243543,0.003,9683.99,9683.08,0.02 -binance-futures,BTCUSDT,1582329633127000,1582329633245790,0.007,9683.99,9683.08,0.02 -binance-futures,BTCUSDT,1582329633138000,1582329633257584,5.607,9683.99,9683.08,0.02 -binance-futures,BTCUSDT,1582329633149000,1582329633268225,5.607,9683.99,9683.17,0.459 -binance-futures,BTCUSDT,1582329633162000,1582329633283544,5.607,9683.99,9683.08,0.02 -binance-futures,BTCUSDT,1582329633273000,1582329633390076,0.007,9683.99,9683.08,0.02 -binance-futures,BTCUSDT,1582329633369000,1582329633491173,0.007,9683.99,9683.15,0.468 -binance-futures,BTCUSDT,1582329633525000,1582329633641807,0.007,9683.99,9683.06,0.02 -binance-futures,BTCUSDT,1582329633632000,1582329633751148,0.007,9683.99,9683.01,2.016 -binance-futures,BTCUSDT,1582329633634000,1582329633753102,0.007,9683.99,9683.03,0.02 -binance-futures,BTCUSDT,1582329633694000,1582329633813084,0.211,9683.99,9683.03,0.02 -binance-futures,BTCUSDT,1582329633756000,1582329633872736,0.007,9683.99,9683.03,0.02 -binance-futures,BTCUSDT,1582329633873000,1582329633993889,2,9683.95,9683.03,0.02 -binance-futures,BTCUSDT,1582329633891000,1582329634012160,2,9683.95,9683.01,2.016 -binance-futures,BTCUSDT,1582329633892000,1582329634013753,2,9683.95,9683.02,0.02 -binance-futures,BTCUSDT,1582329633894000,1582329634015214,8.05,9683.95,9683.02,0.02 -binance-futures,BTCUSDT,1582329633914000,1582329634036343,2,9683.91,9683.02,0.02 -binance-futures,BTCUSDT,1582329633936000,1582329634058924,12.4,9683.91,9683.02,0.02 -binance-futures,BTCUSDT,1582329633938000,1582329634062215,0.031,9683.89,9683.02,0.02 -binance-futures,BTCUSDT,1582329633941000,1582329634064948,0.031,9683.87,9683.02,0.02 -binance-futures,BTCUSDT,1582329633958000,1582329634080594,2.031,9683.87,9683.02,0.02 -binance-futures,BTCUSDT,1582329633962000,1582329634084062,2,9683.85,9683.02,0.02 -binance-futures,BTCUSDT,1582329633980000,1582329634103429,2,9683.83,9683.02,0.02 -binance-futures,BTCUSDT,1582329633991000,1582329634114741,0.204,9683.78,9683.02,0.02 -binance-futures,BTCUSDT,1582329634014000,1582329634139141,4,9683.74,9683.02,0.02 -binance-futures,BTCUSDT,1582329634036000,1582329634154764,2,9683.7,9683.02,0.02 -binance-futures,BTCUSDT,1582329634037000,1582329634159302,4,9683.7,9683.02,0.02 -binance-futures,BTCUSDT,1582329634043000,1582329634163277,0.204,9683.67,9683.02,0.02 -binance-futures,BTCUSDT,1582329634058000,1582329634178492,2,9683.66,9683.02,0.02 -binance-futures,BTCUSDT,1582329634058000,1582329634179177,4.031,9683.66,9683.02,0.02 -binance-futures,BTCUSDT,1582329634075000,1582329634196169,2,9683.62,9683.02,0.02 -binance-futures,BTCUSDT,1582329634077000,1582329634196482,4,9683.62,9683.02,0.02 -binance-futures,BTCUSDT,1582329634082000,1582329634201431,0.204,9683.61,9683.02,0.02 -binance-futures,BTCUSDT,1582329634093000,1582329634213446,2,9683.58,9683.02,0.02 -binance-futures,BTCUSDT,1582329634099000,1582329634220207,4,9683.58,9683.02,0.02 -binance-futures,BTCUSDT,1582329634104000,1582329634225093,0.031,9683.57,9683.02,0.02 -binance-futures,BTCUSDT,1582329634119000,1582329634240835,4,9683.54,9683.02,0.02 -binance-futures,BTCUSDT,1582329634130000,1582329634250757,4.031,9683.54,9683.02,0.02 -binance-futures,BTCUSDT,1582329634138000,1582329634260965,13.131,9683.54,9683.02,0.02 -binance-futures,BTCUSDT,1582329634140000,1582329634261672,2,9683.5,9683.02,0.02 -binance-futures,BTCUSDT,1582329634147000,1582329634267487,0.204,9683.47,9683.02,0.02 -binance-futures,BTCUSDT,1582329634151000,1582329634284669,0.204,9683.47,9683.01,1.776 -binance-futures,BTCUSDT,1582329634159000,1582329634289416,4,9683.44,9683.01,1.776 -binance-futures,BTCUSDT,1582329634161000,1582329634292787,12,9683.44,9683.01,1.776 -binance-futures,BTCUSDT,1582329634168000,1582329634294317,2,9683.43,9683.01,1.776 -binance-futures,BTCUSDT,1582329634181000,1582329634304035,4,9683.38,9683.01,1.776 -binance-futures,BTCUSDT,1582329634183000,1582329634306382,8,9683.38,9683.01,1.776 -binance-futures,BTCUSDT,1582329634183000,1582329634306505,10,9683.38,9683.01,1.776 -binance-futures,BTCUSDT,1582329634185000,1582329634306848,12,9683.38,9683.01,1.776 -binance-futures,BTCUSDT,1582329634201000,1582329634320417,2,9683.32,9683.01,1.776 -binance-futures,BTCUSDT,1582329634202000,1582329634328423,4,9683.32,9683.01,1.776 -binance-futures,BTCUSDT,1582329634202000,1582329634328878,6,9683.32,9683.01,1.776 -binance-futures,BTCUSDT,1582329634206000,1582329634329528,0.204,9683.26,9683.01,1.776 -binance-futures,BTCUSDT,1582329634225000,1582329634344680,2.204,9683.26,9683.01,1.776 -binance-futures,BTCUSDT,1582329634227000,1582329634347661,4.204,9683.26,9683.01,1.776 -binance-futures,BTCUSDT,1582329634229000,1582329634349219,16.754,9683.26,9683.01,1.776 -binance-futures,BTCUSDT,1582329634236000,1582329634356632,2,9683.2,9683.01,1.776 -binance-futures,BTCUSDT,1582329634238000,1582329634357593,4,9683.2,9683.01,1.776 -binance-futures,BTCUSDT,1582329634240000,1582329634358961,6,9683.2,9683.01,1.776 -binance-futures,BTCUSDT,1582329634242000,1582329634361851,8,9683.2,9683.01,1.776 -binance-futures,BTCUSDT,1582329634244000,1582329634364266,12,9683.2,9683.01,1.776 -binance-futures,BTCUSDT,1582329634254000,1582329634395367,2,9683.14,9683.01,1.776 -binance-futures,BTCUSDT,1582329634254000,1582329634396128,4,9683.14,9683.01,1.776 -binance-futures,BTCUSDT,1582329634256000,1582329634397037,6,9683.14,9683.01,1.776 -binance-futures,BTCUSDT,1582329634258000,1582329634397760,10,9683.14,9683.01,1.776 -binance-futures,BTCUSDT,1582329634260000,1582329634398088,12,9683.14,9683.01,1.776 -binance-futures,BTCUSDT,1582329634262000,1582329634400071,0.081,9683.02,9683.01,1.776 -binance-futures,BTCUSDT,1582329634298000,1582329634419450,9.031,9683.02,9683.01,1.776 -binance-futures,BTCUSDT,1582329634304000,1582329634425246,9.031,9683.02,9682.83,4.095 -binance-futures,BTCUSDT,1582329634306000,1582329634426553,9.235,9683.02,9682.83,4.095 -binance-futures,BTCUSDT,1582329634322000,1582329634443325,4,9682.96,9682.83,4.095 -binance-futures,BTCUSDT,1582329634324000,1582329634449259,12,9682.96,9682.83,4.095 -binance-futures,BTCUSDT,1582329634331000,1582329634452337,11.974,9682.96,9682.83,4.095 -binance-futures,BTCUSDT,1582329634339000,1582329634458755,9.974,9682.96,9682.83,4.095 -binance-futures,BTCUSDT,1582329634341000,1582329634463495,2,9682.9,9682.83,4.095 -binance-futures,BTCUSDT,1582329634343000,1582329634464058,8,9682.9,9682.83,4.095 -binance-futures,BTCUSDT,1582329634343000,1582329634466300,10,9682.9,9682.83,4.095 -binance-futures,BTCUSDT,1582329634359000,1582329634480122,8,9682.9,9682.83,4.095 -binance-futures,BTCUSDT,1582329634361000,1582329634483217,6,9682.9,9682.83,4.095 -binance-futures,BTCUSDT,1582329634363000,1582329634484537,4,9682.84,9682.83,4.095 -binance-futures,BTCUSDT,1582329634363000,1582329634486653,6,9682.84,9682.83,4.095 -binance-futures,BTCUSDT,1582329634365000,1582329634486664,6.204,9682.84,9682.83,4.095 -binance-futures,BTCUSDT,1582329634378000,1582329634501194,8.204,9682.84,9682.83,4.095 -binance-futures,BTCUSDT,1582329634382000,1582329634503845,10.054,9682.84,9682.83,4.095 -binance-futures,BTCUSDT,1582329634398000,1582329634518234,6.204,9682.84,9682.83,4.095 -binance-futures,BTCUSDT,1582329634405000,1582329634525366,6.884,9682.84,9682.83,4.095 -binance-futures,BTCUSDT,1582329634429000,1582329634552488,7.554,9682.84,9682.83,4.095 -binance-futures,BTCUSDT,1582329634469000,1582329634590706,7.994,9682.84,9682.83,4.095 -binance-futures,BTCUSDT,1582329634473000,1582329634593003,7.994,9682.84,9682.83,4.554 -binance-futures,BTCUSDT,1582329634476000,1582329634596125,7.994,9682.84,9682.83,4.095 -binance-futures,BTCUSDT,1582329634476000,1582329634596138,7.79,9682.84,9682.83,4.095 -binance-futures,BTCUSDT,1582329634481000,1582329634601002,8.51,9682.84,9682.83,4.095 -binance-futures,BTCUSDT,1582329634663000,1582329634785488,8.51,9682.84,9682.83,4.554 -binance-futures,BTCUSDT,1582329634677000,1582329634798917,8.51,9682.84,9682.83,4.095 -binance-futures,BTCUSDT,1582329634718000,1582329634839531,8.591,9682.84,9682.83,4.095 -binance-futures,BTCUSDT,1582329634876000,1582329634996195,8.795,9682.84,9682.83,4.095 -binance-futures,BTCUSDT,1582329634998000,1582329635119942,8.795,9682.84,9682.31,0.001 -binance-futures,BTCUSDT,1582329635000000,1582329635119961,8.795,9682.84,9682.69,5.512 -binance-futures,BTCUSDT,1582329635019000,1582329635142633,8.355,9682.84,9682.69,5.512 -binance-futures,BTCUSDT,1582329635023000,1582329635144404,0.204,9682.73,9682.69,5.512 -binance-futures,BTCUSDT,1582329635046000,1582329635169674,0.67,9682.71,9682.69,5.512 -binance-futures,BTCUSDT,1582329635048000,1582329635169700,1.11,9682.71,9682.69,5.512 -binance-futures,BTCUSDT,1582329635060000,1582329635179947,2.51,9682.71,9682.69,5.512 -binance-futures,BTCUSDT,1582329635071000,1582329635192641,2.714,9682.71,9682.69,5.512 -binance-futures,BTCUSDT,1582329635080000,1582329635200929,0.72,9682.7,9682.69,5.512 -binance-futures,BTCUSDT,1582329635083000,1582329635204108,1.4,9682.7,9682.69,5.512 -binance-futures,BTCUSDT,1582329635098000,1582329635218973,1.84,9682.7,9682.69,5.512 -binance-futures,BTCUSDT,1582329635124000,1582329635249627,1.83,9682.7,9682.69,5.512 -binance-futures,BTCUSDT,1582329635131000,1582329635253132,1.11,9682.7,9682.69,5.512 -binance-futures,BTCUSDT,1582329635150000,1582329635270842,0.67,9682.7,9682.69,5.512 -binance-futures,BTCUSDT,1582329635163000,1582329635284264,1.35,9682.7,9682.69,5.512 -binance-futures,BTCUSDT,1582329635173000,1582329635292835,0.68,9682.7,9682.69,5.512 -binance-futures,BTCUSDT,1582329635180000,1582329635304869,1.4,9682.7,9682.69,5.512 -binance-futures,BTCUSDT,1582329635185000,1582329635311842,1.84,9682.7,9682.69,5.512 -binance-futures,BTCUSDT,1582329635201000,1582329635320544,2.51,9682.7,9682.69,5.512 -binance-futures,BTCUSDT,1582329635210000,1582329635333371,2.714,9682.7,9682.69,5.512 -binance-futures,BTCUSDT,1582329635212000,1582329635333385,2.51,9682.7,9682.69,5.512 -binance-futures,BTCUSDT,1582329635231000,1582329635351212,2.714,9682.7,9682.69,5.512 -binance-futures,BTCUSDT,1582329635789000,1582329635910954,2.714,9682.7,9682.52,4.516 -binance-futures,BTCUSDT,1582329635812000,1582329635933356,0.031,9682.66,9682.52,4.516 -binance-futures,BTCUSDT,1582329635816000,1582329635936325,0.204,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329635845000,1582329635965613,0.884,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329635849000,1582329635970997,0.68,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329635872000,1582329635993161,0.884,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329635925000,1582329636045961,0.204,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329635952000,1582329636072232,0.204,9683.36,9682.52,4.516 -binance-futures,BTCUSDT,1582329635977000,1582329636096713,0.68,9683.35,9682.52,4.516 -binance-futures,BTCUSDT,1582329635983000,1582329636102762,1.12,9683.35,9682.52,4.516 -binance-futures,BTCUSDT,1582329635984000,1582329636105645,1.84,9683.35,9682.52,4.516 -binance-futures,BTCUSDT,1582329635994000,1582329636113929,2.51,9683.35,9682.52,4.516 -binance-futures,BTCUSDT,1582329635994000,1582329636117107,9.36,9683.35,9682.52,4.516 -binance-futures,BTCUSDT,1582329636001000,1582329636122318,0.204,9683.32,9682.52,4.516 -binance-futures,BTCUSDT,1582329636007000,1582329636128226,0.235,9683.32,9682.52,4.516 -binance-futures,BTCUSDT,1582329636007000,1582329636128240,0.031,9683.31,9682.52,4.516 -binance-futures,BTCUSDT,1582329636028000,1582329636156079,8.881,9683.31,9682.52,4.516 -binance-futures,BTCUSDT,1582329636032000,1582329636156431,0.68,9683.3,9682.52,4.516 -binance-futures,BTCUSDT,1582329636033000,1582329636156684,2.07,9683.3,9682.52,4.516 -binance-futures,BTCUSDT,1582329636035000,1582329636156693,2.51,9683.3,9682.52,4.516 -binance-futures,BTCUSDT,1582329636039000,1582329636160782,0.204,9683.27,9682.52,4.516 -binance-futures,BTCUSDT,1582329636058000,1582329636192148,9.854,9683.27,9682.52,4.516 -binance-futures,BTCUSDT,1582329636094000,1582329636218465,0.031,9683.23,9682.52,4.516 -binance-futures,BTCUSDT,1582329636096000,1582329636219384,0.204,9683.2,9682.52,4.516 -binance-futures,BTCUSDT,1582329636115000,1582329636237595,8.554,9683.2,9682.52,4.516 -binance-futures,BTCUSDT,1582329636117000,1582329636238472,2,9683.16,9682.52,4.516 -binance-futures,BTCUSDT,1582329636130000,1582329636252003,4,9683.16,9682.52,4.516 -binance-futures,BTCUSDT,1582329636136000,1582329636258084,12.65,9683.16,9682.52,4.516 -binance-futures,BTCUSDT,1582329636140000,1582329636265149,0.44,9683.15,9682.52,4.516 -binance-futures,BTCUSDT,1582329636142000,1582329636265165,0.204,9683.1,9682.52,4.516 -binance-futures,BTCUSDT,1582329636165000,1582329636302509,2,9683.06,9682.52,4.516 -binance-futures,BTCUSDT,1582329636166000,1582329636307276,2,9683.06,9682.53,0.001 -binance-futures,BTCUSDT,1582329636195000,1582329636315608,8.4,9683.06,9682.53,0.001 -binance-futures,BTCUSDT,1582329636204000,1582329636322680,0.204,9683.01,9682.53,0.001 -binance-futures,BTCUSDT,1582329636220000,1582329636340215,7.154,9683.01,9682.53,0.001 -binance-futures,BTCUSDT,1582329636222000,1582329636342909,2,9682.95,9682.53,0.001 -binance-futures,BTCUSDT,1582329636237000,1582329636359668,4,9682.95,9682.53,0.001 -binance-futures,BTCUSDT,1582329636243000,1582329636376456,8.15,9682.95,9682.53,0.001 -binance-futures,BTCUSDT,1582329636246000,1582329636387678,0.204,9682.9,9682.53,0.001 -binance-futures,BTCUSDT,1582329636250000,1582329636388129,2,9682.89,9682.53,0.001 -binance-futures,BTCUSDT,1582329636259000,1582329636388838,6,9682.89,9682.53,0.001 -binance-futures,BTCUSDT,1582329636286000,1582329636406099,10.6,9682.89,9682.53,0.001 -binance-futures,BTCUSDT,1582329636290000,1582329636411183,2,9682.83,9682.53,0.001 -binance-futures,BTCUSDT,1582329636292000,1582329636414274,6,9682.83,9682.53,0.001 -binance-futures,BTCUSDT,1582329636310000,1582329636434269,8.2,9682.83,9682.53,0.001 -binance-futures,BTCUSDT,1582329636314000,1582329636434310,2,9682.77,9682.53,0.001 -binance-futures,BTCUSDT,1582329636332000,1582329636455694,2,9682.71,9682.53,0.001 -binance-futures,BTCUSDT,1582329636334000,1582329636457036,6,9682.71,9682.53,0.001 -binance-futures,BTCUSDT,1582329636336000,1582329636458442,8,9682.71,9682.53,0.001 -binance-futures,BTCUSDT,1582329636351000,1582329636472210,2,9682.67,9682.53,0.001 -binance-futures,BTCUSDT,1582329636355000,1582329636478904,6,9682.65,9682.53,0.001 -binance-futures,BTCUSDT,1582329636357000,1582329636478985,8,9682.65,9682.53,0.001 -binance-futures,BTCUSDT,1582329636358000,1582329636480184,10,9682.65,9682.53,0.001 -binance-futures,BTCUSDT,1582329636373000,1582329636497101,8,9682.65,9682.53,0.001 -binance-futures,BTCUSDT,1582329636375000,1582329636497205,2,9682.59,9682.53,0.001 -binance-futures,BTCUSDT,1582329636379000,1582329636503241,4,9682.59,9682.53,0.001 -binance-futures,BTCUSDT,1582329636381000,1582329636504557,6,9682.59,9682.53,0.001 -binance-futures,BTCUSDT,1582329636389000,1582329636508510,10,9682.59,9682.53,0.001 -binance-futures,BTCUSDT,1582329636397000,1582329636519056,2,9682.55,9682.53,0.001 -binance-futures,BTCUSDT,1582329636400000,1582329636521772,2,9682.54,9682.53,0.001 -binance-futures,BTCUSDT,1582329636402000,1582329636525559,6,9682.54,9682.53,0.001 -binance-futures,BTCUSDT,1582329636416000,1582329636539616,10,9682.54,9682.53,0.001 -binance-futures,BTCUSDT,1582329636421000,1582329636545108,9.5,9682.54,9682.53,0.001 -binance-futures,BTCUSDT,1582329636425000,1582329636548146,9.5,9682.54,9682.52,4.516 -binance-futures,BTCUSDT,1582329636434000,1582329636555332,6,9682.54,9682.52,4.516 -binance-futures,BTCUSDT,1582329636444000,1582329636566788,4,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329636446000,1582329636568258,8,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329636446000,1582329636568284,12,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329636463000,1582329636584145,8,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329636497000,1582329636616010,8.67,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329636523000,1582329636645415,8.67,9682.53,9682.52,4.953 -binance-futures,BTCUSDT,1582329636530000,1582329636650828,6.67,9682.53,9682.52,4.953 -binance-futures,BTCUSDT,1582329636531000,1582329636651265,6.67,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329636538000,1582329636658616,7.11,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329636542000,1582329636660905,5.11,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329636557000,1582329636675960,3.11,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329636563000,1582329636700878,2.44,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329636590000,1582329636710660,2,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329636604000,1582329636724820,2,9682.53,9682.52,4.963 -binance-futures,BTCUSDT,1582329636630000,1582329636749519,2,9682.53,9682.52,4.516 -binance-futures,BTCUSDT,1582329636657000,1582329636778524,2,9682.53,9682.52,4.535 -binance-futures,BTCUSDT,1582329636668000,1582329636789301,0.021,9683.99,9682.52,4.535 -binance-futures,BTCUSDT,1582329636669000,1582329636789384,0.025,9683.99,9682.52,4.535 -binance-futures,BTCUSDT,1582329636681000,1582329636804408,0.025,9683.99,9682.56,0.031 -binance-futures,BTCUSDT,1582329636690000,1582329636812983,1.39,9683.97,9682.56,0.031 -binance-futures,BTCUSDT,1582329636695000,1582329636815165,2.07,9683.97,9682.59,0.431 -binance-futures,BTCUSDT,1582329636698000,1582329636820134,2.51,9683.97,9682.59,0.431 -binance-futures,BTCUSDT,1582329636711000,1582329636833067,13.61,9683.97,9682.59,0.431 -binance-futures,BTCUSDT,1582329636717000,1582329636838741,13.61,9683.97,9682.52,4.535 -binance-futures,BTCUSDT,1582329636717000,1582329636839840,13.814,9683.97,9682.52,4.535 -binance-futures,BTCUSDT,1582329636723000,1582329636843893,13.61,9683.97,9682.52,4.535 -binance-futures,BTCUSDT,1582329636725000,1582329636843903,0.204,9683.91,9682.52,4.535 -binance-futures,BTCUSDT,1582329636743000,1582329636864301,12.554,9683.91,9682.52,4.535 -binance-futures,BTCUSDT,1582329636764000,1582329636886662,0.68,9683.9,9682.52,4.535 -binance-futures,BTCUSDT,1582329636766000,1582329636888005,0.68,9683.9,9682.52,4.516 -binance-futures,BTCUSDT,1582329636769000,1582329636891421,0.204,9683.76,9682.52,4.516 -binance-futures,BTCUSDT,1582329636787000,1582329636906999,11.804,9683.76,9682.52,4.516 -binance-futures,BTCUSDT,1582329636808000,1582329636926773,0.44,9683.75,9682.52,4.516 -binance-futures,BTCUSDT,1582329636826000,1582329636944334,12.19,9683.75,9682.52,4.516 -binance-futures,BTCUSDT,1582329636827000,1582329636946272,12.87,9683.75,9682.52,4.516 -binance-futures,BTCUSDT,1582329636840000,1582329636958845,12.43,9683.75,9682.52,4.516 -binance-futures,BTCUSDT,1582329636840000,1582329636961142,0.031,9683.71,9682.52,4.516 -binance-futures,BTCUSDT,1582329636841000,1582329636965929,0.031,9683.71,9682.52,6.586 -binance-futures,BTCUSDT,1582329636843000,1582329636965988,0.204,9683.6,9682.52,6.586 -binance-futures,BTCUSDT,1582329636863000,1582329636983241,10.754,9683.6,9682.52,6.586 -binance-futures,BTCUSDT,1582329636886000,1582329637009086,10.55,9683.6,9682.52,6.586 -binance-futures,BTCUSDT,1582329636888000,1582329637009105,0.204,9683.49,9682.52,6.586 -binance-futures,BTCUSDT,1582329636908000,1582329637027339,8.654,9683.49,9682.52,6.586 -binance-futures,BTCUSDT,1582329636918000,1582329637037177,0.021,9683.48,9682.52,6.586 -binance-futures,BTCUSDT,1582329636920000,1582329637039923,0.021,9683.48,9682.53,0.001 -binance-futures,BTCUSDT,1582329636931000,1582329637053295,0.204,9683.41,9682.53,0.001 -binance-futures,BTCUSDT,1582329636953000,1582329637071332,8.154,9683.41,9682.53,0.001 -binance-futures,BTCUSDT,1582329636974000,1582329637093619,0.031,9683.37,9682.53,0.001 -binance-futures,BTCUSDT,1582329636975000,1582329637094983,0.204,9683.35,9682.53,0.001 -binance-futures,BTCUSDT,1582329636992000,1582329637111799,8.004,9683.35,9682.53,0.001 -binance-futures,BTCUSDT,1582329637016000,1582329637135479,7.8,9683.35,9682.53,0.001 -binance-futures,BTCUSDT,1582329637016000,1582329637136156,0.204,9683.25,9682.53,0.001 -binance-futures,BTCUSDT,1582329637036000,1582329637156429,6.604,9683.25,9682.53,0.001 -binance-futures,BTCUSDT,1582329637063000,1582329637183635,6.4,9683.25,9682.53,0.001 -binance-futures,BTCUSDT,1582329637065000,1582329637185163,0.204,9683.19,9682.53,0.001 -binance-futures,BTCUSDT,1582329637082000,1582329637202052,4.704,9683.19,9682.53,0.001 -binance-futures,BTCUSDT,1582329637106000,1582329637230026,4.5,9683.19,9682.53,0.001 -binance-futures,BTCUSDT,1582329637108000,1582329637230038,0.204,9683.14,9682.53,0.001 -binance-futures,BTCUSDT,1582329637127000,1582329637248014,4.954,9683.14,9682.53,0.001 -binance-futures,BTCUSDT,1582329637170000,1582329637290379,0.021,9683.48,9682.53,0.001 -binance-futures,BTCUSDT,1582329637171000,1582329637292134,0.204,9683.42,9682.53,0.001 -binance-futures,BTCUSDT,1582329637174000,1582329637295433,0.021,9683.13,9682.53,0.001 -binance-futures,BTCUSDT,1582329637177000,1582329637297352,0.025,9683.13,9682.53,0.001 -binance-futures,BTCUSDT,1582329637184000,1582329637305650,0.025,9683.13,9682.54,2.07 -binance-futures,BTCUSDT,1582329637194000,1582329637313685,3.425,9683.13,9682.54,2.07 -binance-futures,BTCUSDT,1582329637208000,1582329637329373,0.025,9683.13,9682.54,2.07 -binance-futures,BTCUSDT,1582329637221000,1582329637339897,0.68,9683.11,9682.54,2.07 -binance-futures,BTCUSDT,1582329637221000,1582329637346602,1.12,9683.11,9682.54,2.07 -binance-futures,BTCUSDT,1582329637228000,1582329637348963,1.84,9683.11,9682.53,0.001 -binance-futures,BTCUSDT,1582329637230000,1582329637350826,2.51,9683.11,9682.53,0.001 -binance-futures,BTCUSDT,1582329637246000,1582329637369048,1.35,9683.11,9682.53,0.001 -binance-futures,BTCUSDT,1582329637250000,1582329637371101,0.44,9683.1,9682.53,0.001 -binance-futures,BTCUSDT,1582329637254000,1582329637376759,0.031,9683.07,9682.53,0.001 -binance-futures,BTCUSDT,1582329637273000,1582329637394166,5.26,9683.1,9682.53,0.001 -binance-futures,BTCUSDT,1582329637277000,1582329637396642,2.95,9683.07,9682.53,0.001 -binance-futures,BTCUSDT,1582329637281000,1582329637402309,2.95,9683.07,9682.53,0.436 -binance-futures,BTCUSDT,1582329637283000,1582329637404351,2.95,9683.07,9682.53,0.001 -binance-futures,BTCUSDT,1582329637291000,1582329637422162,0.44,9683.05,9682.53,0.001 -binance-futures,BTCUSDT,1582329637299000,1582329637445257,1.16,9683.05,9682.53,0.001 -binance-futures,BTCUSDT,1582329637299000,1582329637445697,1.191,9683.05,9682.53,0.001 -binance-futures,BTCUSDT,1582329637299000,1582329637445947,0.031,9683.04,9682.53,0.001 -binance-futures,BTCUSDT,1582329637300000,1582329637446136,0.031,9683.03,9682.53,0.001 -binance-futures,BTCUSDT,1582329637345000,1582329637468126,4.031,9683.03,9682.53,0.001 -binance-futures,BTCUSDT,1582329637350000,1582329637469977,4.471,9683.03,9682.53,0.001 -binance-futures,BTCUSDT,1582329637363000,1582329637482763,5.151,9683.03,9682.53,0.001 -binance-futures,BTCUSDT,1582329637368000,1582329637488856,4.711,9683.03,9682.53,0.001 -binance-futures,BTCUSDT,1582329637376000,1582329637497182,0.44,9683.02,9682.53,0.001 -binance-futures,BTCUSDT,1582329637391000,1582329637512975,1.16,9683.02,9682.53,0.001 -binance-futures,BTCUSDT,1582329637397000,1582329637517336,4.46,9683.02,9682.53,0.001 -binance-futures,BTCUSDT,1582329637416000,1582329637536293,5.14,9683.02,9682.53,0.001 -binance-futures,BTCUSDT,1582329637418000,1582329637538722,4.7,9683.02,9682.53,0.001 -binance-futures,BTCUSDT,1582329637422000,1582329637541510,1.4,9683.02,9682.53,0.001 -binance-futures,BTCUSDT,1582329637427000,1582329637547276,0.021,9683.01,9682.53,0.001 -binance-futures,BTCUSDT,1582329637430000,1582329637552352,0.025,9683.01,9682.53,0.001 -binance-futures,BTCUSDT,1582329637448000,1582329637570795,3.825,9683.01,9682.53,0.001 -binance-futures,BTCUSDT,1582329637455000,1582329637575684,4.265,9683.01,9682.53,0.001 -binance-futures,BTCUSDT,1582329637461000,1582329637580485,4.935,9683.01,9682.53,0.001 -binance-futures,BTCUSDT,1582329637465000,1582329637586349,1.135,9683.01,9682.53,0.001 -binance-futures,BTCUSDT,1582329637477000,1582329637598058,1.4,9683,9682.53,0.001 -binance-futures,BTCUSDT,1582329637505000,1582329637624942,0.68,9683,9682.53,0.001 -binance-futures,BTCUSDT,1582329637511000,1582329637632144,0.695,9683.01,9682.53,0.001 -binance-futures,BTCUSDT,1582329637516000,1582329637636844,0.025,9683.01,9682.53,0.001 -binance-futures,BTCUSDT,1582329637529000,1582329637650988,0.025,9683.01,9682.64,0.463 -binance-futures,BTCUSDT,1582329637614000,1582329637736615,0.025,9683.01,9682.53,0.001 -binance-futures,BTCUSDT,1582329637641000,1582329637763962,0.025,9683.01,9682.65,0.468 -binance-futures,BTCUSDT,1582329637677000,1582329637794711,0.004,9683.01,9682.65,0.468 -binance-futures,BTCUSDT,1582329637677000,1582329637797377,0.004,9683.01,9682.66,0.001 -binance-futures,BTCUSDT,1582329637680000,1582329637800540,0.021,9683.99,9682.66,0.001 -binance-futures,BTCUSDT,1582329637684000,1582329637803126,0.025,9683.99,9682.66,0.001 -binance-futures,BTCUSDT,1582329637701000,1582329637824872,8.625,9683.99,9682.66,0.001 -binance-futures,BTCUSDT,1582329637708000,1582329637830627,0.68,9683.97,9682.66,0.001 -binance-futures,BTCUSDT,1582329637710000,1582329637830670,1.12,9683.97,9682.66,0.001 -binance-futures,BTCUSDT,1582329637716000,1582329637836277,1.84,9683.97,9682.66,0.001 -binance-futures,BTCUSDT,1582329637718000,1582329637839052,2.51,9683.97,9682.66,0.001 -binance-futures,BTCUSDT,1582329637728000,1582329637852122,2.541,9683.97,9682.66,0.001 -binance-futures,BTCUSDT,1582329637730000,1582329637852235,0.031,9683.95,9682.68,0.446 -binance-futures,BTCUSDT,1582329637738000,1582329637859684,0.031,9683.95,9682.66,0.001 -binance-futures,BTCUSDT,1582329637742000,1582329637862744,0.905,9683.95,9682.66,0.001 -binance-futures,BTCUSDT,1582329637744000,1582329637864584,1.625,9683.95,9682.66,0.001 -binance-futures,BTCUSDT,1582329637748000,1582329637867405,5.294,9683.86,9682.66,0.001 -binance-futures,BTCUSDT,1582329637766000,1582329637885113,9.594,9683.86,9682.66,0.001 -binance-futures,BTCUSDT,1582329637773000,1582329637894263,0.204,9683.82,9682.66,0.001 -binance-futures,BTCUSDT,1582329637787000,1582329637907915,0.235,9683.82,9682.66,0.001 -binance-futures,BTCUSDT,1582329637794000,1582329637912852,7.935,9683.82,9682.66,0.001 -binance-futures,BTCUSDT,1582329637813000,1582329637932702,0.204,9683.8,9682.66,0.001 -binance-futures,BTCUSDT,1582329637832000,1582329637949205,8.804,9683.8,9682.66,0.001 -binance-futures,BTCUSDT,1582329637853000,1582329637972406,1.12,9683.78,9682.66,0.001 -binance-futures,BTCUSDT,1582329637855000,1582329637974641,0.204,9683.71,9682.66,0.001 -binance-futures,BTCUSDT,1582329637872000,1582329637991458,7.954,9683.71,9682.66,0.001 -binance-futures,BTCUSDT,1582329637893000,1582329638013141,0.204,9683.63,9682.66,0.001 -binance-futures,BTCUSDT,1582329637909000,1582329638029917,6.354,9683.63,9682.66,0.001 -binance-futures,BTCUSDT,1582329637915000,1582329638036137,0.031,9683.59,9682.66,0.001 -binance-futures,BTCUSDT,1582329637928000,1582329638047133,0.031,9683.59,9682.52,4.516 -binance-futures,BTCUSDT,1582329637929000,1582329638050488,0.031,9683.59,9682.53,0.001 -binance-futures,BTCUSDT,1582329637932000,1582329638053289,5.931,9683.59,9682.53,0.001 -binance-futures,BTCUSDT,1582329637936000,1582329638056366,0.204,9683.58,9682.53,0.001 -binance-futures,BTCUSDT,1582329637953000,1582329638073119,5.604,9683.58,9682.53,0.001 -binance-futures,BTCUSDT,1582329637971000,1582329638090441,0.204,9683.58,9682.53,0.001 -binance-futures,BTCUSDT,1582329637993000,1582329638112762,0.031,9683.59,9682.53,0.001 -binance-futures,BTCUSDT,1582329638043000,1582329638161981,0.031,9683.59,9682.66,0.46 -binance-futures,BTCUSDT,1582329638061000,1582329638183867,0.025,9683.62,9682.66,0.46 -binance-futures,BTCUSDT,1582329638185000,1582329638303663,0.021,9683.62,9682.67,0.001 -binance-futures,BTCUSDT,1582329638191000,1582329638309813,0.025,9683.85,9682.67,0.001 -binance-futures,BTCUSDT,1582329638288000,1582329638407858,0.204,9683.83,9682.67,0.001 -binance-futures,BTCUSDT,1582329638308000,1582329638428336,4.304,9683.83,9682.67,0.001 -binance-futures,BTCUSDT,1582329638330000,1582329638450998,0.204,9683.79,9682.67,0.001 -binance-futures,BTCUSDT,1582329638350000,1582329638470650,5.004,9683.79,9682.67,0.001 -binance-futures,BTCUSDT,1582329638372000,1582329638493061,0.204,9683.74,9682.67,0.001 -binance-futures,BTCUSDT,1582329638392000,1582329638512152,4.304,9683.74,9682.67,0.001 -binance-futures,BTCUSDT,1582329638416000,1582329638535679,4.1,9683.74,9682.67,0.001 -binance-futures,BTCUSDT,1582329638416000,1582329638537814,0.204,9683.71,9682.67,0.001 -binance-futures,BTCUSDT,1582329638435000,1582329638553525,4.504,9683.71,9682.67,0.001 -binance-futures,BTCUSDT,1582329638442000,1582329638562751,0.031,9683.67,9682.67,0.001 -binance-futures,BTCUSDT,1582329638449000,1582329638568864,0.031,9683.67,9682.52,4.516 -binance-futures,BTCUSDT,1582329638451000,1582329638572313,0.031,9683.67,9682.53,0.001 -binance-futures,BTCUSDT,1582329638458000,1582329638579032,0.204,9683.42,9682.53,0.001 -binance-futures,BTCUSDT,1582329638508000,1582329638627081,4.55,9683.67,9682.53,0.001 -binance-futures,BTCUSDT,1582329638524000,1582329638644253,0.204,9683.66,9682.53,0.001 -binance-futures,BTCUSDT,1582329638542000,1582329638661389,3.254,9683.66,9682.53,0.001 -binance-futures,BTCUSDT,1582329638565000,1582329638683163,0.204,9683.64,9682.53,0.001 -binance-futures,BTCUSDT,1582329638583000,1582329638703427,3.654,9683.64,9682.53,0.001 -binance-futures,BTCUSDT,1582329638605000,1582329638723693,0.204,9683.61,9682.53,0.001 -binance-futures,BTCUSDT,1582329638609000,1582329638727047,0.031,9683.6,9682.53,0.001 -binance-futures,BTCUSDT,1582329638624000,1582329638744143,3.354,9683.61,9682.53,0.001 -binance-futures,BTCUSDT,1582329638626000,1582329638746733,3.4,9683.6,9682.53,0.001 -binance-futures,BTCUSDT,1582329638645000,1582329638763492,0.204,9683.58,9682.53,0.001 -binance-futures,BTCUSDT,1582329638663000,1582329638784246,0.204,9683.58,9682.67,1.942 -binance-futures,BTCUSDT,1582329638666000,1582329638788386,0.031,9683.54,9682.67,1.942 -binance-futures,BTCUSDT,1582329638685000,1582329638804624,2.5,9683.56,9682.67,1.942 -binance-futures,BTCUSDT,1582329638687000,1582329638807473,2.55,9683.55,9682.67,1.942 -binance-futures,BTCUSDT,1582329638687000,1582329638807623,2.6,9683.54,9682.67,1.942 -binance-futures,BTCUSDT,1582329638703000,1582329638823227,2.6,9683.54,9682.68,0.001 -binance-futures,BTCUSDT,1582329638706000,1582329638827707,0.021,9683.53,9682.68,0.001 -binance-futures,BTCUSDT,1582329638723000,1582329638844152,0.031,9683.5,9682.68,0.001 -binance-futures,BTCUSDT,1582329638741000,1582329638862301,2.481,9683.5,9682.68,0.001 -binance-futures,BTCUSDT,1582329638748000,1582329638867183,2.481,9683.5,9682.68,2.071 -binance-futures,BTCUSDT,1582329638756000,1582329638875231,0.031,9683.5,9682.68,2.071 -binance-futures,BTCUSDT,1582329638770000,1582329638888628,0.204,9683.48,9682.68,2.071 -binance-futures,BTCUSDT,1582329638778000,1582329638899514,0.021,9683.53,9682.68,2.071 -binance-futures,BTCUSDT,1582329638958000,1582329639081726,2.928,9683.6,9682.69,2.07 -binance-futures,BTCUSDT,1582329638968000,1582329639087923,2.928,9683.6,9683.06,4.447 -binance-futures,BTCUSDT,1582329638981000,1582329639102195,2.928,9683.6,9682.69,2.07 -binance-futures,BTCUSDT,1582329638988000,1582329639110153,2.928,9683.6,9682.7,0.67 -binance-futures,BTCUSDT,1582329638995000,1582329639116377,2.928,9683.6,9683.06,5.156 -binance-futures,BTCUSDT,1582329639002000,1582329639121866,2.928,9683.6,9682.7,0.67 -binance-futures,BTCUSDT,1582329639004000,1582329639125016,2.928,9683.6,9682.69,2.07 -binance-futures,BTCUSDT,1582329639016000,1582329639136437,2.928,9683.6,9682.72,0.429 -binance-futures,BTCUSDT,1582329639020000,1582329639142873,2.928,9683.6,9682.81,0.462 -binance-futures,BTCUSDT,1582329639022000,1582329639142894,2.928,9683.6,9682.69,2.07 -binance-futures,BTCUSDT,1582329639029000,1582329639150069,0.204,9683.54,9682.69,2.07 -binance-futures,BTCUSDT,1582329639033000,1582329639153402,0.204,9683.54,9682.73,0.272 -binance-futures,BTCUSDT,1582329639049000,1582329639168733,2.928,9683.6,9682.73,0.272 -binance-futures,BTCUSDT,1582329639053000,1582329639173730,0.204,9683.58,9682.73,0.272 -binance-futures,BTCUSDT,1582329639059000,1582329639179211,2.928,9683.6,9682.73,0.272 -binance-futures,BTCUSDT,1582329639064000,1582329639184491,0.204,9683.59,9682.73,0.272 -binance-futures,BTCUSDT,1582329639069000,1582329639189218,2.928,9683.6,9682.73,0.272 -binance-futures,BTCUSDT,1582329639209000,1582329639328688,0.021,9683.59,9682.73,0.272 -binance-futures,BTCUSDT,1582329639210000,1582329639331197,0.021,9683.59,9682.74,0.001 -binance-futures,BTCUSDT,1582329639212000,1582329639332978,0.025,9683.59,9682.74,0.001 -binance-futures,BTCUSDT,1582329639227000,1582329639342668,5.375,9683.59,9682.74,0.001 -binance-futures,BTCUSDT,1582329639229000,1582329639347208,5.579,9683.59,9682.74,0.001 -binance-futures,BTCUSDT,1582329639231000,1582329639349748,0.72,9683.58,9682.74,0.001 -binance-futures,BTCUSDT,1582329639237000,1582329639356445,1.16,9683.58,9682.74,0.001 -binance-futures,BTCUSDT,1582329639242000,1582329639360349,1.84,9683.58,9682.74,0.001 -binance-futures,BTCUSDT,1582329639242000,1582329639360914,2.51,9683.58,9682.74,0.001 -binance-futures,BTCUSDT,1582329639245000,1582329639362724,0.204,9683.56,9682.74,0.001 -binance-futures,BTCUSDT,1582329639261000,1582329639379067,5.954,9683.56,9682.74,0.001 -binance-futures,BTCUSDT,1582329639263000,1582329639382922,0.031,9683.54,9682.74,0.001 -binance-futures,BTCUSDT,1582329639273000,1582329639398325,0.751,9683.54,9682.74,0.001 -binance-futures,BTCUSDT,1582329639279000,1582329639409790,7.451,9683.54,9682.74,0.001 -binance-futures,BTCUSDT,1582329639283000,1582329639419896,0.204,9683.49,9682.74,0.001 -binance-futures,BTCUSDT,1582329639321000,1582329639440465,6.404,9683.49,9682.74,0.001 -binance-futures,BTCUSDT,1582329639345000,1582329639485055,0.204,9683.4,9682.74,0.001 -binance-futures,BTCUSDT,1582329639373000,1582329639492985,3.754,9683.4,9682.74,0.001 -binance-futures,BTCUSDT,1582329639385000,1582329639504240,0.204,9683.4,9682.74,0.001 -binance-futures,BTCUSDT,1582329639396000,1582329639513986,0.204,9683.37,9682.74,0.001 -binance-futures,BTCUSDT,1582329639412000,1582329639529172,3.354,9683.37,9682.74,0.001 -binance-futures,BTCUSDT,1582329639416000,1582329639534045,3.15,9683.37,9682.74,0.001 -binance-futures,BTCUSDT,1582329639431000,1582329639550680,0.204,9683.36,9682.74,0.001 -binance-futures,BTCUSDT,1582329639451000,1582329639570371,5.004,9683.36,9682.74,0.001 -binance-futures,BTCUSDT,1582329639458000,1582329639577613,0.021,9683.35,9682.74,0.001 -binance-futures,BTCUSDT,1582329639461000,1582329639579817,0.025,9683.35,9682.74,0.001 -binance-futures,BTCUSDT,1582329639473000,1582329639594582,0.204,9683.33,9682.74,0.001 -binance-futures,BTCUSDT,1582329639492000,1582329639611902,4.604,9683.33,9682.74,0.001 -binance-futures,BTCUSDT,1582329639517000,1582329639638428,0.235,9683.29,9682.74,0.001 -binance-futures,BTCUSDT,1582329639535000,1582329639656493,4.335,9683.29,9682.74,0.001 -binance-futures,BTCUSDT,1582329639558000,1582329639678908,4.131,9683.29,9682.74,0.001 -binance-futures,BTCUSDT,1582329639558000,1582329639679654,0.204,9683.26,9682.74,0.001 -binance-futures,BTCUSDT,1582329639576000,1582329639694667,4.154,9683.26,9682.74,0.001 -binance-futures,BTCUSDT,1582329639581000,1582329639700944,0.031,9683.22,9682.74,0.001 -binance-futures,BTCUSDT,1582329639597000,1582329639715327,4.581,9683.22,9682.74,0.001 -binance-futures,BTCUSDT,1582329639601000,1582329639719210,2,9683.16,9682.74,0.001 -binance-futures,BTCUSDT,1582329639618000,1582329639740802,4.8,9683.16,9682.74,0.001 -binance-futures,BTCUSDT,1582329639622000,1582329639741370,0.204,9683.14,9682.74,0.001 -binance-futures,BTCUSDT,1582329639638000,1582329639757218,4.254,9683.14,9682.74,0.001 -binance-futures,BTCUSDT,1582329639641000,1582329639760006,2,9683.1,9682.74,0.001 -binance-futures,BTCUSDT,1582329639664000,1582329639783843,0.68,9683.09,9682.74,0.001 -binance-futures,BTCUSDT,1582329639666000,1582329639787580,1.4,9683.09,9682.74,0.001 -binance-futures,BTCUSDT,1582329639668000,1582329639789771,1.84,9683.09,9682.74,0.001 -binance-futures,BTCUSDT,1582329639675000,1582329639794970,2.51,9683.09,9682.74,0.001 -binance-futures,BTCUSDT,1582329639681000,1582329639801332,5.56,9683.09,9682.74,0.001 -binance-futures,BTCUSDT,1582329639683000,1582329639804442,2,9683.03,9682.74,0.001 -binance-futures,BTCUSDT,1582329639722000,1582329639839816,0.021,9683.02,9682.74,0.001 -binance-futures,BTCUSDT,1582329639723000,1582329639842991,0.025,9683.02,9682.74,0.001 -binance-futures,BTCUSDT,1582329639738000,1582329639859469,2,9682.96,9682.74,0.001 -binance-futures,BTCUSDT,1582329639813000,1582329639932803,0.72,9682.94,9682.74,0.001 -binance-futures,BTCUSDT,1582329639819000,1582329639940993,1.39,9682.94,9682.74,0.001 -binance-futures,BTCUSDT,1582329639823000,1582329639942442,2.07,9682.94,9682.74,0.001 -binance-futures,BTCUSDT,1582329639824000,1582329639944232,2.51,9682.94,9682.74,0.001 -binance-futures,BTCUSDT,1582329639839000,1582329639961277,1.79,9682.94,9682.74,0.001 -binance-futures,BTCUSDT,1582329639845000,1582329639967262,0.031,9682.9,9682.74,0.001 -binance-futures,BTCUSDT,1582329639865000,1582329639988084,1.83,9682.93,9682.74,0.001 -binance-futures,BTCUSDT,1582329639867000,1582329639989130,2,9682.84,9682.74,0.001 -binance-futures,BTCUSDT,1582329639882000,1582329640002483,2.07,9682.93,9682.74,0.001 -binance-futures,BTCUSDT,1582329639892000,1582329640014675,0.68,9682.93,9682.74,0.001 -binance-futures,BTCUSDT,1582329639897000,1582329640017078,0.025,9683.02,9682.74,0.001 -binance-futures,BTCUSDT,1582329639904000,1582329640025997,2,9682.87,9682.74,0.001 -binance-futures,BTCUSDT,1582329639920000,1582329640040341,0.025,9683.02,9682.74,0.001 -binance-futures,BTCUSDT,1582329639928000,1582329640049550,0.68,9683.01,9682.74,0.001 -binance-futures,BTCUSDT,1582329639930000,1582329640051612,0.68,9682.86,9682.74,0.001 -binance-futures,BTCUSDT,1582329639930000,1582329640052095,0.68,9682.86,9682.74,0.458 -binance-futures,BTCUSDT,1582329639937000,1582329640059751,1.4,9682.86,9682.74,0.458 -binance-futures,BTCUSDT,1582329639943000,1582329640064372,1.4,9682.86,9682.74,0.001 -binance-futures,BTCUSDT,1582329639946000,1582329640067281,1.84,9682.86,9682.74,0.001 -binance-futures,BTCUSDT,1582329639950000,1582329640073079,2,9682.8,9682.74,0.001 -binance-futures,BTCUSDT,1582329639969000,1582329640089596,2,9682.76,9682.74,0.001 -binance-futures,BTCUSDT,1582329639971000,1582329640092945,2,9682.76,9682.73,0.272 -binance-futures,BTCUSDT,1582329639987000,1582329640109337,4.8,9682.76,9682.73,0.272 -binance-futures,BTCUSDT,1582329639990000,1582329640110921,2,9682.75,9682.73,0.272 -binance-futures,BTCUSDT,1582329640005000,1582329640124308,2,9682.74,9682.73,0.272 -binance-futures,BTCUSDT,1582329640021000,1582329640142361,5.75,9682.74,9682.73,0.272 -binance-futures,BTCUSDT,1582329640042000,1582329640162378,2,9682.74,9682.73,0.272 -binance-futures,BTCUSDT,1582329640079000,1582329640199478,2.68,9682.74,9682.73,0.272 -binance-futures,BTCUSDT,1582329640110000,1582329640229696,2.884,9682.74,9682.73,0.272 -binance-futures,BTCUSDT,1582329640116000,1582329640235654,2.924,9682.74,9682.73,0.272 -binance-futures,BTCUSDT,1582329640121000,1582329640241747,1.594,9682.74,9682.73,0.272 -binance-futures,BTCUSDT,1582329640126000,1582329640246555,1.39,9682.74,9682.73,0.272 -binance-futures,BTCUSDT,1582329640139000,1582329640262455,0.67,9682.74,9682.73,0.272 -binance-futures,BTCUSDT,1582329640152000,1582329640272063,0.44,9682.75,9682.73,0.272 -binance-futures,BTCUSDT,1582329640168000,1582329640291083,0.44,9682.75,9682.68,4.85 -binance-futures,BTCUSDT,1582329640197000,1582329640318143,4.17,9683.12,9682.68,4.85 -binance-futures,BTCUSDT,1582329640225000,1582329640346649,0.021,9683.11,9682.68,4.85 -binance-futures,BTCUSDT,1582329640225000,1582329640346661,0.021,9683.11,9682.69,0.001 -binance-futures,BTCUSDT,1582329640229000,1582329640348737,0.025,9683.11,9682.69,0.001 -binance-futures,BTCUSDT,1582329640247000,1582329640366869,6.175,9683.11,9682.69,0.001 -binance-futures,BTCUSDT,1582329640270000,1582329640389998,0.031,9683.09,9682.69,0.001 -binance-futures,BTCUSDT,1582329640271000,1582329640391796,0.031,9683.07,9682.69,0.001 -binance-futures,BTCUSDT,1582329640291000,1582329640415761,2,9683.01,9682.69,0.001 -binance-futures,BTCUSDT,1582329640314000,1582329640462881,8.95,9683.01,9682.69,0.001 -binance-futures,BTCUSDT,1582329640321000,1582329640463367,0.204,9682.98,9682.69,0.001 -binance-futures,BTCUSDT,1582329640361000,1582329640481739,8.004,9682.98,9682.69,0.001 -binance-futures,BTCUSDT,1582329640370000,1582329640493703,0.031,9682.94,9682.69,0.001 -binance-futures,BTCUSDT,1582329640390000,1582329640521145,0.011,9682.94,9682.69,0.001 -binance-futures,BTCUSDT,1582329640391000,1582329640521586,7.261,9682.94,9682.69,0.001 -binance-futures,BTCUSDT,1582329640411000,1582329640533135,0.011,9682.94,9682.69,0.001 -binance-futures,BTCUSDT,1582329640426000,1582329640546557,0.204,9682.93,9682.69,0.001 -binance-futures,BTCUSDT,1582329640436000,1582329640559557,0.924,9682.93,9682.69,0.001 -binance-futures,BTCUSDT,1582329640440000,1582329640559667,1.594,9682.93,9682.69,0.001 -binance-futures,BTCUSDT,1582329640448000,1582329640569783,6.024,9682.93,9682.69,0.001 -binance-futures,BTCUSDT,1582329640452000,1582329640573236,6.464,9682.93,9682.69,0.001 -binance-futures,BTCUSDT,1582329640452000,1582329640573392,6.26,9682.93,9682.69,0.001 -binance-futures,BTCUSDT,1582329640455000,1582329640575730,6.26,9682.93,9682.69,0.445 -binance-futures,BTCUSDT,1582329640462000,1582329640584096,6.26,9682.93,9682.69,0.001 -binance-futures,BTCUSDT,1582329640462000,1582329640586809,0.031,9682.89,9682.69,0.001 -binance-futures,BTCUSDT,1582329640485000,1582329640608596,3.65,9682.89,9682.69,0.001 -binance-futures,BTCUSDT,1582329640501000,1582329640622945,2,9682.85,9682.69,0.001 -binance-futures,BTCUSDT,1582329640520000,1582329640642458,6.35,9682.85,9682.69,0.001 -binance-futures,BTCUSDT,1582329640534000,1582329640653428,0.204,9682.83,9682.69,0.001 -binance-futures,BTCUSDT,1582329640538000,1582329640658656,2,9682.81,9682.69,0.001 -binance-futures,BTCUSDT,1582329640559000,1582329640682928,6.6,9682.81,9682.69,0.001 -binance-futures,BTCUSDT,1582329640570000,1582329640692834,6.6,9682.81,9682.68,4.85 -binance-futures,BTCUSDT,1582329640574000,1582329640695003,0.204,9682.8,9682.68,4.85 -binance-futures,BTCUSDT,1582329640580000,1582329640701815,2,9682.77,9682.68,4.85 -binance-futures,BTCUSDT,1582329640599000,1582329640721667,5.7,9682.77,9682.68,4.85 -binance-futures,BTCUSDT,1582329640601000,1582329640722834,2,9682.71,9682.68,4.85 -binance-futures,BTCUSDT,1582329640621000,1582329640744601,2.081,9682.69,9682.68,4.85 -binance-futures,BTCUSDT,1582329640640000,1582329640763429,6.731,9682.69,9682.68,4.85 -binance-futures,BTCUSDT,1582329640663000,1582329640785142,7.401,9682.69,9682.68,4.85 -binance-futures,BTCUSDT,1582329640687000,1582329640812379,7.841,9682.69,9682.68,4.85 -binance-futures,BTCUSDT,1582329640689000,1582329640813657,8.521,9682.69,9682.68,4.85 -binance-futures,BTCUSDT,1582329640720000,1582329640841115,3.871,9682.69,9682.68,4.85 -binance-futures,BTCUSDT,1582329640727000,1582329640846973,4.591,9682.69,9682.68,4.85 -binance-futures,BTCUSDT,1582329640728000,1582329640855641,3.911,9682.69,9682.68,4.85 -binance-futures,BTCUSDT,1582329640730000,1582329640856423,3.471,9682.69,9682.68,4.85 -binance-futures,BTCUSDT,1582329640738000,1582329640861859,2.801,9682.69,9682.68,4.85 -binance-futures,BTCUSDT,1582329640780000,1582329640900389,2.72,9682.69,9682.68,4.85 -binance-futures,BTCUSDT,1582329640796000,1582329640919655,2,9682.69,9682.68,4.85 -binance-futures,BTCUSDT,1582329640822000,1582329640942169,2.204,9682.69,9682.68,4.85 -binance-futures,BTCUSDT,1582329640893000,1582329641013924,2,9682.69,9682.68,4.85 -binance-futures,BTCUSDT,1582329640918000,1582329641035625,2.204,9682.69,9682.68,4.85 -binance-futures,BTCUSDT,1582329641187000,1582329641316405,2.204,9682.69,9682.54,3.242 -binance-futures,BTCUSDT,1582329641207000,1582329641329728,4,9682.63,9682.54,3.242 -binance-futures,BTCUSDT,1582329641210000,1582329641331952,8,9682.63,9682.54,3.242 -binance-futures,BTCUSDT,1582329641210000,1582329641332854,10,9682.63,9682.54,3.242 -binance-futures,BTCUSDT,1582329641214000,1582329641337150,0.204,9682.61,9682.54,3.242 -binance-futures,BTCUSDT,1582329641225000,1582329641345753,2,9682.59,9682.54,3.242 -binance-futures,BTCUSDT,1582329641227000,1582329641350681,4,9682.57,9682.54,3.242 -binance-futures,BTCUSDT,1582329641227000,1582329641351857,8,9682.57,9682.54,3.242 -binance-futures,BTCUSDT,1582329641231000,1582329641354552,10,9682.57,9682.54,3.242 -binance-futures,BTCUSDT,1582329641249000,1582329641379428,6,9682.55,9682.54,3.242 -binance-futures,BTCUSDT,1582329641251000,1582329641379496,10,9682.55,9682.54,3.242 -binance-futures,BTCUSDT,1582329641253000,1582329641379512,10.204,9682.55,9682.54,3.242 -binance-futures,BTCUSDT,1582329641253000,1582329641379531,10.216,9682.55,9682.54,3.242 -binance-futures,BTCUSDT,1582329641256000,1582329641379799,12.216,9682.55,9682.54,3.242 -binance-futures,BTCUSDT,1582329641258000,1582329641381497,14.216,9682.55,9682.54,3.242 -binance-futures,BTCUSDT,1582329641275000,1582329641397034,10.204,9682.55,9682.54,3.242 -binance-futures,BTCUSDT,1582329641277000,1582329641399729,16.654,9682.55,9682.54,3.242 -binance-futures,BTCUSDT,1582329641293000,1582329641415131,10.204,9682.55,9682.54,3.242 -binance-futures,BTCUSDT,1582329641297000,1582329641420451,10.285,9682.55,9682.54,3.242 -binance-futures,BTCUSDT,1582329641308000,1582329641464803,11.005,9682.55,9682.54,3.242 -binance-futures,BTCUSDT,1582329641312000,1582329641465899,11.009,9682.55,9682.54,3.242 -binance-futures,BTCUSDT,1582329641340000,1582329641471720,11.449,9682.55,9682.54,3.242 -binance-futures,BTCUSDT,1582329641343000,1582329641471887,11.449,9682.55,9682.4,0.005 -binance-futures,BTCUSDT,1582329641348000,1582329641472206,12.119,9682.55,9682.4,0.005 -binance-futures,BTCUSDT,1582329641353000,1582329641479165,12.799,9682.55,9682.4,0.005 -binance-futures,BTCUSDT,1582329641368000,1582329641490077,0.031,9682.52,9682.4,0.005 -binance-futures,BTCUSDT,1582329641368000,1582329641490805,2.031,9682.51,9682.4,0.005 -binance-futures,BTCUSDT,1582329641370000,1582329641493636,2,9682.49,9682.4,0.005 -binance-futures,BTCUSDT,1582329641385000,1582329641507419,4,9682.49,9682.4,0.005 -binance-futures,BTCUSDT,1582329641389000,1582329641512483,6,9682.49,9682.4,0.005 -binance-futures,BTCUSDT,1582329641392000,1582329641518208,2,9682.43,9682.4,0.005 -binance-futures,BTCUSDT,1582329641404000,1582329641530283,4,9682.43,9682.4,0.005 -binance-futures,BTCUSDT,1582329641406000,1582329641530335,6,9682.43,9682.4,0.005 -binance-futures,BTCUSDT,1582329641410000,1582329641534712,10,9682.43,9682.4,0.005 -binance-futures,BTCUSDT,1582329641415000,1582329641538445,8,9682.43,9682.4,0.005 -binance-futures,BTCUSDT,1582329641417000,1582329641542151,2,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641424000,1582329641546080,2.204,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641430000,1582329641550555,8.204,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641430000,1582329641551787,10.204,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641440000,1582329641560515,12.204,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641442000,1582329641567171,18.804,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641444000,1582329641567205,14.804,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641453000,1582329641576059,8.204,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641473000,1582329641594968,8.644,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641503000,1582329641623755,9.364,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641564000,1582329641686646,10.044,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641568000,1582329641690051,10.714,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641610000,1582329641739119,10.704,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641874000,1582329641996780,10.034,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641881000,1582329642001357,9.314,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641887000,1582329642007237,8.634,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329641901000,1582329642024893,8.194,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329642100000,1582329642220875,8.874,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329642104000,1582329642226871,9.314,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329642106000,1582329642226886,10.034,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329642109000,1582329642233227,10.704,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329642463000,1582329642587807,10.535,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329642482000,1582329642600715,8.535,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329642483000,1582329642604439,6.535,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329642524000,1582329642641421,6.331,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329642531000,1582329642648962,4.51,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329642543000,1582329642662221,3.84,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329642545000,1582329642664259,3.12,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329642549000,1582329642670294,2.44,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329642554000,1582329642674153,2,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329643000000,1582329643119222,2.204,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329643095000,1582329643213748,2,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329643505000,1582329643626785,2.204,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329643703000,1582329643821659,2,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329644126000,1582329644245664,2.204,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329644149000,1582329644271340,2,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329644437000,1582329644558499,2.204,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329644455000,1582329644579310,2,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329644801000,1582329644920924,2.204,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329646127000,1582329646246697,2,9682.41,9682.4,0.005 -binance-futures,BTCUSDT,1582329646140000,1582329646261136,2,9682.41,9682.3,3.251 -binance-futures,BTCUSDT,1582329646172000,1582329646293548,0.204,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329646215000,1582329646339515,0.003,9682.62,9682.3,3.251 -binance-futures,BTCUSDT,1582329646350000,1582329646477024,2,9682.56,9682.3,3.251 -binance-futures,BTCUSDT,1582329646374000,1582329646496260,5.25,9682.56,9682.3,3.251 -binance-futures,BTCUSDT,1582329646378000,1582329646501209,2,9682.52,9682.3,3.251 -binance-futures,BTCUSDT,1582329646393000,1582329646513619,2,9682.5,9682.3,3.251 -binance-futures,BTCUSDT,1582329646405000,1582329646533338,1,9682.5,9682.3,3.251 -binance-futures,BTCUSDT,1582329646412000,1582329646535699,2,9682.46,9682.3,3.251 -binance-futures,BTCUSDT,1582329646429000,1582329646550733,0.204,9682.49,9682.3,3.251 -binance-futures,BTCUSDT,1582329646435000,1582329646555364,0.031,9682.42,9682.3,3.251 -binance-futures,BTCUSDT,1582329646455000,1582329646575652,0.68,9682.54,9682.3,3.251 -binance-futures,BTCUSDT,1582329646455000,1582329646576442,0.003,9682.62,9682.3,3.251 -binance-futures,BTCUSDT,1582329646459000,1582329646583444,0.207,9682.62,9682.3,3.251 -binance-futures,BTCUSDT,1582329646475000,1582329646595934,0.003,9682.62,9682.3,3.251 -binance-futures,BTCUSDT,1582329646692000,1582329646813700,0.204,9682.35,9682.3,3.251 -binance-futures,BTCUSDT,1582329646729000,1582329646849047,0.003,9682.62,9682.3,3.251 -binance-futures,BTCUSDT,1582329646809000,1582329646928385,0.207,9682.62,9682.3,3.251 -binance-futures,BTCUSDT,1582329647381000,1582329647500752,0.207,9682.62,9682.31,1.96 -binance-futures,BTCUSDT,1582329647454000,1582329647572667,0.207,9682.62,9682.3,3.251 -binance-futures,BTCUSDT,1582329648796000,1582329648916641,2,9682.56,9682.3,3.251 -binance-futures,BTCUSDT,1582329648813000,1582329648933993,2,9682.52,9682.3,3.251 -binance-futures,BTCUSDT,1582329648830000,1582329648950401,7.55,9682.52,9682.3,3.251 -binance-futures,BTCUSDT,1582329648832000,1582329648953710,2,9682.46,9682.3,3.251 -binance-futures,BTCUSDT,1582329648850000,1582329648969828,2,9682.42,9682.3,3.251 -binance-futures,BTCUSDT,1582329648851000,1582329648987294,4,9682.42,9682.3,3.251 -binance-futures,BTCUSDT,1582329648869000,1582329648997896,4,9682.36,9682.3,3.251 -binance-futures,BTCUSDT,1582329648894000,1582329649015785,2,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329648914000,1582329649036444,7.5,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329648924000,1582329649042936,7.704,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329648928000,1582329649049723,7.5,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329648937000,1582329649058859,2,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329648946000,1582329649066837,2.081,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329649025000,1582329649144341,7.419,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329649045000,1582329649167215,7.338,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329649186000,1582329649305864,7.419,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329649220000,1582329649340094,7.623,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329649276000,1582329649397220,7.419,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329649454000,1582329649575064,7.623,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329649520000,1582329649642332,7.419,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329649663000,1582329649785380,7.623,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329649704000,1582329649822528,7.419,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329649871000,1582329649991771,7.623,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329650469000,1582329650590233,7.419,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329650705000,1582329650827672,7.419,9682.31,9682.3,5.191 -binance-futures,BTCUSDT,1582329650726000,1582329650847852,7.419,9682.31,9682.3,3.251 -binance-futures,BTCUSDT,1582329650770000,1582329650894200,7.419,9682.31,9682.3,2.851 -binance-futures,BTCUSDT,1582329650801000,1582329650920716,7.623,9682.31,9682.3,2.851 -binance-futures,BTCUSDT,1582329650931000,1582329651052483,7.419,9682.31,9682.3,2.851 -binance-futures,BTCUSDT,1582329651906000,1582329652022468,7.623,9682.31,9682.3,2.851 -binance-futures,BTCUSDT,1582329651995000,1582329652126716,7.419,9682.31,9682.3,2.851 -binance-futures,BTCUSDT,1582329652116000,1582329652233228,7.419,9682.31,9682.3,4.791 -binance-futures,BTCUSDT,1582329652166000,1582329652289066,7.419,9682.31,9682.3,2.851 -binance-futures,BTCUSDT,1582329652192000,1582329652311260,7.419,9682.31,9682.3,4.791 -binance-futures,BTCUSDT,1582329652204000,1582329652335786,7.623,9682.31,9682.3,4.791 -binance-futures,BTCUSDT,1582329652224000,1582329652343702,7.623,9682.31,9682.3,2.851 -binance-futures,BTCUSDT,1582329652352000,1582329652471645,7.419,9682.31,9682.3,2.851 -binance-futures,BTCUSDT,1582329652535000,1582329652652838,7.419,9682.31,9682.3,4.791 -binance-futures,BTCUSDT,1582329652595000,1582329652711904,7.338,9682.31,9682.3,4.791 -binance-futures,BTCUSDT,1582329652874000,1582329652992120,7.338,9682.31,9682.3,2.851 -binance-futures,BTCUSDT,1582329653123000,1582329653243791,7.542,9682.31,9682.3,2.851 -binance-futures,BTCUSDT,1582329653455000,1582329653573909,7.338,9682.31,9682.3,2.851 -binance-futures,BTCUSDT,1582329653610000,1582329653727442,7.419,9682.31,9682.3,2.851 -binance-futures,BTCUSDT,1582329654201000,1582329654330629,3.619,9682.31,9682.3,2.851 -binance-futures,BTCUSDT,1582329654465000,1582329654584747,3.538,9682.31,9682.3,2.851 -binance-futures,BTCUSDT,1582329655156000,1582329655281795,3.538,9682.31,9681.66,5.291 -binance-futures,BTCUSDT,1582329655193000,1582329655314704,0.67,9682.29,9681.66,5.291 -binance-futures,BTCUSDT,1582329655195000,1582329655314866,1.35,9682.29,9681.66,5.291 -binance-futures,BTCUSDT,1582329655196000,1582329655316940,2.07,9682.29,9681.66,5.291 -binance-futures,BTCUSDT,1582329655200000,1582329655318989,2.51,9682.29,9681.66,5.291 -binance-futures,BTCUSDT,1582329655216000,1582329655336696,2.51,9682.29,9681.7,0.031 -binance-futures,BTCUSDT,1582329655218000,1582329655339135,2.07,9682.29,9681.7,0.031 -binance-futures,BTCUSDT,1582329655225000,1582329655347668,0.44,9682.28,9681.7,0.031 -binance-futures,BTCUSDT,1582329655227000,1582329655347690,1.12,9682.28,9681.7,0.031 -binance-futures,BTCUSDT,1582329655229000,1582329655349620,1.84,9682.28,9681.7,0.031 -binance-futures,BTCUSDT,1582329655229000,1582329655351748,0.204,9682.25,9681.7,0.031 -binance-futures,BTCUSDT,1582329655231000,1582329655351761,1.84,9682.28,9681.7,0.031 -binance-futures,BTCUSDT,1582329655236000,1582329655357298,2.51,9682.28,9681.7,0.031 -binance-futures,BTCUSDT,1582329655240000,1582329655359584,2.51,9682.28,9681.66,5.291 -binance-futures,BTCUSDT,1582329655246000,1582329655366062,4.81,9682.28,9681.66,5.291 -binance-futures,BTCUSDT,1582329655251000,1582329655370874,2.65,9682.25,9681.66,5.291 -binance-futures,BTCUSDT,1582329655275000,1582329655394461,0.68,9682.24,9681.66,5.291 -binance-futures,BTCUSDT,1582329655277000,1582329655397554,0.884,9682.24,9681.66,5.291 -binance-futures,BTCUSDT,1582329655279000,1582329655398142,1.324,9682.24,9681.66,5.291 -binance-futures,BTCUSDT,1582329655282000,1582329655402810,1.994,9682.24,9681.66,5.291 -binance-futures,BTCUSDT,1582329655282000,1582329655402824,2.714,9682.24,9681.66,5.291 -binance-futures,BTCUSDT,1582329655292000,1582329655411695,6.314,9682.24,9681.66,5.291 -binance-futures,BTCUSDT,1582329655299000,1582329655420392,6.11,9682.24,9681.66,5.291 -binance-futures,BTCUSDT,1582329655303000,1582329655422778,2.07,9682.24,9681.66,5.291 -binance-futures,BTCUSDT,1582329655305000,1582329655425256,1.39,9682.24,9681.66,5.291 -binance-futures,BTCUSDT,1582329655305000,1582329655425267,0.204,9682.23,9681.66,5.291 -binance-futures,BTCUSDT,1582329655322000,1582329655442376,3.104,9682.23,9681.66,5.291 -binance-futures,BTCUSDT,1582329655324000,1582329655442390,2.9,9682.23,9681.66,5.291 -binance-futures,BTCUSDT,1582329655360000,1582329655479361,3.538,9682.31,9681.66,5.291 -binance-futures,BTCUSDT,1582329655369000,1582329655489296,0.003,9682.22,9681.66,5.291 -binance-futures,BTCUSDT,1582329655383000,1582329655503085,0.003,9682.22,9681.7,0.031 -binance-futures,BTCUSDT,1582329655389000,1582329655506839,2.803,9682.22,9681.7,0.031 -binance-futures,BTCUSDT,1582329655421000,1582329655540736,0.003,9682.22,9681.7,0.031 -binance-futures,BTCUSDT,1582329655442000,1582329655559620,0.003,9682.22,9681.71,0.031 -binance-futures,BTCUSDT,1582329655542000,1582329655662296,0.001,9681.94,9681.71,0.031 -binance-futures,BTCUSDT,1582329655549000,1582329655670619,0.001,9681.94,9681.72,0.031 -binance-futures,BTCUSDT,1582329655551000,1582329655674315,0.001,9681.94,9681.73,0.031 -binance-futures,BTCUSDT,1582329655578000,1582329655699294,0.001,9681.94,9681.74,0.468 -binance-futures,BTCUSDT,1582329655602000,1582329655722731,0.001,9681.94,9681.78,0.031 -binance-futures,BTCUSDT,1582329655624000,1582329655741107,0.001,9681.94,9681.78,0.466 -binance-futures,BTCUSDT,1582329655643000,1582329655763141,0.001,9681.94,9681.8,0.462 -binance-futures,BTCUSDT,1582329655652000,1582329655770900,0.001,9681.94,9681.78,0.031 -binance-futures,BTCUSDT,1582329655661000,1582329655781658,0.001,9681.94,9681.82,0.031 -binance-futures,BTCUSDT,1582329655684000,1582329655807833,0.001,9681.94,9681.81,0.031 -binance-futures,BTCUSDT,1582329655686000,1582329655808158,0.001,9681.94,9681.76,0.031 -binance-futures,BTCUSDT,1582329655711000,1582329655832292,0.001,9681.94,9681.85,0.031 -binance-futures,BTCUSDT,1582329655734000,1582329655856034,0.001,9681.94,9681.66,5.291 -binance-futures,BTCUSDT,1582329655757000,1582329655879988,0.001,9681.94,9681.85,0.031 -binance-futures,BTCUSDT,1582329655757000,1582329655880010,0.001,9681.94,9681.87,0.031 -binance-futures,BTCUSDT,1582329655779000,1582329655900819,0.67,9681.93,9681.87,0.031 -binance-futures,BTCUSDT,1582329655788000,1582329655908169,1.35,9681.93,9681.87,0.031 -binance-futures,BTCUSDT,1582329655793000,1582329655911946,2.51,9681.93,9681.87,0.031 -binance-futures,BTCUSDT,1582329655811000,1582329655929069,2.51,9681.93,9681.88,0.031 -binance-futures,BTCUSDT,1582329655982000,1582329656102098,0.204,9681.89,9681.88,0.031 -binance-futures,BTCUSDT,1582329656015000,1582329656140733,4.831,9681.94,9681.88,0.031 -binance-futures,BTCUSDT,1582329656130000,1582329656248999,4.831,9681.94,9681.93,0.019 -binance-futures,BTCUSDT,1582329656148000,1582329656268935,4.831,9681.94,9681.93,2.719 -binance-futures,BTCUSDT,1582329656190000,1582329656307656,4.831,9681.94,9681.93,2.7 -binance-futures,BTCUSDT,1582329656216000,1582329656337061,4.831,9681.94,9681.88,0.031 -binance-futures,BTCUSDT,1582329656308000,1582329656430251,4.831,9681.94,9681.91,0.031 -binance-futures,BTCUSDT,1582329656433000,1582329656551287,4.831,9681.94,9681.93,2 -binance-futures,BTCUSDT,1582329656434000,1582329656553930,4.831,9681.94,9681.93,6 -binance-futures,BTCUSDT,1582329656461000,1582329656579799,4.831,9681.94,9681.93,6.67 -binance-futures,BTCUSDT,1582329656522000,1582329656642577,4.831,9681.94,9681.93,7.1 -binance-futures,BTCUSDT,1582329656556000,1582329656674592,4.831,9681.94,9681.93,7.119 -binance-futures,BTCUSDT,1582329656689000,1582329656806942,4.831,9681.94,9681.93,6.689 -binance-futures,BTCUSDT,1582329656694000,1582329656813546,5.035,9681.94,9681.93,6.689 -binance-futures,BTCUSDT,1582329656705000,1582329656823491,4.831,9681.94,9681.93,6.689 -binance-futures,BTCUSDT,1582329656788000,1582329656906435,4.831,9681.94,9681.93,8.619 -binance-futures,BTCUSDT,1582329656795000,1582329656914886,0.001,9681.94,9681.93,8.619 -binance-futures,BTCUSDT,1582329656795000,1582329656914897,0.001,9681.94,9681.93,13.323 -binance-futures,BTCUSDT,1582329656817000,1582329656937251,0.001,9681.94,9681.93,11.393 -binance-futures,BTCUSDT,1582329656836000,1582329656955799,0.001,9681.94,9681.93,9.393 -binance-futures,BTCUSDT,1582329656836000,1582329656956295,0.001,9681.94,9681.93,10.393 -binance-futures,BTCUSDT,1582329656879000,1582329656998483,0.001,9681.94,9681.93,8.393 -binance-futures,BTCUSDT,1582329656881000,1582329656998606,0.001,9681.94,9681.93,6.393 -binance-futures,BTCUSDT,1582329656921000,1582329657038072,0.001,9681.94,9681.93,6.41 -binance-futures,BTCUSDT,1582329657022000,1582329657140634,0.001,9681.94,9681.93,6.868 -binance-futures,BTCUSDT,1582329657116000,1582329657245538,0.001,9681.94,9681.93,6.41 -binance-futures,BTCUSDT,1582329657187000,1582329657309664,0.001,9681.94,9681.93,6.859 -binance-futures,BTCUSDT,1582329657518000,1582329657636968,0.001,9681.94,9681.93,6.41 -binance-futures,BTCUSDT,1582329657838000,1582329657956858,0.001,9681.94,9681.93,6.421 -binance-futures,BTCUSDT,1582329657842000,1582329657961473,0.001,9681.94,9681.93,6.873 -binance-futures,BTCUSDT,1582329657920000,1582329658041410,0.001,9681.94,9681.93,6.421 -binance-futures,BTCUSDT,1582329658183000,1582329658305787,0.001,9681.94,9681.93,6.849 -binance-futures,BTCUSDT,1582329658249000,1582329658376315,0.001,9681.94,9681.93,6.421 -binance-futures,BTCUSDT,1582329658820000,1582329658940615,0.205,9681.94,9681.93,6.421 -binance-futures,BTCUSDT,1582329658822000,1582329658943938,1.276,9681.94,9681.93,6.421 -binance-futures,BTCUSDT,1582329658825000,1582329658948153,11.986,9681.94,9681.93,6.421 -binance-futures,BTCUSDT,1582329658845000,1582329658966471,11.986,9681.94,9681.93,5.421 -binance-futures,BTCUSDT,1582329658854000,1582329658977187,11.782,9681.94,9681.93,5.421 -binance-futures,BTCUSDT,1582329658860000,1582329658983077,0.001,9681.94,9681.93,4.751 -binance-futures,BTCUSDT,1582329658896000,1582329659017647,0.001,9681.94,9681.93,5.421 -binance-futures,BTCUSDT,1582329658901000,1582329659021710,0.001,9681.94,9681.93,6.421 -binance-futures,BTCUSDT,1582329658964000,1582329659084613,0.001,9681.94,9681.93,5.421 -binance-futures,BTCUSDT,1582329658969000,1582329659090089,0.001,9681.94,9681.93,5.404 -binance-futures,BTCUSDT,1582329658978000,1582329659097404,0.001,9681.94,9681.93,5.393 -binance-futures,BTCUSDT,1582329659509000,1582329659628670,0.001,9681.94,9681.93,0.689 -binance-futures,BTCUSDT,1582329659532000,1582329659652965,0.001,9681.94,9681.93,0.019 -binance-futures,BTCUSDT,1582329659562000,1582329659682993,0.001,9681.94,9681.93,0.689 -binance-futures,BTCUSDT,1582329659595000,1582329659717992,0.001,9681.94,9681.93,0.67 -binance-futures,BTCUSDT,1582329659633000,1582329659754101,0.001,9681.94,9681.8,4.541 -binance-futures,BTCUSDT,1582329659657000,1582329659778393,0.001,9681.94,9681.8,5.211 -binance-futures,BTCUSDT,1582329659680000,1582329659805352,0.001,9681.94,9681.84,0.031 -binance-futures,BTCUSDT,1582329659716000,1582329659837628,0.001,9681.94,9681.84,0.701 -binance-futures,BTCUSDT,1582329659739000,1582329659857228,0.001,9681.94,9681.86,0.031 -binance-futures,BTCUSDT,1582329659739000,1582329659857892,0.001,9681.94,9681.88,0.031 -binance-futures,BTCUSDT,1582329659790000,1582329659911302,0.001,9681.94,9681.9,0.431 -binance-futures,BTCUSDT,1582329659815000,1582329659937889,0.001,9681.94,9681.93,0.031 -binance-futures,BTCUSDT,1582329660079000,1582329660198727,0.001,9681.94,9681.92,0.031 -binance-futures,BTCUSDT,1582329660082000,1582329660202987,0.001,9681.94,9681.89,0.442 -binance-futures,BTCUSDT,1582329660082000,1582329660203685,0.001,9681.94,9681.93,0.67 -binance-futures,BTCUSDT,1582329660088000,1582329660212469,0.001,9681.94,9681.93,3.757 -binance-futures,BTCUSDT,1582329660135000,1582329660254514,0.001,9681.94,9681.93,4.196 -binance-futures,BTCUSDT,1582329660140000,1582329660264763,0.001,9681.94,9681.93,3.757 -binance-futures,BTCUSDT,1582329660176000,1582329660297404,0.001,9681.94,9681.93,3.087 -binance-futures,BTCUSDT,1582329660561000,1582329660682809,0.001,9681.94,9681.89,0.031 -binance-futures,BTCUSDT,1582329660584000,1582329660707460,0.001,9681.94,9681.91,0.031 -binance-futures,BTCUSDT,1582329660626000,1582329660746227,0.001,9681.94,9681.93,0.47 -binance-futures,BTCUSDT,1582329661298000,1582329661420105,0.001,9681.94,9681.93,4.133 -binance-futures,BTCUSDT,1582329661324000,1582329661446332,0.001,9681.94,9681.93,3.663 -binance-futures,BTCUSDT,1582329661335000,1582329661456406,0.001,9681.94,9681.93,4.333 -binance-futures,BTCUSDT,1582329661360000,1582329661482192,0.001,9681.94,9681.93,3.663 -binance-futures,BTCUSDT,1582329662031000,1582329662153068,0.001,9681.94,9681.93,1.663 -binance-futures,BTCUSDT,1582329662055000,1582329662171895,3.901,9681.94,9681.93,1.663 -binance-futures,BTCUSDT,1582329662076000,1582329662197463,4.341,9681.94,9681.93,1.663 -binance-futures,BTCUSDT,1582329662077000,1582329662197630,4.341,9681.94,9681.93,2.122 -binance-futures,BTCUSDT,1582329662083000,1582329662205403,5.011,9681.94,9681.93,2.122 -binance-futures,BTCUSDT,1582329662085000,1582329662205622,6.411,9681.94,9681.93,2.122 -binance-futures,BTCUSDT,1582329662093000,1582329662212720,6.411,9681.94,9681.93,1.663 -binance-futures,BTCUSDT,1582329662109000,1582329662233163,5.691,9681.94,9681.93,1.663 -binance-futures,BTCUSDT,1582329662116000,1582329662238033,5.251,9681.94,9681.93,1.663 -binance-futures,BTCUSDT,1582329662118000,1582329662240858,4.571,9681.94,9681.93,1.663 -binance-futures,BTCUSDT,1582329662124000,1582329662247462,3.901,9681.94,9681.93,1.663 -binance-futures,BTCUSDT,1582329662146000,1582329662266871,0.001,9681.94,9681.93,1.663 -binance-futures,BTCUSDT,1582329662185000,1582329662304948,0.082,9681.94,9681.93,1.663 -binance-futures,BTCUSDT,1582329662270000,1582329662394416,0.286,9681.94,9681.93,1.663 -binance-futures,BTCUSDT,1582329662272000,1582329662401528,1.357,9681.94,9681.93,1.663 -binance-futures,BTCUSDT,1582329662353000,1582329662474059,12.067,9681.94,9681.93,1.663 -binance-futures,BTCUSDT,1582329662384000,1582329662504102,12.067,9681.94,9681.3,0.005 -binance-futures,BTCUSDT,1582329662384000,1582329662504541,12.067,9681.94,9681.8,2.976 -binance-futures,BTCUSDT,1582329662405000,1582329662529702,0.44,9681.93,9681.8,2.976 -binance-futures,BTCUSDT,1582329662408000,1582329662533376,1.11,9681.93,9681.8,2.976 -binance-futures,BTCUSDT,1582329662416000,1582329662538654,1.79,9681.93,9681.8,2.976 -binance-futures,BTCUSDT,1582329662417000,1582329662538682,2.51,9681.93,9681.8,2.976 -binance-futures,BTCUSDT,1582329662420000,1582329662542043,1.071,9681.81,9681.8,2.976 -binance-futures,BTCUSDT,1582329662422000,1582329662544157,11.985,9681.81,9681.8,2.976 -binance-futures,BTCUSDT,1582329662436000,1582329662557671,1.275,9681.81,9681.8,2.976 -binance-futures,BTCUSDT,1582329662437000,1582329662557690,0.204,9681.81,9681.8,2.976 -binance-futures,BTCUSDT,1582329662441000,1582329662561949,4.304,9681.81,9681.8,2.976 -binance-futures,BTCUSDT,1582329662453000,1582329662575875,0.204,9681.81,9681.8,2.976 -binance-futures,BTCUSDT,1582329662484000,1582329662600979,0.001,9681.94,9681.8,2.976 -binance-futures,BTCUSDT,1582329662501000,1582329662622758,0.081,9681.81,9681.8,2.976 -binance-futures,BTCUSDT,1582329662521000,1582329662641683,3.581,9681.81,9681.8,2.976 -binance-futures,BTCUSDT,1582329662562000,1582329662682870,0.081,9681.81,9681.8,2.976 -binance-futures,BTCUSDT,1582329662574000,1582329662696806,0.001,9681.94,9681.8,2.976 -binance-futures,BTCUSDT,1582329662596000,1582329662718329,4.479,9681.81,9681.8,2.976 -binance-futures,BTCUSDT,1582329662802000,1582329662925123,4.324,9681.81,9681.8,2.976 -binance-futures,BTCUSDT,1582329662878000,1582329662996920,4.405,9681.81,9681.8,2.976 -binance-futures,BTCUSDT,1582329663036000,1582329663158527,4.324,9681.81,9681.8,2.976 -binance-futures,BTCUSDT,1582329663139000,1582329663543529,4.405,9681.81,9681.8,2.976 -binance-futures,BTCUSDT,1582329663299000,1582329663544151,4.405,9681.81,9681.67,3.022 -binance-futures,BTCUSDT,1582329663322000,1582329663544300,4.405,9681.81,9681.71,0.031 -binance-futures,BTCUSDT,1582329663349000,1582329663544444,4.405,9681.81,9681.8,0.469 -binance-futures,BTCUSDT,1582329663357000,1582329663544500,4.405,9681.81,9681.71,0.031 -binance-futures,BTCUSDT,1582329663371000,1582329663544619,4.405,9681.81,9681.67,3.022 -binance-futures,BTCUSDT,1582329663374000,1582329663544632,0.204,9681.72,9681.67,3.022 -binance-futures,BTCUSDT,1582329663386000,1582329663544722,4.405,9681.81,9681.67,3.022 -binance-futures,BTCUSDT,1582329663446000,1582329663573526,4.324,9681.81,9681.67,3.022 -binance-futures,BTCUSDT,1582329663469000,1582329663587943,4.324,9681.81,9681.7,0.031 -binance-futures,BTCUSDT,1582329663469000,1582329663587966,4.324,9681.81,9681.71,0.031 -binance-futures,BTCUSDT,1582329663470000,1582329663590700,0.204,9681.75,9681.71,0.031 -binance-futures,BTCUSDT,1582329663493000,1582329663613135,4.324,9681.81,9681.71,0.031 -binance-futures,BTCUSDT,1582329663515000,1582329663632862,4.324,9681.81,9681.72,0.031 -binance-futures,BTCUSDT,1582329663933000,1582329664053635,4.324,9681.81,9681.73,0.44 -binance-futures,BTCUSDT,1582329663955000,1582329664073746,4.324,9681.81,9681.76,0.031 -binance-futures,BTCUSDT,1582329663961000,1582329664082387,4.324,9681.81,9681.77,0.031 -binance-futures,BTCUSDT,1582329663979000,1582329664098622,4.324,9681.81,9681.77,0.47 -binance-futures,BTCUSDT,1582329663986000,1582329664107318,4.324,9681.81,9681.77,0.031 -binance-futures,BTCUSDT,1582329663989000,1582329664110100,4.324,9681.81,9681.8,0.464 -binance-futures,BTCUSDT,1582329664004000,1582329664127805,4.324,9681.81,9681.8,0.495 -binance-futures,BTCUSDT,1582329664066000,1582329664184581,4.324,9681.81,9681.8,0.031 -binance-futures,BTCUSDT,1582329664125000,1582329664244795,4.324,9681.81,9681.78,0.031 -binance-futures,BTCUSDT,1582329664129000,1582329664246955,4.405,9681.81,9681.78,0.031 -binance-futures,BTCUSDT,1582329664154000,1582329664273860,0.72,9681.79,9681.78,0.031 -binance-futures,BTCUSDT,1582329664158000,1582329664283856,2.471,9681.79,9681.78,0.031 -binance-futures,BTCUSDT,1582329664187000,1582329664315248,2.48,9681.79,9681.77,0.031 -binance-futures,BTCUSDT,1582329664187000,1582329664315435,1.8,9681.79,9681.67,3.022 -binance-futures,BTCUSDT,1582329664190000,1582329664316455,1.36,9681.79,9681.67,3.022 -binance-futures,BTCUSDT,1582329664192000,1582329664316853,0.679,9681.79,9681.67,3.022 -binance-futures,BTCUSDT,1582329664196000,1582329664317740,1.119,9681.79,9681.67,3.022 -binance-futures,BTCUSDT,1582329664203000,1582329664326625,1.123,9681.79,9681.67,3.022 -binance-futures,BTCUSDT,1582329664210000,1582329664330061,0.453,9681.79,9681.67,3.022 -binance-futures,BTCUSDT,1582329664221000,1582329664341632,1.133,9681.79,9681.67,3.022 -binance-futures,BTCUSDT,1582329664223000,1582329664344587,1.133,9681.79,9681.7,0.464 -binance-futures,BTCUSDT,1582329664230000,1582329664352666,1.124,9681.79,9681.67,3.022 -binance-futures,BTCUSDT,1582329664244000,1582329664366473,0.684,9681.79,9681.67,3.022 -binance-futures,BTCUSDT,1582329664250000,1582329664368912,0.68,9681.79,9681.67,3.022 -binance-futures,BTCUSDT,1582329664255000,1582329664374353,4.405,9681.81,9681.67,3.022 -binance-futures,BTCUSDT,1582329664272000,1582329664395923,4.405,9681.81,9681.69,0.031 -binance-futures,BTCUSDT,1582329664272000,1582329664396211,4.405,9681.81,9681.71,0.031 -binance-futures,BTCUSDT,1582329664323000,1582329664442799,0.204,9681.73,9681.71,0.031 -binance-futures,BTCUSDT,1582329664329000,1582329664446756,4.405,9681.81,9681.71,0.031 -binance-futures,BTCUSDT,1582329664339000,1582329664459186,4.405,9681.81,9681.72,0.031 -binance-futures,BTCUSDT,1582329664371000,1582329664489671,4.405,9681.81,9681.8,0.462 -binance-futures,BTCUSDT,1582329664386000,1582329664508694,4.324,9681.81,9681.8,0.462 -binance-futures,BTCUSDT,1582329664426000,1582329664547896,4.324,9681.81,9681.67,3.022 -binance-futures,BTCUSDT,1582329664450000,1582329664569640,0.44,9681.79,9681.67,3.022 -binance-futures,BTCUSDT,1582329664452000,1582329664571978,1.11,9681.79,9681.67,3.022 -binance-futures,BTCUSDT,1582329664461000,1582329664581804,2,9681.77,9681.67,3.022 -binance-futures,BTCUSDT,1582329664466000,1582329664589934,1.275,9681.68,9681.67,3.022 -binance-futures,BTCUSDT,1582329664528000,1582329664648393,0.874,9681.68,9681.67,3.022 -binance-futures,BTCUSDT,1582329664549000,1582329664670772,0.67,9681.68,9681.67,3.022 -binance-futures,BTCUSDT,1582329664556000,1582329664676363,1.11,9681.68,9681.67,3.022 -binance-futures,BTCUSDT,1582329664560000,1582329664682349,1.79,9681.68,9681.67,3.022 -binance-futures,BTCUSDT,1582329664583000,1582329664703263,2.47,9681.68,9681.67,3.022 -binance-futures,BTCUSDT,1582329664586000,1582329664707373,1.8,9681.68,9681.67,3.022 -binance-futures,BTCUSDT,1582329664589000,1582329664711373,1.36,9681.68,9681.67,3.022 -binance-futures,BTCUSDT,1582329664618000,1582329664738866,2.03,9681.68,9681.67,3.022 -binance-futures,BTCUSDT,1582329664618000,1582329664738894,1.35,9681.68,9681.67,3.022 -binance-futures,BTCUSDT,1582329664621000,1582329664740857,1.79,9681.68,9681.67,3.022 -binance-futures,BTCUSDT,1582329664630000,1582329664748275,1.11,9681.68,9681.67,3.022 -binance-futures,BTCUSDT,1582329664644000,1582329664765181,1.79,9681.68,9681.67,3.022 -binance-futures,BTCUSDT,1582329664651000,1582329664772890,2.47,9681.68,9681.67,3.022 -binance-futures,BTCUSDT,1582329664718000,1582329664837699,2.47,9681.68,9681.3,0.005 -binance-futures,BTCUSDT,1582329664718000,1582329664837710,2.47,9681.68,9681.54,3.613 -binance-futures,BTCUSDT,1582329664735000,1582329664855704,2,9681.62,9681.54,3.613 -binance-futures,BTCUSDT,1582329664759000,1582329664878519,0.44,9681.61,9681.54,3.613 -binance-futures,BTCUSDT,1582329664761000,1582329664881129,1.12,9681.61,9681.54,3.613 -binance-futures,BTCUSDT,1582329664766000,1582329664886494,1.8,9681.61,9681.54,3.613 -binance-futures,BTCUSDT,1582329664769000,1582329664888822,2.47,9681.61,9681.54,3.613 -binance-futures,BTCUSDT,1582329664794000,1582329664914470,0.68,9681.6,9681.54,3.613 -binance-futures,BTCUSDT,1582329664820000,1582329664941982,0.68,9681.59,9681.54,3.613 -binance-futures,BTCUSDT,1582329664830000,1582329664949827,1.79,9681.59,9681.54,3.613 -binance-futures,BTCUSDT,1582329664855000,1582329664974647,0.68,9681.58,9681.54,3.613 -binance-futures,BTCUSDT,1582329664879000,1582329664997650,0.67,9681.57,9681.54,3.613 -binance-futures,BTCUSDT,1582329664890000,1582329665011580,1.11,9681.57,9681.54,3.613 -binance-futures,BTCUSDT,1582329664892000,1582329665014235,1.79,9681.57,9681.54,3.613 -binance-futures,BTCUSDT,1582329664912000,1582329665033007,1.35,9681.57,9681.54,3.613 -binance-futures,BTCUSDT,1582329664917000,1582329665036587,0.68,9681.57,9681.54,3.613 -binance-futures,BTCUSDT,1582329664925000,1582329665045049,0.44,9681.55,9681.54,3.613 -binance-futures,BTCUSDT,1582329664946000,1582329665064944,4.324,9681.81,9681.54,3.613 -binance-futures,BTCUSDT,1582329664950000,1582329665067027,0.68,9681.55,9681.54,3.613 -binance-futures,BTCUSDT,1582329664974000,1582329665094210,4.324,9681.81,9681.54,3.613 -binance-futures,BTCUSDT,1582329665053000,1582329665171215,1.871,9681.93,9681.54,3.613 -binance-futures,BTCUSDT,1582329665074000,1582329665197630,1.871,9681.93,9681.57,0.031 -binance-futures,BTCUSDT,1582329665081000,1582329665206409,1.871,9681.93,9681.58,0.031 -binance-futures,BTCUSDT,1582329665255000,1582329665377068,1.871,9681.93,9681.59,0.444 -binance-futures,BTCUSDT,1582329665255000,1582329665377432,1.871,9681.93,9681.61,0.031 -binance-futures,BTCUSDT,1582329665279000,1582329665399889,1.871,9681.93,9681.63,0.031 -binance-futures,BTCUSDT,1582329665308000,1582329665426744,0.68,9681.92,9681.63,0.031 -binance-futures,BTCUSDT,1582329665313000,1582329665431633,1.35,9681.92,9681.63,0.031 -binance-futures,BTCUSDT,1582329665315000,1582329665434654,2.47,9681.92,9681.63,0.031 -binance-futures,BTCUSDT,1582329665338000,1582329665458060,2.47,9681.92,9681.61,0.49 -binance-futures,BTCUSDT,1582329665340000,1582329665460154,2.47,9681.92,9681.61,0.459 -binance-futures,BTCUSDT,1582329665366000,1582329665485701,2.47,9681.92,9681.54,3.613 -binance-futures,BTCUSDT,1582329665367000,1582329665489160,2.47,9681.92,9681.55,0.47 -binance-futures,BTCUSDT,1582329665371000,1582329665491609,2.47,9681.92,9681.54,3.613 -binance-futures,BTCUSDT,1582329665492000,1582329665612654,0.204,9681.77,9681.54,3.613 -binance-futures,BTCUSDT,1582329665518000,1582329665637899,0.68,9681.76,9681.54,3.613 -binance-futures,BTCUSDT,1582329665524000,1582329665645209,1.35,9681.76,9681.54,3.613 -binance-futures,BTCUSDT,1582329665528000,1582329665647838,2.03,9681.76,9681.54,3.613 -binance-futures,BTCUSDT,1582329665530000,1582329665650108,2.47,9681.76,9681.54,3.613 -binance-futures,BTCUSDT,1582329665542000,1582329665661692,0.204,9681.7,9681.54,3.613 -binance-futures,BTCUSDT,1582329665619000,1582329665738351,0.204,9681.7,9681.55,1.91 -binance-futures,BTCUSDT,1582329665643000,1582329665763106,0.204,9681.7,9681.59,0.031 -binance-futures,BTCUSDT,1582329665668000,1582329665787929,0.204,9681.7,9681.65,0.427 -binance-futures,BTCUSDT,1582329665671000,1582329665792915,1.871,9681.93,9681.65,0.427 -binance-futures,BTCUSDT,1582329665690000,1582329665812718,1.871,9681.93,9681.69,0.031 -binance-futures,BTCUSDT,1582329665714000,1582329665832927,0.68,9681.92,9681.69,0.031 -binance-futures,BTCUSDT,1582329665717000,1582329665836762,1.12,9681.92,9681.77,0.448 -binance-futures,BTCUSDT,1582329665721000,1582329665839814,1.8,9681.92,9681.77,0.448 -binance-futures,BTCUSDT,1582329665723000,1582329665842687,2.47,9681.92,9681.77,0.448 -binance-futures,BTCUSDT,1582329665733000,1582329665852796,2.47,9681.92,9681.69,0.031 -binance-futures,BTCUSDT,1582329665735000,1582329665855459,2.47,9681.92,9681.7,0.031 -binance-futures,BTCUSDT,1582329665744000,1582329665862991,1.79,9681.92,9681.7,0.031 -binance-futures,BTCUSDT,1582329665753000,1582329665871516,1.35,9681.92,9681.7,0.031 -binance-futures,BTCUSDT,1582329665778000,1582329665897951,0.67,9681.92,9681.7,0.031 -binance-futures,BTCUSDT,1582329665788000,1582329665909370,1.871,9681.93,9681.7,0.031 -binance-futures,BTCUSDT,1582329665798000,1582329665916722,0.44,9681.91,9681.7,0.031 -binance-futures,BTCUSDT,1582329665811000,1582329665931171,1.12,9681.91,9681.7,0.031 -binance-futures,BTCUSDT,1582329665815000,1582329665935263,1.8,9681.91,9681.7,0.031 -binance-futures,BTCUSDT,1582329665819000,1582329665938339,1.8,9681.91,9681.7,0.487 -binance-futures,BTCUSDT,1582329665830000,1582329665949999,2.03,9681.91,9681.7,0.487 -binance-futures,BTCUSDT,1582329665832000,1582329665951477,2.03,9681.91,9681.7,0.031 -binance-futures,BTCUSDT,1582329665841000,1582329665961134,2.03,9681.91,9681.74,0.031 -binance-futures,BTCUSDT,1582329665846000,1582329665966907,1.35,9681.91,9681.74,0.031 -binance-futures,BTCUSDT,1582329665853000,1582329665974352,0.68,9681.91,9681.74,0.031 -binance-futures,BTCUSDT,1582329665860000,1582329665984197,1.871,9681.93,9681.74,0.031 -binance-futures,BTCUSDT,1582329665862000,1582329665985839,1.871,9681.93,9681.7,0.031 -binance-futures,BTCUSDT,1582329665865000,1582329665985912,1.871,9681.93,9681.73,0.456 -binance-futures,BTCUSDT,1582329665882000,1582329666004706,1.309,9681.93,9681.73,0.456 -binance-futures,BTCUSDT,1582329665882000,1582329666004718,0.747,9681.93,9681.73,0.456 -binance-futures,BTCUSDT,1582329665888000,1582329666011850,0.747,9681.93,9681.77,0.031 -binance-futures,BTCUSDT,1582329665905000,1582329666027841,0.652,9681.93,9681.77,0.031 -binance-futures,BTCUSDT,1582329665909000,1582329666027851,0.001,9681.94,9681.77,0.031 -binance-futures,BTCUSDT,1582329666021000,1582329666138004,0.001,9681.94,9681.78,0.031 -binance-futures,BTCUSDT,1582329666130000,1582329666247961,0.001,9681.94,9681.81,0.031 -binance-futures,BTCUSDT,1582329666239000,1582329666359985,0.001,9681.94,9681.84,0.031 -binance-futures,BTCUSDT,1582329666347000,1582329666470343,0.001,9681.94,9681.81,0.031 -binance-futures,BTCUSDT,1582329666372000,1582329666490344,0.001,9681.94,9681.86,0.031 -binance-futures,BTCUSDT,1582329666392000,1582329666513475,0.001,9681.94,9681.81,0.031 -binance-futures,BTCUSDT,1582329666470000,1582329666590207,0.001,9681.94,9681.83,0.031 -binance-futures,BTCUSDT,1582329666539000,1582329666658078,0.001,9681.94,9681.84,0.462 -binance-futures,BTCUSDT,1582329666561000,1582329666680908,0.001,9681.94,9681.87,0.031 -binance-futures,BTCUSDT,1582329666563000,1582329666683153,0.001,9681.94,9681.88,0.031 -binance-futures,BTCUSDT,1582329666584000,1582329666703630,0.001,9681.94,9681.9,0.443 -binance-futures,BTCUSDT,1582329666607000,1582329666729828,0.001,9681.94,9681.93,0.031 -binance-futures,BTCUSDT,1582329666680000,1582329666801499,0.001,9681.94,9681.89,0.031 -binance-futures,BTCUSDT,1582329666901000,1582329667020733,0.001,9681.94,9681.92,0.031 -binance-futures,BTCUSDT,1582329666927000,1582329667046751,0.001,9681.94,9681.93,0.67 -binance-futures,BTCUSDT,1582329666958000,1582329667075968,0.001,9681.94,9681.92,0.031 -binance-futures,BTCUSDT,1582329666988000,1582329667108372,0.001,9681.94,9681.93,0.67 -binance-futures,BTCUSDT,1582329666990000,1582329667109963,0.001,9681.94,9681.93,1.107 -binance-futures,BTCUSDT,1582329667013000,1582329667133766,0.001,9681.94,9681.93,0.67 -binance-futures,BTCUSDT,1582329667016000,1582329667141718,0.001,9681.94,9681.93,0.57 -binance-futures,BTCUSDT,1582329667058000,1582329667185776,0.001,9681.94,9681.92,0.031 -binance-futures,BTCUSDT,1582329667059000,1582329667185851,0.194,9682.35,9681.92,0.031 -binance-futures,BTCUSDT,1582329667063000,1582329667186881,0.003,9682.42,9681.92,0.031 -binance-futures,BTCUSDT,1582329667082000,1582329667202976,0.003,9682.42,9681.94,0.272 -binance-futures,BTCUSDT,1582329667088000,1582329667222860,0.003,9682.42,9681.97,0.031 -binance-futures,BTCUSDT,1582329667129000,1582329667249447,2.284,9682.43,9681.97,0.478 -binance-futures,BTCUSDT,1582329667132000,1582329667256359,2.284,9682.43,9681.99,0.468 -binance-futures,BTCUSDT,1582329667145000,1582329667266741,2.284,9682.43,9681.97,0.031 -binance-futures,BTCUSDT,1582329667151000,1582329667278698,2.284,9682.43,9681.99,0.031 -binance-futures,BTCUSDT,1582329667153000,1582329667278762,2.284,9682.43,9682.01,0.031 -binance-futures,BTCUSDT,1582329667180000,1582329667300654,2.284,9682.43,9682,0.031 -binance-futures,BTCUSDT,1582329667184000,1582329667303476,0.2,9682.38,9682,0.031 -binance-futures,BTCUSDT,1582329667189000,1582329667309760,0.2,9682.38,9682.07,2 -binance-futures,BTCUSDT,1582329667191000,1582329667313361,0.2,9682.38,9682.07,6 -binance-futures,BTCUSDT,1582329667201000,1582329667324891,2.284,9682.43,9682.07,4 -binance-futures,BTCUSDT,1582329667203000,1582329667327962,2.284,9682.43,9682.07,2 -binance-futures,BTCUSDT,1582329667204000,1582329667329212,2.284,9682.43,9682.05,0.456 -binance-futures,BTCUSDT,1582329667212000,1582329667337314,2.284,9682.43,9682.13,6 -binance-futures,BTCUSDT,1582329667218000,1582329667342071,2.284,9682.43,9682.13,8 -binance-futures,BTCUSDT,1582329667227000,1582329667360835,2.284,9682.43,9682.13,6 -binance-futures,BTCUSDT,1582329667229000,1582329667365993,2.284,9682.43,9682.13,4 -binance-futures,BTCUSDT,1582329667229000,1582329667366290,2.284,9682.43,9682.11,0.467 -binance-futures,BTCUSDT,1582329667241000,1582329667369574,2.284,9682.43,9682.02,0.57 -binance-futures,BTCUSDT,1582329667243000,1582329667369645,2.284,9682.43,9682.35,0.438 -binance-futures,BTCUSDT,1582329667267000,1582329667388261,2.284,9682.43,9682.37,2 -binance-futures,BTCUSDT,1582329667269000,1582329667389840,2.284,9682.43,9682.37,4 -binance-futures,BTCUSDT,1582329667281000,1582329667401065,2.284,9682.43,9682.41,2 -binance-futures,BTCUSDT,1582329667287000,1582329667408426,2.284,9682.43,9682.42,4 -binance-futures,BTCUSDT,1582329667293000,1582329667414744,2.284,9682.43,9682.42,4.467 -binance-futures,BTCUSDT,1582329667357000,1582329667476429,2.284,9682.43,9682.42,4 -binance-futures,BTCUSDT,1582329667368000,1582329667485650,2.284,9682.43,9682.42,4.452 -binance-futures,BTCUSDT,1582329667378000,1582329667498843,2.284,9682.43,9682.42,4.471 -binance-futures,BTCUSDT,1582329667380000,1582329667503943,2.284,9682.43,9682.42,4.295 -binance-futures,BTCUSDT,1582329667395000,1582329667516698,2.284,9682.43,9682.42,6.305 -binance-futures,BTCUSDT,1582329667406000,1582329667528414,2.284,9682.43,9682.42,6.875 -binance-futures,BTCUSDT,1582329667517000,1582329667637580,2.244,9682.43,9682.42,6.875 -binance-futures,BTCUSDT,1582329667520000,1582329667641193,1.944,9682.43,9682.42,6.875 -binance-futures,BTCUSDT,1582329667539000,1582329667660417,0.315,9683,9682.42,6.875 -binance-futures,BTCUSDT,1582329667552000,1582329667674766,0.315,9683,9682.45,1.3 -binance-futures,BTCUSDT,1582329667559000,1582329667684070,0.315,9683,9682.46,2 -binance-futures,BTCUSDT,1582329667562000,1582329667686885,0.315,9683,9682.46,2.031 -binance-futures,BTCUSDT,1582329667579000,1582329667701689,0.315,9683,9682.48,0.462 -binance-futures,BTCUSDT,1582329667589000,1582329667709515,0.315,9683,9682.5,2 -binance-futures,BTCUSDT,1582329667600000,1582329667721487,3.85,9683,9682.5,2 -binance-futures,BTCUSDT,1582329667606000,1582329667728138,3.85,9683,9682.56,2 -binance-futures,BTCUSDT,1582329667609000,1582329667731547,3.85,9683,9682.56,4 -binance-futures,BTCUSDT,1582329667609000,1582329667731580,3.85,9683,9682.56,6 -binance-futures,BTCUSDT,1582329667611000,1582329667734071,3.85,9683,9682.56,8 -binance-futures,BTCUSDT,1582329667613000,1582329667742914,3.85,9683,9682.56,10 -binance-futures,BTCUSDT,1582329667626000,1582329667745521,3.85,9683,9682.6,2 -binance-futures,BTCUSDT,1582329667628000,1582329667751153,3.85,9683,9682.62,4 -binance-futures,BTCUSDT,1582329667632000,1582329667754783,3.85,9683,9682.62,6 -binance-futures,BTCUSDT,1582329667632000,1582329667755551,3.85,9683,9682.62,10 -binance-futures,BTCUSDT,1582329667643000,1582329667764645,0.003,9682.99,9682.62,10 -binance-futures,BTCUSDT,1582329667649000,1582329667770000,0.003,9682.99,9682.68,2 -binance-futures,BTCUSDT,1582329667652000,1582329667774195,0.003,9682.99,9682.68,6 -binance-futures,BTCUSDT,1582329667652000,1582329667775118,0.003,9682.99,9682.68,8 -binance-futures,BTCUSDT,1582329667662000,1582329667781894,0.003,9682.99,9682.68,10 -binance-futures,BTCUSDT,1582329667668000,1582329667788355,0.003,9682.99,9682.72,2 -binance-futures,BTCUSDT,1582329667670000,1582329667791428,0.003,9682.99,9682.74,4 -binance-futures,BTCUSDT,1582329667674000,1582329667794617,0.003,9682.99,9682.74,8 -binance-futures,BTCUSDT,1582329667690000,1582329667813885,0.003,9682.99,9682.8,6 -binance-futures,BTCUSDT,1582329667710000,1582329667832907,0.003,9682.99,9682.8,8 -binance-futures,BTCUSDT,1582329667712000,1582329667834163,0.003,9682.99,9682.84,2 -binance-futures,BTCUSDT,1582329667716000,1582329667841200,0.003,9682.99,9682.91,1 -binance-futures,BTCUSDT,1582329667718000,1582329667850924,0.315,9683,9682.91,1 -binance-futures,BTCUSDT,1582329667718000,1582329667851183,5.006,9683.42,9682.91,1 -binance-futures,BTCUSDT,1582329667724000,1582329667852129,0.005,9683.5,9682.91,1 -binance-futures,BTCUSDT,1582329667736000,1582329667859144,0.005,9683.5,9682.95,1 -binance-futures,BTCUSDT,1582329667738000,1582329667863319,0.005,9683.5,9682.98,1 -binance-futures,BTCUSDT,1582329667741000,1582329667865987,0.005,9683.5,9683.42,1.24 -binance-futures,BTCUSDT,1582329667764000,1582329667887148,0.005,9683.5,9683.49,1 -binance-futures,BTCUSDT,1582329667794000,1582329667916055,0.005,9683.5,9683.49,1.451 -binance-futures,BTCUSDT,1582329667875000,1582329667995177,0.005,9683.5,9683.49,2.021 -binance-futures,BTCUSDT,1582329667921000,1582329668044535,0.005,9683.5,9683.49,4.011 -binance-futures,BTCUSDT,1582329667929000,1582329668049581,0.005,9683.5,9683.49,3.56 -binance-futures,BTCUSDT,1582329667944000,1582329668068519,0.005,9683.5,9683.49,4.02 -binance-futures,BTCUSDT,1582329667985000,1582329668107076,0.005,9683.5,9683.49,2.03 -binance-futures,BTCUSDT,1582329667989000,1582329668110857,0.005,9683.5,9683.49,2.049 -binance-futures,BTCUSDT,1582329668011000,1582329668132719,0.005,9683.5,9683.49,4.039 -binance-futures,BTCUSDT,1582329668116000,1582329668235851,3.078,9683.5,9683.49,4.039 -binance-futures,BTCUSDT,1582329668170000,1582329668328482,3.078,9683.5,9683.49,2.049 -binance-futures,BTCUSDT,1582329668226000,1582329668348419,3.078,9683.5,9683.49,4.039 -binance-futures,BTCUSDT,1582329668617000,1582329668741234,2.678,9683.5,9683.49,4.039 -binance-futures,BTCUSDT,1582329668841000,1582329668962524,2.678,9683.5,9683.49,2.049 -binance-futures,BTCUSDT,1582329668864000,1582329668985141,2.678,9683.5,9683.49,4.039 -binance-futures,BTCUSDT,1582329668909000,1582329669029212,2.678,9683.5,9683.49,2.049 -binance-futures,BTCUSDT,1582329668960000,1582329669079884,2.678,9683.5,9683.49,4.039 -binance-futures,BTCUSDT,1582329668986000,1582329669107908,2.678,9683.5,9683.49,2.049 -binance-futures,BTCUSDT,1582329669244000,1582329669361818,2.678,9683.5,9683.49,4.039 -binance-futures,BTCUSDT,1582329669279000,1582329669425317,2.678,9683.5,9683.49,3.579 -binance-futures,BTCUSDT,1582329669305000,1582329669426135,2.678,9683.5,9683.49,3.56 -binance-futures,BTCUSDT,1582329669561000,1582329669682537,2.678,9683.5,9683.49,1.57 -binance-futures,BTCUSDT,1582329669583000,1582329669702771,2.678,9683.5,9683.49,2.021 -binance-futures,BTCUSDT,1582329669596000,1582329669717011,2.678,9683.5,9683.49,1.57 -binance-futures,BTCUSDT,1582329669664000,1582329669784410,2.678,9683.5,9683.49,3.56 -binance-futures,BTCUSDT,1582329669688000,1582329669806032,2.678,9683.5,9683.49,4.01 -binance-futures,BTCUSDT,1582329669705000,1582329669824184,2.678,9683.5,9683.49,4.029 -binance-futures,BTCUSDT,1582329669735000,1582329669853848,2.678,9683.5,9683.49,2.039 -binance-futures,BTCUSDT,1582329669762000,1582329669883320,2.678,9683.5,9683.49,4.029 -binance-futures,BTCUSDT,1582329669769000,1582329669889538,2.678,9683.5,9683.49,3.579 -binance-futures,BTCUSDT,1582329669818000,1582329669937338,2.678,9683.5,9683.49,3.56 -binance-futures,BTCUSDT,1582329670012000,1582329670131228,2.678,9683.5,9683.49,1.57 -binance-futures,BTCUSDT,1582329670071000,1582329670190595,2.678,9683.5,9683.49,3.56 -binance-futures,BTCUSDT,1582329670104000,1582329670228680,2.678,9683.5,9683.49,1.57 -binance-futures,BTCUSDT,1582329670399000,1582329670518825,2.678,9683.5,9683.49,3.56 -binance-futures,BTCUSDT,1582329670565000,1582329670685781,2.678,9683.5,9683.49,1.57 -binance-futures,BTCUSDT,1582329670742000,1582329670862177,2.678,9683.5,9683.49,1.589 -binance-futures,BTCUSDT,1582329670887000,1582329671006910,2.678,9683.5,9683.49,1.57 -binance-futures,BTCUSDT,1582329671071000,1582329671193199,5.583,9683.7,9683.49,1.57 -binance-futures,BTCUSDT,1582329671127000,1582329671248206,0.014,9683.99,9683.49,1.57 -binance-futures,BTCUSDT,1582329671129000,1582329671248723,4.411,9683.5,9683.49,1.57 -binance-futures,BTCUSDT,1582329671154000,1582329671275083,4.411,9683.5,9683.49,1 -binance-futures,BTCUSDT,1582329671193000,1582329671314222,4.411,9683.5,9683.49,1.57 -binance-futures,BTCUSDT,1582329671445000,1582329671566084,4.411,9683.5,9683.49,1.999 -binance-futures,BTCUSDT,1582329671453000,1582329671573932,4.411,9683.5,9683.49,1.57 -binance-futures,BTCUSDT,1582329671498000,1582329671617782,4.411,9683.5,9683.49,1 -binance-futures,BTCUSDT,1582329671560000,1582329671678850,0.014,9683.99,9683.49,1 -binance-futures,BTCUSDT,1582329671562000,1582329671681330,3.584,9683.7,9683.49,1 -binance-futures,BTCUSDT,1582329671574000,1582329671694063,3.584,9683.7,9683.53,0.031 -binance-futures,BTCUSDT,1582329671597000,1582329671719436,0.014,9683.99,9683.53,0.031 -binance-futures,BTCUSDT,1582329671614000,1582329671731814,0.014,9683.99,9683.54,0.57 -binance-futures,BTCUSDT,1582329671620000,1582329671742922,0.014,9683.99,9683.54,0.601 -binance-futures,BTCUSDT,1582329671622000,1582329671742947,0.014,9683.99,9683.55,0.031 -binance-futures,BTCUSDT,1582329671624000,1582329671745332,0.014,9683.99,9683.56,0.031 -binance-futures,BTCUSDT,1582329671644000,1582329671765868,0.014,9683.99,9683.56,2.181 -binance-futures,BTCUSDT,1582329671670000,1582329671789098,0.014,9683.99,9683.6,0.031 -binance-futures,BTCUSDT,1582329671691000,1582329671812719,0.014,9683.99,9683.6,2.881 -binance-futures,BTCUSDT,1582329671701000,1582329671824614,0.482,9684,9683.6,2.881 -binance-futures,BTCUSDT,1582329671703000,1582329671824653,0.482,9684,9683.61,0.57 -binance-futures,BTCUSDT,1582329671705000,1582329671825683,0.482,9684,9683.61,0.572 -binance-futures,BTCUSDT,1582329671715000,1582329671834667,0.482,9684,9683.64,0.031 -binance-futures,BTCUSDT,1582329671728000,1582329671846809,0.482,9684,9683.79,0.432 -binance-futures,BTCUSDT,1582329671746000,1582329671867004,0.482,9684,9683.79,2.632 -binance-futures,BTCUSDT,1582329671763000,1582329672109772,0.482,9684,9683.79,0.432 -binance-futures,BTCUSDT,1582329671985000,1582329672112535,0.482,9684,9683.97,0.442 -binance-futures,BTCUSDT,1582329672014000,1582329672134699,0.482,9684,9683.99,0.031 -binance-futures,BTCUSDT,1582329672093000,1582329672212255,0.682,9684,9683.99,0.031 -binance-futures,BTCUSDT,1582329672105000,1582329672221410,0.682,9684,9683.84,0.57 -binance-futures,BTCUSDT,1582329672131000,1582329672249514,0.682,9684,9683.14,0.1 -binance-futures,BTCUSDT,1582329672147000,1582329672267942,0.2,9683.98,9683.14,0.1 -binance-futures,BTCUSDT,1582329672161000,1582329672279883,0.281,9683.98,9683.14,0.1 -binance-futures,BTCUSDT,1582329672188000,1582329672308051,0.081,9683.98,9683.14,0.1 -binance-futures,BTCUSDT,1582329672190000,1582329672311161,0.2,9683.96,9683.14,0.1 -binance-futures,BTCUSDT,1582329672254000,1582329672384611,0.014,9683.95,9683.14,0.1 -binance-futures,BTCUSDT,1582329672288000,1582329672408763,0.2,9683.87,9683.14,0.1 -binance-futures,BTCUSDT,1582329672331000,1582329672481048,0.2,9683.87,9683.15,0.017 -binance-futures,BTCUSDT,1582329672333000,1582329672481077,0.2,9683.87,9683.15,0.028 -binance-futures,BTCUSDT,1582329672363000,1582329672483124,0.2,9683.87,9683.15,0.598 -binance-futures,BTCUSDT,1582329672381000,1582329672500609,0.2,9683.87,9683.15,3.398 -binance-futures,BTCUSDT,1582329672386000,1582329672506990,0.2,9683.87,9683.19,0.031 -binance-futures,BTCUSDT,1582329672406000,1582329672525056,0.2,9683.87,9683.19,3.181 -binance-futures,BTCUSDT,1582329672433000,1582329672550169,0.2,9683.87,9683.22,0.031 -binance-futures,BTCUSDT,1582329672439000,1582329672558084,0.2,9683.87,9683.23,0.031 -binance-futures,BTCUSDT,1582329672458000,1582329672575182,0.2,9683.87,9683.23,3.381 -binance-futures,BTCUSDT,1582329672478000,1582329672598102,0.2,9683.87,9683.27,0.031 -binance-futures,BTCUSDT,1582329672495000,1582329672614882,0.2,9683.87,9683.27,3.081 -binance-futures,BTCUSDT,1582329672509000,1582329672629109,0.2,9683.87,9683.28,0.002 -binance-futures,BTCUSDT,1582329672516000,1582329672634537,0.482,9684,9683.28,0.002 -binance-futures,BTCUSDT,1582329672525000,1582329672646066,0.482,9684,9683.28,3.552 -binance-futures,BTCUSDT,1582329672529000,1582329672650286,0.482,9684,9683.28,4.122 -binance-futures,BTCUSDT,1582329672532000,1582329672654349,0.482,9684,9683.3,0.031 -binance-futures,BTCUSDT,1582329672532000,1582329672654770,0.482,9684,9683.32,0.031 -binance-futures,BTCUSDT,1582329672543000,1582329672662375,0.2,9683.99,9683.32,0.031 -binance-futures,BTCUSDT,1582329672551000,1582329672669924,0.2,9683.99,9683.32,3.581 -binance-futures,BTCUSDT,1582329672579000,1582329672699237,0.482,9684,9683.32,3.581 -binance-futures,BTCUSDT,1582329672587000,1582329672708485,0.482,9684,9683.32,0.031 -binance-futures,BTCUSDT,1582329672595000,1582329672716531,0.482,9684,9683.33,0.57 -binance-futures,BTCUSDT,1582329672597000,1582329672718234,0.2,9683.99,9683.33,0.57 -binance-futures,BTCUSDT,1582329672599000,1582329672719224,0.2,9683.99,9683.36,0.031 -binance-futures,BTCUSDT,1582329672608000,1582329672726652,0.2,9683.93,9683.36,0.031 -binance-futures,BTCUSDT,1582329672628000,1582329672748107,0.2,9683.93,9683.37,0.57 -binance-futures,BTCUSDT,1582329672651000,1582329672773800,0.2,9683.93,9683.41,0.031 -binance-futures,BTCUSDT,1582329672675000,1582329672794605,0.482,9684,9683.41,0.031 -binance-futures,BTCUSDT,1582329672697000,1582329672822107,0.2,9683.99,9683.43,0.031 -binance-futures,BTCUSDT,1582329672740000,1582329672859775,0.482,9684,9683.43,0.031 -binance-futures,BTCUSDT,1582329672751000,1582329672872540,0.2,9683.98,9683.45,0.031 -binance-futures,BTCUSDT,1582329672888000,1582329673008742,0.2,9683.98,9683.42,0.031 -binance-futures,BTCUSDT,1582329672920000,1582329673040679,0.2,9683.98,9683.43,0.57 -binance-futures,BTCUSDT,1582329672942000,1582329673063307,0.2,9683.98,9683.45,0.031 -binance-futures,BTCUSDT,1582329672944000,1582329673066702,0.2,9683.98,9683.47,0.031 -binance-futures,BTCUSDT,1582329672971000,1582329673092054,0.482,9684,9683.47,0.031 -binance-futures,BTCUSDT,1582329672995000,1582329673117403,0.482,9684,9683.48,0.031 -binance-futures,BTCUSDT,1582329673022000,1582329673140436,0.482,9684,9683.5,0.031 -binance-futures,BTCUSDT,1582329673057000,1582329673180761,0.482,9684,9683.51,0.57 -binance-futures,BTCUSDT,1582329673083000,1582329673208335,0.482,9684,9683.55,0.031 -binance-futures,BTCUSDT,1582329673087000,1582329673209594,5.306,9683.93,9683.55,0.031 -binance-futures,BTCUSDT,1582329673164000,1582329673285143,5.306,9683.93,9683.55,0.601 -binance-futures,BTCUSDT,1582329673188000,1582329673309886,5.306,9683.93,9683.58,0.031 -binance-futures,BTCUSDT,1582329673193000,1582329673314412,5.306,9683.93,9683.59,0.031 -binance-futures,BTCUSDT,1582329673250000,1582329673371404,5.306,9683.93,9683.6,0.031 -binance-futures,BTCUSDT,1582329673290000,1582329673409308,5.306,9683.93,9683.61,0.57 -binance-futures,BTCUSDT,1582329673325000,1582329673446406,5.306,9683.93,9683.65,0.031 -binance-futures,BTCUSDT,1582329673500000,1582329673621536,5.306,9683.93,9682.86,0.43 -binance-futures,BTCUSDT,1582329673534000,1582329673653632,5.306,9683.93,9682.87,0.57 -binance-futures,BTCUSDT,1582329673544000,1582329673661847,0.2,9683.91,9682.87,0.57 -binance-futures,BTCUSDT,1582329673560000,1582329673680221,2.7,9683.91,9682.87,0.57 -binance-futures,BTCUSDT,1582329673583000,1582329673702200,2.5,9683.91,9682.87,0.57 -binance-futures,BTCUSDT,1582329673584000,1582329673705775,0.2,9683.86,9682.87,0.57 -binance-futures,BTCUSDT,1582329673605000,1582329673728209,4.3,9683.86,9682.87,0.57 -binance-futures,BTCUSDT,1582329673631000,1582329673753194,4.1,9683.86,9682.87,0.57 -binance-futures,BTCUSDT,1582329673635000,1582329673754713,0.2,9683.76,9682.87,0.57 -binance-futures,BTCUSDT,1582329673656000,1582329673773686,3.55,9683.76,9682.87,0.57 -binance-futures,BTCUSDT,1582329673678000,1582329673796742,3.35,9683.76,9682.87,0.57 -binance-futures,BTCUSDT,1582329673692000,1582329673811794,5.306,9683.93,9682.87,0.57 -binance-futures,BTCUSDT,1582329673692000,1582329673811806,0.2,9683.72,9682.87,0.57 -binance-futures,BTCUSDT,1582329673709000,1582329673826976,3.05,9683.72,9682.87,0.57 -binance-futures,BTCUSDT,1582329673730000,1582329673851681,2.85,9683.72,9682.87,0.57 -binance-futures,BTCUSDT,1582329673732000,1582329673853881,0.2,9683.68,9682.87,0.57 -binance-futures,BTCUSDT,1582329673739000,1582329673870342,2.85,9683.72,9682.87,0.57 -binance-futures,BTCUSDT,1582329673748000,1582329673880145,5.306,9683.93,9682.87,0.57 -binance-futures,BTCUSDT,1582329673758000,1582329673884263,2.75,9683.68,9682.87,0.57 -binance-futures,BTCUSDT,1582329673773000,1582329673893027,2.75,9683.68,9682.88,0.034 -binance-futures,BTCUSDT,1582329673777000,1582329673896035,2.75,9683.68,9682.88,0.036 -binance-futures,BTCUSDT,1582329673795000,1582329673918409,0.2,9683.67,9682.92,0.031 -binance-futures,BTCUSDT,1582329673803000,1582329673923387,2.75,9683.68,9682.92,0.031 -binance-futures,BTCUSDT,1582329673810000,1582329673927905,0.014,9683.71,9682.92,0.031 -binance-futures,BTCUSDT,1582329673812000,1582329673930780,2.4,9683.67,9682.92,0.031 -binance-futures,BTCUSDT,1582329673817000,1582329673936643,2.4,9683.67,9682.88,0.606 -binance-futures,BTCUSDT,1582329673822000,1582329673943683,0.2,9683.66,9682.88,0.606 -binance-futures,BTCUSDT,1582329673853000,1582329673971794,0.2,9683.66,9682.88,0.036 -binance-futures,BTCUSDT,1582329673858000,1582329673976805,0.2,9683.66,9682.93,0.57 -binance-futures,BTCUSDT,1582329673880000,1582329673998299,0.014,9683.71,9682.93,0.57 -binance-futures,BTCUSDT,1582329673882000,1582329674000973,0.014,9683.71,9682.95,0.031 -binance-futures,BTCUSDT,1582329673882000,1582329674001322,0.014,9683.71,9682.97,0.031 -binance-futures,BTCUSDT,1582329673941000,1582329674062231,0.014,9683.71,9682.98,0.031 -binance-futures,BTCUSDT,1582329674026000,1582329674145128,0.2,9683.89,9682.98,0.031 -binance-futures,BTCUSDT,1582329674049000,1582329674167403,0.2,9683.89,9683.01,0.031 -binance-futures,BTCUSDT,1582329674050000,1582329674170292,0.2,9683.89,9683.02,0.031 -binance-futures,BTCUSDT,1582329674102000,1582329674225892,5.951,9683.68,9683.02,0.031 -binance-futures,BTCUSDT,1582329674117000,1582329674237983,0.2,9683.89,9683.02,0.031 -binance-futures,BTCUSDT,1582329674127000,1582329674250190,0.014,9683.9,9683.02,0.031 -binance-futures,BTCUSDT,1582329674129000,1582329674253625,0.014,9683.9,9683.03,0.031 -binance-futures,BTCUSDT,1582329674129000,1582329674254111,0.2,9683.75,9683.04,0.031 -binance-futures,BTCUSDT,1582329674156000,1582329674277100,0.2,9683.75,9683.03,0.031 -binance-futures,BTCUSDT,1582329674163000,1582329674283464,0.014,9683.9,9683.03,0.031 -binance-futures,BTCUSDT,1582329674279000,1582329674399726,5.306,9683.93,9683.04,0.033 -binance-futures,BTCUSDT,1582329674283000,1582329674405178,0.014,9683.91,9683.04,0.033 -binance-futures,BTCUSDT,1582329674302000,1582329674423506,0.014,9683.91,9683.07,0.031 -binance-futures,BTCUSDT,1582329674304000,1582329674424247,0.014,9683.91,9683.08,0.031 -binance-futures,BTCUSDT,1582329674365000,1582329674486547,0.014,9683.91,9683.09,0.031 -binance-futures,BTCUSDT,1582329674527000,1582329674648376,0.014,9683.91,9683.1,0.03 -binance-futures,BTCUSDT,1582329674551000,1582329674673108,0.014,9683.91,9683.13,0.031 -binance-futures,BTCUSDT,1582329674553000,1582329674674290,0.014,9683.91,9683.14,0.031 -binance-futures,BTCUSDT,1582329674580000,1582329674699649,2.638,9683.75,9683.14,0.031 -binance-futures,BTCUSDT,1582329674602000,1582329674723098,2.638,9683.75,9683.16,0.031 -binance-futures,BTCUSDT,1582329674628000,1582329674747651,0.014,9683.91,9683.16,0.031 -binance-futures,BTCUSDT,1582329674634000,1582329674754577,0.014,9683.91,9683.16,0.601 -binance-futures,BTCUSDT,1582329674649000,1582329674768937,0.2,9683.74,9683.16,0.601 -binance-futures,BTCUSDT,1582329674658000,1582329674782931,0.2,9683.74,9683.2,0.031 -binance-futures,BTCUSDT,1582329674707000,1582329674826882,0.2,9683.74,9683.21,0.57 -binance-futures,BTCUSDT,1582329674731000,1582329674852051,0.2,9683.74,9683.25,0.031 -binance-futures,BTCUSDT,1582329674766000,1582329674887693,0.2,9683.74,9683.25,0.601 -binance-futures,BTCUSDT,1582329674790000,1582329674911042,0.2,9683.74,9683.28,0.031 -binance-futures,BTCUSDT,1582329674792000,1582329674911897,0.2,9683.74,9683.29,0.031 -binance-futures,BTCUSDT,1582329674824000,1582329674944726,5.306,9683.93,9683.29,0.031 -binance-futures,BTCUSDT,1582329674836000,1582329674953134,0.2,9683.92,9683.29,0.031 -binance-futures,BTCUSDT,1582329674847000,1582329674968165,0.2,9683.92,9683.3,0.031 -binance-futures,BTCUSDT,1582329674847000,1582329674968178,0.2,9683.92,9683.31,0.031 -binance-futures,BTCUSDT,1582329674876000,1582329674996412,5.306,9683.93,9683.31,0.031 -binance-futures,BTCUSDT,1582329674898000,1582329675018474,5.306,9683.93,9683.33,0.031 -binance-futures,BTCUSDT,1582329674990000,1582329675112412,5.306,9683.93,9683.36,0.031 -binance-futures,BTCUSDT,1582329675097000,1582329675221688,5.306,9683.93,9683.35,0.031 -binance-futures,BTCUSDT,1582329675101000,1582329675221717,5.306,9683.93,9683.3,0.031 -binance-futures,BTCUSDT,1582329675111000,1582329675230666,2.568,9683.74,9683.3,0.031 -binance-futures,BTCUSDT,1582329675122000,1582329675243174,5.306,9683.93,9683.3,0.031 -binance-futures,BTCUSDT,1582329675125000,1582329675246258,5.306,9683.93,9683.39,0.031 -binance-futures,BTCUSDT,1582329675145000,1582329675267077,5.306,9683.93,9683.37,0.031 -binance-futures,BTCUSDT,1582329675147000,1582329675268057,5.306,9683.93,9683.3,0.57 -binance-futures,BTCUSDT,1582329675159000,1582329675281559,5.306,9683.93,9683.14,0.451 -binance-futures,BTCUSDT,1582329675171000,1582329675292905,5.306,9683.93,9683.34,0.031 -binance-futures,BTCUSDT,1582329675174000,1582329675294869,0.2,9683.75,9683.34,0.031 -binance-futures,BTCUSDT,1582329675190000,1582329675316475,0.2,9683.75,9683.38,0.57 -binance-futures,BTCUSDT,1582329675219000,1582329675338804,0.2,9683.75,9683.42,0.031 -binance-futures,BTCUSDT,1582329675248000,1582329675367112,0.2,9683.92,9683.42,0.031 -binance-futures,BTCUSDT,1582329675256000,1582329675371514,0.2,9683.92,9683.43,0.57 -binance-futures,BTCUSDT,1582329675265000,1582329675390167,2.85,9683.92,9683.43,0.57 -binance-futures,BTCUSDT,1582329675270000,1582329675407276,2.85,9683.92,9683.45,0.031 -binance-futures,BTCUSDT,1582329675277000,1582329675407366,0.2,9683.92,9683.45,0.031 -binance-futures,BTCUSDT,1582329675291000,1582329675412864,5.306,9683.93,9683.45,0.031 -binance-futures,BTCUSDT,1582329675293000,1582329675415904,5.306,9683.93,9683.43,0.57 -binance-futures,BTCUSDT,1582329675295000,1582329675418156,0.2,9683.87,9683.43,0.57 -binance-futures,BTCUSDT,1582329675304000,1582329675423721,0.2,9683.87,9682.84,0.002 -binance-futures,BTCUSDT,1582329675317000,1582329675437982,2.6,9683.87,9683.49,0.031 -binance-futures,BTCUSDT,1582329675339000,1582329675460722,2.6,9683.87,9682.85,0.57 -binance-futures,BTCUSDT,1582329675341000,1582329675462660,0.2,9683.81,9682.85,0.57 -binance-futures,BTCUSDT,1582329675354000,1582329675474903,0.081,9683.48,9682.85,0.57 -binance-futures,BTCUSDT,1582329675380000,1582329675499746,0.2,9683.46,9682.85,0.57 -binance-futures,BTCUSDT,1582329675402000,1582329675523679,0.081,9683.48,9682.84,0.002 -binance-futures,BTCUSDT,1582329675420000,1582329675536545,0.2,9683.43,9682.84,0.002 -binance-futures,BTCUSDT,1582329675471000,1582329675590356,3.5,9683.81,9682.84,0.002 -binance-futures,BTCUSDT,1582329675477000,1582329675595400,0.2,9683.68,9682.84,0.002 -binance-futures,BTCUSDT,1582329675495000,1582329675615537,3.2,9683.68,9682.84,0.002 -binance-futures,BTCUSDT,1582329675522000,1582329675642201,0.2,9683.52,9682.84,0.002 -binance-futures,BTCUSDT,1582329675542000,1582329675660948,0.2,9683.52,9682.84,0.036 -binance-futures,BTCUSDT,1582329675542000,1582329675662673,2.9,9683.52,9682.84,0.036 -binance-futures,BTCUSDT,1582329675559000,1582329675678223,0.2,9683.52,9682.84,0.036 -binance-futures,BTCUSDT,1582329675564000,1582329675681543,0.014,9683.67,9682.84,0.036 -binance-futures,BTCUSDT,1582329675564000,1582329675682074,0.2,9683.34,9682.84,0.036 -binance-futures,BTCUSDT,1582329675581000,1582329675699538,0.014,9683.67,9682.84,0.036 -binance-futures,BTCUSDT,1582329675587000,1582329675708174,0.014,9683.67,9682.85,0.57 -binance-futures,BTCUSDT,1582329675611000,1582329675731784,0.014,9683.67,9682.89,0.031 -binance-futures,BTCUSDT,1582329675631000,1582329675750116,2.973,9683.52,9682.89,0.031 -binance-futures,BTCUSDT,1582329675650000,1582329675771151,0.014,9683.67,9682.89,0.031 -binance-futures,BTCUSDT,1582329675650000,1582329675774582,5.282,9683.34,9682.89,0.031 -binance-futures,BTCUSDT,1582329675652000,1582329675774618,5.282,9683.34,9682.84,0.036 -binance-futures,BTCUSDT,1582329675659000,1582329675783504,5.282,9683.34,9682.9,0.57 -binance-futures,BTCUSDT,1582329675674000,1582329675797060,5.282,9683.34,9682.92,0.031 -binance-futures,BTCUSDT,1582329675674000,1582329675797104,5.282,9683.34,9682.93,0.031 -binance-futures,BTCUSDT,1582329675679000,1582329675799546,0.2,9683.33,9682.93,0.031 -binance-futures,BTCUSDT,1582329675702000,1582329675823404,0.2,9683.33,9682.84,0.036 -binance-futures,BTCUSDT,1582329675709000,1582329675827942,0.2,9683.33,9682.93,0.57 -binance-futures,BTCUSDT,1582329675712000,1582329675830701,5.282,9683.34,9682.93,0.57 -binance-futures,BTCUSDT,1582329675722000,1582329675840960,0.2,9683.33,9682.93,0.57 -binance-futures,BTCUSDT,1582329675730000,1582329675850174,0.2,9683.33,9682.96,0.031 -binance-futures,BTCUSDT,1582329675735000,1582329675854863,0.2,9683.33,9682.97,0.031 -binance-futures,BTCUSDT,1582329675770000,1582329675888019,5.282,9683.34,9682.97,0.031 -binance-futures,BTCUSDT,1582329675790000,1582329675912249,5.282,9683.34,9682.98,0.031 -binance-futures,BTCUSDT,1582329675953000,1582329676072222,0.2,9683.19,9682.98,0.031 -binance-futures,BTCUSDT,1582329675974000,1582329676092688,0.2,9683.19,9682.7,0.005 -binance-futures,BTCUSDT,1582329676115000,1582329676234652,4.808,9683.33,9682.7,0.005 -binance-futures,BTCUSDT,1582329676120000,1582329676240463,5.511,9683.19,9682.7,0.005 -binance-futures,BTCUSDT,1582329676130000,1582329676258114,0.2,9683.09,9682.7,0.005 -binance-futures,BTCUSDT,1582329676138000,1582329676258524,0.2,9683.09,9682.71,0.57 -binance-futures,BTCUSDT,1582329676139000,1582329676258846,5.511,9683.19,9682.71,0.57 -binance-futures,BTCUSDT,1582329676148000,1582329676267800,5.511,9683.19,9683.09,1.97 -binance-futures,BTCUSDT,1582329676183000,1582329676304272,5.511,9683.19,9683.1,0.57 -binance-futures,BTCUSDT,1582329676220000,1582329676354967,5.511,9683.19,9683.18,1.97 -binance-futures,BTCUSDT,1582329676239000,1582329676358288,5.511,9683.19,9683.1,0.57 -binance-futures,BTCUSDT,1582329676245000,1582329676365190,0.2,9683.12,9683.1,0.57 -binance-futures,BTCUSDT,1582329676252000,1582329676370537,5.511,9683.19,9683.1,0.57 -binance-futures,BTCUSDT,1582329676263000,1582329676385463,5.511,9683.19,9683.09,1.97 -binance-futures,BTCUSDT,1582329676274000,1582329676392231,5.511,9683.19,9683.18,0.57 -binance-futures,BTCUSDT,1582329676313000,1582329676436493,5.511,9683.19,9683.18,2.54 -binance-futures,BTCUSDT,1582329676586000,1582329676706934,5.711,9683.19,9683.18,2.54 -binance-futures,BTCUSDT,1582329676591000,1582329676710511,5.511,9683.19,9683.18,2.54 -binance-futures,BTCUSDT,1582329676753000,1582329676872449,5.511,9683.19,9683.18,0.57 -binance-futures,BTCUSDT,1582329676790000,1582329676905181,5.511,9683.19,9682.7,0.005 -binance-futures,BTCUSDT,1582329676809000,1582329676931542,5.511,9683.19,9682.71,0.57 -binance-futures,BTCUSDT,1582329676830000,1582329676952451,5.511,9683.19,9682.73,0.031 -binance-futures,BTCUSDT,1582329676832000,1582329676955666,5.511,9683.19,9682.74,0.031 -binance-futures,BTCUSDT,1582329676834000,1582329676955712,5.511,9683.19,9682.75,0.031 -binance-futures,BTCUSDT,1582329676841000,1582329676960531,5.511,9683.19,9682.92,0.446 -binance-futures,BTCUSDT,1582329676853000,1582329676971820,5.511,9683.19,9682.75,0.031 -binance-futures,BTCUSDT,1582329676863000,1582329676982605,5.511,9683.19,9682.74,0.031 -binance-futures,BTCUSDT,1582329676863000,1582329676987722,5.511,9683.19,9682.7,0.005 -binance-futures,BTCUSDT,1582329676872000,1582329676995506,5.511,9683.19,9682.74,0.57 -binance-futures,BTCUSDT,1582329676880000,1582329676999714,0.2,9683.18,9682.74,0.57 -binance-futures,BTCUSDT,1582329676886000,1582329677005069,0.2,9683.18,9682.78,0.031 -binance-futures,BTCUSDT,1582329676910000,1582329677030077,5.511,9683.19,9682.78,0.031 -binance-futures,BTCUSDT,1582329676932000,1582329677051950,5.511,9683.19,9682.81,0.031 -binance-futures,BTCUSDT,1582329676955000,1582329677077290,5.511,9683.19,9682.79,0.601 -binance-futures,BTCUSDT,1582329676966000,1582329677091810,5.461,9683.19,9682.79,0.601 -binance-futures,BTCUSDT,1582329676980000,1582329677101904,5.461,9683.19,9682.83,0.031 -binance-futures,BTCUSDT,1582329677015000,1582329677133920,5.461,9683.19,9682.83,0.601 -binance-futures,BTCUSDT,1582329677036000,1582329677156719,5.461,9683.19,9682.87,0.031 -binance-futures,BTCUSDT,1582329677077000,1582329677196825,5.461,9683.19,9682.87,0.601 -binance-futures,BTCUSDT,1582329677088000,1582329677202962,5.461,9683.19,9682.89,0.031 -binance-futures,BTCUSDT,1582329677125000,1582329677245494,5.461,9683.19,9682.9,0.57 -binance-futures,BTCUSDT,1582329677134000,1582329677254948,5.461,9683.19,9682.96,0.464 -binance-futures,BTCUSDT,1582329677166000,1582329677285688,5.461,9683.19,9682.94,0.031 -binance-futures,BTCUSDT,1582329677183000,1582329677301430,5.461,9683.19,9682.94,0.5 -binance-futures,BTCUSDT,1582329677190000,1582329677308179,5.461,9683.19,9683,0.47 -binance-futures,BTCUSDT,1582329677229000,1582329677348850,5.461,9683.19,9682.98,0.031 -binance-futures,BTCUSDT,1582329677252000,1582329677396484,5.461,9683.19,9683.01,0.031 -binance-futures,BTCUSDT,1582329677300000,1582329677421617,5.461,9683.19,9683,0.031 -binance-futures,BTCUSDT,1582329677337000,1582329677456512,5.461,9683.19,9683.09,0.443 -binance-futures,BTCUSDT,1582329677351000,1582329677470701,5.461,9683.19,9683,0.031 -binance-futures,BTCUSDT,1582329677361000,1582329677481083,5.461,9683.19,9683.11,0.031 -binance-futures,BTCUSDT,1582329677388000,1582329677509843,0.2,9683.15,9683.11,0.031 -binance-futures,BTCUSDT,1582329677400000,1582329677519206,0.2,9683.15,9683.12,0.031 -binance-futures,BTCUSDT,1582329677404000,1582329677529283,2.75,9683.15,9683.13,0.031 -binance-futures,BTCUSDT,1582329677409000,1582329677533911,2.75,9683.15,9683.14,0.031 -binance-futures,BTCUSDT,1582329677428000,1582329677547672,2.75,9683.15,9683.13,0.062 -binance-futures,BTCUSDT,1582329677428000,1582329677550223,2.75,9683.15,9683.13,0.031 -binance-futures,BTCUSDT,1582329677483000,1582329677599805,2.75,9683.15,9682.7,0.005 -binance-futures,BTCUSDT,1582329677502000,1582329677627382,0.2,9683.09,9682.74,0.031 -binance-futures,BTCUSDT,1582329677535000,1582329677655839,5.45,9683.09,9682.74,0.031 -binance-futures,BTCUSDT,1582329677537000,1582329677663183,5.45,9683.09,9682.7,0.005 -binance-futures,BTCUSDT,1582329677559000,1582329677681778,5.45,9683.09,9682.77,0.031 -binance-futures,BTCUSDT,1582329677561000,1582329677683004,0.2,9683.05,9682.78,0.031 -binance-futures,BTCUSDT,1582329677581000,1582329677699295,6.3,9683.05,9682.78,0.031 -binance-futures,BTCUSDT,1582329677585000,1582329677706414,6.3,9683.05,9682.7,0.005 -binance-futures,BTCUSDT,1582329677601000,1582329677723766,0.2,9683,9682.7,0.005 -binance-futures,BTCUSDT,1582329677622000,1582329677745814,7.2,9683,9682.7,0.005 -binance-futures,BTCUSDT,1582329677651000,1582329677773333,0.2,9682.95,9682.7,0.005 -binance-futures,BTCUSDT,1582329677673000,1582329677795670,6.1,9682.95,9682.7,0.005 -binance-futures,BTCUSDT,1582329677703000,1582329677825443,0.2,9682.89,9682.7,0.005 -binance-futures,BTCUSDT,1582329677724000,1582329677843836,5.2,9682.89,9682.7,0.005 -binance-futures,BTCUSDT,1582329677747000,1582329677868605,0.2,9682.83,9682.7,0.005 -binance-futures,BTCUSDT,1582329677767000,1582329677886849,4.8,9682.83,9682.7,0.005 -binance-futures,BTCUSDT,1582329677786000,1582329677907630,4.8,9682.83,9682.71,0.57 -binance-futures,BTCUSDT,1582329677791000,1582329677913013,4.6,9682.83,9682.71,0.57 -binance-futures,BTCUSDT,1582329677807000,1582329677931083,0.2,9682.86,9682.71,0.57 -binance-futures,BTCUSDT,1582329677811000,1582329677932853,0.2,9682.86,9682.7,0.005 -binance-futures,BTCUSDT,1582329677814000,1582329677934860,0.2,9682.8,9682.7,0.005 -binance-futures,BTCUSDT,1582329677833000,1582329677966582,3.55,9682.8,9682.75,0.031 -binance-futures,BTCUSDT,1582329677835000,1582329677967897,3.35,9682.8,9682.75,0.031 -binance-futures,BTCUSDT,1582329677872000,1582329677994461,0.2,9682.78,9682.75,0.031 -binance-futures,BTCUSDT,1582329677875000,1582329677997086,3.35,9682.8,9682.75,0.031 -binance-futures,BTCUSDT,1582329677877000,1582329677998131,3.924,9683.05,9682.75,0.031 -binance-futures,BTCUSDT,1582329677895000,1582329678016426,3.924,9683.05,9682.7,0.005 -binance-futures,BTCUSDT,1582329677899000,1582329678022939,3.924,9683.05,9682.79,0.031 -binance-futures,BTCUSDT,1582329678009000,1582329678128819,3.924,9683.05,9682.7,0.005 -binance-futures,BTCUSDT,1582329678050000,1582329678178315,3.862,9683.05,9682.7,0.005 -binance-futures,BTCUSDT,1582329678091000,1582329678212052,0.2,9682.91,9682.7,0.005 -binance-futures,BTCUSDT,1582329678136000,1582329678263544,0.2,9682.91,9682.71,0.57 -binance-futures,BTCUSDT,1582329678138000,1582329678265143,3.862,9683.05,9682.71,0.57 -binance-futures,BTCUSDT,1582329678164000,1582329678304205,3.862,9683.05,9682.75,0.031 -binance-futures,BTCUSDT,1582329678205000,1582329678337851,3.862,9683.05,9682.75,0.494 -binance-futures,BTCUSDT,1582329678216000,1582329678367626,3.862,9683.05,9682.76,0.031 -binance-futures,BTCUSDT,1582329678238000,1582329678368609,3.862,9683.05,9682.77,0.031 -binance-futures,BTCUSDT,1582329678238000,1582329678368740,3.862,9683.05,9682.79,0.031 -binance-futures,BTCUSDT,1582329678273000,1582329678394809,3.862,9683.05,9682.8,0.427 -binance-futures,BTCUSDT,1582329678298000,1582329678419716,3.862,9683.05,9682.84,0.031 -binance-futures,BTCUSDT,1582329678306000,1582329678430063,0.2,9682.9,9682.84,0.031 -binance-futures,BTCUSDT,1582329678308000,1582329678430506,3.862,9683.05,9682.84,0.031 -binance-futures,BTCUSDT,1582329678371000,1582329678491519,0.2,9683.02,9682.84,0.031 -binance-futures,BTCUSDT,1582329678393000,1582329678513785,0.2,9683.02,9682.87,0.031 -binance-futures,BTCUSDT,1582329678415000,1582329678534624,3.862,9683.05,9682.87,0.031 -binance-futures,BTCUSDT,1582329678419000,1582329678537882,3.862,9683.05,9682.86,0.031 -binance-futures,BTCUSDT,1582329678424000,1582329678544749,3.862,9683.05,9682.79,0.031 -binance-futures,BTCUSDT,1582329678436000,1582329678556520,3.862,9683.05,9682.49,0.1 -binance-futures,BTCUSDT,1582329678441000,1582329678562133,3.862,9683.05,9682.9,0.031 -binance-futures,BTCUSDT,1582329678458000,1582329678582092,3.862,9683.05,9682.49,0.1 -binance-futures,BTCUSDT,1582329678506000,1582329678629200,0.2,9683.04,9682.49,0.1 -binance-futures,BTCUSDT,1582329678528000,1582329678649967,3.862,9683.05,9682.53,0.031 -binance-futures,BTCUSDT,1582329678528000,1582329678649984,5.5,9683.04,9682.53,0.031 -binance-futures,BTCUSDT,1582329678553000,1582329678674655,0.2,9683.02,9682.53,0.031 -binance-futures,BTCUSDT,1582329678572000,1582329678695595,6.55,9683.02,9682.53,0.031 -binance-futures,BTCUSDT,1582329678574000,1582329678696652,6.55,9683.02,9682.54,0.031 -binance-futures,BTCUSDT,1582329678578000,1582329678700457,0.74,9683.01,9682.54,0.031 -binance-futures,BTCUSDT,1582329678580000,1582329678700509,1.46,9683.01,9682.54,0.031 -binance-futures,BTCUSDT,1582329678584000,1582329678709015,2.14,9683.01,9682.54,0.031 -binance-futures,BTCUSDT,1582329678601000,1582329678722632,9.29,9683.01,9682.54,0.031 -binance-futures,BTCUSDT,1582329678603000,1582329678724771,0.2,9682.95,9682.54,0.031 -binance-futures,BTCUSDT,1582329678611000,1582329678736160,0.2,9682.95,9682.49,0.1 -binance-futures,BTCUSDT,1582329678621000,1582329678742080,8.1,9682.95,9682.49,0.1 -binance-futures,BTCUSDT,1582329678627000,1582329678749761,7.9,9682.95,9682.49,0.1 -binance-futures,BTCUSDT,1582329678631000,1582329678755850,7.9,9682.95,9682.57,0.031 -binance-futures,BTCUSDT,1582329678633000,1582329678756833,7.9,9682.95,9682.58,0.031 -binance-futures,BTCUSDT,1582329678637000,1582329678760558,0.74,9682.94,9682.58,0.031 -binance-futures,BTCUSDT,1582329678643000,1582329678764946,0.2,9682.7,9682.58,0.031 -binance-futures,BTCUSDT,1582329678658000,1582329678780038,0.2,9682.7,9682.49,0.1 -binance-futures,BTCUSDT,1582329678665000,1582329678787712,5.5,9682.7,9682.49,0.1 -binance-futures,BTCUSDT,1582329678691000,1582329678813673,5.3,9682.7,9682.49,0.1 -binance-futures,BTCUSDT,1582329678693000,1582329678816953,0.2,9682.56,9682.49,0.1 -binance-futures,BTCUSDT,1582329678714000,1582329678836900,4.25,9682.56,9682.49,0.1 -binance-futures,BTCUSDT,1582329678742000,1582329678864636,4.05,9682.56,9682.49,0.1 -binance-futures,BTCUSDT,1582329678744000,1582329678864664,0.2,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329678764000,1582329678884719,4.6,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329678785000,1582329678905432,5.34,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329678790000,1582329678912420,6.02,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329678803000,1582329678924229,5.82,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329678806000,1582329678926644,2.09,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329678808000,1582329678932085,2.81,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329678815000,1582329678933918,2.13,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329678820000,1582329678938632,1.39,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329678839000,1582329678962293,0.67,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329678841000,1582329678963344,0.2,9682.6,9682.53,0.031 -binance-futures,BTCUSDT,1582329678868000,1582329678989512,1.871,9682.93,9682.53,0.031 -binance-futures,BTCUSDT,1582329678892000,1582329679015072,1.871,9682.93,9682.54,0.031 -binance-futures,BTCUSDT,1582329678897000,1582329679018549,0.2,9682.88,9682.54,0.031 -binance-futures,BTCUSDT,1582329678919000,1582329679036245,6.3,9682.88,9682.54,0.031 -binance-futures,BTCUSDT,1582329678929000,1582329679048876,6.1,9682.88,9682.54,0.031 -binance-futures,BTCUSDT,1582329679143000,1582329679265712,1.871,9682.93,9682.54,0.031 -binance-futures,BTCUSDT,1582329679170000,1582329679294320,4.139,9682.88,9682.54,0.031 -binance-futures,BTCUSDT,1582329679488000,1582329679609281,6,9682.82,9682.54,0.031 -binance-futures,BTCUSDT,1582329679489000,1582329679609297,8,9682.82,9682.54,0.031 -binance-futures,BTCUSDT,1582329679503000,1582329679623078,2,9682.76,9682.54,0.031 -binance-futures,BTCUSDT,1582329679507000,1582329679628571,8,9682.76,9682.54,0.031 -binance-futures,BTCUSDT,1582329679520000,1582329679643268,0.2,9682.73,9682.54,0.031 -binance-futures,BTCUSDT,1582329679527000,1582329679647387,4,9682.7,9682.54,0.031 -binance-futures,BTCUSDT,1582329679529000,1582329679651624,4,9682.7,9682.52,0.031 -binance-futures,BTCUSDT,1582329679531000,1582329679652556,4,9682.7,9682.49,0.1 -binance-futures,BTCUSDT,1582329679540000,1582329679661608,6,9682.7,9682.49,0.1 -binance-futures,BTCUSDT,1582329679546000,1582329679668825,2,9682.7,9682.49,0.1 -binance-futures,BTCUSDT,1582329679548000,1582329679672045,2,9682.68,9682.49,0.1 -binance-futures,BTCUSDT,1582329679552000,1582329679673699,0.2,9682.62,9682.49,0.1 -binance-futures,BTCUSDT,1582329679575000,1582329679696142,6.7,9682.62,9682.49,0.1 -binance-futures,BTCUSDT,1582329679598000,1582329679719514,0.68,9682.61,9682.49,0.1 -binance-futures,BTCUSDT,1582329679604000,1582329679725953,0.2,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679625000,1582329679744595,4.75,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679634000,1582329679753428,4.55,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679637000,1582329679759788,2.81,9682.61,9682.49,0.1 -binance-futures,BTCUSDT,1582329679646000,1582329679768253,2.09,9682.61,9682.49,0.1 -binance-futures,BTCUSDT,1582329679650000,1582329679771362,0.2,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679654000,1582329679773854,0.94,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679668000,1582329679789850,4.74,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679672000,1582329679793917,5.46,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679675000,1582329679795521,6.14,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679682000,1582329679803734,2.34,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679699000,1582329679820250,1.6,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679737000,1582329679855498,0.92,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679740000,1582329679859153,0.2,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679758000,1582329679878177,0.87,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679764000,1582329679883455,0.67,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679785000,1582329679905701,0.87,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679791000,1582329679912075,0.2,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679811000,1582329679932230,0.94,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679813000,1582329679934212,1.62,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679815000,1582329679940659,1.42,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679819000,1582329679940671,2.09,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679823000,1582329679946268,2.81,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329679833000,1582329679953254,3.01,9682.5,9682.49,0.1 -binance-futures,BTCUSDT,1582329680557000,1582329680681782,3.01,9682.5,9682.49,0.079 -binance-futures,BTCUSDT,1582329681008000,1582329681129168,3.01,9682.5,9682.3,0.005 -binance-futures,BTCUSDT,1582329681050000,1582329681171134,2.81,9682.5,9682.3,0.005 -binance-futures,BTCUSDT,1582329681072000,1582329681194464,2.13,9682.5,9682.3,0.005 -binance-futures,BTCUSDT,1582329681076000,1582329681195317,0.2,9682.49,9682.3,0.005 -binance-futures,BTCUSDT,1582329681102000,1582329681223111,4.847,9682.62,9682.3,0.005 -binance-futures,BTCUSDT,1582329681116000,1582329681235200,0.2,9682.61,9682.3,0.005 -binance-futures,BTCUSDT,1582329681118000,1582329681242163,0.2,9682.61,9682.33,0.031 -binance-futures,BTCUSDT,1582329681120000,1582329681242194,0.2,9682.61,9682.34,0.031 -binance-futures,BTCUSDT,1582329681134000,1582329681252649,2.75,9682.61,9682.34,0.031 -binance-futures,BTCUSDT,1582329681139000,1582329681258672,2.55,9682.61,9682.34,0.031 -binance-futures,BTCUSDT,1582329681152000,1582329681271009,4.847,9682.62,9682.34,0.031 -binance-futures,BTCUSDT,1582329681154000,1582329681276055,0.67,9682.6,9682.34,0.031 -binance-futures,BTCUSDT,1582329681158000,1582329681278754,1.39,9682.6,9682.34,0.031 -binance-futures,BTCUSDT,1582329681159000,1582329681279655,1.59,9682.6,9682.34,0.031 -binance-futures,BTCUSDT,1582329681163000,1582329681286612,3.01,9682.6,9682.34,0.031 -binance-futures,BTCUSDT,1582329681169000,1582329681287922,3.01,9682.6,9682.35,1.97 -binance-futures,BTCUSDT,1582329681174000,1582329681294146,3.01,9682.6,9682.35,2.001 -binance-futures,BTCUSDT,1582329681179000,1582329681297896,2.29,9682.6,9682.35,2.001 -binance-futures,BTCUSDT,1582329681181000,1582329681300253,1.62,9682.6,9682.35,2.001 -binance-futures,BTCUSDT,1582329681190000,1582329681314933,1.62,9682.6,9682.38,0.031 -binance-futures,BTCUSDT,1582329681192000,1582329681315290,1.62,9682.6,9682.39,0.031 -binance-futures,BTCUSDT,1582329681196000,1582329681319927,0.72,9682.59,9682.39,0.031 -binance-futures,BTCUSDT,1582329681205000,1582329681328719,1.39,9682.59,9682.39,0.031 -binance-futures,BTCUSDT,1582329681223000,1582329681354043,0.2,9682.58,9682.39,0.031 -binance-futures,BTCUSDT,1582329681230000,1582329681358969,0.94,9682.58,9682.39,0.031 -binance-futures,BTCUSDT,1582329681239000,1582329681362735,0.74,9682.58,9682.39,0.031 -binance-futures,BTCUSDT,1582329681249000,1582329681368120,1.42,9682.58,9682.39,0.031 -binance-futures,BTCUSDT,1582329681252000,1582329681370607,3.87,9682.58,9682.39,0.031 -binance-futures,BTCUSDT,1582329681256000,1582329681375896,3.87,9682.58,9682.4,0.031 -binance-futures,BTCUSDT,1582329681257000,1582329681378537,0.72,9682.57,9682.4,0.031 -binance-futures,BTCUSDT,1582329681273000,1582329681393609,0.72,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329681275000,1582329681396255,0.2,9682.4,9682.3,0.005 -binance-futures,BTCUSDT,1582329681279000,1582329681399687,3.79,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329681291000,1582329681409318,2.65,9682.4,9682.3,0.005 -binance-futures,BTCUSDT,1582329681309000,1582329681453400,1.46,9682.38,9682.3,0.005 -binance-futures,BTCUSDT,1582329681323000,1582329681453889,2.13,9682.38,9682.3,0.005 -binance-futures,BTCUSDT,1582329681363000,1582329681487661,2.81,9682.38,9682.3,0.005 -binance-futures,BTCUSDT,1582329681365000,1582329681487913,0.68,9682.36,9682.3,0.005 -binance-futures,BTCUSDT,1582329681377000,1582329681495401,1.4,9682.36,9682.3,0.005 -binance-futures,BTCUSDT,1582329681385000,1582329681505162,3.75,9682.36,9682.3,0.005 -binance-futures,BTCUSDT,1582329681397000,1582329681517650,1.4,9682.36,9682.3,0.005 -binance-futures,BTCUSDT,1582329681407000,1582329681528824,0.74,9682.35,9682.3,0.005 -binance-futures,BTCUSDT,1582329681431000,1582329681550352,1.41,9682.35,9682.3,0.005 -binance-futures,BTCUSDT,1582329681436000,1582329681556406,2.13,9682.35,9682.3,0.005 -binance-futures,BTCUSDT,1582329681456000,1582329681576499,1.39,9682.35,9682.3,0.005 -binance-futures,BTCUSDT,1582329681463000,1582329681582735,0.2,9682.31,9682.3,0.005 -binance-futures,BTCUSDT,1582329681479000,1582329681599252,2.65,9682.31,9682.3,0.005 -binance-futures,BTCUSDT,1582329681501000,1582329681623073,0.2,9682.31,9682.3,0.005 -binance-futures,BTCUSDT,1582329681533000,1582329681653554,0.2,9682.6,9682.3,0.005 -binance-futures,BTCUSDT,1582329681534000,1582329681656451,0.2,9682.6,9682.34,0.031 -binance-futures,BTCUSDT,1582329681551000,1582329681672364,4.55,9682.6,9682.34,0.031 -binance-futures,BTCUSDT,1582329681568000,1582329681687435,4.35,9682.6,9682.34,0.031 -binance-futures,BTCUSDT,1582329681575000,1582329681695154,4.35,9682.6,9682.3,0.005 -binance-futures,BTCUSDT,1582329681577000,1582329681697293,4.55,9682.6,9682.3,0.005 -binance-futures,BTCUSDT,1582329681579000,1582329681699648,0.68,9682.59,9682.3,0.005 -binance-futures,BTCUSDT,1582329681579000,1582329681699670,1.35,9682.59,9682.3,0.005 -binance-futures,BTCUSDT,1582329681584000,1582329681704265,2.81,9682.59,9682.3,0.005 -binance-futures,BTCUSDT,1582329681589000,1582329681708828,2.81,9682.59,9682.38,0.031 -binance-futures,BTCUSDT,1582329681593000,1582329681719047,0.2,9682.57,9682.38,0.031 -binance-futures,BTCUSDT,1582329681610000,1582329681729321,0.2,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329681618000,1582329681737242,5.4,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329681623000,1582329681748323,5.391,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329681634000,1582329681754467,0.74,9682.55,9682.3,0.005 -binance-futures,BTCUSDT,1582329681641000,1582329681760039,2.13,9682.55,9682.3,0.005 -binance-futures,BTCUSDT,1582329681643000,1582329681761736,2.81,9682.55,9682.3,0.005 -binance-futures,BTCUSDT,1582329681645000,1582329681764265,2.287,9682.36,9682.3,0.005 -binance-futures,BTCUSDT,1582329681701000,1582329681819665,0.197,9682.35,9682.3,0.005 -binance-futures,BTCUSDT,1582329681727000,1582329681845779,0.917,9682.35,9682.3,0.005 -binance-futures,BTCUSDT,1582329681730000,1582329681848483,1.657,9682.35,9682.3,0.005 -binance-futures,BTCUSDT,1582329681744000,1582329681862820,2.337,9682.35,9682.3,0.005 -binance-futures,BTCUSDT,1582329681754000,1582329681873521,0.197,9682.31,9682.3,0.005 -binance-futures,BTCUSDT,1582329681846000,1582329681969816,4.283,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329681850000,1582329681969840,0.197,9682.55,9682.3,0.005 -binance-futures,BTCUSDT,1582329681852000,1582329681972822,0.197,9682.55,9682.31,1.97 -binance-futures,BTCUSDT,1582329681871000,1582329681994720,0.197,9682.55,9682.36,2 -binance-futures,BTCUSDT,1582329681893000,1582329682015728,4.283,9682.57,9682.4,2 -binance-futures,BTCUSDT,1582329681909000,1582329682029298,4.283,9682.57,9682.54,1.97 -binance-futures,BTCUSDT,1582329681938000,1582329682056453,0.74,9682.55,9682.54,1.97 -binance-futures,BTCUSDT,1582329681940000,1582329682059356,1.41,9682.55,9682.54,1.97 -binance-futures,BTCUSDT,1582329681940000,1582329682059364,2.09,9682.55,9682.54,1.97 -binance-futures,BTCUSDT,1582329681944000,1582329682063109,2.81,9682.55,9682.54,1.97 -binance-futures,BTCUSDT,1582329681956000,1582329682074753,2.09,9682.55,9682.54,1.97 -binance-futures,BTCUSDT,1582329681965000,1582329682085646,1.41,9682.55,9682.54,1.97 -binance-futures,BTCUSDT,1582329681969000,1582329682089523,0.67,9682.55,9682.54,1.97 -binance-futures,BTCUSDT,1582329681972000,1582329682091926,1.39,9682.55,9682.54,1.97 -binance-futures,BTCUSDT,1582329681981000,1582329682102474,0.72,9682.55,9682.54,1.97 -binance-futures,BTCUSDT,1582329681983000,1582329682103144,2.14,9682.55,9682.54,1.97 -binance-futures,BTCUSDT,1582329681987000,1582329682108713,3.007,9682.55,9682.54,1.97 -binance-futures,BTCUSDT,1582329682215000,1582329682335050,3.007,9682.55,9682.3,0.005 -binance-futures,BTCUSDT,1582329682236000,1582329682359261,3.007,9682.55,9682.32,0.031 -binance-futures,BTCUSDT,1582329682238000,1582329682360119,2.81,9682.55,9682.34,0.031 -binance-futures,BTCUSDT,1582329682240000,1582329682361623,0.197,9682.52,9682.34,0.031 -binance-futures,BTCUSDT,1582329682288000,1582329682408932,0.197,9682.52,9682.35,0.031 -binance-futures,BTCUSDT,1582329682331000,1582329682452144,4.283,9682.57,9682.35,0.031 -binance-futures,BTCUSDT,1582329682365000,1582329682485709,4.283,9682.57,9682.54,1.97 -binance-futures,BTCUSDT,1582329682375000,1582329682498174,4.281,9682.57,9682.54,1.97 -binance-futures,BTCUSDT,1582329682387000,1582329682526616,4.281,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329682435000,1582329682555439,4.281,9682.57,9682.56,2.001 -binance-futures,BTCUSDT,1582329682969000,1582329683085530,4.281,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329682984000,1582329683101121,5.021,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329682989000,1582329683108728,5.691,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329682991000,1582329683110740,5.691,9682.57,9682.56,2.001 -binance-futures,BTCUSDT,1582329682993000,1582329683114252,6.411,9682.57,9682.56,2.001 -binance-futures,BTCUSDT,1582329682995000,1582329683114269,7.091,9682.57,9682.56,2.001 -binance-futures,BTCUSDT,1582329683009000,1582329683130663,7.091,9682.57,9682.56,1.97 -binance-futures,BTCUSDT,1582329683505000,1582329683625441,7.091,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329683526000,1582329683648576,7.288,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329683531000,1582329683651417,7.091,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329683533000,1582329683653970,0.197,9682.47,9682.3,0.005 -binance-futures,BTCUSDT,1582329683544000,1582329683663381,7.091,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329683551000,1582329683671358,6.351,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329683554000,1582329683674614,5.631,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329683558000,1582329683677326,0.197,9682.55,9682.3,0.005 -binance-futures,BTCUSDT,1582329683558000,1582329683677342,5.631,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329683563000,1582329683681609,4.281,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329683564000,1582329683683695,0.74,9682.55,9682.3,0.005 -binance-futures,BTCUSDT,1582329683575000,1582329683695148,0.74,9682.55,9682.33,0.031 -binance-futures,BTCUSDT,1582329683575000,1582329683695441,0.74,9682.55,9682.34,0.031 -binance-futures,BTCUSDT,1582329683576000,1582329683697254,3.39,9682.55,9682.34,0.031 -binance-futures,BTCUSDT,1582329683581000,1582329683700297,4.11,9682.55,9682.34,0.031 -binance-futures,BTCUSDT,1582329683594000,1582329683713868,0.72,9682.53,9682.34,0.031 -binance-futures,BTCUSDT,1582329683611000,1582329683733482,3.17,9682.53,9682.34,0.031 -binance-futures,BTCUSDT,1582329683616000,1582329683738924,3.84,9682.53,9682.34,0.031 -binance-futures,BTCUSDT,1582329683618000,1582329683741237,4.58,9682.53,9682.34,0.031 -binance-futures,BTCUSDT,1582329683625000,1582329683743774,3.86,9682.53,9682.34,0.031 -binance-futures,BTCUSDT,1582329683635000,1582329683756090,3.86,9682.53,9682.36,0.031 -binance-futures,BTCUSDT,1582329683637000,1582329683756174,0.197,9682.52,9682.36,0.031 -binance-futures,BTCUSDT,1582329683645000,1582329683764218,0.917,9682.52,9682.36,0.031 -binance-futures,BTCUSDT,1582329683654000,1582329683774186,3.167,9682.52,9682.36,0.031 -binance-futures,BTCUSDT,1582329683656000,1582329683775239,2.97,9682.52,9682.36,0.031 -binance-futures,BTCUSDT,1582329683661000,1582329683782013,2.97,9682.52,9682.3,0.005 -binance-futures,BTCUSDT,1582329683667000,1582329683787945,3.71,9682.52,9682.3,0.005 -binance-futures,BTCUSDT,1582329683680000,1582329683799267,3.66,9682.52,9682.3,0.005 -binance-futures,BTCUSDT,1582329683716000,1582329683836282,2.92,9682.52,9682.3,0.005 -binance-futures,BTCUSDT,1582329683718000,1582329683838150,0.197,9682.51,9682.3,0.005 -binance-futures,BTCUSDT,1582329683722000,1582329683841424,0.917,9682.51,9682.3,0.005 -binance-futures,BTCUSDT,1582329683735000,1582329683854314,5.017,9682.51,9682.3,0.005 -binance-futures,BTCUSDT,1582329683745000,1582329683865273,0.197,9682.49,9682.3,0.005 -binance-futures,BTCUSDT,1582329683762000,1582329683883398,5.097,9682.49,9682.3,0.005 -binance-futures,BTCUSDT,1582329683772000,1582329683890330,5.097,9682.49,9682.31,1.97 -binance-futures,BTCUSDT,1582329683776000,1582329683896542,0.68,9682.47,9682.31,1.97 -binance-futures,BTCUSDT,1582329683776000,1582329683896637,1.42,9682.47,9682.31,1.97 -binance-futures,BTCUSDT,1582329683778000,1582329683899161,2.14,9682.47,9682.31,1.97 -binance-futures,BTCUSDT,1582329683785000,1582329683904321,0.197,9682.44,9682.31,1.97 -binance-futures,BTCUSDT,1582329683793000,1582329683913475,4,9682.43,9682.31,1.97 -binance-futures,BTCUSDT,1582329683795000,1582329683915191,6,9682.43,9682.31,1.97 -binance-futures,BTCUSDT,1582329683795000,1582329683916053,10,9682.43,9682.31,1.97 -binance-futures,BTCUSDT,1582329683809000,1582329683930266,10,9682.43,9682.3,0.005 -binance-futures,BTCUSDT,1582329683811000,1582329683933670,8,9682.43,9682.3,0.005 -binance-futures,BTCUSDT,1582329683811000,1582329683933741,2,9682.43,9682.3,0.005 -binance-futures,BTCUSDT,1582329683819000,1582329683940854,0.197,9682.39,9682.3,0.005 -binance-futures,BTCUSDT,1582329683855000,1582329683974309,0.68,9682.42,9682.3,0.005 -binance-futures,BTCUSDT,1582329683885000,1582329684005920,1.35,9682.42,9682.3,0.005 -binance-futures,BTCUSDT,1582329683886000,1582329684005935,0.67,9682.42,9682.3,0.005 -binance-futures,BTCUSDT,1582329683920000,1582329684038062,0.74,9682.45,9682.3,0.005 -binance-futures,BTCUSDT,1582329683932000,1582329684054644,0.74,9682.45,9682.31,0.451 -binance-futures,BTCUSDT,1582329683934000,1582329684054936,0.74,9682.42,9682.31,0.451 -binance-futures,BTCUSDT,1582329683947000,1582329684068590,0.74,9682.42,9682.3,0.005 -binance-futures,BTCUSDT,1582329683956000,1582329684078092,0.74,9682.42,9682.35,0.031 -binance-futures,BTCUSDT,1582329683993000,1582329684114066,4.281,9682.57,9682.35,0.031 -binance-futures,BTCUSDT,1582329684017000,1582329684138891,4.281,9682.57,9682.37,0.031 -binance-futures,BTCUSDT,1582329684020000,1582329684141491,4.281,9682.57,9682.44,1.97 -binance-futures,BTCUSDT,1582329684045000,1582329684168322,0.72,9682.55,9682.44,1.97 -binance-futures,BTCUSDT,1582329684057000,1582329684175652,1.46,9682.55,9682.44,1.97 -binance-futures,BTCUSDT,1582329684058000,1582329684177301,2.13,9682.55,9682.44,1.97 -binance-futures,BTCUSDT,1582329684062000,1582329684182954,2.81,9682.55,9682.44,1.97 -binance-futures,BTCUSDT,1582329684067000,1582329684189326,2.81,9682.55,9682.46,0.031 -binance-futures,BTCUSDT,1582329684069000,1582329684190171,2.81,9682.55,9682.48,0.031 -binance-futures,BTCUSDT,1582329684075000,1582329684194724,2.07,9682.55,9682.48,0.031 -binance-futures,BTCUSDT,1582329684086000,1582329684207021,1.39,9682.55,9682.48,0.031 -binance-futures,BTCUSDT,1582329684088000,1582329684208792,0.67,9682.55,9682.48,0.031 -binance-futures,BTCUSDT,1582329684095000,1582329684216020,0.197,9682.51,9682.48,0.031 -binance-futures,BTCUSDT,1582329684113000,1582329684254600,0.197,9682.51,9682.49,0.031 -binance-futures,BTCUSDT,1582329684152000,1582329684274190,1.39,9682.53,9682.49,0.031 -binance-futures,BTCUSDT,1582329684161000,1582329684283156,0.67,9682.53,9682.49,0.031 -binance-futures,BTCUSDT,1582329684197000,1582329684321301,4.281,9682.57,9682.49,0.031 -binance-futures,BTCUSDT,1582329684200000,1582329684321326,4.281,9682.57,9682.52,1.97 -binance-futures,BTCUSDT,1582329684223000,1582329684342404,4.281,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329684376000,1582329684496073,4.478,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329684383000,1582329684503382,4.281,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329684449000,1582329684566400,4.281,9682.57,9682.56,2.001 -binance-futures,BTCUSDT,1582329684580000,1582329684700431,4.281,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329684959000,1582329685079278,4.478,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329685022000,1582329685150473,3.478,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329685056000,1582329685179638,3.281,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329685062000,1582329685185979,3.478,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329685150000,1582329685272890,3.281,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329685196000,1582329685321778,3.281,9682.57,9682.56,2.001 -binance-futures,BTCUSDT,1582329685262000,1582329685403511,3.281,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329685371000,1582329685493086,3.281,9682.57,9682.56,2.001 -binance-futures,BTCUSDT,1582329685530000,1582329685651087,3.281,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329685602000,1582329685725109,4.021,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329685612000,1582329685732886,4.741,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329685618000,1582329685740096,6.091,9682.57,9682.56,0.031 -binance-futures,BTCUSDT,1582329685630000,1582329685752886,6.091,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329685644000,1582329685766832,6.288,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329685657000,1582329685777019,6.091,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329685659000,1582329685779293,0.197,9682.34,9682.3,0.005 -binance-futures,BTCUSDT,1582329685717000,1582329685839128,3.281,9682.57,9682.3,0.005 -binance-futures,BTCUSDT,1582329685736000,1582329685857213,0.197,9682.36,9682.3,0.005 -binance-futures,BTCUSDT,1582329685742000,1582329685863125,0.197,9682.36,9682.32,0.031 -binance-futures,BTCUSDT,1582329685746000,1582329685868353,0.197,9682.36,9682.34,0.031 -binance-futures,BTCUSDT,1582329685755000,1582329685877064,3.281,9682.57,9682.34,0.031 -binance-futures,BTCUSDT,1582329685768000,1582329685905147,1.933,9682.3,9682.25,0.683 -binance-futures,BTCUSDT,1582329685769000,1582329685905707,1.317,9682.25,9682.08,0.1 -binance-futures,BTCUSDT,1582329685772000,1582329685905963,3.317,9682.25,9682.08,0.1 -binance-futures,BTCUSDT,1582329685776000,1582329685906555,5.317,9682.25,9682.2,0.435 -binance-futures,BTCUSDT,1582329685781000,1582329685910656,5.317,9682.25,9682.08,0.1 -binance-futures,BTCUSDT,1582329685798000,1582329685920683,3.317,9682.25,9682.08,0.1 -binance-futures,BTCUSDT,1582329685798000,1582329685920707,13.267,9682.25,9682.08,0.1 -binance-futures,BTCUSDT,1582329685801000,1582329685927022,4.313,9681.99,9681.8,5.782 -binance-futures,BTCUSDT,1582329685806000,1582329685930830,8.726,9681.99,9681.8,5.782 -binance-futures,BTCUSDT,1582329685814000,1582329685936837,0.1,9681.96,9681.8,5.782 -binance-futures,BTCUSDT,1582329685826000,1582329685954826,0.1,9681.96,9681.8,0.951 -binance-futures,BTCUSDT,1582329685830000,1582329685957885,5.187,9681.8,9681.27,3.802 -binance-futures,BTCUSDT,1582329685844000,1582329685972217,8.969,9681.8,9681.27,3.802 -binance-futures,BTCUSDT,1582329685853000,1582329685975306,10.969,9681.8,9681.27,3.802 -binance-futures,BTCUSDT,1582329685856000,1582329685992018,23.565,9681.8,9681.27,2.641 -binance-futures,BTCUSDT,1582329685857000,1582329685993007,1.161,9681.27,9680,1.071 -binance-futures,BTCUSDT,1582329685862000,1582329685994486,7.655,9681.27,9680,1.071 -binance-futures,BTCUSDT,1582329685866000,1582329685997635,11.457,9681.27,9680,1.071 -binance-futures,BTCUSDT,1582329685868000,1582329685997647,15.259,9681.27,9680,1.071 -binance-futures,BTCUSDT,1582329685870000,1582329685997812,17.259,9681.27,9680,1.071 -binance-futures,BTCUSDT,1582329685884000,1582329686009332,0.1,9681,9680,1.071 -binance-futures,BTCUSDT,1582329685907000,1582329686047189,5.18,9681.27,9679.87,0.12 -binance-futures,BTCUSDT,1582329685911000,1582329686048525,13.5,9681,9679.87,0.12 -binance-futures,BTCUSDT,1582329685913000,1582329686053985,0.031,9680.96,9679.87,0.12 -binance-futures,BTCUSDT,1582329685917000,1582329686054487,3.187,9679.93,9679.87,0.12 -binance-futures,BTCUSDT,1582329685930000,1582329686058822,5.73,9679.93,9679.87,0.12 -binance-futures,BTCUSDT,1582329685939000,1582329686061443,2.543,9679.93,9679.87,0.12 -binance-futures,BTCUSDT,1582329685943000,1582329686065223,0.197,9680.91,9679.87,0.12 -binance-futures,BTCUSDT,1582329685952000,1582329686077008,2,9679.88,9679.87,0.12 -binance-futures,BTCUSDT,1582329685956000,1582329686084811,3.88,9679.87,9679.27,2.037 -binance-futures,BTCUSDT,1582329685982000,1582329686104738,2,9679.83,9679.27,2.037 -binance-futures,BTCUSDT,1582329685996000,1582329686122301,0.12,9679.68,9679.27,2.037 -binance-futures,BTCUSDT,1582329686020000,1582329686143473,2,9679.62,9679.27,2.037 -binance-futures,BTCUSDT,1582329686020000,1582329686144270,4,9679.62,9679.27,2.037 -binance-futures,BTCUSDT,1582329686024000,1582329686151774,10,9679.62,9679.27,2.037 -binance-futures,BTCUSDT,1582329686043000,1582329686168748,4,9679.56,9679.27,2.037 -binance-futures,BTCUSDT,1582329686045000,1582329686170613,10,9679.56,9679.27,2.037 -binance-futures,BTCUSDT,1582329686065000,1582329686190854,13.95,9679.56,9679.27,2.037 -binance-futures,BTCUSDT,1582329686070000,1582329686195644,2,9679.5,9679.27,2.037 -binance-futures,BTCUSDT,1582329686074000,1582329686199882,1.995,9679.5,9679.27,2.037 -binance-futures,BTCUSDT,1582329686077000,1582329686201523,0.12,9679.46,9679.27,2.037 -binance-futures,BTCUSDT,1582329686102000,1582329686228714,0.031,9679.42,9679.27,2.037 -binance-futures,BTCUSDT,1582329686115000,1582329686237719,2,9679.4,9679.27,2.037 -binance-futures,BTCUSDT,1582329686139000,1582329686270743,0.1,9679.28,9679.27,2.037 -binance-futures,BTCUSDT,1582329686179000,1582329686303190,0.028,9679.28,9679.27,2.037 -binance-futures,BTCUSDT,1582329686239000,1582329686364169,0.478,9680.38,9679.27,2.037 -binance-futures,BTCUSDT,1582329686242000,1582329686365506,0.12,9680.28,9679.27,2.037 -binance-futures,BTCUSDT,1582329686263000,1582329686387550,8.17,9680.28,9679.27,2.037 -binance-futures,BTCUSDT,1582329686275000,1582329686399848,8.05,9680.28,9679.27,2.037 -binance-futures,BTCUSDT,1582329686277000,1582329686400623,0.12,9680.27,9679.27,2.037 -binance-futures,BTCUSDT,1582329686287000,1582329686409098,8.05,9680.28,9679.27,2.037 -binance-futures,BTCUSDT,1582329686290000,1582329686414649,0.67,9680.27,9679.27,2.037 -binance-futures,BTCUSDT,1582329686293000,1582329686422327,1.35,9680.27,9679.27,2.037 -binance-futures,BTCUSDT,1582329686293000,1582329686422364,0.12,9680.14,9679.27,2.037 -binance-futures,BTCUSDT,1582329686317000,1582329686441679,9.57,9680.14,9679.27,2.037 -binance-futures,BTCUSDT,1582329686323000,1582329686448022,0.67,9680.12,9679.27,2.037 -binance-futures,BTCUSDT,1582329686333000,1582329686454582,1.41,9680.12,9679.27,2.037 -binance-futures,BTCUSDT,1582329686335000,1582329686458290,2.09,9680.12,9679.27,2.037 -binance-futures,BTCUSDT,1582329686345000,1582329686472049,12.54,9680.12,9679.27,2.037 -binance-futures,BTCUSDT,1582329686347000,1582329686472478,13.26,9680.12,9679.27,2.037 -binance-futures,BTCUSDT,1582329686349000,1582329686476094,0.12,9679.98,9679.27,2.037 -binance-futures,BTCUSDT,1582329686371000,1582329686495508,9.87,9679.98,9679.27,2.037 -binance-futures,BTCUSDT,1582329686379000,1582329686503446,0.478,9679.97,9679.27,2.037 -binance-futures,BTCUSDT,1582329686394000,1582329686516055,9.87,9679.98,9679.27,2.037 -binance-futures,BTCUSDT,1582329686397000,1582329686521793,9.75,9679.98,9679.27,2.037 -binance-futures,BTCUSDT,1582329686401000,1582329686525198,0.12,9679.86,9679.27,2.037 -binance-futures,BTCUSDT,1582329686424000,1582329686547062,5.92,9679.86,9679.27,2.037 -binance-futures,BTCUSDT,1582329686442000,1582329686564137,0.12,9679.86,9679.27,2.037 -binance-futures,BTCUSDT,1582329686451000,1582329686573837,0.031,9679.94,9679.27,2.037 -binance-futures,BTCUSDT,1582329686455000,1582329686582887,0.12,9679.8,9679.27,2.037 -binance-futures,BTCUSDT,1582329686480000,1582329686603245,7.47,9679.8,9679.27,2.037 -binance-futures,BTCUSDT,1582329686508000,1582329686630916,7.35,9679.8,9679.27,2.037 -binance-futures,BTCUSDT,1582329686510000,1582329686632453,0.12,9679.74,9679.27,2.037 -binance-futures,BTCUSDT,1582329686532000,1582329686653637,7.82,9679.74,9679.27,2.037 -binance-futures,BTCUSDT,1582329686542000,1582329686664550,0.68,9679.72,9679.27,2.037 -binance-futures,BTCUSDT,1582329686554000,1582329686680736,1.4,9679.72,9679.27,2.037 -binance-futures,BTCUSDT,1582329686554000,1582329686680856,2.07,9679.72,9679.27,2.037 -binance-futures,BTCUSDT,1582329686561000,1582329686686139,0.12,9679.65,9679.27,2.037 -binance-futures,BTCUSDT,1582329686586000,1582329686714699,7.17,9679.65,9679.27,2.037 -binance-futures,BTCUSDT,1582329686618000,1582329686741292,7.05,9679.65,9679.27,2.037 -binance-futures,BTCUSDT,1582329686619000,1582329686743745,0.12,9679.56,9679.27,2.037 -binance-futures,BTCUSDT,1582329686643000,1582329686767762,6.67,9679.56,9679.27,2.037 -binance-futures,BTCUSDT,1582329686653000,1582329686773953,6.55,9679.56,9679.27,2.037 -binance-futures,BTCUSDT,1582329686674000,1582329686798196,0.12,9679.54,9679.27,2.037 -binance-futures,BTCUSDT,1582329686697000,1582329686818831,5.02,9679.54,9679.27,2.037 -binance-futures,BTCUSDT,1582329686704000,1582329686826480,0.031,9679.51,9679.27,2.037 -binance-futures,BTCUSDT,1582329686704000,1582329686828531,0.031,9679.5,9679.27,2.037 -binance-futures,BTCUSDT,1582329686723000,1582329686845144,0.12,9679.49,9679.27,2.037 -binance-futures,BTCUSDT,1582329686743000,1582329686867135,6.07,9679.49,9679.27,2.037 -binance-futures,BTCUSDT,1582329686752000,1582329686873901,0.031,9679.45,9679.27,2.037 -binance-futures,BTCUSDT,1582329686759000,1582329686882176,0.028,9679.28,9679.27,2.037 -binance-futures,BTCUSDT,1582329686781000,1582329686900012,6.478,9679.28,9679.27,2.037 -binance-futures,BTCUSDT,1582329686799000,1582329686920620,6.598,9679.28,9679.27,2.037 -binance-futures,BTCUSDT,1582329686967000,1582329687087315,6.57,9679.28,9679.27,2.037 -binance-futures,BTCUSDT,1582329686988000,1582329687107817,0.12,9679.28,9679.27,2.037 -binance-futures,BTCUSDT,1582329687030000,1582329687152635,0.478,9680.66,9679.27,2.037 -binance-futures,BTCUSDT,1582329687047000,1582329687168582,0.12,9681.12,9679.27,2.037 -binance-futures,BTCUSDT,1582329687049000,1582329687172676,2,9681.66,9679.27,2.037 -binance-futures,BTCUSDT,1582329687051000,1582329687173963,15.55,9680.66,9679.27,2.037 -binance-futures,BTCUSDT,1582329687056000,1582329687177683,0.031,9680.62,9679.27,2.037 -binance-futures,BTCUSDT,1582329687060000,1582329687182834,0.12,9680.54,9679.27,2.037 -binance-futures,BTCUSDT,1582329687070000,1582329687192018,0.031,9680.62,9679.27,2.037 -binance-futures,BTCUSDT,1582329687075000,1582329687197291,17.2,9680.62,9679.27,2.037 -binance-futures,BTCUSDT,1582329687081000,1582329687204800,0.12,9680.53,9679.27,1.429 -binance-futures,BTCUSDT,1582329687087000,1582329687210186,0.12,9680.53,9679.27,0.709 -binance-futures,BTCUSDT,1582329687091000,1582329687216043,0.12,9680.53,9679.27,0.039 -binance-futures,BTCUSDT,1582329687098000,1582329687222456,0.701,9679.05,9678.59,0.047 -binance-futures,BTCUSDT,1582329687124000,1582329687246656,9.451,9679.05,9678.59,0.047 -binance-futures,BTCUSDT,1582329687126000,1582329687251990,0.12,9679.03,9678.59,0.047 -binance-futures,BTCUSDT,1582329687147000,1582329687270428,2,9678.99,9678.59,0.047 -binance-futures,BTCUSDT,1582329687168000,1582329687289362,2,9678.95,9678.59,0.047 -binance-futures,BTCUSDT,1582329687176000,1582329687303266,0.12,9678.86,9678.59,0.047 -binance-futures,BTCUSDT,1582329687199000,1582329687319491,9.97,9678.86,9678.59,0.047 -binance-futures,BTCUSDT,1582329687222000,1582329687636878,0.031,9678.82,9678.59,0.047 -binance-futures,BTCUSDT,1582329687241000,1582329687637012,2.031,9678.82,9678.59,0.047 -binance-futures,BTCUSDT,1582329687245000,1582329687637030,2,9678.8,9678.59,0.047 -binance-futures,BTCUSDT,1582329687272000,1582329687637193,0.031,9678.79,9678.59,0.047 -binance-futures,BTCUSDT,1582329687272000,1582329687637199,2,9678.78,9678.59,0.047 -binance-futures,BTCUSDT,1582329687293000,1582329687637416,8.2,9678.78,9678.59,0.047 -binance-futures,BTCUSDT,1582329687295000,1582329687637455,8.2,9678.78,9678.6,1.87 -binance-futures,BTCUSDT,1582329687310000,1582329687637657,2,9678.78,9678.6,1.87 -binance-futures,BTCUSDT,1582329687342000,1582329687638010,0.031,9678.74,9678.6,1.87 -binance-futures,BTCUSDT,1582329687364000,1582329687638245,4.281,9678.74,9678.6,1.87 -binance-futures,BTCUSDT,1582329687399000,1582329687638694,0.031,9678.74,9678.6,1.87 -binance-futures,BTCUSDT,1582329687427000,1582329687639113,0.031,9678.71,9678.6,1.87 -binance-futures,BTCUSDT,1582329687445000,1582329687639347,3.181,9678.71,9678.6,1.87 -binance-futures,BTCUSDT,1582329687455000,1582329687639514,3.15,9678.71,9678.6,1.87 -binance-futures,BTCUSDT,1582329687478000,1582329687639805,0.704,9679.7,9678.6,1.87 -binance-futures,BTCUSDT,1582329687480000,1582329687639824,0.031,9678.68,9678.6,1.87 -binance-futures,BTCUSDT,1582329687480000,1582329687639835,0.031,9678.67,9678.6,1.87 -binance-futures,BTCUSDT,1582329687505000,1582329687640104,0.12,9679.61,9678.59,3.751 -binance-futures,BTCUSDT,1582329687528000,1582329687650197,0.031,9679.58,9678.59,3.751 -binance-futures,BTCUSDT,1582329687535000,1582329687660416,0.031,9679.57,9678.59,3.751 -binance-futures,BTCUSDT,1582329687556000,1582329687681903,8.681,9679.57,9678.59,3.751 -binance-futures,BTCUSDT,1582329687564000,1582329687686606,0.12,9679.55,9678.59,3.751 -binance-futures,BTCUSDT,1582329687583000,1582329687704261,0.031,9679.53,9678.59,3.751 -binance-futures,BTCUSDT,1582329687593000,1582329687714965,0.031,9679.53,9678.7,1.87 -binance-futures,BTCUSDT,1582329687603000,1582329687726539,9.181,9679.53,9678.7,1.87 -binance-futures,BTCUSDT,1582329687608000,1582329687731374,9.181,9679.53,9678.59,3.751 -binance-futures,BTCUSDT,1582329687610000,1582329687732422,0.12,9679.44,9678.59,3.751 -binance-futures,BTCUSDT,1582329687632000,1582329687753319,9.47,9679.44,9678.59,3.751 -binance-futures,BTCUSDT,1582329687658000,1582329687777668,0.031,9679.4,9678.59,3.751 -binance-futures,BTCUSDT,1582329687664000,1582329687789588,0.12,9679.33,9678.59,3.751 -binance-futures,BTCUSDT,1582329687685000,1582329687809843,7.42,9679.33,9678.59,3.751 -binance-futures,BTCUSDT,1582329687713000,1582329687838546,0.12,9679.25,9678.59,3.751 -binance-futures,BTCUSDT,1582329687735000,1582329687857788,7.07,9679.25,9678.59,3.751 -binance-futures,BTCUSDT,1582329687737000,1582329687860022,0.031,9679.22,9678.59,3.751 -binance-futures,BTCUSDT,1582329687739000,1582329687863228,0.031,9679.21,9678.59,3.751 -binance-futures,BTCUSDT,1582329687741000,1582329687863678,0.031,9679.21,9678.6,0.002 -binance-futures,BTCUSDT,1582329687761000,1582329687883010,7.431,9679.21,9678.6,0.002 -binance-futures,BTCUSDT,1582329687784000,1582329687905916,0.012,9679.19,9678.6,0.002 -binance-futures,BTCUSDT,1582329687786000,1582329687908042,0.031,9679.18,9678.6,0.002 -binance-futures,BTCUSDT,1582329687788000,1582329687908392,0.031,9679.17,9678.6,0.002 -binance-futures,BTCUSDT,1582329687792000,1582329687914266,0.151,9679.17,9678.6,0.002 -binance-futures,BTCUSDT,1582329687801000,1582329687922147,0.031,9679.17,9678.6,0.002 -binance-futures,BTCUSDT,1582329687808000,1582329687930235,0.03,9679.17,9678.6,0.002 -binance-futures,BTCUSDT,1582329687815000,1582329687936186,4.68,9679.17,9678.6,0.002 -binance-futures,BTCUSDT,1582329687827000,1582329687949948,0.03,9679.17,9678.6,0.002 -binance-futures,BTCUSDT,1582329687835000,1582329687954612,0.12,9679.15,9678.6,0.002 -binance-futures,BTCUSDT,1582329687857000,1582329687981024,0.731,9679.16,9678.6,0.002 -binance-futures,BTCUSDT,1582329687898000,1582329688021251,0.031,9679.16,9678.6,0.002 -binance-futures,BTCUSDT,1582329687938000,1582329688060432,0.7,9679.15,9678.6,0.002 -binance-futures,BTCUSDT,1582329687963000,1582329688083270,0.031,9679.11,9678.6,0.002 -binance-futures,BTCUSDT,1582329688061000,1582329688184199,0.031,9679.11,9678.61,1.87 -binance-futures,BTCUSDT,1582329688077000,1582329688199211,0.031,9679.11,9678.6,0.002 -binance-futures,BTCUSDT,1582329688090000,1582329688212838,0.704,9679.7,9678.6,0.002 -binance-futures,BTCUSDT,1582329688094000,1582329688218943,0.704,9679.7,9678.61,0.45 -binance-futures,BTCUSDT,1582329688121000,1582329688242973,0.704,9679.7,9678.64,0.031 -binance-futures,BTCUSDT,1582329688123000,1582329688244645,0.704,9679.7,9678.65,0.031 -binance-futures,BTCUSDT,1582329688136000,1582329688255706,0.82,9679.69,9678.65,0.031 -binance-futures,BTCUSDT,1582329688145000,1582329688268818,0.7,9679.69,9678.65,0.031 -binance-futures,BTCUSDT,1582329688153000,1582329688283959,0.7,9679.69,9678.73,0.444 -binance-futures,BTCUSDT,1582329688155000,1582329688284103,4.15,9679.69,9678.73,0.444 -binance-futures,BTCUSDT,1582329688167000,1582329688288126,3.45,9679.69,9678.73,0.444 -binance-futures,BTCUSDT,1582329688179000,1582329688299531,0.704,9679.7,9678.73,0.444 -binance-futures,BTCUSDT,1582329688189000,1582329688313978,0.704,9679.7,9678.77,0.031 -binance-futures,BTCUSDT,1582329688197000,1582329688318932,0.7,9679.68,9678.77,0.031 -binance-futures,BTCUSDT,1582329688218000,1582329688338555,3.05,9679.68,9678.77,0.031 -binance-futures,BTCUSDT,1582329688220000,1582329688342674,3.05,9679.68,9678.8,0.436 -binance-futures,BTCUSDT,1582329688230000,1582329688357655,2.35,9679.68,9678.8,0.436 -binance-futures,BTCUSDT,1582329688235000,1582329688379332,0.704,9679.7,9678.8,0.436 -binance-futures,BTCUSDT,1582329688246000,1582329688379661,0.015,9679.67,9678.83,0.031 -binance-futures,BTCUSDT,1582329688250000,1582329688379690,0.015,9679.67,9678.84,0.031 -binance-futures,BTCUSDT,1582329688286000,1582329688406706,0.015,9679.67,9678.84,0.495 -binance-futures,BTCUSDT,1582329688292000,1582329688413576,0.015,9679.67,9678.84,0.464 -binance-futures,BTCUSDT,1582329688296000,1582329688421372,0.12,9679.33,9678.81,0.002 -binance-futures,BTCUSDT,1582329688310000,1582329688432277,0.12,9679.33,9678.86,0.031 -binance-futures,BTCUSDT,1582329688311000,1582329688434517,0.12,9679.33,9678.88,0.031 -binance-futures,BTCUSDT,1582329688334000,1582329688457474,0.12,9679.33,9678.81,0.002 -binance-futures,BTCUSDT,1582329688342000,1582329688463294,0.12,9679.33,9678.81,1.872 -binance-futures,BTCUSDT,1582329688358000,1582329688482769,1.071,9679.14,9678.81,0.002 -binance-futures,BTCUSDT,1582329688368000,1582329688490181,0.12,9679.33,9678.81,0.002 -binance-futures,BTCUSDT,1582329688379000,1582329688501535,0.015,9679.67,9678.81,0.002 -binance-futures,BTCUSDT,1582329688399000,1582329688523903,0.031,9679.29,9678.81,1.872 -binance-futures,BTCUSDT,1582329688401000,1582329688524669,0.7,9679.12,9678.81,1.872 -binance-futures,BTCUSDT,1582329688415000,1582329688536142,0.7,9679.12,9678.81,0.002 -binance-futures,BTCUSDT,1582329688430000,1582329688551768,0.015,9679.67,9678.84,0.446 -binance-futures,BTCUSDT,1582329688447000,1582329688567863,0.015,9679.67,9678.81,0.036 -binance-futures,BTCUSDT,1582329688486000,1582329688607311,0.7,9679.66,9678.81,0.036 -binance-futures,BTCUSDT,1582329688488000,1582329688610706,0.82,9679.66,9678.81,0.036 -binance-futures,BTCUSDT,1582329688497000,1582329688618998,0.7,9679.66,9678.81,0.036 -binance-futures,BTCUSDT,1582329688504000,1582329688625076,0.7,9679.66,9678.81,0.002 -binance-futures,BTCUSDT,1582329688508000,1582329688628809,3,9679.66,9678.81,0.002 -binance-futures,BTCUSDT,1582329688509000,1582329688631499,0.031,9679.64,9678.81,0.002 -binance-futures,BTCUSDT,1582329688511000,1582329688634936,0.031,9679.62,9678.81,0.002 -binance-futures,BTCUSDT,1582329688533000,1582329688652629,3.681,9679.62,9678.81,0.002 -binance-futures,BTCUSDT,1582329688548000,1582329688670382,0.031,9679.62,9678.81,0.002 -binance-futures,BTCUSDT,1582329688555000,1582329688674888,0.031,9679.58,9678.81,0.002 -binance-futures,BTCUSDT,1582329688580000,1582329688704518,0.031,9679.58,9678.68,0.034 -binance-futures,BTCUSDT,1582329688582000,1582329688706003,2.931,9679.58,9678.68,0.034 -binance-futures,BTCUSDT,1582329688584000,1582329688711657,2.9,9679.58,9678.68,0.034 -binance-futures,BTCUSDT,1582329688598000,1582329688721501,0.031,9679.62,9678.68,0.034 -binance-futures,BTCUSDT,1582329688615000,1582329688738869,0.031,9679.54,9678.82,1.87 -binance-futures,BTCUSDT,1582329688632000,1582329688755123,0.031,9679.54,9678.68,0.034 -binance-futures,BTCUSDT,1582329688639000,1582329688762539,2.381,9679.54,9678.68,0.034 -binance-futures,BTCUSDT,1582329688641000,1582329688765996,2.381,9679.54,9678.84,0.445 -binance-futures,BTCUSDT,1582329688644000,1582329688767896,2.35,9679.54,9678.84,0.445 -binance-futures,BTCUSDT,1582329688645000,1582329688769341,2.35,9679.54,9678.68,0.034 -binance-futures,BTCUSDT,1582329688665000,1582329688787237,1.871,9679.68,9678.68,0.034 -binance-futures,BTCUSDT,1582329688669000,1582329688790264,0.031,9679.5,9678.68,0.034 -binance-futures,BTCUSDT,1582329688683000,1582329688805193,0.031,9679.5,9678.88,1.96 -binance-futures,BTCUSDT,1582329688689000,1582329688813207,2.331,9679.5,9678.88,1.96 -binance-futures,BTCUSDT,1582329688691000,1582329688813724,2.3,9679.5,9678.88,1.96 -binance-futures,BTCUSDT,1582329688708000,1582329688830887,1.871,9679.68,9678.88,1.96 -binance-futures,BTCUSDT,1582329688755000,1582329688876195,0.015,9679.67,9678.88,1.96 -binance-futures,BTCUSDT,1582329688778000,1582329688897724,4.915,9679.67,9678.88,1.96 -binance-futures,BTCUSDT,1582329688801000,1582329688922609,0.031,9679.63,9678.88,1.96 -binance-futures,BTCUSDT,1582329688806000,1582329688930437,0.031,9679.63,9678.89,1.87 -binance-futures,BTCUSDT,1582329688820000,1582329688941544,6.631,9679.63,9678.89,1.87 -binance-futures,BTCUSDT,1582329688850000,1582329688979836,0.7,9679.61,9678.89,1.87 -binance-futures,BTCUSDT,1582329688877000,1582329688998031,5.7,9679.61,9678.89,1.87 -binance-futures,BTCUSDT,1582329688883000,1582329689003920,0.031,9679.57,9678.89,1.87 -binance-futures,BTCUSDT,1582329688901000,1582329689023715,6.931,9679.57,9678.89,1.87 -binance-futures,BTCUSDT,1582329688901000,1582329689023860,6.931,9679.57,9678.88,1.96 -binance-futures,BTCUSDT,1582329688929000,1582329689051257,6.931,9679.57,9678.89,1.87 -binance-futures,BTCUSDT,1582329688948000,1582329689068779,0.031,9679.57,9678.89,1.87 -binance-futures,BTCUSDT,1582329688954000,1582329689074825,0.031,9679.54,9678.89,1.87 -binance-futures,BTCUSDT,1582329688958000,1582329689080380,0.031,9679.53,9678.89,1.87 -binance-futures,BTCUSDT,1582329688960000,1582329689083877,0.031,9679.53,9678.88,1.96 -binance-futures,BTCUSDT,1582329688977000,1582329689096797,4.031,9679.54,9678.88,1.96 -binance-futures,BTCUSDT,1582329688979000,1582329689100094,4.05,9679.53,9678.88,1.96 -binance-futures,BTCUSDT,1582329688985000,1582329689107014,4.05,9679.53,9678.89,1.87 -binance-futures,BTCUSDT,1582329688987000,1582329689109907,0.031,9679.49,9678.89,1.87 -binance-futures,BTCUSDT,1582329689002000,1582329689124131,0.031,9679.49,9678.59,3.01 -binance-futures,BTCUSDT,1582329689006000,1582329689130255,0.062,9679.49,9678.59,3.01 -binance-futures,BTCUSDT,1582329689013000,1582329689135277,5.412,9679.49,9678.59,3.01 -binance-futures,BTCUSDT,1582329689028000,1582329689152101,0.011,9679.46,9678.59,3.01 -binance-futures,BTCUSDT,1582329689051000,1582329689175688,5.661,9679.46,9678.59,3.01 -binance-futures,BTCUSDT,1582329689055000,1582329689176964,0.031,9679.43,9678.59,3.01 -binance-futures,BTCUSDT,1582329689067000,1582329689190311,0.12,9679.32,9678.59,3.01 -binance-futures,BTCUSDT,1582329689089000,1582329689215468,4.02,9679.32,9678.59,3.01 -binance-futures,BTCUSDT,1582329689093000,1582329689217901,0.031,9679.28,9678.59,3.01 -binance-futures,BTCUSDT,1582329689112000,1582329689234460,0.031,9679.28,9678.6,0.46 -binance-futures,BTCUSDT,1582329689115000,1582329689242593,0.031,9679.28,9678.59,3.01 -binance-futures,BTCUSDT,1582329689117000,1582329689243636,4.931,9679.28,9678.59,3.01 -binance-futures,BTCUSDT,1582329689121000,1582329689243674,0.031,9679.26,9678.59,3.01 -binance-futures,BTCUSDT,1582329689121000,1582329689245861,0.031,9679.25,9678.59,3.01 -binance-futures,BTCUSDT,1582329689144000,1582329689267170,4.481,9679.25,9678.59,3.01 -binance-futures,BTCUSDT,1582329689171000,1582329689289971,0.031,9679.21,9678.59,3.01 -binance-futures,BTCUSDT,1582329689189000,1582329689309674,3.981,9679.21,9678.59,3.01 -binance-futures,BTCUSDT,1582329689228000,1582329689352158,0.031,9679.21,9678.59,3.01 -binance-futures,BTCUSDT,1582329689231000,1582329689360241,0.7,9679.19,9678.59,3.01 -binance-futures,BTCUSDT,1582329689258000,1582329689378068,3.681,9679.19,9678.59,3.01 -binance-futures,BTCUSDT,1582329689259000,1582329689381237,3.681,9679.19,9678.61,0.464 -binance-futures,BTCUSDT,1582329689267000,1582329689389032,2.981,9679.19,9678.61,0.464 -binance-futures,BTCUSDT,1582329689273000,1582329689394658,0.031,9679.19,9678.61,0.464 -binance-futures,BTCUSDT,1582329689278000,1582329689400298,0.031,9679.19,9678.59,3.01 -binance-futures,BTCUSDT,1582329689302000,1582329689425575,0.7,9679.18,9678.59,3.01 -binance-futures,BTCUSDT,1582329689308000,1582329689430620,0.7,9679.18,9678.6,0.471 -binance-futures,BTCUSDT,1582329689326000,1582329689448098,0.031,9679.14,9678.6,0.471 -binance-futures,BTCUSDT,1582329689332000,1582329689463248,0.362,9679.18,9678.6,0.471 -binance-futures,BTCUSDT,1582329689338000,1582329689465234,0.362,9679.18,9678.59,3.01 -binance-futures,BTCUSDT,1582329689342000,1582329689466408,0.362,9679.18,9678.6,0.47 -binance-futures,BTCUSDT,1582329689355000,1582329689476101,0.363,9679.12,9678.6,0.47 -binance-futures,BTCUSDT,1582329689385000,1582329689505341,0.363,9679.12,9678.59,3.01 -binance-futures,BTCUSDT,1582329689397000,1582329689519721,1.871,9679.68,9678.59,3.01 -binance-futures,BTCUSDT,1582329689402000,1582329689524972,1.871,9679.68,9678.6,0.462 -binance-futures,BTCUSDT,1582329689416000,1582329689539240,0.36,9679.11,9678.6,0.462 -binance-futures,BTCUSDT,1582329689421000,1582329689544337,0.36,9679.11,9678.59,0.047 -binance-futures,BTCUSDT,1582329689427000,1582329689550306,0.48,9679.11,9678.59,0.047 -binance-futures,BTCUSDT,1582329689437000,1582329689560536,0.36,9679.11,9678.59,0.047 -binance-futures,BTCUSDT,1582329689448000,1582329689571471,0.36,9679.11,9678.72,0.451 -binance-futures,BTCUSDT,1582329689452000,1582329689576461,0.031,9679.09,9678.72,0.451 -binance-futures,BTCUSDT,1582329689454000,1582329689577506,0.031,9679.08,9678.72,0.451 -binance-futures,BTCUSDT,1582329689456000,1582329689579624,0.031,9679.07,9678.72,0.451 -binance-futures,BTCUSDT,1582329689464000,1582329689585752,0.031,9679.07,9678.59,0.047 -binance-futures,BTCUSDT,1582329689473000,1582329689595661,0.12,9679.08,9678.59,0.047 -binance-futures,BTCUSDT,1582329689484000,1582329689623241,0.12,9679.08,9678.71,0.45 -binance-futures,BTCUSDT,1582329689484000,1582329689623251,1.871,9679.68,9678.71,0.45 -binance-futures,BTCUSDT,1582329689503000,1582329689630334,0.031,9679.04,9678.59,0.047 -binance-futures,BTCUSDT,1582329689528000,1582329689650335,0.015,9679.67,9678.59,0.047 -binance-futures,BTCUSDT,1582329689553000,1582329689677184,0.031,9679.63,9678.59,0.047 -binance-futures,BTCUSDT,1582329689575000,1582329689695585,4.881,9679.63,9678.59,0.047 -binance-futures,BTCUSDT,1582329689576000,1582329689699238,4.881,9679.63,9678.59,0.503 -binance-futures,BTCUSDT,1582329689599000,1582329689720426,4.881,9679.63,9678.59,0.047 -binance-futures,BTCUSDT,1582329689602000,1582329689724701,0.011,9679.59,9678.59,0.047 -binance-futures,BTCUSDT,1582329689619000,1582329689741162,5.561,9679.59,9678.59,0.047 -binance-futures,BTCUSDT,1582329689645000,1582329689767874,0.12,9679.58,9678.59,0.047 -binance-futures,BTCUSDT,1582329689658000,1582329689780657,0.48,9679.58,9678.59,0.047 -binance-futures,BTCUSDT,1582329689668000,1582329689790196,5.08,9679.58,9678.59,0.047 -binance-futures,BTCUSDT,1582329689668000,1582329689790730,4.96,9679.58,9678.59,0.047 -binance-futures,BTCUSDT,1582329689672000,1582329689793883,0.031,9679.54,9678.59,0.047 -binance-futures,BTCUSDT,1582329689674000,1582329689798943,0.031,9679.54,9678.59,0.037 -binance-futures,BTCUSDT,1582329689693000,1582329689813968,4.931,9679.54,9678.59,0.037 -binance-futures,BTCUSDT,1582329689697000,1582329689821224,0.031,9679.51,9678.59,0.037 -binance-futures,BTCUSDT,1582329689720000,1582329689843024,8.731,9679.51,9678.59,0.037 -binance-futures,BTCUSDT,1582329689725000,1582329689847559,0.031,9679.5,9678.59,0.037 -binance-futures,BTCUSDT,1582329689746000,1582329689867467,8.631,9679.5,9678.59,0.037 -binance-futures,BTCUSDT,1582329689756000,1582329689876493,0.015,9679.49,9678.59,0.037 -binance-futures,BTCUSDT,1582329689760000,1582329689886583,0.016,9679.49,9678.6,0.017 -binance-futures,BTCUSDT,1582329689770000,1582329689890888,0.011,9679.46,9678.6,0.017 -binance-futures,BTCUSDT,1582329689790000,1582329689911956,7.411,9679.46,9678.6,0.017 -binance-futures,BTCUSDT,1582329689802000,1582329689922025,7.4,9679.46,9678.6,0.017 -binance-futures,BTCUSDT,1582329689825000,1582329689949277,0.031,9679.42,9678.6,0.017 -binance-futures,BTCUSDT,1582329689850000,1582329689972060,7.331,9679.42,9678.6,0.017 -binance-futures,BTCUSDT,1582329689877000,1582329689996267,0.011,9679.38,9678.6,0.017 -binance-futures,BTCUSDT,1582329689893000,1582329690014845,5.911,9679.38,9678.6,0.017 -binance-futures,BTCUSDT,1582329689952000,1582329690072431,0.031,9679.34,9678.6,0.017 -binance-futures,BTCUSDT,1582329689970000,1582329690091458,5.631,9679.34,9678.6,0.017 -binance-futures,BTCUSDT,1582329690008000,1582329690128986,0.016,9679.33,9678.59,0.037 -binance-futures,BTCUSDT,1582329690027000,1582329690147655,4.516,9679.33,9678.59,0.037 -binance-futures,BTCUSDT,1582329690028000,1582329690150389,4.516,9679.33,9678.6,0.438 -binance-futures,BTCUSDT,1582329690031000,1582329690152282,0.031,9679.29,9678.6,0.438 -binance-futures,BTCUSDT,1582329690051000,1582329690172179,4.831,9679.29,9678.6,0.438 -binance-futures,BTCUSDT,1582329690077000,1582329690197669,0.011,9679.25,9678.6,0.438 -binance-futures,BTCUSDT,1582329690096000,1582329690217710,3.961,9679.25,9678.6,0.438 -binance-futures,BTCUSDT,1582329690110000,1582329690229661,3.961,9679.25,9678.59,0.037 -binance-futures,BTCUSDT,1582329690132000,1582329690250728,0.031,9679.21,9678.59,0.037 -binance-futures,BTCUSDT,1582329690150000,1582329690270649,3.081,9679.21,9678.59,0.037 -binance-futures,BTCUSDT,1582329690195000,1582329690313951,3.081,9679.21,9678.59,0.487 -binance-futures,BTCUSDT,1582329690216000,1582329690335958,0.031,9679.17,9678.59,0.487 -binance-futures,BTCUSDT,1582329690231000,1582329690353093,3.481,9679.17,9678.59,0.487 -binance-futures,BTCUSDT,1582329690249000,1582329690385334,0.031,9679.17,9678.59,0.487 -binance-futures,BTCUSDT,1582329690256000,1582329690414266,0.031,9679.17,9678.59,0.037 -binance-futures,BTCUSDT,1582329690256000,1582329690414954,0.031,9679.17,9678.63,0.457 -binance-futures,BTCUSDT,1582329690263000,1582329690415821,0.001,9679.16,9678.63,0.457 -binance-futures,BTCUSDT,1582329690271000,1582329690415946,0.011,9679.13,9678.63,0.457 -binance-futures,BTCUSDT,1582329690292000,1582329690416439,0.001,9679.16,9678.63,0.457 -binance-futures,BTCUSDT,1582329690322000,1582329690442822,0.001,9679.16,9678.59,0.037 -binance-futures,BTCUSDT,1582329690342000,1582329690464839,0.36,9679.15,9678.59,0.037 -binance-futures,BTCUSDT,1582329690344000,1582329690467053,0.36,9679.15,9678.64,0.468 -binance-futures,BTCUSDT,1582329690346000,1582329690470048,0.031,9679.12,9678.64,0.468 -binance-futures,BTCUSDT,1582329690370000,1582329690491318,2,9679.09,9678.64,0.468 -binance-futures,BTCUSDT,1582329690388000,1582329690508733,0.001,9679.16,9678.64,0.468 -binance-futures,BTCUSDT,1582329690391000,1582329690511353,0.011,9679.05,9678.64,0.468 -binance-futures,BTCUSDT,1582329690393000,1582329690513827,0.011,9679.05,9678.59,0.037 -binance-futures,BTCUSDT,1582329690411000,1582329690531204,0.36,9679.11,9678.59,0.037 -binance-futures,BTCUSDT,1582329690424000,1582329690544685,0.36,9679.08,9678.59,0.037 -binance-futures,BTCUSDT,1582329690438000,1582329690559184,0.36,9679.08,9678.59,0.476 -binance-futures,BTCUSDT,1582329690440000,1582329690560547,3.46,9679.08,9678.59,0.476 -binance-futures,BTCUSDT,1582329690454000,1582329690574803,3.46,9679.08,9678.59,0.037 -binance-futures,BTCUSDT,1582329690467000,1582329690588229,3.46,9679.08,9678.6,0.465 -binance-futures,BTCUSDT,1582329690471000,1582329690592619,3.1,9679.08,9678.6,0.465 -binance-futures,BTCUSDT,1582329690479000,1582329690601172,0.031,9679.04,9678.59,0.037 -binance-futures,BTCUSDT,1582329690500000,1582329690619884,4.331,9679.04,9678.59,0.037 -binance-futures,BTCUSDT,1582329690519000,1582329690640042,4.691,9679.04,9678.59,0.037 -binance-futures,BTCUSDT,1582329690523000,1582329690643077,0.391,9679.04,9678.59,0.037 -binance-futures,BTCUSDT,1582329690542000,1582329690665884,0.011,9679,9678.59,0.476 -binance-futures,BTCUSDT,1582329690551000,1582329690674304,0.011,9679,9678.59,0.037 -binance-futures,BTCUSDT,1582329690561000,1582329690679948,3.411,9679,9678.59,0.037 -binance-futures,BTCUSDT,1582329690569000,1582329690688056,3.4,9679,9678.59,0.037 -binance-futures,BTCUSDT,1582329690596000,1582329690715818,0.12,9679.62,9678.59,0.037 -binance-futures,BTCUSDT,1582329690611000,1582329690733301,0.36,9678.99,9678.59,0.037 -binance-futures,BTCUSDT,1582329690631000,1582329690750909,0.36,9678.99,9678.6,1.87 -binance-futures,BTCUSDT,1582329690647000,1582329690769114,0.36,9678.99,9678.59,0.037 -binance-futures,BTCUSDT,1582329690662000,1582329690783244,0.12,9679.62,9678.59,0.037 -binance-futures,BTCUSDT,1582329690670000,1582329690793118,0.015,9679.67,9678.59,0.037 -binance-futures,BTCUSDT,1582329690673000,1582329690795486,0.015,9679.67,9678.6,1.87 -binance-futures,BTCUSDT,1582329690685000,1582329690806134,0.031,9679.58,9678.6,1.87 -binance-futures,BTCUSDT,1582329690698000,1582329690820810,0.031,9679.58,9678.62,0.463 -binance-futures,BTCUSDT,1582329690704000,1582329690826279,4.881,9679.58,9678.62,0.463 -binance-futures,BTCUSDT,1582329690707000,1582329690829048,4.85,9679.58,9678.62,0.463 -binance-futures,BTCUSDT,1582329690738000,1582329690861498,0.36,9679.57,9678.62,0.463 -binance-futures,BTCUSDT,1582329690758000,1582329690878465,6.56,9679.57,9678.62,0.463 -binance-futures,BTCUSDT,1582329690769000,1582329690889649,0.015,9679.56,9678.62,0.463 -binance-futures,BTCUSDT,1582329690771000,1582329690892764,0.016,9679.56,9678.62,0.463 -binance-futures,BTCUSDT,1582329690776000,1582329690897683,0.016,9679.56,9678.63,1.87 -binance-futures,BTCUSDT,1582329690780000,1582329690900823,0.031,9679.54,9678.63,1.87 -binance-futures,BTCUSDT,1582329690783000,1582329690903844,0.031,9679.53,9678.63,1.87 -binance-futures,BTCUSDT,1582329690798000,1582329690917739,0.031,9679.53,9678.61,0.45 -binance-futures,BTCUSDT,1582329690802000,1582329690924580,5.931,9679.53,9678.61,0.45 -binance-futures,BTCUSDT,1582329690803000,1582329690924959,5.9,9679.53,9678.66,0.438 -binance-futures,BTCUSDT,1582329690819000,1582329690940212,5.9,9679.53,9678.63,1.87 -binance-futures,BTCUSDT,1582329690827000,1582329690948034,0.031,9679.49,9678.63,1.87 -binance-futures,BTCUSDT,1582329690843000,1582329690965988,4.681,9679.49,9678.63,1.87 -binance-futures,BTCUSDT,1582329690848000,1582329690968181,4.681,9679.49,9678.65,0.45 -binance-futures,BTCUSDT,1582329690873000,1582329690994310,4.681,9679.49,9678.59,0.037 -binance-futures,BTCUSDT,1582329690893000,1582329691014274,0.031,9679.45,9678.59,0.037 -binance-futures,BTCUSDT,1582329690913000,1582329691034154,6.381,9679.45,9678.59,0.037 -binance-futures,BTCUSDT,1582329690949000,1582329691067727,0.36,9679.44,9678.59,0.037 -binance-futures,BTCUSDT,1582329690967000,1582329691089159,7.51,9679.44,9678.59,0.037 -binance-futures,BTCUSDT,1582329690970000,1582329691091714,0.011,9679.4,9678.59,0.037 -binance-futures,BTCUSDT,1582329690989000,1582329691107827,7.861,9679.4,9678.59,0.037 -binance-futures,BTCUSDT,1582329691021000,1582329691148772,0.031,9679.36,9678.63,1.87 -binance-futures,BTCUSDT,1582329691045000,1582329691164338,7.331,9679.36,9678.63,1.87 -binance-futures,BTCUSDT,1582329691082000,1582329691204772,0.031,9679.36,9678.63,1.87 -binance-futures,BTCUSDT,1582329691091000,1582329691210973,0.391,9679.36,9678.63,1.87 -binance-futures,BTCUSDT,1582329691096000,1582329691216399,0.391,9679.36,9678.59,0.037 -binance-futures,BTCUSDT,1582329691104000,1582329691224440,0.36,9679.36,9678.59,0.037 -binance-futures,BTCUSDT,1582329691111000,1582329691232148,0.36,9679.36,9678.59,0.503 -binance-futures,BTCUSDT,1582329691115000,1582329691235251,0.36,9679.36,9678.64,0.44 -binance-futures,BTCUSDT,1582329691119000,1582329691241367,0.031,9679.32,9678.64,0.44 -binance-futures,BTCUSDT,1582329691138000,1582329691258434,4.331,9679.32,9678.64,0.44 -binance-futures,BTCUSDT,1582329691140000,1582329691261523,4.3,9679.32,9678.64,0.44 -binance-futures,BTCUSDT,1582329691156000,1582329691285001,4.3,9679.32,9678.59,0.037 -binance-futures,BTCUSDT,1582329691158000,1582329691289276,0.016,9679.39,9678.59,0.037 -binance-futures,BTCUSDT,1582329691162000,1582329691290054,0.36,9679.35,9678.59,0.037 -binance-futures,BTCUSDT,1582329691164000,1582329691290815,0.031,9679.29,9678.59,0.037 -binance-futures,BTCUSDT,1582329691164000,1582329691290827,0.031,9679.28,9678.59,0.037 -binance-futures,BTCUSDT,1582329691185000,1582329691305881,5.931,9679.28,9678.59,0.037 -binance-futures,BTCUSDT,1582329691195000,1582329691318235,5.9,9679.28,9678.59,0.037 -binance-futures,BTCUSDT,1582329691208000,1582329691335948,0.12,9679.23,9678.59,0.037 -binance-futures,BTCUSDT,1582329691234000,1582329691376321,0.031,9679.24,9678.59,0.037 -binance-futures,BTCUSDT,1582329691238000,1582329691376684,8,9679.23,9678.59,0.037 -binance-futures,BTCUSDT,1582329691242000,1582329691377337,0.031,9679.19,9678.59,0.037 -binance-futures,BTCUSDT,1582329691257000,1582329691378814,9.631,9679.19,9678.59,0.037 -binance-futures,BTCUSDT,1582329691272000,1582329691393488,0.12,9679.08,9678.59,0.037 -binance-futures,BTCUSDT,1582329691290000,1582329691411179,9.22,9679.08,9678.59,0.037 -binance-futures,BTCUSDT,1582329691313000,1582329691434632,0.031,9679.04,9678.59,0.037 -binance-futures,BTCUSDT,1582329691334000,1582329691454744,8.031,9679.04,9678.59,0.037 -binance-futures,BTCUSDT,1582329691356000,1582329691479784,0.031,9679,9678.59,0.037 -binance-futures,BTCUSDT,1582329691367000,1582329691489814,0.12,9678.77,9678.59,0.037 -binance-futures,BTCUSDT,1582329691390000,1582329691510266,6.12,9678.77,9678.59,0.037 -binance-futures,BTCUSDT,1582329691396000,1582329691519197,6,9678.77,9678.59,0.037 -binance-futures,BTCUSDT,1582329691413000,1582329691534748,0.12,9678.76,9678.59,0.037 -binance-futures,BTCUSDT,1582329691421000,1582329691541025,0.031,9678.73,9678.59,0.037 -binance-futures,BTCUSDT,1582329691442000,1582329691562493,6.831,9678.73,9678.59,0.037 -binance-futures,BTCUSDT,1582329691467000,1582329691588948,0.031,9678.69,9678.59,0.037 -binance-futures,BTCUSDT,1582329691485000,1582329691607255,5.781,9678.69,9678.59,0.037 -binance-futures,BTCUSDT,1582329691501000,1582329691621857,5.781,9678.69,9678.6,1.87 -binance-futures,BTCUSDT,1582329691517000,1582329691638795,5.781,9678.69,9678.59,0.037 -binance-futures,BTCUSDT,1582329691539000,1582329691660651,0.011,9678.65,9678.59,0.037 -binance-futures,BTCUSDT,1582329691561000,1582329691681632,5.161,9678.65,9678.59,0.037 -binance-futures,BTCUSDT,1582329691586000,1582329691707478,0.011,9678.65,9678.59,0.037 -binance-futures,BTCUSDT,1582329691604000,1582329691724892,0.36,9678.63,9678.59,0.037 -binance-futures,BTCUSDT,1582329691608000,1582329691727482,0.031,9678.61,9678.59,0.037 -binance-futures,BTCUSDT,1582329691627000,1582329691751439,2.931,9678.61,9678.59,0.037 -binance-futures,BTCUSDT,1582329691668000,1582329691789888,0.48,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691688000,1582329691807306,0.78,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691702000,1582329691822182,0.48,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691711000,1582329691831687,0.12,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691744000,1582329691865948,0.031,9678.61,9678.59,0.037 -binance-futures,BTCUSDT,1582329691747000,1582329691869771,0.48,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691751000,1582329691872001,0.36,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691756000,1582329691877509,0.48,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691766000,1582329691888513,3.58,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691793000,1582329691914535,3.22,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691814000,1582329691934876,3.1,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691823000,1582329691942149,3.46,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691843000,1582329691964287,0.36,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691871000,1582329691990223,0.478,9678.77,9678.59,0.037 -binance-futures,BTCUSDT,1582329691873000,1582329691992876,0.015,9679.42,9678.59,0.037 -binance-futures,BTCUSDT,1582329691877000,1582329691998085,0.1,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691914000,1582329692035262,0.46,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691931000,1582329692054682,0.58,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691933000,1582329692057739,0.46,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691958000,1582329692079913,0.36,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329691981000,1582329692100691,0.478,9679.24,9678.59,0.037 -binance-futures,BTCUSDT,1582329691986000,1582329692107661,0.015,9679.42,9678.59,0.037 -binance-futures,BTCUSDT,1582329692004000,1582329692126765,0.031,9679.21,9678.59,0.037 -binance-futures,BTCUSDT,1582329692006000,1582329692126782,0.031,9679.2,9678.59,0.037 -binance-futures,BTCUSDT,1582329692026000,1582329692148303,7.231,9679.2,9678.59,0.037 -binance-futures,BTCUSDT,1582329692032000,1582329692154693,7.2,9679.2,9678.59,0.037 -binance-futures,BTCUSDT,1582329692052000,1582329692174815,0.011,9679.16,9678.59,0.037 -binance-futures,BTCUSDT,1582329692054000,1582329692174830,0.131,9679.16,9678.59,0.037 -binance-futures,BTCUSDT,1582329692075000,1582329692196491,0.031,9679.15,9678.59,0.037 -binance-futures,BTCUSDT,1582329692077000,1582329692196501,0.509,9679.15,9678.59,0.037 -binance-futures,BTCUSDT,1582329692079000,1582329692202466,0.509,9679.15,9678.64,0.444 -binance-futures,BTCUSDT,1582329692081000,1582329692202502,0.12,9679.14,9678.64,0.444 -binance-futures,BTCUSDT,1582329692083000,1582329692202527,0.12,9679.14,9678.59,0.037 -binance-futures,BTCUSDT,1582329692100000,1582329692228738,9.62,9679.14,9678.59,0.037 -binance-futures,BTCUSDT,1582329692104000,1582329692228761,0.031,9679.1,9678.59,0.037 -binance-futures,BTCUSDT,1582329692127000,1582329692248308,10.031,9679.1,9678.59,0.037 -binance-futures,BTCUSDT,1582329692131000,1582329692254524,0.12,9679.07,9678.59,0.037 -binance-futures,BTCUSDT,1582329692151000,1582329692299476,10.07,9679.07,9678.59,0.037 -binance-futures,BTCUSDT,1582329692168000,1582329692314599,9.95,9679.07,9678.59,0.037 -binance-futures,BTCUSDT,1582329692185000,1582329692316032,0.36,9679.09,9678.59,0.037 -binance-futures,BTCUSDT,1582329692187000,1582329692316050,0.031,9679.1,9678.59,0.037 -binance-futures,BTCUSDT,1582329692194000,1582329692316149,0.031,9679.1,9678.59,0.484 -binance-futures,BTCUSDT,1582329692201000,1582329692321152,0.031,9679.1,9678.59,0.037 -binance-futures,BTCUSDT,1582329692203000,1582329692323891,0.011,9679.04,9678.59,0.037 -binance-futures,BTCUSDT,1582329692205000,1582329692323903,0.031,9679.03,9678.59,0.037 -binance-futures,BTCUSDT,1582329692224000,1582329692345759,7.431,9679.03,9678.59,0.037 -binance-futures,BTCUSDT,1582329692229000,1582329692350073,7.4,9679.03,9678.59,0.037 -binance-futures,BTCUSDT,1582329692233000,1582329692357051,7.4,9679.03,9678.59,0.464 -binance-futures,BTCUSDT,1582329692242000,1582329692364500,4,9678.97,9678.59,0.037 -binance-futures,BTCUSDT,1582329692244000,1582329692366267,8,9678.97,9678.59,0.037 -binance-futures,BTCUSDT,1582329692261000,1582329692381763,14.6,9678.97,9678.59,0.037 -binance-futures,BTCUSDT,1582329692261000,1582329692381777,2,9678.91,9678.59,0.037 -binance-futures,BTCUSDT,1582329692278000,1582329692398855,2.031,9678.93,9678.59,0.037 -binance-futures,BTCUSDT,1582329692280000,1582329692399406,7.15,9678.91,9678.59,0.037 -binance-futures,BTCUSDT,1582329692286000,1582329692407788,0.12,9678.9,9678.59,0.037 -binance-futures,BTCUSDT,1582329692306000,1582329692426327,7.82,9678.9,9678.59,0.037 -binance-futures,BTCUSDT,1582329692329000,1582329692449669,0.031,9678.86,9678.59,0.037 -binance-futures,BTCUSDT,1582329692350000,1582329692470422,7.131,9678.86,9678.59,0.037 -binance-futures,BTCUSDT,1582329692371000,1582329692490675,2,9678.8,9678.59,0.037 -binance-futures,BTCUSDT,1582329692371000,1582329692492780,4,9678.8,9678.59,0.037 -binance-futures,BTCUSDT,1582329692373000,1582329692497778,12,9678.8,9678.59,0.037 -binance-futures,BTCUSDT,1582329692376000,1582329692498479,0.1,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329692397000,1582329692520897,7.8,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329692410000,1582329692532961,7.92,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329692426000,1582329692548480,7.8,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329692448000,1582329692569308,7.92,9678.6,9678.59,0.037 -binance-futures,BTCUSDT,1582329692452000,1582329692578113,7.92,9678.6,9678.58,1 -binance-futures,BTCUSDT,1582329692460000,1582329692581082,7.8,9678.6,9678.58,1 -binance-futures,BTCUSDT,1582329692471000,1582329692592116,2,9678.59,9678.58,1 -binance-futures,BTCUSDT,1582329692471000,1582329692596021,25.15,9678.59,9678.58,1 -binance-futures,BTCUSDT,1582329692473000,1582329692596042,27.15,9678.59,9678.58,1 -binance-futures,BTCUSDT,1582329692473000,1582329692596052,29.15,9678.59,9678.58,1 -binance-futures,BTCUSDT,1582329692477000,1582329692601072,0.4,9678.58,9678,0.31 -binance-futures,BTCUSDT,1582329692485000,1582329692606218,1.07,9678.58,9678,0.31 -binance-futures,BTCUSDT,1582329692490000,1582329692610879,2.365,9678.58,9678,0.31 -binance-futures,BTCUSDT,1582329692492000,1582329692611496,4.365,9678.58,9678,0.31 -binance-futures,BTCUSDT,1582329692498000,1582329692623428,1.678,9677.91,9677.74,0.047 -binance-futures,BTCUSDT,1582329692514000,1582329692634978,2,9678,9677.74,0.047 -binance-futures,BTCUSDT,1582329692520000,1582329692641065,2,9677.85,9677.74,0.047 -binance-futures,BTCUSDT,1582329692522000,1582329692644374,10,9677.85,9677.74,0.047 -binance-futures,BTCUSDT,1582329692526000,1582329692645142,12,9677.85,9677.74,0.047 -binance-futures,BTCUSDT,1582329692535000,1582329692659179,4.12,9677.85,9677.74,0.047 -binance-futures,BTCUSDT,1582329692535000,1582329692659198,2.12,9677.85,9677.74,0.047 -binance-futures,BTCUSDT,1582329692537000,1582329692660011,2,9677.81,9677.74,0.047 -binance-futures,BTCUSDT,1582329692541000,1582329692662545,4,9677.79,9677.74,0.047 -binance-futures,BTCUSDT,1582329692541000,1582329692664031,6,9677.79,9677.74,0.047 -binance-futures,BTCUSDT,1582329692543000,1582329692666311,1,9677.77,9677.74,0.047 -binance-futures,BTCUSDT,1582329692547000,1582329692671946,0.12,9677.75,9677.74,0.047 -binance-futures,BTCUSDT,1582329692549000,1582329692675306,1.953,9677.74,9676.98,3.37 -binance-futures,BTCUSDT,1582329692569000,1582329692693743,1,9677.65,9676.98,3.37 -binance-futures,BTCUSDT,1582329692594000,1582329692715096,14,9677.65,9676.98,3.37 -binance-futures,BTCUSDT,1582329692596000,1582329692718161,2,9677.61,9676.98,3.37 -binance-futures,BTCUSDT,1582329692601000,1582329692724891,0.12,9677.49,9676.98,3.37 -binance-futures,BTCUSDT,1582329692622000,1582329692742959,14.12,9677.49,9676.98,3.37 -binance-futures,BTCUSDT,1582329692649000,1582329692769112,14,9677.49,9676.98,3.37 -binance-futures,BTCUSDT,1582329692649000,1582329692769137,0.12,9677.4,9676.98,3.37 -binance-futures,BTCUSDT,1582329692666000,1582329692785689,2,9677.34,9676.98,3.37 -binance-futures,BTCUSDT,1582329692666000,1582329692785930,4,9677.34,9676.98,3.37 -binance-futures,BTCUSDT,1582329692668000,1582329692789743,10,9677.34,9676.98,3.37 -binance-futures,BTCUSDT,1582329692682000,1582329692799617,20.45,9677.34,9676.98,3.37 -binance-futures,BTCUSDT,1582329692684000,1582329692805511,8,9677.28,9676.98,3.37 -binance-futures,BTCUSDT,1582329692694000,1582329692814045,8,9677.28,9676.7,0.029 -binance-futures,BTCUSDT,1582329692701000,1582329692821559,19.35,9677.28,9676.7,0.029 -binance-futures,BTCUSDT,1582329692701000,1582329692822193,17.35,9677.28,9676.7,0.029 -binance-futures,BTCUSDT,1582329692713000,1582329692833288,0.12,9677.17,9676.7,0.029 -binance-futures,BTCUSDT,1582329692721000,1582329692844343,0.12,9677.17,9676.67,2.312 -binance-futures,BTCUSDT,1582329692730000,1582329692852486,11.27,9677.17,9676.67,2.312 -binance-futures,BTCUSDT,1582329692732000,1582329692853829,11.27,9677.17,9676.44,0.1 -binance-futures,BTCUSDT,1582329692733000,1582329692854890,0.031,9677.14,9676.44,0.1 -binance-futures,BTCUSDT,1582329692737000,1582329692858216,0.031,9677.13,9676.44,0.1 -binance-futures,BTCUSDT,1582329692759000,1582329692882596,11.7,9677.13,9676.44,0.1 -binance-futures,BTCUSDT,1582329692765000,1582329692886258,0.12,9677.09,9676.44,0.1 -binance-futures,BTCUSDT,1582329692788000,1582329692908837,13.651,9677.09,9676.44,0.1 -binance-futures,BTCUSDT,1582329692813000,1582329692932922,0.12,9677.02,9676.44,0.1 -binance-futures,BTCUSDT,1582329692832000,1582329692951213,11.02,9677.02,9676.44,0.1 -binance-futures,BTCUSDT,1582329692855000,1582329692976003,0.12,9676.87,9676.44,0.1 -binance-futures,BTCUSDT,1582329692859000,1582329692978704,0.12,9676.87,9676.8,0.029 -binance-futures,BTCUSDT,1582329692876000,1582329692996997,10.02,9676.87,9676.8,0.029 -binance-futures,BTCUSDT,1582329692889000,1582329693014155,0.36,9676.86,9676.8,0.029 -binance-futures,BTCUSDT,1582329692901000,1582329693020029,0.12,9676.85,9676.8,0.029 -binance-futures,BTCUSDT,1582329692920000,1582329693039150,10.07,9676.85,9676.8,0.029 -binance-futures,BTCUSDT,1582329692941000,1582329693059205,9.95,9676.85,9676.8,0.029 -binance-futures,BTCUSDT,1582329692941000,1582329693059577,0.031,9676.81,9676.8,0.029 -binance-futures,BTCUSDT,1582329692943000,1582329693061709,0.151,9676.81,9676.8,0.029 -binance-futures,BTCUSDT,1582329692956000,1582329693078207,9.201,9676.81,9676.8,0.029 -binance-futures,BTCUSDT,1582329692965000,1582329693084347,9.17,9676.81,9676.8,0.029 -binance-futures,BTCUSDT,1582329692970000,1582329693090636,9.17,9676.81,9676.44,0.1 -binance-futures,BTCUSDT,1582329692998000,1582329693119181,9.15,9676.81,9676.44,0.1 -binance-futures,BTCUSDT,1582329693020000,1582329693141551,0.12,9676.8,9676.44,0.1 -binance-futures,BTCUSDT,1582329693040000,1582329693161483,7.32,9676.8,9676.44,0.1 -binance-futures,BTCUSDT,1582329693053000,1582329693177187,7.68,9676.8,9676.44,0.1 -binance-futures,BTCUSDT,1582329693059000,1582329693180368,7.56,9676.8,9676.44,0.1 -binance-futures,BTCUSDT,1582329693070000,1582329693192736,0.12,9676.79,9676.44,0.1 -binance-futures,BTCUSDT,1582329693091000,1582329693211126,6.07,9676.79,9676.44,0.1 -binance-futures,BTCUSDT,1582329693093000,1582329693215314,5.95,9676.79,9676.44,0.1 -binance-futures,BTCUSDT,1582329693165000,1582329693288557,0.12,9676.71,9676.44,0.1 -binance-futures,BTCUSDT,1582329693186000,1582329693332908,6.17,9676.71,9676.44,0.1 -binance-futures,BTCUSDT,1582329693189000,1582329693335853,6.05,9676.71,9676.44,0.1 -binance-futures,BTCUSDT,1582329693222000,1582329693344924,0.12,9676.59,9676.44,0.1 -binance-futures,BTCUSDT,1582329693240000,1582329693363078,7.47,9676.59,9676.44,0.1 -binance-futures,BTCUSDT,1582329693253000,1582329693376900,0.36,9676.58,9676.44,0.1 -binance-futures,BTCUSDT,1582329693263000,1582329693387256,0.36,9676.58,9676.5,0.031 -binance-futures,BTCUSDT,1582329693274000,1582329693396203,7.96,9676.58,9676.5,0.031 -binance-futures,BTCUSDT,1582329693295000,1582329693418361,7.96,9676.58,9676.44,0.1 -binance-futures,BTCUSDT,1582329693299000,1582329693431291,7.6,9676.58,9676.44,0.1 -binance-futures,BTCUSDT,1582329693332000,1582329693463736,0.12,9677.31,9676.44,0.1 -binance-futures,BTCUSDT,1582329693335000,1582329693463857,0.478,9676.83,9676.48,0.031 -binance-futures,BTCUSDT,1582329693337000,1582329693464106,0.478,9676.83,9676.5,0.031 -binance-futures,BTCUSDT,1582329693363000,1582329693482965,5.428,9676.83,9676.5,0.031 -binance-futures,BTCUSDT,1582329693371000,1582329693491851,4.95,9676.83,9676.5,0.031 -binance-futures,BTCUSDT,1582329693385000,1582329693506065,4.95,9676.83,9676.51,0.031 -binance-futures,BTCUSDT,1582329693427000,1582329693547749,0.36,9676.82,9676.51,0.031 -binance-futures,BTCUSDT,1582329693446000,1582329693567303,7.96,9676.82,9676.51,0.031 -binance-futures,BTCUSDT,1582329693466000,1582329693586969,0.36,9676.82,9676.51,0.031 -binance-futures,BTCUSDT,1582329693470000,1582329693592268,0.36,9676.82,9676.49,0.031 -binance-futures,BTCUSDT,1582329693473000,1582329693593856,0.36,9676.82,9676.25,0.012 -binance-futures,BTCUSDT,1582329693489000,1582329693609795,0.36,9676.82,9676.54,0.031 -binance-futures,BTCUSDT,1582329693491000,1582329693612095,0.36,9676.82,9676.55,0.031 -binance-futures,BTCUSDT,1582329693500000,1582329693621850,1.871,9677.69,9676.55,0.031 -binance-futures,BTCUSDT,1582329693513000,1582329693635303,1.871,9677.69,9676.54,0.031 -binance-futures,BTCUSDT,1582329693513000,1582329693636015,1.871,9677.69,9676.25,0.012 -binance-futures,BTCUSDT,1582329693525000,1582329693645683,0.12,9677.68,9676.25,0.012 -binance-futures,BTCUSDT,1582329693528000,1582329693649990,0.1,9676.52,9676.25,0.012 -binance-futures,BTCUSDT,1582329693548000,1582329693671780,6.75,9676.52,9676.25,0.012 -binance-futures,BTCUSDT,1582329693551000,1582329693675521,6.75,9676.52,9676.49,0.031 -binance-futures,BTCUSDT,1582329693553000,1582329693677175,6.75,9676.52,9676.5,0.031 -binance-futures,BTCUSDT,1582329693574000,1582329693697143,6.75,9676.52,9676.48,0.031 -binance-futures,BTCUSDT,1582329693576000,1582329693698725,6.75,9676.52,9676.25,0.012 -binance-futures,BTCUSDT,1582329693579000,1582329693702908,0.12,9676.5,9676.25,0.012 -binance-futures,BTCUSDT,1582329693600000,1582329693719436,10.17,9676.5,9676.25,0.012 -binance-futures,BTCUSDT,1582329693616000,1582329693735897,10.17,9676.5,9676.26,1.87 -binance-futures,BTCUSDT,1582329693625000,1582329693747785,10.05,9676.5,9676.26,1.87 -binance-futures,BTCUSDT,1582329693627000,1582329693748134,0.12,9676.46,9676.26,1.87 -binance-futures,BTCUSDT,1582329693646000,1582329693769636,0.12,9676.46,9676.25,0.012 -binance-futures,BTCUSDT,1582329693648000,1582329693769657,10.05,9676.5,9676.25,0.012 -binance-futures,BTCUSDT,1582329693648000,1582329693769668,8.6,9676.46,9676.25,0.012 -binance-futures,BTCUSDT,1582329693674000,1582329693798627,0.12,9676.28,9676.25,0.012 -binance-futures,BTCUSDT,1582329693698000,1582329693817460,8.52,9676.28,9676.25,0.012 -binance-futures,BTCUSDT,1582329693720000,1582329693847721,4,9676.26,9676.25,0.012 -binance-futures,BTCUSDT,1582329693722000,1582329693847759,10,9676.26,9676.25,0.012 -binance-futures,BTCUSDT,1582329693745000,1582329693869097,13.9,9676.26,9676.25,0.012 -binance-futures,BTCUSDT,1582329693757000,1582329693877792,6,9676.26,9676.25,0.012 -binance-futures,BTCUSDT,1582329693763000,1582329693887653,6.36,9676.26,9676.25,0.012 -binance-futures,BTCUSDT,1582329693836000,1582329693957058,6.46,9676.26,9676.25,0.012 -binance-futures,BTCUSDT,1582329694020000,1582329694156486,1.478,9674,9673.88,0.002 -binance-futures,BTCUSDT,1582329694049000,1582329694168941,7.828,9674,9673.88,0.002 -binance-futures,BTCUSDT,1582329694065000,1582329694189912,7.828,9674,9673.87,15.256 -binance-futures,BTCUSDT,1582329694068000,1582329694192961,7.828,9674,9673.75,0.5 -binance-futures,BTCUSDT,1582329694072000,1582329694196861,7.685,9674,9673.75,0.5 -binance-futures,BTCUSDT,1582329694073000,1582329694199686,7.685,9674,9673.99,1.88 -binance-futures,BTCUSDT,1582329694090000,1582329694213454,1.335,9674,9673.99,1.88 -binance-futures,BTCUSDT,1582329694091000,1582329694214343,1.335,9674,9673.92,0.466 -binance-futures,BTCUSDT,1582329694099000,1582329694222048,1.335,9674,9673.89,0.005 -binance-futures,BTCUSDT,1582329694102000,1582329694228841,1.335,9674,9673.99,0.1 -binance-futures,BTCUSDT,1582329694242000,1582329694364210,1.24,9674,9673.99,0.1 -binance-futures,BTCUSDT,1582329694370000,1582329694492696,1.24,9674,9673.75,0.5 -binance-futures,BTCUSDT,1582329694404000,1582329694528280,1.24,9674,9673.3,0.1 -binance-futures,BTCUSDT,1582329694428000,1582329694552504,0.478,9673.99,9673.3,0.1 -binance-futures,BTCUSDT,1582329694452000,1582329694571535,1.24,9674,9673.3,0.1 -binance-futures,BTCUSDT,1582329694454000,1582329694577741,1.24,9674,9673.34,0.031 -binance-futures,BTCUSDT,1582329694460000,1582329694582070,0.12,9673.88,9673.34,0.031 -binance-futures,BTCUSDT,1582329694471000,1582329694590535,0.478,9673.98,9673.34,0.031 -binance-futures,BTCUSDT,1582329694479000,1582329694600795,1.24,9674,9673.34,0.031 -binance-futures,BTCUSDT,1582329694479000,1582329694601943,1.24,9674,9673.35,0.71 -binance-futures,BTCUSDT,1582329694484000,1582329694608163,1.24,9674,9673.35,0.98 -binance-futures,BTCUSDT,1582329694489000,1582329694614034,1.24,9674,9673.35,1.65 -binance-futures,BTCUSDT,1582329694493000,1582329694614083,0.478,9673.97,9673.35,1.65 -binance-futures,BTCUSDT,1582329694500000,1582329694623774,0.478,9673.97,9673.37,0.031 -binance-futures,BTCUSDT,1582329694508000,1582329694631068,1.24,9674,9673.37,0.031 -binance-futures,BTCUSDT,1582329694553000,1582329694673993,0.478,9673.99,9673.37,0.031 -binance-futures,BTCUSDT,1582329694570000,1582329694692074,0.478,9673.99,9673.38,1.87 -binance-futures,BTCUSDT,1582329694576000,1582329694695346,0.478,9673.99,9673.39,0.031 -binance-futures,BTCUSDT,1582329694580000,1582329694699780,0.478,9673.99,9673.4,0.031 -binance-futures,BTCUSDT,1582329694591000,1582329694714154,1.24,9674,9673.4,0.031 -binance-futures,BTCUSDT,1582329694622000,1582329694742540,0.12,9673.99,9673.4,0.031 -binance-futures,BTCUSDT,1582329694624000,1582329694747381,0.12,9673.99,9673.36,0.031 -binance-futures,BTCUSDT,1582329694628000,1582329694750690,1.24,9674,9673.38,1.87 -binance-futures,BTCUSDT,1582329694634000,1582329694752394,0.478,9673.99,9673.38,1.87 -binance-futures,BTCUSDT,1582329694643000,1582329694765834,1.24,9674,9673.38,1.87 -binance-futures,BTCUSDT,1582329694647000,1582329694768238,1.24,9674,9673.42,0.031 -binance-futures,BTCUSDT,1582329694647000,1582329694769300,1.24,9674,9673.44,0.031 -binance-futures,BTCUSDT,1582329694669000,1582329694790990,1.24,9674,9673.42,0.031 -binance-futures,BTCUSDT,1582329694685000,1582329694808363,0.12,9673.99,9673.42,0.031 -binance-futures,BTCUSDT,1582329694685000,1582329694809704,0.598,9673.99,9673.42,0.031 -binance-futures,BTCUSDT,1582329694694000,1582329694813744,0.598,9673.99,9673.45,0.031 -binance-futures,BTCUSDT,1582329694707000,1582329694828310,0.12,9673.99,9673.45,0.031 -binance-futures,BTCUSDT,1582329694713000,1582329694836301,0.12,9673.77,9673.45,0.031 -binance-futures,BTCUSDT,1582329694730000,1582329694853529,0.12,9673.77,9673.46,0.71 -binance-futures,BTCUSDT,1582329694733000,1582329694854075,0.12,9673.77,9673.51,2 -binance-futures,BTCUSDT,1582329694739000,1582329694859362,1.24,9674,9673.51,2 -binance-futures,BTCUSDT,1582329694766000,1582329694888770,1.24,9674,9673.52,0.442 -binance-futures,BTCUSDT,1582329694772000,1582329694894442,1.24,9674,9673.52,1.112 -binance-futures,BTCUSDT,1582329694778000,1582329694900626,1.24,9674,9673.52,0.67 -binance-futures,BTCUSDT,1582329694787000,1582329694909418,1.24,9674,9673.58,4 -binance-futures,BTCUSDT,1582329694807000,1582329694928371,1.24,9674,9673.64,2 -binance-futures,BTCUSDT,1582329694811000,1582329694931371,1.24,9674,9673.64,4 -binance-futures,BTCUSDT,1582329694827000,1582329694949878,1.24,9674,9673.64,6.7 -binance-futures,BTCUSDT,1582329694827000,1582329694949892,1.24,9674,9673.7,2 -binance-futures,BTCUSDT,1582329694830000,1582329694951015,1.24,9674,9673.7,4 -binance-futures,BTCUSDT,1582329694836000,1582329694958212,1.24,9674,9673.7,6 -binance-futures,BTCUSDT,1582329694838000,1582329694961049,1.24,9674,9673.7,5.995 -binance-futures,BTCUSDT,1582329694845000,1582329694968048,1.24,9674,9673.74,2 -binance-futures,BTCUSDT,1582329694848000,1582329694970207,1.24,9674,9673.76,2 -binance-futures,BTCUSDT,1582329694849000,1582329694973216,1.24,9674,9673.76,4 -binance-futures,BTCUSDT,1582329694853000,1582329694974835,1.24,9674,9673.76,6 -binance-futures,BTCUSDT,1582329694855000,1582329694978170,1.24,9674,9673.77,0.435 -binance-futures,BTCUSDT,1582329694871000,1582329694997205,1.24,9674,9673.82,2 -binance-futures,BTCUSDT,1582329694873000,1582329694997321,1.24,9674,9673.82,4 -binance-futures,BTCUSDT,1582329694895000,1582329695019714,1.24,9674,9673.88,2 -binance-futures,BTCUSDT,1582329694897000,1582329695020421,1.24,9674,9673.88,4 -binance-futures,BTCUSDT,1582329694899000,1582329695021456,1.24,9674,9673.91,0.462 -binance-futures,BTCUSDT,1582329694917000,1582329695041102,1.24,9674,9673.94,2 -binance-futures,BTCUSDT,1582329694921000,1582329695047111,1.24,9674,9673.97,1 -binance-futures,BTCUSDT,1582329694938000,1582329695064108,1.24,9674,9673.98,2 -binance-futures,BTCUSDT,1582329694940000,1582329695065132,1.24,9674,9673.99,1 -binance-futures,BTCUSDT,1582329694944000,1582329695065954,1.24,9674,9673.99,3 -binance-futures,BTCUSDT,1582329694945000,1582329695068282,1.24,9674,9673.99,5 -binance-futures,BTCUSDT,1582329694962000,1582329695081369,1.24,9674,9673.99,8.1 -binance-futures,BTCUSDT,1582329694971000,1582329695093252,1.24,9674,9673.99,5 -binance-futures,BTCUSDT,1582329695019000,1582329695140196,1.24,9674,9673.99,5.556 -binance-futures,BTCUSDT,1582329695281000,1582329695411274,1.24,9674,9673.99,3.556 -binance-futures,BTCUSDT,1582329695293000,1582329695412682,1.24,9674,9673.99,1.556 -binance-futures,BTCUSDT,1582329695343000,1582329695464616,1.24,9674,9673.99,1.1 -binance-futures,BTCUSDT,1582329695419000,1582329695539350,1.24,9674,9673.99,1 -binance-futures,BTCUSDT,1582329695733000,1582329695855376,1.24,9674,9673.99,2.87 -binance-futures,BTCUSDT,1582329695792000,1582329695912436,1.24,9674,9673.99,3.324 -binance-futures,BTCUSDT,1582329695805000,1582329695927713,1.24,9674,9673.99,2.87 -binance-futures,BTCUSDT,1582329695807000,1582329695929097,1.24,9674,9673.99,1 -binance-futures,BTCUSDT,1582329695833000,1582329695956069,1.24,9674,9673.99,2.87 -binance-futures,BTCUSDT,1582329695851000,1582329695969757,1.24,9674,9673.99,1 -binance-futures,BTCUSDT,1582329695969000,1582329696090291,2.431,9674,9673.99,1 -binance-futures,BTCUSDT,1582329695976000,1582329696098503,13.141,9674,9673.99,1 -binance-futures,BTCUSDT,1582329695977000,1582329696098707,23.851,9674,9673.99,1 -binance-futures,BTCUSDT,1582329695992000,1582329696111375,13.141,9674,9673.99,1 -binance-futures,BTCUSDT,1582329696000000,1582329696121137,11.95,9674,9673.99,1 -binance-futures,BTCUSDT,1582329696002000,1582329696122592,1.24,9674,9673.99,1 -binance-futures,BTCUSDT,1582329696011000,1582329696130850,1.6,9674,9673.99,1 -binance-futures,BTCUSDT,1582329696045000,1582329696164715,1.24,9674,9673.99,1 -binance-futures,BTCUSDT,1582329696085000,1582329696203758,1.24,9674,9673.99,1.1 -binance-futures,BTCUSDT,1582329696087000,1582329696206112,1.36,9674,9673.99,1.1 -binance-futures,BTCUSDT,1582329696092000,1582329696212810,1.24,9674,9673.99,1.1 -binance-futures,BTCUSDT,1582329696220000,1582329696350795,1.36,9674,9673.99,1.1 -binance-futures,BTCUSDT,1582329696256000,1582329696379344,1.24,9674,9673.99,1.1 -binance-futures,BTCUSDT,1582329696294000,1582329696418679,1.24,9674,9673.99,0.894 -binance-futures,BTCUSDT,1582329696315000,1582329696440200,4.54,9674,9673.99,0.894 -binance-futures,BTCUSDT,1582329696338000,1582329696458786,1.24,9674,9673.99,0.894 -binance-futures,BTCUSDT,1582329696344000,1582329696468724,1.36,9674,9673.99,0.894 -binance-futures,BTCUSDT,1582329696395000,1582329696513718,1.838,9674,9673.99,0.894 -binance-futures,BTCUSDT,1582329696408000,1582329696531372,1.36,9674,9673.99,0.894 -binance-futures,BTCUSDT,1582329696471000,1582329696591680,1.24,9674,9673.99,0.894 -binance-futures,BTCUSDT,1582329696715000,1582329696835173,1.24,9674,9673.99,0.994 -binance-futures,BTCUSDT,1582329696795000,1582329696915535,1.24,9674,9673.99,0.894 -binance-futures,BTCUSDT,1582329697152000,1582329697296174,1.24,9674,9673.77,0.191 -binance-futures,BTCUSDT,1582329697189000,1582329697308991,7.44,9674,9673.77,0.191 -binance-futures,BTCUSDT,1582329697191000,1582329697312713,7.44,9674,9673.94,2 -binance-futures,BTCUSDT,1582329697192000,1582329697313589,6.4,9673.99,9673.94,2 -binance-futures,BTCUSDT,1582329697200000,1582329697324792,6.4,9673.99,9673.78,0.27 -binance-futures,BTCUSDT,1582329697202000,1582329697327825,6.4,9673.99,9673.78,0.94 -binance-futures,BTCUSDT,1582329697204000,1582329697337485,6.4,9673.99,9673.78,1.65 -binance-futures,BTCUSDT,1582329697211000,1582329697358037,9.85,9673.99,9673.78,1.65 -binance-futures,BTCUSDT,1582329697227000,1582329697371179,9.85,9673.99,9673.82,0.031 -binance-futures,BTCUSDT,1582329697290000,1582329697413181,9.85,9673.99,9673.2,0.005 -binance-futures,BTCUSDT,1582329697302000,1582329697423713,9.85,9673.99,9673.85,0.031 -binance-futures,BTCUSDT,1582329697303000,1582329697424231,9.85,9673.99,9673.86,0.031 -binance-futures,BTCUSDT,1582329697328000,1582329697455169,9.85,9673.99,9673.2,0.005 -binance-futures,BTCUSDT,1582329697335000,1582329697457430,0.12,9673.98,9673.2,0.005 -binance-futures,BTCUSDT,1582329697355000,1582329697478248,12.67,9673.98,9673.2,0.005 -binance-futures,BTCUSDT,1582329697383000,1582329697504374,0.12,9673.94,9673.2,0.005 -binance-futures,BTCUSDT,1582329697404000,1582329697526284,11.77,9673.94,9673.2,0.005 -binance-futures,BTCUSDT,1582329697430000,1582329697549240,0.12,9673.9,9673.2,0.005 -binance-futures,BTCUSDT,1582329697448000,1582329697570585,11.12,9673.9,9673.2,0.005 -binance-futures,BTCUSDT,1582329697474000,1582329697595603,11,9673.9,9673.2,0.005 -binance-futures,BTCUSDT,1582329697476000,1582329697596934,0.12,9673.86,9673.2,0.005 -binance-futures,BTCUSDT,1582329697493000,1582329697616544,11.47,9673.86,9673.2,0.005 -binance-futures,BTCUSDT,1582329697519000,1582329697657063,11.35,9673.86,9673.2,0.005 -binance-futures,BTCUSDT,1582329697521000,1582329697657689,0.12,9673.83,9673.2,0.005 -binance-futures,BTCUSDT,1582329697554000,1582329697672875,11.57,9673.83,9673.2,0.005 -binance-futures,BTCUSDT,1582329697576000,1582329697696257,11.45,9673.83,9673.2,0.005 -binance-futures,BTCUSDT,1582329697578000,1582329697698529,0.12,9673.79,9673.2,0.005 -binance-futures,BTCUSDT,1582329697596000,1582329697715794,12.97,9673.79,9673.2,0.005 -binance-futures,BTCUSDT,1582329697619000,1582329697743006,12.85,9673.79,9673.2,0.005 -binance-futures,BTCUSDT,1582329697619000,1582329697743023,0.12,9673.75,9673.2,0.005 -binance-futures,BTCUSDT,1582329697639000,1582329697759800,12.07,9673.75,9673.2,0.005 -binance-futures,BTCUSDT,1582329697652000,1582329697773254,11.95,9673.75,9673.2,0.005 -binance-futures,BTCUSDT,1582329697666000,1582329697788686,0.12,9673.7,9673.2,0.005 -binance-futures,BTCUSDT,1582329697686000,1582329697805899,10.27,9673.7,9673.2,0.005 -binance-futures,BTCUSDT,1582329697689000,1582329697808136,10.27,9673.7,9673.26,2 -binance-futures,BTCUSDT,1582329697696000,1582329697816742,10.15,9673.7,9673.26,2 -binance-futures,BTCUSDT,1582329697714000,1582329697831938,0.12,9673.66,9673.26,2 -binance-futures,BTCUSDT,1582329697729000,1582329697847817,10.15,9673.7,9673.26,2 -binance-futures,BTCUSDT,1582329697730000,1582329697851340,9.3,9673.66,9673.26,2 -binance-futures,BTCUSDT,1582329697899000,1582329698017613,0.478,9673.69,9673.26,2 -binance-futures,BTCUSDT,1582329697916000,1582329698038280,2.428,9673.86,9673.26,2 -binance-futures,BTCUSDT,1582329697923000,1582329698045287,2.428,9673.86,9673.3,0.031 -binance-futures,BTCUSDT,1582329697937000,1582329698054400,0.478,9673.8,9673.3,0.031 -binance-futures,BTCUSDT,1582329697951000,1582329698073943,0.478,9673.8,9673.36,2 -binance-futures,BTCUSDT,1582329697953000,1582329698076314,5.828,9673.8,9673.36,2 -binance-futures,BTCUSDT,1582329697956000,1582329698077836,5.35,9673.8,9673.36,2 -binance-futures,BTCUSDT,1582329697977000,1582329698098055,5.35,9673.8,9673.4,0.031 -binance-futures,BTCUSDT,1582329697997000,1582329698118407,5.35,9673.8,9673.44,2 -binance-futures,BTCUSDT,1582329698013000,1582329698133064,2.428,9673.86,9673.44,2 -binance-futures,BTCUSDT,1582329698016000,1582329698138293,0.478,9673.82,9673.44,2 -binance-futures,BTCUSDT,1582329698032000,1582329698155736,2.428,9673.86,9673.44,2 -binance-futures,BTCUSDT,1582329698034000,1582329698157396,3.35,9673.82,9673.48,0.031 -binance-futures,BTCUSDT,1582329698056000,1582329698177576,3.35,9673.82,9673.52,2 -binance-futures,BTCUSDT,1582329698091000,1582329698211476,2.428,9673.86,9673.52,2 -binance-futures,BTCUSDT,1582329698114000,1582329698234804,2.428,9673.86,9673.55,0.031 -binance-futures,BTCUSDT,1582329698116000,1582329698237160,2.428,9673.86,9673.56,0.031 -binance-futures,BTCUSDT,1582329698133000,1582329698256421,2.428,9673.86,9673.61,2 -binance-futures,BTCUSDT,1582329698244000,1582329698363696,2.428,9673.86,9673.65,0.031 -binance-futures,BTCUSDT,1582329698263000,1582329698383709,2.428,9673.86,9673.69,2 -binance-futures,BTCUSDT,1582329698281000,1582329698420715,0.478,9673.85,9673.69,2 -binance-futures,BTCUSDT,1582329698297000,1582329698442421,2.428,9673.86,9673.69,2 -binance-futures,BTCUSDT,1582329698323000,1582329698450205,2.428,9673.86,9673.73,0.031 -binance-futures,BTCUSDT,1582329698394000,1582329698514339,0.478,9673.85,9673.73,0.031 -binance-futures,BTCUSDT,1582329698412000,1582329698530206,5.328,9673.85,9673.73,0.031 -binance-futures,BTCUSDT,1582329698415000,1582329698535742,5.328,9673.85,9673.74,0.031 -binance-futures,BTCUSDT,1582329698415000,1582329698535756,5.328,9673.85,9673.75,0.031 -binance-futures,BTCUSDT,1582329698430000,1582329698549927,4.85,9673.85,9673.75,0.031 -binance-futures,BTCUSDT,1582329698452000,1582329698572099,0.478,9673.84,9673.74,0.031 -binance-futures,BTCUSDT,1582329698455000,1582329698577479,0.598,9673.84,9673.74,0.031 -binance-futures,BTCUSDT,1582329698457000,1582329698579066,0.958,9673.84,9673.74,0.031 -binance-futures,BTCUSDT,1582329698469000,1582329698593638,6.608,9673.84,9673.74,0.031 -binance-futures,BTCUSDT,1582329698475000,1582329698596126,6.608,9673.84,9673.78,0.031 -binance-futures,BTCUSDT,1582329698477000,1582329698596139,6.608,9673.84,9673.79,0.031 -binance-futures,BTCUSDT,1582329698478000,1582329698598615,6.13,9673.84,9673.79,0.031 -binance-futures,BTCUSDT,1582329698493000,1582329698611364,0.478,9673.83,9673.79,0.031 -binance-futures,BTCUSDT,1582329698496000,1582329698618488,0.12,9673.82,9673.73,0.031 -binance-futures,BTCUSDT,1582329698498000,1582329698620666,0.12,9673.82,9673.2,0.005 -binance-futures,BTCUSDT,1582329698517000,1582329698644381,6.712,9673.82,9673.2,0.005 -binance-futures,BTCUSDT,1582329698522000,1582329698645744,6.712,9673.82,9673.81,0.031 -binance-futures,BTCUSDT,1582329698548000,1582329698671638,6.712,9673.82,9673.2,0.005 -binance-futures,BTCUSDT,1582329698560000,1582329698680583,0.112,9673.82,9673.2,0.005 -binance-futures,BTCUSDT,1582329698565000,1582329698686365,0.59,9673.82,9673.2,0.005 -binance-futures,BTCUSDT,1582329698573000,1582329698695377,0.117,9673.8,9673.2,0.005 -binance-futures,BTCUSDT,1582329698588000,1582329698708770,2.428,9673.86,9673.2,0.005 -binance-futures,BTCUSDT,1582329698596000,1582329698719601,0.478,9673.79,9673.2,0.005 -binance-futures,BTCUSDT,1582329698611000,1582329698733745,4.56,9673.8,9673.24,0.031 -binance-futures,BTCUSDT,1582329698615000,1582329698736703,0.117,9673.66,9673.24,0.031 -binance-futures,BTCUSDT,1582329698636000,1582329698757901,3.117,9673.66,9673.3,2 -binance-futures,BTCUSDT,1582329698656000,1582329698778712,0.117,9673.66,9673.3,2 -binance-futures,BTCUSDT,1582329698664000,1582329698787035,0.478,9673.71,9673.3,2 -binance-futures,BTCUSDT,1582329698666000,1582329698787546,0.117,9673.63,9673.3,2 -binance-futures,BTCUSDT,1582329698681000,1582329698801001,0.36,9673.78,9673.3,2 -binance-futures,BTCUSDT,1582329698693000,1582329698816140,0.1,9673.82,9673.3,2 -binance-futures,BTCUSDT,1582329698700000,1582329698825487,0.478,9673.8,9673.3,2 -binance-futures,BTCUSDT,1582329698702000,1582329698826326,0.478,9673.8,9673.34,0.031 -binance-futures,BTCUSDT,1582329698714000,1582329698835520,0.36,9673.65,9673.34,0.031 -binance-futures,BTCUSDT,1582329698724000,1582329698847624,0.36,9673.65,9673.4,2 -binance-futures,BTCUSDT,1582329698751000,1582329698874914,2.428,9673.86,9673.44,0.031 -binance-futures,BTCUSDT,1582329698767000,1582329698889112,0.117,9673.64,9673.44,0.031 -binance-futures,BTCUSDT,1582329698773000,1582329698894851,0.117,9673.64,9673.5,2 -binance-futures,BTCUSDT,1582329698785000,1582329698905495,2.428,9673.86,9673.5,2 -binance-futures,BTCUSDT,1582329698797000,1582329698918816,0.117,9673.85,9673.5,2 -binance-futures,BTCUSDT,1582329698799000,1582329698920836,0.117,9673.85,9673.54,0.031 -binance-futures,BTCUSDT,1582329698801000,1582329698923018,2.428,9673.86,9673.54,0.031 -binance-futures,BTCUSDT,1582329698820000,1582329698940577,2.428,9673.86,9673.59,2 -binance-futures,BTCUSDT,1582329698831000,1582329698953845,0.117,9673.84,9673.59,2 -binance-futures,BTCUSDT,1582329698843000,1582329698965086,2.428,9673.86,9673.59,2 -binance-futures,BTCUSDT,1582329698845000,1582329698966643,2.428,9673.86,9673.63,0.031 -binance-futures,BTCUSDT,1582329698866000,1582329698988781,2.428,9673.86,9673.69,2 -binance-futures,BTCUSDT,1582329698892000,1582329699014818,2.428,9673.86,9673.73,0.031 -binance-futures,BTCUSDT,1582329698941000,1582329699062969,0.478,9673.85,9673.73,0.031 -binance-futures,BTCUSDT,1582329698954000,1582329699074761,0.478,9673.85,9673.79,2 -binance-futures,BTCUSDT,1582329698973000,1582329699094900,2.428,9673.86,9673.79,2 -binance-futures,BTCUSDT,1582329698979000,1582329699102419,2.428,9673.86,9673.82,0.031 -binance-futures,BTCUSDT,1582329698985000,1582329699105768,2.428,9673.86,9673.83,0.031 -binance-futures,BTCUSDT,1582329699000000,1582329699125423,2.428,9673.86,9673.85,2 -binance-futures,BTCUSDT,1582329699405000,1582329699527435,2.428,9673.86,9673.85,2.1 -binance-futures,BTCUSDT,1582329699446000,1582329699565951,2.788,9673.86,9673.85,2.1 -binance-futures,BTCUSDT,1582329699628000,1582329699749772,2.905,9673.86,9673.85,2.1 -binance-futures,BTCUSDT,1582329699630000,1582329699754169,2.788,9673.86,9673.85,2.1 -binance-futures,BTCUSDT,1582329699660000,1582329699780636,2.428,9673.86,9673.85,2.1 -binance-futures,BTCUSDT,1582329699831000,1582329699950141,2.545,9673.86,9673.85,2.1 -binance-futures,BTCUSDT,1582329699837000,1582329699957841,2.428,9673.86,9673.85,2.1 -binance-futures,BTCUSDT,1582329699863000,1582329699984060,2.788,9673.86,9673.85,2.1 -binance-futures,BTCUSDT,1582329700864000,1582329700982085,2.788,9673.86,9673.85,0.1 -binance-futures,BTCUSDT,1582329700967000,1582329701084777,2.888,9673.86,9673.85,0.1 -binance-futures,BTCUSDT,1582329701204000,1582329701344724,2.887,9673.86,9673.85,0.1 -binance-futures,BTCUSDT,1582329701308000,1582329701430415,3.004,9673.86,9673.85,0.1 -binance-futures,BTCUSDT,1582329702003000,1582329702127160,3.482,9673.86,9673.85,0.1 -binance-futures,BTCUSDT,1582329702094000,1582329702219343,0.31,9673.74,9673.2,0.005 -binance-futures,BTCUSDT,1582329702096000,1582329702222904,0.32,9673.74,9673.2,0.005 -binance-futures,BTCUSDT,1582329702105000,1582329702233794,0.99,9673.74,9673.2,0.005 -binance-futures,BTCUSDT,1582329702110000,1582329702234527,2.09,9673.74,9673.2,0.005 -binance-futures,BTCUSDT,1582329702119000,1582329702244958,9.64,9673.74,9673.2,0.005 -binance-futures,BTCUSDT,1582329702126000,1582329702250531,0.117,9673.71,9673.2,0.005 -binance-futures,BTCUSDT,1582329702132000,1582329702256409,0.031,9673.7,9673.2,0.005 -binance-futures,BTCUSDT,1582329702155000,1582329702279765,4,9673.64,9673.2,0.005 -binance-futures,BTCUSDT,1582329702157000,1582329702280385,10,9673.64,9673.2,0.005 -binance-futures,BTCUSDT,1582329702174000,1582329702297818,8,9673.64,9673.2,0.005 -binance-futures,BTCUSDT,1582329702176000,1582329702300159,2,9673.58,9673.2,0.005 -binance-futures,BTCUSDT,1582329702179000,1582329702302144,4,9673.58,9673.2,0.005 -binance-futures,BTCUSDT,1582329702179000,1582329702304446,6,9673.58,9673.2,0.005 -binance-futures,BTCUSDT,1582329702181000,1582329702309946,10,9673.58,9673.2,0.005 -binance-futures,BTCUSDT,1582329702187000,1582329702310082,0.117,9673.56,9673.2,0.005 -binance-futures,BTCUSDT,1582329702196000,1582329702325968,0.928,9672.78,9672.09,0.15 -binance-futures,BTCUSDT,1582329702227000,1582329702399821,5.778,9672.78,9672.09,0.15 -binance-futures,BTCUSDT,1582329702251000,1582329702403328,5.468,9672.78,9672.09,0.15 -binance-futures,BTCUSDT,1582329702253000,1582329702403374,0.117,9672.77,9672.09,0.15 -binance-futures,BTCUSDT,1582329702260000,1582329702403464,0.595,9672.77,9672.09,0.15 -binance-futures,BTCUSDT,1582329702279000,1582329702407404,0.955,9672.77,9672.09,0.15 -binance-futures,BTCUSDT,1582329702292000,1582329702418809,8.805,9672.77,9672.09,0.15 -binance-futures,BTCUSDT,1582329702294000,1582329702426019,8.327,9672.77,9672.09,0.15 -binance-futures,BTCUSDT,1582329702301000,1582329702433624,0.031,9672.73,9672.09,0.15 -binance-futures,BTCUSDT,1582329702334000,1582329702459156,6.381,9672.73,9672.09,0.15 -binance-futures,BTCUSDT,1582329702351000,1582329702472089,0.031,9672.73,9672.09,0.15 -binance-futures,BTCUSDT,1582329702355000,1582329702478694,0.031,9672.73,9672.1,0.444 -binance-futures,BTCUSDT,1582329702366000,1582329702490468,0.117,9673.15,9672.09,0.15 -binance-futures,BTCUSDT,1582329702372000,1582329702496776,0.117,9673.03,9672.09,0.15 -binance-futures,BTCUSDT,1582329702379000,1582329702501287,0.1,9673.21,9672.09,0.15 -binance-futures,BTCUSDT,1582329702387000,1582329702508527,0.117,9673.33,9672.09,0.15 -binance-futures,BTCUSDT,1582329702393000,1582329702517053,6.7,9673.15,9672.09,0.15 -binance-futures,BTCUSDT,1582329702395000,1582329702517242,5.55,9673.03,9672.09,0.15 -binance-futures,BTCUSDT,1582329702399000,1582329702523999,5.05,9673.03,9672.09,0.15 -binance-futures,BTCUSDT,1582329702418000,1582329702539495,8.1,9673.03,9672.09,0.15 -binance-futures,BTCUSDT,1582329702422000,1582329702545705,3.05,9673.03,9672.09,0.15 -binance-futures,BTCUSDT,1582329702426000,1582329702546591,0.117,9673,9672.09,0.15 -binance-futures,BTCUSDT,1582329702455000,1582329702577318,2.689,9673.56,9672.09,0.15 -binance-futures,BTCUSDT,1582329702457000,1582329702579021,0.117,9673.55,9672.09,0.15 -binance-futures,BTCUSDT,1582329702466000,1582329702586185,0.117,9673.47,9672.09,0.15 -binance-futures,BTCUSDT,1582329702486000,1582329702613038,2.567,9673.47,9672.09,0.15 -binance-futures,BTCUSDT,1582329702505000,1582329702631549,0.117,9673.47,9672.09,0.15 -binance-futures,BTCUSDT,1582329702505000,1582329702631588,0.117,9673.47,9672.08,0.012 -binance-futures,BTCUSDT,1582329702527000,1582329702650606,2.689,9673.56,9672.08,0.012 -binance-futures,BTCUSDT,1582329702529000,1582329702652625,0.117,9673.41,9672.08,0.012 -binance-futures,BTCUSDT,1582329702552000,1582329702679605,2.867,9673.41,9672.16,0.031 -binance-futures,BTCUSDT,1582329702553000,1582329702679645,2.867,9673.41,9672.17,0.031 -binance-futures,BTCUSDT,1582329702553000,1582329702680691,2.867,9673.41,9672.18,0.031 -binance-futures,BTCUSDT,1582329702586000,1582329702708670,0.478,9673.4,9672.18,0.031 -binance-futures,BTCUSDT,1582329702607000,1582329702732618,3.928,9673.4,9672.18,0.031 -binance-futures,BTCUSDT,1582329702611000,1582329702732654,3.928,9673.4,9672.19,0.031 -binance-futures,BTCUSDT,1582329702629000,1582329702754845,0.478,9673.4,9672.19,0.031 -binance-futures,BTCUSDT,1582329702632000,1582329702757526,2.689,9673.56,9672.19,0.031 -binance-futures,BTCUSDT,1582329702639000,1582329702765390,0.117,9673.43,9672.19,0.031 -binance-futures,BTCUSDT,1582329702658000,1582329702781836,0.478,9673.39,9672.19,0.031 -binance-futures,BTCUSDT,1582329702670000,1582329702792272,0.117,9673.43,9672.19,0.031 -binance-futures,BTCUSDT,1582329702674000,1582329702797759,2.689,9673.56,9672.19,0.031 -binance-futures,BTCUSDT,1582329702685000,1582329702808910,0.478,9673.38,9672.19,0.031 -binance-futures,BTCUSDT,1582329702706000,1582329702832807,1.862,9672.78,9672.19,0.031 -binance-futures,BTCUSDT,1582329702726000,1582329702852950,1.862,9672.78,9672.21,0.031 -binance-futures,BTCUSDT,1582329702728000,1582329702854287,1.862,9672.78,9672.22,0.031 -binance-futures,BTCUSDT,1582329702743000,1582329702868873,0.478,9673.37,9672.22,0.031 -binance-futures,BTCUSDT,1582329702743000,1582329702870143,2.554,9673.37,9672.22,0.031 -binance-futures,BTCUSDT,1582329702753000,1582329702874236,2.076,9673.37,9672.22,0.031 -binance-futures,BTCUSDT,1582329702753000,1582329702877580,2.076,9673.37,9672.22,4.481 -binance-futures,BTCUSDT,1582329702772000,1582329702897493,0.478,9673.36,9672.22,0.031 -binance-futures,BTCUSDT,1582329702781000,1582329702904380,0.478,9673.36,9672.26,0.031 -binance-futures,BTCUSDT,1582329702805000,1582329702932749,0.478,9673.36,9672.22,0.031 -binance-futures,BTCUSDT,1582329702814000,1582329702936131,0.36,9673.35,9672.22,0.031 -binance-futures,BTCUSDT,1582329702830000,1582329702956012,0.36,9673.35,9672.28,0.031 -binance-futures,BTCUSDT,1582329702830000,1582329702956035,0.36,9673.35,9672.3,0.031 -binance-futures,BTCUSDT,1582329702834000,1582329702958953,2.66,9673.35,9672.3,0.031 -binance-futures,BTCUSDT,1582329702855000,1582329702979090,0.478,9673.34,9672.3,0.031 -binance-futures,BTCUSDT,1582329702859000,1582329702983386,0.478,9673.34,9672.21,0.031 -binance-futures,BTCUSDT,1582329702859000,1582329702983421,0.478,9673.34,9672.12,0.916 -binance-futures,BTCUSDT,1582329702882000,1582329703008943,3.678,9673.34,9672.34,0.031 -binance-futures,BTCUSDT,1582329702898000,1582329703022705,0.36,9673.33,9672.34,0.031 -binance-futures,BTCUSDT,1582329702908000,1582329703030960,0.36,9673.33,9672.12,0.916 -binance-futures,BTCUSDT,1582329702919000,1582329703040614,5.56,9673.33,9672.12,0.916 -binance-futures,BTCUSDT,1582329702930000,1582329703052712,0.478,9673.32,9672.12,0.916 -binance-futures,BTCUSDT,1582329702951000,1582329703074321,7.128,9673.32,9672.12,0.916 -binance-futures,BTCUSDT,1582329702965000,1582329703087084,0.36,9673.3,9672.12,0.916 -binance-futures,BTCUSDT,1582329702985000,1582329703104715,10.11,9673.3,9672.12,0.916 -binance-futures,BTCUSDT,1582329702993000,1582329703113825,0.478,9673.29,9672.12,0.916 -binance-futures,BTCUSDT,1582329703013000,1582329703135047,0.117,9673.22,9672.12,0.916 -binance-futures,BTCUSDT,1582329703035000,1582329703158263,11.217,9673.22,9672.12,0.916 -binance-futures,BTCUSDT,1582329703060000,1582329703181936,0.117,9673.13,9672.12,0.916 -binance-futures,BTCUSDT,1582329703080000,1582329703203914,11.367,9673.13,9672.12,0.916 -binance-futures,BTCUSDT,1582329703109000,1582329703231953,11.25,9673.13,9672.12,0.916 -binance-futures,BTCUSDT,1582329703115000,1582329703239169,0.117,9673,9672.12,0.916 -binance-futures,BTCUSDT,1582329703137000,1582329703262906,11.567,9673,9672.12,0.916 -binance-futures,BTCUSDT,1582329703169000,1582329703294238,11.45,9673,9672.12,0.916 -binance-futures,BTCUSDT,1582329703173000,1582329703296218,0.117,9672.91,9672.12,0.916 -binance-futures,BTCUSDT,1582329703196000,1582329703319932,10.317,9672.91,9672.12,0.916 -binance-futures,BTCUSDT,1582329703223000,1582329703350183,0.117,9672.83,9672.12,0.916 -binance-futures,BTCUSDT,1582329703248000,1582329703375244,10.417,9672.83,9672.12,0.916 -binance-futures,BTCUSDT,1582329703275000,1582329703425867,0.031,9672.79,9672.12,0.916 -binance-futures,BTCUSDT,1582329703279000,1582329703426379,0.117,9672.77,9672.12,0.916 -binance-futures,BTCUSDT,1582329703322000,1582329703447190,11.067,9672.77,9672.12,0.916 -binance-futures,BTCUSDT,1582329703326000,1582329703449427,0.031,9672.76,9672.12,0.916 -binance-futures,BTCUSDT,1582329703344000,1582329703467931,11.067,9672.77,9672.12,0.916 -binance-futures,BTCUSDT,1582329703346000,1582329703467976,12.6,9672.76,9672.12,0.916 -binance-futures,BTCUSDT,1582329703352000,1582329703472910,0.011,9672.72,9672.12,0.916 -binance-futures,BTCUSDT,1582329703353000,1582329703475151,0.117,9672.67,9672.12,0.916 -binance-futures,BTCUSDT,1582329703373000,1582329703496473,11.267,9672.67,9672.12,0.916 -binance-futures,BTCUSDT,1582329703386000,1582329703509771,0.117,9672.67,9672.12,0.916 -binance-futures,BTCUSDT,1582329703394000,1582329703516774,0.011,9672.72,9672.12,0.916 -binance-futures,BTCUSDT,1582329703404000,1582329703528147,2,9672.64,9672.12,0.916 -binance-futures,BTCUSDT,1582329703409000,1582329703533852,2,9672.63,9672.12,0.916 -binance-futures,BTCUSDT,1582329703421000,1582329703545012,0.011,9672.72,9672.12,0.916 -binance-futures,BTCUSDT,1582329703427000,1582329703554726,2.45,9672.64,9672.12,0.916 -binance-futures,BTCUSDT,1582329703431000,1582329703554749,0.031,9672.61,9672.12,0.916 -binance-futures,BTCUSDT,1582329703431000,1582329703560179,2,9672.59,9672.12,0.916 -binance-futures,BTCUSDT,1582329703445000,1582329703568613,0.031,9672.6,9672.12,0.916 -binance-futures,BTCUSDT,1582329703454000,1582329703580955,10,9672.55,9672.12,0.916 -binance-futures,BTCUSDT,1582329703461000,1582329703585862,10,9672.55,9672.08,0.012 -binance-futures,BTCUSDT,1582329703463000,1582329703586453,12,9672.55,9672.08,0.012 -binance-futures,BTCUSDT,1582329703471000,1582329703594632,4,9672.49,9672.08,0.012 -binance-futures,BTCUSDT,1582329703473000,1582329703597848,8,9672.49,9672.08,0.012 -binance-futures,BTCUSDT,1582329703477000,1582329703600219,10,9672.49,9672.08,0.012 -binance-futures,BTCUSDT,1582329703492000,1582329703614200,9.75,9672.49,9672.08,0.012 -binance-futures,BTCUSDT,1582329703494000,1582329703617554,2,9672.43,9672.08,0.012 -binance-futures,BTCUSDT,1582329703494000,1582329703617612,6,9672.43,9672.08,0.012 -binance-futures,BTCUSDT,1582329703500000,1582329703627214,0.117,9672.41,9672.08,0.012 -binance-futures,BTCUSDT,1582329703504000,1582329703630080,0.618,9671.8,9671.33,0.8 -binance-futures,BTCUSDT,1582329703507000,1582329703635770,0.928,9671.8,9671.33,0.8 -binance-futures,BTCUSDT,1582329703531000,1582329703656994,0.938,9671.8,9671.33,0.8 -binance-futures,BTCUSDT,1582329703543000,1582329703667336,0.32,9671.8,9671.33,0.8 -binance-futures,BTCUSDT,1582329703579000,1582329703700303,0.01,9671.8,9671.33,0.8 -binance-futures,BTCUSDT,1582329703610000,1582329703734312,0.1,9672.09,9671.33,0.8 -binance-futures,BTCUSDT,1582329703638000,1582329703762450,0.031,9672.05,9671.33,0.8 -binance-futures,BTCUSDT,1582329703657000,1582329703782397,0.031,9672.06,9671.33,0.8 -binance-futures,BTCUSDT,1582329703659000,1582329703782417,2.3,9672.07,9671.33,0.8 -binance-futures,BTCUSDT,1582329703661000,1582329703785474,2.3,9672.05,9671.33,0.8 -binance-futures,BTCUSDT,1582329703671000,1582329703794173,2.66,9672.05,9671.33,0.8 -binance-futures,BTCUSDT,1582329703684000,1582329703811919,0.031,9672.02,9671.33,0.8 -binance-futures,BTCUSDT,1582329703711000,1582329703833426,6.681,9672.02,9671.33,0.8 -binance-futures,BTCUSDT,1582329703737000,1582329703859351,0.011,9671.98,9671.33,0.8 -binance-futures,BTCUSDT,1582329703756000,1582329703878592,6.511,9671.98,9671.33,0.8 -binance-futures,BTCUSDT,1582329703779000,1582329703904719,2,9671.94,9671.33,0.8 -binance-futures,BTCUSDT,1582329703802000,1582329703923847,10.7,9671.94,9671.33,0.8 -binance-futures,BTCUSDT,1582329703808000,1582329703932313,0.031,9671.9,9671.33,0.8 -binance-futures,BTCUSDT,1582329703829000,1582329703950614,10.381,9671.9,9671.33,0.8 -binance-futures,BTCUSDT,1582329703833000,1582329703954848,0.031,9671.87,9671.33,0.8 -binance-futures,BTCUSDT,1582329703857000,1582329703977856,9.481,9671.87,9671.33,0.8 -binance-futures,BTCUSDT,1582329703881000,1582329704003354,0.011,9671.83,9671.33,0.8 -binance-futures,BTCUSDT,1582329703902000,1582329704025340,5.111,9671.83,9671.33,0.8 -binance-futures,BTCUSDT,1582329703918000,1582329704040143,0.011,9671.83,9671.33,0.8 -binance-futures,BTCUSDT,1582329703939000,1582329704062272,0.011,9671.83,9671.37,2 -binance-futures,BTCUSDT,1582329703945000,1582329704067977,0.031,9671.8,9671.37,2 -binance-futures,BTCUSDT,1582329703964000,1582329704086250,2.255,9672.47,9671.37,2 -binance-futures,BTCUSDT,1582329703966000,1582329704090574,2.35,9671.8,9671.37,2 -binance-futures,BTCUSDT,1582329703980000,1582329704101125,2.255,9672.47,9671.37,2 -binance-futures,BTCUSDT,1582329704014000,1582329704138548,2.255,9672.47,9671.38,0.439 -binance-futures,BTCUSDT,1582329704020000,1582329704141125,0.36,9672.45,9671.38,0.439 -binance-futures,BTCUSDT,1582329704041000,1582329704163808,7.06,9672.45,9671.38,0.439 -binance-futures,BTCUSDT,1582329704054000,1582329704176346,6.7,9672.45,9671.38,0.439 -binance-futures,BTCUSDT,1582329704057000,1582329704181552,0.36,9672.44,9671.38,0.439 -binance-futures,BTCUSDT,1582329704061000,1582329704184321,0.36,9672.44,9671.33,0.8 -binance-futures,BTCUSDT,1582329704067000,1582329704190231,0.031,9672.43,9671.33,0.8 -binance-futures,BTCUSDT,1582329704069000,1582329704191665,0.031,9672.41,9671.33,0.8 -binance-futures,BTCUSDT,1582329704088000,1582329704210805,9.481,9672.41,9671.33,0.8 -binance-futures,BTCUSDT,1582329704109000,1582329704230578,0.117,9672.4,9671.33,0.8 -binance-futures,BTCUSDT,1582329704130000,1582329704262077,10.617,9672.4,9671.33,0.8 -binance-futures,BTCUSDT,1582329704132000,1582329704262466,10.977,9672.4,9671.33,0.8 -binance-futures,BTCUSDT,1582329704140000,1582329704264659,0.011,9672.36,9671.33,0.8 -binance-futures,BTCUSDT,1582329704164000,1582329704289530,11.161,9672.36,9671.33,0.8 -binance-futures,BTCUSDT,1582329704168000,1582329704291267,0.117,9672.35,9671.33,0.8 -binance-futures,BTCUSDT,1582329704191000,1582329704346267,11.217,9672.35,9671.33,0.8 -binance-futures,BTCUSDT,1582329704241000,1582329704362584,11.577,9672.35,9671.33,0.8 -binance-futures,BTCUSDT,1582329704249000,1582329704373671,0.117,9672.31,9671.33,0.8 -binance-futures,BTCUSDT,1582329704252000,1582329704374446,0.148,9672.31,9671.33,0.8 -binance-futures,BTCUSDT,1582329704275000,1582329704396824,10.698,9672.31,9671.33,0.8 -binance-futures,BTCUSDT,1582329704281000,1582329704402683,10.581,9672.31,9671.33,0.8 -binance-futures,BTCUSDT,1582329704284000,1582329704407280,0.117,9672.28,9671.33,0.8 -binance-futures,BTCUSDT,1582329704305000,1582329704426851,11.167,9672.28,9671.33,0.8 -binance-futures,BTCUSDT,1582329704319000,1582329704440967,0.36,9672.27,9671.33,0.8 -binance-futures,BTCUSDT,1582329704344000,1582329704463858,0.011,9672.23,9671.33,0.8 -binance-futures,BTCUSDT,1582329704346000,1582329704467121,0.117,9672.22,9671.33,0.8 -binance-futures,BTCUSDT,1582329704367000,1582329704489344,0.031,9672.2,9671.33,0.8 -binance-futures,BTCUSDT,1582329704388000,1582329704529670,9.481,9672.2,9671.33,0.8 -binance-futures,BTCUSDT,1582329704393000,1582329704529835,0.031,9672.17,9671.33,0.8 -binance-futures,BTCUSDT,1582329704395000,1582329704535078,0.117,9672.16,9671.33,0.8 -binance-futures,BTCUSDT,1582329704434000,1582329704560956,10.098,9672.16,9671.33,0.19 -binance-futures,BTCUSDT,1582329704440000,1582329704563446,0.12,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329704446000,1582329704569232,0.13,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329704464000,1582329704588510,6.48,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329704477000,1582329704602077,0.13,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329704516000,1582329704638591,0.01,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329704524000,1582329704644145,8.4,9672.15,9671.31,0.04 -binance-futures,BTCUSDT,1582329704542000,1582329704665018,2,9672.11,9671.31,0.04 -binance-futures,BTCUSDT,1582329704547000,1582329704669893,0.36,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329704566000,1582329704690640,8.61,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329704627000,1582329704749303,8.71,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329704644000,1582329704767087,0.46,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329704722000,1582329704845115,0.1,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329704864000,1582329704986701,0.578,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329704882000,1582329705002720,0.1,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329705040000,1582329705160755,0.46,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329705101000,1582329705221533,0.938,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329705109000,1582329705235797,8.038,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329705113000,1582329705246494,7.56,9671.32,9671.31,0.04 -binance-futures,BTCUSDT,1582329705143000,1582329705284503,2.589,9670,9669.51,0.466 -binance-futures,BTCUSDT,1582329705174000,1582329705297210,8.589,9670,9669.51,0.466 -binance-futures,BTCUSDT,1582329705176000,1582329705297222,2,9669.94,9669.51,0.466 -binance-futures,BTCUSDT,1582329705179000,1582329705303441,6,9669.94,9669.51,0.466 -binance-futures,BTCUSDT,1582329705179000,1582329705305124,8,9669.94,9669.51,0.466 -binance-futures,BTCUSDT,1582329705185000,1582329705311269,8,9669.94,9669,0.5 -binance-futures,BTCUSDT,1582329705195000,1582329705343332,8.117,9669.94,9669,0.5 -binance-futures,BTCUSDT,1582329705195000,1582329705345225,2,9669.9,9669,0.5 -binance-futures,BTCUSDT,1582329705200000,1582329705354029,2,9669.88,9669,0.5 -binance-futures,BTCUSDT,1582329705202000,1582329705355175,4,9669.88,9669,0.5 -binance-futures,BTCUSDT,1582329705202000,1582329705356084,8,9669.88,9669,0.5 -binance-futures,BTCUSDT,1582329705204000,1582329705356661,10,9669.88,9669,0.5 -binance-futures,BTCUSDT,1582329705240000,1582329705363007,10,9669.88,9669.02,0.462 -binance-futures,BTCUSDT,1582329705242000,1582329705366529,10,9669.88,9669,0.5 -binance-futures,BTCUSDT,1582329705246000,1582329705371169,25.45,9669.88,9669,0.5 -binance-futures,BTCUSDT,1582329705256000,1582329705379426,21.45,9669.88,9669,0.5 -binance-futures,BTCUSDT,1582329705258000,1582329705386551,2,9669.87,9669,0.5 -binance-futures,BTCUSDT,1582329705268000,1582329705390101,0.031,9669.84,9669,0.5 -binance-futures,BTCUSDT,1582329705289000,1582329705413034,12.881,9669.84,9669,0.5 -binance-futures,BTCUSDT,1582329705293000,1582329705415630,12.881,9669.84,9669.01,0.434 -binance-futures,BTCUSDT,1582329705298000,1582329705420341,12.881,9669.84,9669,0.5 -binance-futures,BTCUSDT,1582329705319000,1582329705441092,0.117,9669.83,9669,0.5 -binance-futures,BTCUSDT,1582329705329000,1582329705453036,12.881,9669.84,9669,0.5 -binance-futures,BTCUSDT,1582329705338000,1582329705459212,12.95,9669.83,9669,0.5 -binance-futures,BTCUSDT,1582329705344000,1582329705463862,0.011,9669.79,9669,0.5 -binance-futures,BTCUSDT,1582329705362000,1582329705484870,13.061,9669.79,9669,0.5 -binance-futures,BTCUSDT,1582329705405000,1582329705529924,0.031,9669.75,9669,0.5 -binance-futures,BTCUSDT,1582329705422000,1582329705545334,0.031,9669.75,9669.01,0.444 -binance-futures,BTCUSDT,1582329705424000,1582329705547213,9.481,9669.75,9669.01,0.444 -binance-futures,BTCUSDT,1582329705430000,1582329705553633,0.031,9669.72,9669.01,0.444 -binance-futures,BTCUSDT,1582329705456000,1582329705576411,0.031,9669.69,9669.01,0.444 -binance-futures,BTCUSDT,1582329705464000,1582329705585924,0.031,9669.69,9669,0.5 -binance-futures,BTCUSDT,1582329705474000,1582329705595829,9.131,9669.69,9669,0.5 -binance-futures,BTCUSDT,1582329705487000,1582329705609467,9.131,9669.69,9669.45,0.001 -binance-futures,BTCUSDT,1582329705514000,1582329705641542,9.131,9669.69,9669.51,2 -binance-futures,BTCUSDT,1582329705518000,1582329705644324,0.477,9669.68,9669.51,2 -binance-futures,BTCUSDT,1582329705529000,1582329705651272,0.36,9669.68,9669.51,2 -binance-futures,BTCUSDT,1582329705543000,1582329705664551,7.66,9669.68,9669.51,2 -binance-futures,BTCUSDT,1582329705545000,1582329705666115,0.031,9669.64,9669.51,2 -binance-futures,BTCUSDT,1582329705564000,1582329705685429,8.631,9669.64,9669.51,2 -binance-futures,BTCUSDT,1582329705589000,1582329705710040,0.011,9669.61,9669.51,2 -binance-futures,BTCUSDT,1582329705589000,1582329705710304,0.031,9669.6,9669.51,2 -binance-futures,BTCUSDT,1582329705610000,1582329705732552,6.55,9669.6,9669.51,2 -binance-futures,BTCUSDT,1582329705665000,1582329705786666,2.589,9670,9669.51,2 -binance-futures,BTCUSDT,1582329705671000,1582329705792336,0.478,9669.94,9669.51,2 -binance-futures,BTCUSDT,1582329705685000,1582329705811001,2.589,9670,9669.51,2 -binance-futures,BTCUSDT,1582329705689000,1582329705811461,6.1,9669.94,9669.51,2 -binance-futures,BTCUSDT,1582329705815000,1582329705936371,2.589,9670,9669.51,2 -binance-futures,BTCUSDT,1582329706024000,1582329706148545,2.589,9670,9669.52,0.272 -binance-futures,BTCUSDT,1582329706049000,1582329706174330,2.589,9670,9669.58,2 -binance-futures,BTCUSDT,1582329706075000,1582329706198393,0.117,9669.96,9669.58,2 -binance-futures,BTCUSDT,1582329706086000,1582329706206606,2.589,9670,9669.58,2 -binance-futures,BTCUSDT,1582329706101000,1582329706223109,2.589,9670,9669.62,0.031 -binance-futures,BTCUSDT,1582329706104000,1582329706225745,2.589,9670,9669.64,2 -binance-futures,BTCUSDT,1582329706125000,1582329706248224,2.589,9670,9669.67,2 -binance-futures,BTCUSDT,1582329706128000,1582329706251458,2.589,9670,9669.67,4 -binance-futures,BTCUSDT,1582329706136000,1582329706259093,2.589,9670,9669.68,0.451 -binance-futures,BTCUSDT,1582329706145000,1582329706266809,2.589,9670,9669.73,2 -binance-futures,BTCUSDT,1582329706149000,1582329706272105,2.589,9670,9669.73,4 -binance-futures,BTCUSDT,1582329706164000,1582329706286760,2.589,9670,9669.75,2 -binance-futures,BTCUSDT,1582329706167000,1582329706288896,2.589,9670,9669.79,2 -binance-futures,BTCUSDT,1582329706169000,1582329706291388,2.589,9670,9669.79,4 -binance-futures,BTCUSDT,1582329706188000,1582329706309617,2.589,9670,9669.8,2 -binance-futures,BTCUSDT,1582329706192000,1582329706316903,2.589,9670,9669.85,2 -binance-futures,BTCUSDT,1582329706208000,1582329706340839,2.589,9670,9669.91,1 -binance-futures,BTCUSDT,1582329706237000,1582329706367803,2.589,9670,9669.95,2 -binance-futures,BTCUSDT,1582329706239000,1582329706368026,2.589,9670,9669.97,2 -binance-futures,BTCUSDT,1582329706243000,1582329706368906,2.589,9670,9669.97,2.456 -binance-futures,BTCUSDT,1582329706265000,1582329706389370,2.589,9670,9669.99,2 -binance-futures,BTCUSDT,1582329706267000,1582329706390796,2.589,9670,9669.99,4 -binance-futures,BTCUSDT,1582329706271000,1582329706396559,2.589,9670,9669.99,4.031 -binance-futures,BTCUSDT,1582329706286000,1582329706409807,2.589,9670,9669.99,4.131 -binance-futures,BTCUSDT,1582329706303000,1582329706426119,2.589,9670,9669.99,6.011 -binance-futures,BTCUSDT,1582329706372000,1582329706502939,2.589,9670,9669.99,4.011 -binance-futures,BTCUSDT,1582329706433000,1582329706553911,2.589,9670,9669.99,4.466 -binance-futures,BTCUSDT,1582329706505000,1582329706627505,2.589,9670,9669.99,4.011 -binance-futures,BTCUSDT,1582329706623000,1582329706743457,2.589,9670,9669.99,2.131 -binance-futures,BTCUSDT,1582329706640000,1582329706760402,2.589,9670,9669.99,2.562 -binance-futures,BTCUSDT,1582329706651000,1582329706771150,2.949,9670,9669.99,2.562 -binance-futures,BTCUSDT,1582329706675000,1582329706796325,2.949,9670,9669.99,2.131 -binance-futures,BTCUSDT,1582329706713000,1582329706833701,2.589,9670,9669.99,2.131 -binance-futures,BTCUSDT,1582329706729000,1582329706851930,2.589,9670,9669.99,2.031 -binance-futures,BTCUSDT,1582329706772000,1582329706898918,2.589,9670,9669.99,0.803 -binance-futures,BTCUSDT,1582329706793000,1582329706916194,12.489,9670,9669.99,0.803 -binance-futures,BTCUSDT,1582329706816000,1582329706936799,12.489,9670,9669.99,0.031 -binance-futures,BTCUSDT,1582329706874000,1582329706997163,12.489,9670,9669.93,1 -binance-futures,BTCUSDT,1582329706876000,1582329706999092,12.606,9670,9669.93,1 -binance-futures,BTCUSDT,1582329706878000,1582329706999109,13.677,9670,9669.93,1 -binance-futures,BTCUSDT,1582329706880000,1582329707001396,13.56,9670,9669.93,1 -binance-futures,BTCUSDT,1582329706883000,1582329707005083,23.199,9670,9669.93,1 -binance-futures,BTCUSDT,1582329706889000,1582329707008603,12.489,9670,9669.93,1 -binance-futures,BTCUSDT,1582329706895000,1582329707015085,2,9669.94,9669.93,1 -binance-futures,BTCUSDT,1582329706895000,1582329707015216,4,9669.94,9669.93,1 -binance-futures,BTCUSDT,1582329706897000,1582329707020216,8,9669.94,9669.52,0.272 -binance-futures,BTCUSDT,1582329706914000,1582329707033853,18.4,9669.94,9669.52,0.272 -binance-futures,BTCUSDT,1582329706914000,1582329707038525,14.4,9669.94,9669.52,0.272 -binance-futures,BTCUSDT,1582329706918000,1582329707041973,4,9669.92,9669.52,0.272 -binance-futures,BTCUSDT,1582329706920000,1582329707044316,8,9669.92,9669.52,0.272 -binance-futures,BTCUSDT,1582329706938000,1582329707060450,0.031,9669.9,9669.52,0.272 -binance-futures,BTCUSDT,1582329706941000,1582329707065320,6,9669.86,9669.52,0.272 -binance-futures,BTCUSDT,1582329706960000,1582329707078264,2,9669.8,9669.52,0.272 -binance-futures,BTCUSDT,1582329706962000,1582329707083688,4,9669.8,9669.52,0.272 -binance-futures,BTCUSDT,1582329706974000,1582329707095860,2,9669.8,9669.52,0.272 -binance-futures,BTCUSDT,1582329706978000,1582329707099764,2,9669.74,9669.52,0.272 -binance-futures,BTCUSDT,1582329706978000,1582329707102770,4,9669.74,9669.52,0.272 -binance-futures,BTCUSDT,1582329706980000,1582329707103460,4,9669.74,9669.45,0.001 -binance-futures,BTCUSDT,1582329706983000,1582329707105292,6,9669.74,9669.45,0.001 -binance-futures,BTCUSDT,1582329706987000,1582329707109085,8,9669.74,9669.45,0.001 -binance-futures,BTCUSDT,1582329706997000,1582329707118183,19.4,9669.74,9669.45,0.001 -binance-futures,BTCUSDT,1582329706998000,1582329707121484,17.4,9669.74,9669.45,0.001 -binance-futures,BTCUSDT,1582329707000000,1582329707122939,4,9669.68,9669.45,0.001 -binance-futures,BTCUSDT,1582329707002000,1582329707125174,10,9669.68,9669.45,0.001 -binance-futures,BTCUSDT,1582329707015000,1582329707135385,0.117,9669.67,9669.45,0.001 -binance-futures,BTCUSDT,1582329707021000,1582329707143644,2,9669.62,9669.45,0.001 -binance-futures,BTCUSDT,1582329707021000,1582329707146016,4,9669.62,9669.45,0.001 -binance-futures,BTCUSDT,1582329707023000,1582329707146052,8,9669.62,9669.45,0.001 -binance-futures,BTCUSDT,1582329707040000,1582329707164990,17.6,9669.62,9669.45,0.001 -binance-futures,BTCUSDT,1582329707045000,1582329707167786,2,9669.56,9669.45,0.001 -binance-futures,BTCUSDT,1582329707056000,1582329707176693,4,9669.56,9669.45,0.001 -binance-futures,BTCUSDT,1582329707068000,1582329707189539,2,9669.54,9669.45,0.001 -binance-futures,BTCUSDT,1582329707074000,1582329707197033,2.117,9669.54,9669.45,0.001 -binance-futures,BTCUSDT,1582329707074000,1582329707197046,2,9669.5,9669.45,0.001 -binance-futures,BTCUSDT,1582329707094000,1582329707217662,11.95,9669.5,9669.45,0.001 -binance-futures,BTCUSDT,1582329707098000,1582329707220419,2,9669.46,9669.45,0.001 -binance-futures,BTCUSDT,1582329707114000,1582329707235507,6,9669.46,9669.45,0.001 -binance-futures,BTCUSDT,1582329707116000,1582329707238112,8,9669.46,9669.45,0.001 -binance-futures,BTCUSDT,1582329707116000,1582329707238135,10,9669.46,9669.45,0.001 -binance-futures,BTCUSDT,1582329707120000,1582329707243104,22.631,9669.46,9669.45,0.001 -binance-futures,BTCUSDT,1582329707125000,1582329707247439,20.631,9669.46,9669.45,0.001 -binance-futures,BTCUSDT,1582329707129000,1582329707250847,18.631,9669.46,9669.45,0.001 -binance-futures,BTCUSDT,1582329707189000,1582329707316382,18.748,9669.46,9669.45,0.001 -binance-futures,BTCUSDT,1582329707198000,1582329707321451,18.631,9669.46,9669,0.5 -binance-futures,BTCUSDT,1582329707218000,1582329707339378,4,9669.4,9669,0.5 -binance-futures,BTCUSDT,1582329707222000,1582329707342415,6,9669.4,9669,0.5 -binance-futures,BTCUSDT,1582329707237000,1582329707361173,19.2,9669.4,9669,0.5 -binance-futures,BTCUSDT,1582329707245000,1582329707366823,2,9669.34,9669,0.5 -binance-futures,BTCUSDT,1582329707259000,1582329707416345,4,9669.34,9669,0.5 -binance-futures,BTCUSDT,1582329707266000,1582329707422378,4,9669.3,9669,0.5 -binance-futures,BTCUSDT,1582329707270000,1582329707422624,4.031,9669.3,9669,0.5 -binance-futures,BTCUSDT,1582329707287000,1582329707427127,4.031,9669.3,9669.06,2 -binance-futures,BTCUSDT,1582329707313000,1582329707439022,2.031,9669.3,9669.06,2 -binance-futures,BTCUSDT,1582329707318000,1582329707446039,15.531,9669.3,9669.06,2 -binance-futures,BTCUSDT,1582329707325000,1582329707453481,0.011,9669.26,9669.06,2 -binance-futures,BTCUSDT,1582329707350000,1582329707473129,10.211,9669.26,9669.06,2 -binance-futures,BTCUSDT,1582329707391000,1582329707514323,0.117,9669.24,9669.06,2 -binance-futures,BTCUSDT,1582329707424000,1582329707547843,9.65,9669.24,9669.06,2 -binance-futures,BTCUSDT,1582329707450000,1582329707571682,0.36,9669.22,9669.06,2 -binance-futures,BTCUSDT,1582329707467000,1582329707590801,10.16,9669.22,9669.06,2 -binance-futures,BTCUSDT,1582329707483000,1582329707604916,9.8,9669.22,9669.06,2 -binance-futures,BTCUSDT,1582329707528000,1582329707650794,9.8,9669.22,9669.07,0.431 -binance-futures,BTCUSDT,1582329707544000,1582329707666672,9.8,9669.22,9669.06,2 -binance-futures,BTCUSDT,1582329707546000,1582329707667119,0.1,9669.07,9669.06,2 -binance-futures,BTCUSDT,1582329707561000,1582329707681286,0.1,9669.07,9669,0.5 -binance-futures,BTCUSDT,1582329707564000,1582329707688819,9.9,9669.07,9669,0.5 -binance-futures,BTCUSDT,1582329707579000,1582329707702131,9.9,9669.07,9669.06,2 -binance-futures,BTCUSDT,1582329707581000,1582329707702139,10.017,9669.07,9669.06,2 -binance-futures,BTCUSDT,1582329707601000,1582329707723915,9.9,9669.07,9669.06,2 -binance-futures,BTCUSDT,1582329707608000,1582329707729959,10.017,9669.07,9669.06,2 -binance-futures,BTCUSDT,1582329707616000,1582329707734889,9.9,9669.07,9669.06,2 -binance-futures,BTCUSDT,1582329707637000,1582329707758097,10.26,9669.07,9669.06,2 -binance-futures,BTCUSDT,1582329707684000,1582329707804188,0.46,9669.07,9669.06,2 -binance-futures,BTCUSDT,1582329707743000,1582329707866282,0.376,9669.07,9669.06,2 -binance-futures,BTCUSDT,1582329707747000,1582329707867331,0.36,9669.07,9669.06,2 -binance-futures,BTCUSDT,1582329707770000,1582329707892928,1.334,9669.3,9669.06,2 -binance-futures,BTCUSDT,1582329707799000,1582329707919919,1.334,9669.3,9669.06,2.1 -binance-futures,BTCUSDT,1582329707823000,1582329707943784,1.334,9669.3,9669.12,2 -binance-futures,BTCUSDT,1582329707825000,1582329707945744,0.36,9669.28,9669.12,2 -binance-futures,BTCUSDT,1582329707845000,1582329707967981,4.61,9669.28,9669.12,2 -binance-futures,BTCUSDT,1582329707847000,1582329707969779,4.61,9669.28,9669.15,0.031 -binance-futures,BTCUSDT,1582329707847000,1582329707970485,4.61,9669.28,9669.16,0.031 -binance-futures,BTCUSDT,1582329707864000,1582329707984166,4.25,9669.28,9669.16,0.031 -binance-futures,BTCUSDT,1582329707868000,1582329707986851,4.25,9669.28,9669.21,2 -binance-futures,BTCUSDT,1582329707873000,1582329707996141,0.36,9669.27,9669.21,2 -binance-futures,BTCUSDT,1582329707896000,1582329708020204,0.36,9669.27,9669.25,0.031 -binance-futures,BTCUSDT,1582329707896000,1582329708020213,7.56,9669.27,9669.25,0.031 -binance-futures,BTCUSDT,1582329707919000,1582329708042955,7.56,9669.27,9669.26,2 -binance-futures,BTCUSDT,1582329707921000,1582329708043197,7.2,9669.27,9669.26,2 -binance-futures,BTCUSDT,1582329707939000,1582329708059874,1.334,9669.3,9669.26,2 -binance-futures,BTCUSDT,1582329707945000,1582329708066316,1.334,9669.3,9669.29,0.031 -binance-futures,BTCUSDT,1582329707967000,1582329708087922,1.334,9669.3,9669.29,2.031 -binance-futures,BTCUSDT,1582329708015000,1582329708138278,1.334,9669.3,9669.29,2.476 -binance-futures,BTCUSDT,1582329708029000,1582329708150825,1.334,9669.3,9669.29,2.031 -binance-futures,BTCUSDT,1582329708041000,1582329708166392,1.334,9669.3,9669.29,2.5 -binance-futures,BTCUSDT,1582329708079000,1582329708203448,1.332,9669.3,9669.29,2.5 -binance-futures,BTCUSDT,1582329708120000,1582329708241253,1.332,9669.3,9669.29,2.031 -binance-futures,BTCUSDT,1582329708130000,1582329708251547,1.332,9669.3,9669.29,2.459 -binance-futures,BTCUSDT,1582329708145000,1582329708267848,1.332,9669.3,9669.29,2.031 -binance-futures,BTCUSDT,1582329708171000,1582329708300832,1.332,9669.3,9669.29,2.503 -binance-futures,BTCUSDT,1582329708246000,1582329708400788,1.332,9669.3,9669.29,2.031 -binance-futures,BTCUSDT,1582329708284000,1582329708407114,1.692,9669.3,9669.29,2.031 -binance-futures,BTCUSDT,1582329708306000,1582329708429496,1.692,9669.3,9669.29,3.911 -binance-futures,BTCUSDT,1582329708321000,1582329708442933,1.692,9669.3,9669.29,2.031 -binance-futures,BTCUSDT,1582329708327000,1582329708453085,1.332,9669.3,9669.29,2.031 -binance-futures,BTCUSDT,1582329708329000,1582329708453823,1.332,9669.3,9669.29,2.474 -binance-futures,BTCUSDT,1582329708331000,1582329708454537,1.332,9669.3,9669.29,2.031 -binance-futures,BTCUSDT,1582329708337000,1582329708458140,1.449,9669.3,9669.29,2.031 -binance-futures,BTCUSDT,1582329708360000,1582329708480983,1.332,9669.3,9669.29,2.031 -binance-futures,BTCUSDT,1582329708370000,1582329708490928,1.332,9669.3,9669.29,2.115 -binance-futures,BTCUSDT,1582329708385000,1582329708505003,1.332,9669.3,9669.29,2.569 -binance-futures,BTCUSDT,1582329708404000,1582329708525922,1.332,9669.3,9669.29,2.115 -binance-futures,BTCUSDT,1582329708423000,1582329708545613,1.331,9669.3,9669.29,2.115 -binance-futures,BTCUSDT,1582329708433000,1582329708554848,1.331,9669.3,9669.29,3.995 -binance-futures,BTCUSDT,1582329708459000,1582329708579920,1.331,9669.3,9669.29,4.453 -binance-futures,BTCUSDT,1582329708465000,1582329708586125,1.331,9669.3,9669.29,3.995 -binance-futures,BTCUSDT,1582329708476000,1582329708595823,1.331,9669.3,9669.29,3.911 -binance-futures,BTCUSDT,1582329708483000,1582329708603554,1.331,9669.3,9669.29,2.031 -binance-futures,BTCUSDT,1582329708485000,1582329708607114,1.331,9669.3,9669.29,2.471 -binance-futures,BTCUSDT,1582329708500000,1582329708622151,1.331,9669.3,9669.29,2.031 -binance-futures,BTCUSDT,1582329708514000,1582329708634702,1.331,9669.3,9669.29,3.911 -binance-futures,BTCUSDT,1582329708520000,1582329708642242,1.448,9669.3,9669.29,3.911 -binance-futures,BTCUSDT,1582329708526000,1582329708648993,1.808,9669.3,9669.29,3.911 -binance-futures,BTCUSDT,1582329708531000,1582329708654313,1.808,9669.3,9669.29,2.031 -binance-futures,BTCUSDT,1582329708551000,1582329708676252,1.448,9669.3,9669.29,2.031 -binance-futures,BTCUSDT,1582329708554000,1582329708676862,1.448,9669.3,9669.29,2 -binance-futures,BTCUSDT,1582329708557000,1582329708679645,1.331,9669.3,9669.29,2 -binance-futures,BTCUSDT,1582329708568000,1582329708689415,1.331,9669.3,9669.29,2.084 -binance-futures,BTCUSDT,1582329708602000,1582329708722111,1.691,9669.3,9669.29,2.084 -binance-futures,BTCUSDT,1582329708617000,1582329708739718,1.808,9669.3,9669.29,2.084 -binance-futures,BTCUSDT,1582329708648000,1582329708770227,1.448,9669.3,9669.29,2.084 -binance-futures,BTCUSDT,1582329708670000,1582329708790820,1.331,9669.3,9669.29,2.084 -binance-futures,BTCUSDT,1582329708708000,1582329708828218,1.331,9669.3,9669.29,2.526 -binance-futures,BTCUSDT,1582329708967000,1582329709087178,1.331,9669.3,9669.29,2.084 -binance-futures,BTCUSDT,1582329709059000,1582329709182066,1.331,9669.3,9669.29,2.519 -binance-futures,BTCUSDT,1582329709065000,1582329709188343,4.331,9669.3,9669.29,2.519 -binance-futures,BTCUSDT,1582329709091000,1582329709211055,4.331,9669.3,9669.29,2.084 -binance-futures,BTCUSDT,1582329709133000,1582329709258614,1.331,9669.3,9669.29,2.084 -binance-futures,BTCUSDT,1582329709143000,1582329709264369,1.331,9669.3,9669.29,2.55 -binance-futures,BTCUSDT,1582329709150000,1582329709273653,1.331,9669.3,9669.29,2.084 -binance-futures,BTCUSDT,1582329709364000,1582329709484368,1.448,9669.3,9669.29,2.084 -binance-futures,BTCUSDT,1582329709385000,1582329709505431,1.331,9669.3,9669.29,2.084 -binance-futures,BTCUSDT,1582329709587000,1582329709716044,1.331,9669.3,9669,0.124 -binance-futures,BTCUSDT,1582329709607000,1582329709727814,1.25,9669.29,9669,0.124 -binance-futures,BTCUSDT,1582329709611000,1582329709732320,1.25,9669.29,9669.15,2 -binance-futures,BTCUSDT,1582329709626000,1582329709750892,0.288,9669.27,9669,0.124 -binance-futures,BTCUSDT,1582329709632000,1582329709755742,0.031,9669.25,9669,0.124 -binance-futures,BTCUSDT,1582329709642000,1582329709764419,0.031,9669.25,9669.16,0.467 -binance-futures,BTCUSDT,1582329709645000,1582329709765720,0.031,9669.25,9669.21,2 -binance-futures,BTCUSDT,1582329709651000,1582329709776431,0.031,9669.25,9669.21,1.876 -binance-futures,BTCUSDT,1582329709653000,1582329709777873,20.231,9669.25,9669.21,1.876 -binance-futures,BTCUSDT,1582329709656000,1582329709778826,20.519,9669.25,9669,0.124 -binance-futures,BTCUSDT,1582329709667000,1582329709791286,0.084,9669.01,9669,0.124 -binance-futures,BTCUSDT,1582329709678000,1582329709802686,0.084,9669.01,9668.48,0.661 -binance-futures,BTCUSDT,1582329709687000,1582329709808368,17.484,9669.01,9668.48,0.661 -binance-futures,BTCUSDT,1582329709699000,1582329709822315,17.484,9669.01,9668.66,0.47 -binance-futures,BTCUSDT,1582329709701000,1582329709823948,10.3,9669,9668.66,0.47 -binance-futures,BTCUSDT,1582329709705000,1582329709828428,10.3,9669,9668.48,0.661 -binance-futures,BTCUSDT,1582329709717000,1582329709839799,10.3,9669,9668.72,2 -binance-futures,BTCUSDT,1582329709721000,1582329709845460,19.2,9669,9668.72,1.53 -binance-futures,BTCUSDT,1582329709729000,1582329709852218,19.2,9669,9668.48,0.661 -binance-futures,BTCUSDT,1582329709738000,1582329709860457,19.2,9669,9668.78,2 -binance-futures,BTCUSDT,1582329709748000,1582329709870351,0.031,9668.96,9668.78,2 -binance-futures,BTCUSDT,1582329709751000,1582329709870510,0.031,9668.96,9668.48,0.661 -binance-futures,BTCUSDT,1582329709766000,1582329709886982,0.031,9668.96,9668.84,2 -binance-futures,BTCUSDT,1582329709768000,1582329709889390,14.881,9668.96,9668.84,2 -binance-futures,BTCUSDT,1582329709778000,1582329709897974,14.881,9668.96,9668.48,0.661 -binance-futures,BTCUSDT,1582329709781000,1582329709906603,14.821,9668.96,9668.48,0.661 -binance-futures,BTCUSDT,1582329709798000,1582329709918989,14.821,9668.96,9668.9,2 -binance-futures,BTCUSDT,1582329709801000,1582329709922724,0.011,9668.92,9668.9,2 -binance-futures,BTCUSDT,1582329709809000,1582329709928431,0.011,9668.92,9668.48,0.661 -binance-futures,BTCUSDT,1582329709819000,1582329709941332,11.311,9668.92,9668.48,0.661 -binance-futures,BTCUSDT,1582329709824000,1582329709944688,11.3,9668.92,9668.48,0.661 -binance-futures,BTCUSDT,1582329709827000,1582329709949130,11.3,9668.92,9668.91,2 -binance-futures,BTCUSDT,1582329709839000,1582329709960840,11.3,9668.92,9668.48,0.661 -binance-futures,BTCUSDT,1582329709840000,1582329709963301,11.3,9668.92,9668.49,1.88 -binance-futures,BTCUSDT,1582329709860000,1582329709979800,11.3,9668.92,9668.54,2 -binance-futures,BTCUSDT,1582329709876000,1582329710001913,11.152,9668.92,9668.54,2 -binance-futures,BTCUSDT,1582329709905000,1582329710024942,11.152,9668.92,9668.57,0.031 -binance-futures,BTCUSDT,1582329709908000,1582329710028239,11.152,9668.92,9668.58,0.031 -binance-futures,BTCUSDT,1582329709911000,1582329710033346,2.973,9669,9668.58,0.031 -binance-futures,BTCUSDT,1582329709924000,1582329710046268,2.973,9669,9668.63,2 -binance-futures,BTCUSDT,1582329709954000,1582329710076559,2.973,9669,9668.63,3.27 -binance-futures,BTCUSDT,1582329709957000,1582329710079220,2.973,9669,9668.63,3.94 -binance-futures,BTCUSDT,1582329709959000,1582329710082123,2.973,9669,9668.63,4.61 -binance-futures,BTCUSDT,1582329709979000,1582329710100065,2.973,9669,9668.67,0.031 -binance-futures,BTCUSDT,1582329710011000,1582329710132055,2.973,9669,9668.7,0.449 -binance-futures,BTCUSDT,1582329710035000,1582329710155191,2.973,9669,9668.74,0.031 -binance-futures,BTCUSDT,1582329710066000,1582329710188225,2.973,9669,9668.99,0.1 -binance-futures,BTCUSDT,1582329710093000,1582329710214766,2.973,9669,9668.99,2.438 -binance-futures,BTCUSDT,1582329710114000,1582329710233160,2.973,9669,9668.99,1.98 -binance-futures,BTCUSDT,1582329710142000,1582329710262158,3.261,9669,9668.99,1.98 -binance-futures,BTCUSDT,1582329710168000,1582329710289180,2.973,9669,9668.99,1.98 -binance-futures,BTCUSDT,1582329710245000,1582329710385629,2.973,9669,9668,0.1 -binance-futures,BTCUSDT,1582329710265000,1582329710391947,6.95,9668.99,9668.56,1.79 -binance-futures,BTCUSDT,1582329710286000,1582329710408023,6.95,9668.99,9668.59,0.309 -binance-futures,BTCUSDT,1582329710288000,1582329710414309,10.25,9668.99,9668.38,1.79 -binance-futures,BTCUSDT,1582329710296000,1582329710416632,10.25,9668.99,9668.03,0.309 -binance-futures,BTCUSDT,1582329710299000,1582329710420381,10.25,9668.99,9668,0.1 -binance-futures,BTCUSDT,1582329710303000,1582329710424320,10.25,9668.99,9668.3,0.309 -binance-futures,BTCUSDT,1582329710305000,1582329710427523,6.95,9668.99,9668.3,0.309 -binance-futures,BTCUSDT,1582329710308000,1582329710432639,6.95,9668.99,9668.01,0.71 -binance-futures,BTCUSDT,1582329710310000,1582329710434814,6.95,9668.99,9668.57,0.309 -binance-futures,BTCUSDT,1582329710310000,1582329710435144,6.95,9668.99,9668.57,0.979 -binance-futures,BTCUSDT,1582329710316000,1582329710439481,6.95,9668.99,9668.57,1.689 -binance-futures,BTCUSDT,1582329710321000,1582329710446129,6.95,9668.99,9668.57,1.94 -binance-futures,BTCUSDT,1582329710323000,1582329710446529,6.95,9668.99,9668.57,2.61 -binance-futures,BTCUSDT,1582329710333000,1582329710457119,0.44,9668.98,9668.57,2.61 -binance-futures,BTCUSDT,1582329710343000,1582329710494955,0.44,9668.98,9668.57,1.94 -binance-futures,BTCUSDT,1582329710345000,1582329710501148,6.95,9668.99,9668.58,1.79 -binance-futures,BTCUSDT,1582329710355000,1582329710501490,7.3,9668.98,9668.58,1.79 -binance-futures,BTCUSDT,1582329710364000,1582329710501662,7.753,9668.98,9668.58,1.79 -binance-futures,BTCUSDT,1582329710375000,1582329710501755,7.3,9668.98,9668.58,1.79 -binance-futures,BTCUSDT,1582329710394000,1582329710517218,7.3,9668.98,9668.6,0.031 -binance-futures,BTCUSDT,1582329710396000,1582329710518798,0.454,9668.97,9668.61,0.031 -binance-futures,BTCUSDT,1582329710416000,1582329710536763,7.154,9668.97,9668.61,0.031 -binance-futures,BTCUSDT,1582329710422000,1582329710541270,6.7,9668.97,9668.61,0.031 -binance-futures,BTCUSDT,1582329710429000,1582329710548399,7.3,9668.98,9668.61,0.031 -binance-futures,BTCUSDT,1582329710432000,1582329710553060,2.973,9669,9668.61,0.031 -binance-futures,BTCUSDT,1582329710444000,1582329710567515,2.973,9669,9668.62,0.031 -binance-futures,BTCUSDT,1582329710617000,1582329710738069,2.973,9669,9668.62,0.34 -binance-futures,BTCUSDT,1582329710625000,1582329710747721,2.973,9669,9668.68,2 -binance-futures,BTCUSDT,1582329710654000,1582329710775534,2.973,9669,9668.69,0.309 -binance-futures,BTCUSDT,1582329710661000,1582329710781179,2.973,9669,9668.68,2 -binance-futures,BTCUSDT,1582329710670000,1582329710791734,2.973,9669,9668.66,0.031 -binance-futures,BTCUSDT,1582329710672000,1582329710792814,2.973,9669,9668.75,2 -binance-futures,BTCUSDT,1582329710685000,1582329710806053,2.973,9669,9668.67,0.309 -binance-futures,BTCUSDT,1582329710693000,1582329710816824,2.973,9669,9668.69,0.031 -binance-futures,BTCUSDT,1582329710701000,1582329710825683,2.973,9669,9668.73,0.309 -binance-futures,BTCUSDT,1582329710704000,1582329710825703,2.973,9669,9668.81,2 -binance-futures,BTCUSDT,1582329710719000,1582329710839668,2.973,9669,9668.69,0.031 -binance-futures,BTCUSDT,1582329710728000,1582329710851649,2.973,9669,9668.57,0.309 -binance-futures,BTCUSDT,1582329710735000,1582329710855656,2.973,9669,9668.82,0.309 -binance-futures,BTCUSDT,1582329710735000,1582329710856737,2.973,9669,9668.87,2 -binance-futures,BTCUSDT,1582329710746000,1582329710867398,2.973,9669,9668.82,0.309 -binance-futures,BTCUSDT,1582329710750000,1582329710872545,2.973,9669,9668.72,0.031 -binance-futures,BTCUSDT,1582329710759000,1582329710884103,2.973,9669,9668.09,0.309 -binance-futures,BTCUSDT,1582329710759000,1582329710884117,2.973,9669,9668.73,0.031 -binance-futures,BTCUSDT,1582329710766000,1582329710887312,2.973,9669,9668.93,2 -binance-futures,BTCUSDT,1582329710778000,1582329710900070,2.973,9669,9668.73,0.031 -binance-futures,BTCUSDT,1582329710786000,1582329710909379,2.973,9669,9668.04,0.031 -binance-futures,BTCUSDT,1582329710792000,1582329710916051,2.973,9669,9668.94,0.67 -binance-futures,BTCUSDT,1582329710793000,1582329710916383,2.973,9669,9668.94,1.38 -binance-futures,BTCUSDT,1582329710797000,1582329710919122,2.973,9669,9668.99,2 -binance-futures,BTCUSDT,1582329710805000,1582329710924624,2.973,9669,9668.94,2.61 -binance-futures,BTCUSDT,1582329710818000,1582329710941604,2.973,9669,9668.94,1.9 -binance-futures,BTCUSDT,1582329710819000,1582329710941634,2.973,9669,9668.94,1.34 -binance-futures,BTCUSDT,1582329710823000,1582329710946651,2.973,9669,9668.94,0.67 -binance-futures,BTCUSDT,1582329710842000,1582329710963831,2.973,9669,9668.98,0.031 -binance-futures,BTCUSDT,1582329710874000,1582329710993682,2.973,9669,9668.99,2 -binance-futures,BTCUSDT,1582329711041000,1582329711161854,3.443,9669,9668.99,2 -binance-futures,BTCUSDT,1582329711077000,1582329711196776,3.885,9669,9668.99,2 -binance-futures,BTCUSDT,1582329711081000,1582329711202071,3.415,9669,9668.99,2 -binance-futures,BTCUSDT,1582329711153000,1582329711299378,2.973,9669,9668.99,2 -binance-futures,BTCUSDT,1582329711196000,1582329711315926,3.073,9669,9668.99,2 -binance-futures,BTCUSDT,1582329711493000,1582329711614755,3.433,9669,9668.99,2 -binance-futures,BTCUSDT,1582329711620000,1582329711738960,3.433,9669,9668.99,2.1 -binance-futures,BTCUSDT,1582329711641000,1582329711760811,3.891,9669,9668.99,2.1 -binance-futures,BTCUSDT,1582329711837000,1582329711958652,3.433,9669,9668.99,2.1 -binance-futures,BTCUSDT,1582329711855000,1582329711980448,3.433,9669,9668.99,2 -binance-futures,BTCUSDT,1582329711877000,1582329711998988,3.898,9669,9668.99,2 -binance-futures,BTCUSDT,1582329711924000,1582329712045515,3.898,9669,9668.99,1.9 -binance-futures,BTCUSDT,1582329712033000,1582329712151152,8.348,9669,9668.99,1.9 -binance-futures,BTCUSDT,1582329712052000,1582329712172792,8.348,9669,9668.99,1.687 -binance-futures,BTCUSDT,1582329712069000,1582329712188136,0.213,9668.99,9668,0.1 -binance-futures,BTCUSDT,1582329712085000,1582329712211644,1.687,9668.99,9668,0.1 -binance-futures,BTCUSDT,1582329712087000,1582329712212376,2,9668.96,9668,0.1 -binance-futures,BTCUSDT,1582329712111000,1582329712243844,16.4,9668.96,9668,0.1 -binance-futures,BTCUSDT,1582329712123000,1582329712255616,0.02,9667.94,9667.6,0.309 -binance-futures,BTCUSDT,1582329712127000,1582329712255655,0.02,9667.94,9667.71,0.309 -binance-futures,BTCUSDT,1582329712129000,1582329712255716,0.03,9667.94,9667.71,0.309 -binance-futures,BTCUSDT,1582329712132000,1582329712255737,0.79,9667.94,9667.71,0.309 -binance-futures,BTCUSDT,1582329712145000,1582329712264856,0.79,9667.94,9667.77,0.309 -binance-futures,BTCUSDT,1582329712150000,1582329712273894,11.24,9667.94,9667.77,0.309 -binance-futures,BTCUSDT,1582329712150000,1582329712274154,11.24,9667.94,9666.66,4.604 -binance-futures,BTCUSDT,1582329712158000,1582329712281518,11.23,9667.94,9666.66,4.604 -binance-futures,BTCUSDT,1582329712170000,1582329712296716,0.47,9667.93,9667.83,2 -binance-futures,BTCUSDT,1582329712183000,1582329712327271,0.47,9667.93,9666.66,4.295 -binance-futures,BTCUSDT,1582329712185000,1582329712331891,0.76,9667.94,9666.66,4.295 -binance-futures,BTCUSDT,1582329712190000,1582329712332358,0.76,9667.94,9666.68,0.309 -binance-futures,BTCUSDT,1582329712196000,1582329712332386,3,9667.93,9666.68,0.309 -binance-futures,BTCUSDT,1582329712231000,1582329712353742,6.75,9667.93,9666.68,0.309 -binance-futures,BTCUSDT,1582329712233000,1582329712355441,0.36,9667.92,9666.68,0.309 -binance-futures,BTCUSDT,1582329712239000,1582329712361537,0.36,9667.92,9666.72,0.031 -binance-futures,BTCUSDT,1582329712251000,1582329712374195,0.466,9667.89,9666.72,0.031 -binance-futures,BTCUSDT,1582329712257000,1582329712377658,0.466,9667.89,9666.66,4.295 -binance-futures,BTCUSDT,1582329712261000,1582329712380372,6.76,9667.92,9666.66,4.295 -binance-futures,BTCUSDT,1582329712265000,1582329712386694,6.481,9667.92,9666.66,4.295 -binance-futures,BTCUSDT,1582329712269000,1582329712388822,6.481,9667.92,9666.68,0.309 -binance-futures,BTCUSDT,1582329712272000,1582329712392249,6.5,9667.89,9666.7,0.309 -binance-futures,BTCUSDT,1582329712291000,1582329712411614,6.5,9667.89,9666.71,0.031 -binance-futures,BTCUSDT,1582329712295000,1582329712415017,6.5,9667.89,9666.72,0.031 -binance-futures,BTCUSDT,1582329712301000,1582329712423340,0.457,9668.26,9666.72,0.031 -binance-futures,BTCUSDT,1582329712310000,1582329712432349,2.59,9668.71,9666.72,0.031 -binance-futures,BTCUSDT,1582329712317000,1582329712437850,2,9668.58,9666.77,0.309 -binance-futures,BTCUSDT,1582329712322000,1582329712443644,8.9,9668.26,9666.77,0.309 -binance-futures,BTCUSDT,1582329712341000,1582329712464244,8.9,9668.26,9666.81,0.031 -binance-futures,BTCUSDT,1582329712341000,1582329712464461,11.55,9668.26,9666.81,0.031 -binance-futures,BTCUSDT,1582329712352000,1582329712474736,8.9,9668.26,9666.81,0.031 -binance-futures,BTCUSDT,1582329712361000,1582329712481287,0.458,9668.25,9666.81,0.031 -binance-futures,BTCUSDT,1582329712370000,1582329712491708,8.9,9668.26,9666.81,0.031 -binance-futures,BTCUSDT,1582329712382000,1582329712504347,7.6,9668.25,9666.81,0.031 -binance-futures,BTCUSDT,1582329712390000,1582329712511421,8.045,9668.25,9666.81,0.031 -binance-futures,BTCUSDT,1582329712393000,1582329712514012,8.045,9668.25,9668.02,0.031 -binance-futures,BTCUSDT,1582329712402000,1582329712523966,10.395,9668.25,9668.02,0.031 -binance-futures,BTCUSDT,1582329712409000,1582329712535649,9.95,9668.25,9668.02,0.031 -binance-futures,BTCUSDT,1582329712412000,1582329712537041,0.448,9668.21,9668.02,0.031 -binance-futures,BTCUSDT,1582329712412000,1582329712540303,4,9668.19,9668.02,0.031 -binance-futures,BTCUSDT,1582329712415000,1582329712540344,6,9668.19,9666.66,4.295 -binance-futures,BTCUSDT,1582329712434000,1582329712559669,4,9668.19,9666.66,4.295 -binance-futures,BTCUSDT,1582329712438000,1582329712560654,2,9668.13,9666.66,4.295 -binance-futures,BTCUSDT,1582329712441000,1582329712565314,2,9668.13,9666.66,2.295 -binance-futures,BTCUSDT,1582329712456000,1582329712576700,10,9668.13,9666.66,2.295 -binance-futures,BTCUSDT,1582329712458000,1582329712580383,8,9668.13,9666.66,2.295 -binance-futures,BTCUSDT,1582329712462000,1582329712584650,8,9668.13,9666.7,0.031 -binance-futures,BTCUSDT,1582329712464000,1582329712588352,15.8,9668.13,9666.7,0.031 -binance-futures,BTCUSDT,1582329712468000,1582329712591368,0.455,9667.97,9666.7,0.031 -binance-futures,BTCUSDT,1582329712483000,1582329712603810,0.455,9667.97,9666.66,2.295 -binance-futures,BTCUSDT,1582329712487000,1582329712607617,12.355,9667.97,9666.66,2.295 -binance-futures,BTCUSDT,1582329712514000,1582329712647935,0.438,9667.72,9666.66,2.295 -binance-futures,BTCUSDT,1582329712545000,1582329712665804,9.488,9667.72,9666.66,2.295 -binance-futures,BTCUSDT,1582329712552000,1582329712672981,9.488,9667.72,9666.68,0.031 -binance-futures,BTCUSDT,1582329712554000,1582329712672988,9.488,9667.72,9666.7,0.031 -binance-futures,BTCUSDT,1582329712566000,1582329712689104,9.05,9667.72,9666.7,0.031 -binance-futures,BTCUSDT,1582329712568000,1582329712689143,0.47,9667.57,9666.7,0.031 -binance-futures,BTCUSDT,1582329712574000,1582329712693936,0.469,9667.57,9666.7,0.031 -binance-futures,BTCUSDT,1582329712575000,1582329712696350,9.05,9667.72,9666.7,0.031 -binance-futures,BTCUSDT,1582329712587000,1582329712707304,7.65,9667.57,9666.7,0.031 -binance-futures,BTCUSDT,1582329712598000,1582329712719078,7.65,9667.57,9666.71,0.031 -binance-futures,BTCUSDT,1582329712619000,1582329712740844,0.08,9667.55,9666.71,0.031 -binance-futures,BTCUSDT,1582329712642000,1582329712762229,4.73,9667.55,9666.71,0.031 -binance-futures,BTCUSDT,1582329712655000,1582329712774729,4.73,9667.55,9666.72,0.31 -binance-futures,BTCUSDT,1582329712659000,1582329712781371,4.73,9667.55,9666.72,0.341 -binance-futures,BTCUSDT,1582329712660000,1582329712781382,4.65,9667.55,9666.72,0.341 -binance-futures,BTCUSDT,1582329712678000,1582329712799981,4.65,9667.55,9666.76,0.031 -binance-futures,BTCUSDT,1582329712689000,1582329712809441,4.65,9667.55,9666.76,0.341 -binance-futures,BTCUSDT,1582329712691000,1582329712811866,0.478,9667.6,9666.76,0.341 -binance-futures,BTCUSDT,1582329712696000,1582329712815351,0.478,9667.6,9666.76,0.031 -binance-futures,BTCUSDT,1582329712705000,1582329712823854,3.398,9668.27,9666.76,0.031 -binance-futures,BTCUSDT,1582329712716000,1582329712838909,0.08,9667.53,9666.76,0.031 -binance-futures,BTCUSDT,1582329712716000,1582329712839628,0.08,9667.53,9666.78,0.31 -binance-futures,BTCUSDT,1582329712758000,1582329712880362,0.478,9667.98,9666.78,0.31 -binance-futures,BTCUSDT,1582329712760000,1582329712881297,0.478,9667.98,9666.82,0.031 -binance-futures,BTCUSDT,1582329712778000,1582329712901472,4.678,9667.98,9666.82,0.031 -binance-futures,BTCUSDT,1582329712782000,1582329712904794,4.2,9667.98,9666.82,0.031 -binance-futures,BTCUSDT,1582329712791000,1582329712913317,0.439,9667.71,9666.82,0.031 -binance-futures,BTCUSDT,1582329712800000,1582329712920694,0.478,9668,9666.82,0.031 -binance-futures,BTCUSDT,1582329712807000,1582329712929462,0.478,9668,9666.85,0.031 -binance-futures,BTCUSDT,1582329712813000,1582329712936228,3.398,9668.27,9666.85,0.031 -binance-futures,BTCUSDT,1582329712828000,1582329712948844,0.478,9668,9666.85,0.031 -binance-futures,BTCUSDT,1582329712830000,1582329712951759,0.478,9668,9666.85,0.341 -binance-futures,BTCUSDT,1582329712833000,1582329712954657,0.478,9668,9666.85,0.031 -binance-futures,BTCUSDT,1582329712835000,1582329712959265,0.478,9668,9666.87,0.31 -binance-futures,BTCUSDT,1582329712841000,1582329712962731,3.398,9668.27,9666.87,0.31 -binance-futures,BTCUSDT,1582329712846000,1582329712965495,2.4,9668,9666.87,0.31 -binance-futures,BTCUSDT,1582329712854000,1582329712978105,0.478,9667.99,9666.87,0.31 -binance-futures,BTCUSDT,1582329712856000,1582329712979334,0.478,9667.99,9666.89,0.031 -binance-futures,BTCUSDT,1582329712879000,1582329712999284,3.398,9668.27,9666.89,0.031 -binance-futures,BTCUSDT,1582329712886000,1582329713006768,3.398,9668.27,9666.94,0.31 -binance-futures,BTCUSDT,1582329712900000,1582329713019620,0.478,9668,9666.94,0.31 -binance-futures,BTCUSDT,1582329712922000,1582329713042875,3.398,9668.27,9666.94,0.31 -binance-futures,BTCUSDT,1582329712943000,1582329713067838,0.478,9668.26,9666.94,0.31 -binance-futures,BTCUSDT,1582329712966000,1582329713089680,0.478,9668.26,9666.96,0.031 -binance-futures,BTCUSDT,1582329712968000,1582329713095470,4.128,9668.26,9666.98,0.031 -binance-futures,BTCUSDT,1582329712992000,1582329713117968,0.478,9668.26,9666.98,0.031 -binance-futures,BTCUSDT,1582329712994000,1582329713119956,3.398,9668.27,9666.98,0.031 -binance-futures,BTCUSDT,1582329713012000,1582329713132173,0.478,9668.25,9666.98,0.031 -binance-futures,BTCUSDT,1582329713017000,1582329713138141,0.478,9668.25,9666.99,0.031 -binance-futures,BTCUSDT,1582329713029000,1582329713149469,2.45,9668.25,9666.99,0.031 -binance-futures,BTCUSDT,1582329713033000,1582329713154326,2.45,9668.25,9666.99,0.062 -binance-futures,BTCUSDT,1582329713042000,1582329713162389,3.398,9668.27,9666.99,0.062 -binance-futures,BTCUSDT,1582329713047000,1582329713167793,3.398,9668.27,9666.99,0.372 -binance-futures,BTCUSDT,1582329713070000,1582329713192273,3.398,9668.27,9667,0.031 -binance-futures,BTCUSDT,1582329713072000,1582329713193969,3.398,9668.27,9667.03,0.31 -binance-futures,BTCUSDT,1582329713094000,1582329713215160,3.398,9668.27,9667.03,0.341 -binance-futures,BTCUSDT,1582329713121000,1582329713245649,3.398,9668.27,9667.09,0.31 -binance-futures,BTCUSDT,1582329713149000,1582329713273748,3.398,9668.27,9667.12,0.031 -binance-futures,BTCUSDT,1582329713168000,1582329713298310,3.398,9668.27,9667.13,0.031 -binance-futures,BTCUSDT,1582329713189000,1582329713331277,3.6,9668.26,9667.13,0.031 -binance-futures,BTCUSDT,1582329713198000,1582329713345878,3.6,9668.26,9667.14,0.031 -binance-futures,BTCUSDT,1582329713198000,1582329713346523,3.6,9668.26,9667.16,0.031 -binance-futures,BTCUSDT,1582329713203000,1582329713347231,4.031,9668.26,9667.16,0.031 -binance-futures,BTCUSDT,1582329713232000,1582329713353166,4.031,9668.26,9667.15,0.031 -binance-futures,BTCUSDT,1582329713234000,1582329713355358,0.435,9668.19,9666.73,5.977 -binance-futures,BTCUSDT,1582329713248000,1582329713369903,0.435,9668.19,9666.73,5.677 -binance-futures,BTCUSDT,1582329713252000,1582329713372520,4.585,9668.19,9666.73,5.677 -binance-futures,BTCUSDT,1582329713271000,1582329713393425,4.585,9668.19,9666.77,0.031 -binance-futures,BTCUSDT,1582329713276000,1582329713399180,0.436,9668.17,9666.77,0.031 -binance-futures,BTCUSDT,1582329713295000,1582329713417669,0.436,9668.17,9666.75,0.031 -binance-futures,BTCUSDT,1582329713297000,1582329713419081,4.536,9668.17,9666.74,0.189 -binance-futures,BTCUSDT,1582329713314000,1582329713433802,4.536,9668.17,9666.76,0.189 -binance-futures,BTCUSDT,1582329713323000,1582329713444086,0.457,9668.14,9666.73,5.677 -binance-futures,BTCUSDT,1582329713340000,1582329713459602,6.257,9668.14,9666.73,5.677 -binance-futures,BTCUSDT,1582329713357000,1582329713478388,6.257,9668.14,9666.74,0.189 -binance-futures,BTCUSDT,1582329713379000,1582329713498016,0.457,9668.14,9666.74,0.189 -binance-futures,BTCUSDT,1582329713400000,1582329713519700,3.398,9668.27,9666.74,0.189 -binance-futures,BTCUSDT,1582329713437000,1582329713557677,0.461,9668.26,9666.74,0.189 -binance-futures,BTCUSDT,1582329713455000,1582329713573880,6.111,9668.26,9666.74,0.189 -binance-futures,BTCUSDT,1582329713473000,1582329713594785,6.111,9668.26,9666.73,5.677 -binance-futures,BTCUSDT,1582329713479000,1582329713600916,0.471,9668.21,9666.73,5.677 -binance-futures,BTCUSDT,1582329713500000,1582329713619762,5.921,9668.21,9666.73,5.677 -binance-futures,BTCUSDT,1582329713526000,1582329713651641,5.45,9668.21,9666.73,5.677 -binance-futures,BTCUSDT,1582329713528000,1582329713652270,0.467,9668.14,9666.73,5.677 -binance-futures,BTCUSDT,1582329713790000,1582329713912533,0.467,9668.14,9666.74,1.79 -binance-futures,BTCUSDT,1582329713799000,1582329713918065,0.467,9668.14,9666.76,0.031 -binance-futures,BTCUSDT,1582329713799000,1582329713918100,0.467,9668.14,9666.77,0.031 -binance-futures,BTCUSDT,1582329713823000,1582329713942845,3.398,9668.27,9666.77,0.031 -binance-futures,BTCUSDT,1582329713831000,1582329713951339,3.398,9668.27,9666.79,0.189 -binance-futures,BTCUSDT,1582329713844000,1582329713965122,3.398,9668.27,9666.79,0.22 -binance-futures,BTCUSDT,1582329713851000,1582329713973915,3.398,9668.27,9666.79,3.12 -binance-futures,BTCUSDT,1582329713864000,1582329713982643,3.398,9668.27,9666.79,0.22 -binance-futures,BTCUSDT,1582329713871000,1582329713993768,3.398,9668.27,9666.84,0.189 -binance-futures,BTCUSDT,1582329714006000,1582329714126685,3.398,9668.27,9666.87,0.031 -binance-futures,BTCUSDT,1582329714006000,1582329714126694,3.398,9668.27,9666.88,0.031 -binance-futures,BTCUSDT,1582329714038000,1582329714158734,3.398,9668.27,9666.91,0.189 -binance-futures,BTCUSDT,1582329714061000,1582329714184404,3.398,9668.27,9666.94,0.031 -binance-futures,BTCUSDT,1582329714062000,1582329714184484,3.398,9668.27,9666.95,0.031 -binance-futures,BTCUSDT,1582329714225000,1582329714438560,3.398,9668.27,9666.96,0.189 -binance-futures,BTCUSDT,1582329714338000,1582329714458011,3.398,9668.27,9666.96,0.22 -binance-futures,BTCUSDT,1582329714343000,1582329714463013,3.398,9668.27,9666.96,0.88 -binance-futures,BTCUSDT,1582329714348000,1582329714469744,3.398,9668.27,9666.96,2.26 -binance-futures,BTCUSDT,1582329714355000,1582329714473655,3.398,9668.27,9666.96,2.93 -binance-futures,BTCUSDT,1582329714360000,1582329714480447,3.398,9668.27,9667,0.031 -binance-futures,BTCUSDT,1582329714388000,1582329714509327,3.398,9668.27,9667.01,0.189 -binance-futures,BTCUSDT,1582329714412000,1582329714533956,3.398,9668.27,9667.05,0.031 -binance-futures,BTCUSDT,1582329714505000,1582329714627541,0.448,9668.26,9667.05,0.031 -binance-futures,BTCUSDT,1582329714508000,1582329714631867,0.448,9668.26,9667.86,0.189 -binance-futures,BTCUSDT,1582329714513000,1582329714635049,3.398,9668.27,9667.86,1.26 -binance-futures,BTCUSDT,1582329714533000,1582329714655632,3.398,9668.27,9667.92,2 -binance-futures,BTCUSDT,1582329714550000,1582329714678814,3.398,9668.27,9668.26,0.189 -binance-futures,BTCUSDT,1582329714552000,1582329714678840,3.398,9668.27,9668.26,1.26 -binance-futures,BTCUSDT,1582329714561000,1582329714681859,3.398,9668.27,9668.26,1.071 -binance-futures,BTCUSDT,1582329714567000,1582329714687834,3.398,9668.27,9667.93,1.38 -binance-futures,BTCUSDT,1582329714569000,1582329714689549,3.398,9668.27,9667.93,1.569 -binance-futures,BTCUSDT,1582329714571000,1582329714691999,3.398,9668.27,9667.93,2.229 -binance-futures,BTCUSDT,1582329714578000,1582329714701291,3.398,9668.27,9667.93,2.04 -binance-futures,BTCUSDT,1582329714582000,1582329714704776,3.398,9668.27,9667.93,2.71 -binance-futures,BTCUSDT,1582329714586000,1582329714708456,3.398,9668.27,9667.99,2 -binance-futures,BTCUSDT,1582329714635000,1582329714756324,0.458,9668.26,9667.99,2 -binance-futures,BTCUSDT,1582329714641000,1582329714761633,0.458,9668.26,9668.01,0.031 -binance-futures,BTCUSDT,1582329714641000,1582329714761642,0.458,9668.26,9668.03,0.031 -binance-futures,BTCUSDT,1582329714660000,1582329714779111,0.458,9668.26,9668.07,2 -binance-futures,BTCUSDT,1582329714665000,1582329714784422,3.398,9668.27,9668.07,2 -binance-futures,BTCUSDT,1582329714688000,1582329714810221,3.398,9668.27,9668.1,0.031 -binance-futures,BTCUSDT,1582329714689000,1582329714811014,3.398,9668.27,9668.11,0.031 -binance-futures,BTCUSDT,1582329714742000,1582329714863835,3.398,9668.27,9666.77,0.1 -binance-futures,BTCUSDT,1582329714752000,1582329714874854,3.398,9668.27,9668.13,2 -binance-futures,BTCUSDT,1582329714763000,1582329714888462,3.398,9668.27,9666.77,0.1 -binance-futures,BTCUSDT,1582329714773000,1582329714893350,3.398,9668.27,9666.78,0.189 -binance-futures,BTCUSDT,1582329714784000,1582329714905224,3.398,9668.27,9668.19,2 -binance-futures,BTCUSDT,1582329714796000,1582329714924080,3.398,9668.27,9666.81,0.031 -binance-futures,BTCUSDT,1582329714799000,1582329714924243,0.1,9668.12,9666.82,0.031 -binance-futures,BTCUSDT,1582329714820000,1582329714941773,5.7,9668.12,9666.82,0.031 -binance-futures,BTCUSDT,1582329714854000,1582329714975638,0.472,9668.11,9666.84,0.031 -binance-futures,BTCUSDT,1582329714875000,1582329714997421,6.222,9668.11,9666.84,0.031 -binance-futures,BTCUSDT,1582329714877000,1582329714999442,6.222,9668.11,9666.83,0.031 -binance-futures,BTCUSDT,1582329714877000,1582329715002058,6.222,9668.11,9666.81,0.189 -binance-futures,BTCUSDT,1582329714879000,1582329715002446,6.222,9668.11,9666.87,0.031 -binance-futures,BTCUSDT,1582329714879000,1582329715002919,6.222,9668.11,9666.88,0.031 -binance-futures,BTCUSDT,1582329714898000,1582329715022707,6.222,9668.11,9666.8,0.189 -binance-futures,BTCUSDT,1582329714906000,1582329715028579,0.467,9668.09,9666.77,0.1 -binance-futures,BTCUSDT,1582329714928000,1582329715050064,6.367,9668.09,9666.77,0.1 -binance-futures,BTCUSDT,1582329714931000,1582329715055457,0.031,9668.07,9666.77,0.1 -binance-futures,BTCUSDT,1582329714953000,1582329715076449,7.081,9668.07,9666.77,0.1 -binance-futures,BTCUSDT,1582329714955000,1582329715076552,7.05,9668.07,9666.77,0.1 -binance-futures,BTCUSDT,1582329714956000,1582329715077403,0.463,9668.06,9666.77,0.1 -binance-futures,BTCUSDT,1582329714973000,1582329715093682,7.363,9668.06,9666.77,0.1 -binance-futures,BTCUSDT,1582329714979000,1582329715101763,0.031,9668.04,9666.77,0.1 -binance-futures,BTCUSDT,1582329714981000,1582329715102872,0.031,9668.03,9666.77,0.1 -binance-futures,BTCUSDT,1582329715001000,1582329715123584,7.131,9668.03,9666.77,0.1 -binance-futures,BTCUSDT,1582329715015000,1582329715138315,0.453,9667.95,9666.77,0.1 -binance-futures,BTCUSDT,1582329715033000,1582329715153993,8.353,9667.95,9666.77,0.1 -binance-futures,BTCUSDT,1582329715077000,1582329715197556,0.439,9667.9,9666.77,0.1 -binance-futures,BTCUSDT,1582329715095000,1582329715218815,4.039,9667.9,9666.77,0.1 -binance-futures,BTCUSDT,1582329715101000,1582329715224411,0.031,9667.86,9666.77,0.1 -binance-futures,BTCUSDT,1582329715124000,1582329715243478,5.131,9667.86,9666.77,0.1 -binance-futures,BTCUSDT,1582329715147000,1582329715266776,0.031,9667.82,9666.77,0.1 -binance-futures,BTCUSDT,1582329715147000,1582329715269350,0.031,9667.82,9667.02,2.304 -binance-futures,BTCUSDT,1582329715163000,1582329715283608,4.631,9667.82,9667.02,2.304 -binance-futures,BTCUSDT,1582329715171000,1582329715293684,4.6,9667.82,9667.02,2.304 -binance-futures,BTCUSDT,1582329715177000,1582329715298912,5.066,9667.82,9667.02,2.304 -binance-futures,BTCUSDT,1582329715177000,1582329715298932,4.6,9667.82,9667.02,2.304 -binance-futures,BTCUSDT,1582329715195000,1582329715316151,0.08,9667.8,9667.02,2.304 -binance-futures,BTCUSDT,1582329715197000,1582329715319996,0.031,9667.79,9667.02,2.304 -binance-futures,BTCUSDT,1582329715197000,1582329715320003,0.031,9667.78,9667.02,2.304 -binance-futures,BTCUSDT,1582329715201000,1582329715335832,0.337,9668.07,9667.02,2.304 -binance-futures,BTCUSDT,1582329715215000,1582329715337267,5.55,9667.8,9667.02,2.304 -binance-futures,BTCUSDT,1582329715217000,1582329715337852,5.6,9667.78,9667.02,2.304 -binance-futures,BTCUSDT,1582329715227000,1582329715346888,5.55,9667.79,9667.02,2.304 -binance-futures,BTCUSDT,1582329715230000,1582329715349553,0.337,9668.07,9667.02,2.304 -binance-futures,BTCUSDT,1582329715240000,1582329715358676,3.398,9668.27,9667.02,2.304 -binance-futures,BTCUSDT,1582329715242000,1582329715361210,0.443,9667.81,9667.02,2.304 -binance-futures,BTCUSDT,1582329715247000,1582329715368348,0.466,9667.73,9667.02,2.304 -binance-futures,BTCUSDT,1582329715249000,1582329715371990,0.466,9667.73,9667.05,0.031 -binance-futures,BTCUSDT,1582329715251000,1582329715372000,0.466,9667.73,9667.06,0.031 -binance-futures,BTCUSDT,1582329715255000,1582329715373883,3.398,9668.27,9667.08,0.235 -binance-futures,BTCUSDT,1582329715272000,1582329715393213,3.398,9668.27,9667.12,2 -binance-futures,BTCUSDT,1582329715280000,1582329715420201,0.432,9668.25,9667.12,2 -binance-futures,BTCUSDT,1582329715282000,1582329715422874,3.398,9668.27,9667.12,2.235 -binance-futures,BTCUSDT,1582329715297000,1582329715442685,3.398,9668.27,9667.16,0.031 -binance-futures,BTCUSDT,1582329715301000,1582329715447308,3.398,9668.27,9667.22,0.235 -binance-futures,BTCUSDT,1582329715314000,1582329715447956,2.01,9667.95,9667.22,0.235 -binance-futures,BTCUSDT,1582329715332000,1582329715453594,2.01,9667.95,9667.16,0.031 -binance-futures,BTCUSDT,1582329715342000,1582329715465698,0.443,9667.94,9667.16,0.031 -binance-futures,BTCUSDT,1582329715345000,1582329715465868,0.443,9667.94,9667.17,0.031 -binance-futures,BTCUSDT,1582329715347000,1582329715468274,0.443,9667.94,9667.18,0.031 -binance-futures,BTCUSDT,1582329715365000,1582329715485138,2.993,9667.94,9667.18,0.031 -binance-futures,BTCUSDT,1582329715367000,1582329715488021,2.993,9667.94,9667.17,0.031 -binance-futures,BTCUSDT,1582329715367000,1582329715488032,2.55,9667.94,9667.17,0.031 -binance-futures,BTCUSDT,1582329715386000,1582329715511053,2.55,9667.94,9667.21,0.031 -binance-futures,BTCUSDT,1582329715388000,1582329715511079,2.55,9667.94,9667.22,0.031 -binance-futures,BTCUSDT,1582329715390000,1582329715513373,0.454,9667.93,9667.22,0.031 -binance-futures,BTCUSDT,1582329715409000,1582329715529346,2.01,9667.95,9667.22,0.031 -binance-futures,BTCUSDT,1582329715415000,1582329715537298,2.01,9667.95,9667.17,0.031 -binance-futures,BTCUSDT,1582329715432000,1582329715552779,2.01,9667.95,9667.21,0.235 -binance-futures,BTCUSDT,1582329715561000,1582329715681264,2.01,9667.95,9667.24,0.031 -binance-futures,BTCUSDT,1582329715561000,1582329715681645,2.01,9667.95,9667.25,0.031 -binance-futures,BTCUSDT,1582329715592000,1582329715714089,2.01,9667.95,9667.26,2 -binance-futures,BTCUSDT,1582329715605000,1582329715727037,2.01,9667.95,9667.27,0.235 -binance-futures,BTCUSDT,1582329715616000,1582329715739531,2.01,9667.95,9667.3,0.031 -binance-futures,BTCUSDT,1582329715625000,1582329715746507,2.01,9667.95,9667.31,2 -binance-futures,BTCUSDT,1582329715642000,1582329715766277,2.01,9667.95,9667.31,2.2 -binance-futures,BTCUSDT,1582329715648000,1582329715769025,2.01,9667.95,9667.31,1.965 -binance-futures,BTCUSDT,1582329715651000,1582329715772795,2.01,9667.95,9667.36,0.235 -binance-futures,BTCUSDT,1582329715696000,1582329715820030,2.01,9667.95,9667.37,0.67 -binance-futures,BTCUSDT,1582329715720000,1582329715842294,2.01,9667.95,9667.4,0.031 -binance-futures,BTCUSDT,1582329715720000,1582329715842736,2.01,9667.95,9667.41,0.031 -binance-futures,BTCUSDT,1582329715725000,1582329715845165,2.01,9667.95,9667.41,0.266 -binance-futures,BTCUSDT,1582329715749000,1582329715869781,2.01,9667.95,9667.46,0.235 -binance-futures,BTCUSDT,1582329715765000,1582329715886517,2.01,9667.95,9667.52,2 -binance-futures,BTCUSDT,1582329715767000,1582329715887444,2.01,9667.95,9667.52,4 -binance-futures,BTCUSDT,1582329715782000,1582329715905676,2.01,9667.95,9667.56,2 -binance-futures,BTCUSDT,1582329715784000,1582329715906213,2.01,9667.95,9667.58,2 -binance-futures,BTCUSDT,1582329715786000,1582329715909506,2.01,9667.95,9667.58,6 -binance-futures,BTCUSDT,1582329715803000,1582329715924661,2.01,9667.95,9667.62,2 -binance-futures,BTCUSDT,1582329715805000,1582329715927426,2.01,9667.95,9667.64,2 -binance-futures,BTCUSDT,1582329715807000,1582329715929426,2.01,9667.95,9667.64,4 -binance-futures,BTCUSDT,1582329715810000,1582329715934502,2.01,9667.95,9667.64,6 -binance-futures,BTCUSDT,1582329715824000,1582329715947174,2.01,9667.95,9667.68,2 -binance-futures,BTCUSDT,1582329715826000,1582329715950239,2.01,9667.95,9667.7,6 -binance-futures,BTCUSDT,1582329715828000,1582329715950257,2.01,9667.95,9667.7,8 -binance-futures,BTCUSDT,1582329715828000,1582329715950263,2.01,9667.95,9667.7,10 -binance-futures,BTCUSDT,1582329715846000,1582329715968436,2.01,9667.95,9667.76,2 -binance-futures,BTCUSDT,1582329715846000,1582329715971067,2.01,9667.95,9667.76,8 -binance-futures,BTCUSDT,1582329715850000,1582329715971083,2.01,9667.95,9667.76,10 -binance-futures,BTCUSDT,1582329715852000,1582329715972730,2.01,9667.95,9667.76,12 -binance-futures,BTCUSDT,1582329715853000,1582329715974203,2.01,9667.95,9667.79,0.235 -binance-futures,BTCUSDT,1582329715866000,1582329715986841,2.01,9667.95,9667.82,2 -binance-futures,BTCUSDT,1582329715867000,1582329715993009,2.01,9667.95,9667.82,4 -binance-futures,BTCUSDT,1582329715868000,1582329715993261,2.01,9667.95,9667.82,6 -binance-futures,BTCUSDT,1582329715871000,1582329715993970,2.01,9667.95,9667.82,10 -binance-futures,BTCUSDT,1582329715889000,1582329716007418,2.01,9667.95,9667.88,2 -binance-futures,BTCUSDT,1582329715891000,1582329716010480,2.01,9667.95,9667.9,0.235 -binance-futures,BTCUSDT,1582329715907000,1582329716028146,2.01,9667.95,9667.94,2 -binance-futures,BTCUSDT,1582329715909000,1582329716028153,2.01,9667.95,9667.94,4 -binance-futures,BTCUSDT,1582329715938000,1582329716056764,2.01,9667.95,9667.94,4.235 -binance-futures,BTCUSDT,1582329715971000,1582329716089963,2.01,9667.95,9667.94,4.905 -binance-futures,BTCUSDT,1582329715978000,1582329716097106,2.01,9667.95,9667.94,5.575 -binance-futures,BTCUSDT,1582329716006000,1582329716123553,2.01,9667.95,9667.94,6.235 -binance-futures,BTCUSDT,1582329716022000,1582329716142721,2.01,9667.95,9667.94,6.945 -binance-futures,BTCUSDT,1582329716155000,1582329716276921,0.491,9667.95,9667.94,6.945 -binance-futures,BTCUSDT,1582329716171000,1582329716293868,0.491,9667.95,9667.94,12.695 -binance-futures,BTCUSDT,1582329716209000,1582329716329072,0.491,9667.95,9667.94,6.945 -binance-futures,BTCUSDT,1582329716313000,1582329716433647,1.16,9667.95,9667.94,6.945 -binance-futures,BTCUSDT,1582329716336000,1582329716457246,1.16,9667.95,9667.94,6.285 -binance-futures,BTCUSDT,1582329716345000,1582329716465777,1.16,9667.95,9667.94,5.615 -binance-futures,BTCUSDT,1582329716363000,1582329716483005,1.16,9667.95,9667.94,4.945 -binance-futures,BTCUSDT,1582329716375000,1582329716495322,1.16,9667.95,9667.94,4.905 -binance-futures,BTCUSDT,1582329716380000,1582329716499115,0.301,9667.95,9667.94,4.905 -binance-futures,BTCUSDT,1582329716385000,1582329716503452,0.301,9667.95,9667.94,5.565 -binance-futures,BTCUSDT,1582329716397000,1582329716517207,0.301,9667.95,9667.94,10.165 -binance-futures,BTCUSDT,1582329716399000,1582329716517222,1.903,9667.95,9667.94,14.115 -binance-futures,BTCUSDT,1582329716414000,1582329716536071,1.903,9667.95,9667.94,10.165 -binance-futures,BTCUSDT,1582329716425000,1582329716547959,1.903,9667.95,9667.94,10.875 -binance-futures,BTCUSDT,1582329716433000,1582329716551271,1.903,9667.95,9667.94,11.545 -binance-futures,BTCUSDT,1582329716498000,1582329716617425,1.903,9667.95,9667.94,6.945 -binance-futures,BTCUSDT,1582329716684000,1582329716803847,1.602,9667.95,9667.94,6.945 -binance-futures,BTCUSDT,1582329716993000,1582329717113558,2.973,9669,9667.94,6.945 -binance-futures,BTCUSDT,1582329717003000,1582329717120478,2.973,9669,9668.03,1.79 -binance-futures,BTCUSDT,1582329717018000,1582329717140139,2.973,9669,9668.03,7.34 -binance-futures,BTCUSDT,1582329717018000,1582329717140153,2.973,9669,9668.13,0.235 -binance-futures,BTCUSDT,1582329717037000,1582329717156742,2.973,9669,9668.17,2 -binance-futures,BTCUSDT,1582329717044000,1582329717166071,2.973,9669,9668.17,2.031 -binance-futures,BTCUSDT,1582329717056000,1582329717176269,2.973,9669,9668.17,10.931 -binance-futures,BTCUSDT,1582329717062000,1582329717181785,2.973,9669,9668.45,0.235 -binance-futures,BTCUSDT,1582329717075000,1582329717194744,2.973,9669,9668.49,2 -binance-futures,BTCUSDT,1582329717093000,1582329717215855,2.973,9669,9668.49,2.031 -binance-futures,BTCUSDT,1582329717095000,1582329717216788,2.973,9669,9668.49,7.281 -binance-futures,BTCUSDT,1582329717101000,1582329717222903,2.973,9669,9668.71,0.235 -binance-futures,BTCUSDT,1582329717107000,1582329717229961,0.883,9669,9668.71,0.235 -binance-futures,BTCUSDT,1582329717121000,1582329717243260,0.883,9669,9668.77,2 -binance-futures,BTCUSDT,1582329717127000,1582329717249701,0.883,9669,9668.77,4 -binance-futures,BTCUSDT,1582329717129000,1582329717251281,0.883,9669,9668.77,10 -binance-futures,BTCUSDT,1582329717139000,1582329717260133,0.883,9669,9668.81,2 -binance-futures,BTCUSDT,1582329717147000,1582329717270705,0.883,9669,9668.83,2 -binance-futures,BTCUSDT,1582329717149000,1582329717270831,0.883,9669,9668.97,0.235 -binance-futures,BTCUSDT,1582329717171000,1582329717310723,0.883,9669,9668.99,6 -binance-futures,BTCUSDT,1582329717178000,1582329717318048,0.883,9669,9668.99,5.953 -binance-futures,BTCUSDT,1582329717202000,1582329717324317,0.883,9669,9668.99,12.353 -binance-futures,BTCUSDT,1582329717211000,1582329717331780,0.883,9669,9668.99,12.588 -binance-futures,BTCUSDT,1582329717213000,1582329717335878,0.883,9669,9668.99,6.188 -binance-futures,BTCUSDT,1582329717223000,1582329717345551,0.883,9669,9668.99,6.848 -binance-futures,BTCUSDT,1582329717250000,1582329717374122,0.882,9669,9668.99,6.848 -binance-futures,BTCUSDT,1582329717259000,1582329717388039,0.882,9669,9668.99,6.188 -binance-futures,BTCUSDT,1582329717259000,1582329717394098,0.882,9669,9668.99,6.858 -binance-futures,BTCUSDT,1582329717266000,1582329717433485,0.195,9670.77,9668.99,6.858 -binance-futures,BTCUSDT,1582329717273000,1582329717433511,0.195,9670.77,9668.99,9.908 -binance-futures,BTCUSDT,1582329717276000,1582329717435189,0.195,9670.77,9669.03,0.031 -binance-futures,BTCUSDT,1582329717300000,1582329717435332,0.194,9670.77,9669.03,0.031 -binance-futures,BTCUSDT,1582329717321000,1582329717441089,0.16,9670.81,9669.03,0.031 -binance-futures,BTCUSDT,1582329717322000,1582329717442669,0.16,9670.81,9669.03,2.031 -binance-futures,BTCUSDT,1582329717324000,1582329717445047,0.16,9670.81,9669.05,2 -binance-futures,BTCUSDT,1582329717343000,1582329717464085,0.16,9670.81,9669.05,2.031 -binance-futures,BTCUSDT,1582329717343000,1582329717466308,0.005,9670.76,9669.21,0.235 -binance-futures,BTCUSDT,1582329717355000,1582329717477751,0.005,9670.76,9669.41,0.038 -binance-futures,BTCUSDT,1582329717373000,1582329717494814,0.005,9670.76,9669.41,10.473 -binance-futures,BTCUSDT,1582329717380000,1582329717505705,0.091,9670.81,9669.45,0.031 -binance-futures,BTCUSDT,1582329717392000,1582329717512819,3.75,9670.76,9669.45,0.031 -binance-futures,BTCUSDT,1582329717402000,1582329717521492,3.75,9670.76,9669.53,0.235 -binance-futures,BTCUSDT,1582329717413000,1582329717532057,2.21,9670.88,9669.53,0.235 -binance-futures,BTCUSDT,1582329717418000,1582329717536905,0.052,9670.76,9669.53,0.235 -binance-futures,BTCUSDT,1582329717420000,1582329717539738,0.052,9670.76,9669.53,7.685 -binance-futures,BTCUSDT,1582329717424000,1582329717547379,0.052,9670.76,9669.57,0.031 -binance-futures,BTCUSDT,1582329717434000,1582329717554209,1.113,9670.89,9669.57,0.031 -binance-futures,BTCUSDT,1582329717445000,1582329717565458,1.113,9670.89,9669.57,9.981 -binance-futures,BTCUSDT,1582329717450000,1582329717569710,0.086,9670.76,9669.57,9.981 -binance-futures,BTCUSDT,1582329717459000,1582329717578335,0.086,9670.76,9669.57,10.651 -binance-futures,BTCUSDT,1582329717461000,1582329717580242,0.086,9670.76,9669.57,11.361 -binance-futures,BTCUSDT,1582329717467000,1582329717589494,0.086,9670.76,9669.71,0.235 -binance-futures,BTCUSDT,1582329717486000,1582329717605483,0.086,9670.76,9669.71,8.885 -binance-futures,BTCUSDT,1582329717488000,1582329717608632,1.113,9670.89,9669.71,8.885 -binance-futures,BTCUSDT,1582329717508000,1582329717628366,1.113,9670.89,9669.71,8.65 -binance-futures,BTCUSDT,1582329717510000,1582329717631318,1.113,9670.89,9669.9,0.235 -binance-futures,BTCUSDT,1582329717528000,1582329717653231,0.216,9670.89,9669.9,0.235 -binance-futures,BTCUSDT,1582329717532000,1582329717653493,0.216,9670.89,9669.9,9.235 -binance-futures,BTCUSDT,1582329717552000,1582329717673350,0.216,9670.89,9669.91,1 -binance-futures,BTCUSDT,1582329717556000,1582329717675715,0.216,9670.89,9670.16,0.235 -binance-futures,BTCUSDT,1582329717559000,1582329717681745,0.005,9670.88,9670.16,0.235 -binance-futures,BTCUSDT,1582329717575000,1582329717697875,0.005,9670.88,9670.16,8.435 -binance-futures,BTCUSDT,1582329717579000,1582329717703480,0.005,9670.88,9670.18,0.031 -binance-futures,BTCUSDT,1582329717581000,1582329717703517,0.005,9670.88,9670.2,0.031 -binance-futures,BTCUSDT,1582329717600000,1582329717723288,0.005,9670.88,9670.37,0.235 -binance-futures,BTCUSDT,1582329717624000,1582329717746136,0.005,9670.88,9670.41,2 -binance-futures,BTCUSDT,1582329717626000,1582329717747463,0.005,9670.88,9670.41,2.031 -binance-futures,BTCUSDT,1582329717637000,1582329717760640,0.005,9670.88,9670.57,1.9 -binance-futures,BTCUSDT,1582329717650000,1582329717774182,0.005,9670.88,9670.65,0.235 -binance-futures,BTCUSDT,1582329717673000,1582329717798096,0.005,9670.88,9670.71,8 -binance-futures,BTCUSDT,1582329717696000,1582329717818970,0.005,9670.88,9670.82,1 -binance-futures,BTCUSDT,1582329717700000,1582329717822665,0.005,9670.88,9670.85,0.235 -binance-futures,BTCUSDT,1582329717709000,1582329717835021,0.126,9670.89,9670.85,0.235 -binance-futures,BTCUSDT,1582329717717000,1582329717842183,0.126,9670.89,9670.87,1 -binance-futures,BTCUSDT,1582329717719000,1582329717844759,0.126,9670.89,9670.87,3 -binance-futures,BTCUSDT,1582329717719000,1582329717845019,0.126,9670.89,9670.87,7 -binance-futures,BTCUSDT,1582329717725000,1582329717852311,0.126,9670.89,9670.88,0.031 -binance-futures,BTCUSDT,1582329717731000,1582329717855361,0.126,9670.89,9670.88,1.031 -binance-futures,BTCUSDT,1582329717738000,1582329717860790,0.58,9671.25,9670.88,1.031 -binance-futures,BTCUSDT,1582329717742000,1582329717865704,0.58,9671.25,9670.89,2 -binance-futures,BTCUSDT,1582329717749000,1582329717873324,0.834,9671.31,9670.89,2 -binance-futures,BTCUSDT,1582329717759000,1582329717882277,0.834,9671.31,9670.89,8.2 -binance-futures,BTCUSDT,1582329717763000,1582329717885660,0.834,9671.31,9670.89,10.8 -binance-futures,BTCUSDT,1582329717765000,1582329717888811,0.834,9671.31,9670.95,4 -binance-futures,BTCUSDT,1582329717770000,1582329717893042,0.834,9671.31,9671.07,0.235 -binance-futures,BTCUSDT,1582329717775000,1582329717901167,0.094,9671.31,9671.07,0.235 -binance-futures,BTCUSDT,1582329717791000,1582329717912433,0.094,9671.31,9671.07,11.685 -binance-futures,BTCUSDT,1582329717804000,1582329717925941,0.094,9671.31,9671.08,1 -binance-futures,BTCUSDT,1582329717806000,1582329717930199,0.101,9672.12,9671.08,1 -binance-futures,BTCUSDT,1582329717818000,1582329717938855,0.101,9672.12,9671.28,0.235 -binance-futures,BTCUSDT,1582329717830000,1582329717953496,3.454,9671.35,9671.28,0.235 -binance-futures,BTCUSDT,1582329717835000,1582329717956732,3.454,9671.35,9671.28,11.685 -binance-futures,BTCUSDT,1582329717852000,1582329717975880,3.454,9671.35,9671.34,1 -binance-futures,BTCUSDT,1582329717856000,1582329717982502,0.101,9672.12,9671.34,1 -binance-futures,BTCUSDT,1582329717860000,1582329717984628,0.101,9672.12,9671.34,1.235 -binance-futures,BTCUSDT,1582329717875000,1582329718001762,0.101,9672.12,9671.34,9.835 -binance-futures,BTCUSDT,1582329717890000,1582329718017368,0.101,9672.12,9671.35,1 -binance-futures,BTCUSDT,1582329717892000,1582329718017981,0.101,9672.12,9671.51,0.235 -binance-futures,BTCUSDT,1582329717911000,1582329718035611,1.729,9672.05,9671.51,0.235 -binance-futures,BTCUSDT,1582329717917000,1582329718041433,1.729,9672.05,9671.51,11.135 -binance-futures,BTCUSDT,1582329717929000,1582329718055769,1.729,9672.05,9671.52,1 -binance-futures,BTCUSDT,1582329717938000,1582329718062526,1.729,9672.05,9671.55,0.031 -binance-futures,BTCUSDT,1582329717948000,1582329718072310,1.729,9672.05,9671.65,0.235 -binance-futures,BTCUSDT,1582329717973000,1582329718098943,1.729,9672.05,9671.65,8.285 -binance-futures,BTCUSDT,1582329717983000,1582329718110221,1.729,9672.05,9671.66,1 -binance-futures,BTCUSDT,1582329718000000,1582329718125146,1.729,9672.05,9671.69,0.031 -binance-futures,BTCUSDT,1582329718003000,1582329718130188,1.729,9672.05,9671.77,0.235 -binance-futures,BTCUSDT,1582329718028000,1582329718155816,1.729,9672.05,9671.77,10.435 -binance-futures,BTCUSDT,1582329718039000,1582329718166135,1.729,9672.05,9671.81,2 -binance-futures,BTCUSDT,1582329718044000,1582329718175904,1.728,9672.05,9671.81,2 -binance-futures,BTCUSDT,1582329718055000,1582329718183814,1.728,9672.05,9671.81,2.031 -binance-futures,BTCUSDT,1582329718062000,1582329718195018,0.947,9672.05,9671.95,0.235 -binance-futures,BTCUSDT,1582329718094000,1582329718226314,0.947,9672.05,9672.04,1 -binance-futures,BTCUSDT,1582329718115000,1582329718244486,0.101,9672.12,9672.04,1 -binance-futures,BTCUSDT,1582329718120000,1582329718245308,0.101,9672.12,9672.04,12.65 -binance-futures,BTCUSDT,1582329718138000,1582329718264130,0.101,9672.12,9672.04,12.885 -binance-futures,BTCUSDT,1582329718138000,1582329718264281,0.101,9672.12,9672.1,2 -binance-futures,BTCUSDT,1582329718143000,1582329718273905,0.1,9672.12,9672.11,1 -binance-futures,BTCUSDT,1582329718149000,1582329718277320,0.1,9672.12,9672.11,1.235 -binance-futures,BTCUSDT,1582329718160000,1582329718284032,0.047,9672.79,9672.11,1.235 -binance-futures,BTCUSDT,1582329718164000,1582329718287529,0.047,9672.79,9672.11,3.235 -binance-futures,BTCUSDT,1582329718168000,1582329718294080,0.047,9672.79,9672.12,2 -binance-futures,BTCUSDT,1582329718175000,1582329718299708,0.047,9672.79,9672.14,0.031 -binance-futures,BTCUSDT,1582329718187000,1582329718313634,0.047,9672.79,9672.15,2 -binance-futures,BTCUSDT,1582329718191000,1582329718314681,0.047,9672.79,9672.25,0.235 -binance-futures,BTCUSDT,1582329718213000,1582329718340971,0.047,9672.79,9672.29,2 -binance-futures,BTCUSDT,1582329718217000,1582329718351881,2.427,9673.86,9672.29,2 -binance-futures,BTCUSDT,1582329718224000,1582329718353977,2.427,9673.86,9672.29,3.371 -binance-futures,BTCUSDT,1582329718236000,1582329718359973,2.427,9673.86,9672.35,2 -binance-futures,BTCUSDT,1582329718238000,1582329718361659,2.427,9673.86,9672.35,4 -binance-futures,BTCUSDT,1582329718244000,1582329718370796,2.427,9673.86,9672.42,0.235 -binance-futures,BTCUSDT,1582329718273000,1582329718399842,2.427,9673.86,9672.44,0.031 -binance-futures,BTCUSDT,1582329718273000,1582329718400693,2.427,9673.86,9672.46,0.031 -binance-futures,BTCUSDT,1582329718301000,1582329718463318,2.427,9673.86,9672.46,18.181 -binance-futures,BTCUSDT,1582329718309000,1582329718464797,2.427,9673.86,9672.49,0.235 -binance-futures,BTCUSDT,1582329718345000,1582329718474661,2.427,9673.86,9672.49,19.335 -binance-futures,BTCUSDT,1582329718365000,1582329718485701,2.427,9673.86,9672.5,0.022 -binance-futures,BTCUSDT,1582329718373000,1582329718499742,2.427,9673.86,9672.52,0.031 -binance-futures,BTCUSDT,1582329718376000,1582329718500515,2.427,9673.86,9672.53,0.031 -binance-futures,BTCUSDT,1582329718387000,1582329718521806,2.427,9673.86,9672.6,0.235 -binance-futures,BTCUSDT,1582329718416000,1582329718544042,2.008,9672.79,9672.6,0.235 -binance-futures,BTCUSDT,1582329718426000,1582329718550547,2.008,9672.79,9672.64,0.031 -binance-futures,BTCUSDT,1582329718441000,1582329718565831,2.008,9672.79,9672.66,2 -binance-futures,BTCUSDT,1582329718443000,1582329718571207,2.008,9672.79,9672.71,1 -binance-futures,BTCUSDT,1582329718451000,1582329718577741,2.008,9672.79,9672.75,1 -binance-futures,BTCUSDT,1582329718475000,1582329718602989,2.008,9672.79,9672.75,1.031 -binance-futures,BTCUSDT,1582329718477000,1582329718607295,2.008,9672.79,9672.78,0.235 -binance-futures,BTCUSDT,1582329718533000,1582329718660650,1.971,9672.79,9672.78,0.235 -binance-futures,BTCUSDT,1582329718536000,1582329718661797,1.971,9672.79,9672.78,0.905 -binance-futures,BTCUSDT,1582329718573000,1582329718696659,1.971,9672.79,9672.78,1.565 -binance-futures,BTCUSDT,1582329718623000,1582329718751061,1.971,9672.79,9672.78,1.505 -binance-futures,BTCUSDT,1582329718636000,1582329718758687,1.971,9672.79,9672.78,2.215 -binance-futures,BTCUSDT,1582329718680000,1582329718808668,2.452,9673.96,9672.78,2.215 -binance-futures,BTCUSDT,1582329718703000,1582329718828180,1.703,9672.79,9672.78,2.215 -binance-futures,BTCUSDT,1582329718714000,1582329718843044,1.703,9672.79,9672.78,2.04 -binance-futures,BTCUSDT,1582329718733000,1582329718856734,1.703,9672.79,9672.78,2.252 -binance-futures,BTCUSDT,1582329718783000,1582329718904173,2.452,9673.96,9672.79,0.297 -binance-futures,BTCUSDT,1582329718805000,1582329718930095,2.452,9673.96,9672.82,0.031 -binance-futures,BTCUSDT,1582329718807000,1582329718930140,2.452,9673.96,9672.86,0.212 -binance-futures,BTCUSDT,1582329718819000,1582329718942052,1.307,9673.86,9672.86,0.212 -binance-futures,BTCUSDT,1582329718855000,1582329718979523,1.307,9673.86,9672.9,2 -binance-futures,BTCUSDT,1582329718880000,1582329719006148,1.307,9673.86,9672.94,0.212 -binance-futures,BTCUSDT,1582329718884000,1582329719008767,1.307,9673.86,9672.94,0.243 -binance-futures,BTCUSDT,1582329718906000,1582329719029320,1.307,9673.86,9672.98,2 -binance-futures,BTCUSDT,1582329718931000,1582329719056462,1.307,9673.86,9673.02,0.031 -binance-futures,BTCUSDT,1582329718966000,1582329719093663,1.307,9673.86,9673.06,2 -binance-futures,BTCUSDT,1582329718995000,1582329719120555,1.307,9673.86,9673.1,0.031 -binance-futures,BTCUSDT,1582329719026000,1582329719148357,1.307,9673.86,9673.12,0.212 -binance-futures,BTCUSDT,1582329719040000,1582329719164259,1.307,9673.86,9673.14,2 -binance-futures,BTCUSDT,1582329719068000,1582329719195164,1.307,9673.86,9673.15,0.212 -binance-futures,BTCUSDT,1582329719078000,1582329719204372,1.307,9673.86,9673.15,0.163 -binance-futures,BTCUSDT,1582329719096000,1582329719219150,1.307,9673.86,9673.19,2 -binance-futures,BTCUSDT,1582329719097000,1582329719223434,1.307,9673.86,9673.19,2.031 -binance-futures,BTCUSDT,1582329719124000,1582329719249273,1.307,9673.86,9673.23,0.193 -binance-futures,BTCUSDT,1582329719132000,1582329719254522,1.307,9673.86,9673.23,2.193 -binance-futures,BTCUSDT,1582329719151000,1582329719277246,1.307,9673.86,9673.23,2.224 -binance-futures,BTCUSDT,1582329719155000,1582329719283791,1.307,9673.86,9673.27,2 -binance-futures,BTCUSDT,1582329719157000,1582329719284581,1.307,9673.86,9673.27,2.193 -binance-futures,BTCUSDT,1582329719187000,1582329719311119,1.307,9673.86,9673.31,2 -binance-futures,BTCUSDT,1582329719189000,1582329719312410,1.307,9673.86,9673.32,0.193 -binance-futures,BTCUSDT,1582329719211000,1582329719335614,1.307,9673.86,9673.36,2 -binance-futures,BTCUSDT,1582329719233000,1582329719355649,1.307,9673.86,9673.42,2 -binance-futures,BTCUSDT,1582329719233000,1582329719357882,1.307,9673.86,9673.42,4 -binance-futures,BTCUSDT,1582329719235000,1582329719358158,1.307,9673.86,9673.42,6 -binance-futures,BTCUSDT,1582329719258000,1582329719382870,1.307,9673.86,9673.48,6 -binance-futures,BTCUSDT,1582329719280000,1582329719403404,1.307,9673.86,9673.54,2 -binance-futures,BTCUSDT,1582329719282000,1582329719405928,1.307,9673.86,9673.54,4 -binance-futures,BTCUSDT,1582329719284000,1582329719408668,1.307,9673.86,9673.54,6 -binance-futures,BTCUSDT,1582329719286000,1582329719408689,1.307,9673.86,9673.54,8 -binance-futures,BTCUSDT,1582329719301000,1582329719447656,1.307,9673.86,9673.58,2 -binance-futures,BTCUSDT,1582329719304000,1582329719448492,1.307,9673.86,9673.6,4 -binance-futures,BTCUSDT,1582329719308000,1582329719448913,1.307,9673.86,9673.6,6 -binance-futures,BTCUSDT,1582329719346000,1582329719472636,1.307,9673.86,9673.66,6 -binance-futures,BTCUSDT,1582329719368000,1582329719489272,1.307,9673.86,9673.72,2 -binance-futures,BTCUSDT,1582329719386000,1582329719508679,1.307,9673.86,9673.72,10.05 -binance-futures,BTCUSDT,1582329719394000,1582329719518037,1.307,9673.86,9673.73,0.193 -binance-futures,BTCUSDT,1582329719407000,1582329719529075,1.307,9673.86,9673.78,2 -binance-futures,BTCUSDT,1582329719411000,1582329719535666,1.307,9673.86,9673.78,4 -binance-futures,BTCUSDT,1582329719426000,1582329719552849,1.307,9673.86,9673.78,10.05 -binance-futures,BTCUSDT,1582329719433000,1582329719562484,1.307,9673.86,9673.82,2 -binance-futures,BTCUSDT,1582329719450000,1582329719572739,1.307,9673.86,9673.82,4 -binance-futures,BTCUSDT,1582329719458000,1582329719580710,1.307,9673.86,9673.82,11.25 -binance-futures,BTCUSDT,1582329719462000,1582329719588938,1.307,9673.86,9673.82,11.281 -binance-futures,BTCUSDT,1582329719472000,1582329719592306,1.307,9673.86,9673.85,2 -binance-futures,BTCUSDT,1582329719492000,1582329719616917,1.307,9673.86,9673.85,8.75 -binance-futures,BTCUSDT,1582329719528000,1582329719653870,1.307,9673.86,9673.85,8.943 -binance-futures,BTCUSDT,1582329719532000,1582329719654167,1.307,9673.86,9673.85,9.653 -binance-futures,BTCUSDT,1582329719541000,1582329719665555,1.307,9673.86,9673.85,10.12 -binance-futures,BTCUSDT,1582329719643000,1582329719766486,1.307,9673.86,9673.85,12.02 -binance-futures,BTCUSDT,1582329719656000,1582329719778353,1.307,9673.86,9673.85,10.12 -binance-futures,BTCUSDT,1582329719679000,1582329719803249,1.307,9673.86,9673.85,11.12 -binance-futures,BTCUSDT,1582329719679000,1582329719803420,1.307,9673.86,9673.85,11.142 -binance-futures,BTCUSDT,1582329719688000,1582329719811494,1.307,9673.86,9673.85,11.812 -binance-futures,BTCUSDT,1582329719736000,1582329719860427,1.307,9673.86,9673.85,12.482 -binance-futures,BTCUSDT,1582329719795000,1582329719920190,1.307,9673.86,9673.85,14.382 -binance-futures,BTCUSDT,1582329719946000,1582329720069524,1.307,9673.86,9673.85,12.482 -binance-futures,BTCUSDT,1582329720003000,1582329720126760,0.006,9673.86,9673.85,12.482 -binance-futures,BTCUSDT,1582329720021000,1582329720143439,0.006,9673.86,9673.85,14.932 -binance-futures,BTCUSDT,1582329720046000,1582329720168153,0.006,9673.86,9673.85,15.125 -binance-futures,BTCUSDT,1582329720051000,1582329720173726,0.006,9673.86,9673.85,12.675 -binance-futures,BTCUSDT,1582329720054000,1582329720182895,0.135,9675.36,9673.85,12.675 -binance-futures,BTCUSDT,1582329720054000,1582329720183133,0.135,9675.36,9673.85,14.575 -binance-futures,BTCUSDT,1582329720077000,1582329720200024,0.135,9675.36,9673.89,0.031 -binance-futures,BTCUSDT,1582329720098000,1582329720223028,0.135,9675.36,9673.89,13.831 -binance-futures,BTCUSDT,1582329720102000,1582329720226535,0.135,9675.36,9673.9,1 -binance-futures,BTCUSDT,1582329720104000,1582329720226937,0.135,9675.36,9673.9,1.31 -binance-futures,BTCUSDT,1582329720106000,1582329720231336,0.02,9675.5,9673.9,1.31 -binance-futures,BTCUSDT,1582329720127000,1582329720250111,0.02,9675.5,9673.93,0.031 -binance-futures,BTCUSDT,1582329720133000,1582329720256276,0.02,9675.5,9674,0.31 -binance-futures,BTCUSDT,1582329720157000,1582329720285798,0.02,9675.5,9674,15.21 -binance-futures,BTCUSDT,1582329720173000,1582329720295782,0.02,9675.5,9674.01,1.022 -binance-futures,BTCUSDT,1582329720177000,1582329720298940,0.02,9675.5,9674.01,1.682 -binance-futures,BTCUSDT,1582329720188000,1582329720309996,0.02,9675.5,9674.04,0.031 -binance-futures,BTCUSDT,1582329720191000,1582329720316375,0.02,9675.5,9674.15,0.31 -binance-futures,BTCUSDT,1582329720212000,1582329720345365,0.02,9675.5,9674.15,16.61 -binance-futures,BTCUSDT,1582329720243000,1582329720363289,0.02,9675.5,9674.16,1 -binance-futures,BTCUSDT,1582329720245000,1582329720368220,0.02,9675.5,9674.16,1.022 -binance-futures,BTCUSDT,1582329720248000,1582329720372329,0.02,9675.5,9674.17,0.031 -binance-futures,BTCUSDT,1582329720250000,1582329720373852,0.02,9675.5,9674.19,0.031 -binance-futures,BTCUSDT,1582329720257000,1582329720382363,0.02,9675.5,9674.25,0.31 -binance-futures,BTCUSDT,1582329720276000,1582329720400637,0.02,9675.5,9674.25,15.66 -binance-futures,BTCUSDT,1582329720282000,1582329720410684,0.02,9675.5,9674.26,1 -binance-futures,BTCUSDT,1582329720303000,1582329720456381,0.02,9675.5,9674.27,0.031 -binance-futures,BTCUSDT,1582329720305000,1582329720456796,0.02,9675.5,9674.29,0.031 -binance-futures,BTCUSDT,1582329720307000,1582329720457050,0.02,9675.5,9675,0.01 -binance-futures,BTCUSDT,1582329720356000,1582329720483460,0.02,9675.5,9675,9.96 -binance-futures,BTCUSDT,1582329720386000,1582329720506197,0.02,9675.5,9675.04,0.031 -binance-futures,BTCUSDT,1582329720403000,1582329720526310,0.02,9675.5,9675.04,9.581 -binance-futures,BTCUSDT,1582329720423000,1582329720546281,0.02,9675.5,9675.05,0.66 -binance-futures,BTCUSDT,1582329720428000,1582329720559209,0.02,9675.5,9675.05,0.97 -binance-futures,BTCUSDT,1582329720437000,1582329720569680,0.02,9675.5,9675.05,0.66 -binance-futures,BTCUSDT,1582329720446000,1582329720570351,0.02,9675.5,9675.05,9.41 -binance-futures,BTCUSDT,1582329720449000,1582329720571001,0.02,9675.5,9675.07,0.031 -binance-futures,BTCUSDT,1582329720451000,1582329720571470,0.02,9675.5,9675.09,0.031 -binance-futures,BTCUSDT,1582329720472000,1582329720593068,0.02,9675.5,9675.09,10.431 -binance-futures,BTCUSDT,1582329720496000,1582329720619201,0.02,9675.5,9675.13,0.031 -binance-futures,BTCUSDT,1582329720517000,1582329720643190,0.02,9675.5,9675.13,8.881 -binance-futures,BTCUSDT,1582329720534000,1582329720655039,0.02,9675.5,9675.13,9.541 -binance-futures,BTCUSDT,1582329720546000,1582329720669899,0.02,9675.5,9675.17,0.031 -binance-futures,BTCUSDT,1582329720567000,1582329720688195,0.02,9675.5,9675.17,8.681 -binance-futures,BTCUSDT,1582329720584000,1582329720705961,0.02,9675.5,9675.17,9.341 -binance-futures,BTCUSDT,1582329720592000,1582329720715666,0.02,9675.5,9675.19,0.031 -binance-futures,BTCUSDT,1582329720592000,1582329720715685,0.02,9675.5,9675.21,0.031 -binance-futures,BTCUSDT,1582329720613000,1582329720734911,0.02,9675.5,9675.21,7.881 -binance-futures,BTCUSDT,1582329720639000,1582329720768444,0.02,9675.5,9675.25,0.031 -binance-futures,BTCUSDT,1582329720641000,1582329720772168,1.283,9675.6,9675.25,0.031 -binance-futures,BTCUSDT,1582329720662000,1582329720789678,1.283,9675.6,9675.25,7.631 -binance-futures,BTCUSDT,1582329720666000,1582329720791494,1.283,9675.6,9675.26,5.95 -binance-futures,BTCUSDT,1582329720690000,1582329720813685,1.283,9675.6,9675.26,10.15 -binance-futures,BTCUSDT,1582329720692000,1582329720814581,1.283,9675.6,9675.26,10.172 -binance-futures,BTCUSDT,1582329720693000,1582329720816226,1.283,9675.6,9675.29,0.031 -binance-futures,BTCUSDT,1582329720716000,1582329720839805,1.283,9675.6,9675.29,8.281 -binance-futures,BTCUSDT,1582329720725000,1582329720853602,0.05,9675.56,9675.29,8.281 -binance-futures,BTCUSDT,1582329720740000,1582329720863164,0.05,9675.56,9675.33,0.031 -binance-futures,BTCUSDT,1582329720763000,1582329720884700,0.05,9675.56,9675.33,7.381 -binance-futures,BTCUSDT,1582329720800000,1582329720923964,0.05,9675.56,9675.37,0.031 -binance-futures,BTCUSDT,1582329720821000,1582329720944864,0.05,9675.56,9675.37,6.731 -binance-futures,BTCUSDT,1582329720845000,1582329720965239,0.05,9675.56,9675.41,0.031 -binance-futures,BTCUSDT,1582329720861000,1582329720982931,0.05,9675.56,9675.41,6.831 -binance-futures,BTCUSDT,1582329720891000,1582329721012702,0.05,9675.56,9675.42,0.67 -binance-futures,BTCUSDT,1582329720909000,1582329721033864,0.05,9675.56,9675.42,0.668 -binance-futures,BTCUSDT,1582329720910000,1582329721035182,0.05,9675.56,9675.42,6.418 -binance-futures,BTCUSDT,1582329720915000,1582329721039167,0.05,9675.56,9675.46,0.031 -binance-futures,BTCUSDT,1582329720940000,1582329721062076,0.05,9675.56,9675.46,2.481 -binance-futures,BTCUSDT,1582329720952000,1582329721078215,0.05,9675.56,9675.46,0.691 -binance-futures,BTCUSDT,1582329720954000,1582329721078233,0.05,9675.56,9675.46,1.361 -binance-futures,BTCUSDT,1582329720965000,1582329721088519,0.05,9675.56,9675.5,0.031 -binance-futures,BTCUSDT,1582329721016000,1582329721138476,0.05,9675.56,9675.51,0.71 -binance-futures,BTCUSDT,1582329721034000,1582329721155768,0.05,9675.56,9675.51,0.741 -binance-futures,BTCUSDT,1582329721056000,1582329721175635,0.05,9675.56,9675.51,0.031 -binance-futures,BTCUSDT,1582329721058000,1582329721181355,0.05,9675.56,9675.55,0.031 -binance-futures,BTCUSDT,1582329721078000,1582329721198765,0.05,9675.56,9675.51,0.031 -binance-futures,BTCUSDT,1582329721116000,1582329721255982,0.462,9676.28,9675.51,0.031 -binance-futures,BTCUSDT,1582329721126000,1582329721258861,0.442,9675.66,9675.51,0.031 -binance-futures,BTCUSDT,1582329721136000,1582329721263388,0.442,9675.66,9675.52,4.55 -binance-futures,BTCUSDT,1582329721138000,1582329721263652,2.269,9675.56,9675.52,4.55 -binance-futures,BTCUSDT,1582329721145000,1582329721268513,2.269,9675.56,9675.52,7.05 -binance-futures,BTCUSDT,1582329721151000,1582329721280662,2.269,9675.56,9675.52,9.1 -binance-futures,BTCUSDT,1582329721155000,1582329721283022,2.269,9675.56,9675.54,0.031 -binance-futures,BTCUSDT,1582329721157000,1582329721283072,2.269,9675.56,9675.55,0.031 -binance-futures,BTCUSDT,1582329721167000,1582329721295329,1.569,9675.56,9675.55,0.031 -binance-futures,BTCUSDT,1582329721180000,1582329721305983,1.569,9675.56,9675.55,11.281 -binance-futures,BTCUSDT,1582329721191000,1582329721315723,1.569,9675.56,9675.55,11.279 -binance-futures,BTCUSDT,1582329721214000,1582329721338929,1.569,9675.56,9675.55,11.751 -binance-futures,BTCUSDT,1582329721218000,1582329721342061,1.569,9675.56,9675.55,0.501 -binance-futures,BTCUSDT,1582329721233000,1582329721358405,0.919,9675.56,9675.55,0.501 -binance-futures,BTCUSDT,1582329721237000,1582329721362880,0.919,9675.56,9675.55,0.029 -binance-futures,BTCUSDT,1582329721253000,1582329721374181,0.919,9675.56,9675.55,11.579 -binance-futures,BTCUSDT,1582329721271000,1582329721392003,0.919,9675.56,9675.55,12.579 -binance-futures,BTCUSDT,1582329721285000,1582329721405998,0.007,9675.56,9675.55,12.579 -binance-futures,BTCUSDT,1582329721441000,1582329721563533,0.007,9675.56,9675.55,14.589 -binance-futures,BTCUSDT,1582329721472000,1582329721599695,0.287,9676.44,9675.55,14.589 -binance-futures,BTCUSDT,1582329721481000,1582329721604763,0.287,9676.44,9675.55,12.579 -binance-futures,BTCUSDT,1582329721493000,1582329721614295,0.287,9676.44,9675.56,5.45 -binance-futures,BTCUSDT,1582329721504000,1582329721640641,0.287,9676.44,9675.59,0.031 -binance-futures,BTCUSDT,1582329721518000,1582329721648356,0.197,9676.93,9675.59,0.031 -binance-futures,BTCUSDT,1582329721538000,1582329721661448,0.197,9676.93,9675.59,10.481 -binance-futures,BTCUSDT,1582329721551000,1582329721674654,0.197,9676.93,9675.6,0.031 -binance-futures,BTCUSDT,1582329721553000,1582329721678180,0.197,9676.93,9675.6,0.741 -binance-futures,BTCUSDT,1582329721553000,1582329721678517,0.197,9676.93,9675.6,1.741 -binance-futures,BTCUSDT,1582329721573000,1582329721698907,0.197,9676.93,9675.6,12.741 -binance-futures,BTCUSDT,1582329721573000,1582329721698929,0.1,9676.97,9675.6,12.741 -binance-futures,BTCUSDT,1582329721577000,1582329721700514,0.1,9676.97,9675.63,0.031 -binance-futures,BTCUSDT,1582329721594000,1582329721715885,0.197,9676.95,9675.63,0.031 -binance-futures,BTCUSDT,1582329721596000,1582329721719696,0.197,9676.95,9675.63,11.381 -binance-futures,BTCUSDT,1582329721604000,1582329721727292,1.364,9677,9675.63,11.381 -binance-futures,BTCUSDT,1582329721622000,1582329721750173,0.197,9676.95,9675.66,0.031 -binance-futures,BTCUSDT,1582329721622000,1582329721750224,0.197,9676.95,9675.67,0.031 -binance-futures,BTCUSDT,1582329721627000,1582329721751889,1.364,9677,9675.67,0.031 -binance-futures,BTCUSDT,1582329721631000,1582329721753372,1.364,9677,9675.69,0.429 -binance-futures,BTCUSDT,1582329721650000,1582329721774278,1.376,9677,9675.69,10.329 -binance-futures,BTCUSDT,1582329721672000,1582329721793676,0.197,9676.99,9675.7,2.01 -binance-futures,BTCUSDT,1582329721674000,1582329721796278,0.197,9676.99,9675.71,0.031 -binance-futures,BTCUSDT,1582329721674000,1582329721796289,0.197,9676.99,9675.72,0.031 -binance-futures,BTCUSDT,1582329721677000,1582329721799347,1.376,9677,9675.73,0.031 -binance-futures,BTCUSDT,1582329721681000,1582329721801964,1.376,9677,9675.79,0.451 -binance-futures,BTCUSDT,1582329721700000,1582329721823436,1.376,9677,9675.79,11.351 -binance-futures,BTCUSDT,1582329721716000,1582329721837239,1.376,9677,9675.8,1 -binance-futures,BTCUSDT,1582329721728000,1582329721853221,1.376,9677,9676,0.453 -binance-futures,BTCUSDT,1582329721730000,1582329721857004,1.376,9677,9676,0.306 -binance-futures,BTCUSDT,1582329721750000,1582329721873812,1.376,9677,9676,8.806 -binance-futures,BTCUSDT,1582329721762000,1582329721886338,1.376,9677,9676,0.306 -binance-futures,BTCUSDT,1582329721770000,1582329721893645,1.376,9677,9675.8,0.67 -binance-futures,BTCUSDT,1582329721776000,1582329721900941,1.376,9677,9676.04,0.031 -binance-futures,BTCUSDT,1582329721792000,1582329721911268,0.254,9676.99,9676.04,0.031 -binance-futures,BTCUSDT,1582329721796000,1582329721918026,0.254,9676.99,9676.63,2.01 -binance-futures,BTCUSDT,1582329721837000,1582329721961439,1.376,9677,9676.63,2.01 -binance-futures,BTCUSDT,1582329721847000,1582329721968659,1.611,9676.97,9676.63,2.01 -binance-futures,BTCUSDT,1582329721849000,1582329721971061,1.611,9676.97,9676.63,2.68 -binance-futures,BTCUSDT,1582329721859000,1582329721980400,1.611,9676.97,9676.65,0.031 -binance-futures,BTCUSDT,1582329721861000,1582329721983347,1.611,9676.97,9676.66,0.031 -binance-futures,BTCUSDT,1582329721863000,1582329721985255,1.611,9676.97,9676.67,0.031 -binance-futures,BTCUSDT,1582329721885000,1582329722007022,1.611,9676.97,9676.67,3.45 -binance-futures,BTCUSDT,1582329721908000,1582329722031834,1.611,9676.97,9676.7,0.031 -binance-futures,BTCUSDT,1582329721910000,1582329722032175,1.611,9676.97,9676.71,0.031 -binance-futures,BTCUSDT,1582329721929000,1582329722052536,1.611,9676.97,9676.71,4.281 -binance-futures,BTCUSDT,1582329721943000,1582329722065423,1.611,9676.97,9676.96,2.01 -binance-futures,BTCUSDT,1582329722012000,1582329722133279,1.865,9676.97,9676.96,2.01 -binance-futures,BTCUSDT,1582329722095000,1582329722215730,1.865,9676.97,9676.95,2.05 -binance-futures,BTCUSDT,1582329722115000,1582329722242863,1.865,9676.97,9676.96,2 -binance-futures,BTCUSDT,1582329722117000,1582329722242881,1.865,9676.97,9676.96,4 -binance-futures,BTCUSDT,1582329722145000,1582329722279664,1.611,9676.97,9676.96,4 -binance-futures,BTCUSDT,1582329722157000,1582329722280270,1.865,9676.97,9676.96,4 -binance-futures,BTCUSDT,1582329722186000,1582329722316028,1.611,9676.97,9676.96,4 -binance-futures,BTCUSDT,1582329722349000,1582329722471808,1.611,9676.97,9676.96,4.43 -binance-futures,BTCUSDT,1582329722352000,1582329722475794,1.611,9676.97,9676.96,6.44 -binance-futures,BTCUSDT,1582329722362000,1582329722485854,1.611,9676.97,9676.96,6.01 -binance-futures,BTCUSDT,1582329722371000,1582329722496457,1.611,9676.97,9676.96,4 -binance-futures,BTCUSDT,1582329722393000,1582329722519519,0.921,9676.97,9676.96,4 -binance-futures,BTCUSDT,1582329722404000,1582329722528051,0.921,9676.97,9676.96,6.01 -binance-futures,BTCUSDT,1582329722411000,1582329722532333,0.921,9676.97,9676.96,15.11 -binance-futures,BTCUSDT,1582329722413000,1582329722535716,0.921,9676.97,9676.96,17.71 -binance-futures,BTCUSDT,1582329722422000,1582329722548119,0.921,9676.97,9676.96,18.71 -binance-futures,BTCUSDT,1582329722433000,1582329722555547,0.921,9676.97,9676.96,16.11 -binance-futures,BTCUSDT,1582329722437000,1582329722558406,0.921,9676.97,9676.96,16.132 -binance-futures,BTCUSDT,1582329722443000,1582329722566859,0.921,9676.97,9676.96,7.032 -binance-futures,BTCUSDT,1582329722449000,1582329722572703,0.921,9676.97,9676.96,7.01 -binance-futures,BTCUSDT,1582329722569000,1582329722690257,0.921,9676.97,9676.96,7.465 -binance-futures,BTCUSDT,1582329722583000,1582329722705890,0.921,9676.97,9676.96,7.01 -binance-futures,BTCUSDT,1582329722645000,1582329722767658,0.921,9676.97,9676.96,7.032 -binance-futures,BTCUSDT,1582329722748000,1582329722872198,0.921,9676.97,9676.96,5.022 -binance-futures,BTCUSDT,1582329722774000,1582329722896523,0.921,9676.97,9676.96,7.032 -binance-futures,BTCUSDT,1582329722989000,1582329723111126,0.921,9676.97,9676.96,5.022 -binance-futures,BTCUSDT,1582329723025000,1582329723144100,0.921,9676.97,9676.96,5.47 -binance-futures,BTCUSDT,1582329723026000,1582329723151640,0.921,9676.97,9676.96,7.48 -binance-futures,BTCUSDT,1582329723029000,1582329723152257,0.921,9676.97,9676.96,7.032 -binance-futures,BTCUSDT,1582329723056000,1582329723182031,0.911,9676.97,9676.96,7.032 -binance-futures,BTCUSDT,1582329723119000,1582329723247582,0.177,9676.97,9676.96,7.032 -binance-futures,BTCUSDT,1582329723141000,1582329723551393,3.904,9678.6,9676.96,7.032 -binance-futures,BTCUSDT,1582329723145000,1582329723551421,3.904,9678.6,9676.96,9.932 -binance-futures,BTCUSDT,1582329723162000,1582329723551551,1.154,9676.97,9676.96,7.032 -binance-futures,BTCUSDT,1582329723187000,1582329723551756,1.154,9676.97,9676.96,6.01 -binance-futures,BTCUSDT,1582329723193000,1582329723551817,1.154,9676.97,9676.96,4 -binance-futures,BTCUSDT,1582329723209000,1582329723551965,1.154,9676.97,9676.96,5 -binance-futures,BTCUSDT,1582329723209000,1582329723551977,1.154,9676.97,9676.96,5.022 -binance-futures,BTCUSDT,1582329723229000,1582329723552156,1.154,9676.97,9676.96,4.022 -binance-futures,BTCUSDT,1582329723245000,1582329723552327,1.154,9676.97,9676.96,5.022 -binance-futures,BTCUSDT,1582329723262000,1582329723552449,1.309,9676.97,9676.96,5.022 -binance-futures,BTCUSDT,1582329723366000,1582329723553646,0.155,9676.97,9676.96,5.022 -binance-futures,BTCUSDT,1582329723374000,1582329723553757,1.405,9676.97,9676.96,5.022 -binance-futures,BTCUSDT,1582329723393000,1582329723553944,1.25,9676.97,9676.96,5.022 -binance-futures,BTCUSDT,1582329723443000,1582329723569486,1.25,9676.97,9676.96,7.032 -binance-futures,BTCUSDT,1582329723486000,1582329723612310,1.25,9676.97,9676.96,5.022 -binance-futures,BTCUSDT,1582329723509000,1582329723631637,1.25,9676.97,9676.96,3.022 -binance-futures,BTCUSDT,1582329723513000,1582329723634483,1.25,9676.97,9676.96,1.022 -binance-futures,BTCUSDT,1582329723529000,1582329723655715,1.25,9676.97,9676.96,0.022 -binance-futures,BTCUSDT,1582329723537000,1582329723660680,1.405,9676.97,9676.96,0.022 -binance-futures,BTCUSDT,1582329723537000,1582329723660733,1.405,9676.97,9676.95,1.36 -binance-futures,BTCUSDT,1582329723641000,1582329723761763,0.478,9676.96,9676.95,1.36 -binance-futures,BTCUSDT,1582329723659000,1582329723781965,1.405,9676.97,9676.95,1.36 -binance-futures,BTCUSDT,1582329723779000,1582329723899493,0.1,9676.96,9676.95,1.36 -binance-futures,BTCUSDT,1582329723827000,1582329723947398,0.578,9676.96,9676.95,1.36 -binance-futures,BTCUSDT,1582329723847000,1582329723968173,0.1,9676.96,9676.95,1.36 -binance-futures,BTCUSDT,1582329723866000,1582329723987329,0.578,9676.96,9676.95,1.36 -binance-futures,BTCUSDT,1582329723886000,1582329724006789,0.1,9676.96,9676.95,1.36 -binance-futures,BTCUSDT,1582329723986000,1582329724107160,0.578,9676.96,9676.95,1.36 -binance-futures,BTCUSDT,1582329724005000,1582329724125194,0.478,9676.96,9676.95,1.36 -binance-futures,BTCUSDT,1582329724025000,1582329724145942,1.405,9676.97,9676.95,1.36 -binance-futures,BTCUSDT,1582329724577000,1582329724696435,0.1,9676.96,9676.95,1.36 -binance-futures,BTCUSDT,1582329724599000,1582329724718605,0.1,9676.96,9676.95,0.67 -binance-futures,BTCUSDT,1582329724611000,1582329724733176,0.1,9676.96,9675.14,0.442 -binance-futures,BTCUSDT,1582329724615000,1582329724736182,0.1,9676.96,9675.78,1 -binance-futures,BTCUSDT,1582329724633000,1582329724756909,2,9676.95,9675.78,7.05 -binance-futures,BTCUSDT,1582329724641000,1582329724762682,0.155,9676.92,9675.78,7.05 -binance-futures,BTCUSDT,1582329724656000,1582329724781377,0.155,9676.92,9675.79,0.69 -binance-futures,BTCUSDT,1582329724660000,1582329724782048,0.155,9676.92,9675.79,1.36 -binance-futures,BTCUSDT,1582329724663000,1582329724786702,0.155,9676.92,9675.79,1.365 -binance-futures,BTCUSDT,1582329724680000,1582329724800214,0.155,9676.92,9675.79,2.365 -binance-futures,BTCUSDT,1582329724680000,1582329724802934,0.155,9676.92,9675.79,11.415 -binance-futures,BTCUSDT,1582329724692000,1582329724813423,0.155,9676.92,9675.79,10.415 -binance-futures,BTCUSDT,1582329724702000,1582329724824783,0.155,9676.92,9675.81,0.031 -binance-futures,BTCUSDT,1582329724704000,1582329724826617,0.155,9676.92,9675.83,0.031 -binance-futures,BTCUSDT,1582329724706000,1582329724828438,1.25,9676.97,9675.83,0.031 -binance-futures,BTCUSDT,1582329724725000,1582329724847327,1.25,9676.97,9675.83,9.481 -binance-futures,BTCUSDT,1582329724727000,1582329724849226,0.155,9676.96,9675.83,9.481 -binance-futures,BTCUSDT,1582329724742000,1582329724864648,0.155,9676.96,9675.84,1 -binance-futures,BTCUSDT,1582329724751000,1582329724872212,0.155,9676.96,9675.87,0.031 -binance-futures,BTCUSDT,1582329724751000,1582329724873558,0.155,9676.96,9675.88,0.444 -binance-futures,BTCUSDT,1582329724753000,1582329724882443,1.136,9676.97,9675.88,0.444 -binance-futures,BTCUSDT,1582329724771000,1582329724891612,1.136,9676.97,9675.89,7.7 -binance-futures,BTCUSDT,1582329724777000,1582329724899432,0.155,9676.96,9675.89,7.7 -binance-futures,BTCUSDT,1582329724803000,1582329724930598,1.136,9676.97,9675.94,0.434 -binance-futures,BTCUSDT,1582329724826000,1582329724947736,1.136,9676.97,9675.94,15.484 -binance-futures,BTCUSDT,1582329724847000,1582329724968137,1.136,9676.97,9675.94,15.05 -binance-futures,BTCUSDT,1582329724852000,1582329724977688,1.136,9676.97,9675.98,0.031 -binance-futures,BTCUSDT,1582329724877000,1582329724998680,1.136,9676.97,9675.98,11.131 -binance-futures,BTCUSDT,1582329724903000,1582329725022853,1.136,9676.97,9676.01,0.031 -binance-futures,BTCUSDT,1582329724905000,1582329725027634,1.136,9676.97,9676.02,0.031 -binance-futures,BTCUSDT,1582329724927000,1582329725050792,1.136,9676.97,9676.02,11.431 -binance-futures,BTCUSDT,1582329724952000,1582329725076625,0.094,9676.92,9676.06,0.031 -binance-futures,BTCUSDT,1582329724954000,1582329725077624,1.136,9676.97,9676.06,0.031 -binance-futures,BTCUSDT,1582329724973000,1582329725093671,8.25,9676.91,9676.06,0.031 -binance-futures,BTCUSDT,1582329724991000,1582329725112957,8.25,9676.91,9676.07,0.67 -binance-futures,BTCUSDT,1582329725015000,1582329725138919,0.094,9676.9,9676.1,0.031 -binance-futures,BTCUSDT,1582329725021000,1582329725144068,2,9676.87,9676.11,0.031 -binance-futures,BTCUSDT,1582329725040000,1582329725161303,8.5,9676.87,9676.11,0.031 -binance-futures,BTCUSDT,1582329725048000,1582329725169423,0.094,9676.83,9676.11,0.031 -binance-futures,BTCUSDT,1582329725052000,1582329725173862,0.094,9676.83,9676.1,0.031 -binance-futures,BTCUSDT,1582329725052000,1582329725176141,0.094,9676.83,9675.05,0.455 -binance-futures,BTCUSDT,1582329725056000,1582329725178928,0.094,9676.83,9675,0.01 -binance-futures,BTCUSDT,1582329725059000,1582329725180488,2.094,9676.83,9675,0.01 -binance-futures,BTCUSDT,1582329725067000,1582329725188215,10.594,9676.83,9675,0.01 -binance-futures,BTCUSDT,1582329725081000,1582329725201456,10.594,9676.83,9675.01,0.005 -binance-futures,BTCUSDT,1582329725083000,1582329725204763,0.031,9676.79,9675.01,0.005 -binance-futures,BTCUSDT,1582329725085000,1582329725204793,0.094,9676.75,9675.01,0.005 -binance-futures,BTCUSDT,1582329725103000,1582329725225158,8.294,9676.75,9675.01,3.455 -binance-futures,BTCUSDT,1582329725122000,1582329725242994,0.094,9676.75,9675.01,3.455 -binance-futures,BTCUSDT,1582329725130000,1582329725252781,0.094,9676.66,9675.01,0.005 -binance-futures,BTCUSDT,1582329725153000,1582329725276310,0.094,9676.66,9675.05,0.031 -binance-futures,BTCUSDT,1582329725153000,1582329725277760,1.136,9676.97,9675.05,0.031 -binance-futures,BTCUSDT,1582329725159000,1582329725282636,0.094,9676.93,9675.05,0.031 -binance-futures,BTCUSDT,1582329725172000,1582329725294127,0.094,9676.93,9675.05,6.081 -binance-futures,BTCUSDT,1582329725178000,1582329725300285,0.094,9676.93,9675.05,6.05 -binance-futures,BTCUSDT,1582329725182000,1582329725303243,2.694,9676.93,9675.05,6.05 -binance-futures,BTCUSDT,1582329725188000,1582329725312181,2.694,9676.93,9675.06,0.005 -binance-futures,BTCUSDT,1582329725189000,1582329725314864,2.694,9676.93,9675.06,0.032 -binance-futures,BTCUSDT,1582329725193000,1582329725322739,0.094,9676.93,9675.06,0.032 -binance-futures,BTCUSDT,1582329725198000,1582329725323253,0.094,9676.93,9675.09,0.031 -binance-futures,BTCUSDT,1582329725217000,1582329725339559,0.094,9676.93,9675.06,7.653 -binance-futures,BTCUSDT,1582329725223000,1582329725344334,0.094,9676.93,9675.09,6.6 -binance-futures,BTCUSDT,1582329725227000,1582329725350371,0.094,9676.93,9675.1,0.449 -binance-futures,BTCUSDT,1582329725247000,1582329725371855,1.136,9676.97,9675.1,0.48 -binance-futures,BTCUSDT,1582329725249000,1582329725372716,1.136,9676.97,9675.1,8.33 -binance-futures,BTCUSDT,1582329725255000,1582329725379272,1.136,9676.97,9675.1,9 -binance-futures,BTCUSDT,1582329725257000,1582329725381209,1.136,9676.97,9675.1,9.69 -binance-futures,BTCUSDT,1582329725275000,1582329725397426,1.136,9676.97,9675.1,9 -binance-futures,BTCUSDT,1582329725276000,1582329725398231,1.136,9676.97,9675.17,0.469 -binance-futures,BTCUSDT,1582329725293000,1582329725413776,0.094,9676.96,9675.17,0.469 -binance-futures,BTCUSDT,1582329725299000,1582329725421442,1.136,9676.97,9675.17,6.019 -binance-futures,BTCUSDT,1582329725315000,1582329725465708,1.136,9676.97,9675.17,0.469 -binance-futures,BTCUSDT,1582329725329000,1582329725473289,1.136,9676.97,9675.14,0.031 -binance-futures,BTCUSDT,1582329725331000,1582329725473628,1.136,9676.97,9675.22,0.43 -binance-futures,BTCUSDT,1582329725372000,1582329725494042,1.136,9676.97,9675.22,3.83 -binance-futures,BTCUSDT,1582329725377000,1582329725501580,0.094,9676.96,9675.22,3.83 -binance-futures,BTCUSDT,1582329725388000,1582329725509607,0.094,9676.96,9675.9,2.01 -binance-futures,BTCUSDT,1582329725403000,1582329725524681,1.136,9676.97,9675.9,2.01 -binance-futures,BTCUSDT,1582329725415000,1582329725536827,1.136,9676.97,9675.91,0.458 -binance-futures,BTCUSDT,1582329725427000,1582329725553077,1.136,9676.97,9675.92,0.031 -binance-futures,BTCUSDT,1582329725429000,1582329725554209,1.136,9676.97,9675.94,0.031 -binance-futures,BTCUSDT,1582329725455000,1582329725581895,1.136,9676.97,9675.94,2.131 -binance-futures,BTCUSDT,1582329725458000,1582329725581930,1.136,9676.97,9675.94,2.801 -binance-futures,BTCUSDT,1582329725459000,1582329725590716,1.551,9678.6,9675.94,2.801 -binance-futures,BTCUSDT,1582329725460000,1582329725593171,0.094,9677.38,9675.94,2.801 -binance-futures,BTCUSDT,1582329725467000,1582329725596792,0.094,9677.38,9675.94,3.491 -binance-futures,BTCUSDT,1582329725467000,1582329725597244,0.094,9677.38,9675.94,1.391 -binance-futures,BTCUSDT,1582329725473000,1582329725598211,0.094,9677.38,9675.96,0.031 -binance-futures,BTCUSDT,1582329725481000,1582329725603037,1.752,9676.96,9675.96,0.031 -binance-futures,BTCUSDT,1582329725491000,1582329725613813,1.752,9676.96,9675.99,0.459 -binance-futures,BTCUSDT,1582329725506000,1582329725631676,1.752,9676.96,9676,0.031 -binance-futures,BTCUSDT,1582329725528000,1582329725649860,1.752,9676.96,9676,8.981 -binance-futures,BTCUSDT,1582329725536000,1582329725660007,1.752,9676.96,9676.05,0.441 -binance-futures,BTCUSDT,1582329725561000,1582329725685733,1.752,9676.96,9676.05,9.341 -binance-futures,BTCUSDT,1582329725588000,1582329725709138,1.752,9676.96,9676.05,8.9 -binance-futures,BTCUSDT,1582329725590000,1582329725712201,1.752,9676.96,9676.12,0.442 -binance-futures,BTCUSDT,1582329725608000,1582329725726867,1.752,9676.96,9676.12,7.092 -binance-futures,BTCUSDT,1582329725633000,1582329725755519,1.752,9676.96,9676.14,0.436 -binance-futures,BTCUSDT,1582329725654000,1582329725775409,1.752,9676.96,9676.14,6.486 -binance-futures,BTCUSDT,1582329725658000,1582329725778702,1.752,9676.96,9676.18,0.031 -binance-futures,BTCUSDT,1582329725679000,1582329725799457,1.752,9676.96,9676.18,5.431 -binance-futures,BTCUSDT,1582329725694000,1582329725814666,1.752,9676.96,9676.19,0.69 -binance-futures,BTCUSDT,1582329725698000,1582329725817412,1.752,9676.96,9676.19,2.7 -binance-futures,BTCUSDT,1582329725711000,1582329725832529,1.752,9676.96,9676.19,7.35 -binance-futures,BTCUSDT,1582329725716000,1582329725838671,1.752,9676.96,9676.23,0.031 -binance-futures,BTCUSDT,1582329725735000,1582329725855443,1.752,9676.96,9676.23,5.781 -binance-futures,BTCUSDT,1582329725760000,1582329725882275,1.752,9676.96,9676.31,0.467 -binance-futures,BTCUSDT,1582329725767000,1582329725887623,1.752,9676.96,9676.24,0.69 -binance-futures,BTCUSDT,1582329725784000,1582329725903876,1.752,9676.96,9676.31,4.25 -binance-futures,BTCUSDT,1582329725810000,1582329725931133,1.752,9676.96,9676.33,0.439 -binance-futures,BTCUSDT,1582329725828000,1582329725951282,1.752,9676.96,9676.33,4.489 -binance-futures,BTCUSDT,1582329725834000,1582329725957065,1.752,9676.96,9676.37,0.031 -binance-futures,BTCUSDT,1582329725838000,1582329725959112,2.185,9677.38,9676.37,0.031 -binance-futures,BTCUSDT,1582329725854000,1582329725975760,2.185,9677.38,9676.37,4.731 -binance-futures,BTCUSDT,1582329725870000,1582329725992595,2.049,9676.96,9676.37,4.731 -binance-futures,BTCUSDT,1582329725889000,1582329726011876,2.049,9676.96,9676.4,0.448 -binance-futures,BTCUSDT,1582329725889000,1582329726013501,2.049,9676.96,9676.41,0.031 -binance-futures,BTCUSDT,1582329725913000,1582329726035796,2.049,9676.96,9676.41,2.681 -binance-futures,BTCUSDT,1582329725923000,1582329726046183,2.049,9676.96,9676.41,0.031 -binance-futures,BTCUSDT,1582329725937000,1582329726060346,2.049,9676.96,9676.43,0.031 -binance-futures,BTCUSDT,1582329725937000,1582329726060364,2.049,9676.96,9676.45,0.031 -binance-futures,BTCUSDT,1582329725964000,1582329726086004,2.049,9676.96,9676.44,0.031 -binance-futures,BTCUSDT,1582329726103000,1582329726223829,2.049,9676.96,9676.46,0.031 -binance-futures,BTCUSDT,1582329726122000,1582329726243965,2.049,9676.96,9676.46,2.181 -binance-futures,BTCUSDT,1582329726149000,1582329726269861,2.049,9676.96,9676.5,0.031 -binance-futures,BTCUSDT,1582329726166000,1582329726286485,2.049,9676.96,9676.5,2.581 -binance-futures,BTCUSDT,1582329726205000,1582329726329798,2.049,9676.96,9676.5,0.031 -binance-futures,BTCUSDT,1582329726207000,1582329726330375,2.049,9676.96,9676.54,0.031 -binance-futures,BTCUSDT,1582329726211000,1582329726336797,2.049,9676.96,9676.95,2.01 -binance-futures,BTCUSDT,1582329726337000,1582329726463677,2.149,9676.96,9676.94,1.36 -binance-futures,BTCUSDT,1582329726376000,1582329726495419,2.149,9676.96,9676.94,0.69 -binance-futures,BTCUSDT,1582329726377000,1582329726499022,2,9676.95,9676.94,0.69 -binance-futures,BTCUSDT,1582329726381000,1582329726501722,3,9676.95,9676.94,0.69 -binance-futures,BTCUSDT,1582329726382000,1582329726504231,3,9676.95,9676.51,2.01 -binance-futures,BTCUSDT,1582329726403000,1582329726525885,2,9676.89,9676.51,2.01 -binance-futures,BTCUSDT,1582329726431000,1582329726553893,0.058,9676.86,9676.51,2.01 -binance-futures,BTCUSDT,1582329726450000,1582329726570767,2,9676.8,9676.51,2.01 -binance-futures,BTCUSDT,1582329726452000,1582329726573016,4,9676.8,9676.51,2.01 -binance-futures,BTCUSDT,1582329726471000,1582329726595614,2,9676.74,9676.51,2.01 -binance-futures,BTCUSDT,1582329726472000,1582329726596227,4,9676.74,9676.51,2.01 -binance-futures,BTCUSDT,1582329726497000,1582329726618654,4,9676.74,9676.52,2.01 -binance-futures,BTCUSDT,1582329726497000,1582329726620075,2,9676.68,9676.52,2.01 -binance-futures,BTCUSDT,1582329726504000,1582329726626268,4,9676.68,9676.52,2.01 -binance-futures,BTCUSDT,1582329726519000,1582329726642265,1,9676.57,9676.52,2.01 -binance-futures,BTCUSDT,1582329726544000,1582329726667388,2,9676.53,9676.52,2.01 -binance-futures,BTCUSDT,1582329726547000,1582329726667402,3,9676.53,9676.52,2.01 -binance-futures,BTCUSDT,1582329726573000,1582329726692333,3,9676.53,9676.52,2.7 -binance-futures,BTCUSDT,1582329726579000,1582329726700353,3,9676.53,9676.52,3.37 -binance-futures,BTCUSDT,1582329726587000,1582329726709636,3,9676.53,9676.52,1.36 -binance-futures,BTCUSDT,1582329726603000,1582329726722883,3,9676.53,9676.52,0.67 -binance-futures,BTCUSDT,1582329726606000,1582329726730094,3,9676.53,9675.56,0.1 -binance-futures,BTCUSDT,1582329726617000,1582329726740690,3.058,9676.53,9675.56,0.1 -binance-futures,BTCUSDT,1582329726637000,1582329726759336,2,9676.52,9675.56,0.1 -binance-futures,BTCUSDT,1582329726642000,1582329726762941,2,9676.52,9675.57,0.005 -binance-futures,BTCUSDT,1582329726647000,1582329726769441,0.058,9676.5,9675.57,0.675 -binance-futures,BTCUSDT,1582329726653000,1582329726774649,0.058,9676.5,9675.57,1.365 -binance-futures,BTCUSDT,1582329726661000,1582329726783895,7.55,9676.52,9675.57,1.365 -binance-futures,BTCUSDT,1582329726667000,1582329726788882,4.7,9676.5,9675.57,1.365 -binance-futures,BTCUSDT,1582329726673000,1582329726793359,4.7,9676.5,9675.57,0.675 -binance-futures,BTCUSDT,1582329726678000,1582329726797128,4.7,9676.5,9675.58,0.471 -binance-futures,BTCUSDT,1582329726699000,1582329726821364,4.7,9676.5,9675.57,0.005 -binance-futures,BTCUSDT,1582329726700000,1582329726821521,0.058,9676.49,9675.57,0.005 -binance-futures,BTCUSDT,1582329726711000,1582329726831946,2.058,9676.49,9675.57,0.005 -binance-futures,BTCUSDT,1582329726713000,1582329726835324,2.058,9676.49,9675.9,2.01 -binance-futures,BTCUSDT,1582329726721000,1582329726842921,8.158,9676.49,9675.9,2.01 -binance-futures,BTCUSDT,1582329726727000,1582329726850740,2,9676.48,9675.9,2.01 -binance-futures,BTCUSDT,1582329726729000,1582329726854697,4,9676.48,9675.9,2.01 -binance-futures,BTCUSDT,1582329726739000,1582329726861498,2,9676.48,9675.9,2.01 -binance-futures,BTCUSDT,1582329726745000,1582329726868324,0.1,9676.51,9675.9,2.01 -binance-futures,BTCUSDT,1582329726750000,1582329726870674,2.75,9676.48,9675.9,2.01 -binance-futures,BTCUSDT,1582329726771000,1582329726893736,2.75,9676.48,9675.92,0.031 -binance-futures,BTCUSDT,1582329726773000,1582329726893750,2.75,9676.48,9675.93,0.031 -binance-futures,BTCUSDT,1582329726775000,1582329726898321,2.75,9676.48,9675.94,0.031 -binance-futures,BTCUSDT,1582329726796000,1582329726918689,0.058,9676.47,9675.94,0.031 -binance-futures,BTCUSDT,1582329726817000,1582329726940094,7.208,9676.47,9675.94,0.031 -binance-futures,BTCUSDT,1582329726817000,1582329726940822,7.15,9676.47,9675.94,0.031 -binance-futures,BTCUSDT,1582329726819000,1582329726942030,7.15,9676.47,9675.95,0.031 -binance-futures,BTCUSDT,1582329726841000,1582329726964205,7.15,9676.47,9675.93,0.031 -binance-futures,BTCUSDT,1582329726844000,1582329726967218,7.15,9676.47,9675.9,2.01 -binance-futures,BTCUSDT,1582329726863000,1582329726987198,0.058,9676.46,9675.9,2.01 -binance-futures,BTCUSDT,1582329726871000,1582329726991694,7.15,9676.47,9675.9,2.01 -binance-futures,BTCUSDT,1582329726884000,1582329727004530,6.8,9676.46,9675.9,2.01 -binance-futures,BTCUSDT,1582329726963000,1582329727085057,6.8,9676.46,9675.91,2.01 -binance-futures,BTCUSDT,1582329726994000,1582329727118184,6.607,9676.46,9675.91,2.01 -binance-futures,BTCUSDT,1582329726996000,1582329727120016,6.607,9676.46,9675.56,0.1 -binance-futures,BTCUSDT,1582329727010000,1582329727130849,2.617,9676.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329727013000,1582329727134384,0.058,9676.38,9675.56,0.1 -binance-futures,BTCUSDT,1582329727021000,1582329727141270,0.058,9676.38,9675.91,2.01 -binance-futures,BTCUSDT,1582329727032000,1582329727155554,5.808,9676.38,9675.91,2.01 -binance-futures,BTCUSDT,1582329727045000,1582329727167243,0.058,9676.38,9675.91,2.01 -binance-futures,BTCUSDT,1582329727056000,1582329727177816,2.617,9676.57,9675.91,2.01 -binance-futures,BTCUSDT,1582329727062000,1582329727182278,0.058,9676.36,9675.91,2.01 -binance-futures,BTCUSDT,1582329727078000,1582329727198773,2.617,9676.57,9675.91,2.01 -binance-futures,BTCUSDT,1582329727082000,1582329727201392,0.058,9676.56,9675.91,2.01 -binance-futures,BTCUSDT,1582329727082000,1582329727204003,2.25,9676.36,9675.91,2.01 -binance-futures,BTCUSDT,1582329727098000,1582329727219070,2.25,9676.36,9675.56,0.1 -binance-futures,BTCUSDT,1582329727112000,1582329727232420,0.058,9676.33,9675.56,0.1 -binance-futures,BTCUSDT,1582329727120000,1582329727242967,0.058,9676.33,9676.06,0.031 -binance-futures,BTCUSDT,1582329727132000,1582329727253655,5.258,9676.33,9676.06,0.031 -binance-futures,BTCUSDT,1582329727132000,1582329727255776,2,9676.32,9676.06,0.031 -binance-futures,BTCUSDT,1582329727138000,1582329727258589,4,9676.32,9676.06,0.031 -binance-futures,BTCUSDT,1582329727146000,1582329727268524,2,9676.32,9675.91,2.01 -binance-futures,BTCUSDT,1582329727155000,1582329727279322,0.058,9676.33,9675.91,2.01 -binance-futures,BTCUSDT,1582329727157000,1582329727279341,0.058,9676.3,9675.91,2.01 -binance-futures,BTCUSDT,1582329727183000,1582329727304964,2.617,9676.57,9675.91,2.01 -binance-futures,BTCUSDT,1582329727188000,1582329727310875,0.058,9676.56,9675.91,2.01 -binance-futures,BTCUSDT,1582329727207000,1582329727328788,0.058,9676.56,9675.95,0.031 -binance-futures,BTCUSDT,1582329727212000,1582329727334151,4.358,9676.56,9675.95,0.031 -binance-futures,BTCUSDT,1582329727227000,1582329727366039,0.058,9676.56,9675.95,0.031 -binance-futures,BTCUSDT,1582329727247000,1582329727370131,2.617,9676.57,9675.95,0.031 -binance-futures,BTCUSDT,1582329727249000,1582329727377189,2.617,9676.57,9675.92,2.01 -binance-futures,BTCUSDT,1582329727260000,1582329727380383,0.058,9676.55,9675.92,2.01 -binance-futures,BTCUSDT,1582329727269000,1582329727393839,0.058,9676.55,9675.98,0.031 -binance-futures,BTCUSDT,1582329727271000,1582329727393853,0.058,9676.55,9675.99,0.031 -binance-futures,BTCUSDT,1582329727277000,1582329727401533,2.617,9676.57,9675.99,0.031 -binance-futures,BTCUSDT,1582329727294000,1582329727412936,2.617,9676.57,9675.98,0.031 -binance-futures,BTCUSDT,1582329727294000,1582329727413518,2.617,9676.57,9675.97,0.031 -binance-futures,BTCUSDT,1582329727296000,1582329727420256,2.617,9676.57,9675.92,2.01 -binance-futures,BTCUSDT,1582329727326000,1582329727455031,2.617,9676.57,9676.01,0.031 -binance-futures,BTCUSDT,1582329727327000,1582329727455653,0.058,9676.36,9676.02,0.031 -binance-futures,BTCUSDT,1582329727359000,1582329727480085,0.058,9676.36,9676,0.031 -binance-futures,BTCUSDT,1582329727363000,1582329727482219,0.058,9676.36,9675.56,0.1 -binance-futures,BTCUSDT,1582329727373000,1582329727492858,2,9676.35,9675.56,0.1 -binance-futures,BTCUSDT,1582329727389000,1582329727510774,2.68,9676.35,9675.56,0.1 -binance-futures,BTCUSDT,1582329727393000,1582329727515612,6.03,9676.35,9675.56,0.1 -binance-futures,BTCUSDT,1582329727395000,1582329727519167,6.77,9676.35,9675.56,0.1 -binance-futures,BTCUSDT,1582329727397000,1582329727521888,4.77,9676.35,9675.56,0.1 -binance-futures,BTCUSDT,1582329727408000,1582329727529168,0.058,9676.34,9675.56,0.1 -binance-futures,BTCUSDT,1582329727410000,1582329727531242,2.058,9676.34,9675.56,0.1 -binance-futures,BTCUSDT,1582329727412000,1582329727536192,4.058,9676.34,9675.56,0.1 -binance-futures,BTCUSDT,1582329727416000,1582329727537806,4.058,9676.34,9675.92,2.01 -binance-futures,BTCUSDT,1582329727429000,1582329727550790,2,9676.33,9675.92,2.01 -binance-futures,BTCUSDT,1582329727430000,1582329727551296,2,9676.3,9675.92,2.01 -binance-futures,BTCUSDT,1582329727436000,1582329727555454,0.058,9676.27,9675.92,2.01 -binance-futures,BTCUSDT,1582329727454000,1582329727575830,2.808,9676.27,9675.92,2.01 -binance-futures,BTCUSDT,1582329727465000,1582329727587287,2.75,9676.27,9675.93,2.01 -binance-futures,BTCUSDT,1582329727467000,1582329727587809,0.682,9676.47,9675.93,2.01 -binance-futures,BTCUSDT,1582329727483000,1582329727604630,0.058,9676.33,9675.93,2.01 -binance-futures,BTCUSDT,1582329727488000,1582329727609122,0.058,9676.26,9675.93,2.01 -binance-futures,BTCUSDT,1582329727490000,1582329727612369,0.058,9676.26,9675.97,0.031 -binance-futures,BTCUSDT,1582329727491000,1582329727613780,0.682,9676.47,9675.97,0.031 -binance-futures,BTCUSDT,1582329727511000,1582329727631535,0.682,9676.47,9675.96,0.031 -binance-futures,BTCUSDT,1582329727564000,1582329727684440,0.058,9676.46,9675.96,0.031 -binance-futures,BTCUSDT,1582329727567000,1582329727690538,0.058,9676.46,9675.56,0.531 -binance-futures,BTCUSDT,1582329727568000,1582329727691036,2.058,9676.46,9675.56,0.531 -binance-futures,BTCUSDT,1582329727580000,1582329727701264,2.058,9676.46,9675.56,0.1 -binance-futures,BTCUSDT,1582329727582000,1582329727703263,0.058,9676.46,9675.56,0.1 -binance-futures,BTCUSDT,1582329727584000,1582329727707344,6.208,9676.46,9675.56,0.1 -binance-futures,BTCUSDT,1582329727602000,1582329727724252,2,9676.45,9675.93,2.01 -binance-futures,BTCUSDT,1582329727604000,1582329727725554,2,9676.42,9675.93,2.01 -binance-futures,BTCUSDT,1582329727612000,1582329727733002,0.058,9676.39,9675.93,2.01 -binance-futures,BTCUSDT,1582329727632000,1582329727751556,4.308,9676.39,9675.93,2.01 -binance-futures,BTCUSDT,1582329727649000,1582329727769947,2,9676.34,9675.93,2.01 -binance-futures,BTCUSDT,1582329727659000,1582329727782674,0.058,9676.05,9675.93,2.01 -binance-futures,BTCUSDT,1582329727680000,1582329727800327,2.558,9676.05,9675.93,2.01 -binance-futures,BTCUSDT,1582329727700000,1582329727819393,2.558,9676.05,9675.57,0.005 -binance-futures,BTCUSDT,1582329727704000,1582329727825674,2.5,9676.05,9675.57,0.005 -binance-futures,BTCUSDT,1582329727704000,1582329727826961,0.058,9675.98,9675.57,0.005 -binance-futures,BTCUSDT,1582329727724000,1582329727844921,2,9676.04,9675.57,0.005 -binance-futures,BTCUSDT,1582329727724000,1582329727846523,8,9675.98,9675.57,0.005 -binance-futures,BTCUSDT,1582329727746000,1582329727866035,2,9675.94,9675.57,0.005 -binance-futures,BTCUSDT,1582329727764000,1582329727883261,8.5,9675.94,9675.57,0.005 -binance-futures,BTCUSDT,1582329727766000,1582329727888028,10.5,9675.94,9675.57,0.005 -binance-futures,BTCUSDT,1582329727770000,1582329727889401,0.058,9675.92,9675.57,0.005 -binance-futures,BTCUSDT,1582329727788000,1582329727908732,8.408,9675.92,9675.57,0.005 -binance-futures,BTCUSDT,1582329727791000,1582329727911225,8.35,9675.92,9675.57,0.005 -binance-futures,BTCUSDT,1582329727802000,1582329727922148,10.35,9675.92,9675.57,0.005 -binance-futures,BTCUSDT,1582329727811000,1582329727929869,0.68,9675.91,9675.57,0.005 -binance-futures,BTCUSDT,1582329727812000,1582329727933128,0.058,9675.86,9675.57,0.005 -binance-futures,BTCUSDT,1582329727828000,1582329727949744,0.1,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329727847000,1582329727966619,4.8,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329727884000,1582329728003500,0.1,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329727895000,1582329728019872,0.09,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329728095000,1582329728216793,2,9676.09,9675.57,0.005 -binance-futures,BTCUSDT,1582329728106000,1582329728228015,2,9676.21,9675.57,0.005 -binance-futures,BTCUSDT,1582329728112000,1582329728232542,2,9676.31,9675.57,0.005 -binance-futures,BTCUSDT,1582329728113000,1582329728237487,2,9676.31,9676.04,2.01 -binance-futures,BTCUSDT,1582329728121000,1582329728240510,2,9676.24,9676.04,2.01 -binance-futures,BTCUSDT,1582329728129000,1582329728249547,0.058,9676.23,9676.04,2.01 -binance-futures,BTCUSDT,1582329728136000,1582329728258287,2,9676.3,9676.04,2.01 -binance-futures,BTCUSDT,1582329728142000,1582329728265201,0.682,9676.47,9676.04,2.01 -binance-futures,BTCUSDT,1582329728146000,1582329728268004,3,9676.23,9676.04,2.01 -binance-futures,BTCUSDT,1582329728190000,1582329728310443,0.058,9676.22,9676.04,2.01 -binance-futures,BTCUSDT,1582329728203000,1582329728323386,1,9676.2,9676.04,2.01 -binance-futures,BTCUSDT,1582329728208000,1582329728329348,1,9676.16,9676.04,2.01 -binance-futures,BTCUSDT,1582329728223000,1582329728345444,1,9676.12,9676.04,2.01 -binance-futures,BTCUSDT,1582329728229000,1582329728361391,1,9676.11,9676.04,2.01 -binance-futures,BTCUSDT,1582329728236000,1582329728387012,3,9676.11,9676.04,2.01 -binance-futures,BTCUSDT,1582329728243000,1582329728389986,1,9676.05,9676.04,2.01 -binance-futures,BTCUSDT,1582329728284000,1582329728404761,3,9676.05,9676.04,2.01 -binance-futures,BTCUSDT,1582329728287000,1582329728409241,6,9676.05,9676.04,2.01 -binance-futures,BTCUSDT,1582329728296000,1582329728420669,6.058,9676.05,9676.04,2.01 -binance-futures,BTCUSDT,1582329728306000,1582329728427249,3.058,9676.05,9676.04,2.01 -binance-futures,BTCUSDT,1582329728315000,1582329728436400,3.148,9676.05,9676.04,2.01 -binance-futures,BTCUSDT,1582329728346000,1582329728468540,3.148,9676.05,9675.56,0.1 -binance-futures,BTCUSDT,1582329728368000,1582329728490708,4,9676.01,9675.56,0.1 -binance-futures,BTCUSDT,1582329728373000,1582329728496197,4.058,9676.01,9675.57,0.005 -binance-futures,BTCUSDT,1582329728389000,1582329728513142,2,9675.97,9675.57,0.005 -binance-futures,BTCUSDT,1582329728395000,1582329728514957,0.058,9675.95,9675.57,0.005 -binance-futures,BTCUSDT,1582329728405000,1582329728526338,2.058,9675.95,9675.57,0.005 -binance-futures,BTCUSDT,1582329728410000,1582329728531717,2,9675.91,9675.57,0.005 -binance-futures,BTCUSDT,1582329728412000,1582329728533962,4,9675.91,9675.57,0.005 -binance-futures,BTCUSDT,1582329728416000,1582329728537924,6,9675.91,9675.57,0.005 -binance-futures,BTCUSDT,1582329728428000,1582329728551972,2,9675.89,9675.57,0.005 -binance-futures,BTCUSDT,1582329728430000,1582329728553603,0.058,9675.83,9675.57,0.005 -binance-futures,BTCUSDT,1582329728452000,1582329728577213,2,9675.79,9675.57,0.005 -binance-futures,BTCUSDT,1582329728476000,1582329728601687,7.4,9675.79,9675.57,0.005 -binance-futures,BTCUSDT,1582329728482000,1582329728603700,0.058,9675.74,9675.57,0.005 -binance-futures,BTCUSDT,1582329728503000,1582329728624998,2,9675.7,9675.57,0.005 -binance-futures,BTCUSDT,1582329728509000,1582329728632536,1,9675.66,9675.57,0.005 -binance-futures,BTCUSDT,1582329728521000,1582329728643111,1,9675.59,9675.57,0.005 -binance-futures,BTCUSDT,1582329728531000,1582329728654503,1,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329728540000,1582329728665559,3,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329728544000,1582329728666685,5,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329728546000,1582329728668414,5.058,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329728552000,1582329728671850,11.758,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329728569000,1582329728692919,7.058,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329728576000,1582329728697976,9.058,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329728581000,1582329728700411,9.738,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329728625000,1582329728749231,10.478,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329728650000,1582329728770638,10.478,9675.58,9675.57,0.464 -binance-futures,BTCUSDT,1582329728652000,1582329728773073,10.42,9675.58,9675.57,0.464 -binance-futures,BTCUSDT,1582329728656000,1582329728775513,10.42,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329728669000,1582329728788284,8.42,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329728673000,1582329728792698,6.42,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329728686000,1582329728806378,8.42,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329728689000,1582329728808773,10.42,9675.58,9675.57,0.005 -binance-futures,BTCUSDT,1582329728693000,1582329728811143,10.42,9675.58,9675.56,0.1 -binance-futures,BTCUSDT,1582329728698000,1582329728819867,10.478,9675.58,9675.56,0.1 -binance-futures,BTCUSDT,1582329728700000,1582329728819878,8.478,9675.58,9675.56,0.1 -binance-futures,BTCUSDT,1582329728702000,1582329728828018,6.478,9675.58,9675.56,0.1 -binance-futures,BTCUSDT,1582329728707000,1582329728829753,2,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329728711000,1582329728833651,4,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329728727000,1582329728849772,7.25,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329728735000,1582329728857664,4,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329728744000,1582329728868431,3,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329728747000,1582329728869513,3.74,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329728758000,1582329728877691,4.42,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329728764000,1582329728886002,2.42,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329728764000,1582329728886009,1.42,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329728785000,1582329728905328,0.74,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329728788000,1582329728908768,1.058,9675.58,9675.56,0.1 -binance-futures,BTCUSDT,1582329728839000,1582329728961774,1,9675.58,9675.56,0.1 -binance-futures,BTCUSDT,1582329728925000,1582329729048912,1,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329728942000,1582329729062432,1.058,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329728948000,1582329729068405,1,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329728955000,1582329729077496,1,9675.57,9675.56,0.565 -binance-futures,BTCUSDT,1582329728964000,1582329729083491,1,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329729009000,1582329729130179,1.058,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329729013000,1582329729133028,1,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329729037000,1582329729157280,1.74,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329729053000,1582329729174646,2.42,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329729075000,1582329729194893,1.68,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329729080000,1582329729199895,1,9675.57,9675.56,0.1 -binance-futures,BTCUSDT,1582329729120000,1582329729247721,1,9675.57,9673.89,0.363 -binance-futures,BTCUSDT,1582329729135000,1582329729255783,1.058,9675.57,9673.89,0.363 -binance-futures,BTCUSDT,1582329729143000,1582329729276616,5.05,9675.56,9673.89,0.363 -binance-futures,BTCUSDT,1582329729157000,1582329729568136,0.093,9675.51,9673.89,0.363 -binance-futures,BTCUSDT,1582329729157000,1582329729568182,0.093,9675.51,9673.33,0.44 -binance-futures,BTCUSDT,1582329729159000,1582329729568228,0.093,9675.51,9673.92,0.031 -binance-futures,BTCUSDT,1582329729159000,1582329729568248,0.093,9675.51,9673.93,0.031 -binance-futures,BTCUSDT,1582329729182000,1582329729568465,0.093,9675.51,9673.92,0.031 -binance-futures,BTCUSDT,1582329729183000,1582329729568478,0.093,9675.51,9673.9,1.36 -binance-futures,BTCUSDT,1582329729192000,1582329729568597,9.843,9675.51,9673.9,1.36 -binance-futures,BTCUSDT,1582329729204000,1582329729568885,9.843,9675.51,9673.97,0.031 -binance-futures,BTCUSDT,1582329729218000,1582329729568997,0.093,9675.45,9673.97,0.031 -binance-futures,BTCUSDT,1582329729254000,1582329729569386,8.093,9675.45,9673.97,0.031 -binance-futures,BTCUSDT,1582329729256000,1582329729569411,8,9675.45,9673.98,0.465 -binance-futures,BTCUSDT,1582329729271000,1582329729569689,8,9675.45,9674.01,0.031 -binance-futures,BTCUSDT,1582329729286000,1582329729569835,0.093,9675.43,9674.01,0.031 -binance-futures,BTCUSDT,1582329729308000,1582329729570117,6.343,9675.43,9674.01,0.031 -binance-futures,BTCUSDT,1582329729315000,1582329729570162,6.25,9675.43,9674.01,0.031 -binance-futures,BTCUSDT,1582329729325000,1582329729570408,6.25,9675.43,9674.02,0.432 -binance-futures,BTCUSDT,1582329729333000,1582329729570464,6.25,9675.43,9674.02,0.463 -binance-futures,BTCUSDT,1582329729348000,1582329729570696,6.25,9675.43,9674.06,0.031 -binance-futures,BTCUSDT,1582329729375000,1582329729570961,6.25,9675.43,9674.11,0.45 -binance-futures,BTCUSDT,1582329729390000,1582329729571082,1.19,9675.58,9674.11,0.45 -binance-futures,BTCUSDT,1582329729397000,1582329729571137,1.19,9675.58,9674.15,0.031 -binance-futures,BTCUSDT,1582329729442000,1582329729571650,1.19,9675.58,9674.25,0.45 -binance-futures,BTCUSDT,1582329729456000,1582329729581617,1.19,9675.58,9674.16,1.031 -binance-futures,BTCUSDT,1582329729466000,1582329729591372,1.19,9675.58,9674.16,0.031 -binance-futures,BTCUSDT,1582329729468000,1582329729597833,1.19,9675.58,9674.15,0.432 -binance-futures,BTCUSDT,1582329729468000,1582329729597867,1.19,9675.58,9674.28,0.031 -binance-futures,BTCUSDT,1582329729470000,1582329729597877,1.19,9675.58,9674.29,0.031 -binance-futures,BTCUSDT,1582329729473000,1582329729597911,0.093,9675.56,9674.29,0.031 -binance-futures,BTCUSDT,1582329729488000,1582329729609825,0.093,9675.56,9674.17,1 -binance-futures,BTCUSDT,1582329729490000,1582329729611647,0.093,9675.56,9674.29,2.1 -binance-futures,BTCUSDT,1582329729503000,1582329729622224,0.093,9675.56,9674.3,1 -binance-futures,BTCUSDT,1582329729514000,1582329729634919,0.093,9675.56,9674.31,0.031 -binance-futures,BTCUSDT,1582329729514000,1582329729635001,0.093,9675.56,9674.33,0.031 -binance-futures,BTCUSDT,1582329729534000,1582329729657731,0.093,9675.56,9674.33,3.231 -binance-futures,BTCUSDT,1582329729546000,1582329729668166,0.093,9675.56,9674.34,1 -binance-futures,BTCUSDT,1582329729560000,1582329729685043,1.19,9675.58,9674.34,1 -binance-futures,BTCUSDT,1582329729563000,1582329729686352,1.19,9675.58,9674.43,0.453 -binance-futures,BTCUSDT,1582329729571000,1582329729694962,1.009,9675.58,9674.43,0.453 -binance-futures,BTCUSDT,1582329729582000,1582329729701806,1.009,9675.58,9674.38,0.031 -binance-futures,BTCUSDT,1582329729589000,1582329729712213,1.009,9675.58,9674.43,4.8 -binance-futures,BTCUSDT,1582329729611000,1582329729731378,0.093,9675.57,9674.43,4.8 -binance-futures,BTCUSDT,1582329729618000,1582329729752443,1.009,9675.58,9674.43,4.8 -binance-futures,BTCUSDT,1582329729622000,1582329729752473,1.009,9675.58,9674.45,0.43 -binance-futures,BTCUSDT,1582329729633000,1582329729758419,1.009,9675.58,9674.47,0.031 -binance-futures,BTCUSDT,1582329729654000,1582329729774941,1.009,9675.58,9674.47,3.081 -binance-futures,BTCUSDT,1582329729665000,1582329729792040,1.009,9675.58,9674.47,0.031 -binance-futures,BTCUSDT,1582329729695000,1582329729817088,1.009,9675.58,9674.5,0.031 -binance-futures,BTCUSDT,1582329729698000,1582329729820175,0.093,9675.57,9674.5,0.031 -binance-futures,BTCUSDT,1582329729727000,1582329729846672,1.009,9675.58,9674.5,0.031 -binance-futures,BTCUSDT,1582329729747000,1582329729869142,0.093,9675.57,9674.5,0.031 -binance-futures,BTCUSDT,1582329729748000,1582329729871666,1.009,9675.58,9674.5,0.031 -binance-futures,BTCUSDT,1582329729755000,1582329729875494,1.009,9675.58,9674.48,0.031 -binance-futures,BTCUSDT,1582329729772000,1582329729894746,1.009,9675.58,9674.53,0.031 -binance-futures,BTCUSDT,1582329729776000,1582329729899312,1.009,9675.58,9674.54,0.031 -binance-futures,BTCUSDT,1582329729795000,1582329729915198,1.009,9675.58,9674.48,0.031 -binance-futures,BTCUSDT,1582329729801000,1582329729922043,1.009,9675.58,9674.34,0.43 -binance-futures,BTCUSDT,1582329729818000,1582329729942126,1.009,9675.58,9674.52,0.031 -binance-futures,BTCUSDT,1582329729957000,1582329730083351,1.009,9675.58,9674.53,0.031 -binance-futures,BTCUSDT,1582329730014000,1582329730135008,0.093,9675.57,9674.53,0.031 -binance-futures,BTCUSDT,1582329730034000,1582329730156199,2.893,9675.57,9674.53,0.031 -binance-futures,BTCUSDT,1582329730036000,1582329730157425,2.893,9675.57,9674.52,0.031 -binance-futures,BTCUSDT,1582329730038000,1582329730159736,2.893,9675.57,9674,0.43 -binance-futures,BTCUSDT,1582329730048000,1582329730168847,0.093,9675.57,9674,0.43 -binance-futures,BTCUSDT,1582329730061000,1582329730185183,1.009,9675.58,9674.56,0.031 -binance-futures,BTCUSDT,1582329730063000,1582329730186313,0.093,9675.55,9674.56,0.031 -binance-futures,BTCUSDT,1582329730073000,1582329730195722,0.773,9675.55,9674.56,0.031 -binance-futures,BTCUSDT,1582329730076000,1582329730198038,1.513,9675.55,9674.56,0.031 -binance-futures,BTCUSDT,1582329730085000,1582329730207545,3.713,9675.55,9674.56,0.031 -binance-futures,BTCUSDT,1582329730089000,1582329730210417,3.713,9675.55,9674.55,0.031 -binance-futures,BTCUSDT,1582329730091000,1582329730212174,3.713,9675.55,9673.7,0.469 -binance-futures,BTCUSDT,1582329730096000,1582329730219239,3.713,9675.55,9674.12,0.433 -binance-futures,BTCUSDT,1582329730098000,1582329730219263,1.513,9675.55,9674.12,0.433 -binance-futures,BTCUSDT,1582329730111000,1582329730233618,0.093,9675.55,9674.12,0.433 -binance-futures,BTCUSDT,1582329730111000,1582329730235858,0.093,9675.52,9674.12,0.433 -binance-futures,BTCUSDT,1582329730117000,1582329730238592,0.093,9675.52,9673.74,0.031 -binance-futures,BTCUSDT,1582329730133000,1582329730254773,2.443,9675.52,9673.74,0.031 -binance-futures,BTCUSDT,1582329730137000,1582329730259554,2.443,9675.52,9673.69,0.461 -binance-futures,BTCUSDT,1582329730139000,1582329730261220,2.443,9675.52,9673.68,2.494 -binance-futures,BTCUSDT,1582329730141000,1582329730264765,2.443,9675.52,9673.75,0.44 -binance-futures,BTCUSDT,1582329730144000,1582329730269494,0.093,9675.52,9673.75,0.44 -binance-futures,BTCUSDT,1582329730165000,1582329730288239,0.093,9675.52,9673.75,2.99 -binance-futures,BTCUSDT,1582329730169000,1582329730291825,1.009,9675.58,9673.75,2.99 -binance-futures,BTCUSDT,1582329730171000,1582329730292347,0.093,9675.5,9673.75,2.99 -binance-futures,BTCUSDT,1582329730193000,1582329730319881,0.093,9675.5,9673.8,0.442 -binance-futures,BTCUSDT,1582329730195000,1582329730319891,1.009,9675.58,9673.8,0.442 -binance-futures,BTCUSDT,1582329730215000,1582329730337674,1.009,9675.58,9673.8,4.492 -binance-futures,BTCUSDT,1582329730228000,1582329730351655,1.009,9675.58,9673.84,0.031 -binance-futures,BTCUSDT,1582329730242000,1582329730365041,1.009,9675.58,9673.91,0.435 -binance-futures,BTCUSDT,1582329730265000,1582329730423524,1.009,9675.58,9673.91,4.935 -binance-futures,BTCUSDT,1582329730333000,1582329730457705,1.009,9675.58,9673.95,0.031 -binance-futures,BTCUSDT,1582329730339000,1582329730465813,1.009,9675.58,9674.06,0.459 -binance-futures,BTCUSDT,1582329730349000,1582329730476397,1.009,9675.58,9674.28,1.012 -binance-futures,BTCUSDT,1582329730387000,1582329730513057,1.009,9675.58,9674.23,0.453 -binance-futures,BTCUSDT,1582329730391000,1582329730513092,1.009,9675.58,9674.3,0.469 -binance-futures,BTCUSDT,1582329730402000,1582329730525854,1.009,9675.58,9673.81,0.025 -binance-futures,BTCUSDT,1582329730406000,1582329730528653,0.093,9675.56,9673.95,0.449 -binance-futures,BTCUSDT,1582329730414000,1582329730536308,0.093,9675.56,9674.27,0.031 -binance-futures,BTCUSDT,1582329730432000,1582329730555744,0.093,9675.56,9674.26,0.031 -binance-futures,BTCUSDT,1582329730469000,1582329730592167,0.093,9675.56,9674.29,0.031 -binance-futures,BTCUSDT,1582329730501000,1582329730630027,0.74,9675.54,9674.29,0.031 -binance-futures,BTCUSDT,1582329730505000,1582329730630096,1.42,9675.54,9674.29,0.031 -binance-futures,BTCUSDT,1582329730521000,1582329730644390,9.47,9675.54,9674.29,0.031 -binance-futures,BTCUSDT,1582329730525000,1582329730647986,0.74,9675.53,9674.29,0.031 -binance-futures,BTCUSDT,1582329730529000,1582329730650859,0.093,9675.48,9674.29,0.031 -binance-futures,BTCUSDT,1582329730547000,1582329730671000,0.093,9675.48,9674.27,0.031 -binance-futures,BTCUSDT,1582329730550000,1582329730672103,9.093,9675.48,9673.75,2.6 -binance-futures,BTCUSDT,1582329730553000,1582329730675298,9.093,9675.48,9673.81,0.47 -binance-futures,BTCUSDT,1582329730572000,1582329730695009,9.093,9675.48,9673.75,2.6 -binance-futures,BTCUSDT,1582329730577000,1582329730701297,9,9675.48,9673.75,2.6 -binance-futures,BTCUSDT,1582329730581000,1582329730703249,0.093,9675.39,9673.75,2.6 -binance-futures,BTCUSDT,1582329730599000,1582329730720671,10.443,9675.39,9673.75,2.6 -binance-futures,BTCUSDT,1582329730626000,1582329730750288,0.093,9675.32,9673.75,2.6 -binance-futures,BTCUSDT,1582329730651000,1582329730774752,11.393,9675.32,9673.75,2.6 -binance-futures,BTCUSDT,1582329730699000,1582329730820195,0.68,9675.3,9673.75,2.6 -binance-futures,BTCUSDT,1582329730701000,1582329730824307,1.42,9675.3,9673.75,2.6 -binance-futures,BTCUSDT,1582329730720000,1582329730844766,11.97,9675.3,9673.75,2.6 -binance-futures,BTCUSDT,1582329730742000,1582329730868187,0.093,9675.26,9673.75,2.6 -binance-futures,BTCUSDT,1582329730764000,1582329730888312,9.493,9675.26,9673.75,2.6 -binance-futures,BTCUSDT,1582329730772000,1582329730897640,9.493,9675.26,9673.77,0.436 -binance-futures,BTCUSDT,1582329730794000,1582329730914383,9.493,9675.26,9673.75,2.6 -binance-futures,BTCUSDT,1582329730796000,1582329730917613,9.4,9675.26,9673.75,2.6 -binance-futures,BTCUSDT,1582329730798000,1582329730917626,0.093,9675.19,9673.75,2.6 -binance-futures,BTCUSDT,1582329730817000,1582329730940702,9.043,9675.19,9673.75,2.6 -binance-futures,BTCUSDT,1582329730834000,1582329730962486,9.043,9675.19,9674.28,1.96 -binance-futures,BTCUSDT,1582329730847000,1582329730974983,8.95,9675.19,9672.93,1.133 -binance-futures,BTCUSDT,1582329730849000,1582329730976656,2.501,9674.58,9673.49,1.585 -binance-futures,BTCUSDT,1582329730861000,1582329731001002,0.093,9675.13,9674.28,1.607 -binance-futures,BTCUSDT,1582329730881000,1582329731016778,0.09,9674.29,9673.49,2.065 -binance-futures,BTCUSDT,1582329730893000,1582329731018454,0.09,9674.29,9673.06,0.458 -binance-futures,BTCUSDT,1582329730895000,1582329731019176,0.09,9674.29,9672.93,1.133 -binance-futures,BTCUSDT,1582329730907000,1582329731029091,0.09,9674.29,9673.75,1.355 -binance-futures,BTCUSDT,1582329730917000,1582329731042148,8.79,9674.29,9673.75,1.355 -binance-futures,BTCUSDT,1582329730919000,1582329731043394,0.09,9674.26,9673.75,1.355 -binance-futures,BTCUSDT,1582329730928000,1582329731053145,2,9674.25,9673.75,1.355 -binance-futures,BTCUSDT,1582329730949000,1582329731079536,10.75,9674.25,9673.75,1.355 -binance-futures,BTCUSDT,1582329730951000,1582329731082700,4,9674.19,9673.75,1.355 -binance-futures,BTCUSDT,1582329730973000,1582329731101763,2,9674.13,9673.75,1.355 -binance-futures,BTCUSDT,1582329730975000,1582329731101797,4,9674.13,9673.75,1.355 -binance-futures,BTCUSDT,1582329731000000,1582329731126191,12.95,9674.13,9673.75,1.355 -binance-futures,BTCUSDT,1582329731002000,1582329731128323,4,9674.07,9673.75,1.355 -binance-futures,BTCUSDT,1582329731020000,1582329731144750,0.09,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731046000,1582329731169693,8.34,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731068000,1582329731197110,0.09,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731075000,1582329731199746,0.83,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731174000,1582329731298733,1.51,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731229000,1582329731358495,0.83,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731230000,1582329731359247,0.09,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731267000,1582329731389861,0.77,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731269000,1582329731393199,1.51,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731275000,1582329731398846,1.603,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731281000,1582329731407649,1.51,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731467000,1582329731587632,4.043,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731512000,1582329731634340,4.521,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731543000,1582329731664209,4.614,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731545000,1582329731668446,4.521,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731569000,1582329731690776,4.043,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731585000,1582329731705181,4.521,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731606000,1582329731728519,4.043,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731644000,1582329731764618,4.136,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731654000,1582329731775300,4.614,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731679000,1582329731801254,4.521,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731769000,1582329731890514,4.043,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731787000,1582329731908559,4.521,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731802000,1582329731924665,4.043,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731823000,1582329731944141,4.521,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731901000,1582329732020767,4.614,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329731916000,1582329732037860,4.521,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329732255000,1582329732392591,4.614,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329732749000,1582329732872169,3.934,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329732755000,1582329732874884,3.194,9673.76,9673.75,1.355 -binance-futures,BTCUSDT,1582329732756000,1582329732883960,3.194,9673.76,9673.75,0.675 -binance-futures,BTCUSDT,1582329732761000,1582329732887276,0.065,9673.74,9672.93,1.133 -binance-futures,BTCUSDT,1582329732761000,1582329732887287,0.095,9673.74,9672.93,1.133 -binance-futures,BTCUSDT,1582329732775000,1582329732897220,0.765,9673.74,9672.93,1.133 -binance-futures,BTCUSDT,1582329732779000,1582329732900472,2,9673.72,9672.93,1.133 -binance-futures,BTCUSDT,1582329732784000,1582329732908228,4,9673.72,9672.93,1.133 -binance-futures,BTCUSDT,1582329732792000,1582329732914471,4.093,9673.72,9672.93,1.133 -binance-futures,BTCUSDT,1582329732799000,1582329732921336,20.493,9673.72,9672.93,1.133 -binance-futures,BTCUSDT,1582329732804000,1582329732929546,2,9673.68,9672.93,0.453 -binance-futures,BTCUSDT,1582329732809000,1582329732930714,4.093,9673.68,9672.93,0.453 -binance-futures,BTCUSDT,1582329732823000,1582329732946088,4.093,9673.68,9672.79,0.047 -binance-futures,BTCUSDT,1582329732824000,1582329732946695,4.124,9673.68,9672.79,0.047 -binance-futures,BTCUSDT,1582329732826000,1582329732948199,2,9673.64,9672.79,0.047 -binance-futures,BTCUSDT,1582329732830000,1582329732952343,4,9673.64,9672.79,0.047 -binance-futures,BTCUSDT,1582329732832000,1582329732956101,0.623,9672.78,9671.91,0.047 -binance-futures,BTCUSDT,1582329732840000,1582329732963765,0.653,9672.78,9671.91,0.047 -binance-futures,BTCUSDT,1582329732846000,1582329732968118,0.663,9672.78,9671.91,0.047 -binance-futures,BTCUSDT,1582329732857000,1582329732981440,2,9672.74,9671.91,0.047 -binance-futures,BTCUSDT,1582329732865000,1582329732986642,4,9672.74,9671.91,0.047 -binance-futures,BTCUSDT,1582329732879000,1582329733004685,20.35,9672.74,9671.91,0.047 -binance-futures,BTCUSDT,1582329732884000,1582329733010753,2.013,9672.7,9671.91,0.047 -binance-futures,BTCUSDT,1582329732886000,1582329733011656,0.093,9672.57,9671.91,0.047 -binance-futures,BTCUSDT,1582329732909000,1582329733033186,2,9672.53,9671.91,0.047 -binance-futures,BTCUSDT,1582329732934000,1582329733058063,16.7,9672.53,9671.91,0.047 -binance-futures,BTCUSDT,1582329732938000,1582329733062270,0.093,9672.48,9671.91,0.047 -binance-futures,BTCUSDT,1582329732942000,1582329733066172,0.09,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329732965000,1582329733091095,10.44,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329732972000,1582329733095680,10.533,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329732985000,1582329733113481,10.44,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329732997000,1582329733117781,10.533,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733002000,1582329733123471,10.44,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733010000,1582329733133485,10.533,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733027000,1582329733147265,10.44,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733073000,1582329733196175,0.09,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733090000,1582329733215996,0.15,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733099000,1582329733221408,0.243,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733101000,1582329733223911,0.15,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733171000,1582329733292823,0.243,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733176000,1582329733300076,0.15,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733206000,1582329733327709,0.09,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733227000,1582329733352671,0.093,9672,9671.91,0.047 -binance-futures,BTCUSDT,1582329733229000,1582329733353714,0.093,9672.25,9671.91,0.047 -binance-futures,BTCUSDT,1582329733231000,1582329733356005,0.093,9672.25,9671.95,0.031 -binance-futures,BTCUSDT,1582329733233000,1582329733360392,2,9673.76,9671.95,0.031 -binance-futures,BTCUSDT,1582329733235000,1582329733360930,1.723,9673.64,9671.95,0.031 -binance-futures,BTCUSDT,1582329733245000,1582329733369875,1.723,9673.64,9672.79,1.501 -binance-futures,BTCUSDT,1582329733259000,1582329733385530,0.093,9673.6,9672.79,1.501 -binance-futures,BTCUSDT,1582329733281000,1582329733431547,12.993,9673.6,9672.79,1.501 -binance-futures,BTCUSDT,1582329733327000,1582329733447997,0.09,9672.8,9672.79,1.501 -binance-futures,BTCUSDT,1582329733346000,1582329733471127,7.59,9672.8,9672.79,1.501 -binance-futures,BTCUSDT,1582329733354000,1582329733477803,7.59,9672.8,9671.91,0.047 -binance-futures,BTCUSDT,1582329733356000,1582329733477821,7.59,9672.8,9671.91,2.331 -binance-futures,BTCUSDT,1582329733358000,1582329733482803,7.683,9672.8,9671.91,2.331 -binance-futures,BTCUSDT,1582329733382000,1582329733505535,0.093,9672.57,9671.91,2.331 -binance-futures,BTCUSDT,1582329733403000,1582329733527393,10.593,9672.57,9671.91,2.331 -binance-futures,BTCUSDT,1582329733432000,1582329733553064,0.093,9672.49,9671.91,2.331 -binance-futures,BTCUSDT,1582329733444000,1582329733564385,0.093,9672.49,9671.91,0.047 -binance-futures,BTCUSDT,1582329733451000,1582329733571532,9.443,9672.49,9671.91,0.047 -binance-futures,BTCUSDT,1582329733473000,1582329733594048,9.35,9672.49,9671.91,0.047 -binance-futures,BTCUSDT,1582329733477000,1582329733598869,0.093,9672.39,9671.91,0.047 -binance-futures,BTCUSDT,1582329733495000,1582329733616198,0.09,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733515000,1582329733632489,6.04,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733526000,1582329733647808,6.133,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733561000,1582329733681154,6.193,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733599000,1582329733721552,0.243,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733607000,1582329733727419,0.183,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733683000,1582329733807695,0.09,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733748000,1582329733870848,0.093,9673.15,9671.91,0.047 -binance-futures,BTCUSDT,1582329733760000,1582329733880989,0.09,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733781000,1582329733903203,2.74,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733798000,1582329733921519,0.09,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733847000,1582329733968474,0.093,9672.91,9671.91,0.047 -binance-futures,BTCUSDT,1582329733849000,1582329733971633,0.09,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329733851000,1582329733976217,0.09,9671.92,9671.91,2.008 -binance-futures,BTCUSDT,1582329733869000,1582329733990900,4.14,9671.92,9671.91,2.008 -binance-futures,BTCUSDT,1582329733874000,1582329733995477,4.14,9671.92,9671.91,3.918 -binance-futures,BTCUSDT,1582329733880000,1582329734002164,0.09,9671.92,9671.91,3.918 -binance-futures,BTCUSDT,1582329733903000,1582329734028951,0.09,9671.92,9671.91,2.008 -binance-futures,BTCUSDT,1582329733950000,1582329734081401,0.001,9673.14,9671.91,2.008 -binance-futures,BTCUSDT,1582329733960000,1582329734081997,0.001,9673.14,9671.91,2.018 -binance-futures,BTCUSDT,1582329734013000,1582329734138416,0.093,9673.55,9671.91,2.018 -binance-futures,BTCUSDT,1582329734015000,1582329734139086,0.001,9673.54,9671.91,2.018 -binance-futures,BTCUSDT,1582329734017000,1582329734139980,0.001,9673.54,9671.92,0.023 -binance-futures,BTCUSDT,1582329734055000,1582329734182174,0.06,9673.53,9671.92,0.023 -binance-futures,BTCUSDT,1582329734079000,1582329734202026,14.36,9673.53,9671.92,0.023 -binance-futures,BTCUSDT,1582329734100000,1582329734222317,14.3,9673.53,9671.92,0.023 -binance-futures,BTCUSDT,1582329734107000,1582329734230820,0.093,9673.42,9671.92,0.023 -binance-futures,BTCUSDT,1582329734128000,1582329734251094,14.043,9673.42,9671.92,0.023 -binance-futures,BTCUSDT,1582329734169000,1582329734304402,0.093,9673.31,9671.92,0.023 -binance-futures,BTCUSDT,1582329734207000,1582329734328642,12.893,9673.31,9671.92,0.023 -binance-futures,BTCUSDT,1582329734231000,1582329734354529,0.093,9673.23,9671.92,0.023 -binance-futures,BTCUSDT,1582329734251000,1582329734371671,13.543,9673.23,9671.92,0.023 -binance-futures,BTCUSDT,1582329734274000,1582329734396818,13.45,9673.23,9671.92,0.023 -binance-futures,BTCUSDT,1582329734278000,1582329734401127,0.093,9673.14,9671.92,0.023 -binance-futures,BTCUSDT,1582329734301000,1582329734423762,10.293,9673.14,9671.92,0.023 -binance-futures,BTCUSDT,1582329734329000,1582329734453530,0.093,9673.03,9671.92,0.023 -binance-futures,BTCUSDT,1582329734351000,1582329734474149,8.993,9673.03,9671.92,0.023 -binance-futures,BTCUSDT,1582329734368000,1582329734510603,0.093,9673.03,9671.92,0.023 -binance-futures,BTCUSDT,1582329734382000,1582329734511318,0.093,9672.91,9671.92,0.023 -binance-futures,BTCUSDT,1582329734394000,1582329734515295,0.06,9673.12,9671.92,0.023 -binance-futures,BTCUSDT,1582329734402000,1582329734525055,2.8,9672.91,9671.92,0.023 -binance-futures,BTCUSDT,1582329734430000,1582329734554148,0.093,9672.87,9671.92,0.023 -binance-futures,BTCUSDT,1582329734455000,1582329734578030,2.65,9672.87,9671.92,0.023 -binance-futures,BTCUSDT,1582329734459000,1582329734581471,2.65,9672.87,9671.92,0.458 -binance-futures,BTCUSDT,1582329734465000,1582329734590933,2,9673.23,9671.92,0.458 -binance-futures,BTCUSDT,1582329734465000,1582329734591167,0.093,9673.19,9671.92,0.458 -binance-futures,BTCUSDT,1582329734467000,1582329734591400,0.093,9673.19,9671.92,0.023 -binance-futures,BTCUSDT,1582329734473000,1582329734593903,2,9673.23,9671.92,0.023 -binance-futures,BTCUSDT,1582329734474000,1582329734595313,0.093,9673.59,9671.92,0.023 -binance-futures,BTCUSDT,1582329734480000,1582329734602636,1.723,9673.64,9671.94,0.031 -binance-futures,BTCUSDT,1582329734480000,1582329734605073,1.723,9673.64,9671.96,0.031 -binance-futures,BTCUSDT,1582329734482000,1582329734605092,0.093,9672.84,9671.96,0.031 -binance-futures,BTCUSDT,1582329734491000,1582329734613099,4.55,9673.19,9671.96,0.031 -binance-futures,BTCUSDT,1582329734504000,1582329734624675,4.55,9673.19,9671.92,0.023 -binance-futures,BTCUSDT,1582329734504000,1582329734628181,4.55,9673.19,9671.96,2.5 -binance-futures,BTCUSDT,1582329734506000,1582329734631703,1.723,9673.64,9671.96,2.5 -binance-futures,BTCUSDT,1582329734513000,1582329734633090,0.093,9673.61,9671.96,2.5 -binance-futures,BTCUSDT,1582329734515000,1582329734635534,0.093,9673.19,9671.96,2.5 -binance-futures,BTCUSDT,1582329734519000,1582329734642098,0.093,9673.19,9671.92,0.023 -binance-futures,BTCUSDT,1582329734519000,1582329734642109,0.093,9673.19,9671.95,0.467 -binance-futures,BTCUSDT,1582329734527000,1582329734651195,0.093,9673.37,9671.96,0.031 -binance-futures,BTCUSDT,1582329734535000,1582329734659965,0.093,9673.16,9671.96,0.031 -binance-futures,BTCUSDT,1582329734543000,1582329734665336,5.1,9673.61,9671.96,0.031 -binance-futures,BTCUSDT,1582329734549000,1582329734673880,5.1,9673.61,9671.91,0.047 -binance-futures,BTCUSDT,1582329734551000,1582329734674737,3.65,9673.37,9671.91,0.047 -binance-futures,BTCUSDT,1582329734553000,1582329734686684,3.65,9673.37,9671.92,0.429 -binance-futures,BTCUSDT,1582329734569000,1582329734691147,3.65,9673.37,9671.91,0.047 -binance-futures,BTCUSDT,1582329734573000,1582329734693731,7.7,9673.37,9671.91,0.047 -binance-futures,BTCUSDT,1582329734581000,1582329734701428,0.093,9673.27,9671.91,0.047 -binance-futures,BTCUSDT,1582329734600000,1582329734719675,7.443,9673.27,9671.91,0.047 -binance-futures,BTCUSDT,1582329734621000,1582329734741684,0.093,9673.14,9671.91,0.047 -binance-futures,BTCUSDT,1582329734641000,1582329734761155,6.293,9673.14,9671.91,0.047 -binance-futures,BTCUSDT,1582329734663000,1582329734784551,0.093,9673.03,9671.91,0.047 -binance-futures,BTCUSDT,1582329734679000,1582329734799708,5.193,9673.03,9671.91,0.047 -binance-futures,BTCUSDT,1582329734681000,1582329734801528,5.193,9673.03,9671.97,1.91 -binance-futures,BTCUSDT,1582329734704000,1582329734824484,0.093,9672.9,9671.97,1.91 -binance-futures,BTCUSDT,1582329734732000,1582329734851513,0.664,9673.6,9671.97,1.91 -binance-futures,BTCUSDT,1582329734733000,1582329734854121,0.093,9673.36,9671.97,1.91 -binance-futures,BTCUSDT,1582329734752000,1582329734874968,4.093,9673.36,9671.97,1.91 -binance-futures,BTCUSDT,1582329734773000,1582329734893977,4.093,9673.36,9671.91,0.047 -binance-futures,BTCUSDT,1582329734779000,1582329734898779,0.093,9673.29,9671.98,0.021 -binance-futures,BTCUSDT,1582329734798000,1582329734918919,5.143,9673.29,9671.98,0.021 -binance-futures,BTCUSDT,1582329734805000,1582329734925935,5.143,9673.29,9671.99,0.71 -binance-futures,BTCUSDT,1582329734807000,1582329734928795,5.143,9673.29,9671.99,1.4 -binance-futures,BTCUSDT,1582329734811000,1582329734930224,5.143,9673.29,9671.99,2.07 -binance-futures,BTCUSDT,1582329734823000,1582329734942664,0.093,9673.19,9671.99,2.07 -binance-futures,BTCUSDT,1582329734828000,1582329734950486,0.093,9673.19,9671.99,1.4 -binance-futures,BTCUSDT,1582329734834000,1582329734954139,0.093,9673.19,9672.03,0.031 -binance-futures,BTCUSDT,1582329734840000,1582329734960526,3.743,9673.19,9672.03,0.031 -binance-futures,BTCUSDT,1582329734854000,1582329734974511,0.093,9673.19,9672.03,0.031 -binance-futures,BTCUSDT,1582329734854000,1582329734975798,0.093,9673.19,9671.98,0.021 -binance-futures,BTCUSDT,1582329734856000,1582329734976302,0.093,9673.19,9672.04,0.04 -binance-futures,BTCUSDT,1582329734859000,1582329734982198,2,9673.57,9672.04,0.04 -binance-futures,BTCUSDT,1582329734865000,1582329734984038,2,9673.57,9672.04,0.71 -binance-futures,BTCUSDT,1582329734867000,1582329734987521,0.093,9673.17,9672.04,0.71 -binance-futures,BTCUSDT,1582329734867000,1582329734987533,0.093,9673.17,9672.04,1.38 -binance-futures,BTCUSDT,1582329734871000,1582329734992652,0.093,9673.17,9672.04,2.07 -binance-futures,BTCUSDT,1582329734877000,1582329734999150,0.664,9673.6,9672.04,2.07 -binance-futures,BTCUSDT,1582329734881000,1582329735003238,4.35,9673.57,9672.04,2.07 -binance-futures,BTCUSDT,1582329734883000,1582329735006902,4.35,9673.57,9672.04,2.03 -binance-futures,BTCUSDT,1582329734889000,1582329735015113,0.093,9673.51,9672.04,1.36 -binance-futures,BTCUSDT,1582329734891000,1582329735015767,2.2,9673.17,9672.04,1.36 -binance-futures,BTCUSDT,1582329734895000,1582329735018591,2.2,9673.17,9672.08,0.031 -binance-futures,BTCUSDT,1582329734914000,1582329735036606,2.2,9673.17,9672.07,0.031 -binance-futures,BTCUSDT,1582329734916000,1582329735036673,2.2,9673.17,9671.98,0.021 -binance-futures,BTCUSDT,1582329734920000,1582329735040774,0.093,9673.16,9671.98,0.021 -binance-futures,BTCUSDT,1582329734939000,1582329735064359,5.843,9673.16,9671.98,0.021 -binance-futures,BTCUSDT,1582329734955000,1582329735077986,0.093,9673.16,9671.98,0.021 -binance-futures,BTCUSDT,1582329734967000,1582329735091291,0.093,9673.16,9671.98,1.931 -binance-futures,BTCUSDT,1582329734968000,1582329735092831,0.664,9673.6,9671.98,1.931 -binance-futures,BTCUSDT,1582329734972000,1582329735095307,2,9673.45,9671.98,1.931 -binance-futures,BTCUSDT,1582329734987000,1582329735109056,0.664,9673.6,9671.98,1.931 -binance-futures,BTCUSDT,1582329734993000,1582329735116806,0.664,9673.6,9672.01,0.031 -binance-futures,BTCUSDT,1582329734993000,1582329735117372,0.664,9673.6,9672.02,0.031 -binance-futures,BTCUSDT,1582329734995000,1582329735117889,3.85,9673.45,9672.02,0.031 -binance-futures,BTCUSDT,1582329735010000,1582329735135907,0.093,9673.41,9672.02,0.031 -binance-futures,BTCUSDT,1582329735034000,1582329735156373,4.093,9673.41,9672.03,0.019 -binance-futures,BTCUSDT,1582329735060000,1582329735183862,0.093,9673.36,9672.04,0.031 -binance-futures,BTCUSDT,1582329735080000,1582329735207962,3.243,9673.36,9672.04,1.941 -binance-futures,BTCUSDT,1582329735086000,1582329735214326,3.243,9673.36,9672.04,1.91 -binance-futures,BTCUSDT,1582329735101000,1582329735223034,0.093,9673.36,9672.04,1.91 -binance-futures,BTCUSDT,1582329735105000,1582329735227472,0.664,9673.6,9672.04,1.91 -binance-futures,BTCUSDT,1582329735107000,1582329735241202,0.664,9673.6,9672.06,0.031 -binance-futures,BTCUSDT,1582329735107000,1582329735245374,0.664,9673.6,9672.08,0.031 -binance-futures,BTCUSDT,1582329735109000,1582329735250124,0.093,9673.35,9672.08,0.031 -binance-futures,BTCUSDT,1582329735126000,1582329735253986,0.664,9673.6,9672.08,0.031 -binance-futures,BTCUSDT,1582329735142000,1582329735265336,0.093,9673.57,9672.08,0.031 -binance-futures,BTCUSDT,1582329735144000,1582329735265346,0.093,9673.57,9672.08,3.831 -binance-futures,BTCUSDT,1582329735152000,1582329735276934,0.093,9673.57,9672.09,0.031 -binance-futures,BTCUSDT,1582329735164000,1582329735285812,0.093,9673.57,9672.1,0.43 -binance-futures,BTCUSDT,1582329735170000,1582329735293912,0.664,9673.6,9672.12,0.031 -binance-futures,BTCUSDT,1582329735195000,1582329735333021,0.664,9673.6,9672.12,3.981 -binance-futures,BTCUSDT,1582329735201000,1582329735347602,0.664,9673.6,9672.15,0.435 -binance-futures,BTCUSDT,1582329735237000,1582329735360286,0.664,9673.6,9672.16,0.031 -binance-futures,BTCUSDT,1582329735241000,1582329735368943,0.093,9673.5,9672.29,0.454 -binance-futures,BTCUSDT,1582329735244000,1582329735369429,0.664,9673.6,9672.29,0.454 -binance-futures,BTCUSDT,1582329735267000,1582329735389311,0.664,9673.6,9672.29,4.404 -binance-futures,BTCUSDT,1582329735286000,1582329735409415,0.664,9673.6,9672.3,1.924 -binance-futures,BTCUSDT,1582329735290000,1582329735412830,0.664,9673.6,9672.32,0.031 -binance-futures,BTCUSDT,1582329735290000,1582329735414318,0.664,9673.6,9672.33,0.031 -binance-futures,BTCUSDT,1582329735292000,1582329735414769,0.664,9673.6,9672.48,0.452 -binance-futures,BTCUSDT,1582329735314000,1582329735437453,0.664,9673.6,9672.48,3.102 -binance-futures,BTCUSDT,1582329735341000,1582329735463894,0.664,9673.6,9672.64,0.444 -binance-futures,BTCUSDT,1582329735361000,1582329735480904,0.664,9673.6,9672.64,3.944 -binance-futures,BTCUSDT,1582329735372000,1582329735493001,0.664,9673.6,9672.64,0.444 -binance-futures,BTCUSDT,1582329735383000,1582329735505036,0.664,9673.6,9672.74,0.435 -binance-futures,BTCUSDT,1582329735404000,1582329735526332,0.664,9673.6,9672.68,0.031 -binance-futures,BTCUSDT,1582329735447000,1582329735570106,0.093,9673.57,9672.68,0.031 -binance-futures,BTCUSDT,1582329735472000,1582329735596406,0.093,9673.57,9672.71,0.031 -binance-futures,BTCUSDT,1582329735493000,1582329735616747,0.093,9673.57,9672.7,0.031 -binance-futures,BTCUSDT,1582329735495000,1582329735617806,0.093,9673.57,9672.69,0.031 -binance-futures,BTCUSDT,1582329735517000,1582329735640951,0.093,9673.57,9672.73,0.031 -binance-futures,BTCUSDT,1582329735519000,1582329735641059,0.093,9673.57,9672.74,0.031 -binance-futures,BTCUSDT,1582329735543000,1582329735669465,0.093,9673.57,9672.69,0.031 -binance-futures,BTCUSDT,1582329735543000,1582329735669482,0.664,9673.6,9672.69,0.031 -binance-futures,BTCUSDT,1582329735551000,1582329735674694,0.664,9673.6,9672.78,0.455 -binance-futures,BTCUSDT,1582329735567000,1582329735686654,1.992,9673.63,9672.78,0.455 -binance-futures,BTCUSDT,1582329735572000,1582329735695097,1.992,9673.63,9672.72,0.031 -binance-futures,BTCUSDT,1582329735580000,1582329735700439,0.093,9673.59,9672.72,0.031 -binance-futures,BTCUSDT,1582329735589000,1582329735715046,0.093,9673.59,9672.7,3.98 -binance-futures,BTCUSDT,1582329735601000,1582329735725642,1.992,9673.63,9672.7,3.29 -binance-futures,BTCUSDT,1582329735605000,1582329735727749,1.992,9673.63,9672.7,1.95 -binance-futures,BTCUSDT,1582329735612000,1582329735735676,1.992,9673.63,9672.76,0.468 -binance-futures,BTCUSDT,1582329735620000,1582329735740349,1.992,9673.63,9672.74,0.031 -binance-futures,BTCUSDT,1582329735633000,1582329735753269,0.093,9673.62,9672.74,0.031 -binance-futures,BTCUSDT,1582329735659000,1582329735780494,1.992,9673.63,9672.74,0.031 -binance-futures,BTCUSDT,1582329735682000,1582329735803282,1.992,9673.63,9672.77,0.031 -binance-futures,BTCUSDT,1582329735704000,1582329735830171,1.992,9673.63,9672.75,0.031 -binance-futures,BTCUSDT,1582329735739000,1582329735862927,0.093,9673.44,9672.75,0.031 -binance-futures,BTCUSDT,1582329735788000,1582329735910537,0.093,9673.44,9672.76,1.91 -binance-futures,BTCUSDT,1582329735804000,1582329735925672,1.992,9673.63,9672.75,0.031 -binance-futures,BTCUSDT,1582329735813000,1582329735935900,1.992,9673.63,9672.8,0.031 -binance-futures,BTCUSDT,1582329735837000,1582329735962212,1.992,9673.63,9672.76,1.91 -binance-futures,BTCUSDT,1582329735858000,1582329735981866,1.992,9673.63,9672.75,0.031 -binance-futures,BTCUSDT,1582329735862000,1582329735981896,1.992,9673.63,9672.8,0.446 -binance-futures,BTCUSDT,1582329735864000,1582329735984139,1.992,9673.63,9672.8,0.477 -binance-futures,BTCUSDT,1582329735864000,1582329735987089,1.992,9673.63,9672.82,0.031 -binance-futures,BTCUSDT,1582329735904000,1582329736028894,1.992,9673.63,9672.76,2.07 -binance-futures,BTCUSDT,1582329735928000,1582329736052742,1.992,9673.63,9672.82,0.031 -binance-futures,BTCUSDT,1582329735930000,1582329736053821,1.992,9673.63,9672.83,0.031 -binance-futures,BTCUSDT,1582329735932000,1582329736055556,1.992,9673.63,9672.84,0.031 -binance-futures,BTCUSDT,1582329735965000,1582329736087770,1.992,9673.63,9672.85,0.67 -binance-futures,BTCUSDT,1582329735967000,1582329736087813,1.992,9673.63,9672.85,1.34 -binance-futures,BTCUSDT,1582329735971000,1582329736095663,1.992,9673.63,9672.85,1.38 -binance-futures,BTCUSDT,1582329735990000,1582329736110418,1.992,9673.63,9672.87,0.031 -binance-futures,BTCUSDT,1582329735990000,1582329736111164,1.992,9673.63,9672.89,0.031 -binance-futures,BTCUSDT,1582329736037000,1582329736157720,1.992,9673.63,9672.9,0.031 -binance-futures,BTCUSDT,1582329736049000,1582329736173871,1.992,9673.63,9673.01,0.46 -binance-futures,BTCUSDT,1582329736050000,1582329736179178,1.992,9673.63,9673.01,0.457 -binance-futures,BTCUSDT,1582329736075000,1582329736203269,1.992,9673.63,9673.05,0.031 -binance-futures,BTCUSDT,1582329736125000,1582329736243982,1.992,9673.63,9673.06,0.031 -binance-futures,BTCUSDT,1582329736419000,1582329736539950,0.094,9673.62,9673.06,0.031 -binance-futures,BTCUSDT,1582329736442000,1582329736566178,0.094,9673.62,9672.26,0.47 -binance-futures,BTCUSDT,1582329736467000,1582329736589010,0.094,9673.62,9671.94,0.031 -binance-futures,BTCUSDT,1582329736468000,1582329736592888,0.094,9673.62,9672.27,0.69 -binance-futures,BTCUSDT,1582329736481000,1582329736602953,0.094,9673.62,9672.27,1.36 -binance-futures,BTCUSDT,1582329736487000,1582329736608766,0.094,9673.62,9672.27,1.4 -binance-futures,BTCUSDT,1582329736491000,1582329736615711,0.094,9673.62,9672.27,2.07 -binance-futures,BTCUSDT,1582329736496000,1582329736618885,0.094,9673.62,9672.27,2.531 -binance-futures,BTCUSDT,1582329736519000,1582329736643803,0.094,9673.62,9672.29,0.445 -binance-futures,BTCUSDT,1582329736522000,1582329736644221,1.992,9673.63,9672.29,0.445 -binance-futures,BTCUSDT,1582329736534000,1582329736658425,1.992,9673.63,9673.07,1.91 -binance-futures,BTCUSDT,1582329736556000,1582329736678624,1.992,9673.63,9672.33,0.031 -binance-futures,BTCUSDT,1582329736568000,1582329736689608,1.992,9673.63,9673,0.463 -binance-futures,BTCUSDT,1582329736575000,1582329736702716,1.723,9673.64,9673.08,0.441 -binance-futures,BTCUSDT,1582329736583000,1582329736703769,1.723,9673.64,9672.33,0.031 -binance-futures,BTCUSDT,1582329736585000,1582329736709365,1.723,9673.64,9672.35,0.452 -binance-futures,BTCUSDT,1582329736591000,1582329736715380,1.723,9673.64,9672.85,0.031 -binance-futures,BTCUSDT,1582329736606000,1582329736727937,1.723,9673.64,9673.08,0.69 -binance-futures,BTCUSDT,1582329736635000,1582329736759150,1.723,9673.64,9673.08,0.73 -binance-futures,BTCUSDT,1582329736641000,1582329736762037,1.723,9673.64,9673.13,0.44 -binance-futures,BTCUSDT,1582329736657000,1582329736783291,1.723,9673.64,9673.13,2.69 -binance-futures,BTCUSDT,1582329736668000,1582329736791115,1.723,9673.64,9673.13,0.44 -binance-futures,BTCUSDT,1582329736686000,1582329736808137,1.723,9673.64,9673.13,1.8 -binance-futures,BTCUSDT,1582329736693000,1582329736815996,1.723,9673.64,9673.13,1.36 -binance-futures,BTCUSDT,1582329736699000,1582329736819411,1.723,9673.64,9673.13,1.4 -binance-futures,BTCUSDT,1582329736711000,1582329736835961,1.723,9673.64,9673.17,0.031 -binance-futures,BTCUSDT,1582329736763000,1582329736883341,1.723,9673.64,9673.18,0.031 -binance-futures,BTCUSDT,1582329736786000,1582329736910504,1.723,9673.64,9673.19,0.67 -binance-futures,BTCUSDT,1582329736798000,1582329736921739,1.723,9673.64,9673.19,1.34 -binance-futures,BTCUSDT,1582329736812000,1582329736936985,1.723,9673.64,9673.23,0.031 -binance-futures,BTCUSDT,1582329736846000,1582329736968187,1.723,9673.64,9673.24,0.67 -binance-futures,BTCUSDT,1582329736852000,1582329736976524,1.723,9673.64,9673.24,0.71 -binance-futures,BTCUSDT,1582329736858000,1582329736980919,1.723,9673.64,9673.24,2.07 -binance-futures,BTCUSDT,1582329736873000,1582329736995169,1.723,9673.64,9673.28,0.031 -binance-futures,BTCUSDT,1582329736909000,1582329737031802,1.723,9673.64,9673.28,0.071 -binance-futures,BTCUSDT,1582329736911000,1582329737034665,1.723,9673.64,9673.28,0.741 -binance-futures,BTCUSDT,1582329736917000,1582329737038178,1.723,9673.64,9673.28,1.431 -binance-futures,BTCUSDT,1582329736934000,1582329737056783,1.723,9673.64,9673.31,0.031 -binance-futures,BTCUSDT,1582329736936000,1582329737056858,1.723,9673.64,9673.32,0.031 -binance-futures,BTCUSDT,1582329736967000,1582329737087757,1.723,9673.64,9673.32,0.701 -binance-futures,BTCUSDT,1582329736977000,1582329737097829,1.723,9673.64,9673.32,1.371 -binance-futures,BTCUSDT,1582329736983000,1582329737104216,1.723,9673.64,9673.32,2.061 -binance-futures,BTCUSDT,1582329736990000,1582329737112648,1.723,9673.64,9673.36,0.031 -binance-futures,BTCUSDT,1582329737008000,1582329737130802,1.723,9673.64,9673.37,2 -binance-futures,BTCUSDT,1582329737063000,1582329737187442,1.723,9673.64,9673.38,1.91 -binance-futures,BTCUSDT,1582329737063000,1582329737193489,1.723,9673.64,9673.41,0.031 -binance-futures,BTCUSDT,1582329737107000,1582329737227518,1.723,9673.64,9673.63,0.01 -binance-futures,BTCUSDT,1582329737143000,1582329737270505,1.226,9673.64,9673.63,2.02 -binance-futures,BTCUSDT,1582329737160000,1582329737279696,1.226,9673.64,9673.63,4.42 -binance-futures,BTCUSDT,1582329737171000,1582329737292006,1.226,9673.64,9673.63,2.02 -binance-futures,BTCUSDT,1582329737229000,1582329737370841,1.32,9673.64,9673.63,2.02 -binance-futures,BTCUSDT,1582329737236000,1582329737371689,1.32,9673.64,9673.63,0.01 -binance-futures,BTCUSDT,1582329737242000,1582329737371944,1.32,9673.64,9673.63,0.473 -binance-futures,BTCUSDT,1582329737246000,1582329737372905,1.226,9673.64,9673.63,0.473 -binance-futures,BTCUSDT,1582329737255000,1582329737373821,1.226,9673.64,9673.63,0.01 -binance-futures,BTCUSDT,1582329737277000,1582329737398191,1.226,9673.64,9673.63,2.02 -binance-futures,BTCUSDT,1582329737283000,1582329737414475,1.32,9673.64,9673.63,2.02 -binance-futures,BTCUSDT,1582329737336000,1582329737459167,1.32,9673.64,9673.63,0.01 -binance-futures,BTCUSDT,1582329737380000,1582329737500637,1.226,9673.64,9673.63,0.01 -binance-futures,BTCUSDT,1582329737381000,1582329737503202,1.226,9673.64,9673.63,0.442 -binance-futures,BTCUSDT,1582329737409000,1582329737530828,1.226,9673.64,9673.63,0.01 -binance-futures,BTCUSDT,1582329737445000,1582329737566798,1.226,9673.64,9673.62,2.07 -binance-futures,BTCUSDT,1582329737447000,1582329737568517,1.32,9673.64,9673.62,2.07 -binance-futures,BTCUSDT,1582329737466000,1582329737588363,1.32,9673.64,9673.63,0.457 -binance-futures,BTCUSDT,1582329737467000,1582329737588374,1.226,9673.64,9673.63,0.457 -binance-futures,BTCUSDT,1582329737491000,1582329737613405,1.226,9673.64,9673.62,2.07 -binance-futures,BTCUSDT,1582329737497000,1582329737618238,1.226,9673.64,9673.63,0.468 -binance-futures,BTCUSDT,1582329737509000,1582329737629116,1.226,9673.64,9673.62,2.07 -binance-futures,BTCUSDT,1582329737515000,1582329737636856,1.226,9673.64,9673.62,1.38 -binance-futures,BTCUSDT,1582329737518000,1582329737641849,0.826,9673.64,9673.62,1.38 -binance-futures,BTCUSDT,1582329737522000,1582329737644900,0.826,9673.64,9673.62,0.71 -binance-futures,BTCUSDT,1582329737523000,1582329737649289,0.826,9673.64,9673.62,0.04 -binance-futures,BTCUSDT,1582329737527000,1582329737649828,0.826,9673.64,9672.36,0.458 -binance-futures,BTCUSDT,1582329737536000,1582329737659856,0.826,9673.64,9673.23,1 -binance-futures,BTCUSDT,1582329737538000,1582329737661028,0.826,9673.64,9673.62,2.6 -binance-futures,BTCUSDT,1582329737545000,1582329737665479,0.826,9673.64,9673.62,3.29 -binance-futures,BTCUSDT,1582329737557000,1582329737679303,0.094,9673.63,9673.62,3.29 -binance-futures,BTCUSDT,1582329737565000,1582329737687256,0.826,9673.64,9673.62,3.29 -binance-futures,BTCUSDT,1582329737569000,1582329737691669,0.094,9673.63,9673.62,3.29 -binance-futures,BTCUSDT,1582329737571000,1582329737691953,0.094,9673.63,9673.62,0.69 -binance-futures,BTCUSDT,1582329737577000,1582329737696025,0.094,9673.63,9673.62,0.73 -binance-futures,BTCUSDT,1582329737578000,1582329737703179,0.094,9673.63,9673.62,1.4 -binance-futures,BTCUSDT,1582329737583000,1582329737704381,0.826,9673.64,9673.62,1.4 -binance-futures,BTCUSDT,1582329737589000,1582329737712472,0.826,9673.64,9673.62,2.07 -binance-futures,BTCUSDT,1582329737591000,1582329737714677,0.826,9673.64,9673.62,3.07 -binance-futures,BTCUSDT,1582329737599000,1582329737721455,0.826,9673.64,9673.62,2.38 -binance-futures,BTCUSDT,1582329737604000,1582329737729299,0.826,9673.64,9673.62,1.38 -binance-futures,BTCUSDT,1582329737609000,1582329737730509,0.094,9673.63,9673.62,1.38 -binance-futures,BTCUSDT,1582329737617000,1582329737742727,0.094,9673.63,9673.62,0.71 -binance-futures,BTCUSDT,1582329737625000,1582329737748801,0.094,9673.63,9673.62,1.4 -binance-futures,BTCUSDT,1582329737651000,1582329737772073,0.826,9673.64,9673.62,1.4 -binance-futures,BTCUSDT,1582329737654000,1582329737777083,0.826,9673.64,9673.62,0.71 -binance-futures,BTCUSDT,1582329737665000,1582329737786958,0.826,9673.64,9673.62,0.04 -binance-futures,BTCUSDT,1582329737671000,1582329737797108,0.826,9673.64,9673.17,1 -binance-futures,BTCUSDT,1582329737675000,1582329737797147,0.826,9673.64,9673.62,0.67 -binance-futures,BTCUSDT,1582329737690000,1582329737811729,0.826,9673.64,9673.62,1.36 -binance-futures,BTCUSDT,1582329737698000,1582329737817882,0.826,9673.64,9673.62,0.69 -binance-futures,BTCUSDT,1582329737703000,1582329737824034,0.094,9673.63,9673.62,0.69 -binance-futures,BTCUSDT,1582329737707000,1582329737830319,0.184,9673.63,9673.62,0.69 -binance-futures,BTCUSDT,1582329737712000,1582329737833239,0.184,9673.63,9673.62,1.36 -binance-futures,BTCUSDT,1582329737718000,1582329737839407,0.184,9673.63,9673.62,1.4 -binance-futures,BTCUSDT,1582329737724000,1582329737844897,0.184,9673.63,9673.62,0.71 -binance-futures,BTCUSDT,1582329737729000,1582329737851040,0.184,9673.63,9673.62,0.04 -binance-futures,BTCUSDT,1582329737741000,1582329737862605,0.184,9673.63,9671.91,0.047 -binance-futures,BTCUSDT,1582329737751000,1582329737874604,0.184,9673.63,9672.59,1 -binance-futures,BTCUSDT,1582329737753000,1582329737875907,0.09,9673.63,9672.59,1 -binance-futures,BTCUSDT,1582329737758000,1582329737878833,0.184,9673.63,9672.59,1 -binance-futures,BTCUSDT,1582329737764000,1582329737884854,0.184,9673.63,9671.91,0.047 -binance-futures,BTCUSDT,1582329737770000,1582329737893623,0.094,9673.58,9671.92,1.36 -binance-futures,BTCUSDT,1582329737771000,1582329737893650,0.094,9673.58,9672.59,3.75 -binance-futures,BTCUSDT,1582329737777000,1582329737899410,0.094,9673.58,9672.6,1 -binance-futures,BTCUSDT,1582329737781000,1582329737918218,0.094,9673.58,9672.63,0.031 -binance-futures,BTCUSDT,1582329737785000,1582329737920074,0.09,9673.63,9672.63,0.031 -binance-futures,BTCUSDT,1582329737820000,1582329737944197,0.09,9673.63,9672.64,1 -binance-futures,BTCUSDT,1582329737826000,1582329737948285,0.826,9673.64,9672.64,1.465 -binance-futures,BTCUSDT,1582329737834000,1582329737957810,0.826,9673.64,9672.64,1 -binance-futures,BTCUSDT,1582329737838000,1582329737961100,0.094,9673.63,9672.64,1 -binance-futures,BTCUSDT,1582329737844000,1582329737967755,0.094,9673.63,9672.65,0.031 -binance-futures,BTCUSDT,1582329737845000,1582329737967951,0.094,9673.63,9672.66,0.031 -binance-futures,BTCUSDT,1582329737845000,1582329737968304,0.094,9673.63,9672.67,0.031 -binance-futures,BTCUSDT,1582329737849000,1582329737970795,0.826,9673.64,9672.67,0.031 -binance-futures,BTCUSDT,1582329737850000,1582329737972939,0.826,9673.64,9672.7,0.456 -binance-futures,BTCUSDT,1582329737858000,1582329737981553,0.094,9673.63,9672.67,0.031 -binance-futures,BTCUSDT,1582329737860000,1582329737981640,0.826,9673.64,9672.67,0.031 -binance-futures,BTCUSDT,1582329737868000,1582329737988670,0.826,9673.64,9672.67,5.281 -binance-futures,BTCUSDT,1582329737874000,1582329737996413,0.826,9673.64,9672.7,4.95 -binance-futures,BTCUSDT,1582329737877000,1582329738000122,0.826,9673.64,9672.7,5.39 -binance-futures,BTCUSDT,1582329737890000,1582329738011427,0.826,9673.64,9672.71,0.031 -binance-futures,BTCUSDT,1582329737896000,1582329738018974,0.826,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329738049000,1582329738169966,0.826,9673.64,9673.63,2.694 -binance-futures,BTCUSDT,1582329738106000,1582329738231302,0.92,9673.64,9673.63,2.694 -binance-futures,BTCUSDT,1582329738166000,1582329738287090,0.92,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329738210000,1582329738342712,0.826,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329738246000,1582329738367856,0.916,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329738376000,1582329738496940,0.916,9673.64,9673.63,1.129 -binance-futures,BTCUSDT,1582329738382000,1582329738502916,0.916,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329738472000,1582329738593496,0.916,9673.64,9673.63,1.145 -binance-futures,BTCUSDT,1582329738475000,1582329738596447,0.826,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329738499000,1582329738620882,0.916,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329738617000,1582329738737004,0.916,9673.64,9673.63,1.149 -binance-futures,BTCUSDT,1582329739027000,1582329739150721,0.813,9673.64,9673.63,1.149 -binance-futures,BTCUSDT,1582329739114000,1582329739236219,0.813,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329739186000,1582329739306630,0.907,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329739264000,1582329739385165,0.813,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329739266000,1582329739385205,0.813,9673.64,9673.63,1.127 -binance-futures,BTCUSDT,1582329739309000,1582329739446074,0.813,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329739339000,1582329739473835,0.813,9673.64,9673.63,1.122 -binance-futures,BTCUSDT,1582329739343000,1582329739474874,0.813,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329739361000,1582329739482110,0.907,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329739378000,1582329739501535,0.813,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329739416000,1582329739537512,0.723,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329739449000,1582329739571104,0.813,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329739741000,1582329739861147,0.813,9673.64,9673.63,2.694 -binance-futures,BTCUSDT,1582329739794000,1582329739915432,0.813,9673.64,9673.63,3.154 -binance-futures,BTCUSDT,1582329739798000,1582329739918455,0.813,9673.64,9673.63,2.694 -binance-futures,BTCUSDT,1582329739876000,1582329739995474,0.813,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329739936000,1582329740057324,0.723,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329739947000,1582329740067382,0.723,9673.64,9673.63,2.694 -binance-futures,BTCUSDT,1582329739954000,1582329740074442,0.817,9673.64,9673.63,2.694 -binance-futures,BTCUSDT,1582329739969000,1582329740088981,0.723,9673.64,9673.63,2.694 -binance-futures,BTCUSDT,1582329739979000,1582329740100000,0.813,9673.64,9673.63,2.694 -binance-futures,BTCUSDT,1582329740001000,1582329740120355,0.813,9673.64,9673.63,3.139 -binance-futures,BTCUSDT,1582329740039000,1582329740160639,0.723,9673.64,9673.63,3.139 -binance-futures,BTCUSDT,1582329740079000,1582329740197468,0.723,9673.64,9673.63,3.149 -binance-futures,BTCUSDT,1582329740189000,1582329740317083,0.525,9673.64,9673.63,3.149 -binance-futures,BTCUSDT,1582329740191000,1582329740317125,0.403,9673.64,9673.63,3.149 -binance-futures,BTCUSDT,1582329740203000,1582329740328797,1.088,9674.57,9673.63,3.149 -binance-futures,BTCUSDT,1582329740221000,1582329740344244,1.088,9674.57,9673.67,0.031 -binance-futures,BTCUSDT,1582329740239000,1582329740399723,1.088,9674.57,9673.64,2.837 -binance-futures,BTCUSDT,1582329740241000,1582329740402243,1.088,9674.57,9673.67,4.75 -binance-futures,BTCUSDT,1582329740243000,1582329740402254,1.088,9674.57,9673.7,2 -binance-futures,BTCUSDT,1582329740249000,1582329740402316,1.088,9674.57,9673.7,2.436 -binance-futures,BTCUSDT,1582329740293000,1582329740415323,6.2,9674.56,9673.7,2.436 -binance-futures,BTCUSDT,1582329740296000,1582329740419429,8.55,9674.56,9673.7,0.436 -binance-futures,BTCUSDT,1582329740301000,1582329740421785,8.55,9674.56,9673.71,0.031 -binance-futures,BTCUSDT,1582329740306000,1582329740431674,8.457,9674.56,9673.71,0.031 -binance-futures,BTCUSDT,1582329740313000,1582329740436627,8.457,9674.56,9673.77,0.469 -binance-futures,BTCUSDT,1582329740327000,1582329740448845,6.107,9674.56,9673.77,0.469 -binance-futures,BTCUSDT,1582329740335000,1582329740457344,1.088,9674.57,9673.77,0.469 -binance-futures,BTCUSDT,1582329740348000,1582329740470943,1.082,9674.57,9673.77,0.469 -binance-futures,BTCUSDT,1582329740351000,1582329740474095,1.082,9674.57,9673.81,0.031 -binance-futures,BTCUSDT,1582329740360000,1582329740479922,1.082,9674.57,9674,2.01 -binance-futures,BTCUSDT,1582329740408000,1582329740532287,1.082,9674.57,9674.01,1 -binance-futures,BTCUSDT,1582329740423000,1582329740543845,1.082,9674.57,9674.02,0.458 -binance-futures,BTCUSDT,1582329740429000,1582329740551336,0.652,9674.57,9674.02,0.458 -binance-futures,BTCUSDT,1582329740431000,1582329740553245,0.1,9675.13,9674.02,0.458 -binance-futures,BTCUSDT,1582329740435000,1582329740560284,0.1,9675.13,9674.05,0.031 -binance-futures,BTCUSDT,1582329740441000,1582329740564828,2.542,9674.57,9674.05,0.031 -binance-futures,BTCUSDT,1582329740443000,1582329740566189,0.267,9674.49,9674.05,0.031 -binance-futures,BTCUSDT,1582329740456000,1582329740580515,2.542,9674.57,9674.05,0.031 -binance-futures,BTCUSDT,1582329740458000,1582329740580525,2.542,9674.57,9674.06,1 -binance-futures,BTCUSDT,1582329740478000,1582329740598801,2.542,9674.57,9674.05,0.477 -binance-futures,BTCUSDT,1582329740482000,1582329740603452,2.542,9674.57,9674.07,0.031 -binance-futures,BTCUSDT,1582329740485000,1582329740608858,2.542,9674.57,9674.09,0.459 -binance-futures,BTCUSDT,1582329740540000,1582329740661502,2.542,9674.57,9674.07,0.721 -binance-futures,BTCUSDT,1582329740542000,1582329740662663,0.267,9674.46,9674.07,0.721 -binance-futures,BTCUSDT,1582329740548000,1582329740667446,0.267,9674.46,9674.15,2 -binance-futures,BTCUSDT,1582329740559000,1582329740678706,2.542,9674.57,9674.15,2 -binance-futures,BTCUSDT,1582329740560000,1582329740681550,2.542,9674.57,9674.07,0.721 -binance-futures,BTCUSDT,1582329740564000,1582329740684543,2.542,9674.57,9674.11,0.031 -binance-futures,BTCUSDT,1582329740570000,1582329740689630,2.542,9674.57,9674.16,0.427 -binance-futures,BTCUSDT,1582329740581000,1582329740701548,2.542,9674.57,9674.21,2 -binance-futures,BTCUSDT,1582329740651000,1582329740782226,0.267,9674.54,9674.21,2 -binance-futures,BTCUSDT,1582329740655000,1582329740784450,2.542,9674.57,9674.21,2 -binance-futures,BTCUSDT,1582329740680000,1582329740801585,2.542,9674.57,9674.23,0.031 -binance-futures,BTCUSDT,1582329740680000,1582329740801892,2.542,9674.57,9674.25,0.031 -binance-futures,BTCUSDT,1582329740682000,1582329740804469,2.542,9674.57,9674.45,2.01 -binance-futures,BTCUSDT,1582329740712000,1582329740835522,2.542,9674.57,9674.46,0.432 -binance-futures,BTCUSDT,1582329740725000,1582329740860817,2.542,9674.57,9674.45,2.01 -binance-futures,BTCUSDT,1582329740749000,1582329740871886,2.542,9674.57,9674.5,0.031 -binance-futures,BTCUSDT,1582329740782000,1582329740902498,2.542,9674.57,9674.51,0.031 -binance-futures,BTCUSDT,1582329740856000,1582329740977287,2.542,9674.57,9674.52,0.67 -binance-futures,BTCUSDT,1582329740856000,1582329740977538,2.542,9674.57,9674.56,0.438 -binance-futures,BTCUSDT,1582329740859000,1582329740979676,2.542,9674.57,9674.56,2.448 -binance-futures,BTCUSDT,1582329740862000,1582329740982497,2.542,9674.57,9674.56,2.01 -binance-futures,BTCUSDT,1582329740879000,1582329741001237,2.542,9674.57,9674.56,2.041 -binance-futures,BTCUSDT,1582329740904000,1582329741027207,2.542,9674.57,9674.56,2.01 -binance-futures,BTCUSDT,1582329740951000,1582329741072601,2.809,9674.57,9674.56,2.01 -binance-futures,BTCUSDT,1582329740980000,1582329741101744,2.809,9674.57,9674.55,1.38 -binance-futures,BTCUSDT,1582329741012000,1582329741131140,2.809,9674.57,9674.55,2.07 -binance-futures,BTCUSDT,1582329741043000,1582329741163123,2.809,9674.57,9674.55,1.4 -binance-futures,BTCUSDT,1582329741047000,1582329741169288,2.809,9674.57,9674.55,0.71 -binance-futures,BTCUSDT,1582329741051000,1582329741171615,2.809,9674.57,9674.55,0.04 -binance-futures,BTCUSDT,1582329741052000,1582329741174163,2.809,9674.57,9673.77,1 -binance-futures,BTCUSDT,1582329741061000,1582329741183102,2.809,9674.57,9673.63,0.684 -binance-futures,BTCUSDT,1582329741079000,1582329741199159,0.267,9674.33,9673.63,0.684 -binance-futures,BTCUSDT,1582329741096000,1582329741219641,3.317,9674.33,9673.63,0.684 -binance-futures,BTCUSDT,1582329741124000,1582329741246700,0.267,9674.07,9673.63,0.684 -binance-futures,BTCUSDT,1582329741148000,1582329741273081,0.031,9674.05,9673.63,0.684 -binance-futures,BTCUSDT,1582329741150000,1582329741273115,0.031,9674.03,9673.63,0.684 -binance-futures,BTCUSDT,1582329741172000,1582329741293188,3.331,9674.03,9673.63,0.684 -binance-futures,BTCUSDT,1582329741177000,1582329741297156,0.267,9674.02,9673.63,0.684 -binance-futures,BTCUSDT,1582329741197000,1582329741321256,4.267,9674.02,9673.63,0.684 -binance-futures,BTCUSDT,1582329741201000,1582329741321310,0.031,9673.98,9673.63,0.684 -binance-futures,BTCUSDT,1582329741214000,1582329741336704,0.267,9673.96,9673.63,0.684 -binance-futures,BTCUSDT,1582329741262000,1582329741383997,0.031,9673.98,9673.63,0.684 -binance-futures,BTCUSDT,1582329741283000,1582329741408690,0.031,9673.95,9673.63,0.684 -binance-futures,BTCUSDT,1582329741307000,1582329741445895,3.281,9673.95,9673.63,0.684 -binance-futures,BTCUSDT,1582329741311000,1582329741446194,3.25,9673.95,9673.63,0.684 -binance-futures,BTCUSDT,1582329741314000,1582329741449482,0.267,9673.92,9673.63,0.684 -binance-futures,BTCUSDT,1582329741346000,1582329741470533,3.417,9673.92,9673.63,0.684 -binance-futures,BTCUSDT,1582329741350000,1582329741472449,0.031,9673.91,9673.63,0.684 -binance-futures,BTCUSDT,1582329741372000,1582329741491593,4.531,9673.91,9673.63,0.684 -binance-futures,BTCUSDT,1582329741374000,1582329741494139,0.267,9673.82,9673.63,0.684 -binance-futures,BTCUSDT,1582329741392000,1582329741514855,4.667,9673.82,9673.63,0.684 -binance-futures,BTCUSDT,1582329741409000,1582329741531295,0.031,9673.78,9673.63,0.684 -binance-futures,BTCUSDT,1582329741418000,1582329741539283,0.267,9673.72,9673.63,0.684 -binance-futures,BTCUSDT,1582329741444000,1582329741567265,0.031,9673.68,9673.63,1.354 -binance-futures,BTCUSDT,1582329741449000,1582329741573196,0.031,9673.68,9673.63,2.714 -binance-futures,BTCUSDT,1582329741457000,1582329741578672,0.031,9673.68,9673.63,2.754 -binance-futures,BTCUSDT,1582329741457000,1582329741578696,0.09,9673.64,9673.63,2.754 -binance-futures,BTCUSDT,1582329741583000,1582329741704799,1.789,9673.96,9673.63,2.754 -binance-futures,BTCUSDT,1582329741607000,1582329741728902,1.789,9673.96,9673.66,0.031 -binance-futures,BTCUSDT,1582329741609000,1582329741728917,1.789,9673.96,9673.67,0.031 -binance-futures,BTCUSDT,1582329741700000,1582329741819939,0.267,9673.95,9673.67,0.031 -binance-futures,BTCUSDT,1582329741722000,1582329741844730,0.267,9673.95,9673.63,0.684 -binance-futures,BTCUSDT,1582329741748000,1582329741872841,0.031,9673.91,9673.63,0.684 -binance-futures,BTCUSDT,1582329741773000,1582329741895153,2.981,9673.91,9673.63,0.684 -binance-futures,BTCUSDT,1582329741777000,1582329741900923,0.267,9673.9,9673.63,0.684 -binance-futures,BTCUSDT,1582329741798000,1582329741917760,0.031,9673.87,9673.63,0.684 -binance-futures,BTCUSDT,1582329741815000,1582329741937815,8.131,9673.87,9673.63,0.684 -binance-futures,BTCUSDT,1582329741824000,1582329741943215,0.267,9673.76,9673.63,0.684 -binance-futures,BTCUSDT,1582329741838000,1582329741957917,0.09,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329741857000,1582329741977968,5.54,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329741870000,1582329741992206,5.807,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329741892000,1582329742011381,0.357,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329741952000,1582329742073763,2.972,9673.64,9673.63,0.684 -binance-futures,BTCUSDT,1582329741976000,1582329742102984,0.216,9673.01,9671.98,0.441 -binance-futures,BTCUSDT,1582329742002000,1582329742124395,4.616,9673.01,9671.98,0.441 -binance-futures,BTCUSDT,1582329742014000,1582329742138769,4.616,9673.01,9671.99,0.04 -binance-futures,BTCUSDT,1582329742019000,1582329742145066,0.267,9672.9,9671.99,2.07 -binance-futures,BTCUSDT,1582329742043000,1582329742162540,4.667,9672.9,9671.99,2.07 -binance-futures,BTCUSDT,1582329742067000,1582329742189375,4.4,9672.9,9671.99,2.07 -binance-futures,BTCUSDT,1582329742069000,1582329742191552,0.267,9672.79,9671.99,2.07 -binance-futures,BTCUSDT,1582329742071000,1582329742193999,0.267,9672.79,9671.99,2.03 -binance-futures,BTCUSDT,1582329742075000,1582329742200839,0.267,9672.79,9671.99,1.36 -binance-futures,BTCUSDT,1582329742078000,1582329742201389,0.267,9672.79,9671.99,0.69 -binance-futures,BTCUSDT,1582329742080000,1582329742201424,0.267,9672.79,9671.98,0.441 -binance-futures,BTCUSDT,1582329742089000,1582329742209259,4.117,9672.79,9671.98,0.438 -binance-futures,BTCUSDT,1582329742103000,1582329742224757,4.117,9672.79,9672,0.69 -binance-futures,BTCUSDT,1582329742105000,1582329742224939,0.031,9672.75,9672,0.69 -binance-futures,BTCUSDT,1582329742107000,1582329742227414,0.031,9672.75,9672,1.36 -binance-futures,BTCUSDT,1582329742113000,1582329742234744,0.267,9672.71,9672,1.36 -binance-futures,BTCUSDT,1582329742115000,1582329742237923,0.267,9672.71,9672,2.03 -binance-futures,BTCUSDT,1582329742131000,1582329742252467,0.267,9672.71,9672,1.4 -binance-futures,BTCUSDT,1582329742133000,1582329742255359,2.767,9672.71,9672,0.71 -binance-futures,BTCUSDT,1582329742155000,1582329742275094,2.767,9672.71,9672.02,0.031 -binance-futures,BTCUSDT,1582329742155000,1582329742278308,2.767,9672.71,9672.04,0.031 -binance-futures,BTCUSDT,1582329742156000,1582329742278759,2.5,9672.71,9672.04,0.031 -binance-futures,BTCUSDT,1582329742158000,1582329742281736,0.267,9672.61,9672.04,0.031 -binance-futures,BTCUSDT,1582329742178000,1582329742300326,2.35,9672.61,9672.01,0.67 -binance-futures,BTCUSDT,1582329742188000,1582329742309171,2.35,9672.61,9672.03,0.04 -binance-futures,BTCUSDT,1582329742190000,1582329742314966,0.216,9673.01,9672.03,0.04 -binance-futures,BTCUSDT,1582329742192000,1582329742315890,0.216,9673.01,9672.03,0.71 -binance-futures,BTCUSDT,1582329742202000,1582329742324065,0.031,9672.58,9672.03,0.71 -binance-futures,BTCUSDT,1582329742204000,1582329742324790,0.031,9672.57,9672.03,1.38 -binance-futures,BTCUSDT,1582329742216000,1582329742337737,0.031,9672.57,9672.03,1.34 -binance-futures,BTCUSDT,1582329742228000,1582329742350665,0.267,9673,9672.03,1.34 -binance-futures,BTCUSDT,1582329742230000,1582329742352793,0.216,9673.01,9672.03,1.34 -binance-futures,BTCUSDT,1582329742234000,1582329742356619,0.216,9673.01,9672.05,0.69 -binance-futures,BTCUSDT,1582329742242000,1582329742363995,0.267,9672.99,9672.05,0.69 -binance-futures,BTCUSDT,1582329742247000,1582329742368769,0.216,9673.01,9672.05,0.69 -binance-futures,BTCUSDT,1582329742253000,1582329742381123,0.216,9673.01,9672.06,0.031 -binance-futures,BTCUSDT,1582329742255000,1582329742381153,0.216,9673.01,9672.21,0.43 -binance-futures,BTCUSDT,1582329742263000,1582329742384716,3.15,9672.99,9672.21,0.43 -binance-futures,BTCUSDT,1582329742272000,1582329742394398,3.15,9672.99,9672.07,0.031 -binance-futures,BTCUSDT,1582329742280000,1582329742416664,3.15,9672.99,9672.06,0.439 -binance-futures,BTCUSDT,1582329742282000,1582329742416787,3.15,9672.99,9672.05,0.69 -binance-futures,BTCUSDT,1582329742284000,1582329742417305,3.15,9672.99,9672.11,0.468 -binance-futures,BTCUSDT,1582329742288000,1582329742417655,0.216,9673.01,9672.11,0.468 -binance-futures,BTCUSDT,1582329742308000,1582329742428361,0.216,9673.01,9672.04,0.04 -binance-futures,BTCUSDT,1582329742318000,1582329742442616,0.216,9673.01,9672.1,0.031 -binance-futures,BTCUSDT,1582329742346000,1582329742469525,0.216,9673.01,9671.98,0.438 -binance-futures,BTCUSDT,1582329742355000,1582329742477096,0.216,9673.01,9672.04,0.43 -binance-futures,BTCUSDT,1582329742374000,1582329742494126,0.216,9673.01,9671.98,0.438 -binance-futures,BTCUSDT,1582329742397000,1582329742519289,0.031,9672.99,9671.98,0.438 -binance-futures,BTCUSDT,1582329742399000,1582329742520636,0.031,9672.97,9671.98,0.438 -binance-futures,BTCUSDT,1582329742418000,1582329742541415,4.281,9672.97,9671.98,0.438 -binance-futures,BTCUSDT,1582329742430000,1582329742550539,0.031,9672.97,9671.98,0.438 -binance-futures,BTCUSDT,1582329742445000,1582329742565162,0.031,9672.93,9671.98,0.438 -binance-futures,BTCUSDT,1582329742452000,1582329742572211,0.298,9672.93,9671.98,0.438 -binance-futures,BTCUSDT,1582329742466000,1582329742588465,0.267,9672.93,9671.98,0.438 -binance-futures,BTCUSDT,1582329742494000,1582329742616523,0.199,9672.93,9671.98,0.438 -binance-futures,BTCUSDT,1582329742513000,1582329742635488,0.199,9672.93,9671.98,2.588 -binance-futures,BTCUSDT,1582329742519000,1582329742638743,0.031,9672.89,9671.98,2.588 -binance-futures,BTCUSDT,1582329742527000,1582329742646621,0.031,9672.89,9671.98,0.438 -binance-futures,BTCUSDT,1582329742553000,1582329742675716,0.241,9672.87,9671.98,0.438 -binance-futures,BTCUSDT,1582329742562000,1582329742687705,0.241,9672.87,9672.03,0.43 -binance-futures,BTCUSDT,1582329742565000,1582329742687732,0.031,9672.89,9672.03,0.43 -binance-futures,BTCUSDT,1582329742578000,1582329742699989,0.031,9672.83,9672.03,0.43 -binance-futures,BTCUSDT,1582329742597000,1582329742718361,0.031,9672.83,9671.98,0.438 -binance-futures,BTCUSDT,1582329742603000,1582329742725964,0.216,9673.01,9671.98,0.438 -binance-futures,BTCUSDT,1582329742605000,1582329742727822,0.241,9672.9,9671.98,0.438 -binance-futures,BTCUSDT,1582329742612000,1582329742733635,0.216,9673.01,9671.98,0.438 -binance-futures,BTCUSDT,1582329742620000,1582329742744349,0.216,9673.01,9672,0.433 -binance-futures,BTCUSDT,1582329742622000,1582329742745985,0.031,9672.79,9672,0.433 -binance-futures,BTCUSDT,1582329742626000,1582329742749006,0.031,9672.79,9671.98,0.438 -binance-futures,BTCUSDT,1582329742644000,1582329742766510,0.216,9673.01,9671.98,0.438 -binance-futures,BTCUSDT,1582329742656000,1582329742779351,0.216,9673.01,9671.98,0.891 -binance-futures,BTCUSDT,1582329742665000,1582329742786421,0.216,9673.01,9671.98,0.438 -binance-futures,BTCUSDT,1582329742684000,1582329742805857,0.216,9673.01,9672.02,0.031 -binance-futures,BTCUSDT,1582329742698000,1582329742820590,0.241,9672.82,9672.02,0.031 -binance-futures,BTCUSDT,1582329742702000,1582329742823513,0.216,9673.01,9672.02,0.031 -binance-futures,BTCUSDT,1582329742726000,1582329742848480,0.216,9673.01,9671.98,0.438 -binance-futures,BTCUSDT,1582329742755000,1582329742876846,0.216,9673.01,9672.56,2.01 -binance-futures,BTCUSDT,1582329742783000,1582329742903353,0.216,9673.01,9671.98,0.438 -binance-futures,BTCUSDT,1582329742971000,1582329743092983,0.031,9672.98,9671.98,0.438 -binance-futures,BTCUSDT,1582329742971000,1582329743095260,0.031,9672.97,9671.98,0.438 -binance-futures,BTCUSDT,1582329742993000,1582329743115184,3.731,9672.97,9671.98,0.438 -binance-futures,BTCUSDT,1582329743013000,1582329743133707,0.241,9672.96,9671.98,0.438 -binance-futures,BTCUSDT,1582329743032000,1582329743151095,5.691,9672.96,9671.98,0.438 -binance-futures,BTCUSDT,1582329743036000,1582329743158794,0.031,9672.93,9671.98,0.438 -binance-futures,BTCUSDT,1582329743036000,1582329743158913,0.031,9672.92,9671.98,0.438 -binance-futures,BTCUSDT,1582329743056000,1582329743175933,6.181,9672.92,9671.98,0.438 -binance-futures,BTCUSDT,1582329743058000,1582329743178689,6.422,9672.92,9671.98,0.438 -binance-futures,BTCUSDT,1582329743080000,1582329743200773,6.181,9672.92,9671.98,0.438 -binance-futures,BTCUSDT,1582329743082000,1582329743202759,0.241,9672.87,9671.98,0.438 -binance-futures,BTCUSDT,1582329743099000,1582329743219237,0.241,9672.87,9671.98,0.219 -binance-futures,BTCUSDT,1582329743099000,1582329743219247,0.241,9672.87,9671.91,0.047 -binance-futures,BTCUSDT,1582329743103000,1582329743226131,3.541,9672.87,9671.91,0.047 -binance-futures,BTCUSDT,1582329743121000,1582329743242334,0.031,9672.83,9671.91,0.047 -binance-futures,BTCUSDT,1582329743132000,1582329743251031,0.241,9672.82,9671.91,0.047 -binance-futures,BTCUSDT,1582329743148000,1582329743268498,4.141,9672.82,9671.91,0.047 -binance-futures,BTCUSDT,1582329743153000,1582329743273725,0.031,9672.79,9671.91,0.047 -binance-futures,BTCUSDT,1582329743155000,1582329743276646,0.031,9672.78,9671.91,0.047 -binance-futures,BTCUSDT,1582329743173000,1582329743297219,5.331,9672.78,9671.91,0.047 -binance-futures,BTCUSDT,1582329743174000,1582329743297287,0.241,9672.76,9671.91,0.047 -binance-futures,BTCUSDT,1582329743196000,1582329743327011,5.541,9672.76,9671.91,0.047 -binance-futures,BTCUSDT,1582329743199000,1582329743327722,0.031,9672.72,9671.91,0.047 -binance-futures,BTCUSDT,1582329743225000,1582329743346550,4.131,9672.72,9671.91,0.047 -binance-futures,BTCUSDT,1582329743234000,1582329743354735,4.131,9672.72,9671.92,0.69 -binance-futures,BTCUSDT,1582329743234000,1582329743359231,0.241,9672.71,9671.92,0.69 -binance-futures,BTCUSDT,1582329743238000,1582329743359819,0.241,9672.71,9671.92,1.36 -binance-futures,BTCUSDT,1582329743242000,1582329743364551,0.241,9672.71,9671.92,1.4 -binance-futures,BTCUSDT,1582329743245000,1582329743367952,0.031,9672.69,9671.92,1.4 -binance-futures,BTCUSDT,1582329743249000,1582329743371844,0.031,9672.69,9671.92,2.07 -binance-futures,BTCUSDT,1582329743272000,1582329743395267,0.031,9672.69,9671.92,1.38 -binance-futures,BTCUSDT,1582329743274000,1582329743398413,0.031,9672.69,9671.92,0.71 -binance-futures,BTCUSDT,1582329743276000,1582329743399848,0.241,9672.7,9671.92,0.71 -binance-futures,BTCUSDT,1582329743278000,1582329743400290,0.241,9672.7,9671.92,0.04 -binance-futures,BTCUSDT,1582329743281000,1582329743404347,0.241,9672.7,9671.96,0.031 -binance-futures,BTCUSDT,1582329743299000,1582329743420924,0.216,9673.01,9671.96,0.031 -binance-futures,BTCUSDT,1582329743302000,1582329743423271,0.216,9673.01,9671.93,0.427 -binance-futures,BTCUSDT,1582329743308000,1582329743428272,0.216,9673.01,9671.96,0.43 -binance-futures,BTCUSDT,1582329743313000,1582329743435378,0.216,9673.01,9671.91,0.047 -binance-futures,BTCUSDT,1582329743313000,1582329743435396,0.216,9673.01,9671.98,0.472 -binance-futures,BTCUSDT,1582329743324000,1582329743446537,0.216,9673.01,9671.91,0.047 -binance-futures,BTCUSDT,1582329743327000,1582329743449645,0.216,9673.01,9671.96,0.031 -binance-futures,BTCUSDT,1582329743328000,1582329743450691,0.216,9673.01,9671.98,0.031 -binance-futures,BTCUSDT,1582329743347000,1582329743472341,0.216,9673.01,9672.56,2.01 -binance-futures,BTCUSDT,1582329743374000,1582329743499958,0.216,9673.01,9672.59,0.463 -binance-futures,BTCUSDT,1582329743398000,1582329743519635,0.216,9673.01,9672.56,2.01 -binance-futures,BTCUSDT,1582329743471000,1582329743591820,0.216,9673.01,9672.64,0.438 -binance-futures,BTCUSDT,1582329743474000,1582329743593159,0.216,9673.01,9672.56,2.01 -binance-futures,BTCUSDT,1582329743492000,1582329743614213,0.216,9673.01,9672.68,0.031 -binance-futures,BTCUSDT,1582329743591000,1582329743711767,0.216,9673.01,9672.69,0.031 -binance-futures,BTCUSDT,1582329743601000,1582329743723804,0.216,9673.01,9673,2.01 -binance-futures,BTCUSDT,1582329743655000,1582329743779018,0.216,9673.01,9672.69,2.01 -binance-futures,BTCUSDT,1582329743680000,1582329743802348,0.216,9673.01,9672.73,0.031 -binance-futures,BTCUSDT,1582329743688000,1582329743810266,0.216,9673.01,9673,2.01 -binance-futures,BTCUSDT,1582329743696000,1582329743814992,0.306,9673.01,9673,2.01 -binance-futures,BTCUSDT,1582329743826000,1582329743948920,0.216,9673.01,9673,2.01 -binance-futures,BTCUSDT,1582329743852000,1582329743973855,0.216,9673.01,9672.69,2.01 -binance-futures,BTCUSDT,1582329743946000,1582329744064427,0.031,9672.96,9672.69,2.01 -binance-futures,BTCUSDT,1582329743949000,1582329744070150,0.031,9672.96,9672.7,0.69 -binance-futures,BTCUSDT,1582329743953000,1582329744072995,0.031,9672.96,9672.7,1.4 -binance-futures,BTCUSDT,1582329743960000,1582329744081377,0.031,9672.96,9672.7,2.07 -binance-futures,BTCUSDT,1582329743972000,1582329744092964,0.031,9672.97,9672.7,2.07 -binance-futures,BTCUSDT,1582329743972000,1582329744092984,0.216,9673.01,9672.7,2.07 -binance-futures,BTCUSDT,1582329743995000,1582329744115034,0.216,9673.01,9672.74,0.031 -binance-futures,BTCUSDT,1582329744005000,1582329744127084,0.216,9673.01,9673,0.1 -binance-futures,BTCUSDT,1582329744134000,1582329744263079,0.216,9673.01,9673,2.11 -binance-futures,BTCUSDT,1582329744182000,1582329744307176,0.216,9673.01,9673,2.01 -binance-futures,BTCUSDT,1582329744214000,1582329744336257,0.216,9673.01,9673,2.478 -binance-futures,BTCUSDT,1582329744231000,1582329744353166,0.216,9673.01,9673,2.01 -binance-futures,BTCUSDT,1582329744238000,1582329744359890,0.457,9673.01,9673,2.01 -binance-futures,BTCUSDT,1582329744248000,1582329744368199,0.216,9673.01,9673,2.01 -binance-futures,BTCUSDT,1582329744289000,1582329744413957,0.306,9673.01,9673,2.01 -binance-futures,BTCUSDT,1582329744381000,1582329744517842,0.306,9673.01,9672.56,2.01 -binance-futures,BTCUSDT,1582329744416000,1582329744538692,0.031,9672.97,9672.56,2.01 -binance-futures,BTCUSDT,1582329744440000,1582329744565728,0.306,9673.01,9672.56,2.01 -binance-futures,BTCUSDT,1582329744442000,1582329744565780,0.306,9673.01,9672.57,0.441 -binance-futures,BTCUSDT,1582329744444000,1582329744568802,0.306,9673.01,9672.57,1.111 -binance-futures,BTCUSDT,1582329744448000,1582329744570843,0.306,9673.01,9672.57,1.781 -binance-futures,BTCUSDT,1582329744451000,1582329744573251,0.306,9673.01,9672.57,1.821 -binance-futures,BTCUSDT,1582329744459000,1582329744583725,0.306,9673.01,9672.57,1.38 -binance-futures,BTCUSDT,1582329744459000,1582329744583756,0.306,9673.01,9673,2.01 -binance-futures,BTCUSDT,1582329744485000,1582329744609823,0.216,9673.01,9672.6,0.031 -binance-futures,BTCUSDT,1582329744491000,1582329744611504,0.216,9673.01,9672.74,0.472 -binance-futures,BTCUSDT,1582329744500000,1582329744621278,0.216,9673.01,9672.6,0.031 -binance-futures,BTCUSDT,1582329744510000,1582329744632720,0.216,9673.01,9673,0.465 -binance-futures,BTCUSDT,1582329744514000,1582329744636944,0.216,9673.01,9672.6,0.031 -binance-futures,BTCUSDT,1582329744515000,1582329744639303,0.216,9673.01,9672.56,2.01 -binance-futures,BTCUSDT,1582329744515000,1582329744639710,0.216,9673.01,9672.78,0.031 -binance-futures,BTCUSDT,1582329744534000,1582329744665648,0.216,9673.01,9672.77,0.031 -binance-futures,BTCUSDT,1582329744543000,1582329744667760,0.216,9673.01,9672.56,2.01 -binance-futures,BTCUSDT,1582329744544000,1582329744668334,0.216,9673.01,9672.77,0.469 -binance-futures,BTCUSDT,1582329744566000,1582329744692480,0.216,9673.01,9672.81,0.031 -binance-futures,BTCUSDT,1582329744592000,1582329744712272,0.216,9673.01,9672.87,2 -binance-futures,BTCUSDT,1582329744614000,1582329744746258,1.292,9673.35,9672.9,0.031 -binance-futures,BTCUSDT,1582329744616000,1582329744746793,1.086,9673.35,9672.91,0.031 -binance-futures,BTCUSDT,1582329744617000,1582329744748489,3.028,9673.6,9672.94,0.471 -binance-futures,BTCUSDT,1582329744632000,1582329744752677,3.028,9673.6,9673,2.01 -binance-futures,BTCUSDT,1582329744649000,1582329744770997,3.028,9673.6,9673,5.71 -binance-futures,BTCUSDT,1582329744657000,1582329744776999,3.028,9673.6,9673.18,0.462 -binance-futures,BTCUSDT,1582329744675000,1582329744797857,3.028,9673.6,9673.18,5.562 -binance-futures,BTCUSDT,1582329744687000,1582329744809070,3.028,9673.6,9673.18,0.462 -binance-futures,BTCUSDT,1582329744700000,1582329744820781,3.028,9673.6,9673,2.01 -binance-futures,BTCUSDT,1582329744702000,1582329744824048,3.028,9673.6,9673.35,0.436 -binance-futures,BTCUSDT,1582329744714000,1582329744838424,3.028,9673.6,9673,2.01 -binance-futures,BTCUSDT,1582329744716000,1582329744840252,3.028,9673.6,9673.05,0.445 -binance-futures,BTCUSDT,1582329744847000,1582329744971711,3.028,9673.6,9673.09,0.031 -binance-futures,BTCUSDT,1582329744949000,1582329745070734,3.028,9673.6,9673.19,0.441 -binance-futures,BTCUSDT,1582329744957000,1582329745078245,3.028,9673.6,9671.91,0.047 -binance-futures,BTCUSDT,1582329744959000,1582329745081397,3.028,9673.6,9673.1,2.01 -binance-futures,BTCUSDT,1582329744983000,1582329745104717,0.031,9673.56,9673.1,2.01 -binance-futures,BTCUSDT,1582329744989000,1582329745112338,0.031,9673.56,9673.11,0.67 -binance-futures,BTCUSDT,1582329744994000,1582329745115910,0.031,9673.56,9673.11,0.71 -binance-futures,BTCUSDT,1582329744998000,1582329745117967,0.031,9673.56,9673.11,1.38 -binance-futures,BTCUSDT,1582329744998000,1582329745120448,0.031,9673.56,9673.11,2.07 -binance-futures,BTCUSDT,1582329745004000,1582329745127201,2.881,9673.56,9673.11,2.07 -binance-futures,BTCUSDT,1582329745012000,1582329745132839,2.881,9673.56,9673.11,1.4 -binance-futures,BTCUSDT,1582329745014000,1582329745134753,2.85,9673.56,9673.11,1.4 -binance-futures,BTCUSDT,1582329745014000,1582329745137723,3.028,9673.6,9673.11,1.4 -binance-futures,BTCUSDT,1582329745031000,1582329745153082,0.241,9673.59,9673.11,1.4 -binance-futures,BTCUSDT,1582329745039000,1582329745164625,3.028,9673.6,9673.15,0.031 -binance-futures,BTCUSDT,1582329745041000,1582329745164662,0.241,9673.54,9673.15,0.031 -binance-futures,BTCUSDT,1582329745061000,1582329745185184,3.028,9673.6,9673.15,0.031 -binance-futures,BTCUSDT,1582329745080000,1582329745209630,3.028,9673.6,9673.21,0.47 -binance-futures,BTCUSDT,1582329745111000,1582329745235947,3.028,9673.6,9673.25,0.031 -binance-futures,BTCUSDT,1582329745145000,1582329745269821,3.028,9673.6,9673.36,0.443 -binance-futures,BTCUSDT,1582329745192000,1582329745313046,3.028,9673.6,9673.26,0.721 -binance-futures,BTCUSDT,1582329745204000,1582329745325494,3.028,9673.6,9673.35,0.438 -binance-futures,BTCUSDT,1582329745208000,1582329745330327,3.028,9673.6,9673.26,0.761 -binance-futures,BTCUSDT,1582329745215000,1582329745337064,3.028,9673.6,9673.3,0.031 -binance-futures,BTCUSDT,1582329745264000,1582329745385814,3.028,9673.6,9673.31,0.031 -binance-futures,BTCUSDT,1582329745278000,1582329745398622,0.241,9673.59,9673.31,0.031 -binance-futures,BTCUSDT,1582329745289000,1582329745410322,3.028,9673.6,9673.31,0.031 -binance-futures,BTCUSDT,1582329745297000,1582329745417743,2.4,9673.59,9673.31,0.031 -binance-futures,BTCUSDT,1582329745301000,1582329745422618,2.4,9673.59,9673.32,0.467 -binance-futures,BTCUSDT,1582329745322000,1582329745443745,2.4,9673.59,9673.31,0.031 -binance-futures,BTCUSDT,1582329745327000,1582329745450138,2.4,9673.59,9673.36,0.031 -binance-futures,BTCUSDT,1582329745335000,1582329745456948,3.028,9673.6,9673.36,0.031 -binance-futures,BTCUSDT,1582329745346000,1582329745490906,3.028,9673.6,9673.34,0.031 -binance-futures,BTCUSDT,1582329745371000,1582329745522208,0.241,9673.41,9673.34,0.031 -binance-futures,BTCUSDT,1582329745381000,1582329745522844,0.241,9673.41,9673.26,2.01 -binance-futures,BTCUSDT,1582329745413000,1582329745535034,0.241,9673.41,9673.25,2.01 -binance-futures,BTCUSDT,1582329745425000,1582329745548398,0.031,9673.37,9673.25,2.01 -binance-futures,BTCUSDT,1582329745439000,1582329745559093,0.031,9673.37,9671.91,0.047 -binance-futures,BTCUSDT,1582329745445000,1582329745565902,0.031,9673.37,9673.26,0.04 -binance-futures,BTCUSDT,1582329745449000,1582329745571939,0.031,9673.37,9673.26,0.71 -binance-futures,BTCUSDT,1582329745454000,1582329745575441,0.031,9673.37,9673.26,1.4 -binance-futures,BTCUSDT,1582329745460000,1582329745585209,0.031,9673.37,9673.26,2.07 -binance-futures,BTCUSDT,1582329745468000,1582329745589151,0.031,9673.37,9673.26,2.03 -binance-futures,BTCUSDT,1582329745472000,1582329745597209,0.241,9673.27,9673.26,2.03 -binance-futures,BTCUSDT,1582329745485000,1582329745606369,0.241,9673.27,9673.26,1.36 -binance-futures,BTCUSDT,1582329745493000,1582329745613994,0.241,9673.27,9673.26,0.67 -binance-futures,BTCUSDT,1582329745494000,1582329745615518,0.241,9673.27,9671.91,0.047 -binance-futures,BTCUSDT,1582329745500000,1582329745621138,0.031,9673.23,9671.91,0.047 -binance-futures,BTCUSDT,1582329745519000,1582329745638794,5.481,9673.23,9671.91,0.047 -binance-futures,BTCUSDT,1582329745526000,1582329745646747,5.481,9673.23,9671.92,0.69 -binance-futures,BTCUSDT,1582329745531000,1582329745649720,5.481,9673.23,9671.92,1.36 -binance-futures,BTCUSDT,1582329745537000,1582329745659049,5.481,9673.23,9671.92,2.07 -binance-futures,BTCUSDT,1582329745542000,1582329745665103,0.031,9673.19,9671.92,2.07 -binance-futures,BTCUSDT,1582329745560000,1582329745680693,0.031,9673.19,9671.92,2.03 -binance-futures,BTCUSDT,1582329745562000,1582329745685536,4,9673.19,9671.92,2.03 -binance-futures,BTCUSDT,1582329745564000,1582329745687339,4,9673.19,9671.92,2.014 -binance-futures,BTCUSDT,1582329745572000,1582329745691746,4,9673.19,9671.92,1.344 -binance-futures,BTCUSDT,1582329745574000,1582329745694609,4,9673.19,9671.92,0.674 -binance-futures,BTCUSDT,1582329745582000,1582329745703381,4,9673.19,9671.91,0.047 -binance-futures,BTCUSDT,1582329745598000,1582329745715814,7.4,9673.19,9671.91,0.047 -binance-futures,BTCUSDT,1582329745600000,1582329745719029,7.4,9673.19,9671.93,0.04 -binance-futures,BTCUSDT,1582329745603000,1582329745731405,0.031,9673.15,9672.05,0.444 -binance-futures,BTCUSDT,1582329745626000,1582329745746339,6.181,9673.15,9672.05,0.444 -binance-futures,BTCUSDT,1582329745643000,1582329745764580,6.181,9673.15,9672.06,0.032 -binance-futures,BTCUSDT,1582329745649000,1582329745770899,0.031,9673.11,9672.06,0.032 -binance-futures,BTCUSDT,1582329745671000,1582329745791046,6.031,9673.11,9672.06,0.032 -binance-futures,BTCUSDT,1582329745691000,1582329745814624,6,9673.11,9672.06,0.032 -binance-futures,BTCUSDT,1582329745717000,1582329745837368,0.031,9673.07,9672.06,0.032 -binance-futures,BTCUSDT,1582329745723000,1582329745845454,0.031,9673.07,9672.08,0.431 -binance-futures,BTCUSDT,1582329745735000,1582329745858272,6.581,9673.07,9672.08,0.431 -binance-futures,BTCUSDT,1582329745749000,1582329745870953,6.55,9673.07,9672.06,0.032 -binance-futures,BTCUSDT,1582329745761000,1582329745883768,0.241,9673.02,9672.06,0.032 -binance-futures,BTCUSDT,1582329745780000,1582329745903799,0.031,9673.03,9672.06,0.032 -binance-futures,BTCUSDT,1582329745782000,1582329745907129,8.7,9673.02,9672.06,0.032 -binance-futures,BTCUSDT,1582329745827000,1582329745947771,0.241,9673,9672.06,0.032 -binance-futures,BTCUSDT,1582329745830000,1582329745953817,8.7,9673.02,9672.06,0.032 -binance-futures,BTCUSDT,1582329745847000,1582329745969494,7.75,9673,9672.06,0.032 -binance-futures,BTCUSDT,1582329745851000,1582329745971939,0.031,9672.96,9672.06,0.032 -binance-futures,BTCUSDT,1582329745872000,1582329745995745,9.031,9672.96,9672.06,0.032 -binance-futures,BTCUSDT,1582329745902000,1582329746025891,9.031,9672.96,9671.91,0.047 -binance-futures,BTCUSDT,1582329745902000,1582329746026506,9.031,9672.96,9671.93,0.032 -binance-futures,BTCUSDT,1582329745930000,1582329746054903,0.031,9672.94,9671.93,0.032 -binance-futures,BTCUSDT,1582329745930000,1582329746054937,0.031,9672.92,9671.93,0.032 -binance-futures,BTCUSDT,1582329745955000,1582329746074875,10.881,9672.92,9671.93,0.032 -binance-futures,BTCUSDT,1582329745990000,1582329746111059,0.06,9672.91,9671.93,0.032 -binance-futures,BTCUSDT,1582329746011000,1582329746132802,0.241,9672.88,9671.93,0.032 -binance-futures,BTCUSDT,1582329746016000,1582329746139071,0.013,9672.87,9671.93,0.032 -binance-futures,BTCUSDT,1582329746036000,1582329746159989,12.513,9672.87,9671.93,0.032 -binance-futures,BTCUSDT,1582329746043000,1582329746164475,0.031,9672.84,9671.93,0.032 -binance-futures,BTCUSDT,1582329746062000,1582329746186403,13.481,9672.84,9671.93,0.032 -binance-futures,BTCUSDT,1582329746064000,1582329746186522,0.241,9672.81,9671.93,0.032 -binance-futures,BTCUSDT,1582329746087000,1582329746210993,13.191,9672.81,9671.93,0.032 -binance-futures,BTCUSDT,1582329746112000,1582329746234057,0.031,9672.77,9671.93,0.032 -binance-futures,BTCUSDT,1582329746118000,1582329746238694,0.241,9672.48,9671.93,0.032 -binance-futures,BTCUSDT,1582329746138000,1582329746263100,9.591,9672.48,9671.93,0.032 -binance-futures,BTCUSDT,1582329746156000,1582329746279810,9.591,9672.48,9671.91,0.047 -binance-futures,BTCUSDT,1582329746167000,1582329746290136,0.031,9672.44,9671.91,0.047 -binance-futures,BTCUSDT,1582329746186000,1582329746310237,0.241,9672.4,9671.91,0.047 -binance-futures,BTCUSDT,1582329746202000,1582329746326112,7.931,9672.44,9671.91,0.047 -binance-futures,BTCUSDT,1582329746206000,1582329746331280,7.2,9672.4,9671.91,0.047 -binance-futures,BTCUSDT,1582329746220000,1582329746344242,7.441,9672.4,9671.91,0.047 -binance-futures,BTCUSDT,1582329746225000,1582329746357784,7.472,9672.4,9671.91,0.047 -binance-futures,BTCUSDT,1582329746260000,1582329746393494,0.06,9672.38,9671.91,0.047 -binance-futures,BTCUSDT,1582329746291000,1582329746411985,6.26,9672.38,9671.91,0.047 -binance-futures,BTCUSDT,1582329746310000,1582329746431305,0.241,9672.37,9671.91,0.047 -binance-futures,BTCUSDT,1582329746314000,1582329746433321,0.031,9672.34,9671.91,0.047 -binance-futures,BTCUSDT,1582329746325000,1582329746444552,2,9672.33,9671.91,0.047 -binance-futures,BTCUSDT,1582329746332000,1582329746455795,4,9672.33,9671.91,0.047 -binance-futures,BTCUSDT,1582329746334000,1582329746456942,4.031,9672.33,9671.91,0.047 -binance-futures,BTCUSDT,1582329746339000,1582329746461858,0.09,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329746358000,1582329746479450,4.49,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329746382000,1582329746505544,0.09,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329746547000,1582329746667231,0.241,9672.93,9671.91,0.047 -binance-futures,BTCUSDT,1582329746569000,1582329746692998,0.031,9672.89,9671.91,0.047 -binance-futures,BTCUSDT,1582329746592000,1582329746715999,12.231,9672.89,9671.91,0.047 -binance-futures,BTCUSDT,1582329746597000,1582329746719648,0.241,9672.87,9671.91,0.047 -binance-futures,BTCUSDT,1582329746616000,1582329746738604,0.031,9672.86,9671.91,0.047 -binance-futures,BTCUSDT,1582329746618000,1582329746739905,0.031,9672.85,9671.91,0.047 -binance-futures,BTCUSDT,1582329746636000,1582329746761630,13.581,9672.85,9671.91,0.047 -binance-futures,BTCUSDT,1582329746644000,1582329746767810,0.241,9672.78,9671.91,0.047 -binance-futures,BTCUSDT,1582329746661000,1582329746781083,0.241,9672.78,9671.92,0.032 -binance-futures,BTCUSDT,1582329746667000,1582329746793523,15.541,9672.78,9671.92,0.032 -binance-futures,BTCUSDT,1582329746696000,1582329746818268,0.031,9672.74,9671.92,0.032 -binance-futures,BTCUSDT,1582329746716000,1582329746837625,12.181,9672.74,9671.92,0.032 -binance-futures,BTCUSDT,1582329746722000,1582329746842135,0.031,9672.72,9671.92,0.032 -binance-futures,BTCUSDT,1582329746722000,1582329746845471,0.031,9672.71,9671.92,0.032 -binance-futures,BTCUSDT,1582329746743000,1582329746865478,13.531,9672.71,9671.92,0.032 -binance-futures,BTCUSDT,1582329746748000,1582329746868898,0.241,9672.67,9671.92,0.032 -binance-futures,BTCUSDT,1582329746767000,1582329746890613,13.791,9672.67,9671.92,0.032 -binance-futures,BTCUSDT,1582329746769000,1582329746891158,13.822,9672.67,9671.92,0.032 -binance-futures,BTCUSDT,1582329746793000,1582329746917218,0.241,9672.63,9671.92,0.032 -binance-futures,BTCUSDT,1582329746813000,1582329746934552,12.741,9672.63,9671.92,0.032 -binance-futures,BTCUSDT,1582329746820000,1582329746942029,0.031,9672.59,9671.92,0.032 -binance-futures,BTCUSDT,1582329746839000,1582329746961750,0.241,9672.56,9671.92,0.032 -binance-futures,BTCUSDT,1582329746861000,1582329746981580,12.141,9672.56,9671.92,0.032 -binance-futures,BTCUSDT,1582329746865000,1582329746988534,0.031,9672.52,9671.92,0.032 -binance-futures,BTCUSDT,1582329746885000,1582329747006991,0.241,9672.48,9671.92,0.032 -binance-futures,BTCUSDT,1582329746908000,1582329747029991,12.641,9672.48,9671.92,0.032 -binance-futures,BTCUSDT,1582329746912000,1582329747032026,12.641,9672.48,9671.91,0.047 -binance-futures,BTCUSDT,1582329746933000,1582329747054229,12.4,9672.48,9671.91,0.047 -binance-futures,BTCUSDT,1582329746935000,1582329747056433,0.241,9672.41,9671.91,0.047 -binance-futures,BTCUSDT,1582329746955000,1582329747076993,13.291,9672.41,9671.91,0.047 -binance-futures,BTCUSDT,1582329746983000,1582329747107186,0.241,9672.33,9671.91,0.047 -binance-futures,BTCUSDT,1582329746997000,1582329747117849,0.09,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329747017000,1582329747138624,8.74,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329747038000,1582329747161244,9.218,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329747054000,1582329747176704,9.459,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329747067000,1582329747191019,0.568,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329747094000,1582329747214088,0.09,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329747205000,1582329747328918,2.218,9672.95,9671.91,0.047 -binance-futures,BTCUSDT,1582329747213000,1582329747336618,0.241,9672.74,9671.91,0.047 -binance-futures,BTCUSDT,1582329747218000,1582329747341110,0.478,9672.27,9671.91,0.047 -binance-futures,BTCUSDT,1582329747236000,1582329747651470,6.25,9672.74,9671.91,0.047 -binance-futures,BTCUSDT,1582329747243000,1582329747651620,3.35,9672.27,9671.91,0.047 -binance-futures,BTCUSDT,1582329747257000,1582329747651701,0.478,9672.26,9671.91,0.047 -binance-futures,BTCUSDT,1582329747285000,1582329747651886,0.031,9672.7,9671.91,0.047 -binance-futures,BTCUSDT,1582329747291000,1582329747651929,6.35,9672.26,9671.91,0.047 -binance-futures,BTCUSDT,1582329747293000,1582329747651945,6.35,9672.26,9671.91,2.057 -binance-futures,BTCUSDT,1582329747321000,1582329747652177,6.41,9672.26,9671.91,2.057 -binance-futures,BTCUSDT,1582329747356000,1582329747652588,0.06,9672.26,9671.91,2.057 -binance-futures,BTCUSDT,1582329747358000,1582329747652614,0.031,9672.24,9671.91,2.057 -binance-futures,BTCUSDT,1582329747360000,1582329747652625,0.031,9672.23,9671.91,2.057 -binance-futures,BTCUSDT,1582329747360000,1582329747652631,0.031,9672.22,9671.91,2.057 -binance-futures,BTCUSDT,1582329747366000,1582329747652699,0.09,9671.92,9671.91,2.057 -binance-futures,BTCUSDT,1582329747475000,1582329747653730,0.15,9671.92,9671.91,2.057 -binance-futures,BTCUSDT,1582329747526000,1582329747654049,0.06,9671.92,9671.91,2.057 -binance-futures,BTCUSDT,1582329747569000,1582329747689958,0.06,9671.92,9671.91,2.067 -binance-futures,BTCUSDT,1582329747677000,1582329747796059,0.06,9671.92,9671.91,2.057 -binance-futures,BTCUSDT,1582329747954000,1582329748074741,0.06,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329748289000,1582329748410466,0.06,9671.92,9671.91,2.057 -binance-futures,BTCUSDT,1582329748446000,1582329748570016,0.06,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329748479000,1582329748600187,0.06,9671.92,9671.91,2.057 -binance-futures,BTCUSDT,1582329748495000,1582329748631132,0.062,9672.94,9671.91,2.057 -binance-futures,BTCUSDT,1582329748496000,1582329748631996,0.809,9673.29,9671.91,2.057 -binance-futures,BTCUSDT,1582329748502000,1582329748633721,0.1,9672.91,9671.91,2.057 -binance-futures,BTCUSDT,1582329748505000,1582329748634535,0.1,9672.91,9671.94,0.454 -binance-futures,BTCUSDT,1582329748520000,1582329748643309,0.1,9672.91,9671.91,2.057 -binance-futures,BTCUSDT,1582329748527000,1582329748650183,0.1,9672.91,9671.92,2.6 -binance-futures,BTCUSDT,1582329748531000,1582329748656800,3.35,9672.91,9671.92,2.6 -binance-futures,BTCUSDT,1582329748532000,1582329748656836,3.35,9672.91,9671.94,2.8 -binance-futures,BTCUSDT,1582329748538000,1582329748658953,0.241,9672.9,9671.94,2.8 -binance-futures,BTCUSDT,1582329748555000,1582329748677978,3.041,9672.9,9671.94,2.8 -binance-futures,BTCUSDT,1582329748563000,1582329748684618,2.8,9672.9,9671.94,2.8 -binance-futures,BTCUSDT,1582329748574000,1582329748695719,2.8,9672.9,9671.91,0.047 -binance-futures,BTCUSDT,1582329748580000,1582329748701967,0.031,9672.86,9671.91,0.047 -binance-futures,BTCUSDT,1582329748584000,1582329748704193,0.241,9672.85,9671.91,0.047 -binance-futures,BTCUSDT,1582329748603000,1582329748723748,7.391,9672.85,9671.91,0.047 -binance-futures,BTCUSDT,1582329748626000,1582329748748843,0.031,9672.81,9671.91,0.047 -binance-futures,BTCUSDT,1582329748630000,1582329748751726,0.241,9672.72,9671.91,0.047 -binance-futures,BTCUSDT,1582329748651000,1582329748773862,6.641,9672.72,9671.91,0.047 -binance-futures,BTCUSDT,1582329748675000,1582329748795757,6.641,9672.72,9671.92,0.031 -binance-futures,BTCUSDT,1582329748679000,1582329748804655,6.4,9672.72,9671.92,0.031 -binance-futures,BTCUSDT,1582329748682000,1582329748804906,0.241,9672.61,9671.92,0.031 -binance-futures,BTCUSDT,1582329748704000,1582329748824047,5.091,9672.61,9671.92,0.031 -binance-futures,BTCUSDT,1582329748719000,1582329748840821,4.85,9672.61,9671.92,0.031 -binance-futures,BTCUSDT,1582329748728000,1582329748849730,0.241,9672.56,9671.92,0.031 -binance-futures,BTCUSDT,1582329748748000,1582329748868282,5.091,9672.56,9671.92,0.031 -binance-futures,BTCUSDT,1582329748789000,1582329748914629,0.241,9672.48,9671.92,0.031 -binance-futures,BTCUSDT,1582329748792000,1582329748916380,0.031,9672.57,9671.92,0.031 -binance-futures,BTCUSDT,1582329748805000,1582329748926527,3.95,9672.48,9671.92,0.031 -binance-futures,BTCUSDT,1582329748814000,1582329748936896,0.031,9672.44,9671.92,0.031 -binance-futures,BTCUSDT,1582329748836000,1582329748958894,4.581,9672.44,9671.92,0.031 -binance-futures,BTCUSDT,1582329748860000,1582329748983494,0.013,9672.42,9671.92,0.031 -binance-futures,BTCUSDT,1582329748860000,1582329748983517,0.031,9672.4,9671.92,0.031 -binance-futures,BTCUSDT,1582329748883000,1582329749002180,4.531,9672.4,9671.92,0.031 -binance-futures,BTCUSDT,1582329748913000,1582329749032107,0.241,9672.37,9671.92,0.031 -binance-futures,BTCUSDT,1582329748926000,1582329749046398,0.241,9672.37,9671.91,0.047 -binance-futures,BTCUSDT,1582329748930000,1582329749053099,4.941,9672.37,9671.91,0.047 -binance-futures,BTCUSDT,1582329748935000,1582329749058850,0.031,9672.33,9671.91,0.047 -binance-futures,BTCUSDT,1582329748957000,1582329749078241,0.09,9671.93,9671.91,0.047 -binance-futures,BTCUSDT,1582329748983000,1582329749104445,0.241,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329749000000,1582329749122678,0.09,9671.93,9671.91,0.047 -binance-futures,BTCUSDT,1582329749056000,1582329749181408,0.231,9672.42,9671.91,0.047 -binance-futures,BTCUSDT,1582329749058000,1582329749181418,2.21,9673.28,9671.91,0.047 -binance-futures,BTCUSDT,1582329749060000,1582329749181936,0.241,9672.3,9671.91,0.047 -binance-futures,BTCUSDT,1582329749078000,1582329749198810,2.741,9672.3,9671.91,0.047 -binance-futures,BTCUSDT,1582329749085000,1582329749207083,2.5,9672.3,9671.91,0.047 -binance-futures,BTCUSDT,1582329749109000,1582329749234608,0.237,9672.27,9671.91,0.047 -binance-futures,BTCUSDT,1582329749135000,1582329749256388,4.287,9672.27,9671.91,0.047 -binance-futures,BTCUSDT,1582329749137000,1582329749259206,0.031,9672.24,9671.91,0.047 -binance-futures,BTCUSDT,1582329749138000,1582329749259221,0.031,9672.23,9671.91,0.047 -binance-futures,BTCUSDT,1582329749159000,1582329749282198,6.618,9672.23,9671.91,0.047 -binance-futures,BTCUSDT,1582329749179000,1582329749301916,7.096,9672.23,9671.91,0.047 -binance-futures,BTCUSDT,1582329749181000,1582329749304872,2,9672.19,9671.91,0.047 -binance-futures,BTCUSDT,1582329749183000,1582329749307775,2,9672.17,9671.91,0.047 -binance-futures,BTCUSDT,1582329749189000,1582329749311083,0.237,9672.13,9671.91,0.047 -binance-futures,BTCUSDT,1582329749207000,1582329749328321,2,9672.11,9671.91,0.047 -binance-futures,BTCUSDT,1582329749209000,1582329749331086,8,9672.07,9671.91,0.047 -binance-futures,BTCUSDT,1582329749225000,1582329749347672,6,9672.07,9671.91,0.047 -binance-futures,BTCUSDT,1582329749227000,1582329749348067,2,9672.02,9671.91,0.047 -binance-futures,BTCUSDT,1582329749229000,1582329749356680,4,9672.01,9671.91,0.047 -binance-futures,BTCUSDT,1582329749229000,1582329749357779,6,9672.01,9671.91,0.047 -binance-futures,BTCUSDT,1582329749235000,1582329749360212,6.237,9672.01,9671.91,0.047 -binance-futures,BTCUSDT,1582329749236000,1582329749369557,0.1,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329749261000,1582329749384922,0.337,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329749265000,1582329749386795,9.537,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329749272000,1582329749394020,10.015,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329749316000,1582329749437540,9.778,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329749326000,1582329749445893,10.015,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329749345000,1582329749467387,0.815,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329749367000,1582329749491119,0.337,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329749372000,1582329749497173,0.1,9671.92,9671.91,0.047 -binance-futures,BTCUSDT,1582329749641000,1582329749776671,1.395,9670,9668.73,1.46 -binance-futures,BTCUSDT,1582329749683000,1582329749807654,1.395,9670,9668.9,0.362 -binance-futures,BTCUSDT,1582329749704000,1582329749827845,1.395,9670,9668.9,4.112 -binance-futures,BTCUSDT,1582329749711000,1582329749836669,1.395,9670,9668.91,0.67 -binance-futures,BTCUSDT,1582329749724000,1582329749849437,1.395,9670,9668.91,2.05 -binance-futures,BTCUSDT,1582329749731000,1582329749857518,1.395,9670,9668.94,0.031 -binance-futures,BTCUSDT,1582329749734000,1582329749857917,1.395,9670,9668.99,0.362 -binance-futures,BTCUSDT,1582329749750000,1582329749873208,1.395,9670,9669.99,0.1 -binance-futures,BTCUSDT,1582329749777000,1582329749900943,1.395,9670,9669.99,0.462 -binance-futures,BTCUSDT,1582329749788000,1582329749911954,1.395,9670,9669.99,0.1 -binance-futures,BTCUSDT,1582329749811000,1582329749936014,1.395,9670,9669.99,0.105 -binance-futures,BTCUSDT,1582329749856000,1582329749979696,1.395,9670,9669.99,0.005 -binance-futures,BTCUSDT,1582329749895000,1582329750017828,1.873,9670,9669.99,0.005 -binance-futures,BTCUSDT,1582329749911000,1582329750036387,1.395,9670,9669.99,0.005 -binance-futures,BTCUSDT,1582329749939000,1582329750060066,1.873,9670,9669.99,0.005 -binance-futures,BTCUSDT,1582329749957000,1582329750078550,1.973,9670,9669.99,0.005 -binance-futures,BTCUSDT,1582329749990000,1582329750113814,1.973,9670,9669.99,1.236 -binance-futures,BTCUSDT,1582329750012000,1582329750136871,1.495,9670,9669.99,1.236 -binance-futures,BTCUSDT,1582329750207000,1582329750331159,1.395,9670,9669.99,1.236 -binance-futures,BTCUSDT,1582329750492000,1582329750613137,1.395,9670,9669.99,1.598 -binance-futures,BTCUSDT,1582329750497000,1582329750622878,1.395,9670,9669.99,1.236 -binance-futures,BTCUSDT,1582329750522000,1582329750645973,1.395,9670,9669.99,0.236 -binance-futures,BTCUSDT,1582329750539000,1582329750667923,1.395,9670,9669.99,0.598 -binance-futures,BTCUSDT,1582329750547000,1582329750675467,5.445,9670,9669.99,0.598 -binance-futures,BTCUSDT,1582329750549000,1582329750675551,9.745,9670,9669.99,0.236 -binance-futures,BTCUSDT,1582329750583000,1582329750706633,5.445,9670,9669.99,0.236 -binance-futures,BTCUSDT,1582329750625000,1582329750746764,5.545,9670,9669.99,0.236 -binance-futures,BTCUSDT,1582329750704000,1582329750827978,5.963,9670,9669.99,0.236 -binance-futures,BTCUSDT,1582329750715000,1582329750837183,1.913,9670,9669.99,0.236 -binance-futures,BTCUSDT,1582329750717000,1582329750841111,1.495,9670,9669.99,0.236 -binance-futures,BTCUSDT,1582329750867000,1582329750997352,1.913,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329750872000,1582329750997432,1.495,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329750895000,1582329751016203,6.745,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329750906000,1582329751029269,1.495,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329750916000,1582329751036586,1.973,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329750962000,1582329751084387,1.495,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329750978000,1582329751102117,1.973,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329751003000,1582329751127279,1.495,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329751016000,1582329751142545,1.973,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329751060000,1582329751183932,1.495,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329751073000,1582329751195870,1.973,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329751123000,1582329751245179,1.495,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329751136000,1582329751259149,1.973,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329751435000,1582329751560699,0.942,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329751481000,1582329751601174,0.464,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329751498000,1582329751621205,0.942,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329751521000,1582329751643696,0.464,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329751543000,1582329751664253,0.942,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329751577000,1582329751696340,0.464,9670,9669.99,0.036 -binance-futures,BTCUSDT,1582329751616000,1582329751743065,0.464,9670,9669.99,0.032 -binance-futures,BTCUSDT,1582329751640000,1582329751761836,2.864,9670,9669.99,0.032 -binance-futures,BTCUSDT,1582329751655000,1582329751774775,0.464,9670,9669.99,0.032 -binance-futures,BTCUSDT,1582329751675000,1582329751795684,0.364,9670,9669.99,0.032 -binance-futures,BTCUSDT,1582329751976000,1582329752097952,0.464,9670,9669.99,0.032 -binance-futures,BTCUSDT,1582329752285000,1582329752408714,0.364,9670,9669.99,0.032 -binance-futures,BTCUSDT,1582329752411000,1582329752533590,0.364,9670,9669.99,2.042 -binance-futures,BTCUSDT,1582329752476000,1582329752598253,0.264,9670,9669.99,2.042 -binance-futures,BTCUSDT,1582329752489000,1582329752610368,0.264,9670,9669.99,0.032 -binance-futures,BTCUSDT,1582329752514000,1582329752635939,0.264,9670,9669.99,2.042 -binance-futures,BTCUSDT,1582329752539000,1582329752665364,0.264,9670,9669.99,2.142 -binance-futures,BTCUSDT,1582329752553000,1582329752678922,0.264,9670,9669.99,2.504 -binance-futures,BTCUSDT,1582329752568000,1582329752693105,0.264,9670,9669.99,2.142 -binance-futures,BTCUSDT,1582329752965000,1582329753084060,0.264,9670,9669.99,2.504 -binance-futures,BTCUSDT,1582329752987000,1582329753104913,0.264,9670,9669.99,2.142 -binance-futures,BTCUSDT,1582329753046000,1582329753169925,0.264,9670,9669.99,0.132 -binance-futures,BTCUSDT,1582329753115000,1582329753236923,0.264,9670,9669.99,2.142 -binance-futures,BTCUSDT,1582329753116000,1582329753237336,0.264,9670,9669.99,2.042 -binance-futures,BTCUSDT,1582329753185000,1582329753316758,0.264,9670,9669.99,2.404 -binance-futures,BTCUSDT,1582329753228000,1582329753369063,0.264,9670,9669.99,2.504 -binance-futures,BTCUSDT,1582329753271000,1582329753395813,0.682,9670,9669.99,2.504 -binance-futures,BTCUSDT,1582329753273000,1582329753397002,0.682,9670,9669.99,0.132 -binance-futures,BTCUSDT,1582329753277000,1582329753398743,0.264,9670,9669.99,0.132 -binance-futures,BTCUSDT,1582329753300000,1582329753420254,0.682,9670,9669.99,0.132 -binance-futures,BTCUSDT,1582329753305000,1582329753427240,0.264,9670,9669.99,0.132 -binance-futures,BTCUSDT,1582329753320000,1582329753439336,0.264,9670,9669.99,2.142 -binance-futures,BTCUSDT,1582329753335000,1582329753455405,0.264,9670,9669.99,0.132 -binance-futures,BTCUSDT,1582329753379000,1582329753502106,0.264,9670,9669.99,0.032 -binance-futures,BTCUSDT,1582329753439000,1582329753563657,0.364,9670,9669.99,0.032 -binance-futures,BTCUSDT,1582329753503000,1582329753626287,0.364,9670,9669.99,2.042 -binance-futures,BTCUSDT,1582329753521000,1582329753644739,0.364,9670,9669.99,0.032 -binance-futures,BTCUSDT,1582329753556000,1582329753676800,0.264,9670,9669.99,0.032 -binance-futures,BTCUSDT,1582329753570000,1582329753690556,0.264,9670,9669.99,2.042 -binance-futures,BTCUSDT,1582329753592000,1582329753711628,0.264,9670,9669.99,0.032 -binance-futures,BTCUSDT,1582329753621000,1582329753744160,0.264,9670,9669.99,2.042 -binance-futures,BTCUSDT,1582329753687000,1582329753807050,0.364,9670,9669.99,2.042 -binance-futures,BTCUSDT,1582329753693000,1582329753813726,0.364,9670,9669.99,0.032 -binance-futures,BTCUSDT,1582329753743000,1582329753865072,0.364,9670,9669.99,2.042 -binance-futures,BTCUSDT,1582329753759000,1582329753879112,0.364,9670,9669.99,2.142 -binance-futures,BTCUSDT,1582329753767000,1582329753896816,0.264,9670,9669.99,2.142 -binance-futures,BTCUSDT,1582329753778000,1582329753904559,0.264,9670,9669.99,2.164 -binance-futures,BTCUSDT,1582329754023000,1582329754144435,0.264,9670,9669.99,2.526 -binance-futures,BTCUSDT,1582329754039000,1582329754160032,0.264,9670,9669.99,2.164 -binance-futures,BTCUSDT,1582329754053000,1582329754173404,0.264,9670,9669.99,2.834 -binance-futures,BTCUSDT,1582329754058000,1582329754179189,0.264,9670,9669.99,3.504 -binance-futures,BTCUSDT,1582329754069000,1582329754193073,0.264,9670,9669.99,4.174 -binance-futures,BTCUSDT,1582329754079000,1582329754204690,0.264,9670,9669.99,4.214 -binance-futures,BTCUSDT,1582329754146000,1582329754267914,0.264,9670,9669.99,4.576 -binance-futures,BTCUSDT,1582329754153000,1582329754276662,0.264,9670,9669.99,4.214 -binance-futures,BTCUSDT,1582329754526000,1582329754645053,0.264,9670,9669.99,4.192 -binance-futures,BTCUSDT,1582329754749000,1582329754869033,0.264,9670,9669.99,6.192 -binance-futures,BTCUSDT,1582329754753000,1582329754872851,0.264,9670,9669.99,7.192 -binance-futures,BTCUSDT,1582329754777000,1582329754906242,0.023,9672.39,9670,1.736 -binance-futures,BTCUSDT,1582329754786000,1582329754909391,0.023,9672.39,9670.09,0.362 -binance-futures,BTCUSDT,1582329754804000,1582329754927020,0.023,9672.39,9670.09,5.462 -binance-futures,BTCUSDT,1582329754821000,1582329754944064,0.023,9672.39,9670.1,1 -binance-futures,BTCUSDT,1582329754826000,1582329754949088,0.023,9672.39,9670.1,3 -binance-futures,BTCUSDT,1582329754828000,1582329754949808,0.023,9672.39,9670.24,0.362 -binance-futures,BTCUSDT,1582329754850000,1582329754973344,0.023,9672.39,9670.24,8.662 -binance-futures,BTCUSDT,1582329754856000,1582329754977482,0.1,9671.4,9670.24,8.662 -binance-futures,BTCUSDT,1582329754869000,1582329754989630,0.1,9671.4,9670.25,1.67 -binance-futures,BTCUSDT,1582329754871000,1582329754994192,0.1,9671.4,9670.25,3.67 -binance-futures,BTCUSDT,1582329754875000,1582329754996457,0.1,9671.4,9670.6,0.022 -binance-futures,BTCUSDT,1582329754885000,1582329755007508,0.023,9672.39,9670.6,0.022 -binance-futures,BTCUSDT,1582329754897000,1582329755018967,0.023,9672.39,9670.64,4 -binance-futures,BTCUSDT,1582329754916000,1582329755036112,0.023,9672.39,9670.64,12.2 -binance-futures,BTCUSDT,1582329754918000,1582329755041905,0.023,9672.39,9670.65,1 -binance-futures,BTCUSDT,1582329754922000,1582329755043986,0.023,9672.39,9670.75,0.362 -binance-futures,BTCUSDT,1582329754943000,1582329755065636,0.023,9672.39,9670.75,9.912 -binance-futures,BTCUSDT,1582329754959000,1582329755079449,0.023,9672.39,9670.76,1 -binance-futures,BTCUSDT,1582329754968000,1582329755089386,0.023,9672.39,9670.86,0.362 -binance-futures,BTCUSDT,1582329754978000,1582329755101685,2.444,9672.04,9670.86,0.362 -binance-futures,BTCUSDT,1582329754984000,1582329755108296,2.444,9672.04,9670.86,0.361 -binance-futures,BTCUSDT,1582329754986000,1582329755110486,2.444,9672.04,9670.86,7.211 -binance-futures,BTCUSDT,1582329754996000,1582329755123287,0.023,9672.39,9670.86,7.211 -binance-futures,BTCUSDT,1582329755000000,1582329755123765,0.023,9672.39,9670.87,0.67 -binance-futures,BTCUSDT,1582329755002000,1582329755123849,0.023,9672.39,9670.87,1.67 -binance-futures,BTCUSDT,1582329755003000,1582329755124276,2.35,9672.04,9670.87,1.67 -binance-futures,BTCUSDT,1582329755012000,1582329755132918,2.35,9672.04,9670.92,0.362 -binance-futures,BTCUSDT,1582329755018000,1582329755138321,0.023,9672.39,9670.92,0.362 -binance-futures,BTCUSDT,1582329755022000,1582329755145653,2.9,9672.04,9670.92,0.362 -binance-futures,BTCUSDT,1582329755032000,1582329755153131,2.9,9672.04,9670.92,2.712 -binance-futures,BTCUSDT,1582329755034000,1582329755157255,2.9,9672.04,9670.96,0.031 -binance-futures,BTCUSDT,1582329755055000,1582329755174522,2.9,9672.04,9670.96,4.081 -binance-futures,BTCUSDT,1582329755057000,1582329755177859,2.9,9672.04,9670.96,4.05 -binance-futures,BTCUSDT,1582329755057000,1582329755177962,0.418,9672.33,9670.96,4.05 -binance-futures,BTCUSDT,1582329755059000,1582329755180333,2.137,9672.65,9670.96,4.05 -binance-futures,BTCUSDT,1582329755064000,1582329755186739,2.137,9672.65,9670.97,0.361 -binance-futures,BTCUSDT,1582329755068000,1582329755188974,2.137,9672.65,9670.97,1.361 -binance-futures,BTCUSDT,1582329755083000,1582329755205456,2.137,9672.65,9671,0.031 -binance-futures,BTCUSDT,1582329755093000,1582329755214096,2.137,9672.65,9671.05,0.361 -binance-futures,BTCUSDT,1582329755113000,1582329755233947,2.137,9672.65,9671.05,5.761 -binance-futures,BTCUSDT,1582329755123000,1582329755248769,2.137,9672.65,9671.06,1 -binance-futures,BTCUSDT,1582329755136000,1582329755253825,2.137,9672.65,9671.08,0.031 -binance-futures,BTCUSDT,1582329755138000,1582329755259358,2.137,9672.65,9671.14,0.361 -binance-futures,BTCUSDT,1582329755156000,1582329755278137,2.137,9672.65,9671.14,4.611 -binance-futures,BTCUSDT,1582329755166000,1582329755286515,2.137,9672.65,9671.15,1 -binance-futures,BTCUSDT,1582329755183000,1582329755304594,2.137,9672.65,9671.15,1.67 -binance-futures,BTCUSDT,1582329755183000,1582329755304602,2.137,9672.65,9671.29,0.361 -binance-futures,BTCUSDT,1582329755204000,1582329755347709,2.137,9672.65,9671.29,3.811 -binance-futures,BTCUSDT,1582329755232000,1582329755355704,2.137,9672.65,9671.3,1 -binance-futures,BTCUSDT,1582329755239000,1582329755361104,2.137,9672.65,9671.3,1.67 -binance-futures,BTCUSDT,1582329755252000,1582329755377700,2.137,9672.65,9671.33,0.031 -binance-futures,BTCUSDT,1582329755254000,1582329755377825,2.137,9672.65,9671.35,0.361 -binance-futures,BTCUSDT,1582329755281000,1582329755403030,2.137,9672.65,9671.35,2.611 -binance-futures,BTCUSDT,1582329755295000,1582329755417704,2.137,9672.65,9671.35,0.361 -binance-futures,BTCUSDT,1582329755304000,1582329755428061,2.137,9672.65,9671.39,0.031 -binance-futures,BTCUSDT,1582329755310000,1582329755430386,2.137,9672.65,9671.44,0.361 -binance-futures,BTCUSDT,1582329755341000,1582329755462139,2.137,9672.65,9671.45,1 -binance-futures,BTCUSDT,1582329755365000,1582329755484667,2.137,9672.65,9671.5,0.361 -binance-futures,BTCUSDT,1582329755399000,1582329755520152,2.137,9672.65,9671.51,0.71 -binance-futures,BTCUSDT,1582329755401000,1582329755524104,2.137,9672.65,9671.51,1.38 -binance-futures,BTCUSDT,1582329755417000,1582329755539609,2.137,9672.65,9671.51,2.05 -binance-futures,BTCUSDT,1582329755421000,1582329755543220,2.137,9672.65,9671.55,0.031 -binance-futures,BTCUSDT,1582329755423000,1582329755543730,2.137,9672.65,9671.55,0.392 -binance-futures,BTCUSDT,1582329755452000,1582329755572942,2.137,9672.65,9671.55,1.062 -binance-futures,BTCUSDT,1582329755460000,1582329755581519,2.137,9672.65,9671.55,1.732 -binance-futures,BTCUSDT,1582329755470000,1582329755591151,2.137,9672.65,9671.55,2.402 -binance-futures,BTCUSDT,1582329755472000,1582329755593708,2.137,9672.65,9671.56,1 -binance-futures,BTCUSDT,1582329755477000,1582329755599151,2.137,9672.65,9671.59,0.031 -binance-futures,BTCUSDT,1582329755509000,1582329755628738,2.137,9672.65,9671.6,0.67 -binance-futures,BTCUSDT,1582329755512000,1582329755632224,2.137,9672.65,9671.6,1.34 -binance-futures,BTCUSDT,1582329755514000,1582329755635445,2.137,9672.65,9671.6,1.38 -binance-futures,BTCUSDT,1582329755516000,1582329755638625,2.137,9672.65,9671.6,2.38 -binance-futures,BTCUSDT,1582329755518000,1582329755639522,2.137,9672.65,9671.6,2.401 -binance-futures,BTCUSDT,1582329755523000,1582329755644830,2.137,9672.65,9671.6,3.071 -binance-futures,BTCUSDT,1582329755528000,1582329755647424,2.137,9672.65,9671.6,2.071 -binance-futures,BTCUSDT,1582329755533000,1582329755654775,2.137,9672.65,9671.61,0.361 -binance-futures,BTCUSDT,1582329755533000,1582329755656156,2.137,9672.65,9671.64,0.031 -binance-futures,BTCUSDT,1582329755557000,1582329755678974,1.296,9672.93,9671.64,0.031 -binance-futures,BTCUSDT,1582329755576000,1582329755699167,1.296,9672.93,9671.64,1.031 -binance-futures,BTCUSDT,1582329755580000,1582329755701099,1.296,9672.93,9671.65,0.031 -binance-futures,BTCUSDT,1582329755583000,1582329755707167,0.418,9672.91,9671.65,0.031 -binance-futures,BTCUSDT,1582329755591000,1582329755715803,0.418,9672.91,9671.65,0.701 -binance-futures,BTCUSDT,1582329755602000,1582329755723770,0.418,9672.91,9671.66,0.031 -binance-futures,BTCUSDT,1582329755604000,1582329755725264,1.296,9672.93,9671.66,0.031 -binance-futures,BTCUSDT,1582329755606000,1582329755727907,4.5,9672.91,9671.68,0.031 -binance-futures,BTCUSDT,1582329755639000,1582329755762385,4.5,9672.91,9671.71,0.361 -binance-futures,BTCUSDT,1582329755665000,1582329755786087,4.5,9672.91,9671.71,1.031 -binance-futures,BTCUSDT,1582329755665000,1582329755789684,4.5,9672.91,9671.74,0.031 -binance-futures,BTCUSDT,1582329755667000,1582329755791178,4.5,9672.91,9671.75,0.031 -binance-futures,BTCUSDT,1582329755717000,1582329755837957,4.5,9672.91,9671.75,0.701 -binance-futures,BTCUSDT,1582329755727000,1582329755849273,0.418,9672.9,9671.75,0.701 -binance-futures,BTCUSDT,1582329755741000,1582329755864804,0.418,9672.9,9671.79,0.031 -binance-futures,BTCUSDT,1582329755747000,1582329755872398,4.818,9672.9,9671.79,0.031 -binance-futures,BTCUSDT,1582329755769000,1582329755890258,4.4,9672.9,9671.79,0.031 -binance-futures,BTCUSDT,1582329755773000,1582329755893517,4.4,9672.9,9671.8,0.021 -binance-futures,BTCUSDT,1582329755779000,1582329755902652,0.418,9672.89,9671.8,0.021 -binance-futures,BTCUSDT,1582329755797000,1582329755920352,0.418,9672.89,9671.84,0.031 -binance-futures,BTCUSDT,1582329755799000,1582329755921889,4.4,9672.9,9671.84,0.031 -binance-futures,BTCUSDT,1582329755803000,1582329755925971,5.9,9672.89,9671.84,0.031 -binance-futures,BTCUSDT,1582329755878000,1582329756001365,0.031,9672.85,9671.8,0.061 -binance-futures,BTCUSDT,1582329755878000,1582329756001389,0.031,9672.85,9671.8,0.021 -binance-futures,BTCUSDT,1582329755887000,1582329756004482,0.031,9672.85,9671.8,2.031 -binance-futures,BTCUSDT,1582329755897000,1582329756016290,7.531,9672.85,9671.8,2.031 -binance-futures,BTCUSDT,1582329755910000,1582329756031025,7.531,9672.85,9671.8,2.701 -binance-futures,BTCUSDT,1582329755918000,1582329756042728,7.531,9672.85,9671.8,3.371 -binance-futures,BTCUSDT,1582329755924000,1582329756045590,7.531,9672.85,9671.8,4.041 -binance-futures,BTCUSDT,1582329755926000,1582329756045824,7.531,9672.85,9671.8,4.081 -binance-futures,BTCUSDT,1582329755932000,1582329756054217,7.531,9672.85,9671.8,3.411 -binance-futures,BTCUSDT,1582329755936000,1582329756056688,0.031,9672.81,9671.8,3.411 -binance-futures,BTCUSDT,1582329755953000,1582329756073897,6.831,9672.81,9671.8,3.411 -binance-futures,BTCUSDT,1582329755958000,1582329756078438,6.831,9672.81,9671.8,2.741 -binance-futures,BTCUSDT,1582329755973000,1582329756091709,6.831,9672.81,9671.8,2.071 -binance-futures,BTCUSDT,1582329755978000,1582329756099996,6.831,9672.81,9671.8,2.031 -binance-futures,BTCUSDT,1582329756002000,1582329756121636,0.031,9672.77,9671.8,2.031 -binance-futures,BTCUSDT,1582329756009000,1582329756132538,0.418,9672.63,9671.8,2.031 -binance-futures,BTCUSDT,1582329756019000,1582329756140318,0.418,9672.63,9671.8,2.014 -binance-futures,BTCUSDT,1582329756021000,1582329756143216,0.418,9672.63,9671.81,0.017 -binance-futures,BTCUSDT,1582329756031000,1582329756153662,5.618,9672.63,9671.81,0.017 -binance-futures,BTCUSDT,1582329756056000,1582329756175221,0.031,9672.59,9671.81,0.017 -binance-futures,BTCUSDT,1582329756075000,1582329756194697,0.418,9672.43,9671.81,0.017 -binance-futures,BTCUSDT,1582329756092000,1582329756212191,5.268,9672.43,9671.81,0.017 -binance-futures,BTCUSDT,1582329756116000,1582329756238878,0.418,9672.32,9671.81,0.017 -binance-futures,BTCUSDT,1582329756138000,1582329756259755,3.168,9672.32,9671.81,0.017 -binance-futures,BTCUSDT,1582329756151000,1582329756271472,0.031,9672.39,9671.81,0.017 -binance-futures,BTCUSDT,1582329756160000,1582329756283683,1.296,9672.93,9671.81,0.017 -binance-futures,BTCUSDT,1582329756162000,1582329756283710,0.418,9672.31,9671.81,0.017 -binance-futures,BTCUSDT,1582329756173000,1582329756295078,1.296,9672.93,9671.81,0.017 -binance-futures,BTCUSDT,1582329756177000,1582329756297891,0.418,9672.88,9671.81,0.017 -binance-futures,BTCUSDT,1582329756186000,1582329756304903,0.031,9672.27,9671.81,0.017 -binance-futures,BTCUSDT,1582329756211000,1582329756337746,0.031,9672.27,9671.82,1.38 -binance-futures,BTCUSDT,1582329756225000,1582329756344031,0.031,9672.27,9671.82,2.05 -binance-futures,BTCUSDT,1582329756240000,1582329756363990,0.031,9672.24,9671.82,2.05 -binance-futures,BTCUSDT,1582329756253000,1582329756399613,0.031,9672.24,9671.82,2.01 -binance-futures,BTCUSDT,1582329756255000,1582329756399644,0.031,9672.24,9671.82,1.34 -binance-futures,BTCUSDT,1582329756257000,1582329756400063,0.031,9672.24,9671.82,0.67 -binance-futures,BTCUSDT,1582329756261000,1582329756401356,0.031,9672.24,9671.81,0.017 -binance-futures,BTCUSDT,1582329756267000,1582329756419415,3.15,9672.88,9671.81,0.017 -binance-futures,BTCUSDT,1582329756269000,1582329756419449,0.418,9672.72,9671.81,0.017 -binance-futures,BTCUSDT,1582329756285000,1582329756421318,0.418,9672.72,9672.23,2.01 -binance-futures,BTCUSDT,1582329756294000,1582329756421476,0.418,9672.41,9672.23,2.01 -binance-futures,BTCUSDT,1582329756300000,1582329756423753,0.418,9672.29,9672.23,2.01 -binance-futures,BTCUSDT,1582329756314000,1582329756455689,0.418,9672.29,9671.39,0.603 -binance-futures,BTCUSDT,1582329756322000,1582329756456310,3.7,9672.72,9671.39,0.603 -binance-futures,BTCUSDT,1582329756324000,1582329756456805,0.031,9672.37,9671.39,0.603 -binance-futures,BTCUSDT,1582329756335000,1582329756457230,0.031,9672.37,9671.83,2.01 -binance-futures,BTCUSDT,1582329756356000,1582329756477836,6.831,9672.37,9671.83,2.01 -binance-futures,BTCUSDT,1582329756372000,1582329756493614,6.8,9672.37,9671.83,2.01 -binance-futures,BTCUSDT,1582329756372000,1582329756493637,0.031,9672.25,9671.83,2.01 -binance-futures,BTCUSDT,1582329756378000,1582329756497554,0.031,9672.25,9672.23,2.01 -binance-futures,BTCUSDT,1582329756392000,1582329756512203,5.381,9672.25,9672.23,2.01 -binance-futures,BTCUSDT,1582329756397000,1582329756514344,5.35,9672.25,9672.23,2.01 -binance-futures,BTCUSDT,1582329756407000,1582329756527313,0.418,9672.91,9672.23,2.01 -binance-futures,BTCUSDT,1582329756413000,1582329756531504,1.296,9672.93,9672.23,2.01 -binance-futures,BTCUSDT,1582329756415000,1582329756534475,0.418,9672.7,9672.23,2.01 -binance-futures,BTCUSDT,1582329756417000,1582329756538808,0.031,9672.22,9671.83,2.01 -binance-futures,BTCUSDT,1582329756423000,1582329756544345,0.031,9672.21,9671.83,2.01 -binance-futures,BTCUSDT,1582329756447000,1582329756566544,0.031,9672.21,9671.39,0.603 -binance-futures,BTCUSDT,1582329756453000,1582329756575706,0.031,9672.21,9671.45,0.361 -binance-futures,BTCUSDT,1582329756467000,1582329756585511,0.031,9672.21,9671.39,0.603 -binance-futures,BTCUSDT,1582329756469000,1582329756588625,0.031,9672.19,9671.39,0.603 -binance-futures,BTCUSDT,1582329756475000,1582329756594456,0.031,9672.19,9671.66,0.361 -binance-futures,BTCUSDT,1582329756486000,1582329756605670,4.431,9672.19,9671.66,0.361 -binance-futures,BTCUSDT,1582329756493000,1582329756613034,4.431,9672.19,9671.39,0.603 -binance-futures,BTCUSDT,1582329756495000,1582329756615818,4.431,9672.19,9671.83,2.01 -binance-futures,BTCUSDT,1582329756497000,1582329756615831,0.418,9672.15,9671.83,2.01 -binance-futures,BTCUSDT,1582329756509000,1582329756627869,0.449,9672.15,9671.83,2.01 -binance-futures,BTCUSDT,1582329756514000,1582329756633703,5.799,9672.15,9671.39,0.603 -binance-futures,BTCUSDT,1582329756530000,1582329756651054,0.449,9672.15,9671.39,0.603 -binance-futures,BTCUSDT,1582329756532000,1582329756651084,0.449,9672.15,9670.9,1.327 -binance-futures,BTCUSDT,1582329756558000,1582329756677159,0.449,9672.15,9670.9,1.688 -binance-futures,BTCUSDT,1582329756565000,1582329756685094,0.031,9672.15,9670.9,1.688 -binance-futures,BTCUSDT,1582329756579000,1582329756711976,0.031,9672.11,9670.9,1.688 -binance-futures,BTCUSDT,1582329756609000,1582329756728864,4.381,9672.11,9670.9,1.688 -binance-futures,BTCUSDT,1582329756615000,1582329756734747,4.35,9672.11,9670.9,1.688 -binance-futures,BTCUSDT,1582329756625000,1582329756743881,4.35,9672.11,9670.9,1.327 -binance-futures,BTCUSDT,1582329756635000,1582329756753707,0.418,9672.1,9670.9,1.327 -binance-futures,BTCUSDT,1582329756637000,1582329756768387,0.031,9672.07,9670.9,1.327 -binance-futures,BTCUSDT,1582329756657000,1582329756781054,0.031,9672.06,9670.9,1.327 -binance-futures,BTCUSDT,1582329756680000,1582329756802126,5.581,9672.06,9670.9,1.327 -binance-futures,BTCUSDT,1582329756691000,1582329756810528,0.418,9672.01,9670.9,1.327 -binance-futures,BTCUSDT,1582329756709000,1582329756826902,7.818,9672.01,9670.9,1.327 -binance-futures,BTCUSDT,1582329756775000,1582329756895425,7.818,9672.01,9670.91,0.033 -binance-futures,BTCUSDT,1582329756777000,1582329756898475,7.818,9672.01,9670.91,0.037 -binance-futures,BTCUSDT,1582329756798000,1582329756917084,0.031,9671.97,9670.91,0.037 -binance-futures,BTCUSDT,1582329756816000,1582329756937214,7.431,9671.97,9670.91,0.037 -binance-futures,BTCUSDT,1582329756843000,1582329756963377,0.418,9671.93,9670.91,0.037 -binance-futures,BTCUSDT,1582329756860000,1582329756981787,0.1,9671.9,9670.91,0.037 -binance-futures,BTCUSDT,1582329756868000,1582329756990249,0.031,9671.89,9670.91,0.037 -binance-futures,BTCUSDT,1582329756888000,1582329757008776,9.181,9671.89,9670.91,0.037 -binance-futures,BTCUSDT,1582329756911000,1582329757030546,0.031,9671.87,9670.91,0.037 -binance-futures,BTCUSDT,1582329756912000,1582329757036618,0.031,9671.85,9670.91,0.037 -binance-futures,BTCUSDT,1582329756933000,1582329757054336,9.381,9671.85,9670.91,0.037 -binance-futures,BTCUSDT,1582329756957000,1582329757080745,0.031,9671.81,9670.91,0.037 -binance-futures,BTCUSDT,1582329756981000,1582329757101499,8.581,9671.81,9670.91,0.037 -binance-futures,BTCUSDT,1582329757015000,1582329757138962,0.418,9671.75,9670.91,0.037 -binance-futures,BTCUSDT,1582329757036000,1582329757156718,8.068,9671.75,9670.91,0.037 -binance-futures,BTCUSDT,1582329757041000,1582329757161380,8.068,9671.75,9670.91,0.033 -binance-futures,BTCUSDT,1582329757064000,1582329757186263,0.418,9671.72,9670.91,0.033 -binance-futures,BTCUSDT,1582329757085000,1582329757205118,7.318,9671.72,9670.91,0.033 -binance-futures,BTCUSDT,1582329757088000,1582329757210385,0.031,9671.69,9670.91,0.033 -binance-futures,BTCUSDT,1582329757090000,1582329757211062,0.031,9671.68,9670.91,0.033 -binance-futures,BTCUSDT,1582329757109000,1582329757227355,8.181,9671.68,9670.91,0.033 -binance-futures,BTCUSDT,1582329757132000,1582329757253780,0.418,9671.65,9670.91,0.033 -binance-futures,BTCUSDT,1582329757134000,1582329757256205,0.031,9671.64,9670.91,0.033 -binance-futures,BTCUSDT,1582329757156000,1582329757276718,8.531,9671.64,9670.91,0.033 -binance-futures,BTCUSDT,1582329757164000,1582329757283384,8.949,9671.64,9670.91,0.033 -binance-futures,BTCUSDT,1582329757183000,1582329757301472,8.531,9671.64,9670.91,0.033 -binance-futures,BTCUSDT,1582329757200000,1582329757319431,0.418,9671.62,9670.91,0.033 -binance-futures,BTCUSDT,1582329757204000,1582329757328922,0.031,9671.6,9670.91,0.033 -binance-futures,BTCUSDT,1582329757227000,1582329757346554,8.681,9671.6,9670.91,0.033 -binance-futures,BTCUSDT,1582329757247000,1582329757368938,0.031,9671.57,9670.91,0.033 -binance-futures,BTCUSDT,1582329757267000,1582329757411100,7.731,9671.57,9670.91,0.033 -binance-futures,BTCUSDT,1582329757272000,1582329757422707,0.031,9671.54,9670.91,0.033 -binance-futures,BTCUSDT,1582329757319000,1582329757441873,0.031,9671.54,9670.9,1.327 -binance-futures,BTCUSDT,1582329757319000,1582329757442423,6.881,9671.54,9670.9,1.327 -binance-futures,BTCUSDT,1582329757327000,1582329757448579,0.031,9671.51,9670.9,1.327 -binance-futures,BTCUSDT,1582329757348000,1582329757474455,5.281,9671.51,9670.9,1.327 -binance-futures,BTCUSDT,1582329757365000,1582329757485498,0.031,9671.51,9670.9,1.327 -binance-futures,BTCUSDT,1582329757376000,1582329757498200,0.031,9671.47,9670.9,1.327 -binance-futures,BTCUSDT,1582329757397000,1582329757519846,3.381,9671.47,9670.9,1.327 -binance-futures,BTCUSDT,1582329757401000,1582329757523577,3.35,9671.47,9670.9,1.327 -binance-futures,BTCUSDT,1582329757410000,1582329757531794,0.031,9671.49,9670.9,1.327 -binance-futures,BTCUSDT,1582329757426000,1582329757550344,0.031,9671.43,9670.9,1.327 -binance-futures,BTCUSDT,1582329757452000,1582329757572217,0.031,9671.49,9670.9,1.327 -binance-futures,BTCUSDT,1582329757470000,1582329757590693,0.031,9671.49,9670.91,0.361 -binance-futures,BTCUSDT,1582329757613000,1582329757734758,0.031,9671.49,9670.9,1.327 -binance-futures,BTCUSDT,1582329757657000,1582329757780792,0.031,9671.49,9670.91,0.361 -binance-futures,BTCUSDT,1582329757669000,1582329757789639,0.031,9671.49,9670.9,1.327 -binance-futures,BTCUSDT,1582329757673000,1582329757798893,0.03,9671.49,9670.9,1.327 -binance-futures,BTCUSDT,1582329757689000,1582329757809631,0.03,9671.49,9670.91,0.361 -binance-futures,BTCUSDT,1582329757821000,1582329757941347,0.03,9671.49,9670.9,1.327 -binance-futures,BTCUSDT,1582329757823000,1582329757946404,0.03,9671.49,9671,0.361 -binance-futures,BTCUSDT,1582329757848000,1582329757969246,0.03,9671.49,9670.9,1.327 -binance-futures,BTCUSDT,1582329757876000,1582329757995004,0.03,9671.49,9671.08,0.361 -binance-futures,BTCUSDT,1582329757900000,1582329758019097,0.03,9671.49,9670.9,1.327 -binance-futures,BTCUSDT,1582329757923000,1582329758044961,0.03,9671.49,9670.98,0.361 -binance-futures,BTCUSDT,1582329757948000,1582329758070848,0.03,9671.49,9670.91,2.05 -binance-futures,BTCUSDT,1582329757951000,1582329758073467,0.03,9671.49,9670.91,1.38 -binance-futures,BTCUSDT,1582329757952000,1582329758073845,0.03,9671.49,9671,0.361 -binance-futures,BTCUSDT,1582329757990000,1582329758112291,0.03,9671.49,9671.01,0.67 -binance-futures,BTCUSDT,1582329758003000,1582329758123001,0.03,9671.49,9671.01,1.34 -binance-futures,BTCUSDT,1582329758015000,1582329758136398,2.17,9672.09,9671.01,1.34 -binance-futures,BTCUSDT,1582329758019000,1582329758137980,2.17,9672.09,9671.05,0.361 -binance-futures,BTCUSDT,1582329758033000,1582329758155009,1.57,9672.09,9671.05,0.361 -binance-futures,BTCUSDT,1582329758037000,1582329758160881,2,9672.91,9671.05,0.361 -binance-futures,BTCUSDT,1582329758039000,1582329758160913,1.296,9672.93,9671.05,0.361 -binance-futures,BTCUSDT,1582329758041000,1582329758164360,1.296,9672.93,9671.05,2.661 -binance-futures,BTCUSDT,1582329758041000,1582329758164528,1.296,9672.93,9671.09,0.031 -binance-futures,BTCUSDT,1582329758056000,1582329758184755,1.296,9672.93,9671.48,0.1 -binance-futures,BTCUSDT,1582329758088000,1582329758209265,1.296,9672.93,9671.5,0.361 -binance-futures,BTCUSDT,1582329758110000,1582329758229746,0.418,9672.92,9671.5,0.361 -binance-futures,BTCUSDT,1582329758112000,1582329758232452,0.418,9672.92,9671.49,0.017 -binance-futures,BTCUSDT,1582329758116000,1582329758235777,0.031,9672.89,9671.49,0.017 -binance-futures,BTCUSDT,1582329758134000,1582329758256840,0.031,9672.89,9671.49,0.687 -binance-futures,BTCUSDT,1582329758136000,1582329758259442,5.981,9672.89,9671.49,0.687 -binance-futures,BTCUSDT,1582329758153000,1582329758275251,6.399,9672.89,9671.49,0.687 -binance-futures,BTCUSDT,1582329758162000,1582329758284344,0.031,9672.85,9671.49,0.687 -binance-futures,BTCUSDT,1582329758167000,1582329758290751,0.418,9672.84,9671.49,0.687 -binance-futures,BTCUSDT,1582329758169000,1582329758291197,0.418,9672.84,9671.5,0.67 -binance-futures,BTCUSDT,1582329758171000,1582329758293700,0.418,9672.84,9671.5,1.34 -binance-futures,BTCUSDT,1582329758189000,1582329758309725,7.868,9672.84,9671.5,1.34 -binance-futures,BTCUSDT,1582329758213000,1582329758350402,7.868,9672.84,9671.5,0.67 -binance-futures,BTCUSDT,1582329758213000,1582329758351778,0.418,9672.8,9671.49,0.017 -binance-futures,BTCUSDT,1582329758215000,1582329758351838,0.449,9672.8,9671.49,0.017 -binance-futures,BTCUSDT,1582329758246000,1582329758366924,7.049,9672.8,9671.49,0.017 -binance-futures,BTCUSDT,1582329758257000,1582329758378685,6.631,9672.8,9671.49,0.017 -binance-futures,BTCUSDT,1582329758259000,1582329758381791,0.418,9672.76,9671.49,0.017 -binance-futures,BTCUSDT,1582329758280000,1582329758416589,7.218,9672.76,9671.49,0.017 -binance-futures,BTCUSDT,1582329758280000,1582329758416616,7.012,9672.76,9671.49,0.017 -binance-futures,BTCUSDT,1582329758284000,1582329758417091,7.012,9672.76,9671.5,0.67 -binance-futures,BTCUSDT,1582329758293000,1582329758420781,7.012,9672.76,9671.5,1.34 -binance-futures,BTCUSDT,1582329758297000,1582329758420835,7.012,9672.76,9671.5,2.01 -binance-futures,BTCUSDT,1582329758299000,1582329758421858,7.012,9672.76,9671.5,2.05 -binance-futures,BTCUSDT,1582329758315000,1582329758440420,0.212,9672.76,9671.5,2.05 -binance-futures,BTCUSDT,1582329758326000,1582329758451914,0.212,9672.76,9671.5,2.01 -binance-futures,BTCUSDT,1582329758330000,1582329758456520,0.012,9672.74,9671.5,1.34 -binance-futures,BTCUSDT,1582329758332000,1582329758456607,0.369,9672.72,9671.5,0.67 -binance-futures,BTCUSDT,1582329758345000,1582329758468298,0.369,9672.72,9671.48,2.01 -binance-futures,BTCUSDT,1582329758345000,1582329758470500,0.369,9672.72,9671.51,0.017 -binance-futures,BTCUSDT,1582329758345000,1582329758470548,0.369,9672.72,9671.51,0.02 -binance-futures,BTCUSDT,1582329758351000,1582329758475778,0.031,9672.72,9671.51,0.461 -binance-futures,BTCUSDT,1582329758353000,1582329758476431,0.031,9672.72,9671.51,1.171 -binance-futures,BTCUSDT,1582329758360000,1582329758485734,1.296,9672.93,9671.51,1.171 -binance-futures,BTCUSDT,1582329758365000,1582329758490349,1.634,9672.93,9671.51,1.171 -binance-futures,BTCUSDT,1582329758373000,1582329758497416,1.634,9672.93,9671.51,1.841 -binance-futures,BTCUSDT,1582329758377000,1582329758499967,0.031,9672.68,9671.51,1.841 -binance-futures,BTCUSDT,1582329758379000,1582329758504632,0.031,9672.68,9671.53,0.441 -binance-futures,BTCUSDT,1582329758399000,1582329758521899,1.296,9672.93,9671.55,0.031 -binance-futures,BTCUSDT,1582329758433000,1582329758558420,1.296,9672.93,9671.95,0.432 -binance-futures,BTCUSDT,1582329758490000,1582329758611061,1.296,9672.93,9671.7,0.109 -binance-futures,BTCUSDT,1582329758494000,1582329758618176,1.296,9672.93,9671.87,0.438 -binance-futures,BTCUSDT,1582329758592000,1582329758713042,1.296,9672.93,9671.88,0.02 -binance-futures,BTCUSDT,1582329758595000,1582329758718509,1.296,9672.93,9671.88,2.03 -binance-futures,BTCUSDT,1582329758610000,1582329758730590,1.296,9672.93,9671.88,0.02 -binance-futures,BTCUSDT,1582329758617000,1582329758741331,1.296,9672.93,9671.91,0.031 -binance-futures,BTCUSDT,1582329758617000,1582329758741344,1.296,9672.93,9671.92,0.031 -binance-futures,BTCUSDT,1582329758619000,1582329758741794,1.296,9672.93,9672.01,0.439 -binance-futures,BTCUSDT,1582329758693000,1582329758813611,1.296,9672.93,9671.88,0.02 -binance-futures,BTCUSDT,1582329758719000,1582329758840879,1.296,9672.93,9671.88,0.06 -binance-futures,BTCUSDT,1582329758727000,1582329758847001,1.296,9672.93,9671.88,0.73 -binance-futures,BTCUSDT,1582329758729000,1582329758849405,1.296,9672.93,9671.88,1.4 -binance-futures,BTCUSDT,1582329758731000,1582329758852431,1.296,9672.93,9671.88,2.07 -binance-futures,BTCUSDT,1582329758738000,1582329758859240,0.031,9672.89,9671.88,2.07 -binance-futures,BTCUSDT,1582329758753000,1582329758875122,0.031,9672.89,9671.98,0.437 -binance-futures,BTCUSDT,1582329758757000,1582329758877508,2.931,9672.89,9671.98,0.437 -binance-futures,BTCUSDT,1582329758763000,1582329758882660,2.9,9672.89,9671.98,0.437 -binance-futures,BTCUSDT,1582329758783000,1582329758905818,2.9,9672.89,9671.99,0.04 -binance-futures,BTCUSDT,1582329758801000,1582329758923752,2.9,9672.89,9671.99,1.38 -binance-futures,BTCUSDT,1582329758809000,1582329758931105,2.9,9672.89,9671.99,2.05 -binance-futures,BTCUSDT,1582329758826000,1582329758950338,2.9,9672.89,9672.03,0.031 -binance-futures,BTCUSDT,1582329758848000,1582329758969705,1.296,9672.93,9672.03,0.031 -binance-futures,BTCUSDT,1582329758855000,1582329758977553,1.296,9672.93,9672.04,0.441 -binance-futures,BTCUSDT,1582329758863000,1582329758983933,1.296,9672.93,9672.04,0.461 -binance-futures,BTCUSDT,1582329758872000,1582329758992714,1.296,9672.93,9672.04,0.492 -binance-futures,BTCUSDT,1582329758875000,1582329758997925,1.296,9672.93,9672.04,1.162 -binance-futures,BTCUSDT,1582329758881000,1582329759000697,1.296,9672.93,9672.04,1.832 -binance-futures,BTCUSDT,1582329758882000,1582329759003522,1.296,9672.93,9672.04,1.835 -binance-futures,BTCUSDT,1582329758884000,1582329759006576,1.296,9672.93,9672.04,2.505 -binance-futures,BTCUSDT,1582329758884000,1582329759006892,1.296,9672.93,9672.04,2.545 -binance-futures,BTCUSDT,1582329758887000,1582329759009757,1.296,9672.93,9672.04,2.104 -binance-futures,BTCUSDT,1582329758894000,1582329759014592,1.296,9672.93,9672.07,0.031 -binance-futures,BTCUSDT,1582329758896000,1582329759016644,1.296,9672.93,9672.08,0.031 -binance-futures,BTCUSDT,1582329758929000,1582329759050627,1.296,9672.93,9672.08,2.041 -binance-futures,BTCUSDT,1582329758941000,1582329759063054,1.187,9672.93,9672.08,2.041 -binance-futures,BTCUSDT,1582329758951000,1582329759075197,1.187,9672.93,9672.08,2.081 -binance-futures,BTCUSDT,1582329758954000,1582329759075881,1.187,9672.93,9672.11,0.031 -binance-futures,BTCUSDT,1582329758955000,1582329759076558,1.187,9672.93,9672.12,0.031 -binance-futures,BTCUSDT,1582329759057000,1582329759180801,1.187,9672.93,9672.13,0.031 -binance-futures,BTCUSDT,1582329759117000,1582329759246398,1.187,9672.93,9672.14,0.017 -binance-futures,BTCUSDT,1582329759123000,1582329759246549,0.338,9672.86,9672.14,0.017 -binance-futures,BTCUSDT,1582329759131000,1582329759272892,1.187,9672.93,9672.14,0.017 -binance-futures,BTCUSDT,1582329759147000,1582329759286517,3.1,9672.86,9672.26,0.43 -binance-futures,BTCUSDT,1582329759173000,1582329759296460,1.187,9672.93,9672.26,0.43 -binance-futures,BTCUSDT,1582329759199000,1582329759362518,1.187,9672.93,9672.29,0.031 -binance-futures,BTCUSDT,1582329759237000,1582329759363453,1.187,9672.93,9672.3,0.031 -binance-futures,BTCUSDT,1582329759260000,1582329759382238,1.187,9672.93,9672.31,0.031 -binance-futures,BTCUSDT,1582329759284000,1582329759408308,0.338,9672.92,9672.14,0.017 -binance-futures,BTCUSDT,1582329759292000,1582329759414035,1.187,9672.93,9672.14,0.017 -binance-futures,BTCUSDT,1582329759299000,1582329759421961,1.187,9672.93,9672.17,0.44 -binance-futures,BTCUSDT,1582329759305000,1582329759428306,4.75,9672.92,9672.17,0.44 -binance-futures,BTCUSDT,1582329759310000,1582329759431243,0.031,9672.88,9672.17,0.44 -binance-futures,BTCUSDT,1582329759312000,1582329759433772,0.031,9672.88,9672.14,0.017 -binance-futures,BTCUSDT,1582329759313000,1582329759435608,0.031,9672.88,9672.32,0.031 -binance-futures,BTCUSDT,1582329759329000,1582329759448344,7.781,9672.88,9672.32,0.031 -binance-futures,BTCUSDT,1582329759331000,1582329759452303,0.338,9672.87,9672.32,0.031 -binance-futures,BTCUSDT,1582329759335000,1582329759456421,0.338,9672.87,9672.14,0.017 -binance-futures,BTCUSDT,1582329759350000,1582329759470055,9.888,9672.87,9672.14,0.017 -binance-futures,BTCUSDT,1582329759360000,1582329759483380,0.012,9672.85,9672.14,0.017 -binance-futures,BTCUSDT,1582329759362000,1582329759483503,0.031,9672.83,9672.14,0.017 -binance-futures,BTCUSDT,1582329759373000,1582329759495922,0.338,9672.77,9671.51,0.438 -binance-futures,BTCUSDT,1582329759375000,1582329759496584,0.338,9672.77,9671.52,0.034 -binance-futures,BTCUSDT,1582329759377000,1582329759497894,0.338,9672.77,9671.52,0.037 -binance-futures,BTCUSDT,1582329759393000,1582329759513167,9.988,9672.77,9671.52,0.037 -binance-futures,BTCUSDT,1582329759408000,1582329759529081,0.1,9672.15,9671.52,0.037 -binance-futures,BTCUSDT,1582329759430000,1582329759551675,5.25,9672.15,9671.52,0.037 -binance-futures,BTCUSDT,1582329759432000,1582329759553340,0.031,9672.12,9671.52,0.037 -binance-futures,BTCUSDT,1582329759432000,1582329759553363,0.031,9672.11,9671.52,0.037 -binance-futures,BTCUSDT,1582329759434000,1582329759554687,0.338,9671.89,9671.52,0.037 -binance-futures,BTCUSDT,1582329759438000,1582329759556937,0.031,9672.11,9671.52,0.037 -binance-futures,BTCUSDT,1582329759451000,1582329759574737,5.081,9672.11,9671.52,0.037 -binance-futures,BTCUSDT,1582329759453000,1582329759577302,3.25,9671.89,9671.52,0.037 -binance-futures,BTCUSDT,1582329759479000,1582329759603477,0.031,9671.85,9671.52,0.037 -binance-futures,BTCUSDT,1582329759503000,1582329759621000,3.281,9671.85,9671.52,0.037 -binance-futures,BTCUSDT,1582329759523000,1582329759646178,0.031,9671.81,9671.52,0.037 -binance-futures,BTCUSDT,1582329759541000,1582329759659028,3.231,9671.81,9671.52,0.037 -binance-futures,BTCUSDT,1582329759553000,1582329759676528,2.731,9671.81,9671.52,0.037 -binance-futures,BTCUSDT,1582329759555000,1582329759676544,0.031,9671.82,9671.52,0.037 -binance-futures,BTCUSDT,1582329759584000,1582329759706878,0.338,9672.76,9671.52,0.037 -binance-futures,BTCUSDT,1582329759604000,1582329759727058,1.56,9672.82,9671.52,0.037 -binance-futures,BTCUSDT,1582329759608000,1582329759729011,0.338,9672.04,9671.52,0.037 -binance-futures,BTCUSDT,1582329759609000,1582329759730009,1.56,9672.82,9671.52,0.037 -binance-futures,BTCUSDT,1582329759609000,1582329759730630,0.031,9672.72,9671.52,0.037 -binance-futures,BTCUSDT,1582329759628000,1582329759752013,6.65,9672.72,9671.52,0.037 -binance-futures,BTCUSDT,1582329759659000,1582329759780391,0.338,9672.7,9671.52,0.037 -binance-futures,BTCUSDT,1582329759680000,1582329759801948,0.031,9671.77,9671.52,0.037 -binance-futures,BTCUSDT,1582329759702000,1582329759825334,6.738,9672.7,9671.52,0.037 -binance-futures,BTCUSDT,1582329759709000,1582329759828836,6.4,9672.7,9671.52,0.037 -binance-futures,BTCUSDT,1582329759709000,1582329759828850,0.338,9672.64,9671.52,0.037 -binance-futures,BTCUSDT,1582329759727000,1582329759851038,7.038,9672.64,9671.52,0.037 -binance-futures,BTCUSDT,1582329759759000,1582329759878688,6.7,9672.64,9671.52,0.037 -binance-futures,BTCUSDT,1582329759759000,1582329759878699,0.338,9672.58,9671.52,0.037 -binance-futures,BTCUSDT,1582329759777000,1582329759895677,7.338,9672.58,9671.52,0.037 -binance-futures,BTCUSDT,1582329759814000,1582329759931772,7,9672.58,9671.52,0.037 -binance-futures,BTCUSDT,1582329759818000,1582329759937815,0.338,9672.52,9671.52,0.037 -binance-futures,BTCUSDT,1582329759836000,1582329759956050,7.288,9672.52,9671.52,0.037 -binance-futures,BTCUSDT,1582329759860000,1582329759980912,0.338,9672.43,9671.52,0.037 -binance-futures,BTCUSDT,1582329759874000,1582329760000542,6.768,9672.52,9671.52,0.037 -binance-futures,BTCUSDT,1582329759874000,1582329760000550,6.768,9672.52,9671.52,0.003 -binance-futures,BTCUSDT,1582329759880000,1582329760001390,5.2,9672.43,9671.52,0.003 -binance-futures,BTCUSDT,1582329759882000,1582329760002997,0.012,9672.4,9671.52,0.003 -binance-futures,BTCUSDT,1582329759884000,1582329760004747,0.031,9672.39,9671.52,0.003 -binance-futures,BTCUSDT,1582329759903000,1582329760023359,4.331,9672.39,9671.52,0.003 -binance-futures,BTCUSDT,1582329759905000,1582329760028896,4.3,9672.39,9671.52,0.003 -binance-futures,BTCUSDT,1582329759916000,1582329760036169,4.45,9672.4,9671.52,0.003 -binance-futures,BTCUSDT,1582329759916000,1582329760036780,1.56,9672.82,9671.52,0.003 -binance-futures,BTCUSDT,1582329759924000,1582329760043928,0.031,9672.37,9671.52,0.003 -binance-futures,BTCUSDT,1582329759924000,1582329760044537,0.031,9672.35,9671.52,0.003 -binance-futures,BTCUSDT,1582329759988000,1582329760107046,0.1,9672.1,9671.52,0.003 -binance-futures,BTCUSDT,1582329760008000,1582329760130627,0.031,9672.06,9671.52,0.003 -binance-futures,BTCUSDT,1582329760106000,1582329760229346,0.031,9672.06,9671.54,0.457 -binance-futures,BTCUSDT,1582329760122000,1582329760245416,0.012,9672.07,9671.54,0.457 -binance-futures,BTCUSDT,1582329760124000,1582329760245995,0.1,9672.1,9671.54,0.457 -binance-futures,BTCUSDT,1582329760148000,1582329760270091,0.1,9672.1,9671.5,1.857 -binance-futures,BTCUSDT,1582329760172000,1582329760294267,0.031,9672.07,9671.5,1.857 -binance-futures,BTCUSDT,1582329760173000,1582329760294367,0.031,9672.06,9671.5,1.857 -binance-futures,BTCUSDT,1582329760193000,1582329760326678,4.081,9672.06,9671.5,1.857 -binance-futures,BTCUSDT,1582329760217000,1582329760341551,0.031,9672.06,9671.5,1.857 -binance-futures,BTCUSDT,1582329760232000,1582329760356772,0.031,9672.02,9671.5,1.857 -binance-futures,BTCUSDT,1582329760249000,1582329760370934,0.031,9672.02,9671.64,0.02 -binance-futures,BTCUSDT,1582329760256000,1582329760379016,3.281,9672.02,9671.64,0.02 -binance-futures,BTCUSDT,1582329760276000,1582329760398078,3.487,9672.02,9671.64,0.02 -binance-futures,BTCUSDT,1582329760283000,1582329760405467,0.206,9672,9671.64,0.02 -binance-futures,BTCUSDT,1582329760301000,1582329760422172,0.031,9671.98,9671.64,0.02 -binance-futures,BTCUSDT,1582329760321000,1582329760466517,2.881,9671.98,9671.64,0.02 -binance-futures,BTCUSDT,1582329760356000,1582329760477958,0.031,9671.98,9671.64,0.02 -binance-futures,BTCUSDT,1582329760382000,1582329760501855,0.031,9671.96,9671.64,0.02 -binance-futures,BTCUSDT,1582329760386000,1582329760507313,0.031,9671.95,9671.64,0.02 -binance-futures,BTCUSDT,1582329760398000,1582329760518409,6.942,9671.91,9671.64,0.02 -binance-futures,BTCUSDT,1582329760436000,1582329760558261,5.942,9671.91,9671.64,0.02 -binance-futures,BTCUSDT,1582329760457000,1582329760577323,0.206,9671.9,9671.64,0.02 -binance-futures,BTCUSDT,1582329760461000,1582329760581347,0.031,9671.87,9671.64,0.02 -binance-futures,BTCUSDT,1582329760478000,1582329760598112,3.231,9671.87,9671.64,0.02 -binance-futures,BTCUSDT,1582329760487000,1582329760609910,0.1,9671.65,9671.64,0.02 -binance-futures,BTCUSDT,1582329760509000,1582329760628574,2.35,9671.65,9671.64,0.02 -binance-futures,BTCUSDT,1582329760513000,1582329760633932,2.556,9671.65,9671.64,0.02 -binance-futures,BTCUSDT,1582329760524000,1582329760645558,0.306,9671.65,9671.64,0.02 -binance-futures,BTCUSDT,1582329760551000,1582329760670908,0.1,9671.65,9671.64,0.02 -binance-futures,BTCUSDT,1582329760715000,1582329760834336,5.942,9671.91,9671.64,0.02 -binance-futures,BTCUSDT,1582329760736000,1582329760857128,0.031,9671.87,9671.64,0.02 -binance-futures,BTCUSDT,1582329760740000,1582329760860356,0.206,9671.69,9671.64,0.02 -binance-futures,BTCUSDT,1582329760751000,1582329760869657,0.031,9671.87,9671.64,0.02 -binance-futures,BTCUSDT,1582329760757000,1582329760877078,4.081,9671.87,9671.64,0.02 -binance-futures,BTCUSDT,1582329760757000,1582329760877151,2.8,9671.69,9671.64,0.02 -binance-futures,BTCUSDT,1582329760767000,1582329760887110,1.819,9671.69,9671.64,0.02 -binance-futures,BTCUSDT,1582329760792000,1582329760912476,0.031,9671.66,9671.64,0.02 -binance-futures,BTCUSDT,1582329760794000,1582329760914535,0.031,9671.65,9671.64,0.02 -binance-futures,BTCUSDT,1582329761033000,1582329761169440,5.623,9671.91,9671.64,0.02 -binance-futures,BTCUSDT,1582329761038000,1582329761169648,5.417,9671.91,9671.64,0.02 -binance-futures,BTCUSDT,1582329761039000,1582329761170300,5.211,9671.91,9671.64,0.02 -binance-futures,BTCUSDT,1582329761074000,1582329761192190,0.031,9671.87,9671.64,0.02 -binance-futures,BTCUSDT,1582329761090000,1582329761209709,3.881,9671.87,9671.64,0.02 -binance-futures,BTCUSDT,1582329761093000,1582329761214532,3.85,9671.87,9671.64,0.02 -binance-futures,BTCUSDT,1582329761213000,1582329761332344,5.211,9671.91,9671.64,0.02 -binance-futures,BTCUSDT,1582329761221000,1582329761339923,5.211,9671.91,9671.67,0.031 -binance-futures,BTCUSDT,1582329761227000,1582329761360050,5.211,9671.91,9671.68,0.031 -binance-futures,BTCUSDT,1582329761328000,1582329761453099,5.211,9671.91,9671.69,0.031 -binance-futures,BTCUSDT,1582329761564000,1582329761682647,5.211,9671.91,9671.76,0.443 -binance-futures,BTCUSDT,1582329761585000,1582329761705516,5.211,9671.91,9671.78,0.031 -binance-futures,BTCUSDT,1582329761585000,1582329761706620,5.211,9671.91,9671.8,0.031 -binance-futures,BTCUSDT,1582329761611000,1582329761732890,5.211,9671.91,9671.88,0.445 -binance-futures,BTCUSDT,1582329761637000,1582329761756888,5.211,9671.91,9671.9,0.031 -binance-futures,BTCUSDT,1582329761796000,1582329761916177,5.311,9671.91,9671.9,0.031 -binance-futures,BTCUSDT,1582329761996000,1582329762117105,5.311,9671.91,9671.9,2.933 -binance-futures,BTCUSDT,1582329762059000,1582329762178550,5.311,9671.91,9671.9,3.404 -binance-futures,BTCUSDT,1582329762059000,1582329762181501,5.311,9671.91,9671.9,2.933 -binance-futures,BTCUSDT,1582329762086000,1582329762207067,5.211,9671.91,9671.9,2.933 -binance-futures,BTCUSDT,1582329762353000,1582329762475760,5.211,9671.91,9671.9,2.428 -binance-futures,BTCUSDT,1582329762999000,1582329763118415,5.211,9671.91,9671.9,2.865 -binance-futures,BTCUSDT,1582329763081000,1582329763204200,5.211,9671.91,9671.9,2.428 -binance-futures,BTCUSDT,1582329763101000,1582329763220672,5.211,9671.91,9671.9,2.876 -binance-futures,BTCUSDT,1582329763257000,1582329763376728,5.211,9671.91,9671.9,2.428 -binance-futures,BTCUSDT,1582329763285000,1582329763407150,5.209,9671.91,9671.9,2.428 -binance-futures,BTCUSDT,1582329763923000,1582329764043729,5.335,9671.91,9671.9,2.428 -binance-futures,BTCUSDT,1582329764056000,1582329764175428,5.209,9671.91,9671.9,2.428 -binance-futures,BTCUSDT,1582329764643000,1582329764764230,5.209,9671.91,9671.9,2.881 -binance-futures,BTCUSDT,1582329764675000,1582329764794957,5.209,9671.91,9671.9,2.428 -binance-futures,BTCUSDT,1582329764699000,1582329764819550,5.209,9671.91,9671.9,2.865 -binance-futures,BTCUSDT,1582329764812000,1582329764930148,5.209,9671.91,9671.9,2.428 -binance-futures,BTCUSDT,1582329765869000,1582329765990491,5.209,9671.91,9671.9,2.865 -binance-futures,BTCUSDT,1582329765938000,1582329766057786,5.309,9671.91,9671.9,2.865 -binance-futures,BTCUSDT,1582329766057000,1582329766179380,5.209,9671.91,9671.9,2.865 -binance-futures,BTCUSDT,1582329766107000,1582329766225987,5.209,9671.91,9671.9,2.428 -binance-futures,BTCUSDT,1582329766297000,1582329766418025,5.309,9671.91,9671.9,2.428 -binance-futures,BTCUSDT,1582329766528000,1582329766650330,5.209,9671.91,9671.9,2.428 -binance-futures,BTCUSDT,1582329767012000,1582329767133144,5.209,9671.91,9671.9,2.894 -binance-futures,BTCUSDT,1582329767047000,1582329767173621,5.209,9671.91,9671.9,2.844 -binance-futures,BTCUSDT,1582329767064000,1582329767184372,9.759,9671.91,9671.9,2.844 -binance-futures,BTCUSDT,1582329767205000,1582329767338800,9.859,9671.91,9671.9,2.844 -binance-futures,BTCUSDT,1582329767232000,1582329767355401,5.309,9671.91,9671.9,2.844 -binance-futures,BTCUSDT,1582329767334000,1582329767455197,5.309,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329767376000,1582329767497672,5.209,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329767378000,1582329767500683,5.335,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329767383000,1582329767504742,5.209,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329767763000,1582329767883005,5.209,9671.91,9671.9,2.81 -binance-futures,BTCUSDT,1582329767839000,1582329767957926,5.209,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329768024000,1582329768143991,5.335,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329768087000,1582329768207302,5.435,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329768126000,1582329768246481,5.309,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329768145000,1582329768266376,5.335,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329768190000,1582329768320108,5.209,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329768255000,1582329768373386,5.309,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329768315000,1582329768434378,5.209,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329768488000,1582329768610809,5.335,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329768537000,1582329768658186,5.209,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329768544000,1582329768664885,5.209,9671.91,9671.9,2.845 -binance-futures,BTCUSDT,1582329768565000,1582329768685315,5.209,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329768809000,1582329768931871,5.209,9671.91,9671.9,2.833 -binance-futures,BTCUSDT,1582329768851000,1582329768970135,5.209,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329769335000,1582329769455317,5.335,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329769354000,1582329769475200,5.209,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329769405000,1582329769545204,5.309,9671.91,9671.9,2.378 -binance-futures,BTCUSDT,1582329769634000,1582329769760347,5.309,9671.91,9671.9,2.018 -binance-futures,BTCUSDT,1582329769634000,1582329769760362,5.309,9671.91,9671.64,0.02 -binance-futures,BTCUSDT,1582329769652000,1582329769769690,2,9671.85,9671.64,0.02 -binance-futures,BTCUSDT,1582329769652000,1582329769774977,1.98,9671.64,9670.61,0.003 -binance-futures,BTCUSDT,1582329769671000,1582329769793535,2,9671.81,9670.61,0.003 -binance-futures,BTCUSDT,1582329769673000,1582329769796781,18.95,9671.64,9670.61,0.003 -binance-futures,BTCUSDT,1582329769679000,1582329769802664,0.65,9671.32,9670.61,0.003 -binance-futures,BTCUSDT,1582329769697000,1582329769818546,2,9671.28,9670.61,0.003 -binance-futures,BTCUSDT,1582329769703000,1582329769831985,2,9671.28,9670.6,2.638 -binance-futures,BTCUSDT,1582329769718000,1582329769845285,20.25,9671.28,9670.6,2.638 -binance-futures,BTCUSDT,1582329769720000,1582329769846521,12.25,9671.27,9670.6,2.638 -binance-futures,BTCUSDT,1582329769720000,1582329769847738,0.031,9671.24,9670.6,2.638 -binance-futures,BTCUSDT,1582329769726000,1582329769850941,0.031,9671.24,9670.12,0.428 -binance-futures,BTCUSDT,1582329769726000,1582329769851110,0.031,9671.24,9670,0.126 -binance-futures,BTCUSDT,1582329769742000,1582329769862008,2.031,9671.24,9670,0.126 -binance-futures,BTCUSDT,1582329769747000,1582329769870544,2,9671.2,9670,0.126 -binance-futures,BTCUSDT,1582329769765000,1582329769887493,2,9671.2,9670.62,0.001 -binance-futures,BTCUSDT,1582329769768000,1582329769890805,22.65,9671.2,9670.62,0.001 -binance-futures,BTCUSDT,1582329769774000,1582329769901293,0.126,9671.13,9670.62,0.001 -binance-futures,BTCUSDT,1582329769784000,1582329769907802,0.126,9671.13,9670,0.126 -binance-futures,BTCUSDT,1582329769799000,1582329769920717,20.276,9671.13,9670,0.126 -binance-futures,BTCUSDT,1582329769801000,1582329769922265,2,9671.09,9670,0.126 -binance-futures,BTCUSDT,1582329769807000,1582329769928656,2.012,9671.09,9670,0.126 -binance-futures,BTCUSDT,1582329769820000,1582329769941874,21.862,9671.09,9670,0.126 -binance-futures,BTCUSDT,1582329769824000,1582329769946104,0.126,9671.06,9670,0.126 -binance-futures,BTCUSDT,1582329769840000,1582329769963639,0.031,9671.05,9670,0.126 -binance-futures,BTCUSDT,1582329769861000,1582329769985176,18.331,9671.05,9670,0.126 -binance-futures,BTCUSDT,1582329769869000,1582329769990048,0.126,9671.02,9670,0.126 -binance-futures,BTCUSDT,1582329769881000,1582329770001619,0.126,9671.02,9670.01,0.017 -binance-futures,BTCUSDT,1582329769890000,1582329770010749,18.926,9671.02,9670.01,0.017 -binance-futures,BTCUSDT,1582329769912000,1582329770034735,18.8,9671.02,9670.01,0.017 -binance-futures,BTCUSDT,1582329769916000,1582329770035623,0.126,9670.98,9670.01,0.017 -binance-futures,BTCUSDT,1582329769933000,1582329770053414,4,9670.94,9670.01,0.017 -binance-futures,BTCUSDT,1582329769950000,1582329770070696,2,9670.9,9670.01,0.017 -binance-futures,BTCUSDT,1582329769952000,1582329770073573,4,9670.9,9670.01,0.017 -binance-futures,BTCUSDT,1582329769956000,1582329770079086,4,9670.9,9670.63,4.153 -binance-futures,BTCUSDT,1582329769970000,1582329770095490,2,9670.86,9670.63,4.153 -binance-futures,BTCUSDT,1582329769974000,1582329770096348,2,9670.84,9670.63,4.153 -binance-futures,BTCUSDT,1582329769975000,1582329770103963,10,9670.84,9670.63,2.153 -binance-futures,BTCUSDT,1582329769988000,1582329770109594,10,9670.84,9670.63,2.096 -binance-futures,BTCUSDT,1582329769994000,1582329770114978,2,9670.82,9670.63,2.096 -binance-futures,BTCUSDT,1582329769997000,1582329770121868,2,9670.78,9670.01,0.017 -binance-futures,BTCUSDT,1582329769997000,1582329770122893,6,9670.78,9670.01,0.017 -binance-futures,BTCUSDT,1582329769999000,1582329770122927,8,9670.78,9670.01,0.017 -binance-futures,BTCUSDT,1582329769999000,1582329770122940,10,9670.78,9670.01,0.017 -binance-futures,BTCUSDT,1582329770006000,1582329770129271,2,9670.63,9670.01,0.017 -binance-futures,BTCUSDT,1582329770023000,1582329770149806,1,9670.67,9670.01,0.017 -binance-futures,BTCUSDT,1582329770029000,1582329770152225,13.1,9670.63,9670.01,0.017 -binance-futures,BTCUSDT,1582329770031000,1582329770153263,0.126,9670.61,9670.01,0.017 -binance-futures,BTCUSDT,1582329770039000,1582329770162531,2,9670.59,9670.01,0.017 -binance-futures,BTCUSDT,1582329770058000,1582329770178531,0.031,9670.58,9670.01,0.017 -binance-futures,BTCUSDT,1582329770061000,1582329770182061,0.031,9670.57,9670.01,0.017 -binance-futures,BTCUSDT,1582329770081000,1582329770204179,11.631,9670.57,9670.01,0.017 -binance-futures,BTCUSDT,1582329770118000,1582329770239319,0.478,9670.56,9670.01,0.017 -binance-futures,BTCUSDT,1582329770124000,1582329770249333,0.478,9670.56,9669,0.1 -binance-futures,BTCUSDT,1582329770128000,1582329770252695,4,9670,9669.32,0.471 -binance-futures,BTCUSDT,1582329770130000,1582329770254675,6,9670,9669.32,0.471 -binance-futures,BTCUSDT,1582329770130000,1582329770255209,10,9670,9669.32,0.471 -binance-futures,BTCUSDT,1582329770141000,1582329770261333,8,9670,9669.32,0.471 -binance-futures,BTCUSDT,1582329770143000,1582329770264309,6,9670,9669.32,0.471 -binance-futures,BTCUSDT,1582329770145000,1582329770271242,4,9670,9669.32,0.471 -binance-futures,BTCUSDT,1582329770147000,1582329770271480,2,9670.01,9669.32,0.301 -binance-futures,BTCUSDT,1582329770149000,1582329770273086,1.699,9669.32,9669,0.1 -binance-futures,BTCUSDT,1582329770152000,1582329770276317,1.699,9669.32,9669,0.57 -binance-futures,BTCUSDT,1582329770163000,1582329770284421,1.699,9669.32,9669,0.1 -binance-futures,BTCUSDT,1582329770169000,1582329770296558,1.699,9669.32,9668.74,0.395 -binance-futures,BTCUSDT,1582329770171000,1582329770303174,2,9669.26,9668.74,0.395 -binance-futures,BTCUSDT,1582329770173000,1582329770309329,12,9669.26,9668.74,0.395 -binance-futures,BTCUSDT,1582329770179000,1582329770311823,12,9669.26,9668.61,0.444 -binance-futures,BTCUSDT,1582329770183000,1582329770312286,2,9669,9668.61,0.444 -binance-futures,BTCUSDT,1582329770195000,1582329770319145,12,9669.26,9668.61,0.444 -binance-futures,BTCUSDT,1582329770197000,1582329770327488,12,9669.26,9668.33,0.1 -binance-futures,BTCUSDT,1582329770201000,1582329770354289,8,9669.26,9668.33,0.1 -binance-futures,BTCUSDT,1582329770203000,1582329770356763,17.8,9669.26,9668.33,0.1 -binance-futures,BTCUSDT,1582329770207000,1582329770356799,0.74,9668.42,9668.33,0.1 -binance-futures,BTCUSDT,1582329770214000,1582329770357118,0.79,9668.42,9668.33,0.1 -binance-futures,BTCUSDT,1582329770215000,1582329770357441,0.8,9668.42,9668.33,0.1 -binance-futures,BTCUSDT,1582329770218000,1582329770357468,1.43,9668.42,9668.33,0.1 -binance-futures,BTCUSDT,1582329770224000,1582329770358669,1.43,9668.42,9668.27,0.015 -binance-futures,BTCUSDT,1582329770235000,1582329770359159,8.83,9668.42,9668.27,0.015 -binance-futures,BTCUSDT,1582329770239000,1582329770362617,8.83,9668.42,9668.34,0.005 -binance-futures,BTCUSDT,1582329770249000,1582329770374697,8.09,9668.42,9668.34,0.005 -binance-futures,BTCUSDT,1582329770253000,1582329770380705,12,9668.36,9668.34,0.005 -binance-futures,BTCUSDT,1582329770273000,1582329770397139,8,9668.36,9668.34,0.005 -binance-futures,BTCUSDT,1582329770275000,1582329770400307,13.15,9668.36,9668.34,0.005 -binance-futures,BTCUSDT,1582329770278000,1582329770402017,6,9668.35,9668.34,0.005 -binance-futures,BTCUSDT,1582329770279000,1582329770405651,12,9668.35,9668.34,0.005 -binance-futures,BTCUSDT,1582329770289000,1582329770410692,13,9668.35,9668.34,0.005 -binance-futures,BTCUSDT,1582329770295000,1582329770432620,13,9668.35,9668.27,0.015 -binance-futures,BTCUSDT,1582329770299000,1582329770433408,18.6,9668.35,9668.27,0.015 -binance-futures,BTCUSDT,1582329770302000,1582329770433672,16.6,9668.35,9668.27,0.015 -binance-futures,BTCUSDT,1582329770315000,1582329770439449,9,9668.35,9668.27,0.015 -binance-futures,BTCUSDT,1582329770323000,1582329770447523,1,9668.28,9668.27,0.015 -binance-futures,BTCUSDT,1582329770341000,1582329770463730,8.55,9668.28,9668.27,0.015 -binance-futures,BTCUSDT,1582329770360000,1582329770500172,8.55,9668.28,9668.07,0.904 -binance-futures,BTCUSDT,1582329770393000,1582329770518266,4.75,9668.27,9668.07,0.904 -binance-futures,BTCUSDT,1582329770396000,1582329770519628,2,9668.22,9668.07,0.904 -binance-futures,BTCUSDT,1582329770398000,1582329770522094,4,9668.22,9668.07,0.904 -binance-futures,BTCUSDT,1582329770399000,1582329770522433,8,9668.22,9668.07,0.904 -binance-futures,BTCUSDT,1582329770412000,1582329770533739,8,9668.22,9668.09,0.437 -binance-futures,BTCUSDT,1582329770416000,1582329770538048,6,9668.22,9668.09,0.437 -binance-futures,BTCUSDT,1582329770417000,1582329770540242,7,9668.22,9668.07,0.904 -binance-futures,BTCUSDT,1582329770419000,1582329770541116,13.65,9668.22,9668.07,0.904 -binance-futures,BTCUSDT,1582329770421000,1582329770542343,11.65,9668.22,9668.07,0.904 -binance-futures,BTCUSDT,1582329770423000,1582329770543757,2,9668.16,9668.09,0.445 -binance-futures,BTCUSDT,1582329770423000,1582329770546541,2,9668.16,9668.07,0.904 -binance-futures,BTCUSDT,1582329770431000,1582329770553301,2,9668.16,9668.08,0.005 -binance-futures,BTCUSDT,1582329770445000,1582329770571437,9.45,9668.16,9668.08,0.005 -binance-futures,BTCUSDT,1582329770467000,1582329770592791,9.45,9668.16,9668.08,0.45 -binance-futures,BTCUSDT,1582329770469000,1582329770594619,9.45,9668.16,9668.08,0.005 -binance-futures,BTCUSDT,1582329770492000,1582329770619487,2,9668.16,9668.08,0.005 -binance-futures,BTCUSDT,1582329770506000,1582329770633696,0.335,9668.09,9668.08,0.005 -binance-futures,BTCUSDT,1582329770528000,1582329770648814,2,9668.16,9668.08,0.005 -binance-futures,BTCUSDT,1582329770535000,1582329770655728,5.65,9668.09,9668.08,0.005 -binance-futures,BTCUSDT,1582329770597000,1582329770729526,5.65,9668.09,9668.07,0.807 -binance-futures,BTCUSDT,1582329770615000,1582329770744898,5.985,9668.09,9668.07,0.807 -binance-futures,BTCUSDT,1582329770624000,1582329770752014,4.85,9668.08,9668.07,0.807 -binance-futures,BTCUSDT,1582329770635000,1582329770761683,5.85,9668.08,9668.07,0.807 -binance-futures,BTCUSDT,1582329770639000,1582329770765491,6.185,9668.08,9668.07,0.807 -binance-futures,BTCUSDT,1582329770646000,1582329770768938,9.785,9668.08,9668.07,0.77 -binance-futures,BTCUSDT,1582329770652000,1582329770776814,10.12,9668.08,9668.07,0.77 -binance-futures,BTCUSDT,1582329770658000,1582329770785711,9.45,9668.08,9668.07,0.775 -binance-futures,BTCUSDT,1582329770661000,1582329770785746,5.85,9668.08,9668.07,0.775 -binance-futures,BTCUSDT,1582329770687000,1582329770811990,6.185,9668.08,9668.07,0.775 -binance-futures,BTCUSDT,1582329770693000,1582329770818610,6.185,9668.08,9668.07,0.755 -binance-futures,BTCUSDT,1582329770701000,1582329770831409,6.185,9668.08,9668,0.431 -binance-futures,BTCUSDT,1582329770703000,1582329770832465,5.85,9668.08,9668,0.431 -binance-futures,BTCUSDT,1582329770706000,1582329770833287,5.95,9668.08,9668,0.431 -binance-futures,BTCUSDT,1582329770717000,1582329770840018,5.95,9668.08,9668,0.166 -binance-futures,BTCUSDT,1582329770726000,1582329770849130,2,9668.02,9668,0.166 -binance-futures,BTCUSDT,1582329770728000,1582329770852398,12,9668.02,9668,0.166 -binance-futures,BTCUSDT,1582329770734000,1582329770856648,12,9668.02,9668,0.069 -binance-futures,BTCUSDT,1582329770748000,1582329770870131,2,9668.01,9668,0.069 -binance-futures,BTCUSDT,1582329770750000,1582329770872153,2,9668.01,9667.5,2.825 -binance-futures,BTCUSDT,1582329770773000,1582329770894271,2,9667.97,9667.5,2.825 -binance-futures,BTCUSDT,1582329770793000,1582329770916528,14.4,9667.97,9667.5,2.825 -binance-futures,BTCUSDT,1582329770814000,1582329770938164,2,9667.93,9667.5,2.825 -binance-futures,BTCUSDT,1582329770828000,1582329770948268,2.031,9667.93,9667.5,2.825 -binance-futures,BTCUSDT,1582329770836000,1582329770957047,11.681,9667.93,9667.5,2.825 -binance-futures,BTCUSDT,1582329770848000,1582329770970051,2,9667.89,9667.5,2.825 -binance-futures,BTCUSDT,1582329770869000,1582329770992987,10.9,9667.89,9667.5,2.825 -binance-futures,BTCUSDT,1582329770915000,1582329771038107,2,9667.89,9667.5,2.825 -binance-futures,BTCUSDT,1582329770936000,1582329771059109,2,9667.85,9667.5,2.825 -binance-futures,BTCUSDT,1582329770957000,1582329771079947,9.15,9667.85,9667.5,2.825 -binance-futures,BTCUSDT,1582329770969000,1582329771091745,2,9667.85,9667.5,2.825 -binance-futures,BTCUSDT,1582329770976000,1582329771101790,4,9667.79,9667.5,2.825 -binance-futures,BTCUSDT,1582329770978000,1582329771101876,6,9667.79,9667.5,2.825 -binance-futures,BTCUSDT,1582329770980000,1582329771104550,8,9667.79,9667.5,2.825 -binance-futures,BTCUSDT,1582329770980000,1582329771104622,12,9667.79,9667.5,2.825 -binance-futures,BTCUSDT,1582329770997000,1582329771123506,10,9667.79,9667.5,2.825 -binance-futures,BTCUSDT,1582329770999000,1582329771127304,4,9667.73,9667.5,2.825 -binance-futures,BTCUSDT,1582329771001000,1582329771127360,6,9667.73,9667.5,2.825 -binance-futures,BTCUSDT,1582329771001000,1582329771129545,10,9667.73,9667.5,2.825 -binance-futures,BTCUSDT,1582329771007000,1582329771130399,0.1,9667.51,9667.5,2.825 -binance-futures,BTCUSDT,1582329771030000,1582329771156344,6.25,9667.51,9667.5,2.825 -binance-futures,BTCUSDT,1582329771057000,1582329771191722,6.585,9667.51,9667.5,2.825 -binance-futures,BTCUSDT,1582329771069000,1582329771207876,0.435,9667.51,9667.5,2.825 -binance-futures,BTCUSDT,1582329771075000,1582329771211153,0.1,9667.51,9667.5,2.825 -binance-futures,BTCUSDT,1582329771226000,1582329771375920,0.435,9667.51,9667.5,2.825 -binance-futures,BTCUSDT,1582329771236000,1582329771376888,0.1,9667.51,9667.5,2.825 -binance-futures,BTCUSDT,1582329771336000,1582329771457849,0.335,9668.05,9667.5,2.825 -binance-futures,BTCUSDT,1582329771364000,1582329771487351,3.185,9668.05,9667.5,2.825 -binance-futures,BTCUSDT,1582329771391000,1582329771510636,2.85,9668.05,9667.5,2.825 -binance-futures,BTCUSDT,1582329771391000,1582329771511840,0.335,9668.03,9667.5,2.825 -binance-futures,BTCUSDT,1582329771394000,1582329771517606,0.335,9668.03,9667.5,2.075 -binance-futures,BTCUSDT,1582329771410000,1582329771530917,7.585,9668.03,9667.5,2.075 -binance-futures,BTCUSDT,1582329771416000,1582329771540220,10.035,9668.03,9667.5,2.075 -binance-futures,BTCUSDT,1582329771434000,1582329771555019,9.7,9668.03,9667.5,2.075 -binance-futures,BTCUSDT,1582329771436000,1582329771560983,0.335,9668,9667.5,2.075 -binance-futures,BTCUSDT,1582329771455000,1582329771578273,2,9667.94,9667.5,2.075 -binance-futures,BTCUSDT,1582329771459000,1582329771580733,8,9667.94,9667.5,2.075 -binance-futures,BTCUSDT,1582329771473000,1582329771594494,6,9667.94,9667.5,2.075 -binance-futures,BTCUSDT,1582329771477000,1582329771599855,4,9667.94,9667.5,2.075 -binance-futures,BTCUSDT,1582329771479000,1582329771604888,8,9667.88,9667.5,2.075 -binance-futures,BTCUSDT,1582329771500000,1582329771628041,2,9667.82,9667.5,2.075 -binance-futures,BTCUSDT,1582329771502000,1582329771629070,4,9667.82,9667.5,2.075 -binance-futures,BTCUSDT,1582329771508000,1582329771634161,4.335,9667.82,9667.5,2.075 -binance-futures,BTCUSDT,1582329771520000,1582329771642789,2.335,9667.82,9667.5,2.075 -binance-futures,BTCUSDT,1582329771523000,1582329771646098,2,9667.76,9667.5,2.075 -binance-futures,BTCUSDT,1582329771523000,1582329771649412,6,9667.76,9667.5,2.075 -binance-futures,BTCUSDT,1582329771525000,1582329771650669,8,9667.76,9667.5,2.075 -binance-futures,BTCUSDT,1582329771543000,1582329771665737,6,9667.76,9667.5,2.075 -binance-futures,BTCUSDT,1582329771547000,1582329771669374,10.15,9667.76,9667.5,2.075 -binance-futures,BTCUSDT,1582329771551000,1582329771672348,0.335,9667.73,9667.5,2.075 -binance-futures,BTCUSDT,1582329771569000,1582329771690214,2.335,9667.73,9667.5,2.075 -binance-futures,BTCUSDT,1582329771572000,1582329771692882,0.031,9667.72,9667.5,2.075 -binance-futures,BTCUSDT,1582329771591000,1582329771711581,8.131,9667.72,9667.5,2.075 -binance-futures,BTCUSDT,1582329771608000,1582329771733190,8.13,9667.72,9667.5,2.075 -binance-futures,BTCUSDT,1582329771616000,1582329771737370,0.335,9667.71,9667.5,2.075 -binance-futures,BTCUSDT,1582329771638000,1582329771758869,4.985,9667.71,9667.5,2.075 -binance-futures,BTCUSDT,1582329771655000,1582329771776594,4.65,9667.71,9667.5,2.075 -binance-futures,BTCUSDT,1582329771661000,1582329771783433,2,9667.66,9667.5,2.075 -binance-futures,BTCUSDT,1582329771669000,1582329771788682,2,9667.65,9667.5,2.075 -binance-futures,BTCUSDT,1582329771669000,1582329771792007,6,9667.65,9667.5,2.075 -binance-futures,BTCUSDT,1582329771676000,1582329771798191,6,9667.65,9667,0.25 -binance-futures,BTCUSDT,1582329771680000,1582329771800889,2,9667.62,9667,0.25 -binance-futures,BTCUSDT,1582329771688000,1582329771810536,2,9667.59,9667,0.25 -binance-futures,BTCUSDT,1582329771689000,1582329771810554,4,9667.59,9667,0.25 -binance-futures,BTCUSDT,1582329771691000,1582329771815111,8,9667.59,9667,0.25 -binance-futures,BTCUSDT,1582329771722000,1582329771843385,15.7,9667.59,9667,0.25 -binance-futures,BTCUSDT,1582329771722000,1582329771844653,0.335,9667.56,9667,0.25 -binance-futures,BTCUSDT,1582329771722000,1582329771849258,2,9667.55,9667,0.25 -binance-futures,BTCUSDT,1582329771746000,1582329771870775,7.512,9667.55,9667,0.25 -binance-futures,BTCUSDT,1582329771752000,1582329771875958,0.335,9667.54,9667,0.25 -binance-futures,BTCUSDT,1582329771772000,1582329771895696,0.031,9667.51,9667,0.25 -binance-futures,BTCUSDT,1582329771795000,1582329771915370,5.931,9667.51,9667,0.25 -binance-futures,BTCUSDT,1582329771797000,1582329771922642,0.03,9667.48,9667,0.25 -binance-futures,BTCUSDT,1582329771821000,1582329771949452,8,9667.42,9667,0.25 -binance-futures,BTCUSDT,1582329771845000,1582329771969514,2,9667.36,9667,0.25 -binance-futures,BTCUSDT,1582329771847000,1582329771970882,6,9667.36,9667,0.25 -binance-futures,BTCUSDT,1582329771865000,1582329771990287,8.15,9667.36,9667,0.25 -binance-futures,BTCUSDT,1582329771868000,1582329771992108,4.15,9667.36,9667,0.25 -binance-futures,BTCUSDT,1582329771869000,1582329771994042,4,9667.3,9667,0.25 -binance-futures,BTCUSDT,1582329771947000,1582329772070727,4,9667.3,9667.01,1.9 -binance-futures,BTCUSDT,1582329771963000,1582329772085049,4,9667.3,9667,0.25 -binance-futures,BTCUSDT,1582329771982000,1582329772102229,4,9667.24,9667,0.25 -binance-futures,BTCUSDT,1582329771984000,1582329772107915,6,9667.24,9667,0.25 -binance-futures,BTCUSDT,1582329771985000,1582329772107949,8,9667.24,9667,0.25 -binance-futures,BTCUSDT,1582329771999000,1582329772121550,10.25,9667.24,9667,0.25 -binance-futures,BTCUSDT,1582329772001000,1582329772124057,2,9667.18,9667,0.25 -binance-futures,BTCUSDT,1582329772003000,1582329772125829,4,9667.18,9667,0.25 -binance-futures,BTCUSDT,1582329772018000,1582329772140128,6,9667.18,9667,0.25 -binance-futures,BTCUSDT,1582329772021000,1582329772143383,4,9667.18,9667,0.25 -binance-futures,BTCUSDT,1582329772021000,1582329772143397,2,9667.18,9667,0.25 -binance-futures,BTCUSDT,1582329772025000,1582329772147318,2,9667.15,9667,0.25 -binance-futures,BTCUSDT,1582329772047000,1582329772167281,5.6,9667.15,9667,0.25 -binance-futures,BTCUSDT,1582329772058000,1582329772178483,2,9667.15,9667,0.25 -binance-futures,BTCUSDT,1582329772141000,1582329772267301,1.6,9667.15,9667,0.25 -binance-futures,BTCUSDT,1582329772200000,1582329772331242,2,9668.6,9667,0.25 -binance-futures,BTCUSDT,1582329772202000,1582329772337229,0.335,9667.48,9667,0.25 -binance-futures,BTCUSDT,1582329772213000,1582329772351215,0.335,9667.37,9667,0.25 -binance-futures,BTCUSDT,1582329772234000,1582329772361409,5.7,9667.48,9667,0.25 -binance-futures,BTCUSDT,1582329772237000,1582329772361643,5.25,9667.37,9667,0.25 -binance-futures,BTCUSDT,1582329772288000,1582329772410713,5.242,9667.37,9667,0.25 -binance-futures,BTCUSDT,1582329772324000,1582329772444511,5.242,9667.37,9667.01,1.9 -binance-futures,BTCUSDT,1582329772340000,1582329772460672,5.242,9667.37,9667,0.25 -binance-futures,BTCUSDT,1582329772395000,1582329772519228,0.1,9668.09,9667,0.25 -binance-futures,BTCUSDT,1582329772408000,1582329772531240,0.335,9667.84,9667,0.25 -binance-futures,BTCUSDT,1582329772414000,1582329772535260,0.335,9667.62,9667,0.25 -binance-futures,BTCUSDT,1582329772422000,1582329772545516,0.1,9668.09,9667,0.25 -binance-futures,BTCUSDT,1582329772430000,1582329772553351,7.4,9667.84,9667,0.25 -binance-futures,BTCUSDT,1582329772435000,1582329772557987,5.5,9667.62,9667,0.25 -binance-futures,BTCUSDT,1582329772466000,1582329772587581,0.335,9667.54,9667,0.25 -binance-futures,BTCUSDT,1582329772490000,1582329772613085,5.235,9667.54,9667,0.25 -binance-futures,BTCUSDT,1582329772516000,1582329772636882,4.9,9667.54,9667,0.25 -binance-futures,BTCUSDT,1582329772519000,1582329772639914,0.335,9667.49,9667,0.25 -binance-futures,BTCUSDT,1582329772540000,1582329772660559,5.385,9667.49,9667,0.25 -binance-futures,BTCUSDT,1582329772563000,1582329772682885,5.05,9667.49,9667,0.25 -binance-futures,BTCUSDT,1582329772566000,1582329772686100,0.335,9667.39,9667,0.25 -binance-futures,BTCUSDT,1582329772586000,1582329772707892,6.085,9667.39,9667,0.25 -binance-futures,BTCUSDT,1582329772612000,1582329772733883,0.335,9667.29,9667,0.25 -binance-futures,BTCUSDT,1582329772631000,1582329772752802,5.085,9667.29,9667,0.25 -binance-futures,BTCUSDT,1582329772659000,1582329772781813,4.75,9667.29,9667,0.25 -binance-futures,BTCUSDT,1582329772661000,1582329772781827,0.335,9667.2,9667,0.25 -binance-futures,BTCUSDT,1582329772679000,1582329772798277,4.185,9667.2,9667,0.25 -binance-futures,BTCUSDT,1582329772696000,1582329772817375,0.335,9667.2,9667,0.25 -binance-futures,BTCUSDT,1582329772703000,1582329772825249,0.335,9667.17,9667,0.25 -binance-futures,BTCUSDT,1582329772719000,1582329772839133,2,9668.49,9667,0.25 -binance-futures,BTCUSDT,1582329772727000,1582329772846882,0.335,9668.86,9667.01,1.9 -binance-futures,BTCUSDT,1582329772731000,1582329772851304,0.335,9668.2,9667.01,1.9 -binance-futures,BTCUSDT,1582329772739000,1582329772859686,0.606,9669.02,9667.01,1.9 -binance-futures,BTCUSDT,1582329772741000,1582329772861998,0.335,9668.89,9667.01,1.9 -binance-futures,BTCUSDT,1582329772746000,1582329772864681,12.35,9668.86,9667.01,1.9 -binance-futures,BTCUSDT,1582329772747000,1582329772867658,8.45,9668.2,9667.01,1.9 -binance-futures,BTCUSDT,1582329772768000,1582329772892758,10.7,9668.2,9667.19,0.1 -binance-futures,BTCUSDT,1582329772778000,1582329772899001,0.335,9668.07,9667.19,0.1 -binance-futures,BTCUSDT,1582329772799000,1582329772920996,9.485,9668.07,9667.19,0.1 -binance-futures,BTCUSDT,1582329772822000,1582329772943426,9.15,9668.07,9667.19,0.1 -binance-futures,BTCUSDT,1582329772828000,1582329772952333,0.335,9667.94,9667.19,0.1 -binance-futures,BTCUSDT,1582329772846000,1582329772966035,0.335,9667.94,9667.01,1.9 -binance-futures,BTCUSDT,1582329772851000,1582329772972717,9.035,9667.94,9667.01,1.9 -binance-futures,BTCUSDT,1582329772875000,1582329772996841,0.335,9667.82,9667.01,1.9 -binance-futures,BTCUSDT,1582329772895000,1582329773012933,8.285,9667.82,9667,0.25 -binance-futures,BTCUSDT,1582329772916000,1582329773039407,0.011,9667.8,9667,0.25 -binance-futures,BTCUSDT,1582329772918000,1582329773039425,0.335,9667.68,9667,0.25 -binance-futures,BTCUSDT,1582329772940000,1582329773059244,7.385,9667.68,9667,0.25 -binance-futures,BTCUSDT,1582329772963000,1582329773085633,0.011,9667.66,9667,0.25 -binance-futures,BTCUSDT,1582329772965000,1582329773088406,0.031,9667.64,9667,0.25 -binance-futures,BTCUSDT,1582329772967000,1582329773091709,0.335,9667.54,9667,0.25 -binance-futures,BTCUSDT,1582329772995000,1582329773117699,5.485,9667.54,9667,0.25 -binance-futures,BTCUSDT,1582329773020000,1582329773141765,0.011,9667.52,9667,0.25 -binance-futures,BTCUSDT,1582329773022000,1582329773141854,0.031,9667.5,9667,0.25 -binance-futures,BTCUSDT,1582329773023000,1582329773142746,0.335,9667.43,9667,0.25 -binance-futures,BTCUSDT,1582329773043000,1582329773162934,4.735,9667.43,9667,0.25 -binance-futures,BTCUSDT,1582329773066000,1582329773185834,0.031,9667.4,9667,0.25 -binance-futures,BTCUSDT,1582329773066000,1582329773188402,0.031,9667.39,9667,0.25 -binance-futures,BTCUSDT,1582329773068000,1582329773188513,0.335,9667.27,9667,0.25 -binance-futures,BTCUSDT,1582329773087000,1582329773208098,2.735,9667.27,9667,0.25 -binance-futures,BTCUSDT,1582329773097000,1582329773219317,0.335,9667.27,9667,0.25 -binance-futures,BTCUSDT,1582329773101000,1582329773222662,3.2,9667.39,9667,0.25 -binance-futures,BTCUSDT,1582329773106000,1582329773229687,0.335,9668.31,9667,0.25 -binance-futures,BTCUSDT,1582329773108000,1582329773229846,0.335,9667.35,9667,0.25 -binance-futures,BTCUSDT,1582329773111000,1582329773231543,2,9668.64,9667,0.25 -binance-futures,BTCUSDT,1582329773114000,1582329773232931,0.335,9667.18,9667,0.25 -binance-futures,BTCUSDT,1582329773131000,1582329773253745,0.031,9667.23,9667,0.25 -binance-futures,BTCUSDT,1582329773145000,1582329773269132,0.335,9668.5,9667,0.25 -binance-futures,BTCUSDT,1582329773156000,1582329773278814,0.3,9669.01,9667,0.25 -binance-futures,BTCUSDT,1582329773156000,1582329773278829,0.335,9668.27,9667,0.25 -binance-futures,BTCUSDT,1582329773162000,1582329773283274,0.003,9668.4,9667,0.25 -binance-futures,BTCUSDT,1582329773176000,1582329773302676,9.103,9668.4,9667,0.25 -binance-futures,BTCUSDT,1582329773180000,1582329773303173,8.25,9668.27,9667,0.25 -binance-futures,BTCUSDT,1582329773197000,1582329773314634,8.25,9668.27,9667.17,0.1 -binance-futures,BTCUSDT,1582329773209000,1582329773330649,0.011,9668.25,9667.17,0.1 -binance-futures,BTCUSDT,1582329773209000,1582329773331405,0.031,9668.23,9667.17,0.1 -binance-futures,BTCUSDT,1582329773219000,1582329773339745,0.335,9668.15,9667.17,0.1 -binance-futures,BTCUSDT,1582329773239000,1582329773358451,8.535,9668.15,9667.17,0.1 -binance-futures,BTCUSDT,1582329773260000,1582329773409633,8.2,9668.15,9667.17,0.1 -binance-futures,BTCUSDT,1582329773260000,1582329773410349,0.335,9667.98,9667.17,0.1 -binance-futures,BTCUSDT,1582329773276000,1582329773410435,0.335,9667.98,9667,0.25 -binance-futures,BTCUSDT,1582329773309000,1582329773431730,7.185,9667.98,9667,0.25 -binance-futures,BTCUSDT,1582329773333000,1582329773454151,6.85,9667.98,9667,0.25 -binance-futures,BTCUSDT,1582329773337000,1582329773459908,0.335,9667.89,9667,0.25 -binance-futures,BTCUSDT,1582329773358000,1582329773478305,6.035,9667.89,9667,0.25 -binance-futures,BTCUSDT,1582329773377000,1582329773497651,0.478,9667.88,9667,0.25 -binance-futures,BTCUSDT,1582329773381000,1582329773504038,0.031,9667.86,9667,0.25 -binance-futures,BTCUSDT,1582329773383000,1582329773505804,0.031,9667.85,9667,0.25 -binance-futures,BTCUSDT,1582329773387000,1582329773509367,0.335,9667.8,9667,0.25 -binance-futures,BTCUSDT,1582329773405000,1582329773526222,4.185,9667.8,9667,0.25 -binance-futures,BTCUSDT,1582329773429000,1582329773548456,3.85,9667.8,9667,0.25 -binance-futures,BTCUSDT,1582329773433000,1582329773552701,0.335,9667.67,9667,0.25 -binance-futures,BTCUSDT,1582329773452000,1582329773572529,3.485,9667.67,9667,0.25 -binance-futures,BTCUSDT,1582329773456000,1582329773578098,3.15,9667.67,9667,0.25 -binance-futures,BTCUSDT,1582329773464000,1582329773585088,0.031,9667.76,9667,0.25 -binance-futures,BTCUSDT,1582329773475000,1582329773595320,0.335,9667.78,9667,0.25 -binance-futures,BTCUSDT,1582329773479000,1582329773598765,0.335,9667.65,9667,0.25 -binance-futures,BTCUSDT,1582329773496000,1582329773616798,0.005,9667.88,9667,0.25 -binance-futures,BTCUSDT,1582329773500000,1582329773620796,5.35,9667.65,9667,0.25 -binance-futures,BTCUSDT,1582329773501000,1582329773621963,0.005,9667.64,9667,0.25 -binance-futures,BTCUSDT,1582329773520000,1582329773642261,8.505,9667.64,9667,0.25 -binance-futures,BTCUSDT,1582329773525000,1582329773648379,0.335,9667.61,9667,0.25 -binance-futures,BTCUSDT,1582329773547000,1582329773669112,9.285,9667.61,9667,0.25 -binance-futures,BTCUSDT,1582329773570000,1582329773692951,0.031,9667.57,9667,0.25 -binance-futures,BTCUSDT,1582329773576000,1582329773694963,0.335,9667.54,9667,0.25 -binance-futures,BTCUSDT,1582329773594000,1582329773717512,9.235,9667.54,9667,0.25 -binance-futures,BTCUSDT,1582329773619000,1582329773741945,8.9,9667.54,9667,0.25 -binance-futures,BTCUSDT,1582329773621000,1582329773743094,0.335,9667.45,9667,0.25 -binance-futures,BTCUSDT,1582329773642000,1582329773763545,8.435,9667.45,9667,0.25 -binance-futures,BTCUSDT,1582329773666000,1582329773788451,0.335,9667.4,9667,0.25 -binance-futures,BTCUSDT,1582329773686000,1582329773807886,7.135,9667.4,9667,0.25 -binance-futures,BTCUSDT,1582329773708000,1582329773828932,6.8,9667.4,9667,0.25 -binance-futures,BTCUSDT,1582329773710000,1582329773830801,0.031,9667.36,9667,0.25 -binance-futures,BTCUSDT,1582329773712000,1582329773832722,0.335,9667.34,9667,0.25 -binance-futures,BTCUSDT,1582329773732000,1582329773851526,7.635,9667.34,9667,0.25 -binance-futures,BTCUSDT,1582329773756000,1582329773875772,0.335,9667.24,9667,0.25 -binance-futures,BTCUSDT,1582329773774000,1582329773894481,6.485,9667.24,9667,0.25 -binance-futures,BTCUSDT,1582329773797000,1582329773918832,0.031,9667.2,9667,0.25 -binance-futures,BTCUSDT,1582329773799000,1582329773931321,0.031,9667.2,9666.98,1 -binance-futures,BTCUSDT,1582329773800000,1582329773931939,0.366,9667.2,9666.98,1 -binance-futures,BTCUSDT,1582329773817000,1582329773937747,7.066,9667.2,9666.98,1 -binance-futures,BTCUSDT,1582329773822000,1582329773943238,6.05,9667.19,9666.98,1 -binance-futures,BTCUSDT,1582329773834000,1582329773960041,2,9667.14,9666.98,1 -binance-futures,BTCUSDT,1582329773838000,1582329773961735,8,9667.14,9666.98,1 -binance-futures,BTCUSDT,1582329773856000,1582329773991095,6,9667.14,9666.98,1 -binance-futures,BTCUSDT,1582329773858000,1582329773991539,2,9667.08,9666.98,1 -binance-futures,BTCUSDT,1582329773874000,1582329773995283,8,9667.08,9666.98,1 -binance-futures,BTCUSDT,1582329773876000,1582329773997347,0.335,9667.05,9666.98,1 -binance-futures,BTCUSDT,1582329773882000,1582329774003009,0.335,9667.05,9666.96,0.012 -binance-futures,BTCUSDT,1582329773895000,1582329774017183,4,9667.02,9666.96,0.012 -binance-futures,BTCUSDT,1582329773913000,1582329774037330,10.05,9667.02,9666.96,0.012 -binance-futures,BTCUSDT,1582329773914000,1582329774037772,8.05,9667.02,9666.96,0.012 -binance-futures,BTCUSDT,1582329773918000,1582329774040837,2.031,9666.98,9666.96,0.012 -binance-futures,BTCUSDT,1582329773939000,1582329774060715,9.781,9666.98,9666.96,0.012 -binance-futures,BTCUSDT,1582329773946000,1582329774068635,0.335,9666.97,9666.96,0.012 -binance-futures,BTCUSDT,1582329773957000,1582329774078764,2.335,9666.97,9666.96,0.012 -binance-futures,BTCUSDT,1582329773962000,1582329774084772,6.335,9666.97,9666.96,0.012 -binance-futures,BTCUSDT,1582329773966000,1582329774088506,16.885,9666.97,9666.96,0.012 -binance-futures,BTCUSDT,1582329773968000,1582329774088519,14.885,9666.97,9666.96,0.012 -binance-futures,BTCUSDT,1582329773973000,1582329774094931,12.885,9666.97,9666.96,0.012 -binance-futures,BTCUSDT,1582329774009000,1582329774132391,2.335,9666.97,9666.96,0.012 -binance-futures,BTCUSDT,1582329774135000,1582329774260911,2.335,9666.97,9666.96,0.003 -binance-futures,BTCUSDT,1582329774150000,1582329774270237,6.785,9666.97,9666.96,0.003 -binance-futures,BTCUSDT,1582329774190000,1582329774310560,2.335,9666.97,9666.96,0.003 -binance-futures,BTCUSDT,1582329774258000,1582329774378723,0.335,9666.97,9666.96,0.003 -binance-futures,BTCUSDT,1582329774281000,1582329774400627,0.003,9668.23,9666.96,0.003 -binance-futures,BTCUSDT,1582329774287000,1582329774406786,0.005,9666.97,9666.96,0.003 -binance-futures,BTCUSDT,1582329774303000,1582329774434595,2.955,9666.97,9666.96,0.003 -binance-futures,BTCUSDT,1582329774330000,1582329774469181,0.005,9666.97,9666.96,0.003 -binance-futures,BTCUSDT,1582329774341000,1582329774470544,0.34,9666.97,9666.96,0.003 -binance-futures,BTCUSDT,1582329774375000,1582329774496658,0.005,9666.97,9666.96,0.003 -binance-futures,BTCUSDT,1582329774385000,1582329774504640,0.34,9666.97,9666.96,0.003 -binance-futures,BTCUSDT,1582329774395000,1582329774519975,0.005,9666.97,9666.96,0.003 -binance-futures,BTCUSDT,1582329774417000,1582329774535797,0.34,9666.97,9666.96,0.003 -binance-futures,BTCUSDT,1582329774423000,1582329774541537,0.005,9666.97,9666.96,0.003 -binance-futures,BTCUSDT,1582329775204000,1582329775324879,0.335,9667.85,9666.96,0.003 -binance-futures,BTCUSDT,1582329775225000,1582329775346679,0.478,9667.91,9666.96,0.003 -binance-futures,BTCUSDT,1582329775251000,1582329775373117,0.97,9668.14,9666.96,0.003 -binance-futures,BTCUSDT,1582329775255000,1582329775375808,0.335,9667.87,9666.96,0.003 -binance-futures,BTCUSDT,1582329775272000,1582329775421869,7.785,9667.87,9666.96,0.003 -binance-futures,BTCUSDT,1582329775328000,1582329775447084,7.45,9667.87,9666.96,0.003 -binance-futures,BTCUSDT,1582329775330000,1582329775449653,0.335,9667.81,9666.96,0.003 -binance-futures,BTCUSDT,1582329775348000,1582329775466678,8.185,9667.81,9666.96,0.003 -binance-futures,BTCUSDT,1582329775372000,1582329775492785,7.85,9667.81,9666.96,0.003 -binance-futures,BTCUSDT,1582329775372000,1582329775492818,0.335,9667.73,9666.96,0.003 -binance-futures,BTCUSDT,1582329775390000,1582329775509515,10.135,9667.73,9666.96,0.003 -binance-futures,BTCUSDT,1582329775394000,1582329775515320,0.031,9667.69,9666.96,0.003 -binance-futures,BTCUSDT,1582329775413000,1582329775532853,0.335,9667.45,9666.96,0.003 -binance-futures,BTCUSDT,1582329775430000,1582329775549931,9.935,9667.45,9666.96,0.003 -binance-futures,BTCUSDT,1582329775435000,1582329775555519,9.6,9667.45,9666.96,0.003 -binance-futures,BTCUSDT,1582329775441000,1582329775558783,0.005,9667.44,9666.96,0.003 -binance-futures,BTCUSDT,1582329775455000,1582329775573544,0.335,9667.43,9666.96,0.003 -binance-futures,BTCUSDT,1582329775462000,1582329775581293,0.031,9667.4,9666.96,0.003 -binance-futures,BTCUSDT,1582329775477000,1582329775597661,8.781,9667.4,9666.96,0.003 -binance-futures,BTCUSDT,1582329775496000,1582329775615138,8.75,9667.4,9666.96,0.003 -binance-futures,BTCUSDT,1582329775500000,1582329775619642,0.335,9667.36,9666.96,0.003 -binance-futures,BTCUSDT,1582329775518000,1582329775637323,7.716,9667.36,9666.96,0.003 -binance-futures,BTCUSDT,1582329775535000,1582329775655160,7.381,9667.36,9666.96,0.003 -binance-futures,BTCUSDT,1582329775548000,1582329775665822,0.335,9667.35,9666.96,0.003 -binance-futures,BTCUSDT,1582329775558000,1582329775678024,0.34,9667.35,9666.96,0.003 -binance-futures,BTCUSDT,1582329775563000,1582329775682184,7.19,9667.35,9666.96,0.003 -binance-futures,BTCUSDT,1582329775565000,1582329775684342,6.855,9667.35,9666.96,0.003 -binance-futures,BTCUSDT,1582329775684000,1582329775804498,0.005,9667.35,9666.96,0.003 -binance-futures,BTCUSDT,1582329775689000,1582329775809515,0.335,9667.34,9666.96,0.003 -binance-futures,BTCUSDT,1582329775709000,1582329775826984,4.85,9667.34,9666.96,0.003 -binance-futures,BTCUSDT,1582329775796000,1582329775918654,0.005,9667.33,9666.96,0.003 -binance-futures,BTCUSDT,1582329775816000,1582329775933375,5.505,9667.33,9666.96,0.003 -binance-futures,BTCUSDT,1582329775822000,1582329775942716,0.335,9667.19,9666.96,0.003 -binance-futures,BTCUSDT,1582329775838000,1582329775956348,5.485,9667.19,9666.96,0.003 -binance-futures,BTCUSDT,1582329775854000,1582329775973158,5.15,9667.19,9666.96,0.003 -binance-futures,BTCUSDT,1582329775873000,1582329775994692,0.335,9667.25,9666.96,0.003 -binance-futures,BTCUSDT,1582329775877000,1582329776000991,0.335,9667.18,9666.96,0.003 -binance-futures,BTCUSDT,1582329775878000,1582329776001307,0.335,9667.25,9666.96,0.003 -binance-futures,BTCUSDT,1582329775880000,1582329776001322,0.005,9667.33,9666.96,0.003 -binance-futures,BTCUSDT,1582329775897000,1582329776015554,3.25,9667.18,9666.96,0.003 -binance-futures,BTCUSDT,1582329775998000,1582329776117060,0.005,9667.24,9666.96,0.003 -binance-futures,BTCUSDT,1582329776166000,1582329776287511,0.005,9667.24,9667.23,0.1 -binance-futures,BTCUSDT,1582329776561000,1582329776681873,0.005,9667.24,9667.23,0.53 -binance-futures,BTCUSDT,1582329776566000,1582329776691116,0.005,9667.24,9667.23,0.1 -binance-futures,BTCUSDT,1582329777190000,1582329777328799,0.005,9667.24,9667.23,0.084 -binance-futures,BTCUSDT,1582329778150000,1582329778272066,0.005,9667.24,9667.23,0.083 -binance-futures,BTCUSDT,1582329778287000,1582329778412443,0.335,9668.71,9667.23,0.083 -binance-futures,BTCUSDT,1582329778304000,1582329778425519,0.335,9668.71,9667.24,4.5 -binance-futures,BTCUSDT,1582329778310000,1582329778431909,5.635,9668.71,9667.24,4.5 -binance-futures,BTCUSDT,1582329778321000,1582329778441633,5.3,9668.71,9667.24,4.5 -binance-futures,BTCUSDT,1582329778323000,1582329778444242,5.3,9668.71,9667.24,7.8 -binance-futures,BTCUSDT,1582329778325000,1582329778450204,1.081,9668.74,9667.24,7.8 -binance-futures,BTCUSDT,1582329778331000,1582329778458388,1.081,9668.74,9667.33,0.445 -binance-futures,BTCUSDT,1582329778338000,1582329778460453,0.335,9668.7,9667.33,0.445 -binance-futures,BTCUSDT,1582329778345000,1582329778466594,0.335,9668.7,9667.24,4.5 -binance-futures,BTCUSDT,1582329778357000,1582329778480466,0.335,9668.7,9667.33,5.75 -binance-futures,BTCUSDT,1582329778357000,1582329778483771,4.085,9668.7,9667.33,5.75 -binance-futures,BTCUSDT,1582329778362000,1582329778486683,4.085,9668.7,9667.37,0.031 -binance-futures,BTCUSDT,1582329778364000,1582329778486709,3.75,9668.7,9667.37,0.031 -binance-futures,BTCUSDT,1582329778378000,1582329778498406,0.335,9668.73,9667.37,0.031 -binance-futures,BTCUSDT,1582329778380000,1582329778505473,0.335,9668.73,9667.33,5.75 -binance-futures,BTCUSDT,1582329778384000,1582329778511725,0.335,9668.73,9667.37,5.45 -binance-futures,BTCUSDT,1582329778388000,1582329778513753,1.081,9668.74,9667.37,5.45 -binance-futures,BTCUSDT,1582329778390000,1582329778516385,0.335,9668.66,9667.37,5.45 -binance-futures,BTCUSDT,1582329778392000,1582329778516754,0.005,9668.69,9667.37,5.45 -binance-futures,BTCUSDT,1582329778414000,1582329778538249,3.205,9668.69,9667.37,5.45 -binance-futures,BTCUSDT,1582329778414000,1582329778538288,2.75,9668.66,9667.41,0.031 -binance-futures,BTCUSDT,1582329778436000,1582329778558627,5.8,9668.66,9667.41,2.431 -binance-futures,BTCUSDT,1582329778444000,1582329778565092,5.8,9668.66,9667.41,2.4 -binance-futures,BTCUSDT,1582329778452000,1582329778577861,0.335,9668.61,9667.41,2.4 -binance-futures,BTCUSDT,1582329778454000,1582329778577903,0.335,9668.61,9666.96,0.003 -binance-futures,BTCUSDT,1582329778461000,1582329778582178,0.335,9668.61,9667.44,0.031 -binance-futures,BTCUSDT,1582329778462000,1582329778585623,0.335,9668.61,9667.45,0.031 -binance-futures,BTCUSDT,1582329778478000,1582329778600469,4.535,9668.61,9667.45,0.031 -binance-futures,BTCUSDT,1582329778480000,1582329778602890,4.535,9668.61,9667.34,0.437 -binance-futures,BTCUSDT,1582329778491000,1582329778611436,0.005,9668.6,9667.34,0.437 -binance-futures,BTCUSDT,1582329778497000,1582329778621119,0.005,9668.6,9666.96,0.003 -binance-futures,BTCUSDT,1582329778505000,1582329778625698,0.335,9668.55,9666.96,0.003 -binance-futures,BTCUSDT,1582329778523000,1582329778643732,6.135,9668.55,9666.96,0.003 -binance-futures,BTCUSDT,1582329778546000,1582329778666207,5.8,9668.55,9666.96,0.003 -binance-futures,BTCUSDT,1582329778548000,1582329778669025,0.335,9668.48,9666.96,0.003 -binance-futures,BTCUSDT,1582329778552000,1582329778674715,1.902,9668.23,9666.96,0.003 -binance-futures,BTCUSDT,1582329778569000,1582329778691528,5.135,9668.48,9666.96,0.003 -binance-futures,BTCUSDT,1582329778573000,1582329778696514,2.4,9668.23,9666.96,0.003 -binance-futures,BTCUSDT,1582329778579000,1582329778701703,0.335,9668.19,9666.96,0.003 -binance-futures,BTCUSDT,1582329778603000,1582329778738599,3.435,9668.19,9666.96,0.003 -binance-futures,BTCUSDT,1582329778607000,1582329778742020,3.1,9668.19,9666.96,0.003 -binance-futures,BTCUSDT,1582329778631000,1582329778752422,0.005,9668.22,9666.96,0.003 -binance-futures,BTCUSDT,1582329778639000,1582329778769082,0.005,9668.22,9666.84,0.422 -binance-futures,BTCUSDT,1582329778648000,1582329778771935,0.335,9668.11,9666.84,0.422 -binance-futures,BTCUSDT,1582329778654000,1582329778779397,0.005,9668.22,9666.84,0.422 -binance-futures,BTCUSDT,1582329778664000,1582329778784325,3.75,9668.21,9666.84,0.422 -binance-futures,BTCUSDT,1582329778670000,1582329778789948,3.75,9668.21,9666.85,0.445 -binance-futures,BTCUSDT,1582329778672000,1582329778798176,3.75,9668.21,9666.96,0.67 -binance-futures,BTCUSDT,1582329778676000,1582329778800894,3.75,9668.21,9666.96,1.38 -binance-futures,BTCUSDT,1582329778679000,1582329778802053,3.75,9668.21,9666.96,2.05 -binance-futures,BTCUSDT,1582329778688000,1582329778810214,0.335,9668.2,9666.96,2.05 -binance-futures,BTCUSDT,1582329778696000,1582329778819680,0.335,9668.2,9666.96,4.75 -binance-futures,BTCUSDT,1582329778698000,1582329778822179,0.34,9668.2,9666.96,4.75 -binance-futures,BTCUSDT,1582329778702000,1582329778825675,0.34,9668.2,9666.96,4.08 -binance-futures,BTCUSDT,1582329778702000,1582329778826458,0.34,9668.2,9667,0.031 -binance-futures,BTCUSDT,1582329778718000,1582329778841599,0.005,9668.2,9667,0.031 -binance-futures,BTCUSDT,1582329778722000,1582329778846141,0.005,9668.2,9667,8.131 -binance-futures,BTCUSDT,1582329778728000,1582329778852401,0.005,9668.2,9667,8.1 -binance-futures,BTCUSDT,1582329778749000,1582329778874517,0.005,9668.2,9667.04,0.031 -binance-futures,BTCUSDT,1582329778753000,1582329778874717,0.005,9668.2,9667.05,0.445 -binance-futures,BTCUSDT,1582329778773000,1582329778895188,0.005,9668.2,9667.05,9.645 -binance-futures,BTCUSDT,1582329778795000,1582329778916086,0.005,9668.2,9667.08,0.031 -binance-futures,BTCUSDT,1582329778797000,1582329778917907,0.005,9668.2,9667.09,0.031 -binance-futures,BTCUSDT,1582329778797000,1582329778917917,0.005,9668.2,9667.14,0.445 -binance-futures,BTCUSDT,1582329778819000,1582329778939874,0.005,9668.2,9667.14,9.945 -binance-futures,BTCUSDT,1582329778843000,1582329778967701,0.005,9668.2,9667.18,0.031 -binance-futures,BTCUSDT,1582329778845000,1582329778967747,0.005,9668.2,9667.24,0.445 -binance-futures,BTCUSDT,1582329778864000,1582329778985848,0.005,9668.2,9667.24,9.495 -binance-futures,BTCUSDT,1582329778890000,1582329779013037,0.005,9668.2,9667.27,0.031 -binance-futures,BTCUSDT,1582329778892000,1582329779014374,0.005,9668.2,9667.36,0.444 -binance-futures,BTCUSDT,1582329778914000,1582329779035209,0.005,9668.2,9667.36,7.394 -binance-futures,BTCUSDT,1582329778939000,1582329779059667,0.005,9668.2,9667.39,0.031 -binance-futures,BTCUSDT,1582329778939000,1582329779062347,0.005,9668.2,9667.4,0.031 -binance-futures,BTCUSDT,1582329778976000,1582329779093520,0.005,9668.2,9667.4,6.181 -binance-futures,BTCUSDT,1582329778996000,1582329779118200,0.005,9668.2,9667.42,0.031 -binance-futures,BTCUSDT,1582329778998000,1582329779119257,0.005,9668.2,9667.44,0.031 -binance-futures,BTCUSDT,1582329779016000,1582329779140239,0.005,9668.2,9667.44,5.831 -binance-futures,BTCUSDT,1582329779024000,1582329779148514,0.005,9668.2,9667.45,0.67 -binance-futures,BTCUSDT,1582329779037000,1582329779158031,0.005,9668.2,9667.45,1.1 -binance-futures,BTCUSDT,1582329779045000,1582329779167622,0.005,9668.2,9667.48,0.031 -binance-futures,BTCUSDT,1582329779056000,1582329779177695,0.005,9668.2,9667.52,0.437 -binance-futures,BTCUSDT,1582329779076000,1582329779202344,0.005,9668.2,9667.52,6.087 -binance-futures,BTCUSDT,1582329779105000,1582329779228867,0.005,9668.2,9667.54,0.031 -binance-futures,BTCUSDT,1582329779107000,1582329779229790,0.005,9668.2,9667.56,0.031 -binance-futures,BTCUSDT,1582329779107000,1582329779231350,0.005,9668.2,9667.58,0.445 -binance-futures,BTCUSDT,1582329779113000,1582329779234153,0.005,9668.2,9667.56,0.031 -binance-futures,BTCUSDT,1582329779196000,1582329779317920,0.005,9668.2,9667.56,0.475 -binance-futures,BTCUSDT,1582329779204000,1582329779325359,0.005,9668.2,9667.59,0.031 -binance-futures,BTCUSDT,1582329779247000,1582329779371301,0.005,9668.2,9667.61,0.437 -binance-futures,BTCUSDT,1582329779271000,1582329779397347,0.005,9668.2,9667.65,0.031 -binance-futures,BTCUSDT,1582329779345000,1582329779469728,0.335,9668.06,9667.65,0.031 -binance-futures,BTCUSDT,1582329779348000,1582329779471693,0.005,9668.2,9667.65,0.031 -binance-futures,BTCUSDT,1582329779368000,1582329779494203,0.005,9668.2,9667.66,0.031 -binance-futures,BTCUSDT,1582329779373000,1582329779498719,1.423,9668.22,9667.66,0.031 -binance-futures,BTCUSDT,1582329779397000,1582329779520264,1.423,9668.22,9667.7,2 -binance-futures,BTCUSDT,1582329779421000,1582329779546258,1.423,9668.22,9667.73,0.031 -binance-futures,BTCUSDT,1582329779423000,1582329779552211,1.423,9668.22,9667.74,0.031 -binance-futures,BTCUSDT,1582329779444000,1582329779565377,1.423,9668.22,9667.78,4 -binance-futures,BTCUSDT,1582329779446000,1582329779570347,1.423,9668.22,9667.78,8 -binance-futures,BTCUSDT,1582329779448000,1582329779571885,1.423,9668.22,9667.78,12 -binance-futures,BTCUSDT,1582329779448000,1582329779572094,1.423,9668.22,9667.78,14 -binance-futures,BTCUSDT,1582329779464000,1582329779592995,1.423,9668.22,9667.84,10 -binance-futures,BTCUSDT,1582329779464000,1582329779593242,1.423,9668.22,9667.84,12 -binance-futures,BTCUSDT,1582329779474000,1582329779598468,1.423,9668.22,9668.21,0.083 -binance-futures,BTCUSDT,1582329779497000,1582329779626842,1.423,9668.22,9668.21,2.583 -binance-futures,BTCUSDT,1582329779501000,1582329779631372,0.773,9668.22,9668.21,2.583 -binance-futures,BTCUSDT,1582329779515000,1582329779642945,0.773,9668.22,9668.21,0.083 -binance-futures,BTCUSDT,1582329779528000,1582329779653721,0.773,9668.22,9668.21,3.783 -binance-futures,BTCUSDT,1582329779535000,1582329779661037,0.773,9668.22,9668.21,5.773 -binance-futures,BTCUSDT,1582329779551000,1582329779674531,0.773,9668.22,9668.21,2.073 -binance-futures,BTCUSDT,1582329779562000,1582329779686764,0.773,9668.22,9668.21,2.512 -binance-futures,BTCUSDT,1582329779589000,1582329779713099,0.773,9668.22,9668.21,3.512 -binance-futures,BTCUSDT,1582329779605000,1582329779728058,1.081,9668.74,9668.22,1.227 -binance-futures,BTCUSDT,1582329779625000,1582329779744692,1.081,9668.74,9668.25,0.031 -binance-futures,BTCUSDT,1582329779625000,1582329779744699,1.081,9668.74,9668.26,2 -binance-futures,BTCUSDT,1582329779627000,1582329779749716,1.081,9668.74,9668.26,4 -binance-futures,BTCUSDT,1582329779636000,1582329779758241,1.081,9668.74,9668.27,0.445 -binance-futures,BTCUSDT,1582329779643000,1582329779774166,1.081,9668.74,9668.31,8 -binance-futures,BTCUSDT,1582329779647000,1582329779775448,0.5,9669.45,9668.74,0.919 -binance-futures,BTCUSDT,1582329779649000,1582329779776000,0.5,9669.45,9668.74,2.919 -binance-futures,BTCUSDT,1582329779671000,1582329779794137,0.5,9669.45,9668.74,17.169 -binance-futures,BTCUSDT,1582329779674000,1582329779800501,0.5,9669.45,9668.78,2 -binance-futures,BTCUSDT,1582329779678000,1582329779804681,0.5,9669.45,9668.78,4 -binance-futures,BTCUSDT,1582329779680000,1582329779804723,0.5,9669.45,9668.91,0.65 -binance-futures,BTCUSDT,1582329779682000,1582329779804757,1.059,9669.43,9668.91,0.65 -binance-futures,BTCUSDT,1582329779684000,1582329779806665,0.1,9668.93,9668.91,0.65 -binance-futures,BTCUSDT,1582329779703000,1582329779828960,0.1,9668.93,9668.91,13.9 -binance-futures,BTCUSDT,1582329779703000,1582329779829183,0.1,9668.93,9668.91,13.25 -binance-futures,BTCUSDT,1582329779704000,1582329779830701,0.1,9668.93,9668.92,4 -binance-futures,BTCUSDT,1582329779707000,1582329779830729,0.1,9668.93,9668.92,5 -binance-futures,BTCUSDT,1582329779707000,1582329779833833,0.1,9668.93,9668.92,13 -binance-futures,BTCUSDT,1582329779719000,1582329779840634,0.1,9668.93,9668.92,14 -binance-futures,BTCUSDT,1582329779729000,1582329779855896,0.1,9668.93,9668.92,25.15 -binance-futures,BTCUSDT,1582329779740000,1582329779862529,0.1,9668.93,9668.92,14 -binance-futures,BTCUSDT,1582329779754000,1582329779875053,1.059,9669.43,9668.92,14 -binance-futures,BTCUSDT,1582329779762000,1582329779887670,1.059,9669.43,9669.01,0.445 -binance-futures,BTCUSDT,1582329779784000,1582329779907975,1.059,9669.43,9669.07,2 -binance-futures,BTCUSDT,1582329779786000,1582329779912862,1.059,9669.43,9669.07,6 -binance-futures,BTCUSDT,1582329779786000,1582329779913279,0.005,9669.42,9669.07,10 -binance-futures,BTCUSDT,1582329779805000,1582329779926386,0.005,9669.42,9669.13,4 -binance-futures,BTCUSDT,1582329779807000,1582329779934422,0.005,9669.42,9669.13,8 -binance-futures,BTCUSDT,1582329779812000,1582329779938427,0.005,9669.42,9669.15,0.445 -binance-futures,BTCUSDT,1582329779825000,1582329779950438,0.005,9669.42,9669.19,4 -binance-futures,BTCUSDT,1582329779827000,1582329779950919,0.005,9669.42,9669.19,6 -binance-futures,BTCUSDT,1582329779827000,1582329779951860,0.005,9669.42,9669.19,8 -binance-futures,BTCUSDT,1582329779850000,1582329779974315,0.005,9669.42,9669.25,2 -binance-futures,BTCUSDT,1582329779851000,1582329779978679,0.005,9669.42,9669.25,8 -binance-futures,BTCUSDT,1582329779855000,1582329779979413,0.005,9669.42,9669.31,0.445 -binance-futures,BTCUSDT,1582329779875000,1582329779998657,0.005,9669.42,9669.31,8.095 -binance-futures,BTCUSDT,1582329779892000,1582329780018960,0.005,9669.42,9669.39,1 -binance-futures,BTCUSDT,1582329779894000,1582329780019011,0.005,9669.42,9669.41,1 -binance-futures,BTCUSDT,1582329779902000,1582329780028369,0.005,9669.42,9669.41,1.445 -binance-futures,BTCUSDT,1582329779915000,1582329780036993,0.005,9669.42,9669.41,8.545 -binance-futures,BTCUSDT,1582329779937000,1582329780057858,0.005,9669.42,9669.41,8.628 -binance-futures,BTCUSDT,1582329779948000,1582329780069396,0.005,9669.42,9669.41,9.298 -binance-futures,BTCUSDT,1582329779955000,1582329780080542,0.005,9669.42,9669.41,2.198 -binance-futures,BTCUSDT,1582329780005000,1582329780129573,0.005,9669.42,9669.41,2.868 -binance-futures,BTCUSDT,1582329780046000,1582329780168478,0.005,9669.42,9669.41,3.868 -binance-futures,BTCUSDT,1582329780048000,1582329780171834,0.005,9669.42,9669.41,4.538 -binance-futures,BTCUSDT,1582329780067000,1582329780189553,0.005,9669.42,9669.41,4.56 -binance-futures,BTCUSDT,1582329780134000,1582329780269603,3.19,9669.42,9669.41,4.56 -binance-futures,BTCUSDT,1582329780149000,1582329780285657,3.19,9669.42,9669.41,4.6 -binance-futures,BTCUSDT,1582329780171000,1582329780294504,3.19,9669.42,9669.41,3.6 -binance-futures,BTCUSDT,1582329780171000,1582329780295181,3.19,9669.42,9669.41,3.578 -binance-futures,BTCUSDT,1582329780177000,1582329780303782,3.19,9669.42,9669.41,3.305 -binance-futures,BTCUSDT,1582329780460000,1582329780584736,3.185,9669.42,9669.41,3.305 -binance-futures,BTCUSDT,1582329780918000,1582329781041694,3.175,9669.42,9669.41,3.305 -binance-futures,BTCUSDT,1582329780938000,1582329781059753,3.175,9669.42,9669.41,6.755 -binance-futures,BTCUSDT,1582329780949000,1582329781072227,3.175,9669.42,9669.41,3.305 -binance-futures,BTCUSDT,1582329781646000,1582329781771146,3.175,9669.42,9669.41,2.86 -binance-futures,BTCUSDT,1582329781720000,1582329781843538,3.175,9669.42,9669.41,2.777 -binance-futures,BTCUSDT,1582329781952000,1582329782075334,3.51,9669.42,9669.41,2.777 -binance-futures,BTCUSDT,1582329781956000,1582329782079734,3.51,9669.42,9669.41,2.86 -binance-futures,BTCUSDT,1582329781961000,1582329782084301,3.175,9669.42,9669.41,2.86 -binance-futures,BTCUSDT,1582329782072000,1582329782196800,3.175,9669.42,9669.41,3.291 -binance-futures,BTCUSDT,1582329782093000,1582329782216361,3.175,9669.42,9669.41,2.86 -binance-futures,BTCUSDT,1582329782110000,1582329782232030,3.175,9669.42,9669.41,3.291 -binance-futures,BTCUSDT,1582329782181000,1582329782307536,3.175,9669.42,9669.41,3.121 -binance-futures,BTCUSDT,1582329782270000,1582329782392458,3.175,9669.42,9669.41,2.69 -binance-futures,BTCUSDT,1582329782387000,1582329782508909,3.175,9669.42,9669.41,4.68 -binance-futures,BTCUSDT,1582329782405000,1582329782527663,3.175,9669.42,9669.41,4.58 -binance-futures,BTCUSDT,1582329782523000,1582329782645247,3.175,9669.42,9669.41,5.025 -binance-futures,BTCUSDT,1582329782557000,1582329782678824,3.175,9669.42,9669.41,4.58 -binance-futures,BTCUSDT,1582329782726000,1582329782850447,3.165,9669.42,9669.41,4.58 -binance-futures,BTCUSDT,1582329782747000,1582329782869825,3.165,9669.42,9669.41,10.53 -binance-futures,BTCUSDT,1582329782813000,1582329782935979,3.165,9669.42,9669.41,4.58 -binance-futures,BTCUSDT,1582329782857000,1582329782978506,3.165,9669.42,9669.41,5.025 -binance-futures,BTCUSDT,1582329782867000,1582329782985712,3.165,9669.42,9669.41,4.58 -binance-futures,BTCUSDT,1582329783291000,1582329783411465,3.165,9669.42,9669.41,5.025 -binance-futures,BTCUSDT,1582329783476000,1582329783596519,3.165,9669.42,9669.41,4.58 -binance-futures,BTCUSDT,1582329783574000,1582329783694691,3.5,9669.42,9669.41,4.58 -binance-futures,BTCUSDT,1582329783578000,1582329783699101,3.165,9669.42,9669.41,4.58 -binance-futures,BTCUSDT,1582329783806000,1582329783926604,3.165,9669.42,9669.41,2.59 -binance-futures,BTCUSDT,1582329784049000,1582329784169060,3.065,9669.42,9669.41,2.59 -binance-futures,BTCUSDT,1582329784067000,1582329784186910,3.065,9669.42,9669.41,7.39 -binance-futures,BTCUSDT,1582329784140000,1582329784264030,3.065,9669.42,9669.41,2.59 -binance-futures,BTCUSDT,1582329784478000,1582329784603770,3.299,9670.27,9669.41,2.59 -binance-futures,BTCUSDT,1582329784528000,1582329784648782,3.299,9670.27,9669.55,0.445 -binance-futures,BTCUSDT,1582329784545000,1582329784667957,3.299,9670.27,9669.55,2.895 -binance-futures,BTCUSDT,1582329784547000,1582329784670008,3.299,9670.27,9669.55,2.45 -binance-futures,BTCUSDT,1582329784563000,1582329784684927,3.299,9670.27,9669.55,3.12 -binance-futures,BTCUSDT,1582329784565000,1582329784686952,3.299,9670.27,9669.55,3.79 -binance-futures,BTCUSDT,1582329784570000,1582329784693244,3.299,9670.27,9669.59,0.031 -binance-futures,BTCUSDT,1582329784591000,1582329784713496,3.299,9670.27,9669.59,4.381 -binance-futures,BTCUSDT,1582329784617000,1582329784737959,3.299,9670.27,9669.6,0.439 -binance-futures,BTCUSDT,1582329784621000,1582329784742499,3.299,9670.27,9669.63,0.031 -binance-futures,BTCUSDT,1582329784640000,1582329784759465,3.299,9670.27,9669.63,6.831 -binance-futures,BTCUSDT,1582329784646000,1582329784768635,3.299,9670.27,9669.63,7.276 -binance-futures,BTCUSDT,1582329784652000,1582329784773916,3.299,9670.27,9669.7,0.445 -binance-futures,BTCUSDT,1582329784671000,1582329784793947,3.299,9670.27,9669.7,8.395 -binance-futures,BTCUSDT,1582329784675000,1582329784796607,3.299,9670.27,9669.71,0.67 -binance-futures,BTCUSDT,1582329784696000,1582329784816258,3.299,9670.27,9669.71,8.97 -binance-futures,BTCUSDT,1582329784703000,1582329784825061,3.299,9670.27,9669.75,0.436 -binance-futures,BTCUSDT,1582329784719000,1582329784839961,3.299,9670.27,9670.26,0.083 -binance-futures,BTCUSDT,1582329784737000,1582329784857633,3.299,9670.27,9670.26,3.283 -binance-futures,BTCUSDT,1582329784769000,1582329784890986,3.299,9670.27,9670.26,3.953 -binance-futures,BTCUSDT,1582329784780000,1582329784902164,3.299,9670.27,9670.26,0.753 -binance-futures,BTCUSDT,1582329784788000,1582329784909192,3.634,9670.27,9670.26,0.753 -binance-futures,BTCUSDT,1582329784800000,1582329784920902,3.634,9670.27,9670.26,1.423 -binance-futures,BTCUSDT,1582329784814000,1582329784934709,3.634,9670.27,9670.26,2.093 -binance-futures,BTCUSDT,1582329784822000,1582329784943771,3.634,9670.27,9670.26,2.133 -binance-futures,BTCUSDT,1582329784826000,1582329784945952,3.634,9670.27,9670.26,2.05 -binance-futures,BTCUSDT,1582329784956000,1582329785076609,3.651,9670.27,9670.26,2.05 -binance-futures,BTCUSDT,1582329785330000,1582329785449601,3.316,9670.27,9670.26,2.05 -binance-futures,BTCUSDT,1582329785356000,1582329785475334,3.316,9670.27,9670.26,2.495 -binance-futures,BTCUSDT,1582329785358000,1582329785478856,3.316,9670.27,9670.26,2.05 -binance-futures,BTCUSDT,1582329785368000,1582329785493709,3.216,9670.27,9670.26,2.05 -binance-futures,BTCUSDT,1582329785387000,1582329785506985,3.216,9670.27,9670.26,4.65 -binance-futures,BTCUSDT,1582329785425000,1582329785543246,3.216,9670.27,9670.26,5.095 -binance-futures,BTCUSDT,1582329785426000,1582329785545539,3.216,9670.27,9670.26,2.495 -binance-futures,BTCUSDT,1582329785529000,1582329785649466,3.216,9670.27,9670.26,2.05 -binance-futures,BTCUSDT,1582329785602000,1582329785727128,3.154,9670.27,9670.26,2.05 -binance-futures,BTCUSDT,1582329785645000,1582329785764617,3.137,9670.27,9670.26,2.05 -binance-futures,BTCUSDT,1582329785740000,1582329785860862,3.137,9670.27,9670.26,2.483 -binance-futures,BTCUSDT,1582329785850000,1582329785970679,3.137,9670.27,9670.26,2.05 -binance-futures,BTCUSDT,1582329785908000,1582329786028126,3.154,9670.27,9670.26,2.05 -binance-futures,BTCUSDT,1582329785966000,1582329786086864,3.137,9670.27,9670.26,2.05 -binance-futures,BTCUSDT,1582329786130000,1582329786250079,3.137,9670.27,9670.26,2.495 -binance-futures,BTCUSDT,1582329786156000,1582329786277133,3.137,9670.27,9670.26,2.05 -binance-futures,BTCUSDT,1582329786389000,1582329786513843,3.154,9670.27,9670.26,2.05 -binance-futures,BTCUSDT,1582329786414000,1582329786536394,3.154,9670.27,9670.26,1.38 -binance-futures,BTCUSDT,1582329786415000,1582329786538811,3.154,9670.27,9670.26,0.04 -binance-futures,BTCUSDT,1582329786417000,1582329786539266,3.154,9670.27,9669.16,0.445 -binance-futures,BTCUSDT,1582329786431000,1582329786549674,3.154,9670.27,9669.93,0.445 -binance-futures,BTCUSDT,1582329786440000,1582329786580892,3.154,9670.27,9667.9,0.089 -binance-futures,BTCUSDT,1582329786462000,1582329786590382,3.154,9670.27,9668.31,0.445 -binance-futures,BTCUSDT,1582329786476000,1582329786598470,3.154,9670.27,9667.9,0.089 -binance-futures,BTCUSDT,1582329786481000,1582329786607264,3.154,9670.27,9667.91,0.04 -binance-futures,BTCUSDT,1582329786483000,1582329786607311,3.154,9670.27,9667.94,0.031 -binance-futures,BTCUSDT,1582329786488000,1582329786609696,3.154,9670.27,9668.31,10.35 -binance-futures,BTCUSDT,1582329786488000,1582329786609703,3.137,9670.27,9668.31,10.35 -binance-futures,BTCUSDT,1582329786492000,1582329786613680,3.137,9670.27,9668.32,0.67 -binance-futures,BTCUSDT,1582329786499000,1582329786624060,3.137,9670.27,9668.32,0.71 -binance-futures,BTCUSDT,1582329786505000,1582329786628970,3.137,9670.27,9668.32,2.05 -binance-futures,BTCUSDT,1582329786515000,1582329786639786,3.137,9670.27,9668.32,15.3 -binance-futures,BTCUSDT,1582329786517000,1582329786639812,3.137,9670.27,9668.42,0.445 -binance-futures,BTCUSDT,1582329786537000,1582329786657830,3.137,9670.27,9668.42,16.095 -binance-futures,BTCUSDT,1582329786553000,1582329786673760,3.137,9670.27,9668.78,0.022 -binance-futures,BTCUSDT,1582329786573000,1582329786697985,3.137,9670.27,9668.78,12.172 -binance-futures,BTCUSDT,1582329786575000,1582329786698164,3.137,9670.27,9668.81,0.031 -binance-futures,BTCUSDT,1582329786577000,1582329786700354,3.137,9670.27,9668.82,0.031 -binance-futures,BTCUSDT,1582329786599000,1582329786720922,3.137,9670.27,9668.82,14.131 -binance-futures,BTCUSDT,1582329786606000,1582329786726933,3.137,9670.27,9668.85,0.445 -binance-futures,BTCUSDT,1582329786627000,1582329786749692,3.137,9670.27,9668.86,0.031 -binance-futures,BTCUSDT,1582329786634000,1582329786755993,3.137,9670.27,9668.86,0.04 -binance-futures,BTCUSDT,1582329786646000,1582329786770086,3.137,9670.27,9668.86,12.79 -binance-futures,BTCUSDT,1582329786653000,1582329786774625,3.137,9670.27,9668.9,0.445 -binance-futures,BTCUSDT,1582329786673000,1582329786797245,3.137,9670.27,9668.9,0.476 -binance-futures,BTCUSDT,1582329786676000,1582329786797871,3.137,9670.27,9668.9,13.876 -binance-futures,BTCUSDT,1582329786683000,1582329786800432,3.137,9670.27,9668.91,0.67 -binance-futures,BTCUSDT,1582329786697000,1582329786816160,3.137,9670.27,9668.91,11.92 -binance-futures,BTCUSDT,1582329786702000,1582329786823248,3.137,9670.27,9668.95,0.435 -binance-futures,BTCUSDT,1582329786718000,1582329786839687,3.137,9670.27,9668.95,0.466 -binance-futures,BTCUSDT,1582329786720000,1582329786840647,3.137,9670.27,9668.95,12.366 -binance-futures,BTCUSDT,1582329786735000,1582329786856550,3.137,9670.27,9668.95,11.931 -binance-futures,BTCUSDT,1582329786739000,1582329786859365,0.335,9670.24,9668.95,11.931 -binance-futures,BTCUSDT,1582329786747000,1582329786870136,0.335,9670.24,9668.96,0.67 -binance-futures,BTCUSDT,1582329786756000,1582329786877925,0.335,9670.24,9668.96,1.34 -binance-futures,BTCUSDT,1582329786761000,1582329786881065,3.137,9670.27,9668.96,1.34 -binance-futures,BTCUSDT,1582329786766000,1582329786889782,3.137,9670.27,9668.96,11.24 -binance-futures,BTCUSDT,1582329786772000,1582329786895294,3.137,9670.27,9668.98,0.445 -binance-futures,BTCUSDT,1582329786776000,1582329786897668,3.137,9670.27,9669,0.031 -binance-futures,BTCUSDT,1582329786789000,1582329786909257,0.335,9669.63,9669,0.031 -binance-futures,BTCUSDT,1582329786795000,1582329786916876,0.335,9669.63,9669,10.881 -binance-futures,BTCUSDT,1582329786797000,1582329786918076,1.071,9669.98,9669,10.881 -binance-futures,BTCUSDT,1582329786806000,1582329786927404,3.137,9670.27,9669,10.881 -binance-futures,BTCUSDT,1582329786808000,1582329786928733,0.335,9670.26,9669,10.881 -binance-futures,BTCUSDT,1582329786821000,1582329786942710,0.335,9670.26,9669.04,0.031 -binance-futures,BTCUSDT,1582329786825000,1582329786947061,3.137,9670.27,9669.04,0.031 -binance-futures,BTCUSDT,1582329786832000,1582329786951459,3.137,9670.27,9669.04,0.476 -binance-futures,BTCUSDT,1582329786841000,1582329786961199,3.137,9670.27,9669.04,10.376 -binance-futures,BTCUSDT,1582329786856000,1582329786979681,3.137,9670.27,9669.08,0.445 -binance-futures,BTCUSDT,1582329786877000,1582329786997695,3.137,9670.27,9669.08,10.995 -binance-futures,BTCUSDT,1582329786883000,1582329787006630,3.137,9670.27,9669.12,0.031 -binance-futures,BTCUSDT,1582329786901000,1582329787022844,3.137,9670.27,9669.15,0.439 -binance-futures,BTCUSDT,1582329786922000,1582329787044354,3.137,9670.27,9669.15,8.439 -binance-futures,BTCUSDT,1582329786939000,1582329787061003,3.137,9670.27,9669.16,0.67 -binance-futures,BTCUSDT,1582329786948000,1582329787074127,3.137,9670.27,9669.19,0.476 -binance-futures,BTCUSDT,1582329786966000,1582329787087059,3.137,9670.27,9669.19,0.031 -binance-futures,BTCUSDT,1582329786968000,1582329787090524,0.335,9670.26,9669.19,0.031 -binance-futures,BTCUSDT,1582329786971000,1582329787094248,0.335,9670.26,9669.19,6.681 -binance-futures,BTCUSDT,1582329786978000,1582329787101447,3.137,9670.27,9669.22,0.444 -binance-futures,BTCUSDT,1582329786996000,1582329787116436,3.137,9670.27,9669.22,8.944 -binance-futures,BTCUSDT,1582329787019000,1582329787139041,3.137,9670.27,9669.22,8.5 -binance-futures,BTCUSDT,1582329787020000,1582329787142073,3.137,9670.27,9669.26,0.428 -binance-futures,BTCUSDT,1582329787041000,1582329787163344,3.137,9670.27,9669.26,6.178 -binance-futures,BTCUSDT,1582329787054000,1582329787174905,3.137,9670.27,9669.26,0.428 -binance-futures,BTCUSDT,1582329787059000,1582329787178934,3.137,9670.27,9669.26,0.459 -binance-futures,BTCUSDT,1582329787066000,1582329787187154,3.137,9670.27,9669.41,5.17 -binance-futures,BTCUSDT,1582329787091000,1582329787214083,3.137,9670.27,9669.45,0.031 -binance-futures,BTCUSDT,1582329787124000,1582329787247291,2.931,9670.27,9669.45,0.031 -binance-futures,BTCUSDT,1582329787125000,1582329787249212,2.725,9670.27,9669.45,0.031 -binance-futures,BTCUSDT,1582329787129000,1582329787252774,2.673,9670.27,9669.45,0.031 -binance-futures,BTCUSDT,1582329787145000,1582329787268238,0.335,9670.26,9669.45,0.031 -binance-futures,BTCUSDT,1582329787151000,1582329787272694,0.335,9670.26,9669.46,0.031 -binance-futures,BTCUSDT,1582329787156000,1582329787277365,0.335,9670.26,9669.46,0.701 -binance-futures,BTCUSDT,1582329787169000,1582329787291654,0.335,9670.26,9669.48,0.031 -binance-futures,BTCUSDT,1582329787202000,1582329787322532,2.673,9670.27,9669.48,0.031 -binance-futures,BTCUSDT,1582329787204000,1582329787325642,2.673,9670.27,9669.49,0.67 -binance-futures,BTCUSDT,1582329787215000,1582329787334616,2.673,9670.27,9669.49,1.34 -binance-futures,BTCUSDT,1582329787224000,1582329787348626,2.673,9670.27,9669.51,0.031 -binance-futures,BTCUSDT,1582329787262000,1582329787382919,2.673,9670.27,9669.52,0.67 -binance-futures,BTCUSDT,1582329787285000,1582329787408735,2.673,9670.27,9669.56,0.031 -binance-futures,BTCUSDT,1582329787296000,1582329787416967,2.508,9670.27,9669.56,0.031 -binance-futures,BTCUSDT,1582329787305000,1582329787426026,2.26,9670.27,9669.56,0.031 -binance-futures,BTCUSDT,1582329787375000,1582329787497913,2.26,9670.27,9669.57,0.031 -binance-futures,BTCUSDT,1582329787407000,1582329787528863,2.185,9670.27,9669.57,0.031 -binance-futures,BTCUSDT,1582329787431000,1582329787554145,2.185,9670.27,9669.57,2.021 -binance-futures,BTCUSDT,1582329787433000,1582329787554181,2.185,9670.27,9669.58,0.67 -binance-futures,BTCUSDT,1582329787441000,1582329787563511,2.185,9670.27,9669.58,0.71 -binance-futures,BTCUSDT,1582329787443000,1582329787563665,2.185,9670.27,9669.58,1.38 -binance-futures,BTCUSDT,1582329787456000,1582329787579622,2.185,9670.27,9669.6,0.031 -binance-futures,BTCUSDT,1582329787459000,1582329787582656,2.185,9670.27,9669.61,0.031 -binance-futures,BTCUSDT,1582329787464000,1582329787585460,2.185,9670.27,9669.72,0.429 -binance-futures,BTCUSDT,1582329787470000,1582329787590132,2.185,9670.27,9669.61,0.031 -binance-futures,BTCUSDT,1582329787489000,1582329787612425,2.185,9670.27,9669.6,0.67 -binance-futures,BTCUSDT,1582329787491000,1582329787614960,2.185,9670.27,9669.6,1.34 -binance-futures,BTCUSDT,1582329787495000,1582329787617320,2.185,9670.27,9669.6,1.38 -binance-futures,BTCUSDT,1582329787497000,1582329787618833,2.185,9670.27,9669.6,2.05 -binance-futures,BTCUSDT,1582329787505000,1582329787628280,0.682,9670.26,9669.6,2.05 -binance-futures,BTCUSDT,1582329787512000,1582329787637193,0.682,9670.26,9669.63,0.031 -binance-futures,BTCUSDT,1582329787514000,1582329787637763,0.682,9670.26,9669.64,0.031 -binance-futures,BTCUSDT,1582329787531000,1582329787650772,0.335,9670.25,9669.64,0.031 -binance-futures,BTCUSDT,1582329787591000,1582329787711655,0.335,9670.25,9669.67,0.031 -binance-futures,BTCUSDT,1582329787622000,1582329787743023,0.335,9670.25,9669.68,0.67 -binance-futures,BTCUSDT,1582329787627000,1582329787749613,0.335,9670.25,9669.68,1.34 -binance-futures,BTCUSDT,1582329787646000,1582329787769166,0.335,9670.25,9669.72,0.031 -binance-futures,BTCUSDT,1582329787669000,1582329787790017,0.682,9670.26,9669.72,0.031 -binance-futures,BTCUSDT,1582329787694000,1582329787813895,0.682,9670.26,9669.73,0.031 -binance-futures,BTCUSDT,1582329787729000,1582329787852112,0.682,9670.26,9669.74,0.67 -binance-futures,BTCUSDT,1582329787738000,1582329787860832,0.682,9670.26,9669.74,1.34 -binance-futures,BTCUSDT,1582329787754000,1582329787878029,0.682,9670.26,9669.78,0.031 -binance-futures,BTCUSDT,1582329787802000,1582329787923977,0.682,9670.26,9669.79,0.031 -binance-futures,BTCUSDT,1582329787805000,1582329787927553,0.682,9670.26,9669.79,0.701 -binance-futures,BTCUSDT,1582329787814000,1582329787935778,0.335,9670.25,9669.79,0.701 -binance-futures,BTCUSDT,1582329787816000,1582329787938090,0.335,9670.25,9669.84,2 -binance-futures,BTCUSDT,1582329787820000,1582329787941128,0.682,9670.26,9669.84,2 -binance-futures,BTCUSDT,1582329787835000,1582329787955664,0.682,9670.26,9669.84,7.05 -binance-futures,BTCUSDT,1582329787858000,1582329787981003,0.682,9670.26,9669.9,2 -binance-futures,BTCUSDT,1582329787877000,1582329788000664,0.682,9670.26,9669.9,7.5 -binance-futures,BTCUSDT,1582329787883000,1582329788008238,0.682,9670.26,9669.94,0.031 -binance-futures,BTCUSDT,1582329787901000,1582329788025671,0.682,9670.26,9669.96,2 -binance-futures,BTCUSDT,1582329787925000,1582329788048987,0.682,9670.26,9669.96,7.15 -binance-futures,BTCUSDT,1582329787927000,1582329788049674,0.682,9670.26,9670,0.031 -binance-futures,BTCUSDT,1582329787949000,1582329788071317,0.682,9670.26,9670.01,2 -binance-futures,BTCUSDT,1582329787950000,1582329788073065,0.682,9670.26,9670.04,2 -binance-futures,BTCUSDT,1582329787952000,1582329788073101,0.682,9670.26,9670.06,2 -binance-futures,BTCUSDT,1582329787970000,1582329788094019,0.682,9670.26,9670.1,2 -binance-futures,BTCUSDT,1582329787993000,1582329788113108,0.682,9670.26,9670.16,2 -binance-futures,BTCUSDT,1582329787995000,1582329788117614,0.682,9670.26,9670.16,4 -binance-futures,BTCUSDT,1582329788010000,1582329788132027,0.682,9670.26,9670.16,11.25 -binance-futures,BTCUSDT,1582329788012000,1582329788140249,0.682,9670.26,9670.22,6 -binance-futures,BTCUSDT,1582329788016000,1582329788142967,0.682,9670.26,9670.22,10 -binance-futures,BTCUSDT,1582329788019000,1582329788143000,0.682,9670.26,9670.25,0.441 -binance-futures,BTCUSDT,1582329788037000,1582329788159440,0.682,9670.26,9670.25,2.441 -binance-futures,BTCUSDT,1582329788041000,1582329788163933,0.682,9670.26,9670.25,11.141 -binance-futures,BTCUSDT,1582329788050000,1582329788171267,0.682,9670.26,9670.25,11.224 -binance-futures,BTCUSDT,1582329788088000,1582329788211167,0.682,9670.26,9670.25,2.524 -binance-futures,BTCUSDT,1582329788117000,1582329788239268,0.682,9670.26,9670.25,2.083 -binance-futures,BTCUSDT,1582329788123000,1582329788251360,0.682,9670.26,9670.25,2.753 -binance-futures,BTCUSDT,1582329788143000,1582329788267770,0.682,9670.26,9670.25,2.793 -binance-futures,BTCUSDT,1582329788149000,1582329788272829,0.682,9670.26,9670.25,3.463 -binance-futures,BTCUSDT,1582329788169000,1582329788292874,0.682,9670.26,9670.25,3.902 -binance-futures,BTCUSDT,1582329788175000,1582329788296728,0.682,9670.26,9670.25,11.652 -binance-futures,BTCUSDT,1582329788231000,1582329788351337,0.682,9670.26,9670.25,12.322 -binance-futures,BTCUSDT,1582329788240000,1582329788363748,0.682,9670.26,9670.25,14.312 -binance-futures,BTCUSDT,1582329788262000,1582329788383216,0.682,9670.26,9670.25,14.315 -binance-futures,BTCUSDT,1582329788348000,1582329788469480,0.682,9670.26,9670.25,13.876 -binance-futures,BTCUSDT,1582329788353000,1582329788473585,12.463,9670.26,9670.25,13.876 -binance-futures,BTCUSDT,1582329788354000,1582329788475769,12.798,9670.26,9670.25,13.876 -binance-futures,BTCUSDT,1582329788374000,1582329788495028,12.798,9670.26,9670.25,6.126 -binance-futures,BTCUSDT,1582329788374000,1582329788495309,12.463,9670.26,9670.25,6.126 -binance-futures,BTCUSDT,1582329788377000,1582329788501686,1.753,9670.26,9670.25,6.126 -binance-futures,BTCUSDT,1582329788383000,1582329788504549,0.682,9670.26,9670.25,6.123 -binance-futures,BTCUSDT,1582329788387000,1582329788507150,0.682,9670.26,9670.25,6.516 -binance-futures,BTCUSDT,1582329788388000,1582329788509920,0.682,9670.26,9670.25,5.176 -binance-futures,BTCUSDT,1582329788412000,1582329788532631,0.682,9670.26,9670.25,4.506 -binance-futures,BTCUSDT,1582329788416000,1582329788538639,0.682,9670.26,9670.25,5.176 -binance-futures,BTCUSDT,1582329788417000,1582329788539202,0.682,9670.26,9670.25,5.413 -binance-futures,BTCUSDT,1582329788467000,1582329788587306,0.682,9670.26,9670.25,6.083 -binance-futures,BTCUSDT,1582329788503000,1582329788625214,0.682,9670.26,9670.25,6.123 -binance-futures,BTCUSDT,1582329788544000,1582329788667918,0.682,9670.26,9670.25,6.556 -binance-futures,BTCUSDT,1582329788558000,1582329788678385,0.682,9670.26,9670.25,4.566 -binance-futures,BTCUSDT,1582329788591000,1582329788715271,0.682,9670.26,9670.25,6.556 -binance-futures,BTCUSDT,1582329788693000,1582329788815991,2.653,9670.63,9670.26,1.318 -binance-futures,BTCUSDT,1582329788711000,1582329788835235,2.653,9670.63,9670.31,6 -binance-futures,BTCUSDT,1582329788713000,1582329788840388,0.041,9670.83,9670.63,1.347 -binance-futures,BTCUSDT,1582329788733000,1582329788859659,0.041,9670.83,9670.63,3.347 -binance-futures,BTCUSDT,1582329788739000,1582329788865091,5.209,9671.91,9670.83,1.959 -binance-futures,BTCUSDT,1582329788744000,1582329788872257,5.209,9671.91,9670.83,7.959 -binance-futures,BTCUSDT,1582329788751000,1582329788878456,5.209,9671.91,9670.84,0.74 -binance-futures,BTCUSDT,1582329788767000,1582329788892365,5.209,9671.91,9670.99,0.445 -binance-futures,BTCUSDT,1582329788789000,1582329788911072,5.209,9671.91,9671.03,2 -binance-futures,BTCUSDT,1582329788790000,1582329788911300,5.209,9671.91,9671.03,4 -binance-futures,BTCUSDT,1582329788810000,1582329788935027,5.209,9671.91,9671.07,2 -binance-futures,BTCUSDT,1582329788810000,1582329788935678,5.209,9671.91,9671.07,4 -binance-futures,BTCUSDT,1582329788816000,1582329788939494,5.209,9671.91,9671.15,0.442 -binance-futures,BTCUSDT,1582329788836000,1582329788958838,5.209,9671.91,9671.15,15.842 -binance-futures,BTCUSDT,1582329788838000,1582329788963713,5.209,9671.91,9671.19,2 -binance-futures,BTCUSDT,1582329788856000,1582329788979699,5.209,9671.91,9671.19,4 -binance-futures,BTCUSDT,1582329788856000,1582329788980081,3.209,9671.91,9671.19,4 -binance-futures,BTCUSDT,1582329788862000,1582329788988146,3.209,9671.91,9671.19,18.831 -binance-futures,BTCUSDT,1582329788879000,1582329789002777,3.096,9672.53,9671.91,0.791 -binance-futures,BTCUSDT,1582329788900000,1582329789023190,3.096,9672.53,9671.91,2.791 -binance-futures,BTCUSDT,1582329788904000,1582329789029243,0.047,9672.79,9671.95,2 -binance-futures,BTCUSDT,1582329788923000,1582329789047222,0.047,9672.79,9671.95,4 -binance-futures,BTCUSDT,1582329788924000,1582329789047609,0.047,9672.79,9671.95,18.6 -binance-futures,BTCUSDT,1582329788927000,1582329789049930,0.047,9672.79,9671.95,18.631 -binance-futures,BTCUSDT,1582329788931000,1582329789052632,0.047,9672.79,9671.96,1 -binance-futures,BTCUSDT,1582329788941000,1582329789076314,0.005,9672.78,9671.96,1.022 -binance-futures,BTCUSDT,1582329788956000,1582329789091275,0.005,9672.78,9671.96,17.072 -binance-futures,BTCUSDT,1582329788963000,1582329789094299,0.005,9672.78,9671.96,17.05 -binance-futures,BTCUSDT,1582329788976000,1582329789103928,0.005,9672.78,9671.97,0.022 -binance-futures,BTCUSDT,1582329788979000,1582329789110405,0.005,9672.78,9671.99,0.031 -binance-futures,BTCUSDT,1582329788981000,1582329789110456,0.005,9672.78,9672,0.031 -binance-futures,BTCUSDT,1582329789010000,1582329789134503,0.005,9672.78,9672,15.031 -binance-futures,BTCUSDT,1582329789017000,1582329789148044,0.005,9672.78,9672.13,0.445 -binance-futures,BTCUSDT,1582329789044000,1582329789169332,0.005,9672.78,9672.13,15.595 -binance-futures,BTCUSDT,1582329789046000,1582329789169936,0.047,9672.79,9672.13,15.595 -binance-futures,BTCUSDT,1582329789063000,1582329789185721,0.047,9672.79,9672.13,15.15 -binance-futures,BTCUSDT,1582329789067000,1582329789194754,0.047,9672.79,9672.14,1 -binance-futures,BTCUSDT,1582329789090000,1582329789215932,0.047,9672.79,9672.17,0.031 -binance-futures,BTCUSDT,1582329789100000,1582329789223590,0.047,9672.79,9672.28,0.445 -binance-futures,BTCUSDT,1582329789108000,1582329789231411,0.047,9672.79,9672.77,0.083 -binance-futures,BTCUSDT,1582329789128000,1582329789279808,0.047,9672.79,9672.77,9.333 -binance-futures,BTCUSDT,1582329789131000,1582329789279926,0.047,9672.79,9672.78,2 -binance-futures,BTCUSDT,1582329789133000,1582329789280211,0.047,9672.79,9672.78,6 -binance-futures,BTCUSDT,1582329789137000,1582329789280258,0.047,9672.79,9672.78,9 -binance-futures,BTCUSDT,1582329789166000,1582329789299013,0.047,9672.79,9672.78,19.15 -binance-futures,BTCUSDT,1582329789180000,1582329789332825,2.631,9672.79,9672.78,9.445 -binance-futures,BTCUSDT,1582329789188000,1582329789334092,2.631,9672.79,9672.78,10.115 -binance-futures,BTCUSDT,1582329789199000,1582329789335234,2.631,9672.79,9672.78,11.455 -binance-futures,BTCUSDT,1582329789207000,1582329789335678,2.631,9672.79,9672.78,11.495 -binance-futures,BTCUSDT,1582329789209000,1582329789335710,2.631,9672.79,9672.78,11.05 -binance-futures,BTCUSDT,1582329789213000,1582329789340144,2.631,9672.79,9672.78,11.051 -binance-futures,BTCUSDT,1582329789230000,1582329789352764,2.631,9672.79,9672.78,10.051 -binance-futures,BTCUSDT,1582329789251000,1582329789370881,2.631,9672.79,9672.78,9.381 -binance-futures,BTCUSDT,1582329789255000,1582329789382146,2.631,9672.79,9672.78,9.341 -binance-futures,BTCUSDT,1582329789259000,1582329789382663,2.631,9672.79,9672.78,9.34 -binance-futures,BTCUSDT,1582329789259000,1582329789385822,2.631,9672.79,9672.78,8.67 -binance-futures,BTCUSDT,1582329789271000,1582329789394231,2.631,9672.79,9672.78,9.098 -binance-futures,BTCUSDT,1582329789274000,1582329789396255,2.631,9672.79,9672.78,8.428 -binance-futures,BTCUSDT,1582329789446000,1582329789568943,2.631,9672.79,9672.78,8.406 -binance-futures,BTCUSDT,1582329789461000,1582329789581760,2.631,9672.79,9672.78,9.076 -binance-futures,BTCUSDT,1582329789468000,1582329789589252,2.631,9672.79,9672.78,9.746 -binance-futures,BTCUSDT,1582329789476000,1582329789595305,2.631,9672.79,9672.78,10.416 -binance-futures,BTCUSDT,1582329789483000,1582329789603382,2.631,9672.79,9672.78,10.456 -binance-futures,BTCUSDT,1582329789877000,1582329790000343,2.425,9672.79,9672.78,10.456 -binance-futures,BTCUSDT,1582329789896000,1582329790021376,2.425,9672.79,9672.78,15.606 -binance-futures,BTCUSDT,1582329789898000,1582329790022424,2.425,9672.79,9672.78,20.056 -binance-futures,BTCUSDT,1582329789914000,1582329790035907,0.425,9672.79,9672.78,20.056 -binance-futures,BTCUSDT,1582329789919000,1582329790042100,0.425,9672.79,9672.78,15.606 -binance-futures,BTCUSDT,1582329789932000,1582329790052888,0.425,9672.79,9672.78,10.456 -binance-futures,BTCUSDT,1582329789932000,1582329790053274,0.028,9673,9672.79,1.575 -binance-futures,BTCUSDT,1582329789934000,1582329790055806,0.028,9673,9672.79,3.575 -binance-futures,BTCUSDT,1582329789934000,1582329790056326,0.028,9673,9672.79,5.575 -binance-futures,BTCUSDT,1582329789940000,1582329790064031,0.028,9673,9672.82,0.031 -binance-futures,BTCUSDT,1582329789950000,1582329790074369,0.028,9673,9672.84,2 -binance-futures,BTCUSDT,1582329789950000,1582329790076417,0.809,9673.29,9673,1.972 -binance-futures,BTCUSDT,1582329789952000,1582329790076813,0.809,9673.29,9673,3.972 -binance-futures,BTCUSDT,1582329789963000,1582329790086867,0.809,9673.29,9673,2 -binance-futures,BTCUSDT,1582329789971000,1582329790097003,0.809,9673.29,9672.99,0.445 -binance-futures,BTCUSDT,1582329789976000,1582329790102898,0.809,9673.29,9673.06,4 -binance-futures,BTCUSDT,1582329789977000,1582329790102919,0.809,9673.29,9673.06,6 -binance-futures,BTCUSDT,1582329789977000,1582329790103669,0.809,9673.29,9673.06,10 -binance-futures,BTCUSDT,1582329789981000,1582329790107114,0.809,9673.29,9673.23,0.445 -binance-futures,BTCUSDT,1582329790000000,1582329790147338,0.809,9673.29,9673.06,14.6 -binance-futures,BTCUSDT,1582329790018000,1582329790148199,0.18,9674.96,9673.12,4 -binance-futures,BTCUSDT,1582329790021000,1582329790152989,1.2,9675.19,9673.74,0.74 -binance-futures,BTCUSDT,1582329790050000,1582329790175075,1.2,9675.19,9673.74,16.19 -binance-futures,BTCUSDT,1582329790063000,1582329790187383,1.2,9675.19,9673.93,0.445 -binance-futures,BTCUSDT,1582329790086000,1582329790212353,1.2,9675.19,9673.93,16.395 -binance-futures,BTCUSDT,1582329790101000,1582329790223481,1.2,9675.19,9673.95,0.031 -binance-futures,BTCUSDT,1582329790101000,1582329790224678,1.2,9675.19,9673.97,0.031 -binance-futures,BTCUSDT,1582329790123000,1582329790246545,1.2,9675.19,9674.09,0.444 -binance-futures,BTCUSDT,1582329790147000,1582329790271868,1.2,9675.19,9674.09,15.044 -binance-futures,BTCUSDT,1582329790178000,1582329790303381,1.2,9675.19,9674.24,0.445 -binance-futures,BTCUSDT,1582329790202000,1582329790327642,1.2,9675.19,9674.28,4 -binance-futures,BTCUSDT,1582329790217000,1582329790367462,1.276,9675.33,9675.19,0.8 -binance-futures,BTCUSDT,1582329790223000,1582329790370031,1.276,9675.33,9675.19,0.777 -binance-futures,BTCUSDT,1582329790230000,1582329790370096,1.276,9675.33,9674.32,2.031 -binance-futures,BTCUSDT,1582329790231000,1582329790370506,1.276,9675.33,9674.38,0.445 -binance-futures,BTCUSDT,1582329790256000,1582329790382520,1.276,9675.33,9675.25,8 -binance-futures,BTCUSDT,1582329790265000,1582329790388971,1.276,9675.33,9675.25,6 -binance-futures,BTCUSDT,1582329790265000,1582329790391011,1.276,9675.33,9675.25,4 -binance-futures,BTCUSDT,1582329790267000,1582329790393995,1.276,9675.33,9675.25,2 -binance-futures,BTCUSDT,1582329790269000,1582329790396647,1.276,9675.33,9675.23,2 -binance-futures,BTCUSDT,1582329790272000,1582329790397547,1.276,9675.33,9675.21,0.445 -binance-futures,BTCUSDT,1582329790278000,1582329790406959,1.276,9675.33,9675.31,2 -binance-futures,BTCUSDT,1582329790278000,1582329790410183,1.276,9675.33,9675.31,6 -binance-futures,BTCUSDT,1582329790284000,1582329790412110,1.276,9675.33,9675.31,8 -binance-futures,BTCUSDT,1582329790287000,1582329790417669,1.276,9675.33,9675.32,0.437 -binance-futures,BTCUSDT,1582329790306000,1582329790432291,1.276,9675.33,9675.32,2.437 -binance-futures,BTCUSDT,1582329790310000,1582329790442829,1.276,9675.33,9675.32,10.437 -binance-futures,BTCUSDT,1582329790314000,1582329790443096,1.276,9675.33,9675.32,12.437 -binance-futures,BTCUSDT,1582329790316000,1582329790447818,1.276,9675.33,9675.32,21.587 -binance-futures,BTCUSDT,1582329790347000,1582329790474541,1.276,9675.33,9675.32,13.437 -binance-futures,BTCUSDT,1582329790359000,1582329790483701,1.276,9675.33,9675.32,13.459 -binance-futures,BTCUSDT,1582329790382000,1582329790505178,1.276,9675.33,9675.32,14.129 -binance-futures,BTCUSDT,1582329790406000,1582329790527842,1.276,9675.33,9675.32,14.799 -binance-futures,BTCUSDT,1582329790449000,1582329790572946,1.276,9675.33,9675.32,14.839 -binance-futures,BTCUSDT,1582329790451000,1582329790577365,1.276,9675.33,9675.32,12.839 -binance-futures,BTCUSDT,1582329790454000,1582329790577396,1.276,9675.33,9675.32,10.839 -binance-futures,BTCUSDT,1582329790485000,1582329790611325,1.276,9675.33,9675.32,11.509 -binance-futures,BTCUSDT,1582329790516000,1582329790644210,1.736,9675.35,9675.32,11.509 -binance-futures,BTCUSDT,1582329790529000,1582329790659028,1.736,9675.35,9675.32,10.509 -binance-futures,BTCUSDT,1582329790533000,1582329790659160,1.736,9675.35,9675.32,10.487 -binance-futures,BTCUSDT,1582329790533000,1582329790659170,1.736,9675.35,9675.32,10.05 -binance-futures,BTCUSDT,1582329790546000,1582329790670466,1.736,9675.35,9675.34,0.031 -binance-futures,BTCUSDT,1582329790560000,1582329790682391,1.736,9675.35,9675.34,2.031 -binance-futures,BTCUSDT,1582329790560000,1582329790682660,1.736,9675.35,9675.34,4.031 -binance-futures,BTCUSDT,1582329790564000,1582329790685457,1.736,9675.35,9675.34,6.031 -binance-futures,BTCUSDT,1582329790575000,1582329790697370,1.736,9675.35,9675.34,11.231 -binance-futures,BTCUSDT,1582329790579000,1582329790702639,1.736,9675.35,9675.34,12.571 -binance-futures,BTCUSDT,1582329790588000,1582329790711059,1.736,9675.35,9675.34,13.241 -binance-futures,BTCUSDT,1582329790590000,1582329790714149,1.736,9675.35,9675.34,8.041 -binance-futures,BTCUSDT,1582329790594000,1582329790715757,1.736,9675.35,9675.34,8.081 -binance-futures,BTCUSDT,1582329790658000,1582329790779081,1.736,9675.35,9675.34,8.164 -binance-futures,BTCUSDT,1582329790678000,1582329790798969,1.736,9675.35,9675.34,8.607 -binance-futures,BTCUSDT,1582329790777000,1582329790901021,1.736,9675.35,9675.34,8.164 -binance-futures,BTCUSDT,1582329790824000,1582329790945409,1.736,9675.35,9675.34,8.605 -binance-futures,BTCUSDT,1582329790884000,1582329791007296,1.836,9675.35,9675.34,8.605 -binance-futures,BTCUSDT,1582329791017000,1582329791140807,1.836,9675.35,9675.34,6.605 -binance-futures,BTCUSDT,1582329791017000,1582329791141791,1.836,9675.35,9675.34,4.605 -binance-futures,BTCUSDT,1582329791021000,1582329791143197,1.836,9675.35,9675.34,2.605 -binance-futures,BTCUSDT,1582329791065000,1582329791191534,1.836,9675.35,9675.34,2.164 -binance-futures,BTCUSDT,1582329791375000,1582329791497409,1.836,9675.35,9675.34,2.608 -binance-futures,BTCUSDT,1582329791395000,1582329791516701,1.836,9675.35,9675.34,1.938 -binance-futures,BTCUSDT,1582329791403000,1582329791527013,1.836,9675.35,9675.34,1.268 -binance-futures,BTCUSDT,1582329791406000,1582329791527039,1.836,9675.35,9675.34,0.598 -binance-futures,BTCUSDT,1582329791408000,1582329791530047,1.836,9675.35,9675.34,0.558 -binance-futures,BTCUSDT,1582329791432000,1582329791554251,1.736,9675.35,9675.34,0.114 -binance-futures,BTCUSDT,1582329791566000,1582329791688670,1.736,9675.35,9675.34,0.784 -binance-futures,BTCUSDT,1582329791568000,1582329791690448,1.736,9675.35,9675.34,1.454 -binance-futures,BTCUSDT,1582329791572000,1582329791693081,1.736,9675.35,9675.34,2.124 -binance-futures,BTCUSDT,1582329791574000,1582329791696179,1.736,9675.35,9675.34,2.164 -binance-futures,BTCUSDT,1582329791587000,1582329791709305,1.736,9675.35,9675.34,1.494 -binance-futures,BTCUSDT,1582329791602000,1582329791726068,1.736,9675.35,9675.34,0.824 -binance-futures,BTCUSDT,1582329791604000,1582329791728923,1.736,9675.35,9675.34,0.784 -binance-futures,BTCUSDT,1582329791651000,1582329791778175,1.736,9675.35,9675.34,0.114 -binance-futures,BTCUSDT,1582329791726000,1582329791847525,1.736,9675.35,9675.34,0.031 -binance-futures,BTCUSDT,1582329791918000,1582329792040777,1.736,9675.35,9675.34,0.114 -binance-futures,BTCUSDT,1582329791955000,1582329792078708,1.736,9675.35,9675.34,0.784 -binance-futures,BTCUSDT,1582329791986000,1582329792109276,1.736,9675.35,9675.34,0.114 -binance-futures,BTCUSDT,1582329792009000,1582329792132904,1.736,9675.35,9675.34,0.549 -binance-futures,BTCUSDT,1582329792026000,1582329792150286,1.736,9675.35,9675.34,0.466 -binance-futures,BTCUSDT,1582329792064000,1582329792187321,1.736,9675.35,9675.34,1.136 -binance-futures,BTCUSDT,1582329792243000,1582329792428630,1.736,9675.35,9675.34,0.466 -binance-futures,BTCUSDT,1582329792337000,1582329792462372,1.736,9675.35,9675.34,0.031 -binance-futures,BTCUSDT,1582329792386000,1582329792506695,1.753,9675.35,9675.34,0.031 -binance-futures,BTCUSDT,1582329792633000,1582329792755068,1.753,9675.35,9674.32,0.445 -binance-futures,BTCUSDT,1582329792659000,1582329792782344,1.753,9675.35,9674.36,0.031 -binance-futures,BTCUSDT,1582329792680000,1582329792798833,1.753,9675.35,9674.36,3.781 -binance-futures,BTCUSDT,1582329792703000,1582329792826597,1.753,9675.35,9674.37,0.431 -binance-futures,BTCUSDT,1582329792707000,1582329792828101,1.736,9675.35,9674.37,0.431 -binance-futures,BTCUSDT,1582329792728000,1582329792846093,1.736,9675.35,9674.37,6.481 -binance-futures,BTCUSDT,1582329792730000,1582329792851772,1.736,9675.35,9674.41,0.031 -binance-futures,BTCUSDT,1582329792748000,1582329792866694,1.736,9675.35,9674.42,0.445 -binance-futures,BTCUSDT,1582329792763000,1582329792882098,1.736,9675.35,9674.42,8.045 -binance-futures,BTCUSDT,1582329792785000,1582329792906456,1.736,9675.35,9674.46,0.031 -binance-futures,BTCUSDT,1582329792790000,1582329792910154,1.736,9675.35,9674.49,0.445 -binance-futures,BTCUSDT,1582329792808000,1582329792928187,1.736,9675.35,9674.49,9.095 -binance-futures,BTCUSDT,1582329792831000,1582329792952991,1.736,9675.35,9674.53,0.031 -binance-futures,BTCUSDT,1582329792834000,1582329792956693,1.736,9675.35,9674.54,0.445 -binance-futures,BTCUSDT,1582329792857000,1582329792978342,1.736,9675.35,9674.54,8.795 -binance-futures,BTCUSDT,1582329792879000,1582329793003517,1.736,9675.35,9674.58,0.031 -binance-futures,BTCUSDT,1582329792883000,1582329793006930,1.736,9675.35,9674.6,0.445 -binance-futures,BTCUSDT,1582329792907000,1582329793028256,1.736,9675.35,9674.6,6.945 -binance-futures,BTCUSDT,1582329792930000,1582329793052700,1.736,9675.35,9674.62,0.031 -binance-futures,BTCUSDT,1582329792932000,1582329793054069,1.736,9675.35,9674.66,0.445 -binance-futures,BTCUSDT,1582329792951000,1582329793074340,1.736,9675.35,9674.66,6.495 -binance-futures,BTCUSDT,1582329792963000,1582329793085858,1.736,9675.35,9674.66,0.445 -binance-futures,BTCUSDT,1582329792969000,1582329793090760,1.736,9675.35,9674.64,0.031 -binance-futures,BTCUSDT,1582329792978000,1582329793103399,1.736,9675.35,9674.7,0.031 -binance-futures,BTCUSDT,1582329792980000,1582329793103426,1.736,9675.35,9674.7,0.476 -binance-futures,BTCUSDT,1582329792992000,1582329793113470,1.736,9675.35,9674.7,0.031 -binance-futures,BTCUSDT,1582329793005000,1582329793126933,1.736,9675.35,9673.02,0.441 -binance-futures,BTCUSDT,1582329793007000,1582329793126954,1.736,9675.35,9674.46,0.43 -binance-futures,BTCUSDT,1582329793012000,1582329793132745,1.736,9675.35,9672.86,0.1 -binance-futures,BTCUSDT,1582329793016000,1582329793138171,1.736,9675.35,9674.2,0.445 -binance-futures,BTCUSDT,1582329793023000,1582329793143762,1.736,9675.35,9672.86,0.1 -binance-futures,BTCUSDT,1582329793025000,1582329793146418,1.736,9675.35,9673.98,0.445 -binance-futures,BTCUSDT,1582329793027000,1582329793149804,1.736,9675.35,9674.68,0.031 -binance-futures,BTCUSDT,1582329793033000,1582329793152723,2,9675.31,9674.68,0.031 -binance-futures,BTCUSDT,1582329793045000,1582329793167097,2,9675.31,9674.2,2.5 -binance-futures,BTCUSDT,1582329793056000,1582329793182182,2,9675.3,9674.2,2.5 -binance-futures,BTCUSDT,1582329793062000,1582329793185994,2,9675.3,9674.22,0.432 -binance-futures,BTCUSDT,1582329793076000,1582329793202655,1.736,9675.35,9674.22,0.432 -binance-futures,BTCUSDT,1582329793084000,1582329793211658,1.736,9675.35,9674.24,0.031 -binance-futures,BTCUSDT,1582329793109000,1582329793233383,1.736,9675.35,9674.24,7.281 -binance-futures,BTCUSDT,1582329793115000,1582329793236768,1.736,9675.35,9674.26,0.438 -binance-futures,BTCUSDT,1582329793136000,1582329793258539,1.736,9675.35,9674.28,0.031 -binance-futures,BTCUSDT,1582329793155000,1582329793276837,1.736,9675.35,9674.28,10.581 -binance-futures,BTCUSDT,1582329793162000,1582329793282430,1.736,9675.35,9674.37,0.445 -binance-futures,BTCUSDT,1582329793182000,1582329793309455,1.736,9675.35,9674.37,10.245 -binance-futures,BTCUSDT,1582329793186000,1582329793310216,1.736,9675.35,9674.41,0.031 -binance-futures,BTCUSDT,1582329793206000,1582329793328888,1.736,9675.35,9674.41,9.731 -binance-futures,BTCUSDT,1582329793213000,1582329793334201,1.736,9675.35,9674.47,0.445 -binance-futures,BTCUSDT,1582329793234000,1582329793357966,1.736,9675.35,9674.47,9.845 -binance-futures,BTCUSDT,1582329793262000,1582329793388147,1.736,9675.35,9674.49,0.445 -binance-futures,BTCUSDT,1582329793287000,1582329793409840,1.736,9675.35,9674.49,8.045 -binance-futures,BTCUSDT,1582329793290000,1582329793417333,1.736,9675.35,9674.51,0.031 -binance-futures,BTCUSDT,1582329793313000,1582329793434155,1.736,9675.35,9674.52,0.445 -binance-futures,BTCUSDT,1582329793335000,1582329793490066,1.736,9675.35,9674.56,0.031 -binance-futures,BTCUSDT,1582329793385000,1582329793507360,1.736,9675.35,9674.56,6.431 -binance-futures,BTCUSDT,1582329793398000,1582329793519352,1.736,9675.35,9674.57,0.031 -binance-futures,BTCUSDT,1582329793400000,1582329793521937,1.736,9675.35,9674.61,0.441 -binance-futures,BTCUSDT,1582329793419000,1582329793538854,1.736,9675.35,9674.61,6.141 -binance-futures,BTCUSDT,1582329793435000,1582329793574072,1.736,9675.35,9674.61,5.7 -binance-futures,BTCUSDT,1582329793446000,1582329793596327,1.736,9675.35,9674.64,0.445 -binance-futures,BTCUSDT,1582329793483000,1582329793611261,1.736,9675.35,9674.65,0.031 -binance-futures,BTCUSDT,1582329793511000,1582329793633238,1.736,9675.35,9674.65,2.881 -binance-futures,BTCUSDT,1582329793515000,1582329793636237,0.335,9675.34,9674.65,2.881 -binance-futures,BTCUSDT,1582329793526000,1582329793647647,0.335,9675.34,9674.65,0.031 -binance-futures,BTCUSDT,1582329793530000,1582329793652988,2.335,9675.34,9674.65,0.031 -binance-futures,BTCUSDT,1582329793536000,1582329793658704,2.335,9675.34,9674.69,0.031 -binance-futures,BTCUSDT,1582329793544000,1582329793665719,0.335,9675.34,9674.69,0.031 -binance-futures,BTCUSDT,1582329793557000,1582329793682553,0.335,9675.32,9674.69,0.031 -binance-futures,BTCUSDT,1582329793559000,1582329793684804,0.335,9675.32,9674.68,0.031 -binance-futures,BTCUSDT,1582329793587000,1582329793709645,0.335,9675.32,9674.67,0.031 -binance-futures,BTCUSDT,1582329793593000,1582329793716508,2,9675.28,9674.67,0.031 -binance-futures,BTCUSDT,1582329793622000,1582329793741744,0.335,9675.27,9674.67,0.031 -binance-futures,BTCUSDT,1582329793644000,1582329793766299,2,9675.23,9674.67,0.031 -binance-futures,BTCUSDT,1582329793672000,1582329793796043,0.335,9675.21,9674.67,0.031 -binance-futures,BTCUSDT,1582329793695000,1582329793824235,2,9675.17,9674.67,0.031 -binance-futures,BTCUSDT,1582329793722000,1582329793845536,2,9675.11,9674.67,0.031 -binance-futures,BTCUSDT,1582329793728000,1582329793850867,2,9675.11,9673.35,0.445 -binance-futures,BTCUSDT,1582329793755000,1582329793886094,0.017,9674.68,9673.1,0.445 -binance-futures,BTCUSDT,1582329793756000,1582329793887708,0.017,9674.68,9673.39,0.031 -binance-futures,BTCUSDT,1582329793781000,1582329793904066,0.017,9674.65,9673.39,0.031 -binance-futures,BTCUSDT,1582329793787000,1582329793912839,0.017,9674.65,9673.39,6.631 -binance-futures,BTCUSDT,1582329793807000,1582329793931283,0.017,9674.65,9673.4,0.031 -binance-futures,BTCUSDT,1582329793817000,1582329793938932,0.017,9674.65,9673.4,0.701 -binance-futures,BTCUSDT,1582329793819000,1582329793940811,0.017,9674.65,9673.48,0.429 -binance-futures,BTCUSDT,1582329793841000,1582329793963557,0.017,9674.65,9673.48,5.129 -binance-futures,BTCUSDT,1582329793849000,1582329793969807,1.736,9675.35,9673.48,5.129 -binance-futures,BTCUSDT,1582329793868000,1582329793989337,1.736,9675.35,9673.58,0.445 -binance-futures,BTCUSDT,1582329793890000,1582329794011607,1.736,9675.35,9673.58,7.645 -binance-futures,BTCUSDT,1582329793915000,1582329794037899,1.736,9675.35,9673.58,7.2 -binance-futures,BTCUSDT,1582329793919000,1582329794039254,1.736,9675.35,9673.64,0.437 -binance-futures,BTCUSDT,1582329793936000,1582329794059739,1.736,9675.35,9673.64,8.237 -binance-futures,BTCUSDT,1582329793964000,1582329794083987,1.736,9675.35,9673.76,0.445 -binance-futures,BTCUSDT,1582329793981000,1582329794102461,1.736,9675.35,9673.76,7.095 -binance-futures,BTCUSDT,1582329793987000,1582329794109532,1.736,9675.35,9673.8,0.031 -binance-futures,BTCUSDT,1582329794008000,1582329794130090,1.736,9675.35,9673.8,7.731 -binance-futures,BTCUSDT,1582329794012000,1582329794131877,1.736,9675.35,9673.84,0.439 -binance-futures,BTCUSDT,1582329794029000,1582329794151607,1.736,9675.35,9673.84,9.289 -binance-futures,BTCUSDT,1582329794035000,1582329794156219,1.736,9675.35,9673.84,9.32 -binance-futures,BTCUSDT,1582329794060000,1582329794184714,1.736,9675.35,9673.93,0.437 -binance-futures,BTCUSDT,1582329794081000,1582329794205649,1.736,9675.35,9673.93,5.387 -binance-futures,BTCUSDT,1582329794088000,1582329794219711,0.012,9675.34,9673.93,5.387 -binance-futures,BTCUSDT,1582329794088000,1582329794219759,0.012,9675.34,9673.97,0.031 -binance-futures,BTCUSDT,1582329794102000,1582329794228298,0.335,9675.29,9673.97,0.031 -binance-futures,BTCUSDT,1582329794126000,1582329794249728,2.735,9675.29,9673.97,0.031 -binance-futures,BTCUSDT,1582329794151000,1582329794274920,1.996,9674.65,9673.97,0.031 -binance-futures,BTCUSDT,1582329794153000,1582329794275939,1.996,9674.65,9674,0.031 -binance-futures,BTCUSDT,1582329794193000,1582329794313832,0.335,9674.97,9674,0.031 -binance-futures,BTCUSDT,1582329794204000,1582329794327286,2,9675.13,9674,0.031 -binance-futures,BTCUSDT,1582329794209000,1582329794332143,0.012,9675.34,9674,0.031 -binance-futures,BTCUSDT,1582329794214000,1582329794336088,0.012,9675.34,9674.03,0.031 -binance-futures,BTCUSDT,1582329794220000,1582329794341972,0.335,9675.12,9674.03,0.031 -binance-futures,BTCUSDT,1582329794247000,1582329794399265,0.012,9675.34,9674.03,0.031 -binance-futures,BTCUSDT,1582329794249000,1582329794399636,0.347,9675.34,9674.03,0.031 -binance-futures,BTCUSDT,1582329794249000,1582329794399904,2.647,9675.34,9674.03,0.031 -binance-futures,BTCUSDT,1582329794261000,1582329794401693,0.347,9675.34,9674.03,0.031 -binance-futures,BTCUSDT,1582329794319000,1582329794444025,0.347,9675.34,9674.02,0.031 -binance-futures,BTCUSDT,1582329794323000,1582329794444072,0.347,9675.34,9673.98,0.031 -binance-futures,BTCUSDT,1582329794343000,1582329794465579,0.012,9675.34,9673.98,0.031 -binance-futures,BTCUSDT,1582329794343000,1582329794465590,0.335,9675.32,9673.98,0.031 -binance-futures,BTCUSDT,1582329794347000,1582329794469166,0.335,9675.32,9674.04,0.031 -binance-futures,BTCUSDT,1582329794347000,1582329794470189,0.335,9675.32,9674.06,0.031 -binance-futures,BTCUSDT,1582329794364000,1582329794487033,3.885,9675.32,9674.06,0.031 -binance-futures,BTCUSDT,1582329794370000,1582329794497645,3.885,9675.32,9674.05,0.031 -binance-futures,BTCUSDT,1582329794372000,1582329794497673,3.885,9675.32,9673.99,0.005 -binance-futures,BTCUSDT,1582329794391000,1582329794510104,0.335,9675.28,9673.99,0.005 -binance-futures,BTCUSDT,1582329794400000,1582329794521492,3.55,9675.32,9674.09,0.031 -binance-futures,BTCUSDT,1582329794410000,1582329794534648,5.95,9675.28,9674.09,0.031 -binance-futures,BTCUSDT,1582329794464000,1582329794585734,0.012,9675.33,9674.09,0.031 -binance-futures,BTCUSDT,1582329794487000,1582329794610886,0.012,9675.33,9674.11,0.031 -binance-futures,BTCUSDT,1582329794521000,1582329794643923,0.012,9675.33,9674.2,0.441 -binance-futures,BTCUSDT,1582329794547000,1582329794670892,0.012,9675.33,9674.24,0.031 -binance-futures,BTCUSDT,1582329794600000,1582329794720260,1.736,9675.35,9674.24,0.031 -binance-futures,BTCUSDT,1582329794623000,1582329794744428,1.736,9675.35,9674.26,0.031 -binance-futures,BTCUSDT,1582329794646000,1582329794766647,1.736,9675.35,9674.25,0.031 -binance-futures,BTCUSDT,1582329794702000,1582329794821516,1.736,9675.35,9674.25,0.476 -binance-futures,BTCUSDT,1582329794717000,1582329794838912,1.736,9675.35,9674.25,0.031 -binance-futures,BTCUSDT,1582329794725000,1582329794847625,1.736,9675.35,9674.27,0.031 -binance-futures,BTCUSDT,1582329794725000,1582329794848456,1.736,9675.35,9674.29,0.031 -binance-futures,BTCUSDT,1582329794749000,1582329794872692,1.736,9675.35,9674.27,0.031 -binance-futures,BTCUSDT,1582329794753000,1582329794872715,1.736,9675.35,9674.25,0.031 -binance-futures,BTCUSDT,1582329794774000,1582329794895058,1.736,9675.35,9674.29,0.031 -binance-futures,BTCUSDT,1582329794774000,1582329794897858,1.736,9675.35,9674.31,0.031 -binance-futures,BTCUSDT,1582329794782000,1582329794902825,1.736,9675.35,9674.31,0.476 -binance-futures,BTCUSDT,1582329794797000,1582329794919062,1.736,9675.35,9674.31,0.445 -binance-futures,BTCUSDT,1582329794813000,1582329794932750,1.736,9675.35,9673.15,0.001 -binance-futures,BTCUSDT,1582329794818000,1582329794938546,1.736,9675.35,9674.35,0.031 -binance-futures,BTCUSDT,1582329794834000,1582329794955048,2,9675.31,9674.35,0.031 -binance-futures,BTCUSDT,1582329794855000,1582329794976335,4.25,9675.31,9674.35,0.031 -binance-futures,BTCUSDT,1582329794865000,1582329794985908,2,9675.31,9674.35,0.031 -binance-futures,BTCUSDT,1582329794877000,1582329794998149,2,9675.31,9674.36,0.031 -binance-futures,BTCUSDT,1582329794879000,1582329795000375,2,9675.27,9674.37,0.031 -binance-futures,BTCUSDT,1582329794894000,1582329795016257,4.75,9675.27,9674.37,0.031 -binance-futures,BTCUSDT,1582329794904000,1582329795027814,0.335,9675.26,9674.37,0.031 -binance-futures,BTCUSDT,1582329794926000,1582329795046480,4.985,9675.26,9674.37,0.031 -binance-futures,BTCUSDT,1582329794932000,1582329795054451,4.985,9675.26,9673.77,0.445 -binance-futures,BTCUSDT,1582329794942000,1582329795063858,4.985,9675.26,9673.9,0.445 -binance-futures,BTCUSDT,1582329794944000,1582329795066111,0.335,9675.26,9673.9,0.445 -binance-futures,BTCUSDT,1582329794946000,1582329795067855,0.335,9675.26,9674.41,0.031 -binance-futures,BTCUSDT,1582329794948000,1582329795069419,1.736,9675.35,9674.41,0.031 -binance-futures,BTCUSDT,1582329794954000,1582329795078146,0.335,9675.31,9674.41,0.031 -binance-futures,BTCUSDT,1582329794959000,1582329795079444,2,9675.22,9674.41,0.031 -binance-futures,BTCUSDT,1582329794965000,1582329795091337,2,9675.22,9673.24,0.001 -binance-futures,BTCUSDT,1582329794971000,1582329795094815,1.736,9675.35,9673.24,0.001 -binance-futures,BTCUSDT,1582329794975000,1582329795097226,3.2,9675.31,9673.24,0.001 -binance-futures,BTCUSDT,1582329794992000,1582329795114272,3.2,9675.31,9673.28,0.031 -binance-futures,BTCUSDT,1582329794995000,1582329795116387,6.3,9675.31,9673.28,0.031 -binance-futures,BTCUSDT,1582329795011000,1582329795130944,3.2,9675.31,9673.28,0.031 -binance-futures,BTCUSDT,1582329795015000,1582329795137150,3.2,9675.31,9673.28,4.031 -binance-futures,BTCUSDT,1582329795019000,1582329795139885,3.535,9675.31,9673.28,4.031 -binance-futures,BTCUSDT,1582329795032000,1582329795152410,0.335,9675.31,9673.28,4.031 -binance-futures,BTCUSDT,1582329795036000,1582329795155784,0.335,9675.31,9673.32,0.031 -binance-futures,BTCUSDT,1582329795038000,1582329795157929,1.736,9675.35,9673.36,0.445 -binance-futures,BTCUSDT,1582329795059000,1582329795182331,1.736,9675.35,9673.36,7.145 -binance-futures,BTCUSDT,1582329795087000,1582329795206792,1.736,9675.35,9673.49,0.438 -binance-futures,BTCUSDT,1582329795101000,1582329795223933,0.012,9675.34,9673.49,0.438 -binance-futures,BTCUSDT,1582329795103000,1582329795225712,0.012,9675.34,9673.49,4.688 -binance-futures,BTCUSDT,1582329795111000,1582329795231755,0.012,9675.34,9673.53,0.031 -binance-futures,BTCUSDT,1582329795123000,1582329795244830,3.162,9675.34,9673.53,0.031 -binance-futures,BTCUSDT,1582329795131000,1582329795253611,3.162,9675.34,9673.61,0.445 -binance-futures,BTCUSDT,1582329795138000,1582329795261676,0.012,9675.34,9673.61,0.445 -binance-futures,BTCUSDT,1582329795156000,1582329795290290,0.012,9675.34,9673.65,0.031 -binance-futures,BTCUSDT,1582329795255000,1582329795395628,0.347,9675.34,9673.65,0.031 -binance-futures,BTCUSDT,1582329795296000,1582329795419054,0.347,9675.34,9673.66,0.031 -binance-futures,BTCUSDT,1582329795355000,1582329795474313,0.012,9675.33,9673.67,0.008 -binance-futures,BTCUSDT,1582329795372000,1582329795493422,0.012,9675.33,9673.69,0.031 -binance-futures,BTCUSDT,1582329795374000,1582329795494940,3.712,9675.33,9673.69,0.031 -binance-futures,BTCUSDT,1582329795391000,1582329795512269,0.012,9675.33,9673.69,0.031 -binance-futures,BTCUSDT,1582329795402000,1582329795522968,0.335,9675.32,9673.69,0.031 -binance-futures,BTCUSDT,1582329795410000,1582329795530811,0.335,9675.32,9673.7,0.445 -binance-futures,BTCUSDT,1582329795422000,1582329795540724,2.785,9675.32,9673.7,0.445 -binance-futures,BTCUSDT,1582329795432000,1582329795552605,0.335,9675.32,9673.74,0.031 -binance-futures,BTCUSDT,1582329795469000,1582329795588487,0.012,9675.33,9673.74,0.031 -binance-futures,BTCUSDT,1582329795472000,1582329795594030,0.012,9675.33,9673.8,0.445 -binance-futures,BTCUSDT,1582329795474000,1582329795596660,0.012,9675.33,9673.74,0.031 -binance-futures,BTCUSDT,1582329795490000,1582329795609866,0.012,9675.33,9673.75,0.031 -binance-futures,BTCUSDT,1582329795498000,1582329795617636,0.012,9675.33,9673.81,0.445 -binance-futures,BTCUSDT,1582329795503000,1582329795622724,0.012,9675.33,9673.81,0.89 -binance-futures,BTCUSDT,1582329795506000,1582329795625383,0.012,9675.33,9673.81,0.445 -binance-futures,BTCUSDT,1582329795513000,1582329795633487,0.012,9675.33,9673.8,0.431 -binance-futures,BTCUSDT,1582329795522000,1582329795642278,0.012,9675.33,9673.85,0.031 -binance-futures,BTCUSDT,1582329795524000,1582329795646367,0.012,9675.33,9673.92,0.445 -binance-futures,BTCUSDT,1582329795545000,1582329795669009,0.347,9675.33,9673.92,0.445 -binance-futures,BTCUSDT,1582329795568000,1582329795691669,0.012,9675.33,9673.96,0.031 -binance-futures,BTCUSDT,1582329795581000,1582329795701099,0.347,9675.33,9673.96,0.031 -binance-futures,BTCUSDT,1582329795605000,1582329795725143,0.335,9675.33,9673.96,0.031 -binance-futures,BTCUSDT,1582329795607000,1582329795725795,0.012,9675.32,9673.97,0.005 -binance-futures,BTCUSDT,1582329795622000,1582329795742283,2.962,9675.32,9673.97,0.005 -binance-futures,BTCUSDT,1582329795628000,1582329795750240,2.962,9675.32,9673.99,0.031 -binance-futures,BTCUSDT,1582329795645000,1582329795764860,0.335,9675.31,9673.99,0.031 -binance-futures,BTCUSDT,1582329795667000,1582329795785441,4.435,9675.31,9673.99,0.031 -binance-futures,BTCUSDT,1582329795687000,1582329795806993,4.435,9675.31,9674,0.031 -binance-futures,BTCUSDT,1582329795689000,1582329795809769,4.435,9675.31,9674.01,0.031 -binance-futures,BTCUSDT,1582329795689000,1582329795809987,0.335,9675.28,9674.02,0.031 -binance-futures,BTCUSDT,1582329795707000,1582329795826996,3.785,9675.28,9674.02,0.031 -binance-futures,BTCUSDT,1582329795711000,1582329795829752,3.785,9675.28,9674.01,0.031 -binance-futures,BTCUSDT,1582329795729000,1582329795850522,0.335,9675.25,9674.01,0.031 -binance-futures,BTCUSDT,1582329795750000,1582329795869699,4.885,9675.25,9674.01,0.031 -binance-futures,BTCUSDT,1582329795771000,1582329795895255,4.55,9675.25,9674.01,0.031 -binance-futures,BTCUSDT,1582329795775000,1582329795896274,0.335,9675.22,9674.01,0.031 -binance-futures,BTCUSDT,1582329795793000,1582329795916055,5.285,9675.22,9674.01,0.031 -binance-futures,BTCUSDT,1582329795823000,1582329795942711,4.95,9675.22,9674.01,0.031 -binance-futures,BTCUSDT,1582329795823000,1582329795943021,0.335,9675.2,9674.01,0.031 -binance-futures,BTCUSDT,1582329795838000,1582329795966872,0.335,9675.2,9674,0.026 -binance-futures,BTCUSDT,1582329795840000,1582329795966887,5.085,9675.2,9674,0.026 -binance-futures,BTCUSDT,1582329795857000,1582329795978656,5.25,9675.19,9674,0.026 -binance-futures,BTCUSDT,1582329795867000,1582329795989253,5.25,9675.19,9674.03,0.031 -binance-futures,BTCUSDT,1582329795868000,1582329795990451,5.25,9675.19,9674.05,0.031 -binance-futures,BTCUSDT,1582329795874000,1582329795993175,0.335,9675.18,9674.05,0.031 -binance-futures,BTCUSDT,1582329795892000,1582329796014824,7.585,9675.18,9674.03,0.031 -binance-futures,BTCUSDT,1582329795893000,1582329796014840,7.585,9675.18,9674.01,0.67 -binance-futures,BTCUSDT,1582329795907000,1582329796027777,7.585,9675.18,9673.58,0.436 -binance-futures,BTCUSDT,1582329795916000,1582329796035661,7.585,9675.18,9674.08,0.031 -binance-futures,BTCUSDT,1582329795936000,1582329796057415,7.585,9675.18,9673.18,0.44 -binance-futures,BTCUSDT,1582329795940000,1582329796062697,0.335,9675.16,9673.18,0.44 -binance-futures,BTCUSDT,1582329795959000,1582329796081910,0.335,9675.16,9673.21,0.031 -binance-futures,BTCUSDT,1582329795961000,1582329796083305,7.735,9675.16,9673.21,0.031 -binance-futures,BTCUSDT,1582329795962000,1582329796083878,7.735,9675.16,9673.22,0.031 -binance-futures,BTCUSDT,1582329795980000,1582329796103429,7.4,9675.16,9673.22,0.031 -binance-futures,BTCUSDT,1582329795987000,1582329796109406,7.4,9675.16,9673.14,2.413 -binance-futures,BTCUSDT,1582329795989000,1582329796109428,7.4,9675.16,9673.24,0.445 -binance-futures,BTCUSDT,1582329795999000,1582329796119731,7.735,9675.16,9673.24,0.445 -binance-futures,BTCUSDT,1582329796002000,1582329796122204,7.4,9675.16,9673.24,0.445 -binance-futures,BTCUSDT,1582329796007000,1582329796127279,7.4,9675.16,9673.24,0.476 -binance-futures,BTCUSDT,1582329796011000,1582329796130324,7.4,9675.16,9673.25,0.031 -binance-futures,BTCUSDT,1582329796011000,1582329796130334,7.4,9675.16,9673.26,0.031 -binance-futures,BTCUSDT,1582329796033000,1582329796153627,7.4,9675.16,9673.32,0.433 -binance-futures,BTCUSDT,1582329796044000,1582329796166450,0.335,9675.15,9673.32,0.433 -binance-futures,BTCUSDT,1582329796056000,1582329796179756,0.335,9675.15,9673.36,0.031 -binance-futures,BTCUSDT,1582329796060000,1582329796180172,7.4,9675.16,9673.36,0.031 -binance-futures,BTCUSDT,1582329796065000,1582329796184630,7.2,9675.15,9673.36,0.031 -binance-futures,BTCUSDT,1582329796083000,1582329796206431,0.335,9675.11,9673.36,0.031 -binance-futures,BTCUSDT,1582329796102000,1582329796222333,0.335,9675.11,9673.37,0.031 -binance-futures,BTCUSDT,1582329796104000,1582329796226526,6.685,9675.11,9673.37,0.031 -binance-futures,BTCUSDT,1582329796111000,1582329796234099,0.002,9675.1,9673.37,0.031 -binance-futures,BTCUSDT,1582329796113000,1582329796235697,0.013,9675.1,9673.37,0.039 -binance-futures,BTCUSDT,1582329796130000,1582329796250244,0.335,9675.07,9673.37,0.008 -binance-futures,BTCUSDT,1582329796137000,1582329796256141,6.713,9675.1,9673.37,0.008 -binance-futures,BTCUSDT,1582329796139000,1582329796259283,6.713,9675.1,9673.39,0.031 -binance-futures,BTCUSDT,1582329796139000,1582329796260534,6.713,9675.1,9673.41,0.031 -binance-futures,BTCUSDT,1582329796145000,1582329796266094,0.335,9675.05,9673.41,0.031 -binance-futures,BTCUSDT,1582329796158000,1582329796281682,0.335,9675.05,9673.4,0.031 -binance-futures,BTCUSDT,1582329796161000,1582329796284920,7.185,9675.05,9673.37,0.008 -binance-futures,BTCUSDT,1582329796189000,1582329796309800,0.335,9674.99,9673.37,0.008 -binance-futures,BTCUSDT,1582329796209000,1582329796328291,6.835,9674.99,9673.37,0.008 -binance-futures,BTCUSDT,1582329796230000,1582329796349155,0.335,9674.95,9673.37,0.008 -binance-futures,BTCUSDT,1582329796248000,1582329796391428,6.235,9674.95,9673.37,0.008 -binance-futures,BTCUSDT,1582329796301000,1582329796421106,0.335,9674.93,9673.37,0.008 -binance-futures,BTCUSDT,1582329796305000,1582329796425763,5.9,9674.95,9673.37,0.008 -binance-futures,BTCUSDT,1582329796317000,1582329796435249,5.15,9674.93,9673.37,0.008 -binance-futures,BTCUSDT,1582329796327000,1582329796445502,5.15,9674.93,9673.4,0.031 -binance-futures,BTCUSDT,1582329796327000,1582329796445514,5.15,9674.93,9673.41,0.031 -binance-futures,BTCUSDT,1582329796433000,1582329796552368,0.335,9675.05,9673.41,0.031 -binance-futures,BTCUSDT,1582329796436000,1582329796555062,0.335,9675.05,9673.42,0.031 -binance-futures,BTCUSDT,1582329796456000,1582329796575992,0.06,9675.31,9673.42,0.031 -binance-futures,BTCUSDT,1582329796480000,1582329796600805,0.06,9675.31,9673.47,0.445 -binance-futures,BTCUSDT,1582329796503000,1582329796623650,0.06,9675.31,9673.49,0.031 -binance-futures,BTCUSDT,1582329796504000,1582329796625117,0.06,9675.31,9673.51,0.031 -binance-futures,BTCUSDT,1582329796610000,1582329796732772,0.011,9675.3,9673.52,0.008 -binance-futures,BTCUSDT,1582329796630000,1582329796751154,7.461,9675.3,9673.52,0.008 -binance-futures,BTCUSDT,1582329796634000,1582329796754655,7.461,9675.3,9673.52,0.039 -binance-futures,BTCUSDT,1582329796644000,1582329796765048,7.796,9675.3,9673.52,0.039 -binance-futures,BTCUSDT,1582329796648000,1582329796768175,1.924,9674.95,9673.52,0.039 -binance-futures,BTCUSDT,1582329796654000,1582329796778655,1.924,9674.95,9673.52,0.008 -binance-futures,BTCUSDT,1582329796663000,1582329796786658,0.335,9675.22,9673.52,0.008 -binance-futures,BTCUSDT,1582329796666000,1582329796788619,4.6,9674.95,9673.52,0.008 -binance-futures,BTCUSDT,1582329796675000,1582329796797765,0.335,9674.9,9673.52,0.008 -binance-futures,BTCUSDT,1582329796696000,1582329796820936,6.8,9674.95,9673.52,0.008 -binance-futures,BTCUSDT,1582329796700000,1582329796823074,6.885,9674.9,9673.52,0.008 -binance-futures,BTCUSDT,1582329796737000,1582329796856228,0.335,9674.83,9673.52,0.008 -binance-futures,BTCUSDT,1582329796756000,1582329796878407,6.135,9674.83,9673.52,0.008 -binance-futures,BTCUSDT,1582329796780000,1582329796900496,0.335,9674.77,9673.52,0.008 -binance-futures,BTCUSDT,1582329796799000,1582329796919821,5.485,9674.77,9673.52,0.008 -binance-futures,BTCUSDT,1582329796826000,1582329796948108,5.15,9674.77,9673.52,0.008 -binance-futures,BTCUSDT,1582329796826000,1582329796948118,0.335,9674.71,9673.52,0.008 -binance-futures,BTCUSDT,1582329796847000,1582329796969657,4.935,9674.71,9673.52,0.008 -binance-futures,BTCUSDT,1582329796860000,1582329796981258,4.935,9674.71,9673.14,2.413 -binance-futures,BTCUSDT,1582329796862000,1582329796981271,4.935,9674.71,9673.15,0.008 -binance-futures,BTCUSDT,1582329796872000,1582329796991994,4.6,9674.71,9673.15,0.008 -binance-futures,BTCUSDT,1582329796874000,1582329796994986,0.335,9674.66,9673.15,0.008 -binance-futures,BTCUSDT,1582329796884000,1582329797005948,0.335,9674.66,9673.17,0.031 -binance-futures,BTCUSDT,1582329796884000,1582329797006075,0.335,9674.66,9673.18,0.031 -binance-futures,BTCUSDT,1582329796886000,1582329797008518,0.335,9674.66,9673.19,0.031 -binance-futures,BTCUSDT,1582329796891000,1582329797012257,4.985,9674.66,9673.19,0.031 -binance-futures,BTCUSDT,1582329796918000,1582329797040432,0.335,9674.63,9673.19,0.031 -binance-futures,BTCUSDT,1582329796938000,1582329797057917,4.535,9674.63,9673.19,0.031 -binance-futures,BTCUSDT,1582329796940000,1582329797060810,4.2,9674.63,9673.19,0.031 -binance-futures,BTCUSDT,1582329796952000,1582329797073986,4.2,9674.63,9673.15,0.008 -binance-futures,BTCUSDT,1582329796958000,1582329797078419,0.335,9674.55,9673.15,0.008 -binance-futures,BTCUSDT,1582329796964000,1582329797084206,0.335,9674.55,9673.21,0.031 -binance-futures,BTCUSDT,1582329796964000,1582329797085069,0.335,9674.55,9673.3,0.431 -binance-futures,BTCUSDT,1582329796966000,1582329797086542,4.2,9674.63,9673.3,0.431 -binance-futures,BTCUSDT,1582329796969000,1582329797089233,0.335,9674.62,9673.23,0.031 -binance-futures,BTCUSDT,1582329796975000,1582329797094619,4.75,9674.55,9673.23,0.031 -binance-futures,BTCUSDT,1582329796982000,1582329797105976,4.75,9674.55,9673.15,0.008 -binance-futures,BTCUSDT,1582329797002000,1582329797124222,0.335,9674.4,9673.15,0.008 -binance-futures,BTCUSDT,1582329797021000,1582329797141680,4.735,9674.4,9673.15,0.008 -binance-futures,BTCUSDT,1582329797045000,1582329797164871,4.4,9674.4,9673.15,0.008 -binance-futures,BTCUSDT,1582329797047000,1582329797167508,0.335,9674.26,9673.15,0.008 -binance-futures,BTCUSDT,1582329797065000,1582329797187023,0.335,9674.26,9673.18,0.031 -binance-futures,BTCUSDT,1582329797065000,1582329797187451,0.335,9674.26,9673.19,0.031 -binance-futures,BTCUSDT,1582329797084000,1582329797203689,0.335,9674.99,9673.19,0.031 -binance-futures,BTCUSDT,1582329797096000,1582329797214920,2.262,9675.22,9673.19,0.031 -binance-futures,BTCUSDT,1582329797100000,1582329797220383,2.262,9675.22,9673.19,0.476 -binance-futures,BTCUSDT,1582329797104000,1582329797226945,5.95,9674.99,9673.19,0.476 -binance-futures,BTCUSDT,1582329797107000,1582329797226972,5.95,9674.99,9673.19,0.445 -binance-futures,BTCUSDT,1582329797110000,1582329797235174,0.011,9674.98,9673.19,0.445 -binance-futures,BTCUSDT,1582329797113000,1582329797235200,0.011,9674.98,9673.2,0.008 -binance-futures,BTCUSDT,1582329797113000,1582329797235213,0.013,9674.98,9673.2,0.008 -binance-futures,BTCUSDT,1582329797123000,1582329797246370,0.013,9674.98,9673.23,0.031 -binance-futures,BTCUSDT,1582329797136000,1582329797258962,0.348,9674.98,9673.23,0.031 -binance-futures,BTCUSDT,1582329797136000,1582329797258971,7.398,9674.98,9673.23,0.031 -binance-futures,BTCUSDT,1582329797148000,1582329797269947,2.215,9674.71,9673.23,0.031 -binance-futures,BTCUSDT,1582329797169000,1582329797292106,6.765,9674.71,9673.2,0.008 -binance-futures,BTCUSDT,1582329797175000,1582329797295899,0.335,9674.7,9673.2,0.008 -binance-futures,BTCUSDT,1582329797193000,1582329797311690,6.785,9674.7,9673.2,0.008 -binance-futures,BTCUSDT,1582329797217000,1582329797338762,0.335,9674.64,9673.2,0.008 -binance-futures,BTCUSDT,1582329797238000,1582329797358045,4.585,9674.64,9673.2,0.008 -binance-futures,BTCUSDT,1582329797250000,1582329797367210,4.25,9674.64,9673.2,0.008 -binance-futures,BTCUSDT,1582329797251000,1582329797369490,2.368,9674.98,9673.2,0.008 -binance-futures,BTCUSDT,1582329797263000,1582329797383904,0.335,9674.63,9673.2,0.008 -binance-futures,BTCUSDT,1582329797270000,1582329797394516,2.368,9674.98,9673.2,0.008 -binance-futures,BTCUSDT,1582329797272000,1582329797395236,2.368,9674.98,9673.24,0.031 -binance-futures,BTCUSDT,1582329797277000,1582329797409521,0.335,9674.97,9673.24,0.031 -binance-futures,BTCUSDT,1582329797288000,1582329797428626,2.368,9674.98,9673.24,0.031 -binance-futures,BTCUSDT,1582329797298000,1582329797430259,0.335,9674.97,9673.24,0.031 -binance-futures,BTCUSDT,1582329797307000,1582329797430366,4.835,9674.97,9673.24,0.031 -binance-futures,BTCUSDT,1582329797314000,1582329797434140,4.5,9674.97,9673.24,0.031 -binance-futures,BTCUSDT,1582329797337000,1582329797458377,4.5,9674.97,9673.26,0.031 -binance-futures,BTCUSDT,1582329797338000,1582329797462468,0.335,9674.95,9673.26,0.031 -binance-futures,BTCUSDT,1582329797351000,1582329797470342,0.335,9674.95,9673.26,0.476 -binance-futures,BTCUSDT,1582329797353000,1582329797475071,0.335,9674.95,9673.26,0.38 -binance-futures,BTCUSDT,1582329797361000,1582329797482507,4.535,9674.95,9673.26,0.38 -binance-futures,BTCUSDT,1582329797363000,1582329797482544,4.535,9674.95,9673.27,0.008 -binance-futures,BTCUSDT,1582329797373000,1582329797492874,4.535,9674.95,9673.29,0.031 -binance-futures,BTCUSDT,1582329797373000,1582329797492884,4.535,9674.95,9673.3,0.031 -binance-futures,BTCUSDT,1582329797375000,1582329797498417,4.535,9674.95,9673.3,0.476 -binance-futures,BTCUSDT,1582329797379000,1582329797500626,4.2,9674.95,9673.3,0.476 -binance-futures,BTCUSDT,1582329797400000,1582329797520317,0.36,9674.94,9673.3,0.476 -binance-futures,BTCUSDT,1582329797417000,1582329797536983,5.41,9674.94,9673.3,0.476 -binance-futures,BTCUSDT,1582329797425000,1582329797548012,5.41,9674.94,9673.33,0.031 -binance-futures,BTCUSDT,1582329797427000,1582329797548063,5.41,9674.94,9673.34,0.031 -binance-futures,BTCUSDT,1582329797437000,1582329797558523,5.05,9674.94,9673.34,0.031 -binance-futures,BTCUSDT,1582329797440000,1582329797561675,0.36,9674.89,9673.34,0.031 -binance-futures,BTCUSDT,1582329797450000,1582329797570167,5.05,9674.94,9673.34,0.031 -binance-futures,BTCUSDT,1582329797457000,1582329797577232,5.05,9674.94,9673.38,0.419 -binance-futures,BTCUSDT,1582329797461000,1582329797587645,4.75,9674.89,9673.38,0.419 -binance-futures,BTCUSDT,1582329797521000,1582329797642041,0.013,9674.96,9673.38,0.419 -binance-futures,BTCUSDT,1582329797545000,1582329797665977,0.013,9674.96,9673.41,0.031 -binance-futures,BTCUSDT,1582329797548000,1582329797668370,0.013,9674.96,9673.42,0.031 -binance-futures,BTCUSDT,1582329797613000,1582329797733892,0.011,9674.96,9673.42,0.031 -binance-futures,BTCUSDT,1582329797613000,1582329797924674,0.011,9674.96,9673.43,0.419 -binance-futures,BTCUSDT,1582329797809000,1582329797940033,2.926,9674.64,9673.43,0.45 -binance-futures,BTCUSDT,1582329797820000,1582329797942367,0.36,9674.97,9673.43,0.45 -binance-futures,BTCUSDT,1582329797825000,1582329797950343,0.36,9674.97,9673.47,0.031 -binance-futures,BTCUSDT,1582329797845000,1582329797966501,2.355,9674.98,9673.47,0.031 -binance-futures,BTCUSDT,1582329797847000,1582329797969300,0.36,9674.63,9673.47,0.031 -binance-futures,BTCUSDT,1582329797849000,1582329797969307,2.355,9674.98,9673.47,0.031 -binance-futures,BTCUSDT,1582329797863000,1582329797983681,0.36,9674.97,9673.47,0.031 -binance-futures,BTCUSDT,1582329797869000,1582329797989181,0.36,9674.97,9673.48,0.031 -binance-futures,BTCUSDT,1582329797870000,1582329797995640,0.36,9674.97,9673.5,0.031 -binance-futures,BTCUSDT,1582329797877000,1582329797998068,2.355,9674.98,9673.5,0.031 -binance-futures,BTCUSDT,1582329797883000,1582329798003393,3.55,9674.97,9673.5,0.031 -binance-futures,BTCUSDT,1582329797894000,1582329798013234,2.355,9674.98,9673.5,0.031 -binance-futures,BTCUSDT,1582329797903000,1582329798024017,2.355,9674.98,9673.52,0.419 -binance-futures,BTCUSDT,1582329797927000,1582329798050048,2.355,9674.98,9673.56,0.031 -binance-futures,BTCUSDT,1582329797972000,1582329798090371,2.715,9674.98,9673.56,0.031 -binance-futures,BTCUSDT,1582329797993000,1582329798113533,2.715,9674.98,9673.57,0.031 -binance-futures,BTCUSDT,1582329798014000,1582329798135663,2.355,9674.98,9673.57,0.031 -binance-futures,BTCUSDT,1582329798016000,1582329798135758,0.36,9674.95,9673.57,0.031 -binance-futures,BTCUSDT,1582329798026000,1582329798145643,0.36,9674.95,9673.58,0.67 -binance-futures,BTCUSDT,1582329798031000,1582329798151070,4.31,9674.95,9673.58,0.67 -binance-futures,BTCUSDT,1582329798035000,1582329798153988,3.95,9674.95,9673.58,0.67 -binance-futures,BTCUSDT,1582329798045000,1582329798165231,2.355,9674.98,9673.58,0.67 -binance-futures,BTCUSDT,1582329798050000,1582329798173737,0.36,9674.96,9673.58,0.67 -binance-futures,BTCUSDT,1582329798050000,1582329798174636,2.355,9674.98,9673.58,0.67 -binance-futures,BTCUSDT,1582329798052000,1582329798175122,2.355,9674.98,9673.51,0.031 -binance-futures,BTCUSDT,1582329798056000,1582329798178054,2.355,9674.98,9673.67,0.419 -binance-futures,BTCUSDT,1582329798071000,1582329798192531,4.6,9674.96,9673.67,0.419 -binance-futures,BTCUSDT,1582329798082000,1582329798204125,4.6,9674.96,9673.15,0.686 -binance-futures,BTCUSDT,1582329798086000,1582329798207321,4.96,9674.96,9673.34,0.419 -binance-futures,BTCUSDT,1582329798093000,1582329798214641,4.96,9674.96,9673.43,0.419 -binance-futures,BTCUSDT,1582329798100000,1582329798220675,4.96,9674.96,9673.15,0.686 -binance-futures,BTCUSDT,1582329798102000,1582329798224365,0.36,9674.93,9673.15,0.686 -binance-futures,BTCUSDT,1582329798103000,1582329798226293,0.36,9674.93,9673.16,0.419 -binance-futures,BTCUSDT,1582329798107000,1582329798229270,0.36,9674.93,9673.18,0.031 -binance-futures,BTCUSDT,1582329798109000,1582329798229938,0.36,9674.93,9673.19,0.031 -binance-futures,BTCUSDT,1582329798114000,1582329798235957,0.36,9674.93,9673.35,0.008 -binance-futures,BTCUSDT,1582329798125000,1582329798250624,8.11,9674.93,9673.35,0.008 -binance-futures,BTCUSDT,1582329798129000,1582329798251923,1.597,9674.64,9673.35,0.008 -binance-futures,BTCUSDT,1582329798153000,1582329798276993,4.95,9674.64,9673.35,0.008 -binance-futures,BTCUSDT,1582329798156000,1582329798280106,4.95,9674.64,9673.39,0.031 -binance-futures,BTCUSDT,1582329798159000,1582329798282110,0.36,9674.61,9673.39,0.031 -binance-futures,BTCUSDT,1582329798184000,1582329798308468,5.91,9674.61,9673.39,0.031 -binance-futures,BTCUSDT,1582329798205000,1582329798339740,0.36,9674.61,9673.39,0.031 -binance-futures,BTCUSDT,1582329798209000,1582329798354114,0.36,9674.61,9673.4,0.031 -binance-futures,BTCUSDT,1582329798214000,1582329798357075,0.36,9674.86,9673.4,0.031 -binance-futures,BTCUSDT,1582329798219000,1582329798357121,0.36,9674.82,9673.4,0.031 -binance-futures,BTCUSDT,1582329798223000,1582329798357159,0.011,9674.95,9673.4,0.031 -binance-futures,BTCUSDT,1582329798225000,1582329798357192,0.36,9674.65,9673.4,0.031 -binance-futures,BTCUSDT,1582329798239000,1582329798360389,0.011,9674.95,9673.4,0.031 -binance-futures,BTCUSDT,1582329798246000,1582329798366881,3.75,9674.82,9673.4,0.031 -binance-futures,BTCUSDT,1582329798251000,1582329798375294,2.8,9674.65,9673.4,0.031 -binance-futures,BTCUSDT,1582329798273000,1582329798394948,5,9674.65,9673.4,0.031 -binance-futures,BTCUSDT,1582329798277000,1582329798398128,0.36,9674.63,9673.4,0.031 -binance-futures,BTCUSDT,1582329798295000,1582329798427041,5.06,9674.63,9673.4,0.031 -binance-futures,BTCUSDT,1582329798313000,1582329798443035,0.36,9674.63,9673.4,0.031 -binance-futures,BTCUSDT,1582329798359000,1582329798479335,0.011,9674.95,9673.4,0.031 -binance-futures,BTCUSDT,1582329798383000,1582329798505650,0.36,9674.97,9673.4,0.031 -binance-futures,BTCUSDT,1582329798426000,1582329798550943,1.847,9674.98,9673.4,0.031 -binance-futures,BTCUSDT,1582329798446000,1582329798567112,1.847,9674.98,9673.41,3 -binance-futures,BTCUSDT,1582329798470000,1582329798593308,1.847,9674.98,9673.44,0.031 -binance-futures,BTCUSDT,1582329798470000,1582329798593345,1.847,9674.98,9673.45,0.031 -binance-futures,BTCUSDT,1582329798475000,1582329798597617,1.847,9674.98,9673.46,0.455 -binance-futures,BTCUSDT,1582329798552000,1582329798672175,1.847,9674.98,9673.5,0.031 -binance-futures,BTCUSDT,1582329798601000,1582329798720869,1.847,9674.98,9673.51,0.438 -binance-futures,BTCUSDT,1582329798625000,1582329798746876,1.847,9674.98,9673.55,0.031 -binance-futures,BTCUSDT,1582329798627000,1582329798749126,2.067,9674.98,9673.55,0.031 -binance-futures,BTCUSDT,1582329798640000,1582329798760910,3.18,9674.61,9673.55,0.031 -binance-futures,BTCUSDT,1582329798659000,1582329798781177,6.38,9674.61,9673.55,0.031 -binance-futures,BTCUSDT,1582329798680000,1582329798801310,3.2,9674.61,9673.55,0.031 -binance-futures,BTCUSDT,1582329798682000,1582329798805272,0.22,9674.77,9673.55,0.031 -binance-futures,BTCUSDT,1582329798684000,1582329798805298,0.22,9674.77,9673.56,0.031 -binance-futures,BTCUSDT,1582329798703000,1582329798824726,1.847,9674.98,9673.56,0.031 -binance-futures,BTCUSDT,1582329798703000,1582329798824738,0.22,9674.48,9673.56,0.031 -binance-futures,BTCUSDT,1582329798712000,1582329798833194,1.847,9674.98,9673.56,0.031 -binance-futures,BTCUSDT,1582329798722000,1582329798845447,3,9674.48,9673.56,0.031 -binance-futures,BTCUSDT,1582329798764000,1582329798885296,3,9674.48,9673.59,0.031 -binance-futures,BTCUSDT,1582329798775000,1582329798896045,0.22,9674.69,9673.59,0.031 -binance-futures,BTCUSDT,1582329798801000,1582329798922672,1.847,9674.98,9673.59,0.031 -binance-futures,BTCUSDT,1582329798815000,1582329798936840,0.22,9674.97,9673.59,0.031 -binance-futures,BTCUSDT,1582329798837000,1582329798956493,5.57,9674.97,9673.59,0.031 -binance-futures,BTCUSDT,1582329798864000,1582329798984309,5.35,9674.97,9673.59,0.031 -binance-futures,BTCUSDT,1582329798864000,1582329798984323,0.22,9674.95,9673.59,0.031 -binance-futures,BTCUSDT,1582329798873000,1582329798992243,0.22,9674.95,9673.62,0.031 -binance-futures,BTCUSDT,1582329798882000,1582329799001479,6.97,9674.95,9673.62,0.031 -binance-futures,BTCUSDT,1582329798889000,1582329799009498,6.97,9674.95,9673.97,1.95 -binance-futures,BTCUSDT,1582329798905000,1582329799028663,6.75,9674.95,9673.97,1.95 -binance-futures,BTCUSDT,1582329798907000,1582329799028674,0.22,9674.92,9673.97,1.95 -binance-futures,BTCUSDT,1582329798917000,1582329799039719,0.22,9674.92,9673.62,0.031 -binance-futures,BTCUSDT,1582329798927000,1582329799048765,5.72,9674.92,9673.62,0.031 -binance-futures,BTCUSDT,1582329798934000,1582329799055282,5.72,9674.92,9674.01,0.031 -binance-futures,BTCUSDT,1582329798963000,1582329799082454,5.5,9674.92,9674.01,0.031 -binance-futures,BTCUSDT,1582329798967000,1582329799088232,0.22,9674.89,9674.01,0.031 -binance-futures,BTCUSDT,1582329798976000,1582329799099766,0.22,9674.89,9673.97,1.95 -binance-futures,BTCUSDT,1582329798989000,1582329799108448,5.32,9674.89,9673.97,1.95 -binance-futures,BTCUSDT,1582329798996000,1582329799115994,5.1,9674.89,9673.97,1.95 -binance-futures,BTCUSDT,1582329799017000,1582329799137209,0.22,9674.88,9673.97,1.95 -binance-futures,BTCUSDT,1582329799036000,1582329799156696,5.92,9674.88,9673.97,1.95 -binance-futures,BTCUSDT,1582329799060000,1582329799180482,0.031,9674.84,9673.97,1.95 -binance-futures,BTCUSDT,1582329799079000,1582329799198707,7.181,9674.84,9673.97,1.95 -binance-futures,BTCUSDT,1582329799084000,1582329799204859,7.15,9674.84,9673.97,1.95 -binance-futures,BTCUSDT,1582329799104000,1582329799226737,0.22,9674.8,9673.97,1.95 -binance-futures,BTCUSDT,1582329799108000,1582329799230351,0.251,9674.8,9673.97,1.95 -binance-futures,BTCUSDT,1582329799118000,1582329799238665,0.251,9674.8,9673.15,0.686 -binance-futures,BTCUSDT,1582329799123000,1582329799244351,0.251,9674.8,9673.58,0.448 -binance-futures,BTCUSDT,1582329799127000,1582329799247609,7.551,9674.8,9673.15,0.686 -binance-futures,BTCUSDT,1582329799130000,1582329799249934,7.551,9674.8,9673.34,0.448 -binance-futures,BTCUSDT,1582329799141000,1582329799262851,7.52,9674.8,9673.15,0.686 -binance-futures,BTCUSDT,1582329799144000,1582329799264003,7.52,9674.8,9673.55,3.145 -binance-futures,BTCUSDT,1582329799146000,1582329799266599,0.22,9674.78,9673.55,3.145 -binance-futures,BTCUSDT,1582329799152000,1582329799273536,1.944,9674.27,9673.55,3.145 -binance-futures,BTCUSDT,1582329799162000,1582329799283635,0.031,9674.76,9673.55,3.145 -binance-futures,BTCUSDT,1582329799163000,1582329799283981,3.065,9674.27,9673.55,3.145 -binance-futures,BTCUSDT,1582329799169000,1582329799292789,7.865,9674.27,9673.55,3.145 -binance-futures,BTCUSDT,1582329799175000,1582329799296245,7.093,9674.27,9673.55,3.145 -binance-futures,BTCUSDT,1582329799184000,1582329799307030,2.933,9674.26,9673.55,3.145 -binance-futures,BTCUSDT,1582329799189000,1582329799311190,0.22,9674.25,9673.55,3.145 -binance-futures,BTCUSDT,1582329799207000,1582329799327851,0.22,9674.25,9673.15,0.686 -binance-futures,BTCUSDT,1582329799209000,1582329799330024,0.22,9674.25,9673.97,1.658 -binance-futures,BTCUSDT,1582329799213000,1582329799333226,6.37,9674.25,9673.97,1.658 -binance-futures,BTCUSDT,1582329799218000,1582329799338241,6.15,9674.25,9673.97,1.658 -binance-futures,BTCUSDT,1582329799224000,1582329799343610,0.22,9674.67,9673.97,1.658 -binance-futures,BTCUSDT,1582329799226000,1582329799346624,0.22,9674.67,9673.26,0.447 -binance-futures,BTCUSDT,1582329799229000,1582329799352930,2,9674.19,9673.15,3.816 -binance-futures,BTCUSDT,1582329799233000,1582329799356305,2,9674.19,9673.52,0.457 -binance-futures,BTCUSDT,1582329799235000,1582329799356458,2,9674.19,9673.15,3.816 -binance-futures,BTCUSDT,1582329799240000,1582329799362765,2,9674.19,9673.3,0.435 -binance-futures,BTCUSDT,1582329799244000,1582329799365642,0.031,9674.21,9673.3,0.435 -binance-futures,BTCUSDT,1582329799247000,1582329799367534,0.031,9674.21,9673.15,3.816 -binance-futures,BTCUSDT,1582329799247000,1582329799367549,0.031,9674.21,9673.49,0.461 -binance-futures,BTCUSDT,1582329799253000,1582329799380540,1.847,9674.98,9673.15,3.816 -binance-futures,BTCUSDT,1582329799264000,1582329799388917,0.22,9673.16,9673.15,3.816 -binance-futures,BTCUSDT,1582329799270000,1582329799393394,1.291,9673.16,9673.15,3.816 -binance-futures,BTCUSDT,1582329799274000,1582329799393923,12.001,9673.16,9673.15,3.816 -binance-futures,BTCUSDT,1582329799279000,1582329799401023,10.71,9673.16,9673.15,3.816 -binance-futures,BTCUSDT,1582329799287000,1582329799408701,0.22,9674.89,9673.15,3.816 -binance-futures,BTCUSDT,1582329799292000,1582329799412981,1.847,9674.98,9673.15,3.816 -binance-futures,BTCUSDT,1582329799298000,1582329799419954,2,9674.64,9673.15,4.526 -binance-futures,BTCUSDT,1582329799300000,1582329799422155,2,9674.64,9673.15,5.196 -binance-futures,BTCUSDT,1582329799302000,1582329799422525,2,9674.64,9673.15,5.646 -binance-futures,BTCUSDT,1582329799307000,1582329799434442,2,9674.46,9673.17,0.445 -binance-futures,BTCUSDT,1582329799323000,1582329799471418,5.1,9674.64,9673.17,0.445 -binance-futures,BTCUSDT,1582329799330000,1582329799472802,4.4,9674.46,9673.17,0.445 -binance-futures,BTCUSDT,1582329799338000,1582329799475304,4.4,9674.46,9673.18,0.031 -binance-futures,BTCUSDT,1582329799338000,1582329799475886,0.22,9674.45,9673.19,0.031 -binance-futures,BTCUSDT,1582329799373000,1582329799494245,6.97,9674.45,9673.19,0.031 -binance-futures,BTCUSDT,1582329799389000,1582329799510282,6.97,9674.45,9673.15,3.816 -binance-futures,BTCUSDT,1582329799393000,1582329799513535,6.75,9674.45,9673.15,3.816 -binance-futures,BTCUSDT,1582329799398000,1582329799519283,6.75,9674.45,9673.16,0.429 -binance-futures,BTCUSDT,1582329799407000,1582329799526710,6.75,9674.45,9673.15,3.816 -binance-futures,BTCUSDT,1582329799415000,1582329799534969,1.847,9674.98,9673.15,3.816 -binance-futures,BTCUSDT,1582329799416000,1582329799537706,0.22,9674.44,9673.15,3.816 -binance-futures,BTCUSDT,1582329799420000,1582329799540637,1.847,9674.98,9673.15,3.816 -binance-futures,BTCUSDT,1582329799423000,1582329799543736,0.22,9674.84,9673.17,0.472 -binance-futures,BTCUSDT,1582329799438000,1582329799559732,4.35,9674.44,9673.18,0.031 -binance-futures,BTCUSDT,1582329799445000,1582329799565807,4.35,9674.44,9673.19,0.031 -binance-futures,BTCUSDT,1582329799464000,1582329799585046,4.35,9674.44,9673.25,0.462 -binance-futures,BTCUSDT,1582329799488000,1582329799608500,4.35,9674.44,9673.28,0.031 -binance-futures,BTCUSDT,1582329799489000,1582329799611759,4.35,9674.44,9673.29,0.031 -binance-futures,BTCUSDT,1582329799491000,1582329799612253,1.847,9674.98,9673.29,0.031 -binance-futures,BTCUSDT,1582329799516000,1582329799636933,0.22,9674.73,9673.29,0.031 -binance-futures,BTCUSDT,1582329799518000,1582329799639238,1.847,9674.98,9673.29,0.031 -binance-futures,BTCUSDT,1582329799520000,1582329799641919,1.847,9674.98,9673.3,0.446 -binance-futures,BTCUSDT,1582329799522000,1582329799641930,0.22,9674.97,9673.3,0.446 -binance-futures,BTCUSDT,1582329799536000,1582329799656113,4.55,9674.73,9673.3,0.446 -binance-futures,BTCUSDT,1582329799542000,1582329799664359,4.55,9674.73,9673.31,0.031 -binance-futures,BTCUSDT,1582329799562000,1582329799684066,0.22,9674.72,9673.31,0.031 -binance-futures,BTCUSDT,1582329799583000,1582329799703933,6.12,9674.72,9673.31,0.501 -binance-futures,BTCUSDT,1582329799587000,1582329799707217,6.12,9674.72,9673.34,0.031 -binance-futures,BTCUSDT,1582329799597000,1582329799719522,5.9,9674.72,9673.34,0.031 -binance-futures,BTCUSDT,1582329799608000,1582329799730602,5.9,9674.72,9673.31,0.47 -binance-futures,BTCUSDT,1582329799620000,1582329799740504,5.9,9674.72,9673.34,0.472 -binance-futures,BTCUSDT,1582329799623000,1582329799743394,0.22,9674.71,9673.34,0.472 -binance-futures,BTCUSDT,1582329799631000,1582329799751021,5.9,9674.72,9673.34,0.503 -binance-futures,BTCUSDT,1582329799635000,1582329799753626,5.9,9674.72,9673.35,0.031 -binance-futures,BTCUSDT,1582329799642000,1582329799762694,7.5,9674.71,9673.58,2.679 -binance-futures,BTCUSDT,1582329799647000,1582329799767538,7.72,9674.71,9673.58,2.679 -binance-futures,BTCUSDT,1582329799667000,1582329799788123,1.42,9674.67,9673.58,2.679 -binance-futures,BTCUSDT,1582329799686000,1582329799807644,8.37,9674.67,9673.58,2.679 -binance-futures,BTCUSDT,1582329799692000,1582329799817022,8.37,9674.67,9673.62,0.031 -binance-futures,BTCUSDT,1582329799696000,1582329799817061,0.22,9674.65,9673.62,0.031 -binance-futures,BTCUSDT,1582329799714000,1582329799837122,0.22,9674.65,9673.58,2.679 -binance-futures,BTCUSDT,1582329799716000,1582329799839297,7.97,9674.65,9673.58,2.679 -binance-futures,BTCUSDT,1582329799741000,1582329799863321,0.031,9674.63,9673.58,2.679 -binance-futures,BTCUSDT,1582329799742000,1582329799864002,0.031,9674.61,9673.58,2.679 -binance-futures,BTCUSDT,1582329799760000,1582329799881844,7.231,9674.61,9673.58,2.679 -binance-futures,BTCUSDT,1582329799765000,1582329799886085,7.2,9674.61,9673.58,2.679 -binance-futures,BTCUSDT,1582329799788000,1582329799908267,0.22,9674.59,9673.58,2.679 -binance-futures,BTCUSDT,1582329799790000,1582329799911295,0.031,9674.57,9673.58,2.679 -binance-futures,BTCUSDT,1582329799809000,1582329799928381,6.631,9674.57,9673.58,2.679 -binance-futures,BTCUSDT,1582329799814000,1582329799933870,0.22,9674.56,9673.58,2.679 -binance-futures,BTCUSDT,1582329799833000,1582329799953146,8.32,9674.56,9673.58,2.679 -binance-futures,BTCUSDT,1582329799835000,1582329799953654,0.031,9674.52,9673.58,2.679 -binance-futures,BTCUSDT,1582329799850000,1582329799973888,6.931,9674.52,9673.58,2.679 -binance-futures,BTCUSDT,1582329799869000,1582329799991219,7.151,9674.52,9673.58,2.679 -binance-futures,BTCUSDT,1582329799878000,1582329800001187,0.22,9674.49,9673.58,2.679 -binance-futures,BTCUSDT,1582329799894000,1582329800013778,0.031,9674.48,9673.58,2.679 -binance-futures,BTCUSDT,1582329799913000,1582329800030498,6.731,9674.48,9673.58,2.679 -binance-futures,BTCUSDT,1582329799916000,1582329800035461,6.7,9674.48,9673.58,2.679 -binance-futures,BTCUSDT,1582329799925000,1582329800045274,6.92,9674.48,9673.58,2.679 -binance-futures,BTCUSDT,1582329799934000,1582329800052853,0.031,9674.44,9673.58,2.679 -binance-futures,BTCUSDT,1582329799953000,1582329800072705,5.081,9674.44,9673.58,2.679 -binance-futures,BTCUSDT,1582329799955000,1582329800075208,0.031,9674.43,9673.58,2.679 -binance-futures,BTCUSDT,1582329799955000,1582329800075352,0.031,9674.42,9673.58,2.679 -binance-futures,BTCUSDT,1582329799957000,1582329800077982,0.031,9674.41,9673.58,2.679 -binance-futures,BTCUSDT,1582329799977000,1582329800098280,6.331,9674.41,9673.58,2.679 -binance-futures,BTCUSDT,1582329799991000,1582329800113398,0.22,9674.4,9673.58,2.679 -binance-futures,BTCUSDT,1582329800010000,1582329800130614,6.72,9674.4,9673.58,2.679 -binance-futures,BTCUSDT,1582329800015000,1582329800135477,0.016,9674.36,9673.58,2.679 -binance-futures,BTCUSDT,1582329800033000,1582329800170843,5.766,9674.36,9673.58,2.679 -binance-futures,BTCUSDT,1582329800038000,1582329800174253,5.986,9674.36,9673.58,2.679 -binance-futures,BTCUSDT,1582329800077000,1582329800200804,0.22,9674.31,9673.58,2.679 -binance-futures,BTCUSDT,1582329800100000,1582329800219657,5.67,9674.31,9673.58,2.679 -binance-futures,BTCUSDT,1582329800114000,1582329800239263,5.67,9674.31,9674.19,10.71 -binance-futures,BTCUSDT,1582329800119000,1582329800240126,5.45,9674.31,9674.19,10.71 -binance-futures,BTCUSDT,1582329800140000,1582329800259788,2,9674.25,9674.19,10.71 -binance-futures,BTCUSDT,1582329800142000,1582329800262710,2,9674.25,9673.58,2.679 -binance-futures,BTCUSDT,1582329800158000,1582329800278268,2.097,9674.71,9673.58,2.679 -binance-futures,BTCUSDT,1582329800160000,1582329800281865,2.097,9674.71,9674.3,1.071 -binance-futures,BTCUSDT,1582329800169000,1582329800290112,2.097,9674.71,9674.24,0.44 -binance-futures,BTCUSDT,1582329800171000,1582329800292154,2.097,9674.71,9674.24,11.15 -binance-futures,BTCUSDT,1582329800175000,1582329800294606,2.097,9674.71,9674.24,12.221 -binance-futures,BTCUSDT,1582329800177000,1582329800298199,2.256,9674.41,9674.24,22.931 -binance-futures,BTCUSDT,1582329800181000,1582329800303534,2.256,9674.41,9674.24,12.221 -binance-futures,BTCUSDT,1582329800197000,1582329800330691,2,9674.39,9674.28,0.031 -binance-futures,BTCUSDT,1582329800285000,1582329800407104,2,9674.39,9674.29,0.031 -binance-futures,BTCUSDT,1582329800303000,1582329800424740,2,9674.39,9674.28,0.031 -binance-futures,BTCUSDT,1582329800305000,1582329800427767,2,9674.39,9674.27,0.031 -binance-futures,BTCUSDT,1582329800305000,1582329800427779,2,9674.39,9673.25,0.447 -binance-futures,BTCUSDT,1582329800314000,1582329800435976,2,9674.39,9673.81,0.447 -binance-futures,BTCUSDT,1582329800326000,1582329800446527,2,9674.35,9673.81,0.447 -binance-futures,BTCUSDT,1582329800328000,1582329800449810,4,9674.35,9673.81,0.447 -binance-futures,BTCUSDT,1582329800333000,1582329800455364,4,9674.35,9673.15,0.686 -binance-futures,BTCUSDT,1582329800335000,1582329800455375,4,9674.35,9673.26,0.67 -binance-futures,BTCUSDT,1582329800341000,1582329800461228,4,9674.35,9673.26,2.01 -binance-futures,BTCUSDT,1582329800343000,1582329800464699,2,9674.35,9673.26,2.01 -binance-futures,BTCUSDT,1582329800346000,1582329800468247,4.9,9674.35,9673.26,2.05 -binance-futures,BTCUSDT,1582329800346000,1582329800470700,0.017,9674.29,9673.26,2.05 -binance-futures,BTCUSDT,1582329800354000,1582329800477365,0.017,9674.29,9673.26,1.38 -binance-futures,BTCUSDT,1582329800358000,1582329800486009,0.017,9674.27,9673.26,0.71 -binance-futures,BTCUSDT,1582329800364000,1582329800488768,0.017,9674.27,9673.28,0.031 -binance-futures,BTCUSDT,1582329800365000,1582329800488785,0.017,9674.27,9673.3,0.031 -binance-futures,BTCUSDT,1582329800383000,1582329800503287,0.017,9674.27,9673.28,0.031 -binance-futures,BTCUSDT,1582329800385000,1582329800506710,5.217,9674.27,9673.27,1.34 -binance-futures,BTCUSDT,1582329800394000,1582329800515738,5.217,9674.27,9673.29,0.67 -binance-futures,BTCUSDT,1582329800396000,1582329800517079,0.017,9674.27,9673.29,0.67 -binance-futures,BTCUSDT,1582329800399000,1582329800518993,0.017,9674.27,9673.29,1.34 -binance-futures,BTCUSDT,1582329800407000,1582329800528480,0.017,9674.27,9673.29,2.01 -binance-futures,BTCUSDT,1582329800409000,1582329800531840,0.017,9674.27,9673.3,0.71 -binance-futures,BTCUSDT,1582329800418000,1582329800540732,0.017,9674.27,9673.33,0.031 -binance-futures,BTCUSDT,1582329800448000,1582329800573783,0.22,9674.4,9673.33,0.031 -binance-futures,BTCUSDT,1582329800471000,1582329800592083,2.256,9674.41,9673.33,0.031 -binance-futures,BTCUSDT,1582329800477000,1582329800598253,2.256,9674.41,9673.34,0.031 -binance-futures,BTCUSDT,1582329800497000,1582329800617779,2.256,9674.41,9673.97,1.95 -binance-futures,BTCUSDT,1582329800517000,1582329800638020,2,9674.4,9673.97,1.95 -binance-futures,BTCUSDT,1582329800521000,1582329800645176,2,9674.4,9674,0.031 -binance-futures,BTCUSDT,1582329800523000,1582329800646634,2,9674.4,9674.01,0.031 -binance-futures,BTCUSDT,1582329800532000,1582329800656020,2.22,9674.4,9674.01,0.031 -binance-futures,BTCUSDT,1582329800541000,1582329800661510,2.22,9674.4,9674,0.031 -binance-futures,BTCUSDT,1582329800541000,1582329800661517,2.22,9674.4,9673.15,0.686 -binance-futures,BTCUSDT,1582329800552000,1582329800671811,2,9674.34,9673.15,0.686 -binance-futures,BTCUSDT,1582329800568000,1582329800688498,4.75,9674.34,9673.17,0.462 -binance-futures,BTCUSDT,1582329800578000,1582329800699181,4.75,9674.34,9673.16,1.38 -binance-futures,BTCUSDT,1582329800586000,1582329800705246,0.22,9674.32,9673.16,1.38 -binance-futures,BTCUSDT,1582329800591000,1582329800711926,2,9674.34,9673.16,1.832 -binance-futures,BTCUSDT,1582329800593000,1582329800713901,2,9674.34,9673.18,0.67 -binance-futures,BTCUSDT,1582329800603000,1582329800726386,2.256,9674.41,9673.18,1.34 -binance-futures,BTCUSDT,1582329800609000,1582329800729170,2.256,9674.41,9673.18,1.38 -binance-futures,BTCUSDT,1582329800616000,1582329800737435,2.256,9674.41,9673.2,0.031 -binance-futures,BTCUSDT,1582329800616000,1582329800737443,2.256,9674.41,9673.22,0.031 -binance-futures,BTCUSDT,1582329800620000,1582329800740832,2.256,9674.41,9673.22,0.466 -binance-futures,BTCUSDT,1582329800637000,1582329800757554,2.256,9674.41,9673.22,3.116 -binance-futures,BTCUSDT,1582329800649000,1582329800767537,2.256,9674.41,9673.29,0.464 -binance-futures,BTCUSDT,1582329800664000,1582329800784640,2.256,9674.41,9673.29,3.864 -binance-futures,BTCUSDT,1582329800670000,1582329800790958,2.256,9674.41,9673.33,0.031 -binance-futures,BTCUSDT,1582329800687000,1582329800806902,2.256,9674.41,9673.39,0.459 -binance-futures,BTCUSDT,1582329800717000,1582329800836725,2.256,9674.41,9673.43,0.031 -binance-futures,BTCUSDT,1582329800726000,1582329800842273,2.256,9674.41,9673.97,1.95 -binance-futures,BTCUSDT,1582329800744000,1582329800863901,2.256,9674.41,9673.46,0.455 -binance-futures,BTCUSDT,1582329800748000,1582329800869763,2.256,9674.41,9673.41,0.031 -binance-futures,BTCUSDT,1582329800748000,1582329800870345,2.256,9674.41,9673.33,0.04 -binance-futures,BTCUSDT,1582329800751000,1582329800872651,2.256,9674.41,9674,0.472 -binance-futures,BTCUSDT,1582329800768000,1582329800890406,2.256,9674.41,9673.5,0.031 -binance-futures,BTCUSDT,1582329800770000,1582329800890688,2.256,9674.41,9673.97,0.67 -binance-futures,BTCUSDT,1582329800805000,1582329800928622,2.256,9674.41,9673.98,0.456 -binance-futures,BTCUSDT,1582329800813000,1582329800937384,2.256,9674.41,9673.97,0.67 -binance-futures,BTCUSDT,1582329800819000,1582329800941190,2.256,9674.41,9673.81,0.47 -binance-futures,BTCUSDT,1582329800820000,1582329800941205,2.256,9674.41,9673.34,0.67 -binance-futures,BTCUSDT,1582329800833000,1582329800955026,2.256,9674.41,9673.99,0.67 -binance-futures,BTCUSDT,1582329800851000,1582329800971255,2.256,9674.41,9673.99,0.71 -binance-futures,BTCUSDT,1582329800878000,1582329801000330,2.256,9674.41,9674,0.67 -binance-futures,BTCUSDT,1582329800905000,1582329801026269,2.256,9674.41,9674.01,0.67 -binance-futures,BTCUSDT,1582329800913000,1582329801034837,2.256,9674.41,9674.01,0.71 -binance-futures,BTCUSDT,1582329800913000,1582329801035438,2.256,9674.41,9674.01,1.38 -binance-futures,BTCUSDT,1582329800928000,1582329801049787,2.256,9674.41,9674.04,0.031 -binance-futures,BTCUSDT,1582329800930000,1582329801051966,2.256,9674.41,9674.05,0.031 -binance-futures,BTCUSDT,1582329800966000,1582329801082808,2.256,9674.41,9674.05,0.071 -binance-futures,BTCUSDT,1582329800972000,1582329801092318,2.256,9674.41,9674.05,0.741 -binance-futures,BTCUSDT,1582329800979000,1582329801098125,2.256,9674.41,9674.05,1.411 -binance-futures,BTCUSDT,1582329800984000,1582329801103154,2.256,9674.41,9674.09,0.031 -binance-futures,BTCUSDT,1582329801011000,1582329801132616,2.256,9674.41,9674.09,0.071 -binance-futures,BTCUSDT,1582329801013000,1582329801135917,2.256,9674.41,9674.09,0.741 -binance-futures,BTCUSDT,1582329801027000,1582329801145781,2.256,9674.41,9674.09,1.411 -binance-futures,BTCUSDT,1582329801034000,1582329801155108,2.256,9674.41,9674.12,0.031 -binance-futures,BTCUSDT,1582329801036000,1582329801157417,2.256,9674.41,9674.13,0.031 -binance-futures,BTCUSDT,1582329801129000,1582329801268441,2.256,9674.41,9674.15,0.031 -binance-futures,BTCUSDT,1582329801130000,1582329801273434,2.256,9674.41,9674.16,0.031 -binance-futures,BTCUSDT,1582329801251000,1582329801377828,2,9674.4,9674.16,0.031 -binance-futures,BTCUSDT,1582329801262000,1582329801382364,2,9674.4,9674.15,0.031 -binance-futures,BTCUSDT,1582329801263000,1582329801382373,2,9674.4,9673.65,0.43 -binance-futures,BTCUSDT,1582329801278000,1582329801397734,2,9674.34,9673.65,0.43 -binance-futures,BTCUSDT,1582329801281000,1582329801403642,2,9674.34,9673.15,0.686 -binance-futures,BTCUSDT,1582329801283000,1582329801406095,6,9674.34,9673.15,0.686 -binance-futures,BTCUSDT,1582329801296000,1582329801415270,10.6,9674.34,9673.15,0.686 -binance-futures,BTCUSDT,1582329801298000,1582329801420375,6.6,9674.34,9673.15,0.686 -binance-futures,BTCUSDT,1582329801308000,1582329801428704,0.22,9674.32,9673.15,0.686 -binance-futures,BTCUSDT,1582329801325000,1582329801445894,7.07,9674.32,9673.15,0.686 -binance-futures,BTCUSDT,1582329801332000,1582329801453889,0.031,9674.28,9673.15,0.686 -binance-futures,BTCUSDT,1582329801352000,1582329801473979,7.131,9674.28,9673.15,0.686 -binance-futures,BTCUSDT,1582329801361000,1582329801480875,7.131,9674.28,9673.16,0.463 -binance-futures,BTCUSDT,1582329801375000,1582329801493627,0.031,9674.24,9673.16,0.463 -binance-futures,BTCUSDT,1582329801376000,1582329801496192,0.031,9674.24,9673.15,0.686 -binance-futures,BTCUSDT,1582329801393000,1582329801511878,6.431,9674.24,9673.15,0.686 -binance-futures,BTCUSDT,1582329801396000,1582329801519244,6.431,9674.24,9673.17,0.67 -binance-futures,BTCUSDT,1582329801407000,1582329801528534,6.431,9674.24,9673.17,1.34 -binance-futures,BTCUSDT,1582329801410000,1582329801531255,6.431,9674.24,9673.17,1.38 -binance-futures,BTCUSDT,1582329801410000,1582329801531271,6.431,9674.24,9673.17,2.05 -binance-futures,BTCUSDT,1582329801417000,1582329801539394,0.22,9674.21,9673.17,2.05 -binance-futures,BTCUSDT,1582329801419000,1582329801539867,0.22,9674.21,9673.17,1.38 -binance-futures,BTCUSDT,1582329801436000,1582329801556641,0.22,9674.21,9673.17,0.71 -binance-futures,BTCUSDT,1582329801440000,1582329801559752,6.07,9674.21,9673.17,0.71 -binance-futures,BTCUSDT,1582329801444000,1582329801566856,6.07,9674.21,9673.17,0.04 -binance-futures,BTCUSDT,1582329801447000,1582329801569881,6.07,9674.21,9673.15,0.686 -binance-futures,BTCUSDT,1582329801455000,1582329801576498,6.07,9674.21,9673.18,0.67 -binance-futures,BTCUSDT,1582329801463000,1582329801581735,0.031,9674.17,9673.18,0.67 -binance-futures,BTCUSDT,1582329801467000,1582329801586712,0.031,9674.17,9673.18,1.34 -binance-futures,BTCUSDT,1582329801472000,1582329801596165,0.22,9674.13,9673.18,2.01 -binance-futures,BTCUSDT,1582329801479000,1582329801601610,0.22,9674.13,9673.18,2.05 -binance-futures,BTCUSDT,1582329801485000,1582329801606981,6.081,9674.17,9673.18,2.05 -binance-futures,BTCUSDT,1582329801489000,1582329801609222,6.05,9674.17,9673.18,2.05 -binance-futures,BTCUSDT,1582329801495000,1582329801617239,5.55,9674.13,9673.18,2.05 -binance-futures,BTCUSDT,1582329801545000,1582329801666278,2.256,9674.41,9673.18,2.05 -binance-futures,BTCUSDT,1582329801549000,1582329801671498,2.256,9674.41,9673.19,0.464 -binance-futures,BTCUSDT,1582329801551000,1582329801672067,2.256,9674.41,9673.22,0.031 -binance-futures,BTCUSDT,1582329801572000,1582329801695783,0.22,9674.28,9673.22,0.031 -binance-futures,BTCUSDT,1582329801578000,1582329801698719,2.256,9674.41,9673.22,0.031 -binance-futures,BTCUSDT,1582329801591000,1582329801713221,2.7,9674.28,9673.24,0.451 -binance-futures,BTCUSDT,1582329801601000,1582329801721589,2.7,9674.28,9673.24,0.482 -binance-futures,BTCUSDT,1582329801607000,1582329801730714,2.7,9674.28,9673.24,0.031 -binance-futures,BTCUSDT,1582329801621000,1582329801744322,2.7,9674.28,9673.25,1.34 -binance-futures,BTCUSDT,1582329801624000,1582329801746329,2.7,9674.28,9673.25,1.38 -binance-futures,BTCUSDT,1582329801628000,1582329801750070,2.7,9674.28,9673.25,2.05 -binance-futures,BTCUSDT,1582329801638000,1582329801756873,2.7,9674.28,9673.25,2.506 -binance-futures,BTCUSDT,1582329801644000,1582329801764512,2.256,9674.41,9673.29,0.031 -binance-futures,BTCUSDT,1582329801651000,1582329801771771,2.256,9674.41,9673.29,0.495 -binance-futures,BTCUSDT,1582329801672000,1582329801794272,2.256,9674.41,9673.29,0.031 -binance-futures,BTCUSDT,1582329801676000,1582329801797799,2.256,9674.41,9673.34,0.436 -binance-futures,BTCUSDT,1582329801755000,1582329801876870,2.256,9674.41,9673.36,0.031 -binance-futures,BTCUSDT,1582329801756000,1582329801878318,2.256,9674.41,9673.38,0.031 -binance-futures,BTCUSDT,1582329801787000,1582329801909178,2.256,9674.41,9673.38,0.458 -binance-futures,BTCUSDT,1582329801795000,1582329801914523,2.256,9674.41,9673.38,0.031 -binance-futures,BTCUSDT,1582329801799000,1582329801921118,2.256,9674.41,9673.41,0.457 -binance-futures,BTCUSDT,1582329801810000,1582329801934993,2.256,9674.41,9673.38,0.031 -binance-futures,BTCUSDT,1582329801813000,1582329801936955,2.256,9674.41,9673.42,0.031 -binance-futures,BTCUSDT,1582329801822000,1582329801944671,0.22,9673.81,9673.42,0.031 -binance-futures,BTCUSDT,1582329801826000,1582329801946722,2.256,9674.41,9673.42,0.031 -binance-futures,BTCUSDT,1582329801839000,1582329801962742,2.256,9674.41,9673.38,0.031 -binance-futures,BTCUSDT,1582329801841000,1582329801963214,1.071,9673.39,9673.38,0.031 -binance-futures,BTCUSDT,1582329801847000,1582329801967539,11.781,9673.39,9673.38,0.031 -binance-futures,BTCUSDT,1582329801856000,1582329801979538,12.001,9673.39,9673.38,0.031 -binance-futures,BTCUSDT,1582329801860000,1582329801987925,10.71,9673.39,9673.38,0.031 -binance-futures,BTCUSDT,1582329801864000,1582329801988743,2.256,9674.41,9673.38,0.031 -binance-futures,BTCUSDT,1582329801876000,1582329801997205,2.256,9674.41,9673.41,0.47 -binance-futures,BTCUSDT,1582329801878000,1582329801999088,2.256,9674.41,9673.38,0.031 -binance-futures,BTCUSDT,1582329801884000,1582329802008088,0.002,9674.4,9673.38,1.981 -binance-futures,BTCUSDT,1582329801901000,1582329802023305,0.002,9674.4,9673.42,0.67 -binance-futures,BTCUSDT,1582329801905000,1582329802029858,4.252,9674.4,9673.42,0.67 -binance-futures,BTCUSDT,1582329801909000,1582329802032253,4.252,9674.4,9673.42,1.371 -binance-futures,BTCUSDT,1582329801913000,1582329802034890,4.252,9674.4,9673.42,2.041 -binance-futures,BTCUSDT,1582329801931000,1582329802050466,4.252,9674.4,9673.42,1.371 -binance-futures,BTCUSDT,1582329801933000,1582329802053593,4.252,9674.4,9673.42,1.411 -binance-futures,BTCUSDT,1582329801951000,1582329802073776,4.252,9674.4,9673.42,0.741 -binance-futures,BTCUSDT,1582329801953000,1582329802074267,4.252,9674.4,9673.42,0.701 -binance-futures,BTCUSDT,1582329801957000,1582329802077772,4.252,9674.4,9673.46,0.031 -binance-futures,BTCUSDT,1582329801960000,1582329802079510,0.002,9674.4,9673.46,0.031 -binance-futures,BTCUSDT,1582329801977000,1582329802100657,0.002,9674.4,9673.38,1.95 -binance-futures,BTCUSDT,1582329801985000,1582329802106348,0.002,9674.4,9673.46,0.67 -binance-futures,BTCUSDT,1582329802000000,1582329802120031,0.002,9674.4,9673.46,0.71 -binance-futures,BTCUSDT,1582329802023000,1582329802138495,0.002,9674.4,9673.46,0.04 -binance-futures,BTCUSDT,1582329802023000,1582329802138505,0.002,9674.4,9673.46,0.71 -binance-futures,BTCUSDT,1582329802025000,1582329802147110,0.002,9674.4,9673.46,1.38 -binance-futures,BTCUSDT,1582329802044000,1582329802163495,0.002,9674.4,9673.46,1.34 -binance-futures,BTCUSDT,1582329802044000,1582329802166912,0.002,9674.4,9673.46,0.67 -binance-futures,BTCUSDT,1582329802047000,1582329802166932,0.002,9674.4,9673.46,1.34 -binance-futures,BTCUSDT,1582329802049000,1582329802168548,0.002,9674.4,9673.5,0.031 -binance-futures,BTCUSDT,1582329802069000,1582329802190719,0.002,9674.4,9673.46,1.34 -binance-futures,BTCUSDT,1582329802072000,1582329802194615,0.002,9674.4,9673.46,0.67 -binance-futures,BTCUSDT,1582329802074000,1582329802194641,0.002,9674.4,9673.46,1.34 -binance-futures,BTCUSDT,1582329802078000,1582329802198856,0.002,9674.4,9673.51,0.67 -binance-futures,BTCUSDT,1582329802084000,1582329802205284,0.002,9674.4,9673.51,1.34 -binance-futures,BTCUSDT,1582329802084000,1582329802205483,0.22,9674.39,9673.51,1.34 -binance-futures,BTCUSDT,1582329802089000,1582329802210692,0.22,9674.39,9673.51,1.38 -binance-futures,BTCUSDT,1582329802103000,1582329802222955,3.62,9674.39,9673.51,1.38 -binance-futures,BTCUSDT,1582329802105000,1582329802226107,3.62,9674.39,9673.51,2.05 -binance-futures,BTCUSDT,1582329802122000,1582329802243966,0.22,9674.39,9673.51,2.05 -binance-futures,BTCUSDT,1582329802129000,1582329802251815,0.22,9674.36,9673.51,2.05 -binance-futures,BTCUSDT,1582329802131000,1582329802254006,0.22,9674.36,9673.51,1.38 -binance-futures,BTCUSDT,1582329802134000,1582329802254063,0.22,9674.36,9673.52,1.95 -binance-futures,BTCUSDT,1582329802147000,1582329802268690,3.22,9674.36,9673.55,0.031 -binance-futures,BTCUSDT,1582329802151000,1582329802270807,3,9674.36,9673.55,0.031 -binance-futures,BTCUSDT,1582329802167000,1582329802286275,2.256,9674.41,9673.54,0.031 -binance-futures,BTCUSDT,1582329802169000,1582329802287169,2.256,9674.41,9673.52,2.62 -binance-futures,BTCUSDT,1582329802172000,1582329802293131,2.256,9674.41,9673.53,0.67 -binance-futures,BTCUSDT,1582329802184000,1582329802303933,2.256,9674.41,9673.55,0.04 -binance-futures,BTCUSDT,1582329802186000,1582329802305556,2.256,9674.41,9673.55,0.71 -binance-futures,BTCUSDT,1582329802186000,1582329802307185,0.22,9674.36,9673.55,1.38 -binance-futures,BTCUSDT,1582329802195000,1582329802332990,2.256,9674.41,9673.56,0.031 -binance-futures,BTCUSDT,1582329802244000,1582329802367024,2.256,9674.41,9673.57,0.71 -binance-futures,BTCUSDT,1582329802257000,1582329802379089,2.256,9674.41,9673.57,1.38 -binance-futures,BTCUSDT,1582329802264000,1582329802384389,0.22,9674.4,9673.57,1.38 -binance-futures,BTCUSDT,1582329802266000,1582329802388484,0.22,9674.4,9673.61,0.031 -binance-futures,BTCUSDT,1582329802282000,1582329802400760,4.57,9674.4,9673.61,0.031 -binance-futures,BTCUSDT,1582329802301000,1582329802422689,0.22,9674.4,9673.61,0.031 -binance-futures,BTCUSDT,1582329802313000,1582329802434281,2.256,9674.41,9673.61,0.031 -binance-futures,BTCUSDT,1582329802323000,1582329802448194,2.256,9674.41,9673.62,0.031 -binance-futures,BTCUSDT,1582329802335000,1582329802456404,2.256,9674.41,9673.62,0.701 -binance-futures,BTCUSDT,1582329802341000,1582329802462431,2.256,9674.41,9673.62,0.741 -binance-futures,BTCUSDT,1582329802342000,1582329802462443,2.256,9674.41,9673.62,1.411 -binance-futures,BTCUSDT,1582329802347000,1582329802467195,2.256,9674.41,9673.62,2.081 -binance-futures,BTCUSDT,1582329802360000,1582329802479667,2.256,9674.41,9673.65,0.031 -binance-futures,BTCUSDT,1582329802360000,1582329802479956,2.256,9674.41,9673.66,0.031 -binance-futures,BTCUSDT,1582329802388000,1582329802508282,2.256,9674.41,9673.67,0.67 -binance-futures,BTCUSDT,1582329802396000,1582329802517168,2.256,9674.41,9673.67,3.33 -binance-futures,BTCUSDT,1582329802409000,1582329802531128,2.256,9674.41,9673.71,0.031 -binance-futures,BTCUSDT,1582329802413000,1582329802533214,2.256,9674.41,9673.75,0.431 -binance-futures,BTCUSDT,1582329802481000,1582329802600099,2.256,9674.41,9673.79,0.031 -binance-futures,BTCUSDT,1582329802505000,1582329802626082,2.256,9674.41,9673.97,0.457 -binance-futures,BTCUSDT,1582329802529000,1582329802649634,2.256,9674.41,9674,0.031 -binance-futures,BTCUSDT,1582329802529000,1582329802650432,2.256,9674.41,9674.01,0.031 -binance-futures,BTCUSDT,1582329802557000,1582329802678106,2.256,9674.41,9674.14,0.433 -binance-futures,BTCUSDT,1582329802575000,1582329802692614,2,9674.4,9674.14,0.433 -binance-futures,BTCUSDT,1582329802582000,1582329802704133,2,9674.4,9674.18,0.031 -binance-futures,BTCUSDT,1582329802604000,1582329802724239,2,9674.4,9674.14,0.433 -binance-futures,BTCUSDT,1582329802607000,1582329802726586,2,9674.4,9673.16,0.406 -binance-futures,BTCUSDT,1582329802611000,1582329802730947,2,9674.4,9674.28,0.455 -binance-futures,BTCUSDT,1582329802629000,1582329802751000,2,9674.4,9673.17,0.67 -binance-futures,BTCUSDT,1582329802632000,1582329802751299,2,9674.4,9673.17,1.34 -binance-futures,BTCUSDT,1582329802632000,1582329802753725,2,9674.4,9673.17,2.01 -binance-futures,BTCUSDT,1582329802636000,1582329802757266,2,9674.4,9673.41,0.455 -binance-futures,BTCUSDT,1582329802657000,1582329802776806,2,9674.4,9673.42,0.67 -binance-futures,BTCUSDT,1582329802665000,1582329802785288,2,9674.4,9673.42,1.34 -binance-futures,BTCUSDT,1582329802667000,1582329802786862,2,9674.4,9673.42,1.38 -binance-futures,BTCUSDT,1582329802681000,1582329802801661,2,9674.4,9673.46,0.431 -binance-futures,BTCUSDT,1582329802692000,1582329802812610,0.017,9674.26,9673.46,0.431 -binance-futures,BTCUSDT,1582329802707000,1582329802829163,0.017,9674.26,9673.48,0.031 -binance-futures,BTCUSDT,1582329802707000,1582329802829458,0.017,9674.26,9673.5,0.031 -binance-futures,BTCUSDT,1582329802712000,1582329802834959,3.817,9674.26,9673.5,0.031 -binance-futures,BTCUSDT,1582329802735000,1582329802856225,0.017,9674.26,9673.5,0.031 -binance-futures,BTCUSDT,1582329802751000,1582329802871046,0.017,9674.29,9673.5,0.031 -binance-futures,BTCUSDT,1582329802753000,1582329802873876,0.017,9674.29,9673.51,0.04 -binance-futures,BTCUSDT,1582329802753000,1582329802873883,0.017,9674.29,9673.51,0.71 -binance-futures,BTCUSDT,1582329802756000,1582329802876421,0.017,9674.29,9673.51,1.38 -binance-futures,BTCUSDT,1582329802759000,1582329802879726,2.256,9674.41,9673.51,1.411 -binance-futures,BTCUSDT,1582329802765000,1582329802885342,2.256,9674.41,9673.51,2.081 -binance-futures,BTCUSDT,1582329802777000,1582329802895728,2.256,9674.41,9673.54,0.031 -binance-futures,BTCUSDT,1582329802777000,1582329802898255,2.256,9674.41,9673.55,0.031 -binance-futures,BTCUSDT,1582329802823000,1582329802942152,2.256,9674.41,9673.56,0.433 -binance-futures,BTCUSDT,1582329802847000,1582329802966210,2.256,9674.41,9673.6,0.031 -binance-futures,BTCUSDT,1582329802867000,1582329802987111,2.256,9674.41,9673.6,0.701 -binance-futures,BTCUSDT,1582329802869000,1582329802989530,0.22,9674.4,9673.6,0.701 -binance-futures,BTCUSDT,1582329802870000,1582329802995839,2.256,9674.41,9673.64,0.43 -binance-futures,BTCUSDT,1582329802889000,1582329803012320,2.256,9674.41,9673.64,0.461 -binance-futures,BTCUSDT,1582329802901000,1582329803020707,2.256,9674.41,9673.65,1.95 -binance-futures,BTCUSDT,1582329802903000,1582329803023655,2.256,9674.41,9673.65,2.62 -binance-futures,BTCUSDT,1582329802919000,1582329803038930,2.256,9674.41,9673.65,0.67 -binance-futures,BTCUSDT,1582329802923000,1582329803043961,2.256,9674.41,9673.65,1.34 -binance-futures,BTCUSDT,1582329802927000,1582329803046401,2.256,9674.41,9673.67,0.447 -binance-futures,BTCUSDT,1582329802941000,1582329803061748,2.256,9674.41,9673.68,0.031 -binance-futures,BTCUSDT,1582329802941000,1582329803061768,2.256,9674.41,9673.69,0.031 -binance-futures,BTCUSDT,1582329802970000,1582329803088509,2.256,9674.41,9673.7,0.67 -binance-futures,BTCUSDT,1582329802991000,1582329803110828,2.256,9674.41,9673.74,0.031 -binance-futures,BTCUSDT,1582329803019000,1582329803138765,2.256,9674.41,9673.75,0.434 -binance-futures,BTCUSDT,1582329803042000,1582329803161659,2.256,9674.41,9673.79,0.031 -binance-futures,BTCUSDT,1582329803070000,1582329803192131,2.256,9674.41,9673.8,0.67 -binance-futures,BTCUSDT,1582329803094000,1582329803213141,2.256,9674.41,9673.8,0.701 -binance-futures,BTCUSDT,1582329803097000,1582329803218626,2.256,9674.41,9673.8,0.741 -binance-futures,BTCUSDT,1582329803102000,1582329803221223,0.22,9674.26,9673.8,0.741 -binance-futures,BTCUSDT,1582329803115000,1582329803236023,0.22,9674.26,9673.84,0.031 -binance-futures,BTCUSDT,1582329803133000,1582329803250796,2.256,9674.41,9673.84,0.031 -binance-futures,BTCUSDT,1582329803155000,1582329803283413,2.256,9674.41,9673.84,0.701 -binance-futures,BTCUSDT,1582329803171000,1582329803291130,2.256,9674.41,9673.84,1.371 -binance-futures,BTCUSDT,1582329803181000,1582329803317782,2.256,9674.41,9673.85,0.67 -binance-futures,BTCUSDT,1582329803183000,1582329803325691,2.256,9674.41,9673.87,0.031 -binance-futures,BTCUSDT,1582329803183000,1582329803325707,2.256,9674.41,9673.88,0.031 -binance-futures,BTCUSDT,1582329803287000,1582329803405490,2.256,9674.41,9673.88,0.701 -binance-futures,BTCUSDT,1582329803288000,1582329803407757,2.256,9674.41,9673.88,1.371 -binance-futures,BTCUSDT,1582329803304000,1582329803421117,2.256,9674.41,9673.91,0.031 -binance-futures,BTCUSDT,1582329803332000,1582329803449235,2.256,9674.41,9673.92,0.67 -binance-futures,BTCUSDT,1582329803335000,1582329803452241,2,9674.35,9673.92,0.67 -binance-futures,BTCUSDT,1582329803348000,1582329803465618,2,9674.35,9673.92,1.34 -binance-futures,BTCUSDT,1582329803352000,1582329803475251,2,9674.35,9673.94,0.031 -binance-futures,BTCUSDT,1582329803353000,1582329803475292,2,9674.35,9673.95,0.031 -binance-futures,BTCUSDT,1582329803353000,1582329803475314,2,9674.35,9673.96,0.031 -binance-futures,BTCUSDT,1582329803407000,1582329803526935,2,9674.35,9673.97,0.031 -binance-futures,BTCUSDT,1582329803452000,1582329803573427,0.22,9674.34,9673.97,0.031 -binance-futures,BTCUSDT,1582329803470000,1582329803592010,2.87,9674.34,9673.97,0.031 -binance-futures,BTCUSDT,1582329803471000,1582329803592018,2,9674.28,9673.97,0.031 -binance-futures,BTCUSDT,1582329803491000,1582329803611215,4.55,9674.28,9673.97,0.031 -binance-futures,BTCUSDT,1582329803507000,1582329803628466,2,9674.28,9673.97,0.031 -binance-futures,BTCUSDT,1582329803509000,1582329803628477,2,9674.22,9673.97,0.031 -binance-futures,BTCUSDT,1582329803512000,1582329803632666,2,9674.22,9673.96,0.04 -binance-futures,BTCUSDT,1582329803525000,1582329803645131,2,9674.22,9673.16,0.406 -binance-futures,BTCUSDT,1582329803538000,1582329803656510,0.22,9674.2,9673.16,0.406 -binance-futures,BTCUSDT,1582329803543000,1582329803662497,0.22,9674.2,9673.96,0.67 -binance-futures,BTCUSDT,1582329803548000,1582329803671858,0.031,9674.19,9673.96,2.01 -binance-futures,BTCUSDT,1582329803550000,1582329803671868,0.031,9674.18,9673.96,2.01 -binance-futures,BTCUSDT,1582329803553000,1582329803672999,0.031,9674.18,9673.96,2.05 -binance-futures,BTCUSDT,1582329803559000,1582329803679985,4,9674.14,9673.96,2.05 -binance-futures,BTCUSDT,1582329803563000,1582329803683187,10,9674.14,9673.96,2.05 -binance-futures,BTCUSDT,1582329803566000,1582329803689243,10,9674.14,9673.96,1.38 -binance-futures,BTCUSDT,1582329803577000,1582329803699045,2,9674.08,9673.96,1.38 -binance-futures,BTCUSDT,1582329803578000,1582329803700458,10,9674.08,9673.96,0.71 -binance-futures,BTCUSDT,1582329803582000,1582329803701616,10,9674.08,9673.96,0.04 -binance-futures,BTCUSDT,1582329803586000,1582329803704701,10,9674.08,9673.16,0.406 -binance-futures,BTCUSDT,1582329803593000,1582329803713715,8,9674.08,9673.16,0.406 -binance-futures,BTCUSDT,1582329803596000,1582329803715854,2,9674.02,9673.16,0.406 -binance-futures,BTCUSDT,1582329803599000,1582329803721918,6,9674.02,9673.16,0.406 -binance-futures,BTCUSDT,1582329803615000,1582329803738636,7.25,9674.02,9673.16,0.406 -binance-futures,BTCUSDT,1582329803621000,1582329803741885,0.22,9674,9673.16,0.406 -binance-futures,BTCUSDT,1582329803638000,1582329803758678,0.031,9673.98,9673.16,0.406 -binance-futures,BTCUSDT,1582329803659000,1582329803782382,4.081,9673.98,9673.16,0.406 -binance-futures,BTCUSDT,1582329803667000,1582329803788779,4.081,9673.98,9673.17,0.04 -binance-futures,BTCUSDT,1582329803669000,1582329803793224,0.22,9673.96,9673.17,0.04 -binance-futures,BTCUSDT,1582329803673000,1582329803795532,0.22,9673.96,9673.17,1.38 -binance-futures,BTCUSDT,1582329803675000,1582329803797770,0.22,9673.96,9673.17,2.05 -binance-futures,BTCUSDT,1582329803691000,1582329803811759,0.016,9673.94,9673.17,2.05 -binance-futures,BTCUSDT,1582329803703000,1582329803825107,0.016,9673.94,9673.17,1.38 -binance-futures,BTCUSDT,1582329803705000,1582329803829032,0.016,9673.94,9673.17,0.67 -binance-futures,BTCUSDT,1582329803709000,1582329803830134,3.716,9673.94,9673.17,0.67 -binance-futures,BTCUSDT,1582329803713000,1582329803832432,0.031,9673.91,9673.17,0.67 -binance-futures,BTCUSDT,1582329803721000,1582329803842411,0.031,9673.91,9673.15,0.686 -binance-futures,BTCUSDT,1582329803733000,1582329803870928,3.431,9673.91,9673.15,0.686 -binance-futures,BTCUSDT,1582329803733000,1582329803870940,3.431,9673.91,9673.18,0.67 -binance-futures,BTCUSDT,1582329803735000,1582329803873860,3.651,9673.91,9673.18,0.67 -binance-futures,BTCUSDT,1582329803759000,1582329803881128,3.651,9673.91,9673.18,1.38 -binance-futures,BTCUSDT,1582329803762000,1582329803886545,4.55,9673.9,9673.18,1.38 -binance-futures,BTCUSDT,1582329803765000,1582329803886641,4.55,9673.9,9673.18,1.34 -binance-futures,BTCUSDT,1582329803773000,1582329803892485,0.031,9673.87,9673.18,1.34 -binance-futures,BTCUSDT,1582329803778000,1582329803897860,0.031,9673.87,9673.18,0.67 -binance-futures,BTCUSDT,1582329803788000,1582329803909675,0.031,9673.86,9673.18,0.67 -binance-futures,BTCUSDT,1582329803792000,1582329803913919,0.22,9673.85,9673.18,0.67 -binance-futures,BTCUSDT,1582329803796000,1582329803916545,0.22,9673.85,9673.15,0.686 -binance-futures,BTCUSDT,1582329803802000,1582329803924218,0.22,9673.85,9673.19,0.71 -binance-futures,BTCUSDT,1582329803805000,1582329803924245,0.22,9673.85,9673.19,1.38 -binance-futures,BTCUSDT,1582329803813000,1582329803934285,4.07,9673.85,9673.19,1.38 -binance-futures,BTCUSDT,1582329803819000,1582329803937717,0.031,9673.81,9673.19,1.38 -binance-futures,BTCUSDT,1582329803837000,1582329803956507,3.231,9673.81,9673.19,2.05 -binance-futures,BTCUSDT,1582329803847000,1582329803967094,0.031,9673.81,9673.19,2.05 -binance-futures,BTCUSDT,1582329803859000,1582329803979959,0.016,9673.82,9673.19,2.05 -binance-futures,BTCUSDT,1582329803859000,1582329803982077,0.22,9673.85,9673.19,2.05 -binance-futures,BTCUSDT,1582329803861000,1582329803982793,0.22,9673.77,9673.19,2.05 -binance-futures,BTCUSDT,1582329803872000,1582329803992997,2.22,9673.77,9673.19,2.05 -binance-futures,BTCUSDT,1582329803879000,1582329803997520,4.77,9673.77,9673.19,2.05 -binance-futures,BTCUSDT,1582329803900000,1582329804020798,4.55,9673.77,9673.19,2.05 -binance-futures,BTCUSDT,1582329803902000,1582329804023448,0.22,9673.71,9673.19,2.05 -binance-futures,BTCUSDT,1582329803910000,1582329804030758,0.22,9673.71,9673.19,1.38 -binance-futures,BTCUSDT,1582329803913000,1582329804033552,0.22,9673.71,9673.19,1.34 -binance-futures,BTCUSDT,1582329803918000,1582329804038927,0.22,9673.71,9673.19,0.67 -binance-futures,BTCUSDT,1582329803922000,1582329804044879,0.22,9673.71,9673.15,0.686 -binance-futures,BTCUSDT,1582329803937000,1582329804059400,0.031,9673.69,9673.15,0.686 -binance-futures,BTCUSDT,1582329803937000,1582329804060120,0.031,9673.67,9673.2,1.34 -binance-futures,BTCUSDT,1582329803947000,1582329804067379,0.031,9673.67,9673.2,1.38 -binance-futures,BTCUSDT,1582329803955000,1582329804075376,0.031,9673.67,9673.2,2.05 -binance-futures,BTCUSDT,1582329803966000,1582329804087116,0.22,9673.61,9673.2,2.05 -binance-futures,BTCUSDT,1582329803990000,1582329804109447,0.031,9673.57,9673.2,2.05 -binance-futures,BTCUSDT,1582329804018000,1582329804139552,0.22,9673.47,9673.2,2.05 -binance-futures,BTCUSDT,1582329804051000,1582329804172052,0.614,9673.89,9673.2,2.05 -binance-futures,BTCUSDT,1582329804057000,1582329804176270,0.22,9673.77,9673.2,2.05 -binance-futures,BTCUSDT,1582329804077000,1582329804198723,0.22,9673.77,9673.2,1.38 -binance-futures,BTCUSDT,1582329804089000,1582329804209016,0.22,9673.77,9673.2,0.71 -binance-futures,BTCUSDT,1582329804091000,1582329804211115,0.22,9673.77,9673.2,0.04 -binance-futures,BTCUSDT,1582329804096000,1582329804215274,0.22,9673.77,9673.15,0.686 -binance-futures,BTCUSDT,1582329804113000,1582329804235767,0.031,9673.73,9673.15,0.686 -binance-futures,BTCUSDT,1582329804145000,1582329804262723,0.031,9673.73,9673.16,0.04 -binance-futures,BTCUSDT,1582329804149000,1582329804268778,0.031,9673.73,9673.16,0.71 -binance-futures,BTCUSDT,1582329804166000,1582329804303377,0.031,9673.71,9673.16,0.71 -binance-futures,BTCUSDT,1582329804175000,1582329804311837,0.031,9673.71,9673.16,5.35 -binance-futures,BTCUSDT,1582329804193000,1582329804314809,0.031,9673.71,9673.16,2.05 -binance-futures,BTCUSDT,1582329804214000,1582329804335836,0.22,9673.77,9673.16,2.05 -binance-futures,BTCUSDT,1582329804218000,1582329804338229,0.22,9673.71,9673.16,2.05 -binance-futures,BTCUSDT,1582329804246000,1582329804381079,0.22,9673.71,9673.16,1.38 -binance-futures,BTCUSDT,1582329804246000,1582329804381557,0.22,9673.71,9673.16,0.71 -binance-futures,BTCUSDT,1582329804250000,1582329804381648,0.22,9673.71,9673.16,0.04 -binance-futures,BTCUSDT,1582329804252000,1582329804382096,0.22,9673.71,9673.15,0.686 -binance-futures,BTCUSDT,1582329804279000,1582329804398902,0.22,9673.71,9673.16,3.9 -binance-futures,BTCUSDT,1582329804293000,1582329804413743,0.22,9673.71,9673.17,0.67 -binance-futures,BTCUSDT,1582329804293000,1582329804413797,0.22,9673.71,9673.17,2.01 -binance-futures,BTCUSDT,1582329804295000,1582329804416636,0.031,9673.68,9673.17,2.01 -binance-futures,BTCUSDT,1582329804295000,1582329804416659,0.031,9673.67,9673.17,2.01 -binance-futures,BTCUSDT,1582329804305000,1582329804429431,0.031,9673.67,9673.17,2.05 -binance-futures,BTCUSDT,1582329804312000,1582329804431920,0.031,9673.67,9673.17,7.7 -binance-futures,BTCUSDT,1582329804323000,1582329804443418,0.22,9673.66,9673.17,2.05 -binance-futures,BTCUSDT,1582329804343000,1582329804464129,0.22,9673.66,9673.17,1.38 -binance-futures,BTCUSDT,1582329804348000,1582329804468276,0.22,9673.66,9673.17,1.34 -binance-futures,BTCUSDT,1582329804355000,1582329804473347,0.22,9673.66,9673.17,0.67 -binance-futures,BTCUSDT,1582329804359000,1582329804478864,0.22,9673.66,9673.15,0.686 -binance-futures,BTCUSDT,1582329804375000,1582329804496462,0.031,9673.62,9673.15,0.686 -binance-futures,BTCUSDT,1582329804394000,1582329804513942,0.031,9673.62,9673.16,1.95 -binance-futures,BTCUSDT,1582329804413000,1582329804531174,0.031,9673.62,9673.16,4.65 -binance-futures,BTCUSDT,1582329804418000,1582329804536273,0.031,9673.62,9673.17,0.67 -binance-futures,BTCUSDT,1582329804418000,1582329804536785,0.031,9673.62,9673.17,1.34 -binance-futures,BTCUSDT,1582329804421000,1582329804542277,0.031,9673.62,9673.17,1.38 -binance-futures,BTCUSDT,1582329804423000,1582329804542321,0.031,9673.62,9673.17,2.05 -binance-futures,BTCUSDT,1582329804429000,1582329804562231,0.031,9673.61,9673.17,2.05 -binance-futures,BTCUSDT,1582329804429000,1582329804563011,0.031,9673.61,9673.19,2 -binance-futures,BTCUSDT,1582329804448000,1582329804571696,0.031,9673.61,9673.21,0.031 -binance-futures,BTCUSDT,1582329804463000,1582329804583644,0.614,9673.89,9673.21,0.031 -binance-futures,BTCUSDT,1582329804471000,1582329804593486,0.614,9673.89,9673.27,2 -binance-futures,BTCUSDT,1582329804491000,1582329804614441,0.22,9673.87,9673.27,12.45 -binance-futures,BTCUSDT,1582329804493000,1582329804616507,0.22,9673.87,9673.31,2 -binance-futures,BTCUSDT,1582329804497000,1582329804618533,0.22,9673.87,9673.31,2.031 -binance-futures,BTCUSDT,1582329804503000,1582329804626817,0.614,9673.89,9673.31,2.031 -binance-futures,BTCUSDT,1582329804519000,1582329804640210,0.614,9673.89,9673.31,11.731 -binance-futures,BTCUSDT,1582329804523000,1582329804642865,0.614,9673.89,9673.35,2 -binance-futures,BTCUSDT,1582329804528000,1582329804648631,0.614,9673.89,9673.6,0.083 -binance-futures,BTCUSDT,1582329804545000,1582329804668216,0.614,9673.89,9673.6,9.533 -binance-futures,BTCUSDT,1582329804547000,1582329804668232,0.614,9673.89,9673.66,2 -binance-futures,BTCUSDT,1582329804567000,1582329804689649,0.614,9673.89,9673.66,10.35 -binance-futures,BTCUSDT,1582329804570000,1582329804691420,0.614,9673.89,9673.7,2 -binance-futures,BTCUSDT,1582329804590000,1582329804711775,0.614,9673.89,9673.72,2 -binance-futures,BTCUSDT,1582329804599000,1582329804719022,0.614,9673.89,9673.72,2.453 -binance-futures,BTCUSDT,1582329804609000,1582329804730419,0.614,9673.89,9673.72,11.053 -binance-futures,BTCUSDT,1582329804610000,1582329804730989,0.614,9673.89,9673.76,2 -binance-futures,BTCUSDT,1582329804619000,1582329804739104,0.614,9673.89,9673.78,2 -binance-futures,BTCUSDT,1582329804639000,1582329804761326,0.614,9673.89,9673.78,11.15 -binance-futures,BTCUSDT,1582329804640000,1582329804761656,0.614,9673.89,9673.81,0.031 -binance-futures,BTCUSDT,1582329804642000,1582329804763278,0.614,9673.89,9673.82,0.031 -binance-futures,BTCUSDT,1582329804652000,1582329804773846,0.614,9673.89,9673.88,1.95 -binance-futures,BTCUSDT,1582329804672000,1582329804792476,0.614,9673.89,9673.88,9.15 -binance-futures,BTCUSDT,1582329804697000,1582329804818003,0.614,9673.89,9673.88,9.59 -binance-futures,BTCUSDT,1582329804704000,1582329804824916,0.614,9673.89,9673.88,2.39 -binance-futures,BTCUSDT,1582329804755000,1582329804876529,0.614,9673.89,9673.88,1.95 -binance-futures,BTCUSDT,1582329804904000,1582329805023786,0.614,9673.89,9673.87,2.05 -binance-futures,BTCUSDT,1582329804906000,1582329805027287,0.22,9673.93,9673.87,2.05 -binance-futures,BTCUSDT,1582329804924000,1582329805051082,2.428,9673.98,9673.87,2.05 -binance-futures,BTCUSDT,1582329804926000,1582329805051635,2.428,9673.98,9673.91,0.031 -binance-futures,BTCUSDT,1582329804949000,1582329805071938,2.428,9673.98,9673.91,4.431 -binance-futures,BTCUSDT,1582329804955000,1582329805076201,2.428,9673.98,9673.91,4.4 -binance-futures,BTCUSDT,1582329804964000,1582329805085082,2.428,9673.98,9673.97,2 -binance-futures,BTCUSDT,1582329804983000,1582329805106256,2.428,9673.98,9673.97,7.85 -binance-futures,BTCUSDT,1582329805011000,1582329805133186,2.428,9673.98,9673.97,8.302 -binance-futures,BTCUSDT,1582329805032000,1582329805151914,2.428,9673.98,9673.97,2.452 -binance-futures,BTCUSDT,1582329805057000,1582329805183559,2.428,9673.98,9673.97,2.535 -binance-futures,BTCUSDT,1582329805109000,1582329805232111,2.428,9673.98,9673.97,2.083 -binance-futures,BTCUSDT,1582329805156000,1582329805276624,2.428,9673.98,9673.97,4.033 -binance-futures,BTCUSDT,1582329805207000,1582329805334819,2.427,9673.98,9673.97,4.033 -binance-futures,BTCUSDT,1582329805269000,1582329805391093,2.427,9673.98,9673.97,2.083 -binance-futures,BTCUSDT,1582329805293000,1582329805428396,2.427,9673.98,9673.97,4.033 -binance-futures,BTCUSDT,1582329805353000,1582329805474820,2.427,9673.98,9673.97,2.083 -binance-futures,BTCUSDT,1582329805412000,1582329805531560,2.427,9673.98,9673.97,4.033 -binance-futures,BTCUSDT,1582329805723000,1582329805843604,2.427,9673.98,9673.97,2.083 -binance-futures,BTCUSDT,1582329805772000,1582329805893194,2.427,9673.98,9673.97,2.535 -binance-futures,BTCUSDT,1582329805870000,1582329805989721,2.427,9673.98,9673.97,2.083 -binance-futures,BTCUSDT,1582329806069000,1582329806190932,2.427,9673.98,9673.97,4.033 -binance-futures,BTCUSDT,1582329806089000,1582329806207727,2.647,9673.98,9673.97,4.033 -binance-futures,BTCUSDT,1582329806165000,1582329806286687,2.427,9673.98,9673.97,4.033 -binance-futures,BTCUSDT,1582329806173000,1582329806293204,2.427,9673.98,9673.97,2.083 -binance-futures,BTCUSDT,1582329806253000,1582329806399375,2.427,9673.98,9673.97,4.033 -binance-futures,BTCUSDT,1582329806369000,1582329806490956,2.427,9673.98,9673.97,2.083 -binance-futures,BTCUSDT,1582329806448000,1582329806569462,2.427,9673.98,9673.97,0.083 -binance-futures,BTCUSDT,1582329806452000,1582329806574258,2.647,9673.98,9673.97,0.083 -binance-futures,BTCUSDT,1582329806459000,1582329806580771,2.647,9673.98,9673.15,0.686 -binance-futures,BTCUSDT,1582329806471000,1582329806595690,2.427,9673.98,9673.15,0.686 -binance-futures,BTCUSDT,1582329806476000,1582329806600252,0.031,9673.94,9673.15,0.686 -binance-futures,BTCUSDT,1582329806481000,1582329806606774,0.031,9673.94,9673.16,0.67 -binance-futures,BTCUSDT,1582329806487000,1582329806609002,0.22,9673.85,9673.16,0.67 -binance-futures,BTCUSDT,1582329806489000,1582329806611664,0.22,9673.85,9673.16,0.71 -binance-futures,BTCUSDT,1582329806493000,1582329806614385,0.22,9673.85,9673.16,1.38 -binance-futures,BTCUSDT,1582329806497000,1582329806619093,0.22,9673.85,9673.16,2.05 -binance-futures,BTCUSDT,1582329806505000,1582329806624208,0.22,9673.85,9673.16,8.1 -binance-futures,BTCUSDT,1582329806522000,1582329806643291,0.22,9673.85,9673.2,0.031 -binance-futures,BTCUSDT,1582329806541000,1582329806662036,0.017,9673.96,9673.2,0.031 -binance-futures,BTCUSDT,1582329806544000,1582329806666891,0.017,9673.96,9673.2,8.031 -binance-futures,BTCUSDT,1582329806550000,1582329806673050,0.017,9673.96,9673.21,0.67 -binance-futures,BTCUSDT,1582329806555000,1582329806676340,0.017,9673.96,9673.21,1.34 -binance-futures,BTCUSDT,1582329806559000,1582329806682261,0.017,9673.96,9673.21,2.01 -binance-futures,BTCUSDT,1582329806567000,1582329806688239,0.017,9673.96,9673.24,0.031 -binance-futures,BTCUSDT,1582329806588000,1582329806711871,2.427,9673.98,9673.24,8.831 -binance-futures,BTCUSDT,1582329806605000,1582329806726295,2.427,9673.98,9673.24,9.541 -binance-futures,BTCUSDT,1582329806614000,1582329806734544,2.427,9673.98,9673.24,10.881 -binance-futures,BTCUSDT,1582329806614000,1582329806740404,2.427,9673.98,9673.28,0.031 -binance-futures,BTCUSDT,1582329806618000,1582329806740894,2.427,9673.98,9673.29,0.471 -binance-futures,BTCUSDT,1582329806639000,1582329806762069,2.427,9673.98,9673.29,8.421 -binance-futures,BTCUSDT,1582329806667000,1582329806793850,2.427,9673.98,9673.33,0.031 -binance-futures,BTCUSDT,1582329806667000,1582329806794223,2.427,9673.98,9673.97,0.083 -binance-futures,BTCUSDT,1582329806742000,1582329806865405,2.647,9673.98,9673.97,0.083 -binance-futures,BTCUSDT,1582329806769000,1582329806893092,2.647,9673.98,9673.33,7.45 -binance-futures,BTCUSDT,1582329806796000,1582329806918049,0.22,9673.94,9673.37,0.031 -binance-futures,BTCUSDT,1582329806817000,1582329806941180,0.22,9673.94,9673.37,6.081 -binance-futures,BTCUSDT,1582329806827000,1582329806953767,0.22,9673.94,9673.37,6.05 -binance-futures,BTCUSDT,1582329806839000,1582329806960126,0.22,9673.94,9673.15,0.686 -binance-futures,BTCUSDT,1582329806847000,1582329806969765,0.22,9673.94,9673.41,0.031 -binance-futures,BTCUSDT,1582329806865000,1582329806988847,0.22,9673.94,9673.41,2.431 -binance-futures,BTCUSDT,1582329806871000,1582329806993627,0.22,9673.94,9673.41,2.4 -binance-futures,BTCUSDT,1582329806892000,1582329807014951,2.427,9673.98,9673.41,2.4 -binance-futures,BTCUSDT,1582329806916000,1582329807037090,0.22,9673.82,9673.41,2.4 -binance-futures,BTCUSDT,1582329806935000,1582329807055383,0.22,9673.82,9673.15,0.686 -binance-futures,BTCUSDT,1582329806938000,1582329807060122,0.031,9673.79,9673.15,0.686 -binance-futures,BTCUSDT,1582329806938000,1582329807060874,0.031,9673.78,9673.15,0.686 -binance-futures,BTCUSDT,1582329806967000,1582329807089360,0.22,9673.6,9673.15,0.686 -binance-futures,BTCUSDT,1582329806967000,1582329807089510,0.22,9673.6,9673.16,0.71 -binance-futures,BTCUSDT,1582329806971000,1582329807091259,0.22,9673.6,9673.16,1.38 -binance-futures,BTCUSDT,1582329806978000,1582329807099877,0.22,9673.6,9673.16,2.05 -binance-futures,BTCUSDT,1582329806984000,1582329807104901,0.031,9673.78,9673.16,2.05 -binance-futures,BTCUSDT,1582329806991000,1582329807115475,0.031,9673.56,9673.16,2.05 -binance-futures,BTCUSDT,1582329807016000,1582329807137519,0.22,9673.7,9673.16,2.05 -binance-futures,BTCUSDT,1582329807026000,1582329807146552,0.22,9673.7,9673.16,1.38 -binance-futures,BTCUSDT,1582329807028000,1582329807149043,0.22,9673.7,9673.16,0.71 -binance-futures,BTCUSDT,1582329807028000,1582329807149524,0.22,9673.7,9673.16,0.67 -binance-futures,BTCUSDT,1582329807031000,1582329807152108,2.427,9673.98,9673.16,0.67 -binance-futures,BTCUSDT,1582329807033000,1582329807155539,2.427,9673.98,9673.15,0.686 -binance-futures,BTCUSDT,1582329807040000,1582329807160504,2.427,9673.98,9673.2,0.031 -binance-futures,BTCUSDT,1582329807058000,1582329807178018,0.22,9673.93,9673.2,0.031 -binance-futures,BTCUSDT,1582329807064000,1582329807185763,0.22,9673.93,9673.15,0.686 -binance-futures,BTCUSDT,1582329807076000,1582329807196456,2.77,9673.93,9673.15,0.686 -binance-futures,BTCUSDT,1582329807087000,1582329807207734,0.031,9673.9,9673.15,0.686 -binance-futures,BTCUSDT,1582329807088000,1582329807210685,0.031,9673.89,9673.15,0.686 -binance-futures,BTCUSDT,1582329807109000,1582329807227757,4.381,9673.89,9673.15,0.686 -binance-futures,BTCUSDT,1582329807133000,1582329807253690,0.22,9673.86,9673.15,0.686 -binance-futures,BTCUSDT,1582329807143000,1582329807271456,0.236,9673.86,9673.15,0.686 -binance-futures,BTCUSDT,1582329807145000,1582329807271474,0.031,9673.85,9673.15,0.686 -binance-futures,BTCUSDT,1582329807168000,1582329807305929,3.981,9673.85,9673.15,0.686 -binance-futures,BTCUSDT,1582329807173000,1582329807309629,0.22,9673.84,9673.15,0.686 -binance-futures,BTCUSDT,1582329807203000,1582329807326746,4.87,9673.84,9673.15,0.686 -binance-futures,BTCUSDT,1582329807230000,1582329807353081,0.22,9673.78,9673.15,0.686 -binance-futures,BTCUSDT,1582329807252000,1582329807408778,3.42,9673.78,9673.15,0.686 -binance-futures,BTCUSDT,1582329807256000,1582329807409263,0.031,9673.74,9673.15,0.686 -binance-futures,BTCUSDT,1582329807287000,1582329807413183,0.017,9673.16,9673.15,0.686 -binance-futures,BTCUSDT,1582329807314000,1582329807437986,0.017,9673.16,9673.15,1.356 -binance-futures,BTCUSDT,1582329807328000,1582329807448919,0.017,9673.16,9673.15,2.736 -binance-futures,BTCUSDT,1582329807397000,1582329807518364,2.427,9673.98,9673.15,2.736 -binance-futures,BTCUSDT,1582329807420000,1582329807544376,2.427,9673.98,9673.19,0.031 -binance-futures,BTCUSDT,1582329807422000,1582329807544406,0.22,9673.94,9673.19,0.031 -binance-futures,BTCUSDT,1582329807445000,1582329807568278,2.427,9673.98,9673.35,0.447 -binance-futures,BTCUSDT,1582329807467000,1582329807587257,2.427,9673.98,9673.35,3.547 -binance-futures,BTCUSDT,1582329807482000,1582329807605503,2.427,9673.98,9673.35,0.447 -binance-futures,BTCUSDT,1582329807491000,1582329807613123,2.427,9673.98,9673.22,0.031 -binance-futures,BTCUSDT,1582329807493000,1582329807614509,2.427,9673.98,9673.39,0.431 -binance-futures,BTCUSDT,1582329807511000,1582329807634071,2.427,9673.98,9673.15,0.686 -binance-futures,BTCUSDT,1582329807516000,1582329807638633,2.427,9673.98,9673.43,0.031 -binance-futures,BTCUSDT,1582329807536000,1582329807657666,2.427,9673.98,9673.42,0.031 -binance-futures,BTCUSDT,1582329807536000,1582329807657677,2.427,9673.98,9673.25,0.43 -binance-futures,BTCUSDT,1582329807543000,1582329807665017,2.427,9673.98,9673.56,0.433 -binance-futures,BTCUSDT,1582329807556000,1582329807681888,2.351,9673.98,9673.56,0.433 -binance-futures,BTCUSDT,1582329807560000,1582329807688109,2.351,9673.98,9673.15,0.686 -binance-futures,BTCUSDT,1582329807561000,1582329807688709,2.351,9673.98,9673.16,0.47 -binance-futures,BTCUSDT,1582329807571000,1582329807692148,2,9673.96,9673.16,0.47 -binance-futures,BTCUSDT,1582329807593000,1582329807714496,0.031,9673.92,9673.16,0.47 -binance-futures,BTCUSDT,1582329807616000,1582329807738096,0.031,9673.92,9673.15,0.686 -binance-futures,BTCUSDT,1582329807617000,1582329807738438,0.22,9673.91,9673.15,0.686 -binance-futures,BTCUSDT,1582329807640000,1582329807762162,0.251,9673.91,9673.15,0.686 -binance-futures,BTCUSDT,1582329807663000,1582329807783381,0.016,9673.87,9673.15,0.686 -binance-futures,BTCUSDT,1582329807667000,1582329807788771,0.22,9673.75,9673.15,0.686 -binance-futures,BTCUSDT,1582329807706000,1582329807828544,2.351,9673.98,9673.15,0.686 -binance-futures,BTCUSDT,1582329807735000,1582329807858940,0.22,9673.92,9673.15,0.686 -binance-futures,BTCUSDT,1582329807762000,1582329807883879,0.031,9673.88,9673.15,0.686 -binance-futures,BTCUSDT,1582329807800000,1582329807919312,0.22,9673.83,9673.15,0.686 -binance-futures,BTCUSDT,1582329807823000,1582329807946832,0.031,9673.79,9673.15,0.686 -binance-futures,BTCUSDT,1582329807853000,1582329807974386,0.22,9673.75,9673.15,0.686 -binance-futures,BTCUSDT,1582329807872000,1582329807995517,0.031,9673.77,9673.15,0.686 -binance-futures,BTCUSDT,1582329807923000,1582329808043771,0.22,9673.74,9673.15,0.686 -binance-futures,BTCUSDT,1582329807927000,1582329808046995,0.031,9673.77,9673.15,0.686 -binance-futures,BTCUSDT,1582329807942000,1582329808061428,0.22,9673.74,9673.15,0.686 -binance-futures,BTCUSDT,1582329807946000,1582329808064116,0.031,9673.77,9673.15,0.686 -binance-futures,BTCUSDT,1582329807947000,1582329808067594,0.031,9673.7,9673.15,0.686 -binance-futures,BTCUSDT,1582329807965000,1582329808087003,0.031,9673.77,9673.15,0.686 -binance-futures,BTCUSDT,1582329807967000,1582329808089913,0.016,9673.76,9673.15,0.686 -binance-futures,BTCUSDT,1582329807971000,1582329808092621,0.22,9673.74,9673.15,0.686 -binance-futures,BTCUSDT,1582329807976000,1582329808096168,0.016,9673.76,9673.15,0.686 -binance-futures,BTCUSDT,1582329807981000,1582329808101147,0.22,9673.74,9673.15,0.686 -binance-futures,BTCUSDT,1582329807984000,1582329808103543,0.016,9673.76,9673.15,0.686 -binance-futures,BTCUSDT,1582329807995000,1582329808113842,0.031,9673.7,9673.15,0.686 -binance-futures,BTCUSDT,1582329808016000,1582329808136757,0.016,9673.76,9673.15,0.686 -binance-futures,BTCUSDT,1582329808025000,1582329808144831,0.22,9673.75,9673.15,0.686 -binance-futures,BTCUSDT,1582329808033000,1582329808152674,0.22,9673.73,9673.15,0.686 -binance-futures,BTCUSDT,1582329808035000,1582329808155130,0.016,9673.76,9673.15,0.686 -binance-futures,BTCUSDT,1582329808047000,1582329808165772,0.031,9673.71,9673.15,0.686 -binance-futures,BTCUSDT,1582329808070000,1582329808190660,0.22,9673.74,9673.15,0.686 -binance-futures,BTCUSDT,1582329808072000,1582329808192311,0.016,9673.76,9673.15,0.686 -binance-futures,BTCUSDT,1582329808093000,1582329808212835,0.031,9673.73,9673.15,0.686 -binance-futures,BTCUSDT,1582329808098000,1582329808221604,0.031,9673.73,9673.16,0.67 -binance-futures,BTCUSDT,1582329808100000,1582329808222161,0.031,9673.73,9673.16,1.34 -binance-futures,BTCUSDT,1582329808104000,1582329808225282,0.031,9673.73,9673.16,2.01 -binance-futures,BTCUSDT,1582329808104000,1582329808225293,0.031,9673.73,9673.16,2.05 -binance-futures,BTCUSDT,1582329808118000,1582329808238104,0.031,9673.73,9673.16,1.38 -binance-futures,BTCUSDT,1582329808129000,1582329808250474,0.031,9673.73,9673.16,0.71 -binance-futures,BTCUSDT,1582329808142000,1582329808264035,2.351,9673.98,9673.16,0.67 -binance-futures,BTCUSDT,1582329808148000,1582329808267385,0.22,9673.74,9673.16,0.67 -binance-futures,BTCUSDT,1582329808152000,1582329808272908,0.031,9673.69,9673.16,0.67 -binance-futures,BTCUSDT,1582329808155000,1582329808275467,0.031,9673.69,9673.15,0.686 -binance-futures,BTCUSDT,1582329808170000,1582329808295930,0.22,9673.91,9673.15,0.686 -binance-futures,BTCUSDT,1582329808170000,1582329808298128,1.351,9673.98,9673.15,0.686 -binance-futures,BTCUSDT,1582329808179000,1582329808302037,0.031,9673.65,9673.15,0.686 -binance-futures,BTCUSDT,1582329808189000,1582329808310324,0.031,9673.65,9673.16,6.9 -binance-futures,BTCUSDT,1582329808197000,1582329808318936,0.031,9673.66,9673.16,6.9 -binance-futures,BTCUSDT,1582329808197000,1582329808321492,0.22,9673.78,9673.16,6.9 -binance-futures,BTCUSDT,1582329808204000,1582329808325836,1.351,9673.98,9673.16,6.9 -binance-futures,BTCUSDT,1582329808216000,1582329808339231,1.351,9673.98,9673.17,0.71 -binance-futures,BTCUSDT,1582329808222000,1582329808346388,1.351,9673.98,9673.17,1.38 -binance-futures,BTCUSDT,1582329808225000,1582329808348464,1.351,9673.98,9673.17,2.05 -binance-futures,BTCUSDT,1582329808236000,1582329808363253,1.351,9673.98,9673.17,10.55 -binance-futures,BTCUSDT,1582329808239000,1582329808364534,0.22,9673.94,9673.21,0.031 -binance-futures,BTCUSDT,1582329808262000,1582329808381550,0.22,9673.94,9673.21,9.031 -binance-futures,BTCUSDT,1582329808269000,1582329808387628,1.351,9673.98,9673.21,9.031 -binance-futures,BTCUSDT,1582329808283000,1582329808403479,1.351,9673.98,9673.22,0.431 -binance-futures,BTCUSDT,1582329808287000,1582329808405998,1.351,9673.98,9673.25,0.031 -binance-futures,BTCUSDT,1582329808304000,1582329808453540,1.351,9673.98,9673.25,8.731 -binance-futures,BTCUSDT,1582329808356000,1582329808478966,1.351,9673.98,9673.29,0.031 -binance-futures,BTCUSDT,1582329808373000,1582329808492485,1.351,9673.98,9673.29,8.031 -binance-futures,BTCUSDT,1582329808384000,1582329808503527,1.351,9673.98,9673.39,0.43 -binance-futures,BTCUSDT,1582329808397000,1582329808516174,1.351,9673.98,9673.97,0.083 -binance-futures,BTCUSDT,1582329808507000,1582329808624619,1.351,9673.98,9673.43,0.031 -binance-futures,BTCUSDT,1582329808527000,1582329808646732,1.351,9673.98,9673.15,0.686 -binance-futures,BTCUSDT,1582329808530000,1582329808649796,0.22,9673.97,9673.15,0.686 -binance-futures,BTCUSDT,1582329808550000,1582329808668465,0.031,9673.95,9673.15,0.686 -binance-futures,BTCUSDT,1582329808550000,1582329808668733,0.031,9673.94,9673.15,0.686 -binance-futures,BTCUSDT,1582329808573000,1582329808691806,0.251,9673.94,9673.15,0.686 -binance-futures,BTCUSDT,1582329808594000,1582329808716954,0.016,9673.91,9673.15,0.686 -binance-futures,BTCUSDT,1582329808599000,1582329808720206,0.031,9673.9,9673.15,0.686 -binance-futures,BTCUSDT,1582329808621000,1582329808740994,0.22,9673.89,9673.15,0.686 -binance-futures,BTCUSDT,1582329808696000,1582329808818644,0.031,9673.85,9673.15,0.686 -binance-futures,BTCUSDT,1582329808772000,1582329808892803,0.031,9673.85,9673.23,0.452 -binance-futures,BTCUSDT,1582329808775000,1582329808895901,0.031,9673.85,9673.15,0.686 -binance-futures,BTCUSDT,1582329808797000,1582329808917801,0.22,9673.87,9673.15,0.686 -binance-futures,BTCUSDT,1582329808801000,1582329808920249,0.031,9673.81,9673.15,0.686 -binance-futures,BTCUSDT,1582329808819000,1582329808940749,0.22,9673.87,9673.15,0.686 -binance-futures,BTCUSDT,1582329808821000,1582329808943593,0.031,9673.92,9673.15,0.686 -binance-futures,BTCUSDT,1582329808828000,1582329808948416,0.031,9673.91,9673.15,0.686 -binance-futures,BTCUSDT,1582329808954000,1582329809076118,0.031,9673.88,9673.15,0.686 -binance-futures,BTCUSDT,1582329808980000,1582329809099545,0.22,9673.84,9673.15,0.686 -binance-futures,BTCUSDT,1582329809002000,1582329809121656,0.016,9673.8,9673.15,0.686 -binance-futures,BTCUSDT,1582329809025000,1582329809145946,0.031,9673.77,9673.15,0.686 -binance-futures,BTCUSDT,1582329809138000,1582329809256262,0.251,9673.77,9673.15,0.686 -binance-futures,BTCUSDT,1582329809159000,1582329809275198,0.031,9673.73,9673.15,0.686 -binance-futures,BTCUSDT,1582329809181000,1582329809305979,0.031,9673.73,9673.16,0.67 -binance-futures,BTCUSDT,1582329809186000,1582329809308678,0.031,9673.73,9673.16,1.34 -binance-futures,BTCUSDT,1582329809189000,1582329809309406,0.031,9673.73,9673.16,2.01 -binance-futures,BTCUSDT,1582329809191000,1582329809312540,0.031,9673.73,9673.16,2.05 -binance-futures,BTCUSDT,1582329809210000,1582329809331119,0.251,9673.77,9673.16,2.05 -binance-futures,BTCUSDT,1582329809211000,1582329809331129,0.22,9673.77,9673.16,2.05 -binance-futures,BTCUSDT,1582329809228000,1582329809344748,1.351,9673.98,9673.16,2.05 -binance-futures,BTCUSDT,1582329809246000,1582329809391029,1.351,9673.98,9673.2,0.031 -binance-futures,BTCUSDT,1582329809255000,1582329809391091,0.22,9673.97,9673.2,0.031 -binance-futures,BTCUSDT,1582329809288000,1582329809406969,0.22,9673.97,9673.2,3.331 -binance-futures,BTCUSDT,1582329809293000,1582329809411491,0.22,9673.97,9673.23,0.031 -binance-futures,BTCUSDT,1582329809307000,1582329809427053,1.351,9673.98,9673.23,0.031 -binance-futures,BTCUSDT,1582329809309000,1582329809427476,1.351,9673.98,9673.23,4.181 -binance-futures,BTCUSDT,1582329809319000,1582329809440397,1.351,9673.98,9673.24,0.67 -binance-futures,BTCUSDT,1582329809335000,1582329809454937,1.351,9673.98,9673.26,0.44 -binance-futures,BTCUSDT,1582329809343000,1582329809464618,1.351,9673.98,9673.28,0.031 -binance-futures,BTCUSDT,1582329809359000,1582329809480409,0.22,9673.89,9673.28,0.031 -binance-futures,BTCUSDT,1582329809364000,1582329809484683,0.22,9673.89,9673.28,6.181 -binance-futures,BTCUSDT,1582329809370000,1582329809489916,1.351,9673.98,9673.28,6.181 -binance-futures,BTCUSDT,1582329809375000,1582329809496179,1.351,9673.98,9673.28,6.61 -binance-futures,BTCUSDT,1582329809390000,1582329809510580,1.351,9673.98,9673.31,0.467 -binance-futures,BTCUSDT,1582329809392000,1582329809512960,1.351,9673.98,9673.32,0.031 -binance-futures,BTCUSDT,1582329809410000,1582329809530210,1.351,9673.98,9673.32,4.381 -binance-futures,BTCUSDT,1582329809438000,1582329809560618,1.351,9673.98,9673.36,0.447 -binance-futures,BTCUSDT,1582329809460000,1582329809582789,1.351,9673.98,9673.36,4.097 -binance-futures,BTCUSDT,1582329809465000,1582329809587326,0.22,9673.9,9673.4,0.031 -binance-futures,BTCUSDT,1582329809486000,1582329809607236,1.351,9673.98,9673.4,4.331 -binance-futures,BTCUSDT,1582329809490000,1582329809612496,1.351,9673.98,9673.43,0.459 -binance-futures,BTCUSDT,1582329809509000,1582329809629024,1.351,9673.98,9673.43,0.49 -binance-futures,BTCUSDT,1582329809512000,1582329809634288,1.351,9673.98,9673.43,4.14 -binance-futures,BTCUSDT,1582329809524000,1582329809644734,1.351,9673.98,9673.43,0.49 -binance-futures,BTCUSDT,1582329809549000,1582329809670261,1.351,9673.98,9673.43,0.031 -binance-futures,BTCUSDT,1582329809565000,1582329809685604,1.351,9673.98,9673.47,0.031 -binance-futures,BTCUSDT,1582329809572000,1582329809692174,1.351,9673.98,9673.47,0.463 -binance-futures,BTCUSDT,1582329809583000,1582329809704930,1.351,9673.98,9673.47,3.513 -binance-futures,BTCUSDT,1582329809588000,1582329809710316,1.351,9673.98,9673.47,3.482 -binance-futures,BTCUSDT,1582329809597000,1582329809717423,1.351,9673.98,9673.47,0.432 -binance-futures,BTCUSDT,1582329809608000,1582329809728051,1.351,9673.98,9673.51,0.434 -binance-futures,BTCUSDT,1582329809615000,1582329809737411,1.351,9673.98,9673.51,0.465 -binance-futures,BTCUSDT,1582329809669000,1582329809793345,1.351,9673.98,9673.51,0.434 -binance-futures,BTCUSDT,1582329809669000,1582329809793359,1.351,9673.98,9673.46,0.04 -binance-futures,BTCUSDT,1582329809692000,1582329809813073,0.22,9673.97,9673.46,0.04 -binance-futures,BTCUSDT,1582329809695000,1582329809817344,0.031,9673.94,9673.46,0.04 -binance-futures,BTCUSDT,1582329809704000,1582329809825412,0.031,9673.94,9673.15,0.686 -binance-futures,BTCUSDT,1582329809711000,1582329809832219,0.031,9673.94,9673.25,0.465 -binance-futures,BTCUSDT,1582329809717000,1582329809837664,0.031,9673.94,9673.15,0.686 -binance-futures,BTCUSDT,1582329809736000,1582329809861437,0.031,9673.94,9673.26,0.67 -binance-futures,BTCUSDT,1582329809740000,1582329809861481,0.031,9673.93,9673.26,0.67 -binance-futures,BTCUSDT,1582329809746000,1582329809866704,0.031,9673.93,9673.26,0.71 -binance-futures,BTCUSDT,1582329809748000,1582329809869523,0.22,9673.8,9673.26,0.71 -binance-futures,BTCUSDT,1582329809759000,1582329809881270,0.22,9673.8,9673.26,1.38 -binance-futures,BTCUSDT,1582329809764000,1582329809888466,0.22,9673.8,9673.26,0.71 -binance-futures,BTCUSDT,1582329809772000,1582329809893320,0.22,9673.8,9673.26,1.38 -binance-futures,BTCUSDT,1582329809793000,1582329809912896,0.22,9673.8,9673.15,0.686 -binance-futures,BTCUSDT,1582329809813000,1582329809933464,0.031,9673.76,9673.15,0.686 -binance-futures,BTCUSDT,1582329809846000,1582329809967846,0.22,9673.74,9673.15,0.686 -binance-futures,BTCUSDT,1582329809853000,1582329809972674,0.031,9673.76,9673.15,0.686 -binance-futures,BTCUSDT,1582329809867000,1582329809989034,0.031,9673.76,9673.16,0.67 -binance-futures,BTCUSDT,1582329809868000,1582329809989048,0.031,9673.7,9673.16,0.67 -binance-futures,BTCUSDT,1582329809870000,1582329809990631,0.031,9673.7,9673.16,1.34 -binance-futures,BTCUSDT,1582329809874000,1582329809994643,0.031,9673.7,9673.16,1.38 -binance-futures,BTCUSDT,1582329809876000,1582329809998888,0.031,9673.7,9673.16,2.05 -binance-futures,BTCUSDT,1582329809890000,1582329810011103,0.016,9673.71,9673.16,2.05 -binance-futures,BTCUSDT,1582329809892000,1582329810013759,0.22,9673.77,9673.16,2.05 -binance-futures,BTCUSDT,1582329809912000,1582329810030445,1.351,9673.98,9673.16,2.05 -binance-futures,BTCUSDT,1582329809935000,1582329810060391,1.351,9673.98,9673.2,0.031 -binance-futures,BTCUSDT,1582329809957000,1582329810078803,0.22,9673.94,9673.2,0.031 -binance-futures,BTCUSDT,1582329809967000,1582329810087166,0.22,9673.94,9673.21,1.34 -binance-futures,BTCUSDT,1582329809968000,1582329810089618,0.22,9673.94,9673.21,1.38 -binance-futures,BTCUSDT,1582329809974000,1582329810095038,0.22,9673.94,9673.21,2.05 -binance-futures,BTCUSDT,1582329809977000,1582329810097928,1.351,9673.98,9673.21,2.05 -binance-futures,BTCUSDT,1582329809989000,1582329810109832,1.351,9673.98,9673.24,0.031 -binance-futures,BTCUSDT,1582329809992000,1582329810114201,1.351,9673.98,9673.25,0.031 -binance-futures,BTCUSDT,1582329810075000,1582329810192465,1.351,9673.98,9673.24,0.031 -binance-futures,BTCUSDT,1582329810078000,1582329810196924,1.351,9673.98,9673.15,0.686 -binance-futures,BTCUSDT,1582329810100000,1582329810220086,0.031,9673.95,9673.15,0.686 -binance-futures,BTCUSDT,1582329810100000,1582329810221961,0.031,9673.94,9673.15,0.686 -binance-futures,BTCUSDT,1582329810119000,1582329810240618,0.031,9673.94,9673.16,0.429 -binance-futures,BTCUSDT,1582329810158000,1582329810565653,0.031,9673.94,9673.15,0.686 -binance-futures,BTCUSDT,1582329810204000,1582329810566018,0.031,9673.93,9673.15,0.686 -binance-futures,BTCUSDT,1582329810230000,1582329810566307,2.781,9673.93,9673.15,0.686 -binance-futures,BTCUSDT,1582329810257000,1582329810566615,0.031,9673.93,9673.15,0.686 -binance-futures,BTCUSDT,1582329810263000,1582329810566692,0.016,9673.89,9673.15,0.686 -binance-futures,BTCUSDT,1582329810271000,1582329810566775,0.22,9673.83,9673.15,0.686 -binance-futures,BTCUSDT,1582329810289000,1582329810566971,2.72,9673.83,9673.15,0.686 -binance-futures,BTCUSDT,1582329810303000,1582329810567067,0.22,9673.83,9673.15,0.686 -binance-futures,BTCUSDT,1582329810314000,1582329810567209,0.251,9673.79,9673.15,0.686 -binance-futures,BTCUSDT,1582329810329000,1582329810567292,0.031,9673.79,9673.15,0.686 -binance-futures,BTCUSDT,1582329810385000,1582329810567529,0.031,9673.78,9673.15,0.686 -binance-futures,BTCUSDT,1582329810495000,1582329810615969,0.22,9673.66,9673.15,0.686 -binance-futures,BTCUSDT,1582329810519000,1582329810642416,1.351,9673.98,9673.15,0.686 -binance-futures,BTCUSDT,1582329810543000,1582329810664529,0.031,9673.94,9673.15,0.686 -binance-futures,BTCUSDT,1582329810550000,1582329810671756,0.22,9673.88,9673.15,0.686 -binance-futures,BTCUSDT,1582329810573000,1582329810693825,3.27,9673.88,9673.15,0.686 -binance-futures,BTCUSDT,1582329810596000,1582329810719847,0.031,9673.84,9673.15,0.686 -binance-futures,BTCUSDT,1582329810609000,1582329810731332,0.22,9673.79,9673.15,0.686 -binance-futures,BTCUSDT,1582329810632000,1582329810750452,3.67,9673.79,9673.15,0.686 -binance-futures,BTCUSDT,1582329810637000,1582329810758543,3.45,9673.79,9673.15,0.686 -binance-futures,BTCUSDT,1582329810639000,1582329810758622,0.22,9673.78,9673.15,0.686 -binance-futures,BTCUSDT,1582329810653000,1582329810771974,0.031,9673.75,9673.15,0.686 -binance-futures,BTCUSDT,1582329810684000,1582329810804920,0.22,9673.71,9673.15,0.686 -binance-futures,BTCUSDT,1582329810702000,1582329810823551,0.031,9673.73,9673.15,0.686 -binance-futures,BTCUSDT,1582329811106000,1582329811228889,0.251,9673.73,9673.15,0.686 -binance-futures,BTCUSDT,1582329811133000,1582329811260483,0.031,9673.69,9673.15,0.686 -binance-futures,BTCUSDT,1582329811187000,1582329811343433,0.016,9673.66,9673.15,0.686 -binance-futures,BTCUSDT,1582329811241000,1582329811358366,2.466,9673.66,9673.15,0.686 -binance-futures,BTCUSDT,1582329811261000,1582329811382688,0.22,9673.63,9673.15,0.686 -binance-futures,BTCUSDT,1582329811286000,1582329811406787,0.031,9673.59,9673.15,0.686 -binance-futures,BTCUSDT,1582329811387000,1582329811506752,0.031,9673.58,9673.15,0.686 -binance-futures,BTCUSDT,1582329811436000,1582329811556305,0.251,9673.58,9673.15,0.686 -binance-futures,BTCUSDT,1582329811458000,1582329811578416,0.016,9673.54,9673.15,0.686 -binance-futures,BTCUSDT,1582329811505000,1582329811624749,0.031,9673.51,9673.15,0.686 -binance-futures,BTCUSDT,1582329811509000,1582329811627474,0.22,9673.42,9673.15,0.686 -binance-futures,BTCUSDT,1582329811545000,1582329811669340,4.038,9673.78,9673.15,0.686 -binance-futures,BTCUSDT,1582329811547000,1582329811669350,2,9673.38,9673.15,0.686 -binance-futures,BTCUSDT,1582329811564000,1582329811684300,0.22,9673.76,9673.15,0.686 -binance-futures,BTCUSDT,1582329811572000,1582329811695909,0.031,9673.34,9673.15,0.686 -binance-futures,BTCUSDT,1582329811583000,1582329811702867,2,9673.32,9673.15,0.686 -binance-futures,BTCUSDT,1582329811630000,1582329811752015,0.22,9673.22,9673.15,0.686 -binance-futures,BTCUSDT,1582329811636000,1582329811755736,2,9673.32,9673.15,0.686 -binance-futures,BTCUSDT,1582329811649000,1582329811769138,0.031,9673.34,9673.15,0.686 -binance-futures,BTCUSDT,1582329811655000,1582329811778688,0.031,9673.18,9673.15,0.686 -binance-futures,BTCUSDT,1582329811678000,1582329811799610,4.038,9673.78,9673.15,0.686 -binance-futures,BTCUSDT,1582329811701000,1582329811825305,0.031,9673.74,9673.15,0.686 -binance-futures,BTCUSDT,1582329811723000,1582329811844209,2.281,9673.74,9673.15,0.686 -binance-futures,BTCUSDT,1582329811734000,1582329811856019,0.031,9673.74,9673.15,0.686 -binance-futures,BTCUSDT,1582329811757000,1582329811875290,0.031,9673.72,9673.15,0.686 -binance-futures,BTCUSDT,1582329811813000,1582329811931612,0.016,9673.73,9673.15,0.686 -binance-futures,BTCUSDT,1582329811854000,1582329811974740,0.016,9673.73,9673.17,0.467 -binance-futures,BTCUSDT,1582329811896000,1582329812017252,0.016,9673.73,9673.15,0.686 -binance-futures,BTCUSDT,1582329811920000,1582329812042379,0.016,9673.73,9673.16,0.456 -binance-futures,BTCUSDT,1582329811938000,1582329812058668,0.016,9673.73,9673.15,0.686 -binance-futures,BTCUSDT,1582329811957000,1582329812075174,0.016,9673.73,9673.16,0.45 -binance-futures,BTCUSDT,1582329812183000,1582329812304361,0.016,9673.73,9673.15,0.686 -binance-futures,BTCUSDT,1582329812444000,1582329812568398,0.22,9673.67,9673.15,0.686 -binance-futures,BTCUSDT,1582329812470000,1582329812592352,0.031,9673.63,9673.15,0.686 -binance-futures,BTCUSDT,1582329812495000,1582329812617597,0.031,9673.62,9673.15,0.686 -binance-futures,BTCUSDT,1582329812496000,1582329812618763,0.031,9673.6,9673.15,0.686 -binance-futures,BTCUSDT,1582329812718000,1582329812838313,0.22,9673.57,9673.15,0.686 -binance-futures,BTCUSDT,1582329812740000,1582329812879204,0.016,9673.53,9673.15,0.686 -binance-futures,BTCUSDT,1582329812783000,1582329812902762,0.031,9673.5,9673.15,0.686 -binance-futures,BTCUSDT,1582329812799000,1582329812918323,0.22,9673.46,9673.15,0.686 -binance-futures,BTCUSDT,1582329812821000,1582329812942060,0.031,9673.5,9673.15,0.686 -binance-futures,BTCUSDT,1582329812844000,1582329812965800,0.031,9673.47,9673.15,0.686 -binance-futures,BTCUSDT,1582329812933000,1582329813052491,0.031,9673.5,9673.15,0.686 -binance-futures,BTCUSDT,1582329812954000,1582329813072013,0.031,9673.44,9673.15,0.686 -binance-futures,BTCUSDT,1582329812977000,1582329813095924,0.031,9673.5,9673.15,0.686 -binance-futures,BTCUSDT,1582329812998000,1582329813118602,0.031,9673.49,9673.15,0.686 -binance-futures,BTCUSDT,1582329813661000,1582329813790550,0.031,9673.49,9673.15,0.68 -binance-futures,BTCUSDT,1582329813673000,1582329813793838,0.031,9673.49,9673.18,0.467 -binance-futures,BTCUSDT,1582329813682000,1582329813801468,2.581,9673.49,9673.18,0.467 -binance-futures,BTCUSDT,1582329813696000,1582329813816428,0.031,9673.49,9673.18,0.467 -binance-futures,BTCUSDT,1582329813704000,1582329813825000,0.016,9673.45,9673.18,0.467 -binance-futures,BTCUSDT,1582329813730000,1582329813851704,0.031,9673.49,9673.15,0.68 -binance-futures,BTCUSDT,1582329813752000,1582329813871116,0.016,9673.41,9673.15,0.68 -binance-futures,BTCUSDT,1582329813774000,1582329813895349,0.031,9673.47,9673.15,0.68 -binance-futures,BTCUSDT,1582329813877000,1582329813995913,0.22,9673.44,9673.15,0.68 -binance-futures,BTCUSDT,1582329813898000,1582329814016744,0.016,9673.4,9673.15,0.68 -binance-futures,BTCUSDT,1582329813919000,1582329814040826,0.031,9673.37,9673.15,0.68 -binance-futures,BTCUSDT,1582329814005000,1582329814126920,0.031,9673.26,9673.15,0.68 -binance-futures,BTCUSDT,1582329814007000,1582329814126945,0.22,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329814012000,1582329814131019,0.031,9673.26,9673.15,0.68 -binance-futures,BTCUSDT,1582329814028000,1582329814150776,4.038,9673.78,9673.15,0.68 -binance-futures,BTCUSDT,1582329814029000,1582329814151788,0.22,9673.47,9673.15,0.68 -binance-futures,BTCUSDT,1582329814033000,1582329814155807,4.038,9673.78,9673.15,0.68 -binance-futures,BTCUSDT,1582329814055000,1582329814175603,0.22,9673.69,9673.15,0.68 -binance-futures,BTCUSDT,1582329814059000,1582329814179647,0.44,9673.69,9673.15,0.68 -binance-futures,BTCUSDT,1582329814067000,1582329814188161,0.22,9673.69,9673.15,0.68 -binance-futures,BTCUSDT,1582329814074000,1582329814194347,3.72,9673.69,9673.15,0.68 -binance-futures,BTCUSDT,1582329814095000,1582329814215472,3.5,9673.69,9673.15,0.68 -binance-futures,BTCUSDT,1582329814118000,1582329814240658,0.031,9673.67,9673.15,0.68 -binance-futures,BTCUSDT,1582329814118000,1582329814240672,0.031,9673.65,9673.15,0.68 -binance-futures,BTCUSDT,1582329814139000,1582329814259552,4.581,9673.65,9673.15,0.68 -binance-futures,BTCUSDT,1582329814165000,1582329814284822,0.22,9673.64,9673.15,0.68 -binance-futures,BTCUSDT,1582329814170000,1582329814289054,0.016,9673.62,9673.15,0.68 -binance-futures,BTCUSDT,1582329814170000,1582329814289064,0.031,9673.61,9673.15,0.68 -binance-futures,BTCUSDT,1582329814186000,1582329814306967,2.431,9673.61,9673.15,0.68 -binance-futures,BTCUSDT,1582329814196000,1582329814316940,0.031,9673.61,9673.15,0.68 -binance-futures,BTCUSDT,1582329814211000,1582329814331053,0.22,9673.6,9673.15,0.68 -binance-futures,BTCUSDT,1582329814219000,1582329814337248,0.031,9673.61,9673.15,0.68 -binance-futures,BTCUSDT,1582329814235000,1582329814354919,0.031,9673.56,9673.15,0.68 -binance-futures,BTCUSDT,1582329814256000,1582329814401553,0.031,9673.61,9673.15,0.68 -binance-futures,BTCUSDT,1582329814258000,1582329814409031,0.031,9673.59,9673.15,0.68 -binance-futures,BTCUSDT,1582329814305000,1582329814426138,0.031,9673.58,9673.15,0.68 -binance-futures,BTCUSDT,1582329815466000,1582329815586922,0.22,9673.92,9673.15,0.68 -binance-futures,BTCUSDT,1582329815491000,1582329815611339,0.22,9673.92,9673.16,0.67 -binance-futures,BTCUSDT,1582329815493000,1582329815615454,3.301,9674.04,9673.16,0.67 -binance-futures,BTCUSDT,1582329815493000,1582329815615489,3.301,9674.04,9673.16,2.01 -binance-futures,BTCUSDT,1582329815501000,1582329815620467,3.301,9674.04,9673.16,2.05 -binance-futures,BTCUSDT,1582329815518000,1582329815638058,3.301,9674.04,9673.2,0.031 -binance-futures,BTCUSDT,1582329815537000,1582329815657332,3.301,9674.04,9673.2,2.981 -binance-futures,BTCUSDT,1582329815542000,1582329815661845,3.301,9674.04,9673.2,3.43 -binance-futures,BTCUSDT,1582329815558000,1582329815678452,3.301,9674.04,9673.2,2.981 -binance-futures,BTCUSDT,1582329815562000,1582329815680670,3.301,9674.04,9673.26,0.435 -binance-futures,BTCUSDT,1582329815582000,1582329815702672,3.301,9674.04,9673.26,5.085 -binance-futures,BTCUSDT,1582329815599000,1582329815719541,3.301,9674.04,9673.27,0.67 -binance-futures,BTCUSDT,1582329815609000,1582329815728464,3.301,9674.04,9673.47,0.472 -binance-futures,BTCUSDT,1582329815625000,1582329815742067,3.301,9674.04,9673.47,5.522 -binance-futures,BTCUSDT,1582329815636000,1582329815754754,3.301,9674.04,9673.47,6.192 -binance-futures,BTCUSDT,1582329815647000,1582329815767823,3.301,9674.04,9673.57,0.468 -binance-futures,BTCUSDT,1582329815665000,1582329815787744,3.301,9674.04,9673.63,2 -binance-futures,BTCUSDT,1582329815685000,1582329815805674,3.301,9674.04,9673.63,5.5 -binance-futures,BTCUSDT,1582329815689000,1582329815811125,3.301,9674.04,9673.7,0.437 -binance-futures,BTCUSDT,1582329815709000,1582329815829588,3.301,9674.04,9673.7,5.487 -binance-futures,BTCUSDT,1582329815711000,1582329815831122,3.301,9674.04,9673.7,5.05 -binance-futures,BTCUSDT,1582329815714000,1582329815839873,2.561,9674.04,9673.7,5.05 -binance-futures,BTCUSDT,1582329815728000,1582329815846279,2.561,9674.04,9673.76,2 -binance-futures,BTCUSDT,1582329815730000,1582329815850640,2.561,9674.04,9673.76,6 -binance-futures,BTCUSDT,1582329815732000,1582329815853965,2.561,9674.04,9673.76,8 -binance-futures,BTCUSDT,1582329815745000,1582329815865961,2.561,9674.04,9673.76,13.5 -binance-futures,BTCUSDT,1582329815748000,1582329815869665,2.561,9674.04,9673.82,2 -binance-futures,BTCUSDT,1582329815767000,1582329815885991,2.561,9674.04,9673.82,9.55 -binance-futures,BTCUSDT,1582329815776000,1582329815897946,2.561,9674.04,9673.89,0.456 -binance-futures,BTCUSDT,1582329815778000,1582329815900926,1.851,9674.04,9673.89,0.456 -binance-futures,BTCUSDT,1582329815798000,1582329815918699,1.851,9674.04,9673.89,8.756 -binance-futures,BTCUSDT,1582329815802000,1582329815922357,1.851,9674.04,9673.9,2 -binance-futures,BTCUSDT,1582329815813000,1582329815938378,1.851,9674.04,9673.92,2 -binance-futures,BTCUSDT,1582329815815000,1582329815938413,1.851,9674.04,9673.95,2 -binance-futures,BTCUSDT,1582329815821000,1582329815940381,1.851,9674.04,9673.95,4 -binance-futures,BTCUSDT,1582329815821000,1582329815940395,1.851,9674.04,9673.97,0.445 -binance-futures,BTCUSDT,1582329815827000,1582329815946491,1.851,9674.04,9674.03,0.083 -binance-futures,BTCUSDT,1582329815846000,1582329815968156,1.851,9674.04,9674.03,8.833 -binance-futures,BTCUSDT,1582329815851000,1582329815974524,1.851,9674.04,9674.03,9.301 -binance-futures,BTCUSDT,1582329815866000,1582329815988326,3.062,9674.37,9674.03,9.301 -binance-futures,BTCUSDT,1582329815875000,1582329815995873,3.062,9674.37,9674.05,0.031 -binance-futures,BTCUSDT,1582329815875000,1582329815997614,3.062,9674.37,9674.07,0.031 -binance-futures,BTCUSDT,1582329815888000,1582329816009370,3.062,9674.37,9674.09,6 -binance-futures,BTCUSDT,1582329815889000,1582329816013241,3.062,9674.37,9674.11,0.441 -binance-futures,BTCUSDT,1582329815893000,1582329816013661,3.062,9674.37,9674.22,0.01 -binance-futures,BTCUSDT,1582329815912000,1582329816035226,3.062,9674.37,9674.22,8.61 -binance-futures,BTCUSDT,1582329815918000,1582329816041529,3.062,9674.37,9674.23,2 -binance-futures,BTCUSDT,1582329815920000,1582329816042915,3.062,9674.37,9674.26,2 -binance-futures,BTCUSDT,1582329815930000,1582329816052136,3.062,9674.37,9674.28,2 -binance-futures,BTCUSDT,1582329815934000,1582329816054657,3.062,9674.37,9674.28,4 -binance-futures,BTCUSDT,1582329815943000,1582329816063695,3.062,9674.37,9674.28,6 -binance-futures,BTCUSDT,1582329815949000,1582329816068289,3.062,9674.37,9674.28,12 -binance-futures,BTCUSDT,1582329815958000,1582329816078237,3.062,9674.37,9674.36,0.454 -binance-futures,BTCUSDT,1582329815975000,1582329816095469,3.062,9674.37,9674.36,7.154 -binance-futures,BTCUSDT,1582329816037000,1582329816158518,3.062,9674.37,9674.36,7.824 -binance-futures,BTCUSDT,1582329816062000,1582329816183531,3.062,9674.37,9674.36,8.494 -binance-futures,BTCUSDT,1582329816067000,1582329816185659,3.062,9674.37,9674.36,1.794 -binance-futures,BTCUSDT,1582329816078000,1582329816199131,3.062,9674.37,9674.36,2.464 -binance-futures,BTCUSDT,1582329816200000,1582329816339269,3.062,9674.37,9674.36,2.547 -binance-futures,BTCUSDT,1582329816567000,1582329816708246,0.06,9674.6,9674.36,2.547 -binance-futures,BTCUSDT,1582329816597000,1582329816718980,0.06,9674.6,9674.36,1.877 -binance-futures,BTCUSDT,1582329816605000,1582329816734247,3.482,9674.64,9674.42,4 -binance-futures,BTCUSDT,1582329816613000,1582329816741499,3.482,9674.64,9674.51,0.443 -binance-futures,BTCUSDT,1582329816636000,1582329816759103,3.482,9674.64,9674.57,2 -binance-futures,BTCUSDT,1582329816637000,1582329816762294,2.812,9674.64,9674.57,2 -binance-futures,BTCUSDT,1582329816656000,1582329816778860,2.812,9674.64,9674.57,4.45 -binance-futures,BTCUSDT,1582329816658000,1582329816783075,2.812,9674.64,9674.57,13.95 -binance-futures,BTCUSDT,1582329816660000,1582329816783390,2.812,9674.64,9674.61,0.031 -binance-futures,BTCUSDT,1582329816664000,1582329816785680,2.812,9674.64,9674.63,0.463 -binance-futures,BTCUSDT,1582329816672000,1582329816796167,2.812,9674.64,9674.63,2.463 -binance-futures,BTCUSDT,1582329816685000,1582329816806746,2.812,9674.64,9674.63,13.813 -binance-futures,BTCUSDT,1582329816742000,1582329816863782,2.142,9674.64,9674.63,13.813 -binance-futures,BTCUSDT,1582329816756000,1582329816879357,1.847,9674.98,9674.64,0.67 -binance-futures,BTCUSDT,1582329816767000,1582329816888240,1.847,9674.98,9674.67,0.031 -binance-futures,BTCUSDT,1582329816774000,1582329816894433,1.847,9674.98,9674.69,2 -binance-futures,BTCUSDT,1582329816776000,1582329816896631,1.847,9674.98,9674.69,4 -binance-futures,BTCUSDT,1582329816778000,1582329816900400,1.847,9674.98,9674.69,6 -binance-futures,BTCUSDT,1582329816784000,1582329816907056,1.847,9674.98,9674.82,0.436 -binance-futures,BTCUSDT,1582329816808000,1582329816932610,1.847,9674.98,9674.82,13.286 -binance-futures,BTCUSDT,1582329816808000,1582329816934065,1.847,9674.98,9674.88,2 -binance-futures,BTCUSDT,1582329816823000,1582329816947690,1.847,9674.98,9674.88,4 -binance-futures,BTCUSDT,1582329816827000,1582329816949748,1.847,9674.98,9674.88,6 -binance-futures,BTCUSDT,1582329816827000,1582329816949757,1.847,9674.98,9674.88,17.45 -binance-futures,BTCUSDT,1582329816833000,1582329816958010,1.847,9674.98,9674.97,0.438 -binance-futures,BTCUSDT,1582329816855000,1582329816979163,1.847,9674.98,9674.97,11.388 -binance-futures,BTCUSDT,1582329816998000,1582329817123935,1.847,9674.98,9674.97,11.471 -binance-futures,BTCUSDT,1582329817066000,1582329817187746,1.847,9674.98,9674.97,0.521 -binance-futures,BTCUSDT,1582329817580000,1582329817718260,1.847,9674.98,9674.28,2.547 -binance-futures,BTCUSDT,1582329817603000,1582329817724466,1.847,9674.98,9674.97,0.389 -binance-futures,BTCUSDT,1582329817624000,1582329817746248,1.847,9674.98,9674.4,0.389 -binance-futures,BTCUSDT,1582329817646000,1582329817770672,1.847,9674.98,9673.99,2 -binance-futures,BTCUSDT,1582329817648000,1582329817775520,1.847,9674.98,9673.3,0.389 -binance-futures,BTCUSDT,1582329817652000,1582329817775662,1.847,9674.98,9674.44,0.031 -binance-futures,BTCUSDT,1582329817673000,1582329817800025,1.847,9674.98,9674.42,0.031 -binance-futures,BTCUSDT,1582329817675000,1582329817800087,1.847,9674.98,9674.03,0.389 -binance-futures,BTCUSDT,1582329817681000,1582329817807819,1.847,9674.98,9673.72,2 -binance-futures,BTCUSDT,1582329817682000,1582329817812292,1.847,9674.98,9673.45,0.389 -binance-futures,BTCUSDT,1582329817692000,1582329817815185,1.847,9674.98,9673.22,3.716 -binance-futures,BTCUSDT,1582329817692000,1582329817815390,1.847,9674.98,9673.75,0.389 -binance-futures,BTCUSDT,1582329817702000,1582329817826642,1.847,9674.98,9674.46,0.031 -binance-futures,BTCUSDT,1582329817720000,1582329817845409,1.847,9674.98,9674.44,0.031 -binance-futures,BTCUSDT,1582329817749000,1582329817871442,1.847,9674.98,9673.75,5 -binance-futures,BTCUSDT,1582329817753000,1582329817878608,1.847,9674.98,9673.77,0.389 -binance-futures,BTCUSDT,1582329817769000,1582329817890243,0.39,9675.32,9673.77,0.389 -binance-futures,BTCUSDT,1582329817771000,1582329817895702,4.266,9675.2,9673.75,5 -binance-futures,BTCUSDT,1582329817773000,1582329817897310,4.266,9675.2,9673.79,0.389 -binance-futures,BTCUSDT,1582329817775000,1582329817901091,4.266,9675.2,9673.79,0.42 -binance-futures,BTCUSDT,1582329817781000,1582329817905229,0.39,9674.89,9673.79,0.031 -binance-futures,BTCUSDT,1582329817790000,1582329817912699,4.266,9675.2,9673.79,0.031 -binance-futures,BTCUSDT,1582329817794000,1582329817914447,4.266,9675.2,9673.79,6.781 -binance-futures,BTCUSDT,1582329817795000,1582329817918131,4.266,9675.2,9673.79,6.75 -binance-futures,BTCUSDT,1582329817804000,1582329817924719,0.39,9675.05,9673.79,6.75 -binance-futures,BTCUSDT,1582329817818000,1582329817943343,4.266,9675.2,9673.79,6.75 -binance-futures,BTCUSDT,1582329817822000,1582329817944847,4.266,9675.2,9673.81,0.389 -binance-futures,BTCUSDT,1582329817830000,1582329817950386,4.266,9675.2,9673.83,0.031 -binance-futures,BTCUSDT,1582329817851000,1582329817971144,4.266,9675.2,9673.83,6.631 -binance-futures,BTCUSDT,1582329817855000,1582329817975666,0.39,9675.19,9673.83,6.631 -binance-futures,BTCUSDT,1582329817875000,1582329817999037,0.39,9675.19,9673.87,0.031 -binance-futures,BTCUSDT,1582329817881000,1582329818003544,4.266,9675.2,9673.87,0.031 -binance-futures,BTCUSDT,1582329817896000,1582329818017834,4.266,9675.2,9673.87,7.181 -binance-futures,BTCUSDT,1582329817898000,1582329818018387,0.39,9675.19,9673.87,7.181 -binance-futures,BTCUSDT,1582329817904000,1582329818027508,4.266,9675.2,9673.87,7.181 -binance-futures,BTCUSDT,1582329817921000,1582329818043716,4.266,9675.2,9673.91,0.42 -binance-futures,BTCUSDT,1582329817940000,1582329818062454,4.266,9675.2,9673.91,6.67 -binance-futures,BTCUSDT,1582329817947000,1582329818069759,4.266,9675.2,9673.91,6.281 -binance-futures,BTCUSDT,1582329817949000,1582329818070112,4.266,9675.2,9673.94,0.389 -binance-futures,BTCUSDT,1582329817968000,1582329818086636,4.266,9675.2,9673.94,6.539 -binance-futures,BTCUSDT,1582329817971000,1582329818092651,4.266,9675.2,9673.95,0.031 -binance-futures,BTCUSDT,1582329817983000,1582329818102820,0.39,9675.07,9673.95,0.031 -binance-futures,BTCUSDT,1582329817990000,1582329818110915,0.39,9675.07,9673.95,6.481 -binance-futures,BTCUSDT,1582329818000000,1582329818121578,4.266,9675.2,9673.97,0.389 -binance-futures,BTCUSDT,1582329818019000,1582329818139626,4.266,9675.2,9673.97,7.339 -binance-futures,BTCUSDT,1582329818036000,1582329818154518,4.266,9675.2,9674.01,0.031 -binance-futures,BTCUSDT,1582329818044000,1582329818166058,4.266,9675.2,9674.01,0.42 -binance-futures,BTCUSDT,1582329818052000,1582329818171549,4.266,9675.2,9674.01,6.87 -binance-futures,BTCUSDT,1582329818070000,1582329818191198,4.266,9675.2,9674.04,0.031 -binance-futures,BTCUSDT,1582329818070000,1582329818191463,4.266,9675.2,9674.05,0.031 -binance-futures,BTCUSDT,1582329818090000,1582329818210386,4.266,9675.2,9674.05,5.231 -binance-futures,BTCUSDT,1582329818118000,1582329818241092,4.266,9675.2,9674.06,0.389 -binance-futures,BTCUSDT,1582329818141000,1582329818263062,4.266,9675.2,9674.06,5.589 -binance-futures,BTCUSDT,1582329818143000,1582329818266372,4.266,9675.2,9674.1,0.031 -binance-futures,BTCUSDT,1582329818149000,1582329818269602,0.39,9675.4,9674.1,0.031 -binance-futures,BTCUSDT,1582329818166000,1582329818287535,0.39,9675.4,9674.1,6.231 -binance-futures,BTCUSDT,1582329818168000,1582329818289436,1.755,9675.42,9674.1,6.231 -binance-futures,BTCUSDT,1582329818189000,1582329818311191,1.755,9675.42,9674.11,0.389 -binance-futures,BTCUSDT,1582329818190000,1582329818313756,1.755,9675.42,9674.14,0.031 -binance-futures,BTCUSDT,1582329818212000,1582329818359427,1.755,9675.42,9674.14,5.681 -binance-futures,BTCUSDT,1582329818265000,1582329818387927,1.755,9675.42,9674.18,0.031 -binance-futures,BTCUSDT,1582329818286000,1582329818410483,0.39,9675.41,9674.18,4.881 -binance-futures,BTCUSDT,1582329818300000,1582329818420750,0.39,9675.41,9674.18,0.031 -binance-futures,BTCUSDT,1582329818312000,1582329818432130,0.39,9675.41,9674.22,0.031 -binance-futures,BTCUSDT,1582329818330000,1582329818450879,0.39,9675.41,9674.22,3.431 -binance-futures,BTCUSDT,1582329818337000,1582329818458031,0.39,9675.41,9674.22,3.4 -binance-futures,BTCUSDT,1582329818359000,1582329818479288,0.39,9675.41,9674.25,0.031 -binance-futures,BTCUSDT,1582329818361000,1582329818481623,0.39,9675.41,9674.26,0.031 -binance-futures,BTCUSDT,1582329818378000,1582329818498189,0.39,9675.41,9674.26,3.531 -binance-futures,BTCUSDT,1582329818393000,1582329818511940,0.39,9675.41,9674.26,0.031 -binance-futures,BTCUSDT,1582329818411000,1582329818535788,0.39,9675.41,9674.02,1.939 -binance-futures,BTCUSDT,1582329818440000,1582329818562252,0.031,9675.38,9674.02,1.939 -binance-futures,BTCUSDT,1582329818442000,1582329818564739,0.031,9675.37,9674.02,1.939 -binance-futures,BTCUSDT,1582329818467000,1582329818591781,0.39,9675.15,9674.02,1.939 -binance-futures,BTCUSDT,1582329818495000,1582329818615653,0.031,9675.11,9674.02,1.939 -binance-futures,BTCUSDT,1582329818521000,1582329818640718,0.39,9675.08,9674.02,1.939 -binance-futures,BTCUSDT,1582329818543000,1582329818664466,0.031,9675.04,9674.02,1.939 -binance-futures,BTCUSDT,1582329818590000,1582329818711299,0.39,9674.99,9674.02,1.939 -binance-futures,BTCUSDT,1582329818603000,1582329818724533,0.031,9675.04,9674.02,1.939 -binance-futures,BTCUSDT,1582329818614000,1582329818737029,0.031,9674.95,9674.02,1.939 -binance-futures,BTCUSDT,1582329818639000,1582329818761908,0.031,9675.04,9674.02,1.939 -binance-futures,BTCUSDT,1582329818661000,1582329818781255,0.031,9675.01,9674.02,1.939 -binance-futures,BTCUSDT,1582329818668000,1582329818791421,0.031,9675.01,9674.06,0.389 -binance-futures,BTCUSDT,1582329818678000,1582329818800297,2.381,9675.01,9674.06,0.389 -binance-futures,BTCUSDT,1582329818679000,1582329818800701,2,9674.97,9674.06,0.389 -binance-futures,BTCUSDT,1582329818690000,1582329818810161,2,9674.97,9674.02,1.939 -binance-futures,BTCUSDT,1582329818704000,1582329818825136,2.39,9674.97,9674.02,1.939 -binance-futures,BTCUSDT,1582329818713000,1582329818832604,0.39,9674.88,9674.02,1.939 -binance-futures,BTCUSDT,1582329818776000,1582329818898063,2,9674.85,9674.02,1.939 -binance-futures,BTCUSDT,1582329818814000,1582329818934021,0.39,9674.68,9674.02,1.939 -binance-futures,BTCUSDT,1582329818837000,1582329818960854,0.031,9674.65,9674.02,1.939 -binance-futures,BTCUSDT,1582329818839000,1582329818960881,0.031,9674.64,9674.02,1.939 -binance-futures,BTCUSDT,1582329818943000,1582329819063055,0.031,9674.63,9674.02,1.939 -binance-futures,BTCUSDT,1582329818968000,1582329819088191,0.39,9674.6,9674.02,1.939 -binance-futures,BTCUSDT,1582329818991000,1582329819112752,0.016,9674.56,9674.02,1.939 -binance-futures,BTCUSDT,1582329819015000,1582329819137427,0.39,9674.4,9674.02,1.939 -binance-futures,BTCUSDT,1582329819035000,1582329819155184,0.031,9674.53,9674.02,1.939 -binance-futures,BTCUSDT,1582329819039000,1582329819158705,0.031,9674.37,9674.02,1.939 -binance-futures,BTCUSDT,1582329819039000,1582329819161629,0.031,9674.36,9674.02,1.939 -binance-futures,BTCUSDT,1582329819058000,1582329819178132,0.031,9674.38,9674.02,1.939 -binance-futures,BTCUSDT,1582329819059000,1582329819179765,2.327,9675.07,9674.02,1.939 -binance-futures,BTCUSDT,1582329819066000,1582329819187049,2.327,9675.07,9674.05,0.389 -binance-futures,BTCUSDT,1582329819093000,1582329819212899,2.327,9675.07,9674.02,1.939 -binance-futures,BTCUSDT,1582329819110000,1582329819230558,2.327,9675.07,9674.03,0.389 -binance-futures,BTCUSDT,1582329819114000,1582329819234399,2.327,9675.07,9674.02,1.939 -binance-futures,BTCUSDT,1582329819118000,1582329819237124,0.39,9675.01,9674.02,1.939 -binance-futures,BTCUSDT,1582329819133000,1582329819255153,5.34,9675.01,9674.02,1.939 -binance-futures,BTCUSDT,1582329819138000,1582329819257955,2,9674.97,9674.02,1.939 -binance-futures,BTCUSDT,1582329819140000,1582329819260681,2.031,9674.97,9674.02,1.939 -binance-futures,BTCUSDT,1582329819157000,1582329819279013,6.131,9674.97,9674.02,1.939 -binance-futures,BTCUSDT,1582329819159000,1582329819283141,2,9674.93,9674.02,1.939 -binance-futures,BTCUSDT,1582329819180000,1582329819302373,8.35,9674.93,9674.02,1.939 -binance-futures,BTCUSDT,1582329819187000,1582329819311653,0.39,9674.81,9674.02,1.939 -binance-futures,BTCUSDT,1582329819207000,1582329819328032,2,9674.77,9674.02,1.939 -binance-futures,BTCUSDT,1582329819230000,1582329819352528,8.6,9674.77,9674.02,1.939 -binance-futures,BTCUSDT,1582329819235000,1582329819356279,0.39,9674.63,9674.02,1.939 -binance-futures,BTCUSDT,1582329819253000,1582329819393736,2,9674.59,9674.02,1.939 -binance-futures,BTCUSDT,1582329819287000,1582329819408076,7,9674.59,9674.02,1.939 -binance-futures,BTCUSDT,1582329819295000,1582329819418062,0.031,9674.55,9674.02,1.939 -binance-futures,BTCUSDT,1582329819299000,1582329819419721,0.39,9674.53,9674.02,1.939 -binance-futures,BTCUSDT,1582329819319000,1582329819437065,5.24,9674.53,9674.02,1.939 -binance-futures,BTCUSDT,1582329819346000,1582329819488941,0.39,9674.43,9674.02,1.939 -binance-futures,BTCUSDT,1582329819387000,1582329819508434,4.3,9674.43,9674.02,1.939 -binance-futures,BTCUSDT,1582329819411000,1582329819531144,0.39,9674.34,9674.02,1.939 -binance-futures,BTCUSDT,1582329819430000,1582329819549999,3.99,9674.34,9674.02,1.939 -binance-futures,BTCUSDT,1582329819432000,1582329819553386,0.031,9674.3,9674.02,1.939 -binance-futures,BTCUSDT,1582329819453000,1582329819573693,3.531,9674.3,9674.02,1.939 -binance-futures,BTCUSDT,1582329819456000,1582329819576340,0.39,9674.24,9674.02,1.939 -binance-futures,BTCUSDT,1582329819475000,1582329819596008,2.55,9674.24,9674.02,1.939 -binance-futures,BTCUSDT,1582329819480000,1582329819604787,0.031,9674.2,9674.02,1.939 -binance-futures,BTCUSDT,1582329819518000,1582329819636915,0.031,9674.2,9674.12,0.389 -binance-futures,BTCUSDT,1582329819522000,1582329819643608,0.031,9674.2,9674.02,1.939 -binance-futures,BTCUSDT,1582329819540000,1582329819660836,0.031,9674.18,9674.02,1.939 -binance-futures,BTCUSDT,1582329819599000,1582329819719719,0.421,9674.18,9674.02,1.939 -binance-futures,BTCUSDT,1582329819608000,1582329819728884,0.031,9674.18,9674.02,1.939 -binance-futures,BTCUSDT,1582329819620000,1582329819741925,0.421,9674.18,9674.02,1.939 -binance-futures,BTCUSDT,1582329819622000,1582329819745423,0.031,9674.14,9674.02,1.939 -binance-futures,BTCUSDT,1582329819645000,1582329819766322,2.881,9674.14,9674.02,1.939 -binance-futures,BTCUSDT,1582329819647000,1582329819770679,0.39,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329819648000,1582329819770784,2.881,9674.14,9674.02,1.939 -binance-futures,BTCUSDT,1582329819657000,1582329819778799,0.031,9674.14,9674.02,1.939 -binance-futures,BTCUSDT,1582329819669000,1582329819790111,0.39,9674.09,9674.02,1.939 -binance-futures,BTCUSDT,1582329819680000,1582329819802023,2.327,9675.07,9674.02,1.939 -binance-futures,BTCUSDT,1582329819692000,1582329819812269,0.031,9674.05,9674.02,1.939 -binance-futures,BTCUSDT,1582329819718000,1582329819836265,0.1,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329819777000,1582329819898015,0.031,9674.96,9674.02,1.939 -binance-futures,BTCUSDT,1582329819780000,1582329819903082,2.327,9675.07,9674.02,1.939 -binance-futures,BTCUSDT,1582329819790000,1582329819911045,0.39,9674.96,9674.02,1.939 -binance-futures,BTCUSDT,1582329819793000,1582329819916363,2.327,9675.07,9674.02,1.939 -binance-futures,BTCUSDT,1582329819795000,1582329819916376,2,9674.92,9674.02,1.939 -binance-futures,BTCUSDT,1582329819801000,1582329819923787,2.031,9674.92,9674.02,1.939 -binance-futures,BTCUSDT,1582329819807000,1582329819932397,0.031,9674.92,9674.02,1.939 -binance-futures,BTCUSDT,1582329819817000,1582329819942844,7.731,9674.92,9674.02,1.939 -binance-futures,BTCUSDT,1582329819819000,1582329819944493,7.7,9674.92,9674.02,1.939 -binance-futures,BTCUSDT,1582329819822000,1582329819944511,0.39,9674.83,9674.02,1.939 -binance-futures,BTCUSDT,1582329819833000,1582329819953143,2,9674.88,9674.02,1.939 -binance-futures,BTCUSDT,1582329819835000,1582329819956691,2.031,9674.88,9674.02,1.939 -binance-futures,BTCUSDT,1582329819837000,1582329819958766,2.421,9674.88,9674.02,1.939 -binance-futures,BTCUSDT,1582329819843000,1582329819963199,0.421,9674.88,9674.02,1.939 -binance-futures,BTCUSDT,1582329819845000,1582329819966650,2,9674.79,9674.02,1.939 -binance-futures,BTCUSDT,1582329819856000,1582329819977538,0.39,9674.81,9674.02,1.939 -binance-futures,BTCUSDT,1582329819866000,1582329819987198,8.05,9674.79,9674.02,1.939 -binance-futures,BTCUSDT,1582329819868000,1582329819988077,0.39,9674.75,9674.02,1.939 -binance-futures,BTCUSDT,1582329819888000,1582329820008636,10.54,9674.75,9674.02,1.939 -binance-futures,BTCUSDT,1582329819911000,1582329820033620,0.031,9674.71,9674.02,1.939 -binance-futures,BTCUSDT,1582329819917000,1582329820038870,0.39,9674.69,9674.02,1.939 -binance-futures,BTCUSDT,1582329819936000,1582329820056559,9.69,9674.69,9674.02,1.939 -binance-futures,BTCUSDT,1582329819960000,1582329820080313,0.39,9674.59,9674.02,1.939 -binance-futures,BTCUSDT,1582329819962000,1582329820082901,9.3,9674.69,9674.02,1.939 -binance-futures,BTCUSDT,1582329819975000,1582329820096900,9.3,9674.69,9674.04,0.389 -binance-futures,BTCUSDT,1582329819980000,1582329820100262,9.1,9674.59,9674.04,0.389 -binance-futures,BTCUSDT,1582329819985000,1582329820106852,0.031,9674.55,9674.04,0.389 -binance-futures,BTCUSDT,1582329819997000,1582329820117165,0.031,9674.55,9674.02,1.939 -binance-futures,BTCUSDT,1582329820004000,1582329820124966,9.481,9674.55,9674.02,1.939 -binance-futures,BTCUSDT,1582329820007000,1582329820127418,0.39,9674.54,9674.02,1.939 -binance-futures,BTCUSDT,1582329820022000,1582329820142728,0.031,9674.53,9674.02,1.939 -binance-futures,BTCUSDT,1582329820026000,1582329820148609,0.121,9674.53,9674.02,1.939 -binance-futures,BTCUSDT,1582329820029000,1582329820151067,0.861,9674.53,9674.02,1.939 -binance-futures,BTCUSDT,1582329820035000,1582329820157754,1.531,9674.53,9674.02,1.939 -binance-futures,BTCUSDT,1582329820037000,1582329820158995,0.1,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329820056000,1582329820179223,6.15,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329820102000,1582329820223133,0.49,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329820167000,1582329820286985,0.1,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329820237000,1582329820366324,2.327,9675.07,9674.02,1.939 -binance-futures,BTCUSDT,1582329820270000,1582329820391241,0.031,9675.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329820277000,1582329820397999,0.39,9674.98,9674.02,1.939 -binance-futures,BTCUSDT,1582329820293000,1582329820414605,8.781,9675.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329820298000,1582329820418760,2,9674.94,9674.08,0.389 -binance-futures,BTCUSDT,1582329820313000,1582329820433746,8.25,9674.98,9674.08,0.389 -binance-futures,BTCUSDT,1582329820317000,1582329820437540,8.3,9674.94,9674.08,0.389 -binance-futures,BTCUSDT,1582329820319000,1582329820439533,8.3,9674.94,9674.02,1.939 -binance-futures,BTCUSDT,1582329820325000,1582329820444895,0.39,9674.87,9674.02,1.939 -binance-futures,BTCUSDT,1582329820344000,1582329820464832,2,9674.83,9674.02,1.939 -binance-futures,BTCUSDT,1582329820350000,1582329820471770,2.031,9674.83,9674.02,1.939 -binance-futures,BTCUSDT,1582329820363000,1582329820487518,10.531,9674.83,9674.02,1.939 -binance-futures,BTCUSDT,1582329820371000,1582329820492551,0.39,9674.77,9674.02,1.939 -binance-futures,BTCUSDT,1582329820392000,1582329820516028,9.49,9674.77,9674.02,1.939 -binance-futures,BTCUSDT,1582329820394000,1582329820516607,2,9674.73,9674.02,1.939 -binance-futures,BTCUSDT,1582329820416000,1582329820535990,10.3,9674.73,9674.02,1.939 -binance-futures,BTCUSDT,1582329820424000,1582329820544832,0.39,9674.44,9674.02,1.939 -binance-futures,BTCUSDT,1582329820444000,1582329820564505,8.14,9674.44,9674.02,1.939 -binance-futures,BTCUSDT,1582329820446000,1582329820570928,0.1,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329820467000,1582329820588711,5.4,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329820481000,1582329820603011,0.1,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329820493000,1582329820613089,0.49,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329820507000,1582329820627515,0.1,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329821096000,1582329821216103,0.39,9674.69,9674.02,1.939 -binance-futures,BTCUSDT,1582329821119000,1582329821239960,0.031,9674.65,9674.02,1.939 -binance-futures,BTCUSDT,1582329821136000,1582329821254380,9.131,9674.65,9674.02,1.939 -binance-futures,BTCUSDT,1582329821138000,1582329821256757,2,9674.63,9674.02,1.939 -binance-futures,BTCUSDT,1582329821145000,1582329821265895,0.39,9674.6,9674.02,1.939 -binance-futures,BTCUSDT,1582329821163000,1582329821282838,10.54,9674.6,9674.02,1.939 -binance-futures,BTCUSDT,1582329821169000,1582329821292502,0.016,9674.57,9674.02,1.939 -binance-futures,BTCUSDT,1582329821169000,1582329821292516,0.031,9674.56,9674.02,1.939 -binance-futures,BTCUSDT,1582329821180000,1582329821299962,2.031,9674.56,9674.02,1.939 -binance-futures,BTCUSDT,1582329821185000,1582329821305154,0.39,9674.42,9674.02,1.939 -binance-futures,BTCUSDT,1582329821203000,1582329821325019,9.49,9674.42,9674.02,1.939 -binance-futures,BTCUSDT,1582329821222000,1582329821343943,2,9674.4,9674.02,1.939 -binance-futures,BTCUSDT,1582329821223000,1582329821346278,2,9674.36,9674.02,1.939 -binance-futures,BTCUSDT,1582329821229000,1582329821348638,0.1,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329821246000,1582329821365775,7.45,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329821272000,1582329821393870,7.84,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329821297000,1582329821417459,0.49,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329821359000,1582329821480341,0.1,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329821376000,1582329821496443,0.1,9674.03,9674.02,2.328 -binance-futures,BTCUSDT,1582329821425000,1582329821547335,0.1,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329821426000,1582329821547573,0.39,9674.5,9674.02,1.939 -binance-futures,BTCUSDT,1582329821432000,1582329821554755,1.978,9674.71,9674.02,1.939 -binance-futures,BTCUSDT,1582329821441000,1582329821560656,1.978,9674.71,9674.09,0.389 -binance-futures,BTCUSDT,1582329821446000,1582329821566316,7,9674.5,9674.09,0.389 -binance-futures,BTCUSDT,1582329821459000,1582329821579715,7,9674.5,9674.02,1.939 -binance-futures,BTCUSDT,1582329821494000,1582329821617784,7,9674.5,9674.07,0.389 -binance-futures,BTCUSDT,1582329821505000,1582329821624650,7,9674.5,9674.02,1.939 -binance-futures,BTCUSDT,1582329821507000,1582329821627323,0.39,9674.48,9674.02,1.939 -binance-futures,BTCUSDT,1582329821520000,1582329821641317,0.421,9674.48,9674.02,1.939 -binance-futures,BTCUSDT,1582329821521000,1582329821641329,0.031,9674.46,9674.02,1.939 -binance-futures,BTCUSDT,1582329821551000,1582329821671351,0.39,9674.42,9674.02,1.939 -binance-futures,BTCUSDT,1582329821568000,1582329821689874,7.89,9674.42,9674.02,1.939 -binance-futures,BTCUSDT,1582329821570000,1582329821691350,7.921,9674.42,9674.02,1.939 -binance-futures,BTCUSDT,1582329821592000,1582329821710695,0.39,9674.25,9674.02,1.939 -binance-futures,BTCUSDT,1582329821608000,1582329821729219,6.39,9674.25,9674.02,1.939 -binance-futures,BTCUSDT,1582329821613000,1582329821733578,0.031,9674.21,9674.02,1.939 -binance-futures,BTCUSDT,1582329821632000,1582329821753053,6.581,9674.21,9674.02,1.939 -binance-futures,BTCUSDT,1582329821633000,1582329821754434,0.39,9674.09,9674.02,1.939 -binance-futures,BTCUSDT,1582329821637000,1582329821757032,0.1,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329821646000,1582329821771220,0.029,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329821653000,1582329821773579,5.279,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329821664000,1582329821783219,0.029,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329821683000,1582329821804548,0.419,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329821690000,1582329821812701,0.029,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329821711000,1582329821828952,0.419,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329821716000,1582329821836840,0.029,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329821751000,1582329821873044,0.39,9674.59,9674.02,1.939 -binance-futures,BTCUSDT,1582329821773000,1582329821894940,1.978,9674.71,9674.02,1.939 -binance-futures,BTCUSDT,1582329821796000,1582329821921289,0.031,9674.67,9674.03,0.389 -binance-futures,BTCUSDT,1582329821800000,1582329821921315,0.031,9674.67,9674.02,1.939 -binance-futures,BTCUSDT,1582329821802000,1582329821921871,0.031,9674.67,9674.03,0.389 -binance-futures,BTCUSDT,1582329821823000,1582329821945669,5.8,9674.67,9674.03,0.389 -binance-futures,BTCUSDT,1582329821842000,1582329821964147,5.8,9674.67,9674.02,1.939 -binance-futures,BTCUSDT,1582329821846000,1582329821966895,0.39,9674.59,9674.02,1.939 -binance-futures,BTCUSDT,1582329821866000,1582329821987455,8.24,9674.59,9674.02,1.939 -binance-futures,BTCUSDT,1582329821891000,1582329822013496,0.031,9674.55,9674.02,1.939 -binance-futures,BTCUSDT,1582329821896000,1582329822019396,2.031,9674.55,9674.02,1.939 -binance-futures,BTCUSDT,1582329821900000,1582329822021682,0.39,9674.42,9674.02,1.939 -binance-futures,BTCUSDT,1582329821921000,1582329822044664,8.49,9674.42,9674.02,1.939 -binance-futures,BTCUSDT,1582329821935000,1582329822058858,0.74,9674.41,9674.02,1.939 -binance-futures,BTCUSDT,1582329821937000,1582329822061377,1.49,9674.41,9674.02,1.939 -binance-futures,BTCUSDT,1582329821947000,1582329822067691,0.031,9674.39,9674.02,1.939 -binance-futures,BTCUSDT,1582329821949000,1582329822069676,0.031,9674.38,9674.02,1.939 -binance-futures,BTCUSDT,1582329821953000,1582329822072398,0.39,9674.21,9674.02,1.939 -binance-futures,BTCUSDT,1582329821969000,1582329822090930,6.09,9674.21,9674.02,1.939 -binance-futures,BTCUSDT,1582329821978000,1582329822098874,5.7,9674.21,9674.02,1.939 -binance-futures,BTCUSDT,1582329821993000,1582329822112924,0.031,9674.18,9674.02,1.939 -binance-futures,BTCUSDT,1582329821998000,1582329822121187,0.031,9674.17,9674.02,1.939 -binance-futures,BTCUSDT,1582329822000000,1582329822123559,0.39,9674.08,9674.02,1.939 -binance-futures,BTCUSDT,1582329822012000,1582329822137122,0.031,9674.17,9674.02,1.939 -binance-futures,BTCUSDT,1582329822021000,1582329822140997,5.45,9674.08,9674.02,1.939 -binance-futures,BTCUSDT,1582329822056000,1582329822178106,0.39,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329822075000,1582329822195939,5.04,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329822097000,1582329822219142,5.069,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329822110000,1582329822232306,0.419,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329822157000,1582329822274834,0.39,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329822178000,1582329822300045,3.545,9674.51,9674.02,1.939 -binance-futures,BTCUSDT,1582329822182000,1582329822303340,0.39,9674.42,9674.02,1.939 -binance-futures,BTCUSDT,1582329822202000,1582329822325200,6.04,9674.42,9674.02,1.939 -binance-futures,BTCUSDT,1582329822231000,1582329822363913,4,9674.36,9674.02,1.939 -binance-futures,BTCUSDT,1582329822233000,1582329822364020,0.39,9674.29,9674.02,1.939 -binance-futures,BTCUSDT,1582329822259000,1582329822380412,9.74,9674.29,9674.02,1.939 -binance-futures,BTCUSDT,1582329822268000,1582329822391379,2,9674.23,9674.02,1.939 -binance-futures,BTCUSDT,1582329822271000,1582329822394125,4,9674.23,9674.02,1.939 -binance-futures,BTCUSDT,1582329822274000,1582329822396729,6,9674.23,9674.02,1.939 -binance-futures,BTCUSDT,1582329822281000,1582329822403603,8,9674.23,9674.02,1.939 -binance-futures,BTCUSDT,1582329822289000,1582329822430950,0.39,9674.08,9674.02,1.939 -binance-futures,BTCUSDT,1582329822319000,1582329822441119,8.94,9674.08,9674.02,1.939 -binance-futures,BTCUSDT,1582329822321000,1582329822441395,2,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329822321000,1582329822444959,4,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329822328000,1582329822449579,4.029,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329822338000,1582329822463258,2.029,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329822341000,1582329822465542,8.579,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329822347000,1582329822470206,8.969,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329822375000,1582329822498218,2.419,9674.03,9674.02,1.939 -binance-futures,BTCUSDT,1582329822384000,1582329822506732,2.419,9674.03,9673.15,0.68 -binance-futures,BTCUSDT,1582329822400000,1582329822525246,0.031,9673.99,9673.15,0.68 -binance-futures,BTCUSDT,1582329822412000,1582329822534365,0.39,9673.98,9673.15,0.68 -binance-futures,BTCUSDT,1582329822435000,1582329822556156,4.44,9673.98,9673.15,0.68 -binance-futures,BTCUSDT,1582329822459000,1582329822581020,4.05,9673.98,9673.15,0.68 -binance-futures,BTCUSDT,1582329822465000,1582329822589216,0.39,9673.85,9673.15,0.68 -binance-futures,BTCUSDT,1582329822485000,1582329822610651,4.74,9673.85,9673.15,0.68 -binance-futures,BTCUSDT,1582329822518000,1582329822639770,0.39,9673.76,9673.15,0.68 -binance-futures,BTCUSDT,1582329822537000,1582329822660488,4.19,9673.76,9673.15,0.68 -binance-futures,BTCUSDT,1582329822563000,1582329822682981,3.8,9673.76,9673.15,0.68 -binance-futures,BTCUSDT,1582329822570000,1582329822691892,0.39,9673.68,9673.15,0.68 -binance-futures,BTCUSDT,1582329822589000,1582329822709719,3.99,9673.68,9673.15,0.68 -binance-futures,BTCUSDT,1582329822595000,1582329822719062,0.031,9673.64,9673.15,0.68 -binance-futures,BTCUSDT,1582329822615000,1582329822738815,0.39,9673.58,9673.15,0.68 -binance-futures,BTCUSDT,1582329822617000,1582329822741929,2.39,9673.58,9673.15,0.68 -binance-futures,BTCUSDT,1582329822634000,1582329822755453,3.09,9673.58,9673.15,0.68 -binance-futures,BTCUSDT,1582329822640000,1582329822761519,2,9673.52,9673.15,0.68 -binance-futures,BTCUSDT,1582329822650000,1582329822773871,0.39,9673.48,9673.15,0.68 -binance-futures,BTCUSDT,1582329822671000,1582329822794285,3.59,9673.48,9673.15,0.68 -binance-futures,BTCUSDT,1582329822676000,1582329822799947,0.031,9673.44,9673.15,0.68 -binance-futures,BTCUSDT,1582329822695000,1582329822816254,3.531,9673.44,9673.15,0.68 -binance-futures,BTCUSDT,1582329822697000,1582329822818791,0.39,9673.31,9673.15,0.68 -binance-futures,BTCUSDT,1582329822710000,1582329822829675,3.531,9673.44,9673.15,0.68 -binance-futures,BTCUSDT,1582329822718000,1582329822837553,4.75,9673.31,9673.15,0.68 -binance-futures,BTCUSDT,1582329822722000,1582329822841903,0.016,9673.28,9673.15,0.68 -binance-futures,BTCUSDT,1582329822722000,1582329822842385,0.031,9673.27,9673.15,0.68 -binance-futures,BTCUSDT,1582329822739000,1582329822857723,5.731,9673.27,9673.15,0.68 -binance-futures,BTCUSDT,1582329822741000,1582329822859734,0.39,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329822757000,1582329822877159,7.79,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329822831000,1582329822963404,0.39,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329822859000,1582329822985301,0.38,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329822866000,1582329822987882,1.22,9673.98,9673.15,0.68 -binance-futures,BTCUSDT,1582329822869000,1582329822989168,0.39,9673.93,9673.15,0.68 -binance-futures,BTCUSDT,1582329822890000,1582329823011934,8.79,9673.93,9673.15,0.68 -binance-futures,BTCUSDT,1582329822898000,1582329823020158,0.74,9673.92,9673.15,0.68 -binance-futures,BTCUSDT,1582329822904000,1582329823029385,2.07,9673.92,9673.15,0.68 -binance-futures,BTCUSDT,1582329822910000,1582329823032042,2.16,9673.92,9673.15,0.68 -binance-futures,BTCUSDT,1582329822914000,1582329823035689,0.031,9673.9,9673.15,0.68 -binance-futures,BTCUSDT,1582329822916000,1582329823039177,0.031,9673.89,9673.15,0.68 -binance-futures,BTCUSDT,1582329822918000,1582329823040710,0.386,9673.68,9673.15,0.68 -binance-futures,BTCUSDT,1582329822939000,1582329823063153,8.936,9673.68,9673.15,0.68 -binance-futures,BTCUSDT,1582329822965000,1582329823086383,0.031,9673.64,9673.15,0.68 -binance-futures,BTCUSDT,1582329822987000,1582329823108705,10.05,9673.64,9673.15,0.68 -binance-futures,BTCUSDT,1582329823009000,1582329823131624,0.031,9673.6,9673.15,0.68 -binance-futures,BTCUSDT,1582329823011000,1582329823131653,0.386,9673.51,9673.15,0.68 -binance-futures,BTCUSDT,1582329823032000,1582329823152645,8.936,9673.51,9673.15,0.68 -binance-futures,BTCUSDT,1582329823056000,1582329823177829,0.031,9673.47,9673.15,0.68 -binance-futures,BTCUSDT,1582329823056000,1582329823179090,0.386,9673.28,9673.15,0.68 -binance-futures,BTCUSDT,1582329823078000,1582329823201598,2,9673.24,9673.15,0.68 -binance-futures,BTCUSDT,1582329823098000,1582329823220791,9.8,9673.24,9673.15,0.68 -binance-futures,BTCUSDT,1582329823101000,1582329823225701,0.031,9673.2,9673.15,0.68 -binance-futures,BTCUSDT,1582329823109000,1582329823231251,0.386,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823131000,1582329823253552,7.736,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823200000,1582329823323261,7.765,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823230000,1582329823352695,7.855,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823262000,1582329823381533,0.505,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823286000,1582329823437786,0.415,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823397000,1582329823520263,0.386,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823422000,1582329823543641,0.031,9673.2,9673.15,0.68 -binance-futures,BTCUSDT,1582329823442000,1582329823568383,15,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823465000,1582329823585665,11,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823471000,1582329823594170,11.386,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823471000,1582329823594454,12.056,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823477000,1582329823600479,12.796,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823479000,1582329823601149,13.456,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823485000,1582329823604076,13.546,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823498000,1582329823619320,13.575,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823525000,1582329823645657,12.915,9673.16,9673.15,0.68 -binance-futures,BTCUSDT,1582329823527000,1582329823652270,12.915,9673.16,9672.23,4.309 -binance-futures,BTCUSDT,1582329823547000,1582329823669939,2,9673.12,9672.23,4.309 -binance-futures,BTCUSDT,1582329823549000,1582329823669949,4,9673.12,9672.23,4.309 -binance-futures,BTCUSDT,1582329823551000,1582329823674428,4.031,9673.12,9672.23,4.309 -binance-futures,BTCUSDT,1582329823562000,1582329823682726,0.386,9673.04,9672.23,4.309 -binance-futures,BTCUSDT,1582329823583000,1582329823706960,4,9673,9672.23,4.309 -binance-futures,BTCUSDT,1582329823603000,1582329823728019,2,9672.96,9672.23,4.309 -binance-futures,BTCUSDT,1582329823608000,1582329823728501,4,9672.96,9672.23,4.309 -binance-futures,BTCUSDT,1582329823610000,1582329823730929,0.029,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329823630000,1582329823753359,11.679,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329823669000,1582329823799181,12.065,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329823677000,1582329823799522,12.805,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329823693000,1582329823817465,12.895,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329823705000,1582329823827381,1.245,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329823736000,1582329823855703,1.915,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329823737000,1582329823857905,1.175,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329823770000,1582329823892052,1.085,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329823772000,1582329823895708,3.535,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329823814000,1582329823934751,2.865,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329823903000,1582329824024222,0.415,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329823948000,1582329824072243,1.085,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329823955000,1582329824080399,1.825,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329823964000,1582329824091412,1.915,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329824231000,1582329824357179,1.825,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329824233000,1582329824358026,0.415,9672.24,9672.23,4.309 -binance-futures,BTCUSDT,1582329824702000,1582329824825625,0.415,9672.24,9671.98,4.428 -binance-futures,BTCUSDT,1582329824710000,1582329824829645,0.031,9672.21,9671.98,4.428 -binance-futures,BTCUSDT,1582329824710000,1582329824832897,0.031,9672.2,9671.98,4.428 -binance-futures,BTCUSDT,1582329824724000,1582329824844586,2,9672.18,9671.98,4.428 -binance-futures,BTCUSDT,1582329824726000,1582329824849480,8,9672.18,9671.98,4.428 -binance-futures,BTCUSDT,1582329824728000,1582329824850652,0.386,9671.99,9671.98,4.428 -binance-futures,BTCUSDT,1582329824749000,1582329824874803,11.836,9671.99,9671.98,4.428 -binance-futures,BTCUSDT,1582329824778000,1582329824901421,12.576,9671.99,9671.98,4.428 -binance-futures,BTCUSDT,1582329824782000,1582329824907416,12.576,9671.99,9671.98,3.748 -binance-futures,BTCUSDT,1582329824786000,1582329824909067,12.576,9671.99,9671.98,3.088 -binance-futures,BTCUSDT,1582329824799000,1582329824923198,12.19,9671.99,9671.98,3.088 -binance-futures,BTCUSDT,1582329824806000,1582329824930158,14.34,9671.99,9671.98,3.088 -binance-futures,BTCUSDT,1582329824832000,1582329824953521,12.19,9671.99,9671.98,3.088 -binance-futures,BTCUSDT,1582329824840000,1582329824962886,12.28,9671.99,9671.98,3.088 -binance-futures,BTCUSDT,1582329824842000,1582329824963923,12.666,9671.99,9671.98,3.088 -binance-futures,BTCUSDT,1582329824856000,1582329824976137,13.336,9671.99,9671.98,3.088 -binance-futures,BTCUSDT,1582329824862000,1582329824985233,12.95,9671.99,9671.98,3.088 -binance-futures,BTCUSDT,1582329824898000,1582329825017727,13.336,9671.99,9671.98,3.088 -binance-futures,BTCUSDT,1582329824995000,1582329825113663,12.95,9671.99,9671.98,3.088 -binance-futures,BTCUSDT,1582329825012000,1582329825134211,12.95,9671.99,9671.98,3.087 -binance-futures,BTCUSDT,1582329825021000,1582329825143119,13.336,9671.99,9671.98,3.087 -binance-futures,BTCUSDT,1582329825112000,1582329825253904,12.95,9671.99,9671.98,3.087 -binance-futures,BTCUSDT,1582329825130000,1582329825270188,13.336,9671.99,9671.98,3.087 -binance-futures,BTCUSDT,1582329825239000,1582329825360488,1.886,9671.99,9671.98,3.087 -binance-futures,BTCUSDT,1582329825515000,1582329825633837,1.5,9671.99,9671.98,3.087 -binance-futures,BTCUSDT,1582329825538000,1582329825658239,1.886,9671.99,9671.98,3.087 -binance-futures,BTCUSDT,1582329826014000,1582329826134771,2.957,9671.99,9671.98,3.087 -binance-futures,BTCUSDT,1582329826016000,1582329826136382,13.667,9671.99,9671.98,3.087 -binance-futures,BTCUSDT,1582329826023000,1582329826145079,12.596,9671.99,9671.98,3.087 -binance-futures,BTCUSDT,1582329826029000,1582329826150599,1.886,9671.99,9671.98,3.087 -binance-futures,BTCUSDT,1582329826059000,1582329826181102,1.5,9671.99,9671.98,3.087 -binance-futures,BTCUSDT,1582329826078000,1582329826198761,1.886,9671.99,9671.98,3.087 -binance-futures,BTCUSDT,1582329826115000,1582329826242028,1.5,9671.99,9671.98,3.087 -binance-futures,BTCUSDT,1582329826123000,1582329826244144,1.886,9671.99,9671.98,3.087 -binance-futures,BTCUSDT,1582329826226000,1582329826350295,1.886,9671.99,9671.17,2.238 -binance-futures,BTCUSDT,1582329826262000,1582329826383232,1.216,9671.99,9671.17,2.238 -binance-futures,BTCUSDT,1582329826266000,1582329826387177,1.126,9671.99,9671.17,2.238 -binance-futures,BTCUSDT,1582329826266000,1582329826387739,0.386,9671.99,9671.17,2.238 -binance-futures,BTCUSDT,1582329826287000,1582329826413372,0.031,9671.95,9671.17,2.238 -binance-futures,BTCUSDT,1582329826311000,1582329826432723,6.681,9671.95,9671.17,2.238 -binance-futures,BTCUSDT,1582329826315000,1582329826435101,0.67,9671.94,9671.17,2.238 -binance-futures,BTCUSDT,1582329826318000,1582329826441208,0.76,9671.94,9671.17,2.238 -binance-futures,BTCUSDT,1582329826330000,1582329826451355,1.5,9671.94,9671.17,2.238 -binance-futures,BTCUSDT,1582329826332000,1582329826453446,9.9,9671.94,9671.17,2.238 -binance-futures,BTCUSDT,1582329826334000,1582329826457044,0.386,9671.91,9671.17,2.238 -binance-futures,BTCUSDT,1582329826336000,1582329826461360,0.417,9671.91,9671.17,2.238 -binance-futures,BTCUSDT,1582329826355000,1582329826477606,8.867,9671.91,9671.17,2.238 -binance-futures,BTCUSDT,1582329826363000,1582329826487587,0.386,9671.86,9671.17,2.238 -binance-futures,BTCUSDT,1582329826387000,1582329826511744,8.886,9671.86,9671.17,2.238 -binance-futures,BTCUSDT,1582329826412000,1582329826532092,0.386,9671.8,9671.17,2.238 -binance-futures,BTCUSDT,1582329826429000,1582329826551614,8.536,9671.8,9671.17,2.238 -binance-futures,BTCUSDT,1582329826446000,1582329826569522,0.67,9671.78,9671.17,2.238 -binance-futures,BTCUSDT,1582329826454000,1582329826576216,0.417,9671.76,9671.17,2.238 -binance-futures,BTCUSDT,1582329826473000,1582329826595805,7.617,9671.76,9671.17,2.238 -binance-futures,BTCUSDT,1582329826498000,1582329826620137,0.386,9671.6,9671.17,2.238 -binance-futures,BTCUSDT,1582329826516000,1582329826636492,5.986,9671.6,9671.17,2.238 -binance-futures,BTCUSDT,1582329826522000,1582329826645021,0.031,9671.56,9671.17,2.238 -binance-futures,BTCUSDT,1582329826544000,1582329826665651,5.881,9671.56,9671.17,2.238 -binance-futures,BTCUSDT,1582329826567000,1582329826705233,0.016,9671.54,9671.17,2.238 -binance-futures,BTCUSDT,1582329826569000,1582329826709576,0.031,9671.52,9671.17,2.238 -binance-futures,BTCUSDT,1582329826608000,1582329826729760,5.331,9671.52,9671.17,2.238 -binance-futures,BTCUSDT,1582329826648000,1582329826768879,0.031,9671.52,9671.17,2.238 -binance-futures,BTCUSDT,1582329826795000,1582329826918631,0.031,9671.52,9671.18,0.393 -binance-futures,BTCUSDT,1582329826820000,1582329826942679,0.626,9672.23,9671.18,0.393 -binance-futures,BTCUSDT,1582329826889000,1582329827010788,0.626,9672.23,9671.17,2.649 -binance-futures,BTCUSDT,1582329826909000,1582329827029443,0.626,9672.23,9671.18,0.393 -binance-futures,BTCUSDT,1582329826920000,1582329827041301,1.41,9672.21,9671.18,0.393 -binance-futures,BTCUSDT,1582329826927000,1582329827049510,1.5,9672.21,9671.18,0.393 -binance-futures,BTCUSDT,1582329826934000,1582329827056819,0.76,9672.21,9671.18,0.393 -binance-futures,BTCUSDT,1582329826940000,1582329827060125,4.41,9672.21,9671.18,0.393 -binance-futures,BTCUSDT,1582329826946000,1582329827066720,3.74,9672.21,9671.18,0.393 -binance-futures,BTCUSDT,1582329826954000,1582329827075175,3.65,9672.21,9671.18,0.393 -binance-futures,BTCUSDT,1582329826962000,1582329827083897,0.031,9672.17,9671.18,0.393 -binance-futures,BTCUSDT,1582329826981000,1582329827102824,4.681,9672.17,9671.18,0.393 -binance-futures,BTCUSDT,1582329826985000,1582329827108860,4.65,9672.17,9671.18,0.393 -binance-futures,BTCUSDT,1582329827013000,1582329827133347,0.031,9672.13,9671.18,0.393 -binance-futures,BTCUSDT,1582329827015000,1582329827137027,0.031,9672.13,9671.17,2.649 -binance-futures,BTCUSDT,1582329827019000,1582329827139661,0.031,9672.13,9671.19,0.012 -binance-futures,BTCUSDT,1582329827032000,1582329827153959,3.431,9672.13,9671.19,0.012 -binance-futures,BTCUSDT,1582329827044000,1582329827164203,3.4,9672.13,9671.19,0.012 -binance-futures,BTCUSDT,1582329827056000,1582329827176151,0.016,9672.1,9671.19,0.012 -binance-futures,BTCUSDT,1582329827061000,1582329827181582,0.031,9672.09,9671.19,0.012 diff --git a/tests/test_data/tardis/trades.csv b/tests/test_data/tardis/trades.csv deleted file mode 100644 index ab318c991357..000000000000 --- a/tests/test_data/tardis/trades.csv +++ /dev/null @@ -1,10000 +0,0 @@ -exchange,symbol,timestamp,local_timestamp,id,side,price,amount -binance-futures,BTCUSDT,1582329602111000,1582329602418379,42377944,buy,9682,0.132 -binance-futures,BTCUSDT,1582329602116000,1582329602418420,42377945,buy,9682,0.412 -binance-futures,BTCUSDT,1582329602150000,1582329602421528,42377946,buy,9682,0.296 -binance-futures,BTCUSDT,1582329602150000,1582329602421536,42377947,buy,9682.19,0.01 -binance-futures,BTCUSDT,1582329602150000,1582329602421551,42377948,buy,9682.48,0.18 -binance-futures,BTCUSDT,1582329603499000,1582329603621043,42377949,buy,9682.48,0.001 -binance-futures,BTCUSDT,1582329603593000,1582329603713147,42377950,buy,9682.48,0.126 -binance-futures,BTCUSDT,1582329603664000,1582329603789953,42377951,buy,9682.48,0.407 -binance-futures,BTCUSDT,1582329604065000,1582329604185418,42377952,sell,9681.62,0.001 -binance-futures,BTCUSDT,1582329604329000,1582329604450832,42377953,buy,9682.87,0.002 -binance-futures,BTCUSDT,1582329604329000,1582329604457287,42377954,buy,9683,0.001 -binance-futures,BTCUSDT,1582329604329000,1582329604457294,42377955,buy,9683.1,0.005 -binance-futures,BTCUSDT,1582329604329000,1582329604458355,42377956,buy,9683.1,0.118 -binance-futures,BTCUSDT,1582329605032000,1582329605151968,42377957,sell,9681.9,0.001 -binance-futures,BTCUSDT,1582329605223000,1582329605345548,42377958,sell,9681.54,0.011 -binance-futures,BTCUSDT,1582329605223000,1582329605346061,42377959,sell,9681.54,0.003 -binance-futures,BTCUSDT,1582329605223000,1582329605346069,42377960,sell,9681.53,0.179 -binance-futures,BTCUSDT,1582329605250000,1582329605372742,42377961,buy,9682.36,0.416 -binance-futures,BTCUSDT,1582329605250000,1582329605372749,42377962,buy,9682.36,0.619 -binance-futures,BTCUSDT,1582329605752000,1582329605875115,42377963,sell,9681.96,0.007 -binance-futures,BTCUSDT,1582329606263000,1582329606384949,42377964,sell,9681.84,0.003 -binance-futures,BTCUSDT,1582329606263000,1582329606384955,42377965,sell,9681.84,0.002 -binance-futures,BTCUSDT,1582329606263000,1582329606384959,42377966,sell,9681.83,0.435 -binance-futures,BTCUSDT,1582329606874000,1582329606993692,42377967,buy,9681.85,0.03 -binance-futures,BTCUSDT,1582329607056000,1582329607176436,42377968,buy,9681.75,0.031 -binance-futures,BTCUSDT,1582329608884000,1582329609003473,42377969,buy,9681.51,1.03 -binance-futures,BTCUSDT,1582329609311000,1582329609430960,42377970,buy,9681.28,0.031 -binance-futures,BTCUSDT,1582329609311000,1582329609436491,42377971,buy,9681.29,0.031 -binance-futures,BTCUSDT,1582329609311000,1582329609438373,42377972,buy,9681.32,0.031 -binance-futures,BTCUSDT,1582329609330000,1582329609452816,42377973,buy,9681.33,0.031 -binance-futures,BTCUSDT,1582329609396000,1582329609521259,42377974,buy,9682.6,0.827 -binance-futures,BTCUSDT,1582329609420000,1582329609540717,42377975,buy,9682.6,3.877 -binance-futures,BTCUSDT,1582329609439000,1582329609557839,42377976,buy,9682.59,0.005 -binance-futures,BTCUSDT,1582329609439000,1582329609563472,42377977,buy,9682.6,0.827 -binance-futures,BTCUSDT,1582329609572000,1582329609694391,42377978,buy,9682.8,0.016 -binance-futures,BTCUSDT,1582329609573000,1582329609694399,42377979,buy,9682.8,0.002 -binance-futures,BTCUSDT,1582329609573000,1582329609694862,42377980,buy,9682.8,0.003 -binance-futures,BTCUSDT,1582329609573000,1582329609695148,42377981,buy,9682.86,0.748 -binance-futures,BTCUSDT,1582329609573000,1582329609699332,42377982,buy,9682.86,0.486 -binance-futures,BTCUSDT,1582329609785000,1582329609903689,42377983,buy,9682.86,0.262 -binance-futures,BTCUSDT,1582329609861000,1582329609982982,42377984,buy,9683.09,0.001 -binance-futures,BTCUSDT,1582329609861000,1582329609982990,42377985,buy,9683.09,0.001 -binance-futures,BTCUSDT,1582329609861000,1582329609984330,42377986,buy,9683.1,1.998 -binance-futures,BTCUSDT,1582329610022000,1582329610142250,42377987,sell,9683.09,0.96 -binance-futures,BTCUSDT,1582329610464000,1582329610585240,42377988,sell,9683.09,0.011 -binance-futures,BTCUSDT,1582329610492000,1582329610611011,42377989,sell,9683.09,0.013 -binance-futures,BTCUSDT,1582329613018000,1582329613136314,42377990,buy,9683.1,0.229 -binance-futures,BTCUSDT,1582329615515000,1582329615635754,42377991,buy,9683.1,0.2 -binance-futures,BTCUSDT,1582329615655000,1582329615775905,42377992,buy,9683.1,0.027 -binance-futures,BTCUSDT,1582329615673000,1582329615793663,42377993,buy,9683.1,1.003 -binance-futures,BTCUSDT,1582329616920000,1582329617041554,42377994,buy,9683.1,0.1 -binance-futures,BTCUSDT,1582329617430000,1582329617551302,42377995,buy,9683.1,1.325 -binance-futures,BTCUSDT,1582329617431000,1582329617553404,42377996,buy,9683.1,0.253 -binance-futures,BTCUSDT,1582329617431000,1582329617553454,42377997,buy,9684,0.001 -binance-futures,BTCUSDT,1582329618677000,1582329618795386,42377998,sell,9684.68,0.001 -binance-futures,BTCUSDT,1582329619297000,1582329619415675,42377999,buy,9684.69,0.05 -binance-futures,BTCUSDT,1582329620426000,1582329620714966,42378000,buy,9684.62,0.681 -binance-futures,BTCUSDT,1582329621059000,1582329621181057,42378001,sell,9684.67,0.031 -binance-futures,BTCUSDT,1582329621059000,1582329621181064,42378002,sell,9684.66,0.031 -binance-futures,BTCUSDT,1582329621059000,1582329621186818,42378003,sell,9684.65,0.031 -binance-futures,BTCUSDT,1582329621059000,1582329621186828,42378004,sell,9684.64,0.031 -binance-futures,BTCUSDT,1582329621059000,1582329621189944,42378005,sell,9684.56,2.949 -binance-futures,BTCUSDT,1582329621059000,1582329621191293,42378006,sell,9684.35,0.1 -binance-futures,BTCUSDT,1582329622543000,1582329622663767,42378007,buy,9683.85,0.3 -binance-futures,BTCUSDT,1582329626998000,1582329627118552,42378008,buy,9683.72,0.002 -binance-futures,BTCUSDT,1582329627208000,1582329627338327,42378009,sell,9683.71,1 -binance-futures,BTCUSDT,1582329630929000,1582329631050053,42378010,sell,9683.14,0.47 -binance-futures,BTCUSDT,1582329630929000,1582329631052703,42378011,sell,9683.13,0.018 -binance-futures,BTCUSDT,1582329630929000,1582329631057132,42378012,sell,9683.13,0.004 -binance-futures,BTCUSDT,1582329630929000,1582329631057142,42378013,sell,9683.09,3.78 -binance-futures,BTCUSDT,1582329630929000,1582329631060650,42378014,sell,9683.09,0.683 -binance-futures,BTCUSDT,1582329631583000,1582329631704323,42378015,buy,9682.68,0.031 -binance-futures,BTCUSDT,1582329631583000,1582329631706395,42378016,buy,9682.68,0.072 -binance-futures,BTCUSDT,1582329631583000,1582329631707201,42378017,buy,9682.69,0.031 -binance-futures,BTCUSDT,1582329631583000,1582329631714788,42378018,buy,9682.7,0.031 -binance-futures,BTCUSDT,1582329631583000,1582329631714795,42378019,buy,9682.71,0.031 -binance-futures,BTCUSDT,1582329631583000,1582329631714804,42378020,buy,9683,0.045 -binance-futures,BTCUSDT,1582329631583000,1582329631718679,42378021,buy,9683.99,0.018 -binance-futures,BTCUSDT,1582329631583000,1582329631720353,42378022,buy,9684,1.441 -binance-futures,BTCUSDT,1582329632421000,1582329632544608,42378023,sell,9683.12,0.409 -binance-futures,BTCUSDT,1582329634151000,1582329634273273,42378024,sell,9683.02,0.02 -binance-futures,BTCUSDT,1582329634151000,1582329634273280,42378025,sell,9683.01,0.24 -binance-futures,BTCUSDT,1582329634331000,1582329634451559,42378026,buy,9682.96,0.026 -binance-futures,BTCUSDT,1582329640390000,1582329640515674,42378027,buy,9682.94,0.02 -binance-futures,BTCUSDT,1582329641610000,1582329641732938,42378028,buy,9682.41,0.01 -binance-futures,BTCUSDT,1582329642463000,1582329642583758,42378029,buy,9682.41,0.169 -binance-futures,BTCUSDT,1582329646405000,1582329646527844,42378030,buy,9682.5,1 -binance-futures,BTCUSDT,1582329650770000,1582329650890220,42378031,sell,9682.3,0.4 -binance-futures,BTCUSDT,1582329654201000,1582329654330097,42378032,buy,9682.31,2 -binance-futures,BTCUSDT,1582329654201000,1582329654330583,42378033,buy,9682.31,1.8 -binance-futures,BTCUSDT,1582329662031000,1582329662148190,42378034,sell,9681.93,2 -binance-futures,BTCUSDT,1582329662802000,1582329662921961,42378035,buy,9681.81,0.155 -binance-futures,BTCUSDT,1582329664156000,1582329664277712,42378036,buy,9681.79,0.039 -binance-futures,BTCUSDT,1582329667014000,1582329667135468,42378037,sell,9681.93,0.1 -binance-futures,BTCUSDT,1582329667059000,1582329667178801,42378038,buy,9681.94,0.001 -binance-futures,BTCUSDT,1582329667059000,1582329667183166,42378039,buy,9682.35,0.01 -binance-futures,BTCUSDT,1582329667380000,1582329667501288,42378040,sell,9682.42,0.176 -binance-futures,BTCUSDT,1582329667517000,1582329667636864,42378041,buy,9682.43,0.04 -binance-futures,BTCUSDT,1582329667520000,1582329667639661,42378042,buy,9682.43,0.3 -binance-futures,BTCUSDT,1582329667716000,1582329667841640,42378043,buy,9682.99,0.003 -binance-futures,BTCUSDT,1582329667718000,1582329667844632,42378044,buy,9683,0.1 -binance-futures,BTCUSDT,1582329667718000,1582329667848497,42378045,buy,9683,0.215 -binance-futures,BTCUSDT,1582329667718000,1582329667850367,42378046,buy,9683.42,0.335 -binance-futures,BTCUSDT,1582329668617000,1582329668739898,42378047,buy,9683.5,0.005 -binance-futures,BTCUSDT,1582329668617000,1582329668739916,42378048,buy,9683.5,0.395 -binance-futures,BTCUSDT,1582329676966000,1582329677087841,42378049,buy,9683.19,0.05 -binance-futures,BTCUSDT,1582329678050000,1582329678174427,42378050,buy,9683.05,0.062 -binance-futures,BTCUSDT,1582329680557000,1582329680676375,42378051,sell,9682.49,0.021 -binance-futures,BTCUSDT,1582329681623000,1582329681742540,42378052,buy,9682.57,0.009 -binance-futures,BTCUSDT,1582329682375000,1582329682495002,42378053,buy,9682.57,0.002 -binance-futures,BTCUSDT,1582329685022000,1582329685147709,42378054,buy,9682.57,1 -binance-futures,BTCUSDT,1582329685768000,1582329685893044,42378055,sell,9682.34,0.031 -binance-futures,BTCUSDT,1582329685768000,1582329685893651,42378056,sell,9682.33,0.031 -binance-futures,BTCUSDT,1582329685768000,1582329685899653,42378057,sell,9682.32,0.031 -binance-futures,BTCUSDT,1582329685768000,1582329685901800,42378058,sell,9682.3,0.005 -binance-futures,BTCUSDT,1582329685769000,1582329685903761,42378059,sell,9682.25,0.683 -binance-futures,BTCUSDT,1582329685801000,1582329685925729,42378060,sell,9682.08,0.1 -binance-futures,BTCUSDT,1582329685826000,1582329685953483,42378061,sell,9681.8,0.005 -binance-futures,BTCUSDT,1582329685826000,1582329685953491,42378062,sell,9681.8,4.826 -binance-futures,BTCUSDT,1582329685828000,1582329685957080,42378063,sell,9681.8,0.951 -binance-futures,BTCUSDT,1582329685856000,1582329685982377,42378064,sell,9681.79,2.641 -binance-futures,BTCUSDT,1582329685856000,1582329685985143,42378065,sell,9681.27,1.161 -binance-futures,BTCUSDT,1582329685857000,1582329685985913,42378066,sell,9681.27,2.641 -binance-futures,BTCUSDT,1582329685907000,1582329686033846,42378067,sell,9680,0.166 -binance-futures,BTCUSDT,1582329685907000,1582329686033854,42378068,sell,9680,0.131 -binance-futures,BTCUSDT,1582329685907000,1582329686033859,42378069,sell,9680,0.774 -binance-futures,BTCUSDT,1582329685907000,1582329686037092,42378070,sell,9679.94,0.736 -binance-futures,BTCUSDT,1582329685907000,1582329686037098,42378071,sell,9679.94,0.736 -binance-futures,BTCUSDT,1582329685907000,1582329686040884,42378072,sell,9679.93,1 -binance-futures,BTCUSDT,1582329685907000,1582329686040899,42378073,buy,9681,0.1 -binance-futures,BTCUSDT,1582329685907000,1582329686043123,42378074,buy,9681.15,0.197 -binance-futures,BTCUSDT,1582329685907000,1582329686045890,42378075,buy,9681.23,0.081 -binance-futures,BTCUSDT,1582329685907000,1582329686045904,42378076,buy,9681.27,0.622 -binance-futures,BTCUSDT,1582329685954000,1582329686081538,42378077,sell,9679.87,0.12 -binance-futures,BTCUSDT,1582329686074000,1582329686199423,42378078,buy,9679.5,0.005 -binance-futures,BTCUSDT,1582329686177000,1582329686302104,42378079,buy,9679.28,0.072 -binance-futures,BTCUSDT,1582329687078000,1582329687200669,42378080,sell,9679.27,0.68 -binance-futures,BTCUSDT,1582329687087000,1582329687209684,42378081,sell,9679.27,0.72 -binance-futures,BTCUSDT,1582329687091000,1582329687213960,42378082,sell,9679.27,0.637 -binance-futures,BTCUSDT,1582329687091000,1582329687214120,42378083,sell,9679.27,0.033 -binance-futures,BTCUSDT,1582329687098000,1582329687222446,42378084,sell,9679.27,0.039 -binance-futures,BTCUSDT,1582329687808000,1582329687927221,42378085,buy,9679.17,0.001 -binance-futures,BTCUSDT,1582329689332000,1582329689454674,42378086,buy,9679.14,0.031 -binance-futures,BTCUSDT,1582329689332000,1582329689457732,42378087,buy,9679.15,0.031 -binance-futures,BTCUSDT,1582329689332000,1582329689460274,42378088,buy,9679.18,0.338 -binance-futures,BTCUSDT,1582329689674000,1582329689798913,42378089,sell,9678.59,0.01 -binance-futures,BTCUSDT,1582329692452000,1582329692571395,42378090,sell,9678.59,0.037 -binance-futures,BTCUSDT,1582329692475000,1582329692599862,42378091,sell,9678.58,0.72 -binance-futures,BTCUSDT,1582329692477000,1582329692599869,42378092,sell,9678.58,0.28 -binance-futures,BTCUSDT,1582329692498000,1582329692622340,42378093,sell,9678,0.01 -binance-futures,BTCUSDT,1582329692498000,1582329692622346,42378094,sell,9678,0.3 -binance-futures,BTCUSDT,1582329692498000,1582329692622354,42378095,sell,9677.91,0.012 -binance-futures,BTCUSDT,1582329692549000,1582329692671929,42378096,sell,9677.74,0.047 -binance-futures,BTCUSDT,1582329692720000,1582329692838161,42378097,sell,9676.7,0.029 -binance-futures,BTCUSDT,1582329692720000,1582329692840580,42378098,sell,9676.67,0.112 -binance-futures,BTCUSDT,1582329694020000,1582329694138010,42378099,sell,9676.25,0.012 -binance-futures,BTCUSDT,1582329694020000,1582329694140291,42378100,sell,9676,0.2 -binance-futures,BTCUSDT,1582329694020000,1582329694144630,42378101,sell,9675,0.655 -binance-futures,BTCUSDT,1582329694020000,1582329694149819,42378102,sell,9674.91,0.079 -binance-futures,BTCUSDT,1582329694020000,1582329694149826,42378103,sell,9674.69,0.25 -binance-futures,BTCUSDT,1582329694020000,1582329694151715,42378104,sell,9674.69,0.057 -binance-futures,BTCUSDT,1582329694020000,1582329694154237,42378105,sell,9674.33,0.065 -binance-futures,BTCUSDT,1582329694020000,1582329694154247,42378106,sell,9674.3,0.1 -binance-futures,BTCUSDT,1582329694072000,1582329694195688,42378107,buy,9674,0.143 -binance-futures,BTCUSDT,1582329694242000,1582329694363518,42378108,buy,9674,0.095 -binance-futures,BTCUSDT,1582329694838000,1582329694958487,42378109,sell,9673.7,0.005 -binance-futures,BTCUSDT,1582329696294000,1582329696416398,42378110,sell,9673.99,0.206 -binance-futures,BTCUSDT,1582329697152000,1582329697292251,42378111,sell,9673.99,0.794 -binance-futures,BTCUSDT,1582329697152000,1582329697292263,42378112,sell,9673.99,0.1 -binance-futures,BTCUSDT,1582329697152000,1582329697292270,42378113,sell,9673.89,0.082 -binance-futures,BTCUSDT,1582329697152000,1582329697295215,42378114,sell,9673.77,0.142 -binance-futures,BTCUSDT,1582329697152000,1582329697295220,42378115,sell,9673.77,0.003 -binance-futures,BTCUSDT,1582329698517000,1582329698636905,42378116,buy,9673.82,0.008 -binance-futures,BTCUSDT,1582329701204000,1582329701340328,42378117,buy,9673.86,0.001 -binance-futures,BTCUSDT,1582329702094000,1582329702216400,42378118,sell,9673.85,0.1 -binance-futures,BTCUSDT,1582329702196000,1582329702324323,42378119,sell,9673.2,0.005 -binance-futures,BTCUSDT,1582329702196000,1582329702325810,42378120,sell,9672.79,0.047 -binance-futures,BTCUSDT,1582329702399000,1582329702521673,42378121,buy,9673.03,0.5 -binance-futures,BTCUSDT,1582329703501000,1582329703627232,42378122,sell,9672.08,0.012 -binance-futures,BTCUSDT,1582329704434000,1582329704554611,42378123,sell,9671.33,0.61 -binance-futures,BTCUSDT,1582329704440000,1582329704562343,42378124,sell,9671.33,0.19 -binance-futures,BTCUSDT,1582329705143000,1582329705272950,42378125,sell,9671.31,0.04 -binance-futures,BTCUSDT,1582329705143000,1582329705274740,42378126,sell,9671,2 -binance-futures,BTCUSDT,1582329705143000,1582329705278622,42378127,sell,9670.84,0.047 -binance-futures,BTCUSDT,1582329705143000,1582329705280257,42378128,sell,9670.45,0.012 -binance-futures,BTCUSDT,1582329705143000,1582329705280263,42378129,sell,9670,0.311 -binance-futures,BTCUSDT,1582329705143000,1582329705282189,42378130,sell,9670,0.001 -binance-futures,BTCUSDT,1582329706772000,1582329706892307,42378131,sell,9669.99,1.228 -binance-futures,BTCUSDT,1582329706980000,1582329707102203,42378132,sell,9669.52,0.272 -binance-futures,BTCUSDT,1582329707198000,1582329707317609,42378133,sell,9669.45,0.001 -binance-futures,BTCUSDT,1582329707743000,1582329707866035,42378134,buy,9669.07,0.084 -binance-futures,BTCUSDT,1582329708079000,1582329708202050,42378135,buy,9669.3,0.002 -binance-futures,BTCUSDT,1582329708423000,1582329708544236,42378136,buy,9669.3,0.001 -binance-futures,BTCUSDT,1582329709587000,1582329709705875,42378137,sell,9669.29,2 -binance-futures,BTCUSDT,1582329709587000,1582329709708779,42378138,sell,9669.29,0.084 -binance-futures,BTCUSDT,1582329709587000,1582329709708785,42378139,sell,9669.09,0.1 -binance-futures,BTCUSDT,1582329709587000,1582329709714221,42378140,sell,9669.01,0.44 -binance-futures,BTCUSDT,1582329709587000,1582329709715863,42378141,sell,9669,0.376 -binance-futures,BTCUSDT,1582329709651000,1582329709776423,42378142,sell,9669.21,0.124 -binance-futures,BTCUSDT,1582329709678000,1582329709801356,42378143,sell,9669,0.124 -binance-futures,BTCUSDT,1582329709719000,1582329709844536,42378144,sell,9668.72,0.47 -binance-futures,BTCUSDT,1582329709781000,1582329709905615,42378145,buy,9668.96,0.031 -binance-futures,BTCUSDT,1582329709781000,1582329709905626,42378146,buy,9668.96,0.029 -binance-futures,BTCUSDT,1582329709876000,1582329710001885,42378147,buy,9668.92,0.148 -binance-futures,BTCUSDT,1582329710245000,1582329710368545,42378148,sell,9668.99,0.1 -binance-futures,BTCUSDT,1582329710245000,1582329710369679,42378149,sell,9668.99,1.88 -binance-futures,BTCUSDT,1582329710245000,1582329710369688,42378150,sell,9668.69,0.466 -binance-futures,BTCUSDT,1582329710245000,1582329710376439,42378151,sell,9668.48,0.052 -binance-futures,BTCUSDT,1582329710245000,1582329710376455,42378152,sell,9668.48,0.609 -binance-futures,BTCUSDT,1582329710245000,1582329710378911,42378153,sell,9668.37,0.04 -binance-futures,BTCUSDT,1582329710245000,1582329710378921,42378154,sell,9668,0.01 -binance-futures,BTCUSDT,1582329710245000,1582329710382488,42378155,sell,9666.99,0.047 -binance-futures,BTCUSDT,1582329710245000,1582329710384017,42378156,sell,9666.92,0.012 -binance-futures,BTCUSDT,1582329710245000,1582329710385274,42378157,sell,9666.66,0.529 -binance-futures,BTCUSDT,1582329711855000,1582329711973912,42378158,sell,9668.99,0.1 -binance-futures,BTCUSDT,1582329712052000,1582329712171514,42378159,sell,9668.99,0.213 -binance-futures,BTCUSDT,1582329712069000,1582329712187160,42378160,sell,9668.99,1.687 -binance-futures,BTCUSDT,1582329712123000,1582329712255255,42378161,sell,9668,0.1 -binance-futures,BTCUSDT,1582329712265000,1582329712385074,42378162,buy,9667.92,0.279 -binance-futures,BTCUSDT,1582329712441000,1582329712565295,42378163,sell,9666.66,2 -binance-futures,BTCUSDT,1582329712574000,1582329712693337,42378164,buy,9667.57,0.001 -binance-futures,BTCUSDT,1582329713166000,1582329713287427,42378165,sell,9667.12,0.031 -binance-futures,BTCUSDT,1582329713166000,1582329713289913,42378166,sell,9667.11,0.031 -binance-futures,BTCUSDT,1582329713166000,1582329713295449,42378167,sell,9667.09,0.31 -binance-futures,BTCUSDT,1582329713166000,1582329713297094,42378168,sell,9666.73,0.128 -binance-futures,BTCUSDT,1582329713248000,1582329713369021,42378169,sell,9666.73,0.3 -binance-futures,BTCUSDT,1582329715201000,1582329715322487,42378170,buy,9667.78,0.031 -binance-futures,BTCUSDT,1582329715201000,1582329715330500,42378171,buy,9667.79,0.031 -binance-futures,BTCUSDT,1582329715201000,1582329715330537,42378172,buy,9667.8,0.08 -binance-futures,BTCUSDT,1582329715201000,1582329715330543,42378173,buy,9667.8,0.031 -binance-futures,BTCUSDT,1582329715201000,1582329715334071,42378174,buy,9668.07,0.119 -binance-futures,BTCUSDT,1582329715640000,1582329715762535,42378175,sell,9667.31,0.035 -binance-futures,BTCUSDT,1582329716155000,1582329716273300,42378176,buy,9667.95,1.519 -binance-futures,BTCUSDT,1582329716380000,1582329716498400,42378177,buy,9667.95,0.491 -binance-futures,BTCUSDT,1582329716380000,1582329716498412,42378178,buy,9667.95,0.368 -binance-futures,BTCUSDT,1582329716993000,1582329717111598,42378179,buy,9667.95,1.602 -binance-futures,BTCUSDT,1582329717107000,1582329717229420,42378180,buy,9669,2.09 -binance-futures,BTCUSDT,1582329717178000,1582329717317864,42378181,sell,9668.99,0.047 -binance-futures,BTCUSDT,1582329717250000,1582329717371907,42378182,buy,9669,0.001 -binance-futures,BTCUSDT,1582329717266000,1582329717421984,42378183,buy,9669,0.882 -binance-futures,BTCUSDT,1582329717266000,1582329717422018,42378184,buy,9669.49,2 -binance-futures,BTCUSDT,1582329717266000,1582329717422879,42378185,buy,9670,2.589 -binance-futures,BTCUSDT,1582329717266000,1582329717423972,42378186,buy,9670.45,0.024 -binance-futures,BTCUSDT,1582329717266000,1582329717433473,42378187,buy,9670.77,0.495 -binance-futures,BTCUSDT,1582329717300000,1582329717435322,42378188,buy,9670.77,0.001 -binance-futures,BTCUSDT,1582329717371000,1582329717493937,42378189,sell,9669.41,0.015 -binance-futures,BTCUSDT,1582329717378000,1582329717503505,42378190,buy,9670.76,0.005 -binance-futures,BTCUSDT,1582329717379000,1582329717505169,42378191,buy,9670.81,0.069 -binance-futures,BTCUSDT,1582329717528000,1582329717650810,42378192,buy,9670.89,0.897 -binance-futures,BTCUSDT,1582329717709000,1582329717832042,42378193,buy,9670.88,0.005 -binance-futures,BTCUSDT,1582329717709000,1582329717834993,42378194,buy,9670.89,0.09 -binance-futures,BTCUSDT,1582329717738000,1582329717860764,42378195,buy,9670.89,0.126 -binance-futures,BTCUSDT,1582329717773000,1582329717900882,42378196,buy,9671.31,0.74 -binance-futures,BTCUSDT,1582329717806000,1582329717927116,42378197,buy,9671.31,0.094 -binance-futures,BTCUSDT,1582329718044000,1582329718173368,42378198,buy,9672.05,0.001 -binance-futures,BTCUSDT,1582329718060000,1582329718190339,42378199,buy,9672.05,0.781 -binance-futures,BTCUSDT,1582329718113000,1582329718243730,42378200,buy,9672.05,0.947 -binance-futures,BTCUSDT,1582329718143000,1582329718271915,42378201,buy,9672.12,0.001 -binance-futures,BTCUSDT,1582329718160000,1582329718283229,42378202,buy,9672.12,0.1 -binance-futures,BTCUSDT,1582329718217000,1582329718349711,42378203,buy,9672.79,0.047 -binance-futures,BTCUSDT,1582329718533000,1582329718658456,42378204,buy,9672.79,0.037 -binance-futures,BTCUSDT,1582329718623000,1582329718748932,42378205,sell,9672.78,0.06 -binance-futures,BTCUSDT,1582329718680000,1582329718803082,42378206,buy,9672.79,1.971 -binance-futures,BTCUSDT,1582329718680000,1582329718806077,42378207,buy,9673.86,2.427 -binance-futures,BTCUSDT,1582329718781000,1582329718903659,42378208,buy,9672.79,1.703 -binance-futures,BTCUSDT,1582329719078000,1582329719200724,42378209,sell,9673.15,0.049 -binance-futures,BTCUSDT,1582329720003000,1582329720124795,42378210,buy,9673.86,1.301 -binance-futures,BTCUSDT,1582329720054000,1582329720178974,42378211,buy,9673.86,0.006 -binance-futures,BTCUSDT,1582329720054000,1582329720179205,42378212,buy,9675.2,0.005 -binance-futures,BTCUSDT,1582329720054000,1582329720181157,42378213,buy,9675.36,0.302 -binance-futures,BTCUSDT,1582329720641000,1582329720768477,42378214,buy,9675.5,0.02 -binance-futures,BTCUSDT,1582329720909000,1582329721031323,42378215,sell,9675.42,0.002 -binance-futures,BTCUSDT,1582329721115000,1582329721238625,42378216,buy,9675.56,0.05 -binance-futures,BTCUSDT,1582329721115000,1582329721243838,42378217,buy,9675.6,1.283 -binance-futures,BTCUSDT,1582329721115000,1582329721243851,42378218,buy,9675.69,0.466 -binance-futures,BTCUSDT,1582329721115000,1582329721243855,42378219,buy,9676,0.213 -binance-futures,BTCUSDT,1582329721115000,1582329721251543,42378220,buy,9676,0.4 -binance-futures,BTCUSDT,1582329721115000,1582329721251555,42378221,buy,9676.05,0.985 -binance-futures,BTCUSDT,1582329721115000,1582329721251573,42378222,buy,9676.17,0.985 -binance-futures,BTCUSDT,1582329721115000,1582329721254574,42378223,buy,9676.25,0.012 -binance-futures,BTCUSDT,1582329721116000,1582329721254604,42378224,buy,9676.28,0.523 -binance-futures,BTCUSDT,1582329721167000,1582329721294809,42378225,buy,9675.56,0.7 -binance-futures,BTCUSDT,1582329721191000,1582329721312230,42378226,sell,9675.55,0.002 -binance-futures,BTCUSDT,1582329721233000,1582329721355900,42378227,buy,9675.56,0.65 -binance-futures,BTCUSDT,1582329721285000,1582329721405528,42378228,buy,9675.56,0.912 -binance-futures,BTCUSDT,1582329721472000,1582329721593326,42378229,buy,9675.56,0.007 -binance-futures,BTCUSDT,1582329721472000,1582329721596595,42378230,buy,9676.39,0.1 -binance-futures,BTCUSDT,1582329721472000,1582329721596604,42378231,buy,9676.46,0.232 -binance-futures,BTCUSDT,1582329721730000,1582329721854735,42378232,sell,9676,0.147 -binance-futures,BTCUSDT,1582329722391000,1582329722512741,42378233,buy,9676.97,0.67 -binance-futures,BTCUSDT,1582329722393000,1582329722512752,42378234,buy,9676.97,0.02 -binance-futures,BTCUSDT,1582329723056000,1582329723180825,42378235,buy,9676.97,0.01 -binance-futures,BTCUSDT,1582329723119000,1582329723244604,42378236,buy,9676.97,0.734 -binance-futures,BTCUSDT,1582329723141000,1582329723551317,42378237,buy,9676.97,0.177 -binance-futures,BTCUSDT,1582329723141000,1582329723551325,42378238,buy,9677.2,0.254 -binance-futures,BTCUSDT,1582329723141000,1582329723551344,42378239,buy,9678.09,0.047 -binance-futures,BTCUSDT,1582329723141000,1582329723551356,42378240,buy,9678.29,0.012 -binance-futures,BTCUSDT,1582329723141000,1582329723551365,42378241,buy,9678.59,0.047 -binance-futures,BTCUSDT,1582329723141000,1582329723551370,42378242,buy,9678.6,0.083 -binance-futures,BTCUSDT,1582329724753000,1582329724874261,42378243,buy,9676.96,0.155 -binance-futures,BTCUSDT,1582329724753000,1582329724875726,42378244,buy,9676.97,0.114 -binance-futures,BTCUSDT,1582329724952000,1582329725075570,42378245,sell,9676.02,0.031 -binance-futures,BTCUSDT,1582329724952000,1582329725075789,42378246,sell,9676.02,4.721 -binance-futures,BTCUSDT,1582329725458000,1582329725582475,42378247,buy,9676.97,1.136 -binance-futures,BTCUSDT,1582329725459000,1582329725590698,42378248,buy,9677.09,0.094 -binance-futures,BTCUSDT,1582329725459000,1582329725590705,42378249,buy,9678.6,2.353 -binance-futures,BTCUSDT,1582329726994000,1582329727112661,42378250,buy,9676.46,0.193 -binance-futures,BTCUSDT,1582329727895000,1582329728016988,42378251,buy,9675.58,0.01 -binance-futures,BTCUSDT,1582329728744000,1582329728866108,42378252,buy,9675.57,1 -binance-futures,BTCUSDT,1582329729119000,1582329729241669,42378253,sell,9675.56,0.1 -binance-futures,BTCUSDT,1582329729119000,1582329729241677,42378254,sell,9675,0.01 -binance-futures,BTCUSDT,1582329729119000,1582329729245216,42378255,sell,9673.89,0.09 -binance-futures,BTCUSDT,1582329729569000,1582329729691839,42378256,buy,9675.58,0.181 -binance-futures,BTCUSDT,1582329732756000,1582329732876897,42378257,sell,9673.75,0.68 -binance-futures,BTCUSDT,1582329732761000,1582329732885576,42378258,sell,9673.75,0.675 -binance-futures,BTCUSDT,1582329732803000,1582329732924976,42378259,sell,9672.93,0.68 -binance-futures,BTCUSDT,1582329732823000,1582329732944896,42378260,sell,9672.93,0.453 -binance-futures,BTCUSDT,1582329732832000,1582329732956086,42378261,sell,9672.79,0.047 -binance-futures,BTCUSDT,1582329736050000,1582329736173898,42378262,sell,9673.01,0.003 -binance-futures,BTCUSDT,1582329737143000,1582329737263724,42378263,buy,9673.64,0.497 -binance-futures,BTCUSDT,1582329737518000,1582329737640758,42378264,buy,9673.64,0.4 -binance-futures,BTCUSDT,1582329739027000,1582329739149925,42378265,buy,9673.64,0.103 -binance-futures,BTCUSDT,1582329740189000,1582329740310541,42378266,buy,9673.64,0.198 -binance-futures,BTCUSDT,1582329740191000,1582329740317105,42378267,buy,9673.64,0.122 -binance-futures,BTCUSDT,1582329740203000,1582329740326142,42378268,buy,9673.64,0.403 -binance-futures,BTCUSDT,1582329740203000,1582329740328688,42378269,buy,9674.57,0.216 -binance-futures,BTCUSDT,1582329740239000,1582329740395068,42378270,sell,9673.67,0.031 -binance-futures,BTCUSDT,1582329740239000,1582329740395084,42378271,sell,9673.66,0.031 -binance-futures,BTCUSDT,1582329740239000,1582329740397777,42378272,sell,9673.66,0.444 -binance-futures,BTCUSDT,1582329740239000,1582329740397789,42378273,sell,9673.65,0.031 -binance-futures,BTCUSDT,1582329740239000,1582329740399715,42378274,sell,9673.64,0.463 -binance-futures,BTCUSDT,1582329740305000,1582329740430458,42378275,buy,9674.56,0.093 -binance-futures,BTCUSDT,1582329740346000,1582329740467601,42378276,buy,9674.57,0.006 -binance-futures,BTCUSDT,1582329741976000,1582329742095972,42378277,sell,9673.63,0.684 -binance-futures,BTCUSDT,1582329741976000,1582329742100363,42378278,sell,9673.08,0.1 -binance-futures,BTCUSDT,1582329742494000,1582329742614679,42378279,buy,9672.93,0.068 -binance-futures,BTCUSDT,1582329744614000,1582329744735758,42378280,buy,9673.01,0.206 -binance-futures,BTCUSDT,1582329744614000,1582329744735766,42378281,buy,9673.01,0.01 -binance-futures,BTCUSDT,1582329744614000,1582329744735769,42378282,buy,9673.35,0.196 -binance-futures,BTCUSDT,1582329744616000,1582329744746637,42378283,buy,9673.35,0.206 -binance-futures,BTCUSDT,1582329744617000,1582329744746647,42378284,buy,9673.35,0.206 -binance-futures,BTCUSDT,1582329745564000,1582329745686604,42378285,sell,9671.92,0.016 -binance-futures,BTCUSDT,1582329748495000,1582329748618205,42378286,buy,9671.92,0.06 -binance-futures,BTCUSDT,1582329748495000,1582329748620390,42378287,buy,9672.94,0.146 -binance-futures,BTCUSDT,1582329748496000,1582329748623940,42378288,buy,9672.94,0.062 -binance-futures,BTCUSDT,1582329748496000,1582329748623949,42378289,buy,9673.28,0.001 -binance-futures,BTCUSDT,1582329748496000,1582329748626132,42378290,buy,9673.29,0.763 -binance-futures,BTCUSDT,1582329749056000,1582329749174640,42378291,buy,9671.93,0.09 -binance-futures,BTCUSDT,1582329749056000,1582329749179281,42378292,buy,9672.42,0.01 -binance-futures,BTCUSDT,1582329749641000,1582329749764481,42378293,sell,9671.91,0.047 -binance-futures,BTCUSDT,1582329749641000,1582329749765882,42378294,sell,9670.93,0.464 -binance-futures,BTCUSDT,1582329749641000,1582329749767909,42378295,sell,9670.88,1.648 -binance-futures,BTCUSDT,1582329749641000,1582329749772298,42378296,sell,9670.84,0.012 -binance-futures,BTCUSDT,1582329749641000,1582329749774490,42378297,sell,9670.59,1.422 -binance-futures,BTCUSDT,1582329749641000,1582329749775601,42378298,sell,9670.45,0.012 -binance-futures,BTCUSDT,1582329750522000,1582329750643373,42378299,sell,9669.99,0.005 -binance-futures,BTCUSDT,1582329750522000,1582329750645691,42378300,sell,9669.99,0.995 -binance-futures,BTCUSDT,1582329750867000,1582329750993611,42378301,sell,9669.99,0.2 -binance-futures,BTCUSDT,1582329751433000,1582329751555242,42378302,buy,9670,0.413 -binance-futures,BTCUSDT,1582329751435000,1582329751556827,42378303,buy,9670,0.206 -binance-futures,BTCUSDT,1582329751435000,1582329751557674,42378304,buy,9670,0.206 -binance-futures,BTCUSDT,1582329751435000,1582329751557682,42378305,buy,9670,0.206 -binance-futures,BTCUSDT,1582329751616000,1582329751740729,42378306,sell,9669.99,0.004 -binance-futures,BTCUSDT,1582329752285000,1582329752408355,42378307,buy,9670,0.1 -binance-futures,BTCUSDT,1582329754777000,1582329754901672,42378308,buy,9670,0.264 -binance-futures,BTCUSDT,1582329754984000,1582329755106449,42378309,sell,9670.86,0.001 -binance-futures,BTCUSDT,1582329757673000,1582329757792664,42378310,buy,9671.49,0.001 -binance-futures,BTCUSDT,1582329758280000,1582329758415367,42378311,buy,9672.76,0.206 -binance-futures,BTCUSDT,1582329758941000,1582329759059008,42378312,buy,9672.93,0.109 -binance-futures,BTCUSDT,1582329759553000,1582329759673111,42378313,buy,9671.81,0.031 -binance-futures,BTCUSDT,1582329759553000,1582329759673280,42378314,buy,9671.81,0.469 -binance-futures,BTCUSDT,1582329759874000,1582329759994486,42378315,buy,9672.43,0.338 -binance-futures,BTCUSDT,1582329759874000,1582329759999413,42378316,buy,9672.52,0.182 -binance-futures,BTCUSDT,1582329760436000,1582329760554961,42378317,buy,9671.91,1 -binance-futures,BTCUSDT,1582329760767000,1582329760885502,42378318,buy,9671.69,0.981 -binance-futures,BTCUSDT,1582329761033000,1582329761157923,42378319,buy,9671.65,0.031 -binance-futures,BTCUSDT,1582329761033000,1582329761167771,42378320,buy,9671.66,0.031 -binance-futures,BTCUSDT,1582329761033000,1582329761167779,42378321,buy,9671.67,0.031 -binance-futures,BTCUSDT,1582329761033000,1582329761168854,42378322,buy,9671.9,0.206 -binance-futures,BTCUSDT,1582329761033000,1582329761168860,42378323,buy,9671.91,0.319 -binance-futures,BTCUSDT,1582329761038000,1582329761169445,42378324,buy,9671.91,0.206 -binance-futures,BTCUSDT,1582329761039000,1582329761169661,42378325,buy,9671.91,0.206 -binance-futures,BTCUSDT,1582329762353000,1582329762472662,42378326,sell,9671.9,0.031 -binance-futures,BTCUSDT,1582329762353000,1582329762474349,42378327,sell,9671.9,0.474 -binance-futures,BTCUSDT,1582329763285000,1582329763404666,42378328,buy,9671.91,0.002 -binance-futures,BTCUSDT,1582329767047000,1582329767167556,42378329,sell,9671.9,0.05 -binance-futures,BTCUSDT,1582329769634000,1582329769755080,42378330,sell,9671.9,0.36 -binance-futures,BTCUSDT,1582329769634000,1582329769755084,42378331,sell,9671.9,2.018 -binance-futures,BTCUSDT,1582329769652000,1582329769771912,42378332,sell,9671.64,0.02 -binance-futures,BTCUSDT,1582329769703000,1582329769822641,42378333,sell,9670.61,0.003 -binance-futures,BTCUSDT,1582329769703000,1582329769827466,42378334,sell,9670.6,0.647 -binance-futures,BTCUSDT,1582329769726000,1582329769850920,42378335,sell,9670.6,2.638 -binance-futures,BTCUSDT,1582329769784000,1582329769903242,42378336,sell,9670.62,0.001 -binance-futures,BTCUSDT,1582329769975000,1582329770102707,42378337,sell,9670.63,2 -binance-futures,BTCUSDT,1582329769988000,1582329770108963,42378338,sell,9670.63,0.057 -binance-futures,BTCUSDT,1582329769997000,1582329770118027,42378339,sell,9670.63,2.096 -binance-futures,BTCUSDT,1582329770123000,1582329770244517,42378340,sell,9670.01,0.017 -binance-futures,BTCUSDT,1582329770123000,1582329770244796,42378341,sell,9670,0.126 -binance-futures,BTCUSDT,1582329770147000,1582329770266969,42378342,sell,9669.32,0.17 -binance-futures,BTCUSDT,1582329770149000,1582329770271727,42378343,sell,9669.32,0.301 -binance-futures,BTCUSDT,1582329770165000,1582329770288937,42378344,sell,9669,0.1 -binance-futures,BTCUSDT,1582329770169000,1582329770293993,42378345,sell,9669,0.1 -binance-futures,BTCUSDT,1582329770169000,1582329770296192,42378346,sell,9668.74,0.065 -binance-futures,BTCUSDT,1582329770224000,1582329770358350,42378347,sell,9668.33,0.1 -binance-futures,BTCUSDT,1582329770295000,1582329770431092,42378348,sell,9668.34,0.005 -binance-futures,BTCUSDT,1582329770360000,1582329770496308,42378349,sell,9668.27,0.015 -binance-futures,BTCUSDT,1582329770360000,1582329770500162,42378350,sell,9668.07,0.096 -binance-futures,BTCUSDT,1582329770596000,1582329770723776,42378351,sell,9668.08,0.005 -binance-futures,BTCUSDT,1582329770596000,1582329770724731,42378352,sell,9668.07,0.097 -binance-futures,BTCUSDT,1582329770646000,1582329770768155,42378353,sell,9668.07,0.037 -binance-futures,BTCUSDT,1582329770693000,1582329770817022,42378354,sell,9668.07,0.02 -binance-futures,BTCUSDT,1582329770701000,1582329770826391,42378355,sell,9668.07,0.75 -binance-futures,BTCUSDT,1582329770701000,1582329770829429,42378356,sell,9668.07,0.005 -binance-futures,BTCUSDT,1582329770701000,1582329770830621,42378357,sell,9668,0.01 -binance-futures,BTCUSDT,1582329770701000,1582329770831388,42378358,sell,9668,0.208 -binance-futures,BTCUSDT,1582329770717000,1582329770838885,42378359,sell,9668,0.265 -binance-futures,BTCUSDT,1582329770734000,1582329770855890,42378360,sell,9668,0.097 -binance-futures,BTCUSDT,1582329770750000,1582329770871389,42378361,sell,9668,0.069 -binance-futures,BTCUSDT,1582329771394000,1582329771516780,42378362,sell,9667.5,0.75 -binance-futures,BTCUSDT,1582329771608000,1582329771732530,42378363,buy,9667.72,0.001 -binance-futures,BTCUSDT,1582329772141000,1582329772265323,42378364,buy,9667.15,0.4 -binance-futures,BTCUSDT,1582329772286000,1582329772409714,42378365,buy,9667.37,0.008 -binance-futures,BTCUSDT,1582329773799000,1582329773921063,42378366,sell,9667,0.25 -binance-futures,BTCUSDT,1582329773799000,1582329773921074,42378367,sell,9666.99,0.047 -binance-futures,BTCUSDT,1582329773799000,1582329773928215,42378368,sell,9666.98,0.203 -binance-futures,BTCUSDT,1582329774135000,1582329774252885,42378369,sell,9666.96,0.009 -binance-futures,BTCUSDT,1582329777190000,1582329777326425,42378370,sell,9667.23,0.016 -binance-futures,BTCUSDT,1582329778150000,1582329778269652,42378371,sell,9667.23,0.001 -binance-futures,BTCUSDT,1582329778285000,1582329778405098,42378372,buy,9667.24,0.005 -binance-futures,BTCUSDT,1582329778285000,1582329778405549,42378373,buy,9668.6,0.003 -binance-futures,BTCUSDT,1582329778285000,1582329778410449,42378374,buy,9668.74,0.036 -binance-futures,BTCUSDT,1582329778639000,1582329778762722,42378375,sell,9666.96,0.003 -binance-futures,BTCUSDT,1582329778639000,1582329778763509,42378376,sell,9666.85,0.009 -binance-futures,BTCUSDT,1582329778639000,1582329778766857,42378377,sell,9666.85,0.002 -binance-futures,BTCUSDT,1582329778639000,1582329778766865,42378378,sell,9666.84,0.016 -binance-futures,BTCUSDT,1582329779501000,1582329779627717,42378379,buy,9668.22,0.65 -binance-futures,BTCUSDT,1582329779605000,1582329779727799,42378380,buy,9668.22,0.773 -binance-futures,BTCUSDT,1582329779645000,1582329779774137,42378381,buy,9668.74,1.081 -binance-futures,BTCUSDT,1582329780177000,1582329780301971,42378382,sell,9669.41,0.273 -binance-futures,BTCUSDT,1582329780918000,1582329781038669,42378383,buy,9669.42,0.01 -binance-futures,BTCUSDT,1582329782181000,1582329782305987,42378384,sell,9669.41,0.17 -binance-futures,BTCUSDT,1582329782405000,1582329782526316,42378385,sell,9669.41,0.1 -binance-futures,BTCUSDT,1582329782726000,1582329782848317,42378386,buy,9669.42,0.01 -binance-futures,BTCUSDT,1582329784049000,1582329784166629,42378387,buy,9669.42,0.1 -binance-futures,BTCUSDT,1582329785368000,1582329785488502,42378388,buy,9670.27,0.1 -binance-futures,BTCUSDT,1582329785602000,1582329785722945,42378389,buy,9670.27,0.062 -binance-futures,BTCUSDT,1582329787124000,1582329787245149,42378390,buy,9670.27,0.206 -binance-futures,BTCUSDT,1582329787125000,1582329787248836,42378391,buy,9670.27,0.206 -binance-futures,BTCUSDT,1582329787129000,1582329787252139,42378392,buy,9670.27,0.052 -binance-futures,BTCUSDT,1582329787296000,1582329787416952,42378393,buy,9670.27,0.165 -binance-futures,BTCUSDT,1582329787305000,1582329787424285,42378394,buy,9670.27,0.248 -binance-futures,BTCUSDT,1582329787407000,1582329787525970,42378395,buy,9670.27,0.075 -binance-futures,BTCUSDT,1582329788693000,1582329788813234,42378396,buy,9670.26,0.682 -binance-futures,BTCUSDT,1582329788713000,1582329788840348,42378397,buy,9670.63,2 -binance-futures,BTCUSDT,1582329788713000,1582329788840358,42378398,buy,9670.63,0.653 -binance-futures,BTCUSDT,1582329788737000,1582329788865067,42378399,buy,9670.83,0.041 -binance-futures,BTCUSDT,1582329788856000,1582329788977442,42378400,buy,9671.91,2 -binance-futures,BTCUSDT,1582329788877000,1582329789000925,42378401,buy,9671.91,2 -binance-futures,BTCUSDT,1582329788879000,1582329789001078,42378402,buy,9671.91,1.209 -binance-futures,BTCUSDT,1582329789446000,1582329789566633,42378403,sell,9672.78,0.022 -binance-futures,BTCUSDT,1582329789877000,1582329789996748,42378404,buy,9672.79,0.047 -binance-futures,BTCUSDT,1582329789877000,1582329789999067,42378405,buy,9672.79,0.159 -binance-futures,BTCUSDT,1582329789914000,1582329790034608,42378406,buy,9672.79,2 -binance-futures,BTCUSDT,1582329789932000,1582329790051476,42378407,buy,9672.79,0.425 -binance-futures,BTCUSDT,1582329789950000,1582329790072508,42378408,buy,9673,0.028 -binance-futures,BTCUSDT,1582329790001000,1582329790147359,42378409,buy,9673.29,0.809 -binance-futures,BTCUSDT,1582329790215000,1582329790363650,42378410,buy,9675.19,1.2 -binance-futures,BTCUSDT,1582329790221000,1582329790370015,42378411,sell,9675.19,0.023 -binance-futures,BTCUSDT,1582329795838000,1582329795956781,42378412,sell,9674.01,0.031 -binance-futures,BTCUSDT,1582329795838000,1582329795956796,42378413,sell,9674,0.005 -binance-futures,BTCUSDT,1582329797353000,1582329797471678,42378414,sell,9673.26,0.031 -binance-futures,BTCUSDT,1582329797353000,1582329797472517,42378415,sell,9673.26,0.065 -binance-futures,BTCUSDT,1582329798426000,1582329798547379,42378416,buy,9674.97,0.36 -binance-futures,BTCUSDT,1582329798426000,1582329798547385,42378417,buy,9674.98,0.508 -binance-futures,BTCUSDT,1582329805207000,1582329805329306,42378418,buy,9673.98,0.001 -binance-futures,BTCUSDT,1582329807556000,1582329807674611,42378419,buy,9673.98,0.076 -binance-futures,BTCUSDT,1582329808170000,1582329808290821,42378420,buy,9673.98,1 -binance-futures,BTCUSDT,1582329813661000,1582329813781907,42378421,sell,9673.15,0.006 -binance-futures,BTCUSDT,1582329815714000,1582329815832164,42378422,buy,9674.04,0.74 -binance-futures,BTCUSDT,1582329815778000,1582329815896943,42378423,buy,9674.04,0.71 -binance-futures,BTCUSDT,1582329816603000,1582329816728032,42378424,buy,9674.6,0.01 -binance-futures,BTCUSDT,1582329816605000,1582329816728041,42378425,buy,9674.6,0.05 -binance-futures,BTCUSDT,1582329816605000,1582329816728045,42378426,buy,9674.64,0.72 -binance-futures,BTCUSDT,1582329816637000,1582329816759132,42378427,buy,9674.64,0.67 -binance-futures,BTCUSDT,1582329816742000,1582329816863033,42378428,buy,9674.64,0.67 -binance-futures,BTCUSDT,1582329816754000,1582329816876786,42378429,buy,9674.64,2.142 -binance-futures,BTCUSDT,1582329817580000,1582329817702667,42378430,sell,9674.97,0.438 -binance-futures,BTCUSDT,1582329817580000,1582329817702674,42378431,sell,9674.97,0.083 -binance-futures,BTCUSDT,1582329817580000,1582329817702677,42378432,sell,9674.96,0.67 -binance-futures,BTCUSDT,1582329817580000,1582329817708149,42378433,sell,9674.66,1 -binance-futures,BTCUSDT,1582329817580000,1582329817712912,42378434,sell,9674.35,0.203 -binance-futures,BTCUSDT,1582329817580000,1582329817712919,42378435,sell,9674.35,0.203 -binance-futures,BTCUSDT,1582329817580000,1582329817715043,42378436,sell,9674.34,2 -binance-futures,BTCUSDT,1582329817580000,1582329817715971,42378437,sell,9674.32,2 -binance-futures,BTCUSDT,1582329817580000,1582329817715978,42378438,sell,9674.32,1.95 -binance-futures,BTCUSDT,1582329817580000,1582329817718243,42378439,sell,9674.28,1.453 -binance-futures,BTCUSDT,1582329821646000,1582329821765799,42378440,buy,9674.03,0.071 -binance-futures,BTCUSDT,1582329822857000,1582329822977313,42378441,buy,9673.16,0.01 -binance-futures,BTCUSDT,1582329823527000,1582329823649236,42378442,sell,9673.15,0.68 -binance-futures,BTCUSDT,1582329824782000,1582329824904929,42378443,sell,9671.98,0.68 -binance-futures,BTCUSDT,1582329824784000,1582329824908361,42378444,sell,9671.98,0.66 -binance-futures,BTCUSDT,1582329825012000,1582329825130725,42378445,sell,9671.98,0.001 -binance-futures,BTCUSDT,1582329830873000,1582329830992966,42378446,buy,9671.7,0.005 -binance-futures,BTCUSDT,1582329830873000,1582329830993154,42378447,buy,9672.09,0.634 -binance-futures,BTCUSDT,1582329830873000,1582329830997180,42378448,buy,9672.09,0.634 -binance-futures,BTCUSDT,1582329830873000,1582329830997187,42378449,buy,9672.18,0.637 -binance-futures,BTCUSDT,1582329830873000,1582329831001059,42378450,buy,9672.18,0.638 -binance-futures,BTCUSDT,1582329830873000,1582329831001069,42378451,buy,9672.18,0.452 -binance-futures,BTCUSDT,1582329834785000,1582329834905140,42378452,sell,9672.31,0.031 -binance-futures,BTCUSDT,1582329834785000,1582329834905147,42378453,sell,9672.3,0.031 -binance-futures,BTCUSDT,1582329834785000,1582329834906321,42378454,sell,9672.3,0.055 -binance-futures,BTCUSDT,1582329836178000,1582329836296518,42378455,buy,9672.32,0.1 -binance-futures,BTCUSDT,1582329836178000,1582329836300440,42378456,buy,9672.5,0.003 -binance-futures,BTCUSDT,1582329836881000,1582329837002195,42378457,buy,9672.5,0.002 -binance-futures,BTCUSDT,1582329836881000,1582329837004376,42378458,buy,9673.17,0.013 -binance-futures,BTCUSDT,1582329836881000,1582329837007507,42378459,buy,9673.17,0.002 -binance-futures,BTCUSDT,1582329836881000,1582329837012736,42378460,buy,9673.18,0.386 -binance-futures,BTCUSDT,1582329836881000,1582329837012747,42378461,buy,9673.21,0.597 -binance-futures,BTCUSDT,1582329836929000,1582329837047922,42378462,buy,9673.21,0.68 -binance-futures,BTCUSDT,1582329836964000,1582329837083976,42378463,buy,9673.21,0.63 -binance-futures,BTCUSDT,1582329836983000,1582329837106511,42378464,buy,9673.21,0.65 -binance-futures,BTCUSDT,1582329836985000,1582329837106926,42378465,buy,9673.21,0.12 -binance-futures,BTCUSDT,1582329837014000,1582329837140156,42378466,buy,9673.12,0.236 -binance-futures,BTCUSDT,1582329837014000,1582329837140166,42378467,buy,9673.21,0.444 -binance-futures,BTCUSDT,1582329837091000,1582329837212264,42378468,buy,9673.17,0.005 -binance-futures,BTCUSDT,1582329837091000,1582329837216145,42378469,buy,9673.21,0.005 -binance-futures,BTCUSDT,1582329840596000,1582329840719381,42378470,sell,9674.46,0.031 -binance-futures,BTCUSDT,1582329840596000,1582329840721213,42378471,sell,9674.45,0.031 -binance-futures,BTCUSDT,1582329840596000,1582329840727871,42378472,sell,9674.44,0.442 -binance-futures,BTCUSDT,1582329840596000,1582329840727880,42378473,sell,9674.44,0.031 -binance-futures,BTCUSDT,1582329840596000,1582329840727885,42378474,sell,9674.43,0.49 -binance-futures,BTCUSDT,1582329840596000,1582329840732281,42378475,sell,9673.91,0.007 -binance-futures,BTCUSDT,1582329840596000,1582329840734846,42378476,sell,9673.91,0.002 -binance-futures,BTCUSDT,1582329840596000,1582329840737862,42378477,sell,9673.42,2 -binance-futures,BTCUSDT,1582329840596000,1582329840737869,42378478,sell,9673.42,0.623 -binance-futures,BTCUSDT,1582329840596000,1582329840739554,42378479,sell,9673.41,1.343 -binance-futures,BTCUSDT,1582329845044000,1582329845167703,42378480,sell,9673.17,2 -binance-futures,BTCUSDT,1582329845352000,1582329845471810,42378481,sell,9673.17,2 -binance-futures,BTCUSDT,1582329845371000,1582329845489508,42378482,sell,9673.17,0.38 -binance-futures,BTCUSDT,1582329845391000,1582329845510110,42378483,sell,9673,2 -binance-futures,BTCUSDT,1582329845411000,1582329845532349,42378484,sell,9673,0.005 -binance-futures,BTCUSDT,1582329846141000,1582329846262992,42378485,buy,9672.18,0.029 -binance-futures,BTCUSDT,1582329846141000,1582329846262997,42378486,buy,9672.18,0.72 -binance-futures,BTCUSDT,1582329846141000,1582329846263956,42378487,buy,9672.18,0.67 -binance-futures,BTCUSDT,1582329846141000,1582329846263965,42378488,buy,9672.18,0.67 -binance-futures,BTCUSDT,1582329846141000,1582329846263980,42378489,buy,9672.18,0.74 -binance-futures,BTCUSDT,1582329846141000,1582329846264527,42378490,buy,9672.18,0.316 -binance-futures,BTCUSDT,1582329846141000,1582329846264796,42378491,buy,9672.58,0.618 -binance-futures,BTCUSDT,1582329846141000,1582329846269875,42378492,buy,9672.58,0.067 -binance-futures,BTCUSDT,1582329846141000,1582329846269884,42378493,buy,9672.71,1 -binance-futures,BTCUSDT,1582329846141000,1582329846272207,42378494,buy,9673.46,1.138 -binance-futures,BTCUSDT,1582329846179000,1582329846332219,42378495,sell,9672.17,0.5 -binance-futures,BTCUSDT,1582329846179000,1582329846332225,42378496,sell,9672.1,0.24 -binance-futures,BTCUSDT,1582329846189000,1582329846333282,42378497,sell,9672.1,0.68 -binance-futures,BTCUSDT,1582329846191000,1582329846333285,42378498,sell,9672.1,0.67 -binance-futures,BTCUSDT,1582329846200000,1582329846333340,42378499,sell,9672.1,0.72 -binance-futures,BTCUSDT,1582329846233000,1582329846354207,42378500,sell,9672.1,0.67 -binance-futures,BTCUSDT,1582329846233000,1582329846354249,42378501,sell,9672.1,0.01 -binance-futures,BTCUSDT,1582329846237000,1582329846362459,42378502,sell,9672.1,0.01 -binance-futures,BTCUSDT,1582329846239000,1582329846366233,42378503,sell,9672.1,0.01 -binance-futures,BTCUSDT,1582329846250000,1582329846386215,42378504,sell,9672.1,0.01 -binance-futures,BTCUSDT,1582329847838000,1582329847960177,42378505,sell,9672.1,0.1 -binance-futures,BTCUSDT,1582329848999000,1582329849119294,42378506,sell,9672.1,0.52 -binance-futures,BTCUSDT,1582329848999000,1582329849119586,42378507,sell,9671.83,0.004 -binance-futures,BTCUSDT,1582329852646000,1582329852769552,42378508,sell,9671.54,0.001 -binance-futures,BTCUSDT,1582329854139000,1582329854260690,42378509,buy,9671.86,0.031 -binance-futures,BTCUSDT,1582329854139000,1582329854264612,42378510,buy,9671.86,0.357 -binance-futures,BTCUSDT,1582329855885000,1582329856005836,42378511,buy,9671.61,0.016 -binance-futures,BTCUSDT,1582329858320000,1582329858442129,42378512,sell,9671.54,0.12 -binance-futures,BTCUSDT,1582329860241000,1582329860367349,42378513,sell,9671.54,0.001 -binance-futures,BTCUSDT,1582329860749000,1582329860868338,42378514,buy,9671.55,0.847 -binance-futures,BTCUSDT,1582329860848000,1582329860970248,42378515,buy,9671.57,0.004 -binance-futures,BTCUSDT,1582329863747000,1582329863866654,42378516,sell,9671.54,0.388 -binance-futures,BTCUSDT,1582329867482000,1582329867603843,42378517,buy,9671.55,0.004 -binance-futures,BTCUSDT,1582329881863000,1582329881984321,42378518,sell,9671.54,0.177 -binance-futures,BTCUSDT,1582329881863000,1582329881984347,42378519,sell,9671.54,0.014 -binance-futures,BTCUSDT,1582329881863000,1582329881987174,42378520,sell,9671,0.059 -binance-futures,BTCUSDT,1582329881917000,1582329882039001,42378521,sell,9671,0.041 -binance-futures,BTCUSDT,1582329882268000,1582329882388631,42378522,buy,9670.81,0.001 -binance-futures,BTCUSDT,1582329883733000,1582329883854287,42378523,sell,9670.8,0.001 -binance-futures,BTCUSDT,1582329884965000,1582329885084304,42378524,sell,9670.8,0.001 -binance-futures,BTCUSDT,1582329886406000,1582329886526992,42378525,buy,9671.1,0.001 -binance-futures,BTCUSDT,1582329888629000,1582329888749891,42378526,buy,9670.82,0.1 -binance-futures,BTCUSDT,1582329888629000,1582329888751733,42378527,buy,9671.1,0.004 -binance-futures,BTCUSDT,1582329888629000,1582329888758393,42378528,buy,9671.58,0.002 -binance-futures,BTCUSDT,1582329888629000,1582329888758415,42378529,buy,9671.75,0.18 -binance-futures,BTCUSDT,1582329892302000,1582329892424336,42378530,sell,9671.58,0.01 -binance-futures,BTCUSDT,1582329893815000,1582329893936406,42378531,sell,9670.9,0.005 -binance-futures,BTCUSDT,1582329893815000,1582329893944648,42378532,sell,9670.79,0.25 -binance-futures,BTCUSDT,1582329893815000,1582329893946381,42378533,sell,9670.28,1.974 -binance-futures,BTCUSDT,1582329895732000,1582329895856880,42378534,sell,9671.28,0.031 -binance-futures,BTCUSDT,1582329895732000,1582329895864508,42378535,sell,9671.27,0.031 -binance-futures,BTCUSDT,1582329895732000,1582329895864515,42378536,sell,9671.26,0.031 -binance-futures,BTCUSDT,1582329895732000,1582329895865337,42378537,sell,9671.21,0.346 -binance-futures,BTCUSDT,1582329900285000,1582329900430313,42378538,sell,9670.28,0.007 -binance-futures,BTCUSDT,1582329901416000,1582329901534988,42378539,buy,9670.43,0.031 -binance-futures,BTCUSDT,1582329901416000,1582329901534997,42378540,buy,9670.44,0.031 -binance-futures,BTCUSDT,1582329901416000,1582329901543519,42378541,buy,9670.45,0.031 -binance-futures,BTCUSDT,1582329901416000,1582329901546970,42378542,buy,9670.46,0.031 -binance-futures,BTCUSDT,1582329901416000,1582329901549800,42378543,buy,9670.67,0.086 -binance-futures,BTCUSDT,1582329901416000,1582329901552212,42378544,buy,9670.9,0.005 -binance-futures,BTCUSDT,1582329901416000,1582329901552223,42378545,buy,9671.49,0.683 -binance-futures,BTCUSDT,1582329903764000,1582329903884486,42378546,sell,9670.5,0.003 -binance-futures,BTCUSDT,1582329904142000,1582329904262205,42378547,sell,9671.23,0.017 -binance-futures,BTCUSDT,1582329907116000,1582329907240411,42378548,buy,9670.87,0.031 -binance-futures,BTCUSDT,1582329907116000,1582329907242897,42378549,buy,9670.88,0.031 -binance-futures,BTCUSDT,1582329907116000,1582329907245083,42378550,buy,9670.89,0.031 -binance-futures,BTCUSDT,1582329907116000,1582329907245094,42378551,buy,9671.19,0.335 -binance-futures,BTCUSDT,1582329907116000,1582329907247626,42378552,buy,9671.25,0.572 -binance-futures,BTCUSDT,1582329911038000,1582329911161060,42378553,sell,9670.28,0.186 -binance-futures,BTCUSDT,1582329911065000,1582329911188691,42378554,sell,9670.24,1 -binance-futures,BTCUSDT,1582329911111000,1582329911234449,42378555,sell,9670,0.001 -binance-futures,BTCUSDT,1582329911191000,1582329911332654,42378556,sell,9669.8,0.005 -binance-futures,BTCUSDT,1582329911207000,1582329911345142,42378557,sell,9669.5,0.62 -binance-futures,BTCUSDT,1582329911453000,1582329911573487,42378558,sell,9669.5,0.006 -binance-futures,BTCUSDT,1582329911926000,1582329912053020,42378559,sell,9669.5,1.604 -binance-futures,BTCUSDT,1582329916075000,1582329916194677,42378560,sell,9669,0.01 -binance-futures,BTCUSDT,1582329916227000,1582329916346197,42378561,buy,9669.19,0.029 -binance-futures,BTCUSDT,1582329916227000,1582329916346219,42378562,buy,9669.2,0.031 -binance-futures,BTCUSDT,1582329916227000,1582329916355204,42378563,buy,9669.21,0.031 -binance-futures,BTCUSDT,1582329916227000,1582329916357414,42378564,buy,9669.22,0.031 -binance-futures,BTCUSDT,1582329916227000,1582329916357433,42378565,buy,9669.3,0.005 -binance-futures,BTCUSDT,1582329916227000,1582329916359726,42378566,buy,9669.62,0.204 -binance-futures,BTCUSDT,1582329916227000,1582329916359752,42378567,buy,9670.03,0.069 -binance-futures,BTCUSDT,1582329916996000,1582329917119335,42378568,sell,9669.58,0.031 -binance-futures,BTCUSDT,1582329916996000,1582329917122320,42378569,sell,9669.57,0.031 -binance-futures,BTCUSDT,1582329916996000,1582329917128088,42378570,sell,9669.56,0.031 -binance-futures,BTCUSDT,1582329916996000,1582329917129444,42378571,sell,9669.55,0.031 -binance-futures,BTCUSDT,1582329916996000,1582329917129459,42378572,sell,9669.01,0.012 -binance-futures,BTCUSDT,1582329916996000,1582329917129471,42378573,sell,9669.01,0.002 -binance-futures,BTCUSDT,1582329916996000,1582329917132222,42378574,sell,9669,0.49 -binance-futures,BTCUSDT,1582329917321000,1582329917442181,42378575,buy,9668.97,0.021 -binance-futures,BTCUSDT,1582329919699000,1582329919817614,42378576,buy,9668.97,1.12 -binance-futures,BTCUSDT,1582329919699000,1582329919817750,42378577,buy,9670.32,0.002 -binance-futures,BTCUSDT,1582329919699000,1582329919823332,42378578,buy,9670.32,0.011 -binance-futures,BTCUSDT,1582329919699000,1582329919825637,42378579,buy,9670.33,0.067 -binance-futures,BTCUSDT,1582329920407000,1582329920531858,42378580,sell,9670.35,0.201 -binance-futures,BTCUSDT,1582329920467000,1582329920586473,42378581,buy,9670.38,0.5 -binance-futures,BTCUSDT,1582329920467000,1582329920592238,42378582,buy,9670.56,0.8 -binance-futures,BTCUSDT,1582329922509000,1582329922632375,42378583,sell,9670.55,0.018 -binance-futures,BTCUSDT,1582329922531000,1582329922654763,42378584,sell,9670.55,0.2 -binance-futures,BTCUSDT,1582329923050000,1582329923167237,42378585,buy,9670.56,0.62 -binance-futures,BTCUSDT,1582329928765000,1582329928883557,42378586,buy,9670.61,0.001 -binance-futures,BTCUSDT,1582329929196000,1582329929319515,42378587,sell,9670.6,0.286 -binance-futures,BTCUSDT,1582329933829000,1582329933950480,42378588,sell,9670.1,0.031 -binance-futures,BTCUSDT,1582329933829000,1582329933955081,42378589,sell,9670.09,0.031 -binance-futures,BTCUSDT,1582329933829000,1582329933960953,42378590,sell,9670.08,0.031 -binance-futures,BTCUSDT,1582329933829000,1582329933960966,42378591,sell,9670.06,0.015 -binance-futures,BTCUSDT,1582329933829000,1582329933960969,42378592,sell,9670.06,0.003 -binance-futures,BTCUSDT,1582329933829000,1582329933964729,42378593,sell,9670.05,0.169 -binance-futures,BTCUSDT,1582329938656000,1582329938776625,42378594,buy,9670.08,0.008 -binance-futures,BTCUSDT,1582329942582000,1582329942700259,42378595,buy,9670.08,0.092 -binance-futures,BTCUSDT,1582329942582000,1582329942703510,42378596,buy,9670.09,0.204 -binance-futures,BTCUSDT,1582329942582000,1582329942708095,42378597,buy,9670.2,0.005 -binance-futures,BTCUSDT,1582329942582000,1582329942711689,42378598,buy,9670.33,0.82 -binance-futures,BTCUSDT,1582329943544000,1582329943661494,42378599,sell,9670.32,0.19 -binance-futures,BTCUSDT,1582329946227000,1582329946347413,42378600,buy,9670.33,0.18 -binance-futures,BTCUSDT,1582329946227000,1582329946351841,42378601,buy,9670.33,0.1 -binance-futures,BTCUSDT,1582329946227000,1582329946353530,42378602,buy,9670.59,0.003 -binance-futures,BTCUSDT,1582329946227000,1582329946355657,42378603,buy,9670.59,0.017 -binance-futures,BTCUSDT,1582329946227000,1582329946357016,42378604,buy,9670.6,0.2 -binance-futures,BTCUSDT,1582329948697000,1582329948821532,42378605,buy,9670.6,0.092 -binance-futures,BTCUSDT,1582329952479000,1582329952598803,42378606,buy,9670.6,0.047 -binance-futures,BTCUSDT,1582329952479000,1582329952599166,42378607,buy,9670.6,0.1 -binance-futures,BTCUSDT,1582329952479000,1582329952600730,42378608,buy,9670.67,0.001 -binance-futures,BTCUSDT,1582329952479000,1582329952605923,42378609,buy,9670.68,0.3 -binance-futures,BTCUSDT,1582329952479000,1582329952611993,42378610,buy,9670.8,0.005 -binance-futures,BTCUSDT,1582329952682000,1582329952802372,42378611,buy,9671.24,0.683 -binance-futures,BTCUSDT,1582329952724000,1582329952843635,42378612,buy,9671.4,0.103 -binance-futures,BTCUSDT,1582329954533000,1582329954656205,42378613,sell,9671.39,0.1 -binance-futures,BTCUSDT,1582329955159000,1582329955318430,42378614,sell,9671.39,0.039 -binance-futures,BTCUSDT,1582329956031000,1582329956149522,42378615,buy,9671.4,0.197 -binance-futures,BTCUSDT,1582329956031000,1582329956152908,42378616,buy,9671.4,0.1 -binance-futures,BTCUSDT,1582329956031000,1582329956152917,42378617,buy,9671.68,0.067 -binance-futures,BTCUSDT,1582329956031000,1582329956156344,42378618,buy,9672.17,0.206 -binance-futures,BTCUSDT,1582329956319000,1582329956443433,42378619,buy,9672,0.005 -binance-futures,BTCUSDT,1582329956320000,1582329956454711,42378620,buy,9672.17,3.771 -binance-futures,BTCUSDT,1582329956339000,1582329956464940,42378621,buy,9672.17,0.206 -binance-futures,BTCUSDT,1582329956362000,1582329956487133,42378622,buy,9673.06,4.605 -binance-futures,BTCUSDT,1582329956393000,1582329956517661,42378623,buy,9673.33,0.683 -binance-futures,BTCUSDT,1582329956446000,1582329956568273,42378624,buy,9674.37,0.05 -binance-futures,BTCUSDT,1582329956446000,1582329956572216,42378625,buy,9674.37,0.5 -binance-futures,BTCUSDT,1582329956446000,1582329956574360,42378626,buy,9674.37,1.45 -binance-futures,BTCUSDT,1582329956449000,1582329956574370,42378627,buy,9674.37,3.473 -binance-futures,BTCUSDT,1582329956479000,1582329956603199,42378628,buy,9674.65,0.15 -binance-futures,BTCUSDT,1582329956533000,1582329956669056,42378629,buy,9675.16,0.065 -binance-futures,BTCUSDT,1582329956533000,1582329956671973,42378630,buy,9675.17,0.24 -binance-futures,BTCUSDT,1582329956589000,1582329956723979,42378631,buy,9675.34,3.249 -binance-futures,BTCUSDT,1582329956623000,1582329956747106,42378632,buy,9675.34,1.183 -binance-futures,BTCUSDT,1582329956623000,1582329956749143,42378633,buy,9675.46,0.5 -binance-futures,BTCUSDT,1582329956659000,1582329956790918,42378634,buy,9675.66,1 -binance-futures,BTCUSDT,1582329956659000,1582329956796553,42378635,buy,9676.25,0.012 -binance-futures,BTCUSDT,1582329956659000,1582329956799004,42378636,buy,9676.33,0.15 -binance-futures,BTCUSDT,1582329956761000,1582329956888766,42378637,sell,9675.56,0.029 -binance-futures,BTCUSDT,1582329956982000,1582329957110214,42378638,buy,9675.66,0.001 -binance-futures,BTCUSDT,1582329957857000,1582329957977629,42378639,buy,9675.66,0.76 -binance-futures,BTCUSDT,1582329958284000,1582329958419974,42378640,sell,9675.65,0.01 -binance-futures,BTCUSDT,1582329959693000,1582329959822738,42378641,buy,9675.66,0.204 -binance-futures,BTCUSDT,1582329959734000,1582329959854699,42378642,buy,9675.66,1.131 -binance-futures,BTCUSDT,1582329959734000,1582329959854751,42378643,buy,9675.92,0.1 -binance-futures,BTCUSDT,1582329959832000,1582329959954977,42378644,buy,9676.47,0.123 -binance-futures,BTCUSDT,1582329968413000,1582329968532782,42378645,sell,9676.46,0.008 -binance-futures,BTCUSDT,1582329969777000,1582329969896819,42378646,sell,9676.46,0.001 -binance-futures,BTCUSDT,1582329969885000,1582329970006419,42378647,sell,9676.46,0.011 -binance-futures,BTCUSDT,1582329969973000,1582329970099699,42378648,buy,9676.47,0.176 -binance-futures,BTCUSDT,1582329969987000,1582329970108920,42378649,buy,9676.47,0.383 -binance-futures,BTCUSDT,1582329969987000,1582329970108930,42378650,buy,9676.47,0.1 -binance-futures,BTCUSDT,1582329969987000,1582329970108945,42378651,buy,9676.47,0.1 -binance-futures,BTCUSDT,1582329969987000,1582329970109449,42378652,buy,9676.47,0.417 -binance-futures,BTCUSDT,1582329972311000,1582329972434816,42378653,sell,9676.55,0.361 -binance-futures,BTCUSDT,1582329974174000,1582329974299652,42378654,buy,9676.6,0.005 -binance-futures,BTCUSDT,1582329974174000,1582329974300792,42378655,buy,9676.6,0.006 -binance-futures,BTCUSDT,1582329976487000,1582329976612334,42378656,sell,9676.59,0.1 -binance-futures,BTCUSDT,1582329977092000,1582329977218423,42378657,buy,9676.47,0.4 -binance-futures,BTCUSDT,1582329978514000,1582329978637721,42378658,sell,9676.46,0.02 -binance-futures,BTCUSDT,1582329983158000,1582329983279787,42378659,buy,9676.47,0.1 -binance-futures,BTCUSDT,1582329983158000,1582329983280770,42378660,buy,9676.5,0.005 -binance-futures,BTCUSDT,1582329983158000,1582329983284664,42378661,buy,9676.95,0.682 -binance-futures,BTCUSDT,1582329983158000,1582329983290083,42378662,buy,9677.53,0.19 -binance-futures,BTCUSDT,1582329983158000,1582329983290089,42378663,buy,9677.55,2.789 -binance-futures,BTCUSDT,1582329983158000,1582329983294444,42378664,buy,9678.09,0.047 -binance-futures,BTCUSDT,1582329983158000,1582329983296681,42378665,buy,9678.19,0.371 -binance-futures,BTCUSDT,1582329983158000,1582329983300677,42378666,buy,9678.29,0.012 -binance-futures,BTCUSDT,1582329983158000,1582329983300686,42378667,buy,9678.39,0.15 -binance-futures,BTCUSDT,1582329983158000,1582329983301844,42378668,buy,9678.55,0.04 -binance-futures,BTCUSDT,1582329983158000,1582329983302351,42378669,buy,9678.59,0.047 -binance-futures,BTCUSDT,1582329983158000,1582329983302357,42378670,buy,9678.62,0.181 -binance-futures,BTCUSDT,1582329983206000,1582329983343827,42378671,sell,9676.47,1.29 -binance-futures,BTCUSDT,1582329983322000,1582329983444351,42378672,sell,9676.46,0.72 -binance-futures,BTCUSDT,1582329988731000,1582329988857926,42378673,sell,9676.46,0.03 -binance-futures,BTCUSDT,1582329988731000,1582329988857939,42378674,sell,9676.46,0.141 -binance-futures,BTCUSDT,1582329989250000,1582329989373502,42378675,buy,9676.47,0.005 -binance-futures,BTCUSDT,1582329989731000,1582329989853966,42378676,buy,9676.47,0.095 -binance-futures,BTCUSDT,1582329989731000,1582329989853975,42378677,buy,9676.6,0.005 -binance-futures,BTCUSDT,1582329993067000,1582329993186086,42378678,buy,9678.59,1 -binance-futures,BTCUSDT,1582329993067000,1582329993187468,42378679,buy,9678.59,0.031 -binance-futures,BTCUSDT,1582329993067000,1582329993189417,42378680,buy,9678.59,0.969 -binance-futures,BTCUSDT,1582329996891000,1582329997023711,42378681,sell,9678.3,0.005 -binance-futures,BTCUSDT,1582329996891000,1582329997023715,42378682,sell,9678.22,0.003 -binance-futures,BTCUSDT,1582329997009000,1582329997135554,42378683,buy,9678.01,0.1 -binance-futures,BTCUSDT,1582329998166000,1582329998287883,42378684,buy,9678.01,0.113 -binance-futures,BTCUSDT,1582329999519000,1582329999646473,42378685,buy,9678.01,0.1 -binance-futures,BTCUSDT,1582329999519000,1582329999648100,42378686,buy,9678.01,0.015 -binance-futures,BTCUSDT,1582329999519000,1582329999648106,42378687,buy,9678.05,0.031 -binance-futures,BTCUSDT,1582329999519000,1582329999656440,42378688,buy,9678.06,0.031 -binance-futures,BTCUSDT,1582329999519000,1582329999658952,42378689,buy,9678.34,0.077 -binance-futures,BTCUSDT,1582329999519000,1582329999658961,42378690,buy,9679,0.01 -binance-futures,BTCUSDT,1582329999519000,1582329999661074,42378691,buy,9679.04,0.002 -binance-futures,BTCUSDT,1582329999519000,1582329999662179,42378692,buy,9679.05,0.734 -binance-futures,BTCUSDT,1582329999982000,1582330000103000,42378693,buy,9678.37,0.031 -binance-futures,BTCUSDT,1582329999982000,1582330000103009,42378694,buy,9678.37,0.02 -binance-futures,BTCUSDT,1582330001741000,1582330001862690,42378695,sell,9679.09,0.001 -binance-futures,BTCUSDT,1582330005940000,1582330006065393,42378696,buy,9678.6,0.24 -binance-futures,BTCUSDT,1582330008562000,1582330008682928,42378697,buy,9678.6,0.02 -binance-futures,BTCUSDT,1582330011176000,1582330011298261,42378698,sell,9678.59,0.07 -binance-futures,BTCUSDT,1582330011225000,1582330011370779,42378699,sell,9678.1,0.005 -binance-futures,BTCUSDT,1582330011291000,1582330011427200,42378700,sell,9678,0.001 -binance-futures,BTCUSDT,1582330011291000,1582330011427207,42378701,sell,9678,0.029 -binance-futures,BTCUSDT,1582330011303000,1582330011428229,42378702,sell,9678,0.214 -binance-futures,BTCUSDT,1582330011345000,1582330011472889,42378703,sell,9677.23,2 -binance-futures,BTCUSDT,1582330011348000,1582330011472960,42378704,sell,9677.23,2 -binance-futures,BTCUSDT,1582330011351000,1582330011474763,42378705,sell,9677.23,0.845 -binance-futures,BTCUSDT,1582330011379000,1582330011504792,42378706,sell,9676.46,0.859 -binance-futures,BTCUSDT,1582330011379000,1582330011506397,42378707,sell,9676.46,0.686 -binance-futures,BTCUSDT,1582330011379000,1582330011506405,42378708,sell,9676.46,0.455 -binance-futures,BTCUSDT,1582330011384000,1582330011506977,42378709,sell,9676.46,2 -binance-futures,BTCUSDT,1582330011386000,1582330011509503,42378710,sell,9676.46,1.425 -binance-futures,BTCUSDT,1582330011948000,1582330012072923,42378711,sell,9675.71,0.005 -binance-futures,BTCUSDT,1582330012968000,1582330013093833,42378712,sell,9675.7,0.001 -binance-futures,BTCUSDT,1582330015871000,1582330015993783,42378713,buy,9675.8,1 -binance-futures,BTCUSDT,1582330017683000,1582330017805729,42378714,buy,9675.8,0.005 -binance-futures,BTCUSDT,1582330021972000,1582330022095646,42378715,buy,9676.49,0.1 -binance-futures,BTCUSDT,1582330021972000,1582330022095652,42378716,buy,9676.6,0.005 -binance-futures,BTCUSDT,1582330021972000,1582330022101336,42378717,buy,9678.1,1.109 -binance-futures,BTCUSDT,1582330022154000,1582330022279703,42378718,buy,9678.09,0.001 -binance-futures,BTCUSDT,1582330025699000,1582330025823406,42378719,sell,9678.44,0.026 -binance-futures,BTCUSDT,1582330026899000,1582330027021134,42378720,sell,9678.58,0.006 -binance-futures,BTCUSDT,1582330027056000,1582330027180286,42378721,buy,9678.59,0.001 -binance-futures,BTCUSDT,1582330027215000,1582330027336437,42378722,sell,9678.58,0.004 -binance-futures,BTCUSDT,1582330030143000,1582330030265260,42378723,buy,9678.04,0.1 -binance-futures,BTCUSDT,1582330030143000,1582330030265263,42378724,buy,9678.2,0.005 -binance-futures,BTCUSDT,1582330030143000,1582330030276356,42378725,buy,9678.38,0.049 -binance-futures,BTCUSDT,1582330030143000,1582330030281327,42378726,buy,9678.59,0.015 -binance-futures,BTCUSDT,1582330030143000,1582330030281357,42378727,buy,9678.72,2.077 -binance-futures,BTCUSDT,1582330033932000,1582330034068215,42378728,sell,9678.02,0.006 -binance-futures,BTCUSDT,1582330034553000,1582330034679307,42378729,sell,9677.3,0.005 -binance-futures,BTCUSDT,1582330034553000,1582330034679702,42378730,sell,9677.17,0.245 -binance-futures,BTCUSDT,1582330035310000,1582330035431887,42378731,buy,9677.18,0.1 -binance-futures,BTCUSDT,1582330035310000,1582330035436462,42378732,buy,9678.64,0.9 -binance-futures,BTCUSDT,1582330038796000,1582330038919341,42378733,buy,9677.1,0.005 -binance-futures,BTCUSDT,1582330038796000,1582330038920423,42378734,buy,9677.1,0.043 -binance-futures,BTCUSDT,1582330039047000,1582330039174584,42378735,sell,9676.85,0.51 -binance-futures,BTCUSDT,1582330039074000,1582330039199958,42378736,sell,9676.85,0.174 -binance-futures,BTCUSDT,1582330039108000,1582330039234934,42378737,sell,9676.56,2 -binance-futures,BTCUSDT,1582330039131000,1582330039253944,42378738,sell,9676.56,0.926 -binance-futures,BTCUSDT,1582330039152000,1582330039273701,42378739,sell,9676.3,0.005 -binance-futures,BTCUSDT,1582330039172000,1582330039297127,42378740,sell,9676,0.052 -binance-futures,BTCUSDT,1582330041237000,1582330041629821,42378741,buy,9675.85,0.012 -binance-futures,BTCUSDT,1582330051212000,1582330051341315,42378742,sell,9675.56,0.001 -binance-futures,BTCUSDT,1582330058641000,1582330058763060,42378743,sell,9675.56,0.45 -binance-futures,BTCUSDT,1582330058641000,1582330058772006,42378744,sell,9675.52,2.193 -binance-futures,BTCUSDT,1582330060417000,1582330060543880,42378745,buy,9675.5,0.005 -binance-futures,BTCUSDT,1582330060417000,1582330060544252,42378746,buy,9676.74,0.005 -binance-futures,BTCUSDT,1582330063361000,1582330063484143,42378747,buy,9675.38,0.1 -binance-futures,BTCUSDT,1582330063361000,1582330063485895,42378748,buy,9675.38,0.204 -binance-futures,BTCUSDT,1582330063361000,1582330063485902,42378749,buy,9676.55,0.72 -binance-futures,BTCUSDT,1582330069480000,1582330069600925,42378750,buy,9676.2,0.005 -binance-futures,BTCUSDT,1582330070060000,1582330070187431,42378751,buy,9677.19,0.64 -binance-futures,BTCUSDT,1582330070342000,1582330070465877,42378752,buy,9677.19,0.124 -binance-futures,BTCUSDT,1582330070442000,1582330070564314,42378753,buy,9677.19,0.155 -binance-futures,BTCUSDT,1582330070463000,1582330070587864,42378754,buy,9677.19,1.494 -binance-futures,BTCUSDT,1582330070514000,1582330070641926,42378755,buy,9677.53,0.31 -binance-futures,BTCUSDT,1582330070584000,1582330070710296,42378756,buy,9677.53,0.031 -binance-futures,BTCUSDT,1582330070592000,1582330070717400,42378757,buy,9677.53,1.36 -binance-futures,BTCUSDT,1582330070612000,1582330070734104,42378758,buy,9677.53,0.65 -binance-futures,BTCUSDT,1582330071925000,1582330072049257,42378759,sell,9677.91,0.011 -binance-futures,BTCUSDT,1582330072034000,1582330072155766,42378760,buy,9677.92,0.001 -binance-futures,BTCUSDT,1582330072223000,1582330072357379,42378761,sell,9677.91,0.006 -binance-futures,BTCUSDT,1582330080547000,1582330080670295,42378762,buy,9677.21,1.453 -binance-futures,BTCUSDT,1582330081097000,1582330081223506,42378763,sell,9677.2,0.001 -binance-futures,BTCUSDT,1582330081159000,1582330081281633,42378764,sell,9677.2,0.004 -binance-futures,BTCUSDT,1582330081452000,1582330081575735,42378765,buy,9676.14,0.048 -binance-futures,BTCUSDT,1582330082406000,1582330082533267,42378766,buy,9676.97,0.031 -binance-futures,BTCUSDT,1582330082406000,1582330082533274,42378767,buy,9676.98,0.031 -binance-futures,BTCUSDT,1582330082406000,1582330082539929,42378768,buy,9676.99,0.031 -binance-futures,BTCUSDT,1582330082406000,1582330082542738,42378769,buy,9677,0.092 -binance-futures,BTCUSDT,1582330083730000,1582330083854626,42378770,buy,9676.8,0.009 -binance-futures,BTCUSDT,1582330084655000,1582330084778172,42378771,buy,9677.9,0.005 -binance-futures,BTCUSDT,1582330084655000,1582330084780495,42378772,buy,9677.92,0.001 -binance-futures,BTCUSDT,1582330084655000,1582330084785241,42378773,buy,9678,0.004 -binance-futures,BTCUSDT,1582330086275000,1582330086403670,42378774,buy,9678,0.001 -binance-futures,BTCUSDT,1582330086275000,1582330086403673,42378775,buy,9678.4,0.999 -binance-futures,BTCUSDT,1582330096882000,1582330097005215,42378776,buy,9678.64,0.001 -binance-futures,BTCUSDT,1582330096986000,1582330097121259,42378777,buy,9678.64,0.682 -binance-futures,BTCUSDT,1582330096986000,1582330097121264,42378778,buy,9678.64,0.1 -binance-futures,BTCUSDT,1582330097020000,1582330097144109,42378779,buy,9678.8,0.005 -binance-futures,BTCUSDT,1582330097044000,1582330097172235,42378780,buy,9678.91,0.682 -binance-futures,BTCUSDT,1582330097348000,1582330097474822,42378781,buy,9680,0.01 -binance-futures,BTCUSDT,1582330097511000,1582330097634274,42378782,buy,9680.55,0.141 -binance-futures,BTCUSDT,1582330099095000,1582330099216605,42378783,buy,9681,0.001 -binance-futures,BTCUSDT,1582330099224000,1582330099345839,42378784,sell,9680.99,0.02 -binance-futures,BTCUSDT,1582330111071000,1582330111191862,42378785,sell,9680.99,0.001 -binance-futures,BTCUSDT,1582330112573000,1582330112694603,42378786,buy,9681,0.009 -binance-futures,BTCUSDT,1582330112573000,1582330112696199,42378787,buy,9681,0.1 -binance-futures,BTCUSDT,1582330112573000,1582330112696208,42378788,buy,9681.1,0.005 -binance-futures,BTCUSDT,1582330115377000,1582330115498904,42378789,sell,9681.2,0.031 -binance-futures,BTCUSDT,1582330115377000,1582330115499559,42378790,sell,9681.2,0.466 -binance-futures,BTCUSDT,1582330115377000,1582330115499621,42378791,sell,9681.19,0.031 -binance-futures,BTCUSDT,1582330115377000,1582330115504201,42378792,sell,9681.18,0.031 -binance-futures,BTCUSDT,1582330115377000,1582330115509474,42378793,sell,9681.17,0.031 -binance-futures,BTCUSDT,1582330115377000,1582330115509488,42378794,sell,9681.11,0.086 -binance-futures,BTCUSDT,1582330115377000,1582330115513556,42378795,sell,9681.1,1.025 -binance-futures,BTCUSDT,1582330116565000,1582330116687008,42378796,sell,9681.1,0.148 -binance-futures,BTCUSDT,1582330118385000,1582330118510340,42378797,buy,9681,0.1 -binance-futures,BTCUSDT,1582330119789000,1582330119914342,42378798,buy,9681,1.755 -binance-futures,BTCUSDT,1582330120021000,1582330120144655,42378799,buy,9681,0.002 -binance-futures,BTCUSDT,1582330121720000,1582330121841176,42378800,buy,9681,0.098 -binance-futures,BTCUSDT,1582330121720000,1582330121841182,42378801,buy,9681,0.102 -binance-futures,BTCUSDT,1582330122107000,1582330122227484,42378802,buy,9681,0.159 -binance-futures,BTCUSDT,1582330123747000,1582330123867153,42378803,sell,9680.99,0.009 -binance-futures,BTCUSDT,1582330123747000,1582330123868642,42378804,sell,9680.55,0.074 -binance-futures,BTCUSDT,1582330125116000,1582330125239727,42378805,sell,9680.73,0.003 -binance-futures,BTCUSDT,1582330126827000,1582330126951656,42378806,buy,9681.1,0.277 -binance-futures,BTCUSDT,1582330127096000,1582330127214313,42378807,buy,9681.1,0.009 -binance-futures,BTCUSDT,1582330133272000,1582330133390019,42378808,buy,9681.06,0.019 -binance-futures,BTCUSDT,1582330138694000,1582330138817496,42378809,buy,9681.06,0.001 -binance-futures,BTCUSDT,1582330139425000,1582330139545725,42378810,buy,9681.06,0.08 -binance-futures,BTCUSDT,1582330139425000,1582330139546770,42378811,buy,9681.1,0.034 -binance-futures,BTCUSDT,1582330140758000,1582330140877809,42378812,sell,9681.09,0.02 -binance-futures,BTCUSDT,1582330142422000,1582330142544031,42378813,sell,9681.05,0.065 -binance-futures,BTCUSDT,1582330142422000,1582330142545342,42378814,sell,9681.02,1.295 -binance-futures,BTCUSDT,1582330142444000,1582330142567780,42378815,sell,9681.02,2 -binance-futures,BTCUSDT,1582330142461000,1582330142582251,42378816,sell,9681.02,1.284 -binance-futures,BTCUSDT,1582330142484000,1582330142611808,42378817,sell,9680.04,0.686 -binance-futures,BTCUSDT,1582330142484000,1582330142611823,42378818,sell,9680,0.005 -binance-futures,BTCUSDT,1582330146679000,1582330146802674,42378819,buy,9680.43,0.013 -binance-futures,BTCUSDT,1582330149516000,1582330149634929,42378820,sell,9680.44,0.125 -binance-futures,BTCUSDT,1582330150692000,1582330150816759,42378821,buy,9680.45,0.682 -binance-futures,BTCUSDT,1582330150692000,1582330150816770,42378822,buy,9680.45,0.974 -binance-futures,BTCUSDT,1582330155640000,1582330155759259,42378823,sell,9679.66,0.07 -binance-futures,BTCUSDT,1582330158376000,1582330158497160,42378824,sell,9680.52,0.02 -binance-futures,BTCUSDT,1582330161352000,1582330161477038,42378825,buy,9680.97,0.1 -binance-futures,BTCUSDT,1582330161352000,1582330161477045,42378826,buy,9681,0.001 -binance-futures,BTCUSDT,1582330161520000,1582330161639679,42378827,buy,9681.1,1.226 -binance-futures,BTCUSDT,1582330161520000,1582330161639964,42378828,buy,9681.21,0.04 -binance-futures,BTCUSDT,1582330162215000,1582330162335125,42378829,buy,9681.64,0.04 -binance-futures,BTCUSDT,1582330164358000,1582330164576746,42378830,buy,9682.05,0.001 -binance-futures,BTCUSDT,1582330170416000,1582330170537493,42378831,sell,9682.04,0.031 -binance-futures,BTCUSDT,1582330170416000,1582330170537708,42378832,sell,9682.04,0.022 -binance-futures,BTCUSDT,1582330170416000,1582330170537714,42378833,sell,9682.03,0.031 -binance-futures,BTCUSDT,1582330170416000,1582330170541940,42378834,sell,9682.03,0.031 -binance-futures,BTCUSDT,1582330172015000,1582330172136023,42378835,sell,9681.94,0.01 -binance-futures,BTCUSDT,1582330173093000,1582330173212664,42378836,buy,9681.95,0.172 -binance-futures,BTCUSDT,1582330173093000,1582330173219834,42378837,buy,9681.96,0.031 -binance-futures,BTCUSDT,1582330173093000,1582330173222627,42378838,buy,9681.97,0.031 -binance-futures,BTCUSDT,1582330173093000,1582330173223798,42378839,buy,9681.98,0.031 -binance-futures,BTCUSDT,1582330173093000,1582330173225070,42378840,buy,9681.99,0.031 -binance-futures,BTCUSDT,1582330173093000,1582330173226724,42378841,buy,9682.04,0.004 -binance-futures,BTCUSDT,1582330173176000,1582330173305045,42378842,sell,9681.96,0.04 -binance-futures,BTCUSDT,1582330175905000,1582330176024590,42378843,sell,9682.03,0.042 -binance-futures,BTCUSDT,1582330176393000,1582330176515337,42378844,buy,9682.04,0.096 -binance-futures,BTCUSDT,1582330176393000,1582330176515344,42378845,buy,9682.05,0.011 -binance-futures,BTCUSDT,1582330176393000,1582330176519204,42378846,buy,9682.61,0.893 -binance-futures,BTCUSDT,1582330176497000,1582330176617392,42378847,sell,9682.36,0.049 -binance-futures,BTCUSDT,1582330178749000,1582330178872412,42378848,sell,9682.97,0.002 -binance-futures,BTCUSDT,1582330179094000,1582330179217428,42378849,sell,9682.97,0.001 -binance-futures,BTCUSDT,1582330184623000,1582330184744957,42378850,buy,9682.98,0.04 -binance-futures,BTCUSDT,1582330184623000,1582330184744964,42378851,buy,9683,0.001 -binance-futures,BTCUSDT,1582330184623000,1582330184745548,42378852,buy,9683,0.01 -binance-futures,BTCUSDT,1582330184623000,1582330184751942,42378853,buy,9683.44,0.14 -binance-futures,BTCUSDT,1582330184623000,1582330184751957,42378854,buy,9683.45,0.809 -binance-futures,BTCUSDT,1582330188791000,1582330188914013,42378855,sell,9683.02,0.01 -binance-futures,BTCUSDT,1582330191948000,1582330192068273,42378856,buy,9683.52,0.04 -binance-futures,BTCUSDT,1582330191948000,1582330192068466,42378857,buy,9683.52,0.04 -binance-futures,BTCUSDT,1582330193538000,1582330193658050,42378858,buy,9683.91,0.047 -binance-futures,BTCUSDT,1582330193538000,1582330193658059,42378859,buy,9683.91,0.1 -binance-futures,BTCUSDT,1582330193538000,1582330193658163,42378860,buy,9684,0.01 -binance-futures,BTCUSDT,1582330193538000,1582330193658405,42378861,buy,9684.11,0.012 -binance-futures,BTCUSDT,1582330193538000,1582330193661340,42378862,buy,9684.2,0.52 -binance-futures,BTCUSDT,1582330193905000,1582330194027638,42378863,buy,9684.32,0.86 -binance-futures,BTCUSDT,1582330193956000,1582330194077660,42378864,buy,9684.32,0.5 -binance-futures,BTCUSDT,1582330194447000,1582330194569900,42378865,buy,9684.32,0.67 -binance-futures,BTCUSDT,1582330194454000,1582330194576386,42378866,buy,9684.32,0.15 -binance-futures,BTCUSDT,1582330194483000,1582330194602467,42378867,buy,9684.32,0.67 -binance-futures,BTCUSDT,1582330195124000,1582330195246849,42378868,buy,9684.39,0.047 -binance-futures,BTCUSDT,1582330195124000,1582330195246856,42378869,buy,9684.66,0.005 -binance-futures,BTCUSDT,1582330195171000,1582330195297188,42378870,buy,9685,2 -binance-futures,BTCUSDT,1582330195194000,1582330195315939,42378871,buy,9685,0.453 -binance-futures,BTCUSDT,1582330195214000,1582330195336011,42378872,buy,9685.36,3.201 -binance-futures,BTCUSDT,1582330195233000,1582330195356257,42378873,buy,9685.36,1.399 -binance-futures,BTCUSDT,1582330195262000,1582330195393740,42378874,buy,9685.89,0.5 -binance-futures,BTCUSDT,1582330195262000,1582330195396019,42378875,buy,9685.89,1.5 -binance-futures,BTCUSDT,1582330195268000,1582330195397662,42378876,buy,9685.52,2 -binance-futures,BTCUSDT,1582330195270000,1582330195404744,42378877,buy,9685.52,0.486 -binance-futures,BTCUSDT,1582330195270000,1582330195404747,42378878,buy,9685.92,0.067 -binance-futures,BTCUSDT,1582330195270000,1582330195405864,42378879,buy,9685.94,0.005 -binance-futures,BTCUSDT,1582330195301000,1582330195430685,42378880,buy,9686,0.001 -binance-futures,BTCUSDT,1582330195305000,1582330195434926,42378881,buy,9686.05,0.038 -binance-futures,BTCUSDT,1582330195996000,1582330196121626,42378882,buy,9686.85,0.05 -binance-futures,BTCUSDT,1582330195996000,1582330196122121,42378883,buy,9686.85,10 -binance-futures,BTCUSDT,1582330196475000,1582330196597505,42378884,sell,9686.84,0.048 -binance-futures,BTCUSDT,1582330196578000,1582330196701630,42378885,buy,9686.85,0.002 -binance-futures,BTCUSDT,1582330197867000,1582330197990405,42378886,sell,9686.54,0.002 -binance-futures,BTCUSDT,1582330197881000,1582330198007688,42378887,sell,9686.54,0.001 -binance-futures,BTCUSDT,1582330198722000,1582330198841307,42378888,sell,9686.84,0.001 -binance-futures,BTCUSDT,1582330201099000,1582330201224623,42378889,sell,9686.84,0.001 -binance-futures,BTCUSDT,1582330202563000,1582330202682096,42378890,sell,9686.84,0.029 -binance-futures,BTCUSDT,1582330202563000,1582330202682106,42378891,sell,9686.84,0.001 -binance-futures,BTCUSDT,1582330204171000,1582330204290106,42378892,buy,9686.85,0.591 -binance-futures,BTCUSDT,1582330205447000,1582330205570340,42378893,buy,9686.85,0.11 -binance-futures,BTCUSDT,1582330210887000,1582330211004505,42378894,sell,9686.84,0.001 -binance-futures,BTCUSDT,1582330211315000,1582330211433910,42378895,buy,9686.85,0.005 -binance-futures,BTCUSDT,1582330211993000,1582330212113921,42378896,buy,9686.85,0.249 -binance-futures,BTCUSDT,1582330212247000,1582330212371323,42378897,buy,9686.85,1 -binance-futures,BTCUSDT,1582330213286000,1582330213407627,42378898,buy,9686.85,0.001 -binance-futures,BTCUSDT,1582330213398000,1582330213519526,42378899,buy,9686.85,0.317 -binance-futures,BTCUSDT,1582330216600000,1582330216722954,42378900,buy,9686.85,0.619 -binance-futures,BTCUSDT,1582330217650000,1582330217770851,42378901,buy,9686.85,0.006 -binance-futures,BTCUSDT,1582330219563000,1582330219683927,42378902,buy,9686.85,0.01 -binance-futures,BTCUSDT,1582330219563000,1582330219683935,42378903,buy,9686.85,0.71 -binance-futures,BTCUSDT,1582330219601000,1582330219721445,42378904,buy,9686.85,0.6 -binance-futures,BTCUSDT,1582330219728000,1582330219849190,42378905,buy,9686.85,0.78 -binance-futures,BTCUSDT,1582330219800000,1582330219921454,42378906,buy,9686.85,0.49 -binance-futures,BTCUSDT,1582330221685000,1582330221804423,42378907,sell,9686.84,0.025 -binance-futures,BTCUSDT,1582330224450000,1582330224566993,42378908,sell,9686.84,0.006 -binance-futures,BTCUSDT,1582330227725000,1582330227848997,42378909,sell,9686.84,0.006 -binance-futures,BTCUSDT,1582330227855000,1582330227977256,42378910,buy,9686.85,0.619 -binance-futures,BTCUSDT,1582330228007000,1582330228127242,42378911,buy,9686.85,0.276 -binance-futures,BTCUSDT,1582330229766000,1582330229885872,42378912,buy,9686.85,0.001 -binance-futures,BTCUSDT,1582330232089000,1582330232209509,42378913,buy,9686.85,0.001 -binance-futures,BTCUSDT,1582330236527000,1582330236643261,42378914,buy,9686.85,0.021 -binance-futures,BTCUSDT,1582330237220000,1582330237341656,42378915,buy,9686.85,4.362 -binance-futures,BTCUSDT,1582330239135000,1582330239259630,42378916,buy,9686.85,0.997 -binance-futures,BTCUSDT,1582330239327000,1582330239448678,42378917,buy,9686.85,0.5 -binance-futures,BTCUSDT,1582330240646000,1582330240769833,42378918,buy,9686.85,0.031 -binance-futures,BTCUSDT,1582330243217000,1582330243338405,42378919,buy,9686.85,2 -binance-futures,BTCUSDT,1582330243236000,1582330243357298,42378920,buy,9686.85,8.398 -binance-futures,BTCUSDT,1582330243236000,1582330243357334,42378921,buy,9686.85,8 -binance-futures,BTCUSDT,1582330243236000,1582330243357339,42378922,buy,9686.85,2 -binance-futures,BTCUSDT,1582330243236000,1582330243357555,42378923,buy,9686.85,9.243 -binance-futures,BTCUSDT,1582330243238000,1582330243361973,42378924,buy,9686.85,2 -binance-futures,BTCUSDT,1582330243240000,1582330243361977,42378925,buy,9686.85,9.771 -binance-futures,BTCUSDT,1582330243240000,1582330243361982,42378926,buy,9686.85,2 -binance-futures,BTCUSDT,1582330243256000,1582330243377422,42378927,buy,9686.85,4.202 -binance-futures,BTCUSDT,1582330243258000,1582330243381175,42378928,buy,9686.85,4 -binance-futures,BTCUSDT,1582330243261000,1582330243384908,42378929,buy,9686.85,6.776 -binance-futures,BTCUSDT,1582330243263000,1582330243384911,42378930,buy,9686.85,2 -binance-futures,BTCUSDT,1582330243268000,1582330243393284,42378931,buy,9686.85,4 -binance-futures,BTCUSDT,1582330243283000,1582330243403307,42378932,buy,9686.85,2 -binance-futures,BTCUSDT,1582330243483000,1582330243600885,42378933,buy,9686.85,0.1 -binance-futures,BTCUSDT,1582330243491000,1582330243609931,42378934,buy,9686.85,0.01 -binance-futures,BTCUSDT,1582330243627000,1582330243749832,42378935,buy,9686.85,0.249 -binance-futures,BTCUSDT,1582330243672000,1582330243791521,42378936,buy,9686.85,0.017 -binance-futures,BTCUSDT,1582330243703000,1582330243822847,42378937,buy,9686.85,0.29 -binance-futures,BTCUSDT,1582330243748000,1582330243869477,42378938,buy,9686.85,0.215 -binance-futures,BTCUSDT,1582330243764000,1582330243884946,42378939,buy,9686.85,0.068 -binance-futures,BTCUSDT,1582330243852000,1582330243971851,42378940,buy,9686.85,0.134 -binance-futures,BTCUSDT,1582330243867000,1582330243988021,42378941,buy,9686.85,0.046 -binance-futures,BTCUSDT,1582330245567000,1582330245691381,42378942,sell,9686.84,1.6 -binance-futures,BTCUSDT,1582330246313000,1582330246433834,42378943,buy,9686.85,5 -binance-futures,BTCUSDT,1582330247763000,1582330247882744,42378944,buy,9686.85,0.875 -binance-futures,BTCUSDT,1582330248850000,1582330248969679,42378945,buy,9686.85,0.832 -binance-futures,BTCUSDT,1582330248986000,1582330249106305,42378946,buy,9686.85,3.375 -binance-futures,BTCUSDT,1582330248990000,1582330249110544,42378947,buy,9686.85,1.15 -binance-futures,BTCUSDT,1582330248991000,1582330249115400,42378948,buy,9686.85,0.05 -binance-futures,BTCUSDT,1582330248996000,1582330249119948,42378949,buy,9686.85,1.5 -binance-futures,BTCUSDT,1582330249006000,1582330249132734,42378950,buy,9686.85,0.55 -binance-futures,BTCUSDT,1582330249031000,1582330249153859,42378951,buy,9686.85,0.15 -binance-futures,BTCUSDT,1582330249037000,1582330249161896,42378952,buy,9686.85,0.1 -binance-futures,BTCUSDT,1582330249040000,1582330249161908,42378953,buy,9686.85,1 -binance-futures,BTCUSDT,1582330249040000,1582330249165211,42378954,buy,9686.85,0.55 -binance-futures,BTCUSDT,1582330249187000,1582330249306275,42378955,buy,9686.85,0.05 -binance-futures,BTCUSDT,1582330249196000,1582330249320847,42378956,buy,9686.85,0.85 -binance-futures,BTCUSDT,1582330249198000,1582330249320864,42378957,buy,9686.85,0.9 -binance-futures,BTCUSDT,1582330249207000,1582330249328690,42378958,buy,9686.85,0.1 -binance-futures,BTCUSDT,1582330249484000,1582330249604076,42378959,buy,9686.85,6.541 -binance-futures,BTCUSDT,1582330249502000,1582330249622403,42378960,buy,9686.85,3 -binance-futures,BTCUSDT,1582330249502000,1582330249627229,42378961,buy,9686.85,0.4 -binance-futures,BTCUSDT,1582330249529000,1582330249651114,42378962,buy,9686.85,0.572 -binance-futures,BTCUSDT,1582330252944000,1582330253062346,42378963,buy,9686.85,0.619 -binance-futures,BTCUSDT,1582330255005000,1582330255129076,42378964,buy,9686.85,0.04 -binance-futures,BTCUSDT,1582330255794000,1582330255916808,42378965,buy,9686.85,0.006 -binance-futures,BTCUSDT,1582330256333000,1582330256459049,42378966,buy,9686.85,0.052 -binance-futures,BTCUSDT,1582330257335000,1582330257454078,42378967,buy,9686.85,0.266 -binance-futures,BTCUSDT,1582330257335000,1582330257458259,42378968,sell,9686.84,0.1 -binance-futures,BTCUSDT,1582330258483000,1582330258603338,42378969,buy,9686.85,0.009 -binance-futures,BTCUSDT,1582330260445000,1582330260566742,42378970,buy,9686.85,0.619 -binance-futures,BTCUSDT,1582330260450000,1582330260574357,42378971,buy,9686.85,1.032 -binance-futures,BTCUSDT,1582330260713000,1582330260838032,42378972,buy,9686.85,2 -binance-futures,BTCUSDT,1582330260875000,1582330260997939,42378973,buy,9686.85,0.052 -binance-futures,BTCUSDT,1582330261081000,1582330261209202,42378974,buy,9686.85,3.004 -binance-futures,BTCUSDT,1582330263817000,1582330263941520,42378975,buy,9686.85,0.031 -binance-futures,BTCUSDT,1582330266560000,1582330266682140,42378976,buy,9686.85,0.041 -binance-futures,BTCUSDT,1582330267217000,1582330267369010,42378977,sell,9686.84,0.001 -binance-futures,BTCUSDT,1582330268714000,1582330268838537,42378978,sell,9686.84,0.981 -binance-futures,BTCUSDT,1582330270814000,1582330270936919,42378979,buy,9686.85,0.03 -binance-futures,BTCUSDT,1582330271381000,1582330271500786,42378980,buy,9686.85,0.019 -binance-futures,BTCUSDT,1582330273021000,1582330273143230,42378981,buy,9686.85,0.2 -binance-futures,BTCUSDT,1582330273578000,1582330273703187,42378982,sell,9686.84,0.001 -binance-futures,BTCUSDT,1582330274292000,1582330274414063,42378983,buy,9686.85,0.206 -binance-futures,BTCUSDT,1582330274295000,1582330274415932,42378984,buy,9686.85,0.604 -binance-futures,BTCUSDT,1582330274295000,1582330274415947,42378985,buy,9686.85,0.206 -binance-futures,BTCUSDT,1582330274299000,1582330274423027,42378986,buy,9686.85,0.206 -binance-futures,BTCUSDT,1582330274898000,1582330275019575,42378987,buy,9686.85,16 -binance-futures,BTCUSDT,1582330275836000,1582330275956957,42378988,buy,9686.85,0.01 -binance-futures,BTCUSDT,1582330278682000,1582330278805212,42378989,buy,9686.85,0.01 -binance-futures,BTCUSDT,1582330280583000,1582330280703978,42378990,buy,9686.85,0.161 -binance-futures,BTCUSDT,1582330281828000,1582330281952215,42378991,sell,9686.84,0.063 -binance-futures,BTCUSDT,1582330283978000,1582330284106226,42378992,sell,9686.84,0.2 -binance-futures,BTCUSDT,1582330284856000,1582330284980497,42378993,buy,9686.85,10 -binance-futures,BTCUSDT,1582330288146000,1582330288269486,42378994,sell,9686.84,0.011 -binance-futures,BTCUSDT,1582330288396000,1582330288519495,42378995,buy,9686.85,0.01 -binance-futures,BTCUSDT,1582330289193000,1582330289336705,42378996,buy,9686.85,0.237 -binance-futures,BTCUSDT,1582330294827000,1582330294953178,42378997,sell,9686.84,0.278 -binance-futures,BTCUSDT,1582330294827000,1582330294953185,42378998,sell,9686.84,0.746 -binance-futures,BTCUSDT,1582330296664000,1582330296787173,42378999,buy,9686.85,0.2 -binance-futures,BTCUSDT,1582330305837000,1582330305963282,42379000,buy,9686.85,0.1 -binance-futures,BTCUSDT,1582330308138000,1582330308261744,42379001,buy,9686.85,0.382 -binance-futures,BTCUSDT,1582330308138000,1582330308261751,42379002,buy,9686.85,0.682 -binance-futures,BTCUSDT,1582330308138000,1582330308262177,42379003,buy,9686.86,0.259 -binance-futures,BTCUSDT,1582330308138000,1582330308268456,42379004,buy,9687,0.1 -binance-futures,BTCUSDT,1582330317060000,1582330317182481,42379005,buy,9687.22,0.223 -binance-futures,BTCUSDT,1582330317145000,1582330317273676,42379006,buy,9687.75,0.004 -binance-futures,BTCUSDT,1582330317145000,1582330317275903,42379007,buy,9687.86,0.012 -binance-futures,BTCUSDT,1582330317145000,1582330317278864,42379008,buy,9687.9,0.005 -binance-futures,BTCUSDT,1582330317145000,1582330317280776,42379009,buy,9687.93,0.04 -binance-futures,BTCUSDT,1582330317145000,1582330317284808,42379010,buy,9688,0.478 -binance-futures,BTCUSDT,1582330317824000,1582330317940159,42379011,buy,9688,0.042 -binance-futures,BTCUSDT,1582330317836000,1582330317959362,42379012,buy,9688,0.285 -binance-futures,BTCUSDT,1582330317881000,1582330318002328,42379013,buy,9688,0.195 -binance-futures,BTCUSDT,1582330317911000,1582330318037110,42379014,buy,9688.39,0.1 -binance-futures,BTCUSDT,1582330317913000,1582330318041526,42379015,buy,9688.46,0.004 -binance-futures,BTCUSDT,1582330317980000,1582330318109384,42379016,buy,9689,0.001 -binance-futures,BTCUSDT,1582330317980000,1582330318109391,42379017,buy,9689,0.263 -binance-futures,BTCUSDT,1582330317980000,1582330318109395,42379018,buy,9689,0.029 -binance-futures,BTCUSDT,1582330317980000,1582330318109398,42379019,buy,9689.09,0.04 -binance-futures,BTCUSDT,1582330317980000,1582330318111531,42379020,buy,9689.34,0.231 -binance-futures,BTCUSDT,1582330318088000,1582330318210970,42379021,buy,9689,0.005 -binance-futures,BTCUSDT,1582330318413000,1582330318532911,42379022,sell,9689.06,2.871 -binance-futures,BTCUSDT,1582330318413000,1582330318539243,42379023,sell,9688.94,0.031 -binance-futures,BTCUSDT,1582330318413000,1582330318539250,42379024,sell,9688.93,0.031 -binance-futures,BTCUSDT,1582330318413000,1582330318543380,42379025,sell,9688.92,0.031 -binance-futures,BTCUSDT,1582330318413000,1582330318543386,42379026,sell,9688.75,0.022 -binance-futures,BTCUSDT,1582330318413000,1582330318547782,42379027,sell,9688.6,0.467 -binance-futures,BTCUSDT,1582330318413000,1582330318547794,42379028,sell,9688.5,0.005 -binance-futures,BTCUSDT,1582330318413000,1582330318547805,42379029,sell,9688.25,0.897 -binance-futures,BTCUSDT,1582330318413000,1582330318547810,42379030,sell,9688.25,0.897 -binance-futures,BTCUSDT,1582330318567000,1582330318689232,42379031,buy,9688,0.04 -binance-futures,BTCUSDT,1582330318799000,1582330318924618,42379032,sell,9687.99,0.001 -binance-futures,BTCUSDT,1582330318806000,1582330318931790,42379033,buy,9688,0.02 -binance-futures,BTCUSDT,1582330319442000,1582330319564647,42379034,buy,9688,0.01 -binance-futures,BTCUSDT,1582330319640000,1582330319761719,42379035,sell,9687.99,0.001 -binance-futures,BTCUSDT,1582330334394000,1582330334516441,42379036,sell,9687.77,1.3 -binance-futures,BTCUSDT,1582330334417000,1582330334538544,42379037,sell,9687.77,1.153 -binance-futures,BTCUSDT,1582330334441000,1582330334566861,42379038,sell,9687.7,0.005 -binance-futures,BTCUSDT,1582330334467000,1582330334590554,42379039,sell,9687.7,1.292 -binance-futures,BTCUSDT,1582330334468000,1582330334592994,42379040,sell,9687.7,0.85 -binance-futures,BTCUSDT,1582330334471000,1582330334592999,42379041,sell,9687.7,0.241 -binance-futures,BTCUSDT,1582330336114000,1582330336237191,42379042,buy,9687.22,0.609 -binance-futures,BTCUSDT,1582330339166000,1582330339288364,42379043,sell,9687.21,0.002 -binance-futures,BTCUSDT,1582330342586000,1582330342703641,42379044,buy,9687.22,0.31 -binance-futures,BTCUSDT,1582330342710000,1582330342827148,42379045,buy,9687.22,0.04 -binance-futures,BTCUSDT,1582330350005000,1582330350127040,42379046,buy,9687.22,0.041 -binance-futures,BTCUSDT,1582330350005000,1582330350133751,42379047,buy,9687.8,0.005 -binance-futures,BTCUSDT,1582330350005000,1582330350133775,42379048,buy,9687.96,0.254 -binance-futures,BTCUSDT,1582330350360000,1582330350484461,42379049,buy,9687.44,0.005 -binance-futures,BTCUSDT,1582330350802000,1582330350922482,42379050,buy,9687.22,0.01 -binance-futures,BTCUSDT,1582330351646000,1582330351768647,42379051,buy,9687.22,0.01 -binance-futures,BTCUSDT,1582330353371000,1582330353491536,42379052,buy,9687.22,0.01 -binance-futures,BTCUSDT,1582330354285000,1582330354408202,42379053,buy,9687.22,0.114 -binance-futures,BTCUSDT,1582330356096000,1582330356232887,42379054,buy,9687.22,0.19 -binance-futures,BTCUSDT,1582330356123000,1582330356247311,42379055,buy,9687.22,0.041 -binance-futures,BTCUSDT,1582330356246000,1582330356364934,42379056,buy,9687.22,0.062 -binance-futures,BTCUSDT,1582330359474000,1582330359595956,42379057,buy,9687.22,0.537 -binance-futures,BTCUSDT,1582330359835000,1582330359953874,42379058,buy,9687.22,0.1 -binance-futures,BTCUSDT,1582330359835000,1582330359953891,42379059,buy,9687.8,0.005 -binance-futures,BTCUSDT,1582330359835000,1582330359960738,42379060,buy,9687.84,0.395 -binance-futures,BTCUSDT,1582330360217000,1582330360338083,42379061,buy,9687.59,0.031 -binance-futures,BTCUSDT,1582330360217000,1582330360338554,42379062,buy,9687.59,0.083 -binance-futures,BTCUSDT,1582330364306000,1582330364425920,42379063,sell,9687.58,0.029 -binance-futures,BTCUSDT,1582330366446000,1582330366566699,42379064,buy,9687.59,0.1 -binance-futures,BTCUSDT,1582330368256000,1582330368395646,42379065,buy,9687.61,0.031 -binance-futures,BTCUSDT,1582330368256000,1582330368395656,42379066,buy,9687.62,0.031 -binance-futures,BTCUSDT,1582330368256000,1582330368396138,42379067,buy,9687.63,0.031 -binance-futures,BTCUSDT,1582330368256000,1582330368396141,42379068,buy,9687.64,0.031 -binance-futures,BTCUSDT,1582330368256000,1582330368396148,42379069,buy,9687.66,0.031 -binance-futures,BTCUSDT,1582330370434000,1582330370556908,42379070,buy,9687.84,0.01 -binance-futures,BTCUSDT,1582330371038000,1582330371157179,42379071,buy,9687.84,0.11 -binance-futures,BTCUSDT,1582330371315000,1582330371431659,42379072,buy,9687.84,0.061 -binance-futures,BTCUSDT,1582330371315000,1582330371431758,42379073,buy,9687.84,0.1 -binance-futures,BTCUSDT,1582330371315000,1582330371431764,42379074,buy,9688,3.761 -binance-futures,BTCUSDT,1582330371330000,1582330371450141,42379075,buy,9688,6.181 -binance-futures,BTCUSDT,1582330373512000,1582330373637410,42379076,sell,9687.99,0.031 -binance-futures,BTCUSDT,1582330373512000,1582330373639000,42379077,sell,9687.98,0.031 -binance-futures,BTCUSDT,1582330373512000,1582330373640679,42379078,sell,9687.83,3.142 -binance-futures,BTCUSDT,1582330373512000,1582330373642675,42379079,sell,9687.77,5.707 -binance-futures,BTCUSDT,1582330377041000,1582330377162164,42379080,sell,9687.6,0.005 -binance-futures,BTCUSDT,1582330377041000,1582330377162177,42379081,sell,9687.55,0.018 -binance-futures,BTCUSDT,1582330380157000,1582330380294346,42379082,buy,9687.56,0.023 -binance-futures,BTCUSDT,1582330380559000,1582330380680197,42379083,buy,9687.56,0.005 -binance-futures,BTCUSDT,1582330381987000,1582330382108436,42379084,sell,9687.55,0.5 -binance-futures,BTCUSDT,1582330384090000,1582330384212855,42379085,buy,9687.63,0.1 -binance-futures,BTCUSDT,1582330384090000,1582330384212861,42379086,buy,9688,0.045 -binance-futures,BTCUSDT,1582330384090000,1582330384216729,42379087,buy,9688,0.134 -binance-futures,BTCUSDT,1582330384094000,1582330384222314,42379088,buy,9688,0.134 -binance-futures,BTCUSDT,1582330385264000,1582330385385479,42379089,buy,9688,0.236 -binance-futures,BTCUSDT,1582330385290000,1582330385412354,42379090,buy,9688,0.017 -binance-futures,BTCUSDT,1582330385355000,1582330385479424,42379091,buy,9688,0.168 -binance-futures,BTCUSDT,1582330385371000,1582330385493659,42379092,buy,9688,0.193 -binance-futures,BTCUSDT,1582330385385000,1582330385511424,42379093,buy,9688,0.212 -binance-futures,BTCUSDT,1582330385697000,1582330385818962,42379094,buy,9688,0.282 -binance-futures,BTCUSDT,1582330385805000,1582330385927542,42379095,buy,9688,0.592 -binance-futures,BTCUSDT,1582330385823000,1582330385948036,42379096,buy,9688,0.216 -binance-futures,BTCUSDT,1582330386229000,1582330386353573,42379097,buy,9688,0.316 -binance-futures,BTCUSDT,1582330386254000,1582330386379033,42379098,buy,9688,0.895 -binance-futures,BTCUSDT,1582330386908000,1582330387029684,42379099,buy,9688,3.736 -binance-futures,BTCUSDT,1582330387982000,1582330388105909,42379100,buy,9688,2.048 -binance-futures,BTCUSDT,1582330388365000,1582330388488035,42379101,buy,9688,0.351 -binance-futures,BTCUSDT,1582330388379000,1582330388500930,42379102,buy,9688,0.279 -binance-futures,BTCUSDT,1582330389058000,1582330389179777,42379103,buy,9688,3.568 -binance-futures,BTCUSDT,1582330389908000,1582330390031838,42379104,buy,9688,0.022 -binance-futures,BTCUSDT,1582330390151000,1582330390272969,42379105,buy,9688,4.993 -binance-futures,BTCUSDT,1582330391263000,1582330391387554,42379106,sell,9687.99,0.033 -binance-futures,BTCUSDT,1582330395391000,1582330395513526,42379107,buy,9688,0.516 -binance-futures,BTCUSDT,1582330397649000,1582330397773245,42379108,sell,9687.99,0.398 -binance-futures,BTCUSDT,1582330398414000,1582330398539915,42379109,buy,9688,0.01 -binance-futures,BTCUSDT,1582330400957000,1582330401078518,42379110,sell,9687.99,0.02 -binance-futures,BTCUSDT,1582330402547000,1582330402668293,42379111,buy,9688,1.5 -binance-futures,BTCUSDT,1582330406456000,1582330406579320,42379112,buy,9688,0.506 -binance-futures,BTCUSDT,1582330409653000,1582330409775027,42379113,buy,9688,0.15 -binance-futures,BTCUSDT,1582330413976000,1582330414097031,42379114,buy,9688,0.018 -binance-futures,BTCUSDT,1582330415943000,1582330416066542,42379115,sell,9687.99,0.5 -binance-futures,BTCUSDT,1582330416508000,1582330416626284,42379116,buy,9688,0.124 -binance-futures,BTCUSDT,1582330416884000,1582330417004143,42379117,buy,9688,3.922 -binance-futures,BTCUSDT,1582330416890000,1582330417010526,42379118,buy,9688,0.041 -binance-futures,BTCUSDT,1582330418771000,1582330418894072,42379119,buy,9688,0.013 -binance-futures,BTCUSDT,1582330422204000,1582330422357986,42379120,buy,9688,1.032 -binance-futures,BTCUSDT,1582330422213000,1582330422358029,42379121,buy,9688,4.917 -binance-futures,BTCUSDT,1582330422213000,1582330422358033,42379122,buy,9688,0.681 -binance-futures,BTCUSDT,1582330422213000,1582330422358038,42379123,buy,9688,0.583 -binance-futures,BTCUSDT,1582330422233000,1582330422363345,42379124,buy,9688,0.099 -binance-futures,BTCUSDT,1582330422233000,1582330422363351,42379125,buy,9688,0.003 -binance-futures,BTCUSDT,1582330422233000,1582330422365541,42379126,buy,9688.6,0.005 -binance-futures,BTCUSDT,1582330422233000,1582330422369341,42379127,buy,9688.65,0.1 -binance-futures,BTCUSDT,1582330422233000,1582330422369351,42379128,buy,9689.35,3.256 -binance-futures,BTCUSDT,1582330422233000,1582330422369360,42379129,buy,9689.4,0.04 -binance-futures,BTCUSDT,1582330422233000,1582330422369364,42379130,buy,9689.46,0.04 -binance-futures,BTCUSDT,1582330422233000,1582330422373691,42379131,buy,9689.73,0.047 -binance-futures,BTCUSDT,1582330422233000,1582330422373698,42379132,buy,9689.78,0.332 -binance-futures,BTCUSDT,1582330422364000,1582330422485017,42379133,sell,9688.8,0.005 -binance-futures,BTCUSDT,1582330422364000,1582330422487030,42379134,sell,9688.18,0.043 -binance-futures,BTCUSDT,1582330426562000,1582330426686435,42379135,buy,9689.3,0.005 -binance-futures,BTCUSDT,1582330426562000,1582330426686444,42379136,buy,9689.3,0.1 -binance-futures,BTCUSDT,1582330426562000,1582330426686690,42379137,buy,9689.7,0.039 -binance-futures,BTCUSDT,1582330428352000,1582330428495043,42379138,buy,9689.21,0.001 -binance-futures,BTCUSDT,1582330430415000,1582330430534490,42379139,buy,9689.16,0.206 -binance-futures,BTCUSDT,1582330430415000,1582330430537182,42379140,buy,9689.16,0.206 -binance-futures,BTCUSDT,1582330430415000,1582330430537193,42379141,buy,9689.16,0.588 -binance-futures,BTCUSDT,1582330430415000,1582330430542055,42379142,buy,9689.22,0.03 -binance-futures,BTCUSDT,1582330432683000,1582330432804486,42379143,buy,9689.16,0.181 -binance-futures,BTCUSDT,1582330434613000,1582330434736633,42379144,buy,9689.16,0.1 -binance-futures,BTCUSDT,1582330434613000,1582330434742045,42379145,buy,9689.7,0.005 -binance-futures,BTCUSDT,1582330434613000,1582330434742055,42379146,buy,9689.78,0.122 -binance-futures,BTCUSDT,1582330436056000,1582330436179830,42379147,buy,9689.79,1.028 -binance-futures,BTCUSDT,1582330436056000,1582330436179835,42379148,buy,9689.93,0.012 -binance-futures,BTCUSDT,1582330436056000,1582330436183474,42379149,buy,9689.93,0.54 -binance-futures,BTCUSDT,1582330436624000,1582330436744262,42379150,buy,9689.93,0.438 -binance-futures,BTCUSDT,1582330436626000,1582330436744290,42379151,buy,9689.93,0.206 -binance-futures,BTCUSDT,1582330444497000,1582330444619801,42379152,buy,9689.43,0.1 -binance-futures,BTCUSDT,1582330444497000,1582330444622788,42379153,buy,9689.91,0.127 -binance-futures,BTCUSDT,1582330444500000,1582330444629718,42379154,buy,9689.91,0.061 -binance-futures,BTCUSDT,1582330444500000,1582330444630067,42379155,buy,9689.93,0.765 -binance-futures,BTCUSDT,1582330445259000,1582330445392264,42379156,sell,9689.92,0.703 -binance-futures,BTCUSDT,1582330446480000,1582330446604136,42379157,buy,9689.93,0.051 -binance-futures,BTCUSDT,1582330446480000,1582330446606460,42379158,buy,9690,0.033 -binance-futures,BTCUSDT,1582330446480000,1582330446615488,42379159,buy,9690.2,0.047 -binance-futures,BTCUSDT,1582330446480000,1582330446621713,42379160,buy,9690.5,0.005 -binance-futures,BTCUSDT,1582330446480000,1582330446623296,42379161,buy,9690.55,0.002 -binance-futures,BTCUSDT,1582330446480000,1582330446626891,42379162,buy,9690.78,0.14 -binance-futures,BTCUSDT,1582330446480000,1582330446626900,42379163,buy,9690.78,1.5 -binance-futures,BTCUSDT,1582330447694000,1582330447813947,42379164,buy,9690.83,0.681 -binance-futures,BTCUSDT,1582330447694000,1582330447824201,42379165,buy,9690.84,0.1 -binance-futures,BTCUSDT,1582330447694000,1582330447824211,42379166,buy,9691.13,0.219 -binance-futures,BTCUSDT,1582330447695000,1582330447827730,42379167,buy,9691.13,1.791 -binance-futures,BTCUSDT,1582330448304000,1582330448427349,42379168,sell,9690.55,0.001 -binance-futures,BTCUSDT,1582330448399000,1582330448549726,42379169,sell,9690.64,0.001 -binance-futures,BTCUSDT,1582330449146000,1582330449284796,42379170,sell,9690.95,0.001 -binance-futures,BTCUSDT,1582330449405000,1582330449529662,42379171,buy,9691.14,0.04 -binance-futures,BTCUSDT,1582330449405000,1582330449530148,42379172,buy,9691.17,0.71 -binance-futures,BTCUSDT,1582330454321000,1582330454442555,42379173,buy,9691.19,0.1 -binance-futures,BTCUSDT,1582330454321000,1582330454442909,42379174,buy,9691.37,0.005 -binance-futures,BTCUSDT,1582330455346000,1582330455469604,42379175,buy,9691.37,0.035 -binance-futures,BTCUSDT,1582330455346000,1582330455470099,42379176,buy,9691.37,0.002 -binance-futures,BTCUSDT,1582330460846000,1582330460969264,42379177,buy,9691.37,0.1 -binance-futures,BTCUSDT,1582330460921000,1582330461044255,42379178,buy,9691.37,0.1 -binance-futures,BTCUSDT,1582330463603000,1582330463723041,42379179,buy,9691.37,0.012 -binance-futures,BTCUSDT,1582330465179000,1582330465301172,42379180,buy,9691.37,0.116 -binance-futures,BTCUSDT,1582330466527000,1582330466662493,42379181,buy,9691.37,0.1 -binance-futures,BTCUSDT,1582330467871000,1582330467995507,42379182,buy,9691.37,0.1 -binance-futures,BTCUSDT,1582330468283000,1582330468403866,42379183,buy,9691.37,0.1 -binance-futures,BTCUSDT,1582330469899000,1582330470022790,42379184,buy,9691.37,0.1 -binance-futures,BTCUSDT,1582330474106000,1582330474229153,42379185,buy,9691.37,1 -binance-futures,BTCUSDT,1582330479426000,1582330479552731,42379186,buy,9691.37,1 -binance-futures,BTCUSDT,1582330482182000,1582330482315904,42379187,buy,9691.37,0.268 -binance-futures,BTCUSDT,1582330486391000,1582330486515905,42379188,buy,9691.37,0.139 -binance-futures,BTCUSDT,1582330486391000,1582330486515912,42379189,buy,9691.51,0.001 -binance-futures,BTCUSDT,1582330486391000,1582330486520703,42379190,buy,9692,0.01 -binance-futures,BTCUSDT,1582330486391000,1582330486523103,42379191,buy,9692.19,1.85 -binance-futures,BTCUSDT,1582330487770000,1582330487896007,42379192,buy,9692.33,0.008 -binance-futures,BTCUSDT,1582330487794000,1582330487920150,42379193,buy,9692.33,0.021 -binance-futures,BTCUSDT,1582330496737000,1582330496861245,42379194,buy,9692.74,0.001 -binance-futures,BTCUSDT,1582330500432000,1582330500582305,42379195,buy,9692.85,0.1 -binance-futures,BTCUSDT,1582330500432000,1582330500582917,42379196,buy,9692.94,0.08 -binance-futures,BTCUSDT,1582330500432000,1582330500582952,42379197,buy,9693,0.005 -binance-futures,BTCUSDT,1582330500432000,1582330500587014,42379198,buy,9693,0.002 -binance-futures,BTCUSDT,1582330500432000,1582330500587029,42379199,buy,9693,0.01 -binance-futures,BTCUSDT,1582330500432000,1582330500587033,42379200,buy,9693.26,0.1 -binance-futures,BTCUSDT,1582330500432000,1582330500589187,42379201,buy,9693.26,1.718 -binance-futures,BTCUSDT,1582330502876000,1582330502997373,42379202,sell,9693.24,0.031 -binance-futures,BTCUSDT,1582330502876000,1582330502999233,42379203,sell,9693.23,0.031 -binance-futures,BTCUSDT,1582330502876000,1582330502999238,42379204,sell,9693.22,0.031 -binance-futures,BTCUSDT,1582330502876000,1582330503004950,42379205,sell,9693.21,0.031 -binance-futures,BTCUSDT,1582330502876000,1582330503009361,42379206,sell,9693.2,0.031 -binance-futures,BTCUSDT,1582330502876000,1582330503009395,42379207,sell,9693.2,0.005 -binance-futures,BTCUSDT,1582330502876000,1582330503013406,42379208,sell,9693.19,0.031 -binance-futures,BTCUSDT,1582330502876000,1582330503013423,42379209,sell,9692.92,0.439 -binance-futures,BTCUSDT,1582330502876000,1582330503017912,42379210,sell,9692.65,0.05 -binance-futures,BTCUSDT,1582330502876000,1582330503017923,42379211,sell,9692.63,1.32 -binance-futures,BTCUSDT,1582330503074000,1582330503197498,42379212,sell,9692.63,0.001 -binance-futures,BTCUSDT,1582330503226000,1582330503506803,42379213,sell,9692.63,0.001 -binance-futures,BTCUSDT,1582330504090000,1582330504213711,42379214,sell,9693.06,0.001 -binance-futures,BTCUSDT,1582330504436000,1582330504553538,42379215,buy,9693.16,0.001 -binance-futures,BTCUSDT,1582330508008000,1582330508130531,42379216,sell,9692.87,5.207 -binance-futures,BTCUSDT,1582330508008000,1582330508130542,42379217,sell,9692.39,0.427 -binance-futures,BTCUSDT,1582330508008000,1582330508142190,42379218,sell,9692.09,1.138 -binance-futures,BTCUSDT,1582330508008000,1582330508142220,42379219,sell,9691.36,2.054 -binance-futures,BTCUSDT,1582330508008000,1582330508147354,42379220,sell,9691.15,0.704 -binance-futures,BTCUSDT,1582330508008000,1582330508147360,42379221,sell,9691.15,0.704 -binance-futures,BTCUSDT,1582330508008000,1582330508154883,42379222,sell,9691.15,0.887 -binance-futures,BTCUSDT,1582330508008000,1582330508154887,42379223,sell,9691.15,0.887 -binance-futures,BTCUSDT,1582330508008000,1582330508154894,42379224,sell,9691.13,0.686 -binance-futures,BTCUSDT,1582330508008000,1582330508154904,42379225,sell,9691.1,3.063 -binance-futures,BTCUSDT,1582330508008000,1582330508154914,42379226,sell,9690.57,0.243 -binance-futures,BTCUSDT,1582330508008000,1582330508154919,42379227,sell,9690.57,0.243 -binance-futures,BTCUSDT,1582330508008000,1582330508158651,42379228,sell,9690.56,0.1 -binance-futures,BTCUSDT,1582330508008000,1582330508158681,42379229,sell,9690.55,0.012 -binance-futures,BTCUSDT,1582330508008000,1582330508158692,42379230,sell,9690.41,0.4 -binance-futures,BTCUSDT,1582330508008000,1582330508158708,42379231,sell,9690.05,0.58 -binance-futures,BTCUSDT,1582330508008000,1582330508158713,42379232,sell,9690,0.123 -binance-futures,BTCUSDT,1582330508008000,1582330508158718,42379233,sell,9690,0.4 -binance-futures,BTCUSDT,1582330508008000,1582330508158723,42379234,sell,9689.59,10 -binance-futures,BTCUSDT,1582330508008000,1582330508159104,42379235,sell,9689.2,3.549 -binance-futures,BTCUSDT,1582330508008000,1582330508159344,42379236,sell,9689.04,8.593 -binance-futures,BTCUSDT,1582330508061000,1582330508190835,42379237,sell,9692.26,0.326 -binance-futures,BTCUSDT,1582330508637000,1582330508759903,42379238,sell,9690.8,0.001 -binance-futures,BTCUSDT,1582330509324000,1582330509450161,42379239,buy,9690.81,0.01 -binance-futures,BTCUSDT,1582330509603000,1582330509730217,42379240,buy,9690.81,0.99 -binance-futures,BTCUSDT,1582330509603000,1582330509730220,42379241,buy,9691.17,0.127 -binance-futures,BTCUSDT,1582330510048000,1582330510174747,42379242,buy,9690.98,0.187 -binance-futures,BTCUSDT,1582330514665000,1582330514798306,42379243,buy,9691.07,0.03 -binance-futures,BTCUSDT,1582330514665000,1582330514798320,42379244,buy,9691.75,0.449 -binance-futures,BTCUSDT,1582330514665000,1582330514798324,42379245,buy,9691.82,0.194 -binance-futures,BTCUSDT,1582330514733000,1582330514859739,42379246,sell,9691.1,0.25 -binance-futures,BTCUSDT,1582330517660000,1582330517786109,42379247,sell,9691.89,0.1 -binance-futures,BTCUSDT,1582330517660000,1582330517786115,42379248,sell,9691.82,0.025 -binance-futures,BTCUSDT,1582330520206000,1582330520330253,42379249,buy,9691.83,0.5 -binance-futures,BTCUSDT,1582330521242000,1582330521362606,42379250,sell,9691.91,0.232 -binance-futures,BTCUSDT,1582330524284000,1582330524408902,42379251,buy,9691.82,2 -binance-futures,BTCUSDT,1582330524284000,1582330524408909,42379252,buy,9691.82,2 -binance-futures,BTCUSDT,1582330524284000,1582330524408912,42379253,buy,9691.82,2 -binance-futures,BTCUSDT,1582330524284000,1582330524409108,42379254,buy,9691.82,0.68 -binance-futures,BTCUSDT,1582330524284000,1582330524412400,42379255,buy,9691.82,0.67 -binance-futures,BTCUSDT,1582330524284000,1582330524412412,42379256,buy,9691.82,0.74 -binance-futures,BTCUSDT,1582330524284000,1582330524412417,42379257,buy,9691.82,0.72 -binance-futures,BTCUSDT,1582330524284000,1582330524412725,42379258,buy,9691.82,0.67 -binance-futures,BTCUSDT,1582330524284000,1582330524412734,42379259,buy,9691.83,0.282 -binance-futures,BTCUSDT,1582330524284000,1582330524414867,42379260,buy,9691.9,0.1 -binance-futures,BTCUSDT,1582330524284000,1582330524419831,42379261,buy,9692.78,0.897 -binance-futures,BTCUSDT,1582330524284000,1582330524419841,42379262,buy,9692.78,0.897 -binance-futures,BTCUSDT,1582330524284000,1582330524419844,42379263,buy,9692.79,0.51 -binance-futures,BTCUSDT,1582330524284000,1582330524421970,42379264,buy,9692.79,0.897 -binance-futures,BTCUSDT,1582330524284000,1582330524421984,42379265,buy,9692.79,0.897 -binance-futures,BTCUSDT,1582330524284000,1582330524421988,42379266,buy,9692.79,0.704 -binance-futures,BTCUSDT,1582330524284000,1582330524423322,42379267,buy,9692.8,0.005 -binance-futures,BTCUSDT,1582330524284000,1582330524424656,42379268,buy,9693.12,2 -binance-futures,BTCUSDT,1582330524284000,1582330524426039,42379269,buy,9693.22,0.554 -binance-futures,BTCUSDT,1582330524284000,1582330524427157,42379270,buy,9693.23,5 -binance-futures,BTCUSDT,1582330524284000,1582330524427171,42379271,buy,9693.31,0.04 -binance-futures,BTCUSDT,1582330524284000,1582330524427174,42379272,buy,9693.32,0.5 -binance-futures,BTCUSDT,1582330526187000,1582330526309381,42379273,buy,9692.2,0.005 -binance-futures,BTCUSDT,1582330528256000,1582330528384504,42379274,buy,9691.83,0.1 -binance-futures,BTCUSDT,1582330528256000,1582330528387813,42379275,buy,9692.72,0.106 -binance-futures,BTCUSDT,1582330528993000,1582330529115249,42379276,buy,9693.2,0.005 -binance-futures,BTCUSDT,1582330529319000,1582330529442072,42379277,buy,9693.66,0.012 -binance-futures,BTCUSDT,1582330529319000,1582330529442309,42379278,buy,9693.98,0.681 -binance-futures,BTCUSDT,1582330529319000,1582330529443729,42379279,buy,9694,0.421 -binance-futures,BTCUSDT,1582330529372000,1582330529498294,42379280,buy,9694,0.005 -binance-futures,BTCUSDT,1582330529372000,1582330529498302,42379281,buy,9694,0.01 -binance-futures,BTCUSDT,1582330529372000,1582330529498306,42379282,buy,9694.02,0.001 -binance-futures,BTCUSDT,1582330529372000,1582330529502462,42379283,buy,9694.04,0.006 -binance-futures,BTCUSDT,1582330530122000,1582330530243968,42379284,buy,9694.29,0.001 -binance-futures,BTCUSDT,1582330533012000,1582330533135471,42379285,sell,9694.27,0.031 -binance-futures,BTCUSDT,1582330533012000,1582330533138552,42379286,sell,9694.26,0.031 -binance-futures,BTCUSDT,1582330533012000,1582330533144291,42379287,sell,9694.25,0.031 -binance-futures,BTCUSDT,1582330533012000,1582330533144313,42379288,sell,9694.24,0.031 -binance-futures,BTCUSDT,1582330533012000,1582330533144318,42379289,sell,9694.19,0.214 -binance-futures,BTCUSDT,1582330533085000,1582330533207595,42379290,sell,9694.19,2 -binance-futures,BTCUSDT,1582330533108000,1582330533231911,42379291,sell,9694.19,1.589 -binance-futures,BTCUSDT,1582330534596000,1582330534720632,42379292,buy,9694.29,0.003 -binance-futures,BTCUSDT,1582330534596000,1582330534720635,42379293,buy,9694.4,0.005 -binance-futures,BTCUSDT,1582330534596000,1582330534727759,42379294,buy,9694.45,0.001 -binance-futures,BTCUSDT,1582330534596000,1582330534727780,42379295,buy,9694.79,0.006 -binance-futures,BTCUSDT,1582330534596000,1582330534727790,42379296,buy,9694.85,0.04 -binance-futures,BTCUSDT,1582330534596000,1582330534731291,42379297,buy,9695,0.245 -binance-futures,BTCUSDT,1582330535049000,1582330535169740,42379298,sell,9694.32,0.01 -binance-futures,BTCUSDT,1582330536761000,1582330536884399,42379299,buy,9694.24,0.007 -binance-futures,BTCUSDT,1582330537054000,1582330537177994,42379300,buy,9694.24,0.007 -binance-futures,BTCUSDT,1582330538718000,1582330538842731,42379301,buy,9695,0.68 -binance-futures,BTCUSDT,1582330538723000,1582330538846612,42379302,buy,9695,0.74 -binance-futures,BTCUSDT,1582330539880000,1582330540002383,42379303,buy,9694.9,0.133 -binance-futures,BTCUSDT,1582330539880000,1582330540003770,42379304,buy,9694.96,0.031 -binance-futures,BTCUSDT,1582330539880000,1582330540003777,42379305,buy,9694.97,0.031 -binance-futures,BTCUSDT,1582330539880000,1582330540005936,42379306,buy,9694.98,0.031 -binance-futures,BTCUSDT,1582330539880000,1582330540011379,42379307,buy,9695,0.167 -binance-futures,BTCUSDT,1582330540059000,1582330540182158,42379308,sell,9694.6,0.001 -binance-futures,BTCUSDT,1582330542373000,1582330542495165,42379309,buy,9694.2,0.005 -binance-futures,BTCUSDT,1582330545878000,1582330545999079,42379310,buy,9694.78,2 -binance-futures,BTCUSDT,1582330545878000,1582330545999639,42379311,buy,9694.78,0.536 -binance-futures,BTCUSDT,1582330548051000,1582330548175788,42379312,sell,9693.58,0.459 -binance-futures,BTCUSDT,1582330548051000,1582330548178777,42379313,sell,9693.52,1.541 -binance-futures,BTCUSDT,1582330550170000,1582330550291035,42379314,buy,9694.38,0.005 -binance-futures,BTCUSDT,1582330553224000,1582330553371142,42379315,buy,9694.51,0.031 -binance-futures,BTCUSDT,1582330553224000,1582330553371148,42379316,buy,9694.52,0.029 -binance-futures,BTCUSDT,1582330556621000,1582330556743674,42379317,buy,9694.31,0.72 -binance-futures,BTCUSDT,1582330556624000,1582330556750400,42379318,buy,9694.31,0.67 -binance-futures,BTCUSDT,1582330556628000,1582330556751802,42379319,buy,9694.31,0.67 -binance-futures,BTCUSDT,1582330565117000,1582330565238988,42379320,buy,9694.81,0.01 -binance-futures,BTCUSDT,1582330565353000,1582330565474445,42379321,sell,9694.8,0.005 -binance-futures,BTCUSDT,1582330567069000,1582330567191876,42379322,sell,9694.98,0.031 -binance-futures,BTCUSDT,1582330567069000,1582330567191988,42379323,sell,9694.98,0.508 -binance-futures,BTCUSDT,1582330567069000,1582330567191994,42379324,sell,9694.98,0.5 -binance-futures,BTCUSDT,1582330568790000,1582330568910983,42379325,buy,9694.81,0.001 -binance-futures,BTCUSDT,1582330569649000,1582330569772109,42379326,buy,9694.81,0.02 -binance-futures,BTCUSDT,1582330570671000,1582330570795917,42379327,sell,9694.8,0.001 -binance-futures,BTCUSDT,1582330574896000,1582330575021876,42379328,buy,9694.81,0.62 -binance-futures,BTCUSDT,1582330574937000,1582330575065856,42379329,sell,9694.8,0.001 -binance-futures,BTCUSDT,1582330575205000,1582330575325605,42379330,buy,9694.81,0.01 -binance-futures,BTCUSDT,1582330575589000,1582330575714334,42379331,buy,9694.81,0.051 -binance-futures,BTCUSDT,1582330575589000,1582330575715694,42379332,buy,9694.81,0.002 -binance-futures,BTCUSDT,1582330575631000,1582330575751660,42379333,buy,9695,0.168 -binance-futures,BTCUSDT,1582330576808000,1582330576930534,42379334,buy,9695.55,0.047 -binance-futures,BTCUSDT,1582330576828000,1582330576953039,42379335,buy,9695.75,0.012 -binance-futures,BTCUSDT,1582330576851000,1582330576981017,42379336,buy,9696,0.2 -binance-futures,BTCUSDT,1582330576851000,1582330576981024,42379337,buy,9696.01,0.047 -binance-futures,BTCUSDT,1582330576851000,1582330576982938,42379338,buy,9696.1,0.005 -binance-futures,BTCUSDT,1582330576981000,1582330577103577,42379339,buy,9696.6,0.167 -binance-futures,BTCUSDT,1582330576988000,1582330577113996,42379340,buy,9696.6,2 -binance-futures,BTCUSDT,1582330577903000,1582330578028186,42379341,buy,9696.96,0.138 -binance-futures,BTCUSDT,1582330577903000,1582330578028983,42379342,buy,9697,0.01 -binance-futures,BTCUSDT,1582330577903000,1582330578028986,42379343,buy,9697,0.016 -binance-futures,BTCUSDT,1582330577903000,1582330578030881,42379344,buy,9697,0.016 -binance-futures,BTCUSDT,1582330577903000,1582330578031712,42379345,buy,9697.22,0.12 -binance-futures,BTCUSDT,1582330578032000,1582330578153546,42379346,sell,9697.07,0.001 -binance-futures,BTCUSDT,1582330578587000,1582330578709406,42379347,sell,9696.45,0.002 -binance-futures,BTCUSDT,1582330580756000,1582330580879357,42379348,buy,9697.22,0.979 -binance-futures,BTCUSDT,1582330581885000,1582330582007435,42379349,buy,9697.38,0.1 -binance-futures,BTCUSDT,1582330581885000,1582330582007492,42379350,buy,9697.4,0.002 -binance-futures,BTCUSDT,1582330581885000,1582330582015107,42379351,buy,9697.58,0.286 -binance-futures,BTCUSDT,1582330582081000,1582330582201703,42379352,buy,9697.21,0.005 -binance-futures,BTCUSDT,1582330583752000,1582330583874583,42379353,buy,9697.94,0.021 -binance-futures,BTCUSDT,1582330586136000,1582330586261921,42379354,buy,9697.93,0.004 -binance-futures,BTCUSDT,1582330586136000,1582330586261926,42379355,buy,9697.93,1.172 -binance-futures,BTCUSDT,1582330586720000,1582330586839850,42379356,buy,9697.94,0.072 -binance-futures,BTCUSDT,1582330586720000,1582330586839867,42379357,buy,9697.94,0.002 -binance-futures,BTCUSDT,1582330589636000,1582330589759012,42379358,sell,9697.11,0.001 -binance-futures,BTCUSDT,1582330590244000,1582330590370420,42379359,buy,9697.03,0.005 -binance-futures,BTCUSDT,1582330590607000,1582330590731300,42379360,sell,9696.61,0.001 -binance-futures,BTCUSDT,1582330590689000,1582330590816820,42379361,sell,9696.57,0.001 -binance-futures,BTCUSDT,1582330593601000,1582330593723229,42379362,buy,9697.26,0.005 -binance-futures,BTCUSDT,1582330593634000,1582330593756918,42379363,sell,9698,0.005 -binance-futures,BTCUSDT,1582330595965000,1582330596086460,42379364,buy,9696.71,0.001 -binance-futures,BTCUSDT,1582330598881000,1582330599003884,42379365,buy,9697.23,0.001 -binance-futures,BTCUSDT,1582330602585000,1582330602707170,42379366,buy,9697.21,0.005 -binance-futures,BTCUSDT,1582330603108000,1582330603230626,42379367,sell,9697.2,0.001 -binance-futures,BTCUSDT,1582330603338000,1582330603458292,42379368,buy,9697.21,0.095 -binance-futures,BTCUSDT,1582330603338000,1582330603458371,42379369,buy,9697.21,0.008 -binance-futures,BTCUSDT,1582330603426000,1582330603550649,42379370,sell,9697.2,0.004 -binance-futures,BTCUSDT,1582330603495000,1582330603619631,42379371,sell,9696.12,2 -binance-futures,BTCUSDT,1582330603514000,1582330603636045,42379372,sell,9696.12,0.721 -binance-futures,BTCUSDT,1582330603518000,1582330603644812,42379373,sell,9696.09,0.686 -binance-futures,BTCUSDT,1582330603544000,1582330603669798,42379374,sell,9696,2 -binance-futures,BTCUSDT,1582330603554000,1582330603686651,42379375,sell,9695.61,2 -binance-futures,BTCUSDT,1582330603589000,1582330603713017,42379376,sell,9695.41,0.002 -binance-futures,BTCUSDT,1582330603589000,1582330603714648,42379377,sell,9695.41,0.1 -binance-futures,BTCUSDT,1582330603589000,1582330603714656,42379378,sell,9695.41,2.681 -binance-futures,BTCUSDT,1582330603589000,1582330603714661,42379379,sell,9695.41,1.142 -binance-futures,BTCUSDT,1582330603605000,1582330603734470,42379380,sell,9695.4,0.13 -binance-futures,BTCUSDT,1582330603606000,1582330603736936,42379381,sell,9695.4,2.551 -binance-futures,BTCUSDT,1582330603632000,1582330603758715,42379382,sell,9695.35,2 -binance-futures,BTCUSDT,1582330603632000,1582330603764057,42379383,sell,9695.35,2 -binance-futures,BTCUSDT,1582330603632000,1582330603764064,42379384,sell,9695.35,1.695 -binance-futures,BTCUSDT,1582330603632000,1582330603764067,42379385,sell,9695.14,0.012 -binance-futures,BTCUSDT,1582330603664000,1582330603794905,42379386,sell,9695,2.409 -binance-futures,BTCUSDT,1582330603707000,1582330603842824,42379387,sell,9694.71,2 -binance-futures,BTCUSDT,1582330603707000,1582330603842834,42379388,sell,9694.71,2 -binance-futures,BTCUSDT,1582330603707000,1582330603842846,42379389,sell,9694.71,1.179 -binance-futures,BTCUSDT,1582330603776000,1582330603904630,42379390,sell,9694.35,0.897 -binance-futures,BTCUSDT,1582330603776000,1582330603904664,42379391,sell,9694.35,0.897 -binance-futures,BTCUSDT,1582330603776000,1582330603904668,42379392,sell,9694.35,0.156 -binance-futures,BTCUSDT,1582330603789000,1582330603914166,42379393,sell,9694.35,4.499 -binance-futures,BTCUSDT,1582330604043000,1582330604171496,42379394,sell,9693.58,0.1 -binance-futures,BTCUSDT,1582330604155000,1582330604283664,42379395,sell,9692.75,1.34 -binance-futures,BTCUSDT,1582330604203000,1582330604355635,42379396,sell,9692.75,0.01 -binance-futures,BTCUSDT,1582330604229000,1582330604369144,42379397,buy,9692.93,0.257 -binance-futures,BTCUSDT,1582330604229000,1582330604369153,42379398,buy,9693.03,0.031 -binance-futures,BTCUSDT,1582330604229000,1582330604369716,42379399,buy,9693.04,0.031 -binance-futures,BTCUSDT,1582330604229000,1582330604374496,42379400,buy,9693.05,0.031 -binance-futures,BTCUSDT,1582330604229000,1582330604374660,42379401,buy,9693.05,0.72 -binance-futures,BTCUSDT,1582330604229000,1582330604374666,42379402,buy,9693.06,0.031 -binance-futures,BTCUSDT,1582330604229000,1582330604374784,42379403,buy,9693.06,5.447 -binance-futures,BTCUSDT,1582330604243000,1582330604384935,42379404,sell,9692.75,1.34 -binance-futures,BTCUSDT,1582330604305000,1582330604434649,42379405,sell,9692.75,0.01 -binance-futures,BTCUSDT,1582330606049000,1582330606173777,42379406,buy,9693.96,0.005 -binance-futures,BTCUSDT,1582330606091000,1582330606215233,42379407,sell,9692.57,0.01 -binance-futures,BTCUSDT,1582330606283000,1582330606407650,42379408,buy,9693.65,0.103 -binance-futures,BTCUSDT,1582330607597000,1582330607720625,42379409,sell,9694.09,0.273 -binance-futures,BTCUSDT,1582330611367000,1582330611567029,42379410,buy,9695.37,0.382 -binance-futures,BTCUSDT,1582330614248000,1582330614369202,42379411,buy,9694.88,0.005 -binance-futures,BTCUSDT,1582330614573000,1582330614701278,42379412,buy,9696.08,0.74 -binance-futures,BTCUSDT,1582330614573000,1582330614704263,42379413,buy,9696.09,0.012 -binance-futures,BTCUSDT,1582330614573000,1582330614704269,42379414,buy,9696.1,0.005 -binance-futures,BTCUSDT,1582330614573000,1582330614708034,42379415,buy,9696.58,0.114 -binance-futures,BTCUSDT,1582330614573000,1582330614709620,42379416,buy,9696.61,0.002 -binance-futures,BTCUSDT,1582330614573000,1582330614711647,42379417,buy,9696.62,0.035 -binance-futures,BTCUSDT,1582330614618000,1582330614742010,42379418,buy,9695.36,0.1 -binance-futures,BTCUSDT,1582330614618000,1582330614748941,42379419,buy,9696.62,0.862 -binance-futures,BTCUSDT,1582330614618000,1582330614748949,42379420,buy,9696.62,0.897 -binance-futures,BTCUSDT,1582330614618000,1582330614748953,42379421,buy,9696.63,1.978 -binance-futures,BTCUSDT,1582330615186000,1582330615306257,42379422,buy,9696.63,0.4 -binance-futures,BTCUSDT,1582330616410000,1582330616533507,42379423,buy,9696.63,0.01 -binance-futures,BTCUSDT,1582330619649000,1582330619774439,42379424,buy,9695.22,0.031 -binance-futures,BTCUSDT,1582330619649000,1582330619776729,42379425,buy,9695.22,0.119 -binance-futures,BTCUSDT,1582330620352000,1582330620475749,42379426,sell,9693.55,0.031 -binance-futures,BTCUSDT,1582330620352000,1582330620477304,42379427,sell,9693.54,0.031 -binance-futures,BTCUSDT,1582330620352000,1582330620479764,42379428,sell,9693.53,0.014 -binance-futures,BTCUSDT,1582330623855000,1582330623977056,42379429,sell,9694.79,0.001 -binance-futures,BTCUSDT,1582330624498000,1582330624621672,42379430,buy,9694.8,0.001 -binance-futures,BTCUSDT,1582330626236000,1582330626363392,42379431,buy,9694.8,0.004 -binance-futures,BTCUSDT,1582330626236000,1582330626363398,42379432,buy,9696.31,0.006 -binance-futures,BTCUSDT,1582330626264000,1582330626390668,42379433,sell,9694.83,0.031 -binance-futures,BTCUSDT,1582330626264000,1582330626391885,42379434,sell,9694.82,0.031 -binance-futures,BTCUSDT,1582330626264000,1582330626396472,42379435,sell,9694.81,0.031 -binance-futures,BTCUSDT,1582330626264000,1582330626398385,42379436,sell,9694.79,0.1 -binance-futures,BTCUSDT,1582330626264000,1582330626398403,42379437,sell,9694.79,0.442 -binance-futures,BTCUSDT,1582330626264000,1582330626398407,42379438,sell,9694.78,0.67 -binance-futures,BTCUSDT,1582330626264000,1582330626401357,42379439,sell,9694.78,0.67 -binance-futures,BTCUSDT,1582330626264000,1582330626401366,42379440,sell,9694.7,0.005 -binance-futures,BTCUSDT,1582330626264000,1582330626402519,42379441,sell,9693.81,0.02 -binance-futures,BTCUSDT,1582330628068000,1582330628199782,42379442,buy,9694.03,0.52 -binance-futures,BTCUSDT,1582330628138000,1582330628297863,42379443,buy,9694.03,0.161 -binance-futures,BTCUSDT,1582330628993000,1582330629118494,42379444,buy,9695.38,0.001 -binance-futures,BTCUSDT,1582330628993000,1582330629118500,42379445,buy,9695.39,0.031 -binance-futures,BTCUSDT,1582330628993000,1582330629121610,42379446,buy,9695.39,0.999 -binance-futures,BTCUSDT,1582330629049000,1582330629170751,42379447,sell,9694.37,0.271 -binance-futures,BTCUSDT,1582330629684000,1582330629813924,42379448,sell,9695.28,0.052 -binance-futures,BTCUSDT,1582330630353000,1582330630477797,42379449,sell,9695.91,0.104 -binance-futures,BTCUSDT,1582330633037000,1582330633160108,42379450,sell,9695.8,0.005 -binance-futures,BTCUSDT,1582330636309000,1582330636437853,42379451,buy,9694.6,2 -binance-futures,BTCUSDT,1582330636335000,1582330636457925,42379452,buy,9694.6,0.594 -binance-futures,BTCUSDT,1582330637814000,1582330637935428,42379453,buy,9695.98,0.1 -binance-futures,BTCUSDT,1582330637814000,1582330637936092,42379454,buy,9695.98,0.244 -binance-futures,BTCUSDT,1582330639028000,1582330639152435,42379455,buy,9695.98,1.815 -binance-futures,BTCUSDT,1582330639042000,1582330639166651,42379456,buy,9695.98,0.289 -binance-futures,BTCUSDT,1582330639093000,1582330639218944,42379457,buy,9695.98,1.349 -binance-futures,BTCUSDT,1582330641422000,1582330641547811,42379458,buy,9695.81,0.52 -binance-futures,BTCUSDT,1582330641422000,1582330641549525,42379459,buy,9695.81,0.74 -binance-futures,BTCUSDT,1582330641422000,1582330641553084,42379460,buy,9695.81,0.72 -binance-futures,BTCUSDT,1582330641422000,1582330641553092,42379461,buy,9695.81,0.67 -binance-futures,BTCUSDT,1582330641454000,1582330641576294,42379462,buy,9695.81,0.056 -binance-futures,BTCUSDT,1582330641513000,1582330641636169,42379463,buy,9696.55,0.485 -binance-futures,BTCUSDT,1582330647007000,1582330647130004,42379464,buy,9696.55,0.01 -binance-futures,BTCUSDT,1582330647603000,1582330647723277,42379465,buy,9696.83,0.14 -binance-futures,BTCUSDT,1582330647923000,1582330648047696,42379466,buy,9697,0.05 -binance-futures,BTCUSDT,1582330647923000,1582330648050257,42379467,buy,9697,1.476 -binance-futures,BTCUSDT,1582330647972000,1582330648098769,42379468,buy,9697,0.626 -binance-futures,BTCUSDT,1582330647972000,1582330648098779,42379469,buy,9697.62,0.1 -binance-futures,BTCUSDT,1582330647972000,1582330648109209,42379470,buy,9698.03,0.002 -binance-futures,BTCUSDT,1582330647972000,1582330648109233,42379471,buy,9698.09,0.05 -binance-futures,BTCUSDT,1582330647972000,1582330648109239,42379472,buy,9698.1,0.005 -binance-futures,BTCUSDT,1582330647972000,1582330648109254,42379473,buy,9698.41,0.004 -binance-futures,BTCUSDT,1582330647972000,1582330648111028,42379474,buy,9698.41,0.004 -binance-futures,BTCUSDT,1582330647972000,1582330648111038,42379475,buy,9698.45,0.04 -binance-futures,BTCUSDT,1582330647972000,1582330648114433,42379476,buy,9698.46,0.2 -binance-futures,BTCUSDT,1582330648046000,1582330648172519,42379477,buy,9698.46,0.01 -binance-futures,BTCUSDT,1582330651379000,1582330651502958,42379478,buy,9698.06,0.309 -binance-futures,BTCUSDT,1582330651574000,1582330651701714,42379479,buy,9698.06,0.227 -binance-futures,BTCUSDT,1582330652640000,1582330652763878,42379480,buy,9698.59,0.003 -binance-futures,BTCUSDT,1582330652640000,1582330652763887,42379481,buy,9698.59,0.017 -binance-futures,BTCUSDT,1582330652640000,1582330652763891,42379482,buy,9698.59,0.007 -binance-futures,BTCUSDT,1582330652640000,1582330652763896,42379483,buy,9698.59,0.009 -binance-futures,BTCUSDT,1582330652640000,1582330652763900,42379484,buy,9698.59,2.872 -binance-futures,BTCUSDT,1582330653391000,1582330653516003,42379485,buy,9698.59,0.99 -binance-futures,BTCUSDT,1582330654432000,1582330654554434,42379486,buy,9698.59,0.01 -binance-futures,BTCUSDT,1582330655420000,1582330655541804,42379487,buy,9698.57,0.01 -binance-futures,BTCUSDT,1582330656138000,1582330656266299,42379488,buy,9698.59,0.01 -binance-futures,BTCUSDT,1582330656567000,1582330656688318,42379489,buy,9698.59,0.01 -binance-futures,BTCUSDT,1582330657166000,1582330657291197,42379490,buy,9698.59,0.001 -binance-futures,BTCUSDT,1582330657594000,1582330657715347,42379491,buy,9698.59,0.01 -binance-futures,BTCUSDT,1582330660534000,1582330660656153,42379492,buy,9698.71,0.001 -binance-futures,BTCUSDT,1582330661114000,1582330661239472,42379493,buy,9698.71,1 -binance-futures,BTCUSDT,1582330661981000,1582330662105371,42379494,buy,9698.71,0.165 -binance-futures,BTCUSDT,1582330661984000,1582330662108521,42379495,buy,9698.71,1.65 -binance-futures,BTCUSDT,1582330665197000,1582330665322078,42379496,sell,9698.7,0.031 -binance-futures,BTCUSDT,1582330665197000,1582330665325347,42379497,sell,9698.7,0.069 -binance-futures,BTCUSDT,1582330670689000,1582330670809220,42379498,sell,9698.82,0.031 -binance-futures,BTCUSDT,1582330670689000,1582330670810794,42379499,sell,9698.81,0.031 -binance-futures,BTCUSDT,1582330670689000,1582330670814982,42379500,sell,9698.8,0.031 -binance-futures,BTCUSDT,1582330670689000,1582330670815987,42379501,sell,9698.79,0.031 -binance-futures,BTCUSDT,1582330670689000,1582330670815994,42379502,sell,9698.7,0.005 -binance-futures,BTCUSDT,1582330670689000,1582330670822239,42379503,sell,9698.59,0.037 -binance-futures,BTCUSDT,1582330670689000,1582330670824470,42379504,sell,9698.01,0.76 -binance-futures,BTCUSDT,1582330670689000,1582330670824480,42379505,sell,9698.01,0.76 -binance-futures,BTCUSDT,1582330670689000,1582330670825808,42379506,sell,9698,0.01 -binance-futures,BTCUSDT,1582330670689000,1582330670826896,42379507,sell,9697.37,0.012 -binance-futures,BTCUSDT,1582330670689000,1582330670827434,42379508,sell,9697.09,0.1 -binance-futures,BTCUSDT,1582330670689000,1582330670828669,42379509,sell,9697.01,0.792 -binance-futures,BTCUSDT,1582330671211000,1582330671334461,42379510,sell,9697.48,0.051 -binance-futures,BTCUSDT,1582330671521000,1582330671643987,42379511,sell,9697.58,2.09 -binance-futures,BTCUSDT,1582330671521000,1582330671644936,42379512,sell,9697.01,3.065 -binance-futures,BTCUSDT,1582330672178000,1582330672302773,42379513,sell,9697.01,0.001 -binance-futures,BTCUSDT,1582330672368000,1582330672491199,42379514,buy,9697.07,0.007 -binance-futures,BTCUSDT,1582330673366000,1582330673491116,42379515,sell,9696.64,0.08 -binance-futures,BTCUSDT,1582330680577000,1582330680704404,42379516,sell,9697.41,0.006 -binance-futures,BTCUSDT,1582330681180000,1582330681323333,42379517,sell,9697.41,0.005 -binance-futures,BTCUSDT,1582330684056000,1582330684182878,42379518,sell,9698,0.01 -binance-futures,BTCUSDT,1582330684172000,1582330684317002,42379519,buy,9697.4,0.01 -binance-futures,BTCUSDT,1582330684180000,1582330684338435,42379520,sell,9697.39,0.1 -binance-futures,BTCUSDT,1582330684180000,1582330684338441,42379521,sell,9697,0.01 -binance-futures,BTCUSDT,1582330684180000,1582330684339008,42379522,sell,9697,0.01 -binance-futures,BTCUSDT,1582330684180000,1582330684339014,42379523,sell,9697,0.01 -binance-futures,BTCUSDT,1582330684180000,1582330684339018,42379524,sell,9697,0.01 -binance-futures,BTCUSDT,1582330684180000,1582330684339297,42379525,sell,9697,0.01 -binance-futures,BTCUSDT,1582330684680000,1582330684806891,42379526,sell,9696.65,0.02 -binance-futures,BTCUSDT,1582330684730000,1582330684852760,42379527,sell,9696.65,1.31 -binance-futures,BTCUSDT,1582330684866000,1582330684989162,42379528,sell,9696.51,0.01 -binance-futures,BTCUSDT,1582330684927000,1582330685061680,42379529,sell,9696.51,1.44 -binance-futures,BTCUSDT,1582330684929000,1582330685061689,42379530,sell,9696.51,1.48 -binance-futures,BTCUSDT,1582330684930000,1582330685061694,42379531,sell,9696.51,1.34 -binance-futures,BTCUSDT,1582330684932000,1582330685061699,42379532,sell,9696.51,0.05 -binance-futures,BTCUSDT,1582330686946000,1582330687068470,42379533,buy,9696.01,0.203 -binance-futures,BTCUSDT,1582330688810000,1582330688930866,42379534,sell,9696.76,0.001 -binance-futures,BTCUSDT,1582330689908000,1582330690030717,42379535,buy,9696.88,0.014 -binance-futures,BTCUSDT,1582330691221000,1582330691346054,42379536,buy,9696.88,0.057 -binance-futures,BTCUSDT,1582330693101000,1582330693224994,42379537,buy,9696.88,0.001 -binance-futures,BTCUSDT,1582330693382000,1582330693505139,42379538,buy,9696.88,0.124 -binance-futures,BTCUSDT,1582330695987000,1582330696112968,42379539,buy,9696.88,0.382 -binance-futures,BTCUSDT,1582330697759000,1582330697880842,42379540,buy,9696.88,0.103 -binance-futures,BTCUSDT,1582330697759000,1582330697880873,42379541,buy,9696.88,0.278 -binance-futures,BTCUSDT,1582330700413000,1582330700536437,42379542,sell,9696.87,0.05 -binance-futures,BTCUSDT,1582330707415000,1582330707535311,42379543,buy,9696.88,0.73 -binance-futures,BTCUSDT,1582330707415000,1582330707540065,42379544,buy,9696.88,0.05 -binance-futures,BTCUSDT,1582330707419000,1582330707542651,42379545,buy,9696.88,0.8 -binance-futures,BTCUSDT,1582330707419000,1582330707542657,42379546,buy,9696.88,0.68 -binance-futures,BTCUSDT,1582330707421000,1582330707542668,42379547,buy,9696.88,0.67 -binance-futures,BTCUSDT,1582330707421000,1582330707543947,42379548,buy,9696.88,0.74 -binance-futures,BTCUSDT,1582330707465000,1582330707592638,42379549,buy,9696.88,0.467 -binance-futures,BTCUSDT,1582330707820000,1582330707941147,42379550,sell,9697.33,0.045 -binance-futures,BTCUSDT,1582330709467000,1582330709588114,42379551,sell,9697.82,0.233 -binance-futures,BTCUSDT,1582330710280000,1582330710430606,42379552,buy,9698.11,0.01 -binance-futures,BTCUSDT,1582330710289000,1582330710433145,42379553,buy,9698.11,0.01 -binance-futures,BTCUSDT,1582330712557000,1582330712680488,42379554,sell,9696.87,0.685 -binance-futures,BTCUSDT,1582330712557000,1582330712682113,42379555,sell,9696.72,1.315 -binance-futures,BTCUSDT,1582330713689000,1582330713809632,42379556,buy,9696.45,0.001 -binance-futures,BTCUSDT,1582330716440000,1582330716563701,42379557,buy,9696.84,0.031 -binance-futures,BTCUSDT,1582330716440000,1582330716564248,42379558,buy,9696.85,0.031 -binance-futures,BTCUSDT,1582330716440000,1582330716568432,42379559,buy,9696.86,0.031 -binance-futures,BTCUSDT,1582330716440000,1582330716574462,42379560,buy,9696.87,0.031 -binance-futures,BTCUSDT,1582330716440000,1582330716574482,42379561,buy,9697.22,0.201 -binance-futures,BTCUSDT,1582330723810000,1582330723936787,42379562,buy,9698.46,1.031 -binance-futures,BTCUSDT,1582330726095000,1582330726218185,42379563,sell,9698.45,0.031 -binance-futures,BTCUSDT,1582330726096000,1582330726218967,42379564,sell,9698.45,0.069 -binance-futures,BTCUSDT,1582330730773000,1582330730896093,42379565,buy,9699,0.1 -binance-futures,BTCUSDT,1582330730773000,1582330730898753,42379566,buy,9699,0.1 -binance-futures,BTCUSDT,1582330730773000,1582330730898761,42379567,buy,9699,0.3 -binance-futures,BTCUSDT,1582330746524000,1582330746647118,42379568,buy,9699,0.1 -binance-futures,BTCUSDT,1582330747135000,1582330747259195,42379569,sell,9698.99,0.005 -binance-futures,BTCUSDT,1582330750872000,1582330750994226,42379570,buy,9698.99,0.681 -binance-futures,BTCUSDT,1582330750872000,1582330750996533,42379571,buy,9699,0.059 -binance-futures,BTCUSDT,1582330750890000,1582330751011719,42379572,buy,9699,0.041 -binance-futures,BTCUSDT,1582330750890000,1582330751011754,42379573,buy,9699,0.149 -binance-futures,BTCUSDT,1582330750894000,1582330751020872,42379574,buy,9699,0.056 -binance-futures,BTCUSDT,1582330750894000,1582330751021165,42379575,buy,9699,0.25 -binance-futures,BTCUSDT,1582330750894000,1582330751021372,42379576,buy,9699,0.404 -binance-futures,BTCUSDT,1582330750896000,1582330751024625,42379577,buy,9699,0.596 -binance-futures,BTCUSDT,1582330750896000,1582330751026389,42379578,buy,9699.1,0.001 -binance-futures,BTCUSDT,1582330751029000,1582330751153030,42379579,buy,9699.47,0.012 -binance-futures,BTCUSDT,1582330751029000,1582330751153037,42379580,buy,9699.54,0.05 -binance-futures,BTCUSDT,1582330751029000,1582330751157780,42379581,buy,9699.75,0.04 -binance-futures,BTCUSDT,1582330751029000,1582330751161255,42379582,buy,9699.96,0.005 -binance-futures,BTCUSDT,1582330751029000,1582330751163745,42379583,buy,9700,0.017 -binance-futures,BTCUSDT,1582330751029000,1582330751163754,42379584,buy,9700,0.483 -binance-futures,BTCUSDT,1582330751029000,1582330751163759,42379585,buy,9700,0.517 -binance-futures,BTCUSDT,1582330751398000,1582330751524512,42379586,buy,9700,0.483 -binance-futures,BTCUSDT,1582330751398000,1582330751524522,42379587,buy,9700,0.001 -binance-futures,BTCUSDT,1582330751398000,1582330751524534,42379588,buy,9700,0.004 -binance-futures,BTCUSDT,1582330751398000,1582330751524539,42379589,buy,9700,0.071 -binance-futures,BTCUSDT,1582330751398000,1582330751524545,42379590,buy,9700,0.01 -binance-futures,BTCUSDT,1582330751398000,1582330751524551,42379591,buy,9700,0.004 -binance-futures,BTCUSDT,1582330751398000,1582330751524557,42379592,buy,9700,0.004 -binance-futures,BTCUSDT,1582330751398000,1582330751524575,42379593,buy,9700,0.006 -binance-futures,BTCUSDT,1582330751398000,1582330751524580,42379594,buy,9700,0.011 -binance-futures,BTCUSDT,1582330751398000,1582330751524584,42379595,buy,9700,0.008 -binance-futures,BTCUSDT,1582330751398000,1582330751524588,42379596,buy,9700,0.003 -binance-futures,BTCUSDT,1582330751398000,1582330751525323,42379597,buy,9700,0.145 -binance-futures,BTCUSDT,1582330751398000,1582330751525332,42379598,buy,9700,0.044 -binance-futures,BTCUSDT,1582330751451000,1582330751578232,42379599,buy,9700,0.267 -binance-futures,BTCUSDT,1582330751451000,1582330751578320,42379600,buy,9700,0.05 -binance-futures,BTCUSDT,1582330751451000,1582330751578665,42379601,buy,9700,1 -binance-futures,BTCUSDT,1582330751451000,1582330751578673,42379602,buy,9700,0.031 -binance-futures,BTCUSDT,1582330751451000,1582330751578684,42379603,buy,9700,0.652 -binance-futures,BTCUSDT,1582330751466000,1582330751589334,42379604,buy,9700,0.08 -binance-futures,BTCUSDT,1582330751477000,1582330751598905,42379605,buy,9700,0.489 -binance-futures,BTCUSDT,1582330751477000,1582330751598909,42379606,buy,9700,0.2 -binance-futures,BTCUSDT,1582330751477000,1582330751598914,42379607,buy,9700,0.01 -binance-futures,BTCUSDT,1582330751885000,1582330752026284,42379608,buy,9701,0.01 -binance-futures,BTCUSDT,1582330751885000,1582330752029236,42379609,buy,9701.06,0.036 -binance-futures,BTCUSDT,1582330751885000,1582330752029782,42379610,buy,9701.07,0.012 -binance-futures,BTCUSDT,1582330751885000,1582330752032619,42379611,buy,9701.08,0.457 -binance-futures,BTCUSDT,1582330751885000,1582330752034716,42379612,buy,9701.08,1 -binance-futures,BTCUSDT,1582330751955000,1582330752082075,42379613,buy,9701.38,0.041 -binance-futures,BTCUSDT,1582330752025000,1582330752151021,42379614,buy,9701.38,0.006 -binance-futures,BTCUSDT,1582330752025000,1582330752153497,42379615,buy,9701.38,0.056 -binance-futures,BTCUSDT,1582330752457000,1582330752584168,42379616,buy,9701.54,0.001 -binance-futures,BTCUSDT,1582330752457000,1582330752587023,42379617,buy,9701.54,2.999 -binance-futures,BTCUSDT,1582330754985000,1582330755109479,42379618,sell,9701.57,0.005 -binance-futures,BTCUSDT,1582330754985000,1582330755109485,42379619,sell,9701.57,0.095 -binance-futures,BTCUSDT,1582330758426000,1582330758552653,42379620,buy,9701.58,0.012 -binance-futures,BTCUSDT,1582330758426000,1582330758552666,42379621,buy,9701.82,0.047 -binance-futures,BTCUSDT,1582330758426000,1582330758561934,42379622,buy,9701.85,0.04 -binance-futures,BTCUSDT,1582330758426000,1582330758567348,42379623,buy,9702,0.001 -binance-futures,BTCUSDT,1582330758426000,1582330758567353,42379624,buy,9702,0.001 -binance-futures,BTCUSDT,1582330758426000,1582330758567358,42379625,buy,9702,0.01 -binance-futures,BTCUSDT,1582330758426000,1582330758567362,42379626,buy,9702.02,0.189 -binance-futures,BTCUSDT,1582330758426000,1582330758570814,42379627,buy,9702.02,0.21 -binance-futures,BTCUSDT,1582330758426000,1582330758570827,42379628,buy,9702.37,0.48 -binance-futures,BTCUSDT,1582330758426000,1582330758570839,42379629,buy,9702.57,0.06 -binance-futures,BTCUSDT,1582330758426000,1582330758570848,42379630,buy,9702.95,0.012 -binance-futures,BTCUSDT,1582330760136000,1582330760259607,42379631,sell,9702.05,0.031 -binance-futures,BTCUSDT,1582330760136000,1582330760259613,42379632,sell,9702.04,0.031 -binance-futures,BTCUSDT,1582330760136000,1582330760264690,42379633,sell,9702.03,0.031 -binance-futures,BTCUSDT,1582330760136000,1582330760267142,42379634,sell,9702.01,0.038 -binance-futures,BTCUSDT,1582330761229000,1582330761370468,42379635,sell,9702.11,0.002 -binance-futures,BTCUSDT,1582330762973000,1582330763095148,42379636,sell,9702.13,0.02 -binance-futures,BTCUSDT,1582330762973000,1582330763095163,42379637,sell,9702.08,0.031 -binance-futures,BTCUSDT,1582330762973000,1582330763103042,42379638,sell,9702.01,0.149 -binance-futures,BTCUSDT,1582330763264000,1582330763383051,42379639,sell,9702.01,0.01 -binance-futures,BTCUSDT,1582330763855000,1582330763977089,42379640,sell,9702.01,4.446 -binance-futures,BTCUSDT,1582330763855000,1582330763978973,42379641,sell,9701.44,0.686 -binance-futures,BTCUSDT,1582330763855000,1582330763982488,42379642,sell,9701.44,0.232 -binance-futures,BTCUSDT,1582330763855000,1582330763982500,42379643,sell,9701.44,0.232 -binance-futures,BTCUSDT,1582330763855000,1582330763982503,42379644,sell,9701.44,0.158 -binance-futures,BTCUSDT,1582330763855000,1582330763985238,42379645,sell,9701.38,2.643 -binance-futures,BTCUSDT,1582330763855000,1582330763985249,42379646,sell,9701.24,0.441 -binance-futures,BTCUSDT,1582330763855000,1582330763987726,42379647,sell,9701.19,2.527 -binance-futures,BTCUSDT,1582330764426000,1582330764546389,42379648,buy,9701.79,0.031 -binance-futures,BTCUSDT,1582330764426000,1582330764546829,42379649,buy,9701.82,0.031 -binance-futures,BTCUSDT,1582330764426000,1582330764550186,42379650,buy,9701.83,0.031 -binance-futures,BTCUSDT,1582330767443000,1582330767564321,42379651,buy,9702.14,0.05 -binance-futures,BTCUSDT,1582330770079000,1582330770202402,42379652,sell,9702.12,0.103 -binance-futures,BTCUSDT,1582330770079000,1582330770210438,42379653,sell,9702.06,0.297 -binance-futures,BTCUSDT,1582330770251000,1582330770399680,42379654,sell,9702.06,0.4 -binance-futures,BTCUSDT,1582330773360000,1582330773482383,42379655,buy,9702.14,0.05 -binance-futures,BTCUSDT,1582330773360000,1582330773482393,42379656,buy,9702.5,0.438 -binance-futures,BTCUSDT,1582330773360000,1582330773490655,42379657,buy,9702.78,0.512 -binance-futures,BTCUSDT,1582330778405000,1582330778528447,42379658,sell,9701.94,0.017 -binance-futures,BTCUSDT,1582330778405000,1582330778528452,42379659,sell,9701.93,0.1 -binance-futures,BTCUSDT,1582330778405000,1582330778532683,42379660,sell,9701.93,0.083 -binance-futures,BTCUSDT,1582330780662000,1582330780787221,42379661,sell,9702.74,0.031 -binance-futures,BTCUSDT,1582330780662000,1582330780787230,42379662,sell,9702.73,0.024 -binance-futures,BTCUSDT,1582330782014000,1582330782146018,42379663,buy,9702.95,0.148 -binance-futures,BTCUSDT,1582330782014000,1582330782146026,42379664,buy,9703,0.003 -binance-futures,BTCUSDT,1582330782015000,1582330782150709,42379665,buy,9703,0.01 -binance-futures,BTCUSDT,1582330782015000,1582330782150724,42379666,buy,9703.19,0.006 -binance-futures,BTCUSDT,1582330782015000,1582330782150728,42379667,buy,9703.21,0.885 -binance-futures,BTCUSDT,1582330782461000,1582330782585193,42379668,buy,9703.22,0.021 -binance-futures,BTCUSDT,1582330782685000,1582330782807663,42379669,buy,9703.22,0.007 -binance-futures,BTCUSDT,1582330785975000,1582330786096972,42379670,buy,9703.04,0.1 -binance-futures,BTCUSDT,1582330786025000,1582330786144512,42379671,sell,9703.03,0.2 -binance-futures,BTCUSDT,1582330787106000,1582330787231906,42379672,buy,9703.04,0.1 -binance-futures,BTCUSDT,1582330787106000,1582330787233821,42379673,buy,9703.12,0.282 -binance-futures,BTCUSDT,1582330787106000,1582330787236299,42379674,buy,9703.12,0.018 -binance-futures,BTCUSDT,1582330787638000,1582330787760628,42379675,sell,9703.21,0.031 -binance-futures,BTCUSDT,1582330787638000,1582330787762368,42379676,sell,9703.21,0.169 -binance-futures,BTCUSDT,1582330788075000,1582330788202659,42379677,buy,9703.18,0.238 -binance-futures,BTCUSDT,1582330788075000,1582330788204541,42379678,buy,9703.22,0.022 -binance-futures,BTCUSDT,1582330788075000,1582330788210890,42379679,buy,9703.61,0.001 -binance-futures,BTCUSDT,1582330788075000,1582330788210910,42379680,buy,9703.62,0.038 -binance-futures,BTCUSDT,1582330788075000,1582330788212538,42379681,buy,9703.69,0.151 -binance-futures,BTCUSDT,1582330789225000,1582330789353871,42379682,buy,9703.22,0.002 -binance-futures,BTCUSDT,1582330790518000,1582330790642675,42379683,buy,9703.22,0.029 -binance-futures,BTCUSDT,1582330790518000,1582330790644108,42379684,buy,9703.23,0.031 -binance-futures,BTCUSDT,1582330790518000,1582330790647890,42379685,buy,9703.24,0.022 -binance-futures,BTCUSDT,1582330792230000,1582330792360799,42379686,sell,9703.79,0.1 -binance-futures,BTCUSDT,1582330795375000,1582330795499270,42379687,buy,9703.96,0.031 -binance-futures,BTCUSDT,1582330795375000,1582330795499279,42379688,buy,9703.96,0.024 -binance-futures,BTCUSDT,1582330797089000,1582330797213346,42379689,buy,9703.81,0.007 -binance-futures,BTCUSDT,1582330797372000,1582330797497352,42379690,sell,9703.12,0.013 -binance-futures,BTCUSDT,1582330797372000,1582330797497359,42379691,sell,9703.12,0.003 -binance-futures,BTCUSDT,1582330797417000,1582330797543141,42379692,sell,9703.03,0.103 -binance-futures,BTCUSDT,1582330797417000,1582330797549736,42379693,sell,9703.02,1.897 -binance-futures,BTCUSDT,1582330797437000,1582330797565311,42379694,sell,9703.02,2 -binance-futures,BTCUSDT,1582330797446000,1582330797570153,42379695,sell,9703.02,0.598 -binance-futures,BTCUSDT,1582330797489000,1582330797612392,42379696,sell,9701.93,2 -binance-futures,BTCUSDT,1582330797510000,1582330797634373,42379697,sell,9701.93,1.127 -binance-futures,BTCUSDT,1582330797636000,1582330797758746,42379698,sell,9701.58,0.704 -binance-futures,BTCUSDT,1582330797636000,1582330797758757,42379699,sell,9701.58,1.296 -binance-futures,BTCUSDT,1582330797637000,1582330797775908,42379700,sell,9701.58,0.897 -binance-futures,BTCUSDT,1582330797649000,1582330797780727,42379701,sell,9701.58,2 -binance-futures,BTCUSDT,1582330797705000,1582330797833149,42379702,sell,9701.58,1.3 -binance-futures,BTCUSDT,1582330797739000,1582330797869754,42379703,sell,9701.58,0.1 -binance-futures,BTCUSDT,1582330798030000,1582330798156447,42379704,sell,9701.58,0.143 -binance-futures,BTCUSDT,1582330798030000,1582330798160357,42379705,sell,9701.57,0.527 -binance-futures,BTCUSDT,1582330798110000,1582330798237664,42379706,sell,9701.57,0.473 -binance-futures,BTCUSDT,1582330798110000,1582330798237680,42379707,sell,9701.57,0.197 -binance-futures,BTCUSDT,1582330798161000,1582330798301671,42379708,sell,9701.57,1.34 -binance-futures,BTCUSDT,1582330798702000,1582330798826385,42379709,sell,9701.57,0.65 -binance-futures,BTCUSDT,1582330798722000,1582330798849613,42379710,sell,9701.57,0.01 -binance-futures,BTCUSDT,1582330798772000,1582330798894544,42379711,sell,9701.57,0.728 -binance-futures,BTCUSDT,1582330798774000,1582330798900031,42379712,sell,9701.57,0.79 -binance-futures,BTCUSDT,1582330798797000,1582330798920288,42379713,sell,9701.35,0.01 -binance-futures,BTCUSDT,1582330798824000,1582330798949630,42379714,sell,9701.35,0.11 -binance-futures,BTCUSDT,1582330798824000,1582330798949649,42379715,sell,9701.35,0.2 -binance-futures,BTCUSDT,1582330798828000,1582330798958005,42379716,sell,9701.35,0.2 -binance-futures,BTCUSDT,1582330798828000,1582330798958010,42379717,sell,9701.35,0.6 -binance-futures,BTCUSDT,1582330798830000,1582330798958041,42379718,sell,9701.35,0.15 -binance-futures,BTCUSDT,1582330798856000,1582330798980178,42379719,sell,9701.35,0.941 -binance-futures,BTCUSDT,1582330798891000,1582330799018982,42379720,buy,9701.36,0.008 -binance-futures,BTCUSDT,1582330800694000,1582330800816342,42379721,sell,9699.88,0.531 -binance-futures,BTCUSDT,1582330801031000,1582330801155582,42379722,sell,9699.87,0.005 -binance-futures,BTCUSDT,1582330801283000,1582330801415890,42379723,sell,9699.86,0.5 -binance-futures,BTCUSDT,1582330803389000,1582330803510682,42379724,buy,9699.87,0.001 -binance-futures,BTCUSDT,1582330803530000,1582330803653097,42379725,buy,9699.87,0.003 -binance-futures,BTCUSDT,1582330803532000,1582330803656761,42379726,sell,9699.86,0.002 -binance-futures,BTCUSDT,1582330803932000,1582330804055206,42379727,sell,9699.41,0.03 -binance-futures,BTCUSDT,1582330804234000,1582330804355763,42379728,sell,9699.41,1.334 -binance-futures,BTCUSDT,1582330804493000,1582330804617445,42379729,buy,9699.42,0.001 -binance-futures,BTCUSDT,1582330804592000,1582330804713140,42379730,buy,9699.42,1.726 -binance-futures,BTCUSDT,1582330804844000,1582330804970387,42379731,sell,9699.42,0.2 -binance-futures,BTCUSDT,1582330804964000,1582330805086549,42379732,sell,9699.42,0.035 -binance-futures,BTCUSDT,1582330805558000,1582330805678775,42379733,buy,9699.96,0.1 -binance-futures,BTCUSDT,1582330805558000,1582330805678778,42379734,buy,9700,0.15 -binance-futures,BTCUSDT,1582330805642000,1582330805767816,42379735,sell,9700,0.02 -binance-futures,BTCUSDT,1582330805866000,1582330805989616,42379736,sell,9700,0.138 -binance-futures,BTCUSDT,1582330806560000,1582330806683046,42379737,sell,9700.07,0.011 -binance-futures,BTCUSDT,1582330806985000,1582330807107641,42379738,sell,9700.29,0.063 -binance-futures,BTCUSDT,1582330807402000,1582330807524183,42379739,sell,9700.29,0.005 -binance-futures,BTCUSDT,1582330807802000,1582330807925086,42379740,sell,9700.29,0.432 -binance-futures,BTCUSDT,1582330807802000,1582330807925098,42379741,sell,9700,0.568 -binance-futures,BTCUSDT,1582330813774000,1582330813898208,42379742,buy,9700.42,0.01 -binance-futures,BTCUSDT,1582330814810000,1582330814932890,42379743,sell,9700.41,1.302 -binance-futures,BTCUSDT,1582330815006000,1582330815130439,42379744,buy,9700.42,0.671 -binance-futures,BTCUSDT,1582330815006000,1582330815130446,42379745,buy,9701,0.001 -binance-futures,BTCUSDT,1582330815006000,1582330815133403,42379746,buy,9702.07,0.147 -binance-futures,BTCUSDT,1582330815006000,1582330815133414,42379747,buy,9702.32,0.011 -binance-futures,BTCUSDT,1582330815006000,1582330815136433,42379748,buy,9702.32,0.002 -binance-futures,BTCUSDT,1582330815006000,1582330815136446,42379749,buy,9702.33,0.168 -binance-futures,BTCUSDT,1582330815222000,1582330815347496,42379750,sell,9700.57,0.434 -binance-futures,BTCUSDT,1582330815222000,1582330815347740,42379751,sell,9700.55,0.031 -binance-futures,BTCUSDT,1582330815222000,1582330815350128,42379752,sell,9700.55,0.235 -binance-futures,BTCUSDT,1582330819224000,1582330819364440,42379753,sell,9700.95,0.103 -binance-futures,BTCUSDT,1582330819224000,1582330819364446,42379754,sell,9700.8,0.005 -binance-futures,BTCUSDT,1582330819224000,1582330819364904,42379755,sell,9700.27,0.003 -binance-futures,BTCUSDT,1582330819224000,1582330819365963,42379756,sell,9700.26,0.704 -binance-futures,BTCUSDT,1582330819224000,1582330819365969,42379757,sell,9700.26,0.686 -binance-futures,BTCUSDT,1582330819224000,1582330819366806,42379758,sell,9700.25,0.704 -binance-futures,BTCUSDT,1582330819224000,1582330819367282,42379759,sell,9700.25,0.723 -binance-futures,BTCUSDT,1582330819224000,1582330819367287,42379760,sell,9700.25,0.439 -binance-futures,BTCUSDT,1582330820351000,1582330820472484,42379761,sell,9700,0.21 -binance-futures,BTCUSDT,1582330821192000,1582330821328808,42379762,buy,9700.01,0.2 -binance-futures,BTCUSDT,1582330821983000,1582330822105686,42379763,sell,9700,0.01 -binance-futures,BTCUSDT,1582330822939000,1582330823061781,42379764,buy,9700.01,0.01 -binance-futures,BTCUSDT,1582330826887000,1582330827008398,42379765,sell,9700,3.57 -binance-futures,BTCUSDT,1582330826983000,1582330827103671,42379766,sell,9700,0.1 -binance-futures,BTCUSDT,1582330828592000,1582330828711430,42379767,buy,9700.01,0.01 -binance-futures,BTCUSDT,1582330830161000,1582330830284278,42379768,sell,9700,0.01 -binance-futures,BTCUSDT,1582330831077000,1582330831200639,42379769,sell,9700,0.131 -binance-futures,BTCUSDT,1582330833729000,1582330833853163,42379770,sell,9700,0.016 -binance-futures,BTCUSDT,1582330835791000,1582330835915107,42379771,sell,9700,1 -binance-futures,BTCUSDT,1582330837027000,1582330837151876,42379772,sell,9700,0.148 -binance-futures,BTCUSDT,1582330837113000,1582330837241166,42379773,sell,9700,0.123 -binance-futures,BTCUSDT,1582330845951000,1582330846076786,42379774,sell,9700.01,0.5 -binance-futures,BTCUSDT,1582330850664000,1582330850789265,42379775,sell,9700,0.5 -binance-futures,BTCUSDT,1582330851343000,1582330851467859,42379776,sell,9700,0.2 -binance-futures,BTCUSDT,1582330851782000,1582330851921059,42379777,sell,9700,0.155 -binance-futures,BTCUSDT,1582330851829000,1582330851953039,42379778,sell,9700,0.5 -binance-futures,BTCUSDT,1582330853746000,1582330853875521,42379779,sell,9700,5 -binance-futures,BTCUSDT,1582330855884000,1582330856011778,42379780,sell,9700,0.218 -binance-futures,BTCUSDT,1582330856151000,1582330856280620,42379781,sell,9700,0.016 -binance-futures,BTCUSDT,1582330856593000,1582330856721445,42379782,sell,9700,0.012 -binance-futures,BTCUSDT,1582330856930000,1582330857058147,42379783,sell,9700,0.379 -binance-futures,BTCUSDT,1582330857143000,1582330857268659,42379784,sell,9700,0.049 -binance-futures,BTCUSDT,1582330863146000,1582330863275697,42379785,sell,9700,0.05 -binance-futures,BTCUSDT,1582330863487000,1582330863617771,42379786,sell,9700,0.005 -binance-futures,BTCUSDT,1582330866758000,1582330866882396,42379787,sell,9700,23.139 -binance-futures,BTCUSDT,1582330866775000,1582330866900203,42379788,sell,9700,1.307 -binance-futures,BTCUSDT,1582330866775000,1582330866900219,42379789,sell,9700,0.693 -binance-futures,BTCUSDT,1582330866797000,1582330866925845,42379790,sell,9700,0.594 -binance-futures,BTCUSDT,1582330866797000,1582330866926153,42379791,sell,9700,0.003 -binance-futures,BTCUSDT,1582330866797000,1582330866926489,42379792,sell,9700,0.27 -binance-futures,BTCUSDT,1582330866797000,1582330866926802,42379793,sell,9699.9,0.001 -binance-futures,BTCUSDT,1582330866797000,1582330866930470,42379794,sell,9699.9,0.005 -binance-futures,BTCUSDT,1582330867770000,1582330867897621,42379795,sell,9698.18,0.1 -binance-futures,BTCUSDT,1582330867811000,1582330867936307,42379796,sell,9698.18,2.151 -binance-futures,BTCUSDT,1582330867870000,1582330868002438,42379797,sell,9698,0.003 -binance-futures,BTCUSDT,1582330867870000,1582330868002444,42379798,sell,9698,0.2 -binance-futures,BTCUSDT,1582330867870000,1582330868002448,42379799,sell,9698,1.797 -binance-futures,BTCUSDT,1582330867899000,1582330868027195,42379800,sell,9698,2 -binance-futures,BTCUSDT,1582330867899000,1582330868027619,42379801,sell,9698,0.897 -binance-futures,BTCUSDT,1582330867933000,1582330868062075,42379802,sell,9698,1.305 -binance-futures,BTCUSDT,1582330867933000,1582330868062086,42379803,sell,9697.74,0.003 -binance-futures,BTCUSDT,1582330867933000,1582330868064601,42379804,sell,9697.68,1.464 -binance-futures,BTCUSDT,1582330867953000,1582330868077732,42379805,sell,9697.68,1.305 -binance-futures,BTCUSDT,1582330872922000,1582330873048722,42379806,sell,9696.26,0.1 -binance-futures,BTCUSDT,1582330872922000,1582330873050552,42379807,sell,9696.26,0.01 -binance-futures,BTCUSDT,1582330874374000,1582330874500538,42379808,buy,9696.16,0.4 -binance-futures,BTCUSDT,1582330874518000,1582330874644444,42379809,sell,9696.15,0.092 -binance-futures,BTCUSDT,1582330875087000,1582330875215478,42379810,sell,9696.15,0.24 -binance-futures,BTCUSDT,1582330875480000,1582330875696279,42379811,sell,9696.01,0.011 -binance-futures,BTCUSDT,1582330879539000,1582330879667795,42379812,sell,9696.03,0.176 -binance-futures,BTCUSDT,1582330880047000,1582330880170371,42379813,sell,9696.23,0.441 -binance-futures,BTCUSDT,1582330880047000,1582330880171943,42379814,sell,9696.21,0.559 -binance-futures,BTCUSDT,1582330880236000,1582330880389463,42379815,sell,9696.02,0.48 -binance-futures,BTCUSDT,1582330880236000,1582330880389734,42379816,sell,9696.01,0.02 -binance-futures,BTCUSDT,1582330881161000,1582330881288113,42379817,sell,9696.01,0.016 -binance-futures,BTCUSDT,1582330881161000,1582330881288123,42379818,sell,9696.01,0.984 -binance-futures,BTCUSDT,1582330881401000,1582330881603408,42379819,sell,9696.02,0.426 -binance-futures,BTCUSDT,1582330881401000,1582330881603416,42379820,sell,9696.01,0.074 -binance-futures,BTCUSDT,1582330883926000,1582330884051870,42379821,sell,9696.1,0.005 -binance-futures,BTCUSDT,1582330883926000,1582330884051873,42379822,sell,9696.1,0.1 -binance-futures,BTCUSDT,1582330889370000,1582330889487980,42379823,sell,9695.8,1.371 -binance-futures,BTCUSDT,1582330889370000,1582330889489857,42379824,sell,9695.79,0.11 -binance-futures,BTCUSDT,1582330889370000,1582330889495662,42379825,sell,9695.73,0.426 -binance-futures,BTCUSDT,1582330889370000,1582330889495665,42379826,sell,9695.73,0.01 -binance-futures,BTCUSDT,1582330889977000,1582330890097909,42379827,sell,9695.73,0.025 -binance-futures,BTCUSDT,1582330890587000,1582330890712392,42379828,sell,9695.73,0.05 -binance-futures,BTCUSDT,1582330893197000,1582330893321262,42379829,sell,9695.73,0.175 -binance-futures,BTCUSDT,1582330893671000,1582330893794540,42379830,sell,9695.6,0.005 -binance-futures,BTCUSDT,1582330893744000,1582330893873032,42379831,sell,9695.41,0.012 -binance-futures,BTCUSDT,1582330893765000,1582330893890739,42379832,sell,9695.24,0.047 -binance-futures,BTCUSDT,1582330893885000,1582330894012414,42379833,sell,9694,0.1 -binance-futures,BTCUSDT,1582330893885000,1582330894012592,42379834,sell,9694,0.038 -binance-futures,BTCUSDT,1582330893885000,1582330894012781,42379835,sell,9693.66,0.012 -binance-futures,BTCUSDT,1582330893886000,1582330894016626,42379836,sell,9693.15,0.084 -binance-futures,BTCUSDT,1582330894000000,1582330894125524,42379837,sell,9693.17,0.002 -binance-futures,BTCUSDT,1582330894796000,1582330894922962,42379838,sell,9693.26,0.001 -binance-futures,BTCUSDT,1582330895739000,1582330895864657,42379839,sell,9693.2,0.535 -binance-futures,BTCUSDT,1582330897440000,1582330897564544,42379840,buy,9693.96,0.025 -binance-futures,BTCUSDT,1582330898471000,1582330898595781,42379841,sell,9693.41,0.011 -binance-futures,BTCUSDT,1582330899810000,1582330899935371,42379842,sell,9693.41,0.289 -binance-futures,BTCUSDT,1582330899983000,1582330900110770,42379843,buy,9693.42,0.031 -binance-futures,BTCUSDT,1582330899983000,1582330900111005,42379844,buy,9693.43,0.031 -binance-futures,BTCUSDT,1582330899983000,1582330900113030,42379845,buy,9693.44,0.031 -binance-futures,BTCUSDT,1582330900012000,1582330900144825,42379846,buy,9693.62,0.1 -binance-futures,BTCUSDT,1582330900012000,1582330900147942,42379847,buy,9693.63,4.436 -binance-futures,BTCUSDT,1582330900036000,1582330900169677,42379848,buy,9693.58,0.031 -binance-futures,BTCUSDT,1582330900036000,1582330900170724,42379849,buy,9693.59,0.031 -binance-futures,BTCUSDT,1582330900036000,1582330900170738,42379850,buy,9693.6,0.031 -binance-futures,BTCUSDT,1582330900042000,1582330900173427,42379851,buy,9694.39,2 -binance-futures,BTCUSDT,1582330900042000,1582330900174228,42379852,buy,9694.39,2 -binance-futures,BTCUSDT,1582330900077000,1582330900205991,42379853,buy,9694.4,0.005 -binance-futures,BTCUSDT,1582330900142000,1582330900270511,42379854,buy,9695.47,5.152 -binance-futures,BTCUSDT,1582330900142000,1582330900276302,42379855,buy,9695.73,1.065 -binance-futures,BTCUSDT,1582330900142000,1582330900277999,42379856,buy,9695.74,0.783 -binance-futures,BTCUSDT,1582330900171000,1582330900300149,42379857,buy,9695.46,0.005 -binance-futures,BTCUSDT,1582330900171000,1582330900300416,42379858,buy,9695.46,1.785 -binance-futures,BTCUSDT,1582330900175000,1582330900305031,42379859,buy,9695.46,0.3 -binance-futures,BTCUSDT,1582330900306000,1582330900430005,42379860,sell,9695.73,0.051 -binance-futures,BTCUSDT,1582330900411000,1582330900534760,42379861,buy,9695.74,0.01 -binance-futures,BTCUSDT,1582330900570000,1582330900697865,42379862,sell,9695.73,0.949 -binance-futures,BTCUSDT,1582330900570000,1582330900699609,42379863,sell,9695.72,0.59 -binance-futures,BTCUSDT,1582330900571000,1582330900704212,42379864,sell,9694.89,0.727 -binance-futures,BTCUSDT,1582330900571000,1582330900704215,42379865,sell,9694.73,0.259 -binance-futures,BTCUSDT,1582330900571000,1582330900704222,42379866,sell,9694.55,2.02 -binance-futures,BTCUSDT,1582330900571000,1582330900707592,42379867,sell,9694.04,0.209 -binance-futures,BTCUSDT,1582330900589000,1582330900717418,42379868,sell,9694.19,2 -binance-futures,BTCUSDT,1582330901019000,1582330901143905,42379869,buy,9694.67,0.008 -binance-futures,BTCUSDT,1582330901163000,1582330901286599,42379870,buy,9694.67,0.023 -binance-futures,BTCUSDT,1582330901163000,1582330901286605,42379871,buy,9694.68,0.031 -binance-futures,BTCUSDT,1582330901163000,1582330901291924,42379872,buy,9694.69,0.031 -binance-futures,BTCUSDT,1582330901163000,1582330901293059,42379873,buy,9694.7,0.009 -binance-futures,BTCUSDT,1582330903368000,1582330903492818,42379874,buy,9695.06,0.85 -binance-futures,BTCUSDT,1582330904162000,1582330904288217,42379875,buy,9695.06,0.997 -binance-futures,BTCUSDT,1582330904162000,1582330904288221,42379876,buy,9695.4,0.003 -binance-futures,BTCUSDT,1582330904162000,1582330904292913,42379877,buy,9695.41,0.3 -binance-futures,BTCUSDT,1582330904275000,1582330904401697,42379878,buy,9695.41,0.67 -binance-futures,BTCUSDT,1582330904285000,1582330904409899,42379879,buy,9695.41,0.67 -binance-futures,BTCUSDT,1582330905330000,1582330905459432,42379880,buy,9695.75,0.3 -binance-futures,BTCUSDT,1582330905355000,1582330905478875,42379881,buy,9696.1,0.005 -binance-futures,BTCUSDT,1582330905355000,1582330905481681,42379882,buy,9696.1,0.037 -binance-futures,BTCUSDT,1582330905409000,1582330905533826,42379883,buy,9696.28,0.787 -binance-futures,BTCUSDT,1582330905465000,1582330905593933,42379884,buy,9696.5,0.01 -binance-futures,BTCUSDT,1582330905465000,1582330905596357,42379885,buy,9696.5,0.01 -binance-futures,BTCUSDT,1582330905709000,1582330905834035,42379886,sell,9696.77,0.031 -binance-futures,BTCUSDT,1582330905709000,1582330905835871,42379887,sell,9696.76,0.031 -binance-futures,BTCUSDT,1582330905709000,1582330905844026,42379888,sell,9696.75,0.031 -binance-futures,BTCUSDT,1582330905709000,1582330905844039,42379889,sell,9696.73,0.158 -binance-futures,BTCUSDT,1582330905709000,1582330905844042,42379890,sell,9696.73,1.087 -binance-futures,BTCUSDT,1582330906080000,1582330906208352,42379891,sell,9696.34,0.001 -binance-futures,BTCUSDT,1582330907825000,1582330907947865,42379892,buy,9697.6,0.005 -binance-futures,BTCUSDT,1582330907860000,1582330907985380,42379893,buy,9698.14,0.307 -binance-futures,BTCUSDT,1582330907862000,1582330907990671,42379894,sell,9697.36,0.031 -binance-futures,BTCUSDT,1582330907862000,1582330907994900,42379895,sell,9697.35,0.031 -binance-futures,BTCUSDT,1582330907862000,1582330907997267,42379896,sell,9697.34,0.031 -binance-futures,BTCUSDT,1582330907862000,1582330907998363,42379897,sell,9697.33,0.031 -binance-futures,BTCUSDT,1582330907862000,1582330907999970,42379898,sell,9697,0.096 -binance-futures,BTCUSDT,1582330907862000,1582330908002701,42379899,sell,9696.9,0.005 -binance-futures,BTCUSDT,1582330907862000,1582330908002712,42379900,sell,9696.1,1 -binance-futures,BTCUSDT,1582330907862000,1582330908004858,42379901,sell,9695.19,0.002 -binance-futures,BTCUSDT,1582330907862000,1582330908006537,42379902,sell,9695.19,0.011 -binance-futures,BTCUSDT,1582330907862000,1582330908006554,42379903,sell,9695.18,0.561 -binance-futures,BTCUSDT,1582330907862000,1582330908006558,42379904,sell,9695.18,0.561 -binance-futures,BTCUSDT,1582330907862000,1582330908007322,42379905,sell,9695.07,0.5 -binance-futures,BTCUSDT,1582330907862000,1582330908007330,42379906,sell,9694.65,0.14 -binance-futures,BTCUSDT,1582330908572000,1582330908699469,42379907,buy,9696.03,0.031 -binance-futures,BTCUSDT,1582330908572000,1582330908699488,42379908,buy,9696.03,0.458 -binance-futures,BTCUSDT,1582330908572000,1582330908699493,42379909,buy,9696.04,0.031 -binance-futures,BTCUSDT,1582330908572000,1582330908706452,42379910,buy,9696.05,0.031 -binance-futures,BTCUSDT,1582330908572000,1582330908706465,42379911,buy,9696.06,0.5 -binance-futures,BTCUSDT,1582330908572000,1582330908706472,42379912,buy,9696.07,0.1 -binance-futures,BTCUSDT,1582330908572000,1582330908709697,42379913,buy,9696.51,3.086 -binance-futures,BTCUSDT,1582330909665000,1582330909791085,42379914,buy,9696.12,0.817 -binance-futures,BTCUSDT,1582330909765000,1582330909890723,42379915,sell,9696.11,0.53 -binance-futures,BTCUSDT,1582330909859000,1582330909989681,42379916,buy,9694.8,1 -binance-futures,BTCUSDT,1582330909859000,1582330909993505,42379917,buy,9695.49,0.336 -binance-futures,BTCUSDT,1582330912882000,1582330913008469,42379918,buy,9695.86,0.446 -binance-futures,BTCUSDT,1582330914013000,1582330914135524,42379919,buy,9695.86,0.179 -binance-futures,BTCUSDT,1582330919673000,1582330919798414,42379920,sell,9695.7,0.005 -binance-futures,BTCUSDT,1582330919673000,1582330919798443,42379921,sell,9695.57,0.264 -binance-futures,BTCUSDT,1582330920700000,1582330920827065,42379922,buy,9695.42,0.456 -binance-futures,BTCUSDT,1582330920700000,1582330920828417,42379923,buy,9695.42,2.247 -binance-futures,BTCUSDT,1582330921783000,1582330921908499,42379924,sell,9695.41,0.17 -binance-futures,BTCUSDT,1582330923329000,1582330923454548,42379925,sell,9695.41,0.006 -binance-futures,BTCUSDT,1582330927930000,1582330928054723,42379926,buy,9695.49,0.011 -binance-futures,BTCUSDT,1582330929181000,1582330929317644,42379927,sell,9695.48,0.09 -binance-futures,BTCUSDT,1582330933298000,1582330933425925,42379928,sell,9695.43,0.071 -binance-futures,BTCUSDT,1582330934517000,1582330934640791,42379929,sell,9695.41,0.67 -binance-futures,BTCUSDT,1582330934593000,1582330934717391,42379930,sell,9695.41,0.321 -binance-futures,BTCUSDT,1582330934593000,1582330934717404,42379931,sell,9695.4,0.005 -binance-futures,BTCUSDT,1582330934655000,1582330934784844,42379932,sell,9695.01,0.006 -binance-futures,BTCUSDT,1582330934655000,1582330934784858,42379933,sell,9695,0.014 -binance-futures,BTCUSDT,1582330934665000,1582330934792186,42379934,sell,9695,0.236 -binance-futures,BTCUSDT,1582330934665000,1582330934792194,42379935,sell,9694.55,0.001 -binance-futures,BTCUSDT,1582330938359000,1582330938575789,42379936,buy,9694.6,0.005 -binance-futures,BTCUSDT,1582330938805000,1582330938934643,42379937,sell,9694.44,0.12 -binance-futures,BTCUSDT,1582330938809000,1582330938937791,42379938,sell,9694.44,0.567 -binance-futures,BTCUSDT,1582330938854000,1582330938987423,42379939,sell,9694.24,0.897 -binance-futures,BTCUSDT,1582330938922000,1582330939053098,42379940,sell,9694.11,1.36 -binance-futures,BTCUSDT,1582330938943000,1582330939074282,42379941,sell,9694.11,1.44 -binance-futures,BTCUSDT,1582330938945000,1582330939074306,42379942,sell,9694.11,1.997 -binance-futures,BTCUSDT,1582330939032000,1582330939157385,42379943,sell,9694,0.001 -binance-futures,BTCUSDT,1582330939036000,1582330939164600,42379944,sell,9693.81,0.01 -binance-futures,BTCUSDT,1582330939044000,1582330939172062,42379945,sell,9693.81,0.01 -binance-futures,BTCUSDT,1582330939072000,1582330939200246,42379946,buy,9693.89,1 -binance-futures,BTCUSDT,1582330939072000,1582330939204143,42379947,buy,9693.9,0.255 -binance-futures,BTCUSDT,1582330939139000,1582330939265262,42379948,sell,9693.81,0.67 -binance-futures,BTCUSDT,1582330939187000,1582330939315043,42379949,sell,9693.81,0.74 -binance-futures,BTCUSDT,1582330939258000,1582330939382664,42379950,sell,9693.68,0.67 -binance-futures,BTCUSDT,1582330939332000,1582330939460084,42379951,sell,9693.5,0.74 -binance-futures,BTCUSDT,1582330939377000,1582330939503309,42379952,sell,9693.5,0.01 -binance-futures,BTCUSDT,1582330940916000,1582330941041690,42379953,sell,9693,0.001 -binance-futures,BTCUSDT,1582330940916000,1582330941041961,42379954,sell,9692.87,0.066 -binance-futures,BTCUSDT,1582330941599000,1582330941724967,42379955,sell,9692.95,0.06 -binance-futures,BTCUSDT,1582330941890000,1582330942015988,42379956,sell,9692.92,0.1 -binance-futures,BTCUSDT,1582330942555000,1582330942682198,42379957,sell,9692.37,1.285 -binance-futures,BTCUSDT,1582330942569000,1582330942697022,42379958,sell,9692.37,0.464 -binance-futures,BTCUSDT,1582330943814000,1582330943951174,42379959,buy,9692.01,0.154 -binance-futures,BTCUSDT,1582330945800000,1582330945923990,42379960,buy,9692.01,0.031 -binance-futures,BTCUSDT,1582330945800000,1582330945924590,42379961,buy,9692.01,0.1 -binance-futures,BTCUSDT,1582330945800000,1582330945927836,42379962,buy,9692.01,0.069 -binance-futures,BTCUSDT,1582330950285000,1582330950414733,42379963,buy,9692.01,0.001 -binance-futures,BTCUSDT,1582330958943000,1582330959068887,42379964,sell,9692.11,0.019 -binance-futures,BTCUSDT,1582330963990000,1582330964115637,42379965,sell,9692.12,0.5 -binance-futures,BTCUSDT,1582330963990000,1582330964116136,42379966,sell,9692,0.25 -binance-futures,BTCUSDT,1582330964354000,1582330964476674,42379967,buy,9691.96,0.031 -binance-futures,BTCUSDT,1582330964354000,1582330964476682,42379968,buy,9691.97,0.031 -binance-futures,BTCUSDT,1582330964354000,1582330964480719,42379969,buy,9691.98,0.031 -binance-futures,BTCUSDT,1582330964354000,1582330964480726,42379970,buy,9691.99,0.031 -binance-futures,BTCUSDT,1582330964354000,1582330964483193,42379971,buy,9692,0.001 -binance-futures,BTCUSDT,1582330965103000,1582330965227423,42379972,sell,9691.9,0.002 -binance-futures,BTCUSDT,1582330965213000,1582330965337271,42379973,buy,9692,0.54 -binance-futures,BTCUSDT,1582330971200000,1582330971335172,42379974,buy,9692,0.1 -binance-futures,BTCUSDT,1582330971215000,1582330971624662,42379975,buy,9692,1.34 -binance-futures,BTCUSDT,1582330971264000,1582330971625178,42379976,buy,9692,0.883 -binance-futures,BTCUSDT,1582330971394000,1582330971627010,42379977,buy,9692.51,0.01 -binance-futures,BTCUSDT,1582330973828000,1582330973952933,42379978,sell,9692.5,0.72 -binance-futures,BTCUSDT,1582330973828000,1582330973953265,42379979,sell,9692.5,0.365 -binance-futures,BTCUSDT,1582330977776000,1582330977916130,42379980,buy,9692.51,0.505 -binance-futures,BTCUSDT,1582330981507000,1582330981630223,42379981,sell,9692.57,0.01 -binance-futures,BTCUSDT,1582331000259000,1582331000381339,42379982,sell,9692.8,0.005 -binance-futures,BTCUSDT,1582331000315000,1582331000466446,42379983,sell,9692.51,0.687 -binance-futures,BTCUSDT,1582331000315000,1582331000471179,42379984,sell,9692.5,0.033 -binance-futures,BTCUSDT,1582331000319000,1582331000472733,42379985,sell,9692.5,0.38 -binance-futures,BTCUSDT,1582331000444000,1582331000567557,42379986,sell,9692.5,0.09 -binance-futures,BTCUSDT,1582331003293000,1582331003416540,42379987,sell,9692.5,0.1 -binance-futures,BTCUSDT,1582331005172000,1582331005299279,42379988,sell,9692.5,0.041 -binance-futures,BTCUSDT,1582331005333000,1582331005458757,42379989,buy,9692.51,0.1 -binance-futures,BTCUSDT,1582331005333000,1582331005458763,42379990,buy,9692.51,0.001 -binance-futures,BTCUSDT,1582331005333000,1582331005458885,42379991,buy,9692.51,0.205 -binance-futures,BTCUSDT,1582331006463000,1582331006583392,42379992,buy,9692.51,0.031 -binance-futures,BTCUSDT,1582331006463000,1582331006583944,42379993,buy,9692.53,0.031 -binance-futures,BTCUSDT,1582331006463000,1582331006590649,42379994,buy,9692.63,0.063 -binance-futures,BTCUSDT,1582331007460000,1582331007586421,42379995,buy,9692.63,1.323 -binance-futures,BTCUSDT,1582331010569000,1582331010688707,42379996,sell,9692.5,0.051 -binance-futures,BTCUSDT,1582331011904000,1582331012024370,42379997,buy,9692.51,0.011 -binance-futures,BTCUSDT,1582331012820000,1582331012948885,42379998,buy,9692.51,0.008 -binance-futures,BTCUSDT,1582331012931000,1582331013057254,42379999,buy,9692.51,0.081 -binance-futures,BTCUSDT,1582331012931000,1582331013057464,42380000,buy,9692.62,0.119 -binance-futures,BTCUSDT,1582331018864000,1582331018987488,42380001,sell,9692.5,0.036 -binance-futures,BTCUSDT,1582331021582000,1582331021704620,42380002,buy,9692.51,0.1 -binance-futures,BTCUSDT,1582331021582000,1582331021707295,42380003,buy,9692.51,0.345 -binance-futures,BTCUSDT,1582331021582000,1582331021709139,42380004,buy,9692.63,2.919 -binance-futures,BTCUSDT,1582331021582000,1582331021714427,42380005,buy,9692.9,0.704 -binance-futures,BTCUSDT,1582331021582000,1582331021714442,42380006,buy,9692.91,0.704 -binance-futures,BTCUSDT,1582331021582000,1582331021714451,42380007,buy,9692.91,0.228 -binance-futures,BTCUSDT,1582331025067000,1582331025193605,42380008,buy,9692.51,1 -binance-futures,BTCUSDT,1582331033460000,1582331033585213,42380009,buy,9692.51,0.01 -binance-futures,BTCUSDT,1582331041592000,1582331041723206,42380010,buy,9692.51,0.73 -binance-futures,BTCUSDT,1582331044041000,1582331044166397,42380011,buy,9692.51,0.05 -binance-futures,BTCUSDT,1582331044933000,1582331045055542,42380012,sell,9692.5,0.03 -binance-futures,BTCUSDT,1582331045273000,1582331045398138,42380013,buy,9692.51,0.05 -binance-futures,BTCUSDT,1582331049598000,1582331049722594,42380014,sell,9692.5,2.952 -binance-futures,BTCUSDT,1582331050975000,1582331051099023,42380015,buy,9692.51,0.015 -binance-futures,BTCUSDT,1582331051477000,1582331051603157,42380016,buy,9692.51,0.022 -binance-futures,BTCUSDT,1582331051707000,1582331051829681,42380017,buy,9692.51,0.001 -binance-futures,BTCUSDT,1582331053849000,1582331053975864,42380018,sell,9692.5,0.88 -binance-futures,BTCUSDT,1582331053907000,1582331054029793,42380019,sell,9692.5,0.26 -binance-futures,BTCUSDT,1582331059044000,1582331059170488,42380020,sell,9692.5,1.3 -binance-futures,BTCUSDT,1582331060505000,1582331060637173,42380021,sell,9692.5,0.019 -binance-futures,BTCUSDT,1582331067917000,1582331068043926,42380022,sell,9692.5,0.59 -binance-futures,BTCUSDT,1582331068525000,1582331068650806,42380023,sell,9692.5,0.001 -binance-futures,BTCUSDT,1582331070009000,1582331070135739,42380024,sell,9692.5,2 -binance-futures,BTCUSDT,1582331070033000,1582331070158627,42380025,sell,9692.5,1.237 -binance-futures,BTCUSDT,1582331070033000,1582331070158636,42380026,sell,9692.5,0.5 -binance-futures,BTCUSDT,1582331070033000,1582331070159293,42380027,sell,9692.5,0.263 -binance-futures,BTCUSDT,1582331070033000,1582331070159305,42380028,sell,9692.5,0.424 -binance-futures,BTCUSDT,1582331070033000,1582331070160080,42380029,sell,9692.2,0.005 -binance-futures,BTCUSDT,1582331070153000,1582331070309271,42380030,sell,9691,0.001 -binance-futures,BTCUSDT,1582331070153000,1582331070309274,42380031,sell,9691,0.04 -binance-futures,BTCUSDT,1582331070153000,1582331070309277,42380032,sell,9691,0.1 -binance-futures,BTCUSDT,1582331070194000,1582331070329551,42380033,sell,9690.2,0.047 -binance-futures,BTCUSDT,1582331070266000,1582331070394421,42380034,sell,9690,0.001 -binance-futures,BTCUSDT,1582331070266000,1582331070400181,42380035,sell,9690,0.01 -binance-futures,BTCUSDT,1582331070266000,1582331070400189,42380036,sell,9690,0.004 -binance-futures,BTCUSDT,1582331070266000,1582331070400195,42380037,sell,9690,0.005 -binance-futures,BTCUSDT,1582331070266000,1582331070400199,42380038,sell,9690,0.003 -binance-futures,BTCUSDT,1582331070266000,1582331070401005,42380039,sell,9690,0.001 -binance-futures,BTCUSDT,1582331070266000,1582331070401014,42380040,sell,9690,0.006 -binance-futures,BTCUSDT,1582331070266000,1582331070401019,42380041,sell,9690,0.005 -binance-futures,BTCUSDT,1582331070266000,1582331070401029,42380042,sell,9690,0.066 -binance-futures,BTCUSDT,1582331070266000,1582331070401034,42380043,sell,9690,0.004 -binance-futures,BTCUSDT,1582331070266000,1582331070401039,42380044,sell,9690,0.007 -binance-futures,BTCUSDT,1582331070266000,1582331070405385,42380045,sell,9690,0.004 -binance-futures,BTCUSDT,1582331070266000,1582331070405395,42380046,sell,9690,0.008 -binance-futures,BTCUSDT,1582331070266000,1582331070405400,42380047,sell,9690,0.01 -binance-futures,BTCUSDT,1582331070266000,1582331070405404,42380048,sell,9690,0.004 -binance-futures,BTCUSDT,1582331070266000,1582331070405408,42380049,sell,9690,0.25 -binance-futures,BTCUSDT,1582331070266000,1582331070405413,42380050,sell,9690,0.051 -binance-futures,BTCUSDT,1582331070266000,1582331070408151,42380051,sell,9689.57,0.012 -binance-futures,BTCUSDT,1582331070266000,1582331070408551,42380052,sell,9689.4,0.047 -binance-futures,BTCUSDT,1582331070266000,1582331070412084,42380053,sell,9689,0.001 -binance-futures,BTCUSDT,1582331070266000,1582331070415817,42380054,sell,9689,0.009 -binance-futures,BTCUSDT,1582331070266000,1582331070415824,42380055,sell,9689,0.003 -binance-futures,BTCUSDT,1582331070266000,1582331070415827,42380056,sell,9689,0.007 -binance-futures,BTCUSDT,1582331070266000,1582331070415830,42380057,sell,9689,0.017 -binance-futures,BTCUSDT,1582331070266000,1582331070415834,42380058,sell,9689,0.002 -binance-futures,BTCUSDT,1582331070266000,1582331070417737,42380059,sell,9688.87,0.04 -binance-futures,BTCUSDT,1582331070266000,1582331070689454,42380060,sell,9688.52,0.004 -binance-futures,BTCUSDT,1582331070266000,1582331070689483,42380061,sell,9688.18,0.524 -binance-futures,BTCUSDT,1582331070897000,1582331071024983,42380062,buy,9688.42,0.317 -binance-futures,BTCUSDT,1582331075899000,1582331076024761,42380063,buy,9688.42,1.725 -binance-futures,BTCUSDT,1582331078598000,1582331078722224,42380064,buy,9688.42,0.1 -binance-futures,BTCUSDT,1582331078815000,1582331078937042,42380065,buy,9688.79,2.299 -binance-futures,BTCUSDT,1582331081600000,1582331081729766,42380066,buy,9688.79,0.012 -binance-futures,BTCUSDT,1582331084216000,1582331084341390,42380067,sell,9688.78,0.951 -binance-futures,BTCUSDT,1582331093038000,1582331093162554,42380068,sell,9688.16,0.224 -binance-futures,BTCUSDT,1582331095581000,1582331095706316,42380069,buy,9688.17,0.08 -binance-futures,BTCUSDT,1582331096709000,1582331096830011,42380070,sell,9688.16,0.205 -binance-futures,BTCUSDT,1582331100607000,1582331100736317,42380071,buy,9688.17,0.001 -binance-futures,BTCUSDT,1582331101221000,1582331101359022,42380072,buy,9688.17,0.03 -binance-futures,BTCUSDT,1582331102086000,1582331102210782,42380073,buy,9688.17,0.001 -binance-futures,BTCUSDT,1582331106766000,1582331106891903,42380074,buy,9688.17,0.74 -binance-futures,BTCUSDT,1582331106766000,1582331106900356,42380075,buy,9688.17,0.67 -binance-futures,BTCUSDT,1582331106770000,1582331106900993,42380076,buy,9688.17,0.429 -binance-futures,BTCUSDT,1582331106770000,1582331106901012,42380077,buy,9688.17,0.1 -binance-futures,BTCUSDT,1582331106793000,1582331106923195,42380078,buy,9688.69,0.003 -binance-futures,BTCUSDT,1582331106793000,1582331106923202,42380079,buy,9688.69,3.076 -binance-futures,BTCUSDT,1582331106815000,1582331106943833,42380080,buy,9688.69,1.66 -binance-futures,BTCUSDT,1582331106815000,1582331106943841,42380081,buy,9688.7,0.34 -binance-futures,BTCUSDT,1582331106818000,1582331106948545,42380082,buy,9688.7,1.001 -binance-futures,BTCUSDT,1582331106818000,1582331106948549,42380083,buy,9688.7,0.005 -binance-futures,BTCUSDT,1582331106818000,1582331106948809,42380084,buy,9688.79,0.068 -binance-futures,BTCUSDT,1582331106818000,1582331106950551,42380085,buy,9688.79,0.2 -binance-futures,BTCUSDT,1582331106981000,1582331107109513,42380086,buy,9689.41,0.67 -binance-futures,BTCUSDT,1582331107478000,1582331107605545,42380087,sell,9689.4,0.681 -binance-futures,BTCUSDT,1582331108059000,1582331108185337,42380088,sell,9689.4,0.194 -binance-futures,BTCUSDT,1582331108347000,1582331108475175,42380089,sell,9689.4,0.051 -binance-futures,BTCUSDT,1582331110540000,1582331110663766,42380090,buy,9689.41,0.25 -binance-futures,BTCUSDT,1582331112482000,1582331112607182,42380091,buy,9689.41,0.1 -binance-futures,BTCUSDT,1582331113980000,1582331114107136,42380092,buy,9689.41,1.502 -binance-futures,BTCUSDT,1582331113980000,1582331114108983,42380093,buy,9689.41,0.1 -binance-futures,BTCUSDT,1582331113980000,1582331114115114,42380094,buy,9690.04,0.23 -binance-futures,BTCUSDT,1582331113980000,1582331114117524,42380095,buy,9690.04,0.23 -binance-futures,BTCUSDT,1582331113980000,1582331114119969,42380096,buy,9690.49,0.013 -binance-futures,BTCUSDT,1582331113980000,1582331114119986,42380097,buy,9690.5,0.731 -binance-futures,BTCUSDT,1582331113980000,1582331114122489,42380098,buy,9690.5,0.731 -binance-futures,BTCUSDT,1582331113980000,1582331114122498,42380099,buy,9690.52,0.09 -binance-futures,BTCUSDT,1582331113980000,1582331114126032,42380100,buy,9690.62,0.23 -binance-futures,BTCUSDT,1582331113980000,1582331114126042,42380101,buy,9690.8,0.23 -binance-futures,BTCUSDT,1582331113980000,1582331114127128,42380102,buy,9690.92,0.02 -binance-futures,BTCUSDT,1582331113980000,1582331114128617,42380103,buy,9691.01,0.166 -binance-futures,BTCUSDT,1582331114428000,1582331114552890,42380104,sell,9690.51,0.005 -binance-futures,BTCUSDT,1582331117266000,1582331117389389,42380105,buy,9690.52,0.1 -binance-futures,BTCUSDT,1582331117453000,1582331117578020,42380106,buy,9690.52,0.1 -binance-futures,BTCUSDT,1582331117702000,1582331117824276,42380107,buy,9690.52,0.1 -binance-futures,BTCUSDT,1582331117996000,1582331118122250,42380108,buy,9690.52,0.1 -binance-futures,BTCUSDT,1582331118129000,1582331118255414,42380109,buy,9690.52,0.1 -binance-futures,BTCUSDT,1582331118404000,1582331118531331,42380110,buy,9690.52,0.1 -binance-futures,BTCUSDT,1582331118556000,1582331118682611,42380111,buy,9690.52,0.1 -binance-futures,BTCUSDT,1582331118812000,1582331118937061,42380112,buy,9690.52,0.1 -binance-futures,BTCUSDT,1582331118984000,1582331119109045,42380113,buy,9690.52,0.1 -binance-futures,BTCUSDT,1582331119860000,1582331119983537,42380114,buy,9690.52,0.1 -binance-futures,BTCUSDT,1582331120680000,1582331120803638,42380115,buy,9691.3,0.1 -binance-futures,BTCUSDT,1582331120680000,1582331120806089,42380116,buy,9691.3,0.735 -binance-futures,BTCUSDT,1582331122185000,1582331122336513,42380117,buy,9691.29,0.1 -binance-futures,BTCUSDT,1582331132780000,1582331132906853,42380118,buy,9690.71,0.046 -binance-futures,BTCUSDT,1582331135416000,1582331135543048,42380119,buy,9690.71,0.01 -binance-futures,BTCUSDT,1582331139273000,1582331139547460,42380120,buy,9690.71,0.04 -binance-futures,BTCUSDT,1582331140114000,1582331140244281,42380121,sell,9690.7,0.001 -binance-futures,BTCUSDT,1582331150716000,1582331150843552,42380122,sell,9690.7,0.03 -binance-futures,BTCUSDT,1582331150716000,1582331150843556,42380123,sell,9690.7,0.07 -binance-futures,BTCUSDT,1582331152081000,1582331152209148,42380124,buy,9690.71,0.1 -binance-futures,BTCUSDT,1582331152081000,1582331152212578,42380125,buy,9690.83,2.753 -binance-futures,BTCUSDT,1582331152081000,1582331152217486,42380126,buy,9691.4,0.005 -binance-futures,BTCUSDT,1582331152081000,1582331152217497,42380127,buy,9692,0.002 -binance-futures,BTCUSDT,1582331152081000,1582331152222368,42380128,buy,9692.07,0.172 -binance-futures,BTCUSDT,1582331152081000,1582331152222376,42380129,buy,9692.2,0.968 -binance-futures,BTCUSDT,1582331155499000,1582331155627124,42380130,sell,9691.82,0.001 -binance-futures,BTCUSDT,1582331157778000,1582331157902459,42380131,sell,9691.81,0.031 -binance-futures,BTCUSDT,1582331157779000,1582331157902748,42380132,sell,9691.8,0.019 -binance-futures,BTCUSDT,1582331159361000,1582331159501381,42380133,buy,9691.83,0.1 -binance-futures,BTCUSDT,1582331159459000,1582331159587280,42380134,buy,9691.83,2 -binance-futures,BTCUSDT,1582331159486000,1582331159617537,42380135,buy,9692.47,2 -binance-futures,BTCUSDT,1582331159486000,1582331159617542,42380136,buy,9692.47,0.488 -binance-futures,BTCUSDT,1582331159486000,1582331159617551,42380137,buy,9692.5,0.005 -binance-futures,BTCUSDT,1582331159486000,1582331159620195,42380138,buy,9692.51,0.681 -binance-futures,BTCUSDT,1582331159525000,1582331159653787,42380139,buy,9693,0.1 -binance-futures,BTCUSDT,1582331159525000,1582331159656727,42380140,buy,9693,1.9 -binance-futures,BTCUSDT,1582331159527000,1582331159656746,42380141,buy,9693,1.744 -binance-futures,BTCUSDT,1582331159527000,1582331159657810,42380142,buy,9693.1,0.256 -binance-futures,BTCUSDT,1582331159527000,1582331159659160,42380143,buy,9693.1,0.425 -binance-futures,BTCUSDT,1582331159542000,1582331159672002,42380144,buy,9693.42,0.002 -binance-futures,BTCUSDT,1582331159542000,1582331159678219,42380145,buy,9693.61,0.02 -binance-futures,BTCUSDT,1582331159542000,1582331159681838,42380146,buy,9693.81,0.078 -binance-futures,BTCUSDT,1582331159556000,1582331159689315,42380147,buy,9693.42,2 -binance-futures,BTCUSDT,1582331159583000,1582331159713471,42380148,buy,9693.81,0.08 -binance-futures,BTCUSDT,1582331159583000,1582331159713495,42380149,buy,9693.9,0.038 -binance-futures,BTCUSDT,1582331159609000,1582331159735600,42380150,buy,9694.19,2.056 -binance-futures,BTCUSDT,1582331159777000,1582331159907871,42380151,buy,9694.19,0.144 -binance-futures,BTCUSDT,1582331159789000,1582331159915520,42380152,buy,9694.19,0.1 -binance-futures,BTCUSDT,1582331160685000,1582331160811206,42380153,buy,9694.19,0.01 -binance-futures,BTCUSDT,1582331160694000,1582331160822533,42380154,buy,9694.19,0.81 -binance-futures,BTCUSDT,1582331160697000,1582331160822547,42380155,buy,9694.19,0.091 -binance-futures,BTCUSDT,1582331160917000,1582331161046394,42380156,buy,9694.99,0.1 -binance-futures,BTCUSDT,1582331160955000,1582331161087445,42380157,buy,9694.99,0.66 -binance-futures,BTCUSDT,1582331160962000,1582331161094370,42380158,buy,9694.99,0.01 -binance-futures,BTCUSDT,1582331161171000,1582331161298780,42380159,buy,9694.99,2 -binance-futures,BTCUSDT,1582331161176000,1582331161304294,42380160,buy,9694.99,0.785 -binance-futures,BTCUSDT,1582331161200000,1582331161331496,42380161,buy,9695.44,3.235 -binance-futures,BTCUSDT,1582331161200000,1582331161331506,42380162,buy,9695.44,0.1 -binance-futures,BTCUSDT,1582331161222000,1582331161355422,42380163,buy,9695.44,2.202 -binance-futures,BTCUSDT,1582331161226000,1582331161355461,42380164,buy,9695.44,3.179 -binance-futures,BTCUSDT,1582331161228000,1582331161359623,42380165,buy,9695.44,2 -binance-futures,BTCUSDT,1582331161253000,1582331161404315,42380166,buy,9695.44,2.379 -binance-futures,BTCUSDT,1582331161253000,1582331161404329,42380167,buy,9695.44,0.406 -binance-futures,BTCUSDT,1582331161254000,1582331161414180,42380168,buy,9695.44,2 -binance-futures,BTCUSDT,1582331161259000,1582331161418753,42380169,buy,9695.44,0.652 -binance-futures,BTCUSDT,1582331161261000,1582331161418764,42380170,buy,9695.44,0.065 -binance-futures,BTCUSDT,1582331161335000,1582331161462667,42380171,buy,9695.49,0.681 -binance-futures,BTCUSDT,1582331161427000,1582331161556846,42380172,buy,9695.49,0.1 -binance-futures,BTCUSDT,1582331161480000,1582331161606617,42380173,buy,9695.49,3.581 -binance-futures,BTCUSDT,1582331161606000,1582331161732962,42380174,buy,9695.55,0.047 -binance-futures,BTCUSDT,1582331161606000,1582331161733214,42380175,buy,9695.75,0.012 -binance-futures,BTCUSDT,1582331161606000,1582331161739501,42380176,buy,9695.86,1.679 -binance-futures,BTCUSDT,1582331161611000,1582331161741799,42380177,buy,9695.86,0.047 -binance-futures,BTCUSDT,1582331161628000,1582331161754472,42380178,buy,9695.86,0.1 -binance-futures,BTCUSDT,1582331161847000,1582331161971926,42380179,buy,9695.86,0.1 -binance-futures,BTCUSDT,1582331162436000,1582331162561974,42380180,buy,9695.86,0.1 -binance-futures,BTCUSDT,1582331162922000,1582331163050903,42380181,buy,9695.86,0.68 -binance-futures,BTCUSDT,1582331162927000,1582331163055125,42380182,buy,9695.86,0.1 -binance-futures,BTCUSDT,1582331163010000,1582331163141015,42380183,buy,9695.86,0.72 -binance-futures,BTCUSDT,1582331163018000,1582331163144825,42380184,buy,9695.86,0.68 -binance-futures,BTCUSDT,1582331163704000,1582331163831421,42380185,buy,9695.86,0.531 -binance-futures,BTCUSDT,1582331166339000,1582331166471901,42380186,sell,9695.85,0.001 -binance-futures,BTCUSDT,1582331166416000,1582331166539622,42380187,sell,9695.85,0.05 -binance-futures,BTCUSDT,1582331167140000,1582331167265358,42380188,buy,9695.86,0.161 -binance-futures,BTCUSDT,1582331170596000,1582331170724282,42380189,buy,9695.86,0.5 -binance-futures,BTCUSDT,1582331170616000,1582331170741847,42380190,buy,9695.86,0.95 -binance-futures,BTCUSDT,1582331170618000,1582331170747673,42380191,buy,9695.86,2 -binance-futures,BTCUSDT,1582331170621000,1582331170749491,42380192,buy,9695.86,0.235 -binance-futures,BTCUSDT,1582331170642000,1582331170768936,42380193,buy,9695.86,0.9 -binance-futures,BTCUSDT,1582331170642000,1582331170769113,42380194,buy,9695.86,0.75 -binance-futures,BTCUSDT,1582331170643000,1582331170769123,42380195,buy,9695.86,0.6 -binance-futures,BTCUSDT,1582331170645000,1582331170774085,42380196,buy,9695.86,0.3 -binance-futures,BTCUSDT,1582331170719000,1582331170844975,42380197,buy,9695.86,0.75 -binance-futures,BTCUSDT,1582331170737000,1582331170862204,42380198,buy,9695.86,0.5 -binance-futures,BTCUSDT,1582331170752000,1582331170876821,42380199,buy,9695.86,0.15 -binance-futures,BTCUSDT,1582331170753000,1582331170876956,42380200,buy,9695.86,1.9 -binance-futures,BTCUSDT,1582331170753000,1582331170876964,42380201,buy,9695.86,0.2 -binance-futures,BTCUSDT,1582331170757000,1582331170886150,42380202,buy,9695.86,0.55 -binance-futures,BTCUSDT,1582331170757000,1582331170886156,42380203,buy,9695.86,0.1 -binance-futures,BTCUSDT,1582331170759000,1582331170890260,42380204,buy,9695.86,0.05 -binance-futures,BTCUSDT,1582331170761000,1582331170890264,42380205,buy,9695.86,0.8 -binance-futures,BTCUSDT,1582331170761000,1582331170890269,42380206,buy,9695.86,0.1 -binance-futures,BTCUSDT,1582331170765000,1582331170893443,42380207,buy,9695.86,0.35 -binance-futures,BTCUSDT,1582331170765000,1582331170893450,42380208,buy,9695.86,0.05 -binance-futures,BTCUSDT,1582331170771000,1582331170899084,42380209,buy,9695.86,0.8 -binance-futures,BTCUSDT,1582331170771000,1582331170899266,42380210,buy,9695.86,0.75 -binance-futures,BTCUSDT,1582331170772000,1582331170899277,42380211,buy,9695.86,0.352 -binance-futures,BTCUSDT,1582331170772000,1582331170899360,42380212,buy,9695.86,0.065 -binance-futures,BTCUSDT,1582331170825000,1582331170951129,42380213,buy,9696,0.3 -binance-futures,BTCUSDT,1582331170826000,1582331170955788,42380214,buy,9696.01,0.047 -binance-futures,BTCUSDT,1582331170887000,1582331171013001,42380215,buy,9696.6,0.005 -binance-futures,BTCUSDT,1582331172042000,1582331172168784,42380216,buy,9696.79,0.025 -binance-futures,BTCUSDT,1582331172239000,1582331172366816,42380217,buy,9696.79,0.015 -binance-futures,BTCUSDT,1582331172239000,1582331172367137,42380218,buy,9696.79,0.1 -binance-futures,BTCUSDT,1582331173504000,1582331173631033,42380219,buy,9698,0.003 -binance-futures,BTCUSDT,1582331173504000,1582331173633252,42380220,buy,9698,0.286 -binance-futures,BTCUSDT,1582331174196000,1582331174322250,42380221,buy,9698,0.02 -binance-futures,BTCUSDT,1582331174196000,1582331174322292,42380222,buy,9698,0.889 -binance-futures,BTCUSDT,1582331176460000,1582331176586792,42380223,buy,9698.1,1 -binance-futures,BTCUSDT,1582331177115000,1582331177241866,42380224,buy,9698.1,0.004 -binance-futures,BTCUSDT,1582331180696000,1582331180821217,42380225,sell,9698.09,0.417 -binance-futures,BTCUSDT,1582331181052000,1582331181177753,42380226,buy,9698.03,1 -binance-futures,BTCUSDT,1582331181347000,1582331181473230,42380227,buy,9698.08,1 -binance-futures,BTCUSDT,1582331181347000,1582331181473837,42380228,buy,9698.1,0.358 -binance-futures,BTCUSDT,1582331181347000,1582331181481871,42380229,buy,9698.63,0.1 -binance-futures,BTCUSDT,1582331181347000,1582331181481884,42380230,buy,9698.63,0.203 -binance-futures,BTCUSDT,1582331181347000,1582331181481888,42380231,buy,9698.68,2 -binance-futures,BTCUSDT,1582331181347000,1582331181490538,42380232,buy,9698.9,0.005 -binance-futures,BTCUSDT,1582331181347000,1582331181490545,42380233,buy,9699.47,0.012 -binance-futures,BTCUSDT,1582331181347000,1582331181493878,42380234,buy,9699.51,2 -binance-futures,BTCUSDT,1582331181347000,1582331181493896,42380235,buy,9699.99,0.704 -binance-futures,BTCUSDT,1582331181347000,1582331181493899,42380236,buy,9700,1 -binance-futures,BTCUSDT,1582331181347000,1582331181497423,42380237,buy,9700,0.038 -binance-futures,BTCUSDT,1582331181347000,1582331181497434,42380238,buy,9700,0.47 -binance-futures,BTCUSDT,1582331181347000,1582331181497441,42380239,buy,9700.39,0.897 -binance-futures,BTCUSDT,1582331181347000,1582331181497444,42380240,buy,9700.39,0.897 -binance-futures,BTCUSDT,1582331181347000,1582331181497447,42380241,buy,9700.4,5.201 -binance-futures,BTCUSDT,1582331181347000,1582331181498620,42380242,buy,9701.02,0.025 -binance-futures,BTCUSDT,1582331181347000,1582331181498629,42380243,buy,9701.38,0.047 -binance-futures,BTCUSDT,1582331181347000,1582331181498639,42380244,buy,9701.38,8.182 -binance-futures,BTCUSDT,1582331186958000,1582331187084772,42380245,buy,9699.21,0.089 -binance-futures,BTCUSDT,1582331186958000,1582331187084877,42380246,buy,9699.21,0.011 -binance-futures,BTCUSDT,1582331187130000,1582331187258227,42380247,buy,9699.21,0.1 -binance-futures,BTCUSDT,1582331187135000,1582331187262337,42380248,sell,9699.2,0.005 -binance-futures,BTCUSDT,1582331187135000,1582331187265292,42380249,sell,9698.23,0.045 -binance-futures,BTCUSDT,1582331187383000,1582331187508371,42380250,buy,9699.11,0.1 -binance-futures,BTCUSDT,1582331187831000,1582331187958672,42380251,buy,9698.77,0.503 -binance-futures,BTCUSDT,1582331190076000,1582331190203901,42380252,buy,9698.86,0.1 -binance-futures,BTCUSDT,1582331190076000,1582331190203911,42380253,buy,9700.23,0.903 -binance-futures,BTCUSDT,1582331190690000,1582331190814506,42380254,sell,9698.19,0.463 -binance-futures,BTCUSDT,1582331190690000,1582331190816490,42380255,sell,9698.19,1.103 -binance-futures,BTCUSDT,1582331198477000,1582331198599813,42380256,buy,9699.91,0.139 -binance-futures,BTCUSDT,1582331199030000,1582331199154524,42380257,buy,9699.91,0.03 -binance-futures,BTCUSDT,1582331200085000,1582331200209897,42380258,sell,9699.9,0.005 -binance-futures,BTCUSDT,1582331200094000,1582331200220359,42380259,buy,9698.77,1.453 -binance-futures,BTCUSDT,1582331200094000,1582331200223335,42380260,buy,9699.91,0.981 -binance-futures,BTCUSDT,1582331200151000,1582331200278480,42380261,buy,9699.89,0.322 -binance-futures,BTCUSDT,1582331200151000,1582331200281946,42380262,buy,9699.91,0.1 -binance-futures,BTCUSDT,1582331200151000,1582331200282475,42380263,buy,9700.23,0.298 -binance-futures,BTCUSDT,1582331202498000,1582331202623527,42380264,buy,9699.8,0.005 -binance-futures,BTCUSDT,1582331202498000,1582331202637072,42380265,buy,9699.83,0.196 -binance-futures,BTCUSDT,1582331202498000,1582331202637084,42380266,buy,9700.23,0.021 -binance-futures,BTCUSDT,1582331203497000,1582331203622203,42380267,buy,9700.14,0.019 -binance-futures,BTCUSDT,1582331205107000,1582331205234462,42380268,buy,9699.24,0.1 -binance-futures,BTCUSDT,1582331205107000,1582331205242184,42380269,buy,9699.82,0.12 -binance-futures,BTCUSDT,1582331205107000,1582331205242193,42380270,buy,9699.89,0.005 -binance-futures,BTCUSDT,1582331205107000,1582331205247440,42380271,buy,9699.9,0.275 -binance-futures,BTCUSDT,1582331205510000,1582331205641757,42380272,buy,9699.4,0.132 -binance-futures,BTCUSDT,1582331206457000,1582331206583483,42380273,sell,9698.8,0.001 -binance-futures,BTCUSDT,1582331207482000,1582331207614403,42380274,buy,9700.23,0.01 -binance-futures,BTCUSDT,1582331207487000,1582331207614438,42380275,buy,9700.23,0.01 -binance-futures,BTCUSDT,1582331207731000,1582331207859544,42380276,buy,9700.23,0.018 -binance-futures,BTCUSDT,1582331208127000,1582331208255029,42380277,buy,9700.23,0.48 -binance-futures,BTCUSDT,1582331209120000,1582331209248940,42380278,buy,9700.23,0.002 -binance-futures,BTCUSDT,1582331209278000,1582331209422490,42380279,sell,9700.22,0.08 -binance-futures,BTCUSDT,1582331211395000,1582331211520203,42380280,buy,9700.23,0.002 -binance-futures,BTCUSDT,1582331211729000,1582331211854346,42380281,sell,9700.22,0.02 -binance-futures,BTCUSDT,1582331211729000,1582331211856515,42380282,sell,9700.22,0.005 -binance-futures,BTCUSDT,1582331211729000,1582331211856530,42380283,sell,9700.22,0.075 -binance-futures,BTCUSDT,1582331212988000,1582331213109304,42380284,buy,9700.23,0.482 -binance-futures,BTCUSDT,1582331212988000,1582331213109319,42380285,buy,9700.23,0.1 -binance-futures,BTCUSDT,1582331212988000,1582331213109535,42380286,buy,9700.8,0.1 -binance-futures,BTCUSDT,1582331212988000,1582331213112409,42380287,buy,9701.2,0.005 -binance-futures,BTCUSDT,1582331212988000,1582331213114872,42380288,buy,9701.58,0.012 -binance-futures,BTCUSDT,1582331212988000,1582331213119305,42380289,buy,9701.82,0.047 -binance-futures,BTCUSDT,1582331212988000,1582331213120666,42380290,buy,9701.95,1.072 -binance-futures,BTCUSDT,1582331213109000,1582331213236459,42380291,sell,9700.76,0.1 -binance-futures,BTCUSDT,1582331213182000,1582331213322027,42380292,buy,9701.94,0.001 -binance-futures,BTCUSDT,1582331213308000,1582331213431629,42380293,buy,9701.94,0.019 -binance-futures,BTCUSDT,1582331213308000,1582331213431638,42380294,buy,9702,0.001 -binance-futures,BTCUSDT,1582331213308000,1582331213434852,42380295,buy,9702.33,3.517 -binance-futures,BTCUSDT,1582331213343000,1582331213468659,42380296,sell,9701.53,0.043 -binance-futures,BTCUSDT,1582331215698000,1582331215828666,42380297,sell,9701.91,0.031 -binance-futures,BTCUSDT,1582331215698000,1582331215828689,42380298,sell,9701.9,0.015 -binance-futures,BTCUSDT,1582331217229000,1582331217356114,42380299,buy,9701.97,0.151 -binance-futures,BTCUSDT,1582331220894000,1582331221017585,42380300,buy,9702,0.1 -binance-futures,BTCUSDT,1582331220894000,1582331221017595,42380301,buy,9702,0.1 -binance-futures,BTCUSDT,1582331220894000,1582331221017600,42380302,buy,9702,0.1 -binance-futures,BTCUSDT,1582331220894000,1582331221027885,42380303,buy,9702,0.129 -binance-futures,BTCUSDT,1582331220894000,1582331221027892,42380304,buy,9703,0.001 -binance-futures,BTCUSDT,1582331220894000,1582331221027899,42380305,buy,9703,0.1 -binance-futures,BTCUSDT,1582331220894000,1582331221027903,42380306,buy,9703,0.005 -binance-futures,BTCUSDT,1582331220896000,1582331221027909,42380307,sell,9703,2.465 -binance-futures,BTCUSDT,1582331221470000,1582331221598739,42380308,sell,9701.99,0.001 -binance-futures,BTCUSDT,1582331222661000,1582331222783970,42380309,buy,9702,0.042 -binance-futures,BTCUSDT,1582331222703000,1582331222832389,42380310,sell,9701.99,0.099 -binance-futures,BTCUSDT,1582331222703000,1582331222832396,42380311,sell,9701.99,0.101 -binance-futures,BTCUSDT,1582331223086000,1582331223210084,42380312,sell,9701.99,1.237 -binance-futures,BTCUSDT,1582331226641000,1582331226765030,42380313,sell,9701.99,1 -binance-futures,BTCUSDT,1582331227209000,1582331227332377,42380314,sell,9701.99,0.542 -binance-futures,BTCUSDT,1582331228083000,1582331228210253,42380315,sell,9701.99,0.05 -binance-futures,BTCUSDT,1582331229021000,1582331229148427,42380316,sell,9701.8,0.005 -binance-futures,BTCUSDT,1582331229021000,1582331229148598,42380317,sell,9701.42,0.665 -binance-futures,BTCUSDT,1582331229090000,1582331229214645,42380318,sell,9701.42,0.67 -binance-futures,BTCUSDT,1582331229142000,1582331229273259,42380319,sell,9701.42,0.01 -binance-futures,BTCUSDT,1582331229160000,1582331229285055,42380320,sell,9701.42,0.72 -binance-futures,BTCUSDT,1582331234372000,1582331234494910,42380321,buy,9701.28,0.1 -binance-futures,BTCUSDT,1582331234516000,1582331234642889,42380322,buy,9701.99,0.44 -binance-futures,BTCUSDT,1582331234895000,1582331235020701,42380323,sell,9701.25,0.5 -binance-futures,BTCUSDT,1582331235418000,1582331235541785,42380324,buy,9701.14,2 -binance-futures,BTCUSDT,1582331235418000,1582331235541791,42380325,buy,9701.14,5.65 -binance-futures,BTCUSDT,1582331235418000,1582331235541795,42380326,buy,9701.14,0.031 -binance-futures,BTCUSDT,1582331235418000,1582331235541798,42380327,buy,9701.15,0.031 -binance-futures,BTCUSDT,1582331235418000,1582331235545229,42380328,buy,9701.16,0.004 -binance-futures,BTCUSDT,1582331235418000,1582331235547729,42380329,buy,9701.22,0.1 -binance-futures,BTCUSDT,1582331235418000,1582331235550281,42380330,buy,9701.93,0.078 -binance-futures,BTCUSDT,1582331235418000,1582331235553180,42380331,buy,9701.99,0.325 -binance-futures,BTCUSDT,1582331235418000,1582331235553190,42380332,buy,9701.99,0.001 -binance-futures,BTCUSDT,1582331235418000,1582331235553200,42380333,buy,9702,0.503 -binance-futures,BTCUSDT,1582331235418000,1582331235553204,42380334,buy,9702,0.681 -binance-futures,BTCUSDT,1582331235418000,1582331235553209,42380335,buy,9702,0.1 -binance-futures,BTCUSDT,1582331235418000,1582331235553213,42380336,buy,9702,1 -binance-futures,BTCUSDT,1582331237403000,1582331237528601,42380337,sell,9702.39,0.031 -binance-futures,BTCUSDT,1582331237403000,1582331237528846,42380338,sell,9702.38,0.031 -binance-futures,BTCUSDT,1582331237403000,1582331237536972,42380339,sell,9702.37,0.031 -binance-futures,BTCUSDT,1582331237403000,1582331237541360,42380340,sell,9702.35,0.007 -binance-futures,BTCUSDT,1582331237660000,1582331237785879,42380341,buy,9702.01,0.685 -binance-futures,BTCUSDT,1582331239353000,1582331239478509,42380342,buy,9702.01,2 -binance-futures,BTCUSDT,1582331239353000,1582331239481874,42380343,buy,9702.01,0.1 -binance-futures,BTCUSDT,1582331239353000,1582331239481880,42380344,buy,9702.03,0.031 -binance-futures,BTCUSDT,1582331239353000,1582331239481885,42380345,buy,9702.04,0.031 -binance-futures,BTCUSDT,1582331239353000,1582331239490470,42380346,buy,9702.05,0.031 -binance-futures,BTCUSDT,1582331239353000,1582331239490477,42380347,buy,9702.31,0.1 -binance-futures,BTCUSDT,1582331239353000,1582331239490488,42380348,buy,9702.4,0.005 -binance-futures,BTCUSDT,1582331239353000,1582331239501213,42380349,buy,9702.89,0.048 -binance-futures,BTCUSDT,1582331239353000,1582331239501217,42380350,buy,9703,0.1 -binance-futures,BTCUSDT,1582331239353000,1582331239501226,42380351,buy,9703.01,0.04 -binance-futures,BTCUSDT,1582331239353000,1582331239501241,42380352,buy,9703.09,0.04 -binance-futures,BTCUSDT,1582331239353000,1582331239501246,42380353,buy,9703.09,0.04 -binance-futures,BTCUSDT,1582331239353000,1582331239501255,42380354,buy,9703.42,0.05 -binance-futures,BTCUSDT,1582331239353000,1582331239502423,42380355,buy,9703.82,0.018 -binance-futures,BTCUSDT,1582331239353000,1582331239502432,42380356,buy,9703.83,0.08 -binance-futures,BTCUSDT,1582331239353000,1582331239502437,42380357,buy,9703.92,0.024 -binance-futures,BTCUSDT,1582331239353000,1582331239505154,42380358,buy,9704,0.13 -binance-futures,BTCUSDT,1582331239353000,1582331239505172,42380359,buy,9704.03,0.15 -binance-futures,BTCUSDT,1582331239353000,1582331239505176,42380360,buy,9704.04,0.002 -binance-futures,BTCUSDT,1582331239353000,1582331239505190,42380361,buy,9704.05,1.416 -binance-futures,BTCUSDT,1582331239408000,1582331239532197,42380362,sell,9703.96,1 -binance-futures,BTCUSDT,1582331239456000,1582331239587276,42380363,sell,9702.39,0.704 -binance-futures,BTCUSDT,1582331239456000,1582331239588004,42380364,sell,9702.39,0.016 -binance-futures,BTCUSDT,1582331239639000,1582331239765160,42380365,buy,9703.68,0.005 -binance-futures,BTCUSDT,1582331239639000,1582331239767391,42380366,buy,9703.68,0.019 -binance-futures,BTCUSDT,1582331239648000,1582331239775118,42380367,buy,9703.68,0.661 -binance-futures,BTCUSDT,1582331239648000,1582331239775126,42380368,buy,9703.68,0.391 -binance-futures,BTCUSDT,1582331239654000,1582331239781850,42380369,buy,9703.68,0.266 -binance-futures,BTCUSDT,1582331239686000,1582331239817295,42380370,buy,9703.73,0.09 -binance-futures,BTCUSDT,1582331239686000,1582331239819059,42380371,sell,9703.72,0.001 -binance-futures,BTCUSDT,1582331239696000,1582331239824520,42380372,buy,9704.05,0.22 -binance-futures,BTCUSDT,1582331239712000,1582331239835929,42380373,buy,9704.05,0.442 -binance-futures,BTCUSDT,1582331239732000,1582331239867217,42380374,buy,9703.67,0.001 -binance-futures,BTCUSDT,1582331239732000,1582331239867228,42380375,buy,9703.73,0.032 -binance-futures,BTCUSDT,1582331239758000,1582331239896738,42380376,buy,9704.2,0.151 -binance-futures,BTCUSDT,1582331239777000,1582331239904214,42380377,buy,9704.2,0.762 -binance-futures,BTCUSDT,1582331239792000,1582331239920970,42380378,buy,9704.2,0.162 -binance-futures,BTCUSDT,1582331239813000,1582331239941349,42380379,buy,9704.2,0.352 -binance-futures,BTCUSDT,1582331239830000,1582331239957813,42380380,buy,9704.2,0.02 -binance-futures,BTCUSDT,1582331239866000,1582331239990474,42380381,buy,9704.2,0.035 -binance-futures,BTCUSDT,1582331239881000,1582331240010359,42380382,buy,9704.2,0.728 -binance-futures,BTCUSDT,1582331239899000,1582331240030439,42380383,buy,9704.2,0.212 -binance-futures,BTCUSDT,1582331239925000,1582331240049329,42380384,buy,9704.23,0.054 -binance-futures,BTCUSDT,1582331239959000,1582331240089220,42380385,buy,9704.69,0.191 -binance-futures,BTCUSDT,1582331240001000,1582331240132346,42380386,buy,9704.79,0.002 -binance-futures,BTCUSDT,1582331240007000,1582331240143146,42380387,buy,9704.92,0.04 -binance-futures,BTCUSDT,1582331240012000,1582331240149345,42380388,buy,9705,0.02 -binance-futures,BTCUSDT,1582331240012000,1582331240149349,42380389,buy,9705,0.113 -binance-futures,BTCUSDT,1582331240012000,1582331240149352,42380390,buy,9705,1.577 -binance-futures,BTCUSDT,1582331240043000,1582331240172708,42380391,buy,9705,0.14 -binance-futures,BTCUSDT,1582331240063000,1582331240191256,42380392,buy,9705,0.17 -binance-futures,BTCUSDT,1582331240063000,1582331240191262,42380393,buy,9705,0.077 -binance-futures,BTCUSDT,1582331240070000,1582331240200515,42380394,buy,9705,0.423 -binance-futures,BTCUSDT,1582331240070000,1582331240200726,42380395,buy,9705,0.1 -binance-futures,BTCUSDT,1582331240070000,1582331240201369,42380396,buy,9705.01,0.04 -binance-futures,BTCUSDT,1582331240090000,1582331240224822,42380397,buy,9705.29,0.012 -binance-futures,BTCUSDT,1582331240112000,1582331240240952,42380398,buy,9705.64,0.006 -binance-futures,BTCUSDT,1582331240121000,1582331240252986,42380399,buy,9705.76,0.04 -binance-futures,BTCUSDT,1582331240176000,1582331240313029,42380400,buy,9706,0.235 -binance-futures,BTCUSDT,1582331240214000,1582331240364311,42380401,buy,9706,0.66 -binance-futures,BTCUSDT,1582331240301000,1582331240428737,42380402,buy,9706,0.011 -binance-futures,BTCUSDT,1582331240326000,1582331240458688,42380403,buy,9706,0.057 -binance-futures,BTCUSDT,1582331240344000,1582331240468731,42380404,buy,9706,0.291 -binance-futures,BTCUSDT,1582331240361000,1582331240485680,42380405,buy,9706,0.344 -binance-futures,BTCUSDT,1582331240365000,1582331240496504,42380406,sell,9705.99,0.1 -binance-futures,BTCUSDT,1582331240365000,1582331240496524,42380407,sell,9705.99,0.438 -binance-futures,BTCUSDT,1582331240365000,1582331240496529,42380408,sell,9705.99,0.219 -binance-futures,BTCUSDT,1582331240377000,1582331240505408,42380409,buy,9706,0.213 -binance-futures,BTCUSDT,1582331240468000,1582331240617559,42380410,buy,9706,1.34 -binance-futures,BTCUSDT,1582331240473000,1582331240617614,42380411,buy,9706,0.38 -binance-futures,BTCUSDT,1582331240512000,1582331240639210,42380412,buy,9706,0.773 -binance-futures,BTCUSDT,1582331240663000,1582331240790848,42380413,sell,9705.99,0.38 -binance-futures,BTCUSDT,1582331241020000,1582331241147123,42380414,sell,9705.99,0.082 -binance-futures,BTCUSDT,1582331241478000,1582331241604324,42380415,buy,9706,0.24 -binance-futures,BTCUSDT,1582331241488000,1582331241614986,42380416,buy,9706,0.24 -binance-futures,BTCUSDT,1582331241702000,1582331241831089,42380417,buy,9706,0.191 -binance-futures,BTCUSDT,1582331241969000,1582331242096415,42380418,buy,9706,0.01 -binance-futures,BTCUSDT,1582331241974000,1582331242100235,42380419,buy,9706,0.193 -binance-futures,BTCUSDT,1582331241974000,1582331242100248,42380420,buy,9706,0.1 -binance-futures,BTCUSDT,1582331241974000,1582331242100257,42380421,buy,9706,0.012 -binance-futures,BTCUSDT,1582331241974000,1582331242100495,42380422,buy,9706.06,0.04 -binance-futures,BTCUSDT,1582331242043000,1582331242169437,42380423,buy,9706.52,0.005 -binance-futures,BTCUSDT,1582331242043000,1582331242176439,42380424,buy,9707,0.003 -binance-futures,BTCUSDT,1582331242043000,1582331242176466,42380425,buy,9707,0.1 -binance-futures,BTCUSDT,1582331242043000,1582331242180941,42380426,buy,9707.07,0.08 -binance-futures,BTCUSDT,1582331242043000,1582331242180948,42380427,buy,9707.07,0.02 -binance-futures,BTCUSDT,1582331242043000,1582331242183975,42380428,buy,9707.09,0.16 -binance-futures,BTCUSDT,1582331242043000,1582331242183986,42380429,buy,9707.21,0.047 -binance-futures,BTCUSDT,1582331242043000,1582331242186366,42380430,buy,9707.25,0.04 -binance-futures,BTCUSDT,1582331242043000,1582331242186377,42380431,buy,9707.39,0.24 -binance-futures,BTCUSDT,1582331242043000,1582331242187762,42380432,buy,9707.41,0.012 -binance-futures,BTCUSDT,1582331242043000,1582331242188862,42380433,buy,9707.64,0.047 -binance-futures,BTCUSDT,1582331242043000,1582331242190233,42380434,buy,9707.79,0.001 -binance-futures,BTCUSDT,1582331242044000,1582331242191114,42380435,buy,9708,0.016 -binance-futures,BTCUSDT,1582331242044000,1582331242191124,42380436,buy,9708,0.073 -binance-futures,BTCUSDT,1582331243749000,1582331243882788,42380437,sell,9706.64,0.001 -binance-futures,BTCUSDT,1582331243827000,1582331243949194,42380438,sell,9706.65,0.001 -binance-futures,BTCUSDT,1582331243829000,1582331243955521,42380439,sell,9706.65,0.001 -binance-futures,BTCUSDT,1582331243942000,1582331244070744,42380440,sell,9706.59,0.005 -binance-futures,BTCUSDT,1582331243942000,1582331244070832,42380441,sell,9706.58,0.704 -binance-futures,BTCUSDT,1582331243942000,1582331244073486,42380442,sell,9706.58,0.79 -binance-futures,BTCUSDT,1582331243942000,1582331244073495,42380443,sell,9706.58,0.501 -binance-futures,BTCUSDT,1582331243965000,1582331244097906,42380444,sell,9706.63,0.031 -binance-futures,BTCUSDT,1582331243965000,1582331244097912,42380445,sell,9706.62,0.031 -binance-futures,BTCUSDT,1582331243965000,1582331244099553,42380446,sell,9706.61,0.031 -binance-futures,BTCUSDT,1582331243965000,1582331244103435,42380447,sell,9706.58,0.289 -binance-futures,BTCUSDT,1582331246696000,1582331246824376,42380448,sell,9706.26,0.2 -binance-futures,BTCUSDT,1582331249112000,1582331249235971,42380449,sell,9706.26,0.1 -binance-futures,BTCUSDT,1582331249288000,1582331249412053,42380450,sell,9706.26,0.96 -binance-futures,BTCUSDT,1582331249616000,1582331249746032,42380451,buy,9706.27,0.024 -binance-futures,BTCUSDT,1582331249647000,1582331249775405,42380452,sell,9706.26,0.001 -binance-futures,BTCUSDT,1582331250596000,1582331250720886,42380453,buy,9706.27,0.076 -binance-futures,BTCUSDT,1582331250596000,1582331250722999,42380454,buy,9706.27,0.024 -binance-futures,BTCUSDT,1582331251063000,1582331251190693,42380455,buy,9706.27,0.076 -binance-futures,BTCUSDT,1582331251063000,1582331251190732,42380456,buy,9706.27,0.1 -binance-futures,BTCUSDT,1582331251063000,1582331251190737,42380457,buy,9706.41,0.2 -binance-futures,BTCUSDT,1582331251063000,1582331251199067,42380458,buy,9706.51,0.1 -binance-futures,BTCUSDT,1582331251063000,1582331251199081,42380459,buy,9706.69,0.005 -binance-futures,BTCUSDT,1582331251063000,1582331251202386,42380460,buy,9706.7,0.028 -binance-futures,BTCUSDT,1582331253270000,1582331253396789,42380461,buy,9706.71,0.03 -binance-futures,BTCUSDT,1582331253623000,1582331253744034,42380462,buy,9706.71,0.07 -binance-futures,BTCUSDT,1582331253623000,1582331253745298,42380463,buy,9707.9,0.005 -binance-futures,BTCUSDT,1582331253623000,1582331253748248,42380464,buy,9707.97,0.001 -binance-futures,BTCUSDT,1582331253623000,1582331253750957,42380465,buy,9707.97,0.003 -binance-futures,BTCUSDT,1582331253623000,1582331253751825,42380466,buy,9707.98,0.704 -binance-futures,BTCUSDT,1582331253623000,1582331253751835,42380467,buy,9707.98,0.217 -binance-futures,BTCUSDT,1582331254732000,1582331254857061,42380468,sell,9707.05,0.007 -binance-futures,BTCUSDT,1582331255641000,1582331255768578,42380469,sell,9707.05,0.02 -binance-futures,BTCUSDT,1582331261738000,1582331261862415,42380470,sell,9707.05,0.322 -binance-futures,BTCUSDT,1582331261838000,1582331261970543,42380471,buy,9707.06,0.1 -binance-futures,BTCUSDT,1582331261838000,1582331261970550,42380472,buy,9707.06,0.1 -binance-futures,BTCUSDT,1582331261838000,1582331261970555,42380473,buy,9707.06,5.4 -binance-futures,BTCUSDT,1582331261838000,1582331261975583,42380474,buy,9707.09,0.1 -binance-futures,BTCUSDT,1582331261838000,1582331261980194,42380475,buy,9707.49,0.122 -binance-futures,BTCUSDT,1582331261838000,1582331261983147,42380476,buy,9707.69,0.743 -binance-futures,BTCUSDT,1582331261838000,1582331261983154,42380477,buy,9707.69,0.743 -binance-futures,BTCUSDT,1582331261838000,1582331261983158,42380478,buy,9707.69,0.459 -binance-futures,BTCUSDT,1582331261838000,1582331262258077,42380479,buy,9707.7,0.1 -binance-futures,BTCUSDT,1582331261838000,1582331262258125,42380480,buy,9707.89,0.1 -binance-futures,BTCUSDT,1582331261838000,1582331262259092,42380481,buy,9708,0.227 -binance-futures,BTCUSDT,1582331261838000,1582331262259105,42380482,buy,9708,0.246 -binance-futures,BTCUSDT,1582331261838000,1582331262259117,42380483,buy,9708.12,10.284 -binance-futures,BTCUSDT,1582331261838000,1582331262259126,42380484,buy,9708.38,1.193 -binance-futures,BTCUSDT,1582331261838000,1582331262266217,42380485,buy,9708.41,0.012 -binance-futures,BTCUSDT,1582331261838000,1582331262266257,42380486,buy,9708.9,0.005 -binance-futures,BTCUSDT,1582331261838000,1582331262266265,42380487,buy,9708.97,0.8 -binance-futures,BTCUSDT,1582331261838000,1582331262266275,42380488,buy,9709,0.1 -binance-futures,BTCUSDT,1582331261838000,1582331262266278,42380489,buy,9709,0.1 -binance-futures,BTCUSDT,1582331261838000,1582331262266281,42380490,buy,9709,1 -binance-futures,BTCUSDT,1582331261838000,1582331262266295,42380491,buy,9709.08,0.011 -binance-futures,BTCUSDT,1582331261838000,1582331262266301,42380492,buy,9709.33,0.15 -binance-futures,BTCUSDT,1582331261838000,1582331262266308,42380493,buy,9709.46,0.04 -binance-futures,BTCUSDT,1582331261838000,1582331262266311,42380494,buy,9709.46,0.16 -binance-futures,BTCUSDT,1582331261838000,1582331262266314,42380495,buy,9709.46,0.2 -binance-futures,BTCUSDT,1582331261838000,1582331262266320,42380496,buy,9709.65,0.006 -binance-futures,BTCUSDT,1582331261838000,1582331262266323,42380497,buy,9709.65,0.08 -binance-futures,BTCUSDT,1582331261838000,1582331262266326,42380498,buy,9709.65,0.12 -binance-futures,BTCUSDT,1582331261839000,1582331262266329,42380499,buy,9709.65,0.04 -binance-futures,BTCUSDT,1582331261839000,1582331262266343,42380500,buy,9709.75,0.12 -binance-futures,BTCUSDT,1582331261839000,1582331262266346,42380501,buy,9709.75,0.16 -binance-futures,BTCUSDT,1582331261839000,1582331262266349,42380502,buy,9709.96,1.397 -binance-futures,BTCUSDT,1582331261839000,1582331262266359,42380503,buy,9709.99,0.1 -binance-futures,BTCUSDT,1582331261839000,1582331262266366,42380504,buy,9710,0.01 -binance-futures,BTCUSDT,1582331261839000,1582331262266369,42380505,buy,9710,0.1 -binance-futures,BTCUSDT,1582331261839000,1582331262266372,42380506,buy,9710,0.066 -binance-futures,BTCUSDT,1582331261839000,1582331262266375,42380507,buy,9710,0.05 -binance-futures,BTCUSDT,1582331261839000,1582331262266402,42380508,buy,9710,0.04 -binance-futures,BTCUSDT,1582331261839000,1582331262266405,42380509,buy,9710,0.044 -binance-futures,BTCUSDT,1582331261839000,1582331262266409,42380510,buy,9710,0.044 -binance-futures,BTCUSDT,1582331261839000,1582331262266412,42380511,buy,9710,0.003 -binance-futures,BTCUSDT,1582331261839000,1582331262266415,42380512,buy,9710,0.125 -binance-futures,BTCUSDT,1582331261839000,1582331262266422,42380513,sell,9707.05,1.866 -binance-futures,BTCUSDT,1582331261839000,1582331262266424,42380514,sell,9707.05,0.451 -binance-futures,BTCUSDT,1582331261839000,1582331262266440,42380515,sell,9707.04,0.25 -binance-futures,BTCUSDT,1582331261839000,1582331262266447,42380516,sell,9706.9,0.005 -binance-futures,BTCUSDT,1582331261839000,1582331262266464,42380517,sell,9706.36,0.728 -binance-futures,BTCUSDT,1582331263034000,1582331263160027,42380518,sell,9708.13,0.031 -binance-futures,BTCUSDT,1582331263034000,1582331263160038,42380519,sell,9707.06,0.005 -binance-futures,BTCUSDT,1582331263034000,1582331263162974,42380520,sell,9707.06,0.023 -binance-futures,BTCUSDT,1582331263034000,1582331263164597,42380521,sell,9707.05,0.809 -binance-futures,BTCUSDT,1582331263034000,1582331263165983,42380522,sell,9706.83,0.132 -binance-futures,BTCUSDT,1582331263584000,1582331263712225,42380523,buy,9709.4,0.002 -binance-futures,BTCUSDT,1582331263849000,1582331263973720,42380524,sell,9706.91,0.003 -binance-futures,BTCUSDT,1582331263849000,1582331263974643,42380525,sell,9706.91,0.001 -binance-futures,BTCUSDT,1582331263849000,1582331263974649,42380526,sell,9706.9,0.025 -binance-futures,BTCUSDT,1582331264107000,1582331264236357,42380527,sell,9707.12,0.031 -binance-futures,BTCUSDT,1582331264107000,1582331264236360,42380528,sell,9707.11,0.031 -binance-futures,BTCUSDT,1582331264107000,1582331264242060,42380529,sell,9707.1,0.031 -binance-futures,BTCUSDT,1582331264107000,1582331264242679,42380530,sell,9707.09,0.007 -binance-futures,BTCUSDT,1582331264653000,1582331264776760,42380531,sell,9707.39,0.001 -binance-futures,BTCUSDT,1582331265049000,1582331265176941,42380532,sell,9707.3,0.4 -binance-futures,BTCUSDT,1582331267020000,1582331267145943,42380533,buy,9707.27,2 -binance-futures,BTCUSDT,1582331267020000,1582331267146020,42380534,buy,9707.27,2 -binance-futures,BTCUSDT,1582331267020000,1582331267149279,42380535,buy,9707.27,2 -binance-futures,BTCUSDT,1582331267020000,1582331267149871,42380536,buy,9707.27,0.1 -binance-futures,BTCUSDT,1582331267020000,1582331267152620,42380537,buy,9707.31,0.073 -binance-futures,BTCUSDT,1582331267020000,1582331267153420,42380538,buy,9707.31,0.1 -binance-futures,BTCUSDT,1582331267020000,1582331267154720,42380539,buy,9707.45,0.25 -binance-futures,BTCUSDT,1582331267020000,1582331267156086,42380540,buy,9707.51,0.728 -binance-futures,BTCUSDT,1582331267020000,1582331267157401,42380541,buy,9708.92,0.04 -binance-futures,BTCUSDT,1582331267020000,1582331267157406,42380542,buy,9708.92,0.04 -binance-futures,BTCUSDT,1582331267020000,1582331267159328,42380543,buy,9709.12,0.073 -binance-futures,BTCUSDT,1582331267020000,1582331267161848,42380544,buy,9709.4,0.005 -binance-futures,BTCUSDT,1582331267020000,1582331267162600,42380545,buy,9709.46,0.005 -binance-futures,BTCUSDT,1582331267020000,1582331267162606,42380546,buy,9709.46,0.023 -binance-futures,BTCUSDT,1582331267021000,1582331267163719,42380547,buy,9709.47,5.28 -binance-futures,BTCUSDT,1582331267021000,1582331267163728,42380548,buy,9710,0.075 -binance-futures,BTCUSDT,1582331267021000,1582331267164476,42380549,buy,9710,0.27 -binance-futures,BTCUSDT,1582331267021000,1582331267164482,42380550,buy,9710,1 -binance-futures,BTCUSDT,1582331267070000,1582331267199909,42380551,sell,9710,0.782 -binance-futures,BTCUSDT,1582331267074000,1582331267199916,42380552,sell,9710,1.34 -binance-futures,BTCUSDT,1582331267082000,1582331267206221,42380553,sell,9710,0.72 -binance-futures,BTCUSDT,1582331267086000,1582331267211168,42380554,sell,9710,0.94 -binance-futures,BTCUSDT,1582331267088000,1582331267213727,42380555,sell,9710,0.74 -binance-futures,BTCUSDT,1582331267090000,1582331267213732,42380556,sell,9710,0.68 -binance-futures,BTCUSDT,1582331267119000,1582331267243293,42380557,sell,9710,0.099 -binance-futures,BTCUSDT,1582331267879000,1582331268006015,42380558,buy,9710.01,0.152 -binance-futures,BTCUSDT,1582331268263000,1582331268387842,42380559,sell,9710,0.001 -binance-futures,BTCUSDT,1582331270453000,1582331270578883,42380560,sell,9710,2 -binance-futures,BTCUSDT,1582331270473000,1582331270599436,42380561,sell,9710,2 -binance-futures,BTCUSDT,1582331270475000,1582331270604213,42380562,sell,9710,2 -binance-futures,BTCUSDT,1582331270475000,1582331270604219,42380563,sell,9710,1.636 -binance-futures,BTCUSDT,1582331270475000,1582331270604222,42380564,sell,9710,0.073 -binance-futures,BTCUSDT,1582331270499000,1582331270624331,42380565,sell,9709.5,1 -binance-futures,BTCUSDT,1582331271318000,1582331271447971,42380566,buy,9707.76,0.152 -binance-futures,BTCUSDT,1582331271318000,1582331271447974,42380567,buy,9708.89,0.12 -binance-futures,BTCUSDT,1582331271318000,1582331271451236,42380568,buy,9708.89,0.12 -binance-futures,BTCUSDT,1582331271318000,1582331271451245,42380569,buy,9708.89,0.092 -binance-futures,BTCUSDT,1582331271615000,1582331271741752,42380570,sell,9707.67,0.05 -binance-futures,BTCUSDT,1582331272416000,1582331272540222,42380571,buy,9708.03,0.041 -binance-futures,BTCUSDT,1582331273939000,1582331274066923,42380572,sell,9707.38,0.1 -binance-futures,BTCUSDT,1582331276081000,1582331276206084,42380573,buy,9708.31,0.5 -binance-futures,BTCUSDT,1582331276112000,1582331276239218,42380574,buy,9708.31,0.085 -binance-futures,BTCUSDT,1582331278850000,1582331278974868,42380575,sell,9708.3,0.005 -binance-futures,BTCUSDT,1582331278850000,1582331278975087,42380576,sell,9708.3,1.995 -binance-futures,BTCUSDT,1582331278871000,1582331278993750,42380577,sell,9708.3,0.597 -binance-futures,BTCUSDT,1582331278878000,1582331279004332,42380578,sell,9707.34,0.018 -binance-futures,BTCUSDT,1582331278878000,1582331279009083,42380579,sell,9707.33,1.982 -binance-futures,BTCUSDT,1582331278889000,1582331279013848,42380580,sell,9707.33,0.256 -binance-futures,BTCUSDT,1582331279817000,1582331279943735,42380581,sell,9706.13,2 -binance-futures,BTCUSDT,1582331279872000,1582331280001298,42380582,sell,9706.13,1.727 -binance-futures,BTCUSDT,1582331280133000,1582331280279229,42380583,sell,9705.49,0.01 -binance-futures,BTCUSDT,1582331280143000,1582331280562639,42380584,sell,9705.49,2 -binance-futures,BTCUSDT,1582331280180000,1582331280563054,42380585,sell,9705.49,1.142 -binance-futures,BTCUSDT,1582331280200000,1582331280563365,42380586,sell,9705.01,0.003 -binance-futures,BTCUSDT,1582331280200000,1582331280563374,42380587,sell,9705,0.5 -binance-futures,BTCUSDT,1582331280200000,1582331280563377,42380588,sell,9705,0.5 -binance-futures,BTCUSDT,1582331280251000,1582331280564200,42380589,sell,9703.94,0.001 -binance-futures,BTCUSDT,1582331280279000,1582331280564701,42380590,sell,9703.94,0.003 -binance-futures,BTCUSDT,1582331280279000,1582331280564704,42380591,sell,9703.93,0.677 -binance-futures,BTCUSDT,1582331280279000,1582331280564805,42380592,sell,9703.93,0.081 -binance-futures,BTCUSDT,1582331280279000,1582331280564809,42380593,sell,9703.93,0.049 -binance-futures,BTCUSDT,1582331280286000,1582331280564850,42380594,sell,9703.93,0.709 -binance-futures,BTCUSDT,1582331280286000,1582331280564868,42380595,sell,9703.88,0.031 -binance-futures,BTCUSDT,1582331280345000,1582331280565895,42380596,sell,9703.88,0.01 -binance-futures,BTCUSDT,1582331280356000,1582331280566027,42380597,sell,9703.89,0.005 -binance-futures,BTCUSDT,1582331280356000,1582331280566035,42380598,sell,9703.88,0.005 -binance-futures,BTCUSDT,1582331280384000,1582331280566623,42380599,sell,9703.88,0.01 -binance-futures,BTCUSDT,1582331280823000,1582331280958318,42380600,sell,9703.88,0.005 -binance-futures,BTCUSDT,1582331280881000,1582331281007917,42380601,sell,9703.88,2 -binance-futures,BTCUSDT,1582331280901000,1582331281027349,42380602,sell,9703.88,1.815 -binance-futures,BTCUSDT,1582331282059000,1582331282188359,42380603,sell,9703.04,0.1 -binance-futures,BTCUSDT,1582331283323000,1582331283464239,42380604,buy,9703.05,0.1 -binance-futures,BTCUSDT,1582331284475000,1582331284601884,42380605,buy,9703.84,0.151 -binance-futures,BTCUSDT,1582331284630000,1582331284755508,42380606,buy,9705.2,0.005 -binance-futures,BTCUSDT,1582331284682000,1582331284811507,42380607,buy,9706.96,0.01 -binance-futures,BTCUSDT,1582331286565000,1582331286692536,42380608,buy,9705.67,0.001 -binance-futures,BTCUSDT,1582331290335000,1582331290460977,42380609,buy,9705.01,0.01 -binance-futures,BTCUSDT,1582331291406000,1582331291531789,42380610,buy,9705.58,0.004 -binance-futures,BTCUSDT,1582331291406000,1582331291533125,42380611,buy,9705.62,0.078 -binance-futures,BTCUSDT,1582331292333000,1582331292461941,42380612,buy,9705.49,0.031 -binance-futures,BTCUSDT,1582331292333000,1582331292461950,42380613,buy,9705.5,0.031 -binance-futures,BTCUSDT,1582331292333000,1582331292467996,42380614,buy,9705.51,0.031 -binance-futures,BTCUSDT,1582331292333000,1582331292470269,42380615,buy,9705.52,0.031 -binance-futures,BTCUSDT,1582331292360000,1582331292487182,42380616,buy,9706.4,0.1 -binance-futures,BTCUSDT,1582331292389000,1582331292520456,42380617,buy,9706.56,0.68 -binance-futures,BTCUSDT,1582331292638000,1582331292768890,42380618,buy,9707.3,0.005 -binance-futures,BTCUSDT,1582331296057000,1582331296183030,42380619,sell,9706.63,0.003 -binance-futures,BTCUSDT,1582331296057000,1582331296185100,42380620,sell,9706.26,0.097 -binance-futures,BTCUSDT,1582331296692000,1582331296818993,42380621,sell,9706.62,0.004 -binance-futures,BTCUSDT,1582331297728000,1582331297854396,42380622,sell,9708.08,0.031 -binance-futures,BTCUSDT,1582331297733000,1582331297868288,42380623,sell,9708.07,0.031 -binance-futures,BTCUSDT,1582331297733000,1582331297868299,42380624,sell,9708.06,0.031 -binance-futures,BTCUSDT,1582331297827000,1582331297961017,42380625,sell,9706.89,0.687 -binance-futures,BTCUSDT,1582331297827000,1582331297961023,42380626,sell,9706.88,0.607 -binance-futures,BTCUSDT,1582331297827000,1582331297962733,42380627,sell,9706.88,0.706 -binance-futures,BTCUSDT,1582331297854000,1582331297985469,42380628,sell,9707.17,0.68 -binance-futures,BTCUSDT,1582331297854000,1582331297985482,42380629,sell,9706.9,0.004 -binance-futures,BTCUSDT,1582331297854000,1582331297987946,42380630,sell,9706.88,0.018 -binance-futures,BTCUSDT,1582331297854000,1582331297987952,42380631,sell,9706.88,0.724 -binance-futures,BTCUSDT,1582331298080000,1582331298206189,42380632,buy,9706.64,0.005 -binance-futures,BTCUSDT,1582331301631000,1582331301755839,42380633,buy,9706.09,0.039 -binance-futures,BTCUSDT,1582331303126000,1582331303253164,42380634,sell,9706.08,1 -binance-futures,BTCUSDT,1582331304184000,1582331304320309,42380635,buy,9706.09,0.71 -binance-futures,BTCUSDT,1582331307848000,1582331307971363,42380636,buy,9705.21,2 -binance-futures,BTCUSDT,1582331308268000,1582331308394887,42380637,sell,9705.2,0.006 -binance-futures,BTCUSDT,1582331308268000,1582331308395772,42380638,sell,9705.1,0.005 -binance-futures,BTCUSDT,1582331308268000,1582331308399304,42380639,sell,9704.74,0.436 -binance-futures,BTCUSDT,1582331308268000,1582331308402622,42380640,sell,9704.4,0.553 -binance-futures,BTCUSDT,1582331309880000,1582331310004144,42380641,sell,9704.63,0.5 -binance-futures,BTCUSDT,1582331312827000,1582331312953910,42380642,sell,9704.63,0.187 -binance-futures,BTCUSDT,1582331313005000,1582331313130225,42380643,buy,9704.64,0.1 -binance-futures,BTCUSDT,1582331313005000,1582331313130800,42380644,buy,9705.83,0.266 -binance-futures,BTCUSDT,1582331314309000,1582331314432350,42380645,sell,9705.61,0.6 -binance-futures,BTCUSDT,1582331314539000,1582331314664235,42380646,buy,9706.19,0.005 -binance-futures,BTCUSDT,1582331316828000,1582331316954241,42380647,sell,9705.56,0.27 -binance-futures,BTCUSDT,1582331318454000,1582331318580320,42380648,buy,9705.57,0.001 -binance-futures,BTCUSDT,1582331319933000,1582331320058082,42380649,buy,9705.57,0.03 -binance-futures,BTCUSDT,1582331319933000,1582331320058390,42380650,buy,9705.57,0.018 -binance-futures,BTCUSDT,1582331320639000,1582331320763038,42380651,buy,9705.57,0.082 -binance-futures,BTCUSDT,1582331320639000,1582331320763504,42380652,buy,9706.56,0.218 -binance-futures,BTCUSDT,1582331322160000,1582331322285911,42380653,buy,9706.07,0.173 -binance-futures,BTCUSDT,1582331322160000,1582331322288467,42380654,buy,9706.08,0.031 -binance-futures,BTCUSDT,1582331322160000,1582331322293088,42380655,buy,9706.09,0.031 -binance-futures,BTCUSDT,1582331322160000,1582331322297192,42380656,buy,9706.1,0.031 -binance-futures,BTCUSDT,1582331322160000,1582331322298836,42380657,buy,9706.26,0.003 -binance-futures,BTCUSDT,1582331322160000,1582331322298843,42380658,buy,9706.26,2 -binance-futures,BTCUSDT,1582331323058000,1582331323186025,42380659,sell,9706.47,0.638 -binance-futures,BTCUSDT,1582331323058000,1582331323186908,42380660,sell,9706.47,3.362 -binance-futures,BTCUSDT,1582331323343000,1582331323466454,42380661,sell,9706.47,1.411 -binance-futures,BTCUSDT,1582331323343000,1582331323466735,42380662,sell,9705.9,0.005 -binance-futures,BTCUSDT,1582331323343000,1582331323470002,42380663,sell,9705.78,0.003 -binance-futures,BTCUSDT,1582331323343000,1582331323471905,42380664,sell,9705.77,0.191 -binance-futures,BTCUSDT,1582331324831000,1582331324955988,42380665,buy,9706.09,0.1 -binance-futures,BTCUSDT,1582331324831000,1582331324956003,42380666,buy,9706.45,0.003 -binance-futures,BTCUSDT,1582331324831000,1582331324959708,42380667,buy,9706.45,0.015 -binance-futures,BTCUSDT,1582331324831000,1582331324961381,42380668,buy,9706.46,0.038 -binance-futures,BTCUSDT,1582331325390000,1582331325515445,42380669,buy,9706.02,0.031 -binance-futures,BTCUSDT,1582331325390000,1582331325520665,42380670,buy,9706.03,0.013 -binance-futures,BTCUSDT,1582331325390000,1582331325523239,42380671,buy,9706.04,0.026 -binance-futures,BTCUSDT,1582331325897000,1582331326027943,42380672,buy,9706.97,0.352 -binance-futures,BTCUSDT,1582331326211000,1582331326342729,42380673,buy,9706.97,0.037 -binance-futures,BTCUSDT,1582331326985000,1582331327111874,42380674,sell,9706.96,0.01 -binance-futures,BTCUSDT,1582331329538000,1582331329660633,42380675,sell,9706.95,0.031 -binance-futures,BTCUSDT,1582331329538000,1582331329660639,42380676,sell,9706.95,0.74 -binance-futures,BTCUSDT,1582331329538000,1582331329660643,42380677,sell,9706.95,0.51 -binance-futures,BTCUSDT,1582331329538000,1582331329660933,42380678,sell,9706.95,0.12 -binance-futures,BTCUSDT,1582331329538000,1582331329660951,42380679,sell,9706.95,0.58 -binance-futures,BTCUSDT,1582331329538000,1582331329660957,42380680,sell,9706.94,0.031 -binance-futures,BTCUSDT,1582331329538000,1582331329668871,42380681,sell,9706.93,0.031 -binance-futures,BTCUSDT,1582331329538000,1582331329672380,42380682,sell,9706.91,3.107 -binance-futures,BTCUSDT,1582331329601000,1582331329725265,42380683,buy,9706.92,0.417 -binance-futures,BTCUSDT,1582331331290000,1582331331418533,42380684,buy,9706.92,0.06 -binance-futures,BTCUSDT,1582331332162000,1582331332288760,42380685,buy,9706.92,0.004 -binance-futures,BTCUSDT,1582331334989000,1582331335112279,42380686,sell,9706.91,0.01 -binance-futures,BTCUSDT,1582331335897000,1582331336024536,42380687,buy,9706.92,0.936 -binance-futures,BTCUSDT,1582331335897000,1582331336026659,42380688,buy,9706.92,0.064 -binance-futures,BTCUSDT,1582331338697000,1582331338821399,42380689,sell,9706.91,0.039 -binance-futures,BTCUSDT,1582331338930000,1582331339054973,42380690,buy,9706.92,0.01 -binance-futures,BTCUSDT,1582331341330000,1582331341458826,42380691,sell,9706.91,0.63 -binance-futures,BTCUSDT,1582331341942000,1582331342067061,42380692,sell,9706.91,0.005 -binance-futures,BTCUSDT,1582331342275000,1582331342397785,42380693,buy,9706.92,0.004 -binance-futures,BTCUSDT,1582331342770000,1582331342898189,42380694,sell,9706.8,0.005 -binance-futures,BTCUSDT,1582331342798000,1582331342927977,42380695,sell,9706.29,0.003 -binance-futures,BTCUSDT,1582331342798000,1582331342930507,42380696,sell,9706.29,0.013 -binance-futures,BTCUSDT,1582331342798000,1582331342932199,42380697,sell,9706.28,0.654 -binance-futures,BTCUSDT,1582331342802000,1582331342932470,42380698,sell,9706.28,0.67 -binance-futures,BTCUSDT,1582331342807000,1582331342937875,42380699,sell,9706.28,0.74 -binance-futures,BTCUSDT,1582331342811000,1582331342939127,42380700,sell,9706.28,0.68 -binance-futures,BTCUSDT,1582331342813000,1582331342940978,42380701,sell,9706.28,0.65 -binance-futures,BTCUSDT,1582331342817000,1582331342944025,42380702,sell,9706.28,0.72 -binance-futures,BTCUSDT,1582331342860000,1582331342985248,42380703,sell,9706.28,0.59 -binance-futures,BTCUSDT,1582331342883000,1582331343010340,42380704,sell,9706,2 -binance-futures,BTCUSDT,1582331342935000,1582331343061601,42380705,sell,9706,2 -binance-futures,BTCUSDT,1582331342988000,1582331343116228,42380706,sell,9706,0.477 -binance-futures,BTCUSDT,1582331342988000,1582331343116354,42380707,sell,9706,0.01 -binance-futures,BTCUSDT,1582331343209000,1582331343334719,42380708,sell,9704.9,0.237 -binance-futures,BTCUSDT,1582331343369000,1582331343661393,42380709,sell,9704.91,0.001 -binance-futures,BTCUSDT,1582331345402000,1582331345529003,42380710,sell,9705.21,0.02 -binance-futures,BTCUSDT,1582331346114000,1582331346240752,42380711,buy,9705.94,0.121 -binance-futures,BTCUSDT,1582331346114000,1582331346243406,42380712,buy,9705.94,0.079 -binance-futures,BTCUSDT,1582331349770000,1582331349893013,42380713,buy,9706.24,0.196 -binance-futures,BTCUSDT,1582331351373000,1582331351499853,42380714,sell,9706.93,0.004 -binance-futures,BTCUSDT,1582331352714000,1582331352837092,42380715,sell,9706.9,0.031 -binance-futures,BTCUSDT,1582331352714000,1582331352837482,42380716,sell,9706.89,0.031 -binance-futures,BTCUSDT,1582331352714000,1582331352844076,42380717,sell,9706.88,0.028 -binance-futures,BTCUSDT,1582331353605000,1582331353731785,42380718,buy,9706.91,0.1 -binance-futures,BTCUSDT,1582331353605000,1582331353731795,42380719,buy,9706.96,0.013 -binance-futures,BTCUSDT,1582331353605000,1582331353736439,42380720,buy,9706.97,0.111 -binance-futures,BTCUSDT,1582331353605000,1582331353739460,42380721,buy,9707,0.01 -binance-futures,BTCUSDT,1582331353605000,1582331353739469,42380722,buy,9707,0.298 -binance-futures,BTCUSDT,1582331355615000,1582331355742064,42380723,buy,9707,0.03 -binance-futures,BTCUSDT,1582331359350000,1582331359475844,42380724,buy,9707,0.172 -binance-futures,BTCUSDT,1582331359350000,1582331359476269,42380725,buy,9707,0.06 -binance-futures,BTCUSDT,1582331359388000,1582331359515514,42380726,buy,9707.28,0.06 -binance-futures,BTCUSDT,1582331359388000,1582331359523919,42380727,buy,9707.29,0.05 -binance-futures,BTCUSDT,1582331359388000,1582331359527772,42380728,buy,9707.45,0.012 -binance-futures,BTCUSDT,1582331359388000,1582331359527775,42380729,buy,9707.45,0.002 -binance-futures,BTCUSDT,1582331359388000,1582331359530278,42380730,buy,9707.46,0.596 -binance-futures,BTCUSDT,1582331359391000,1582331359530314,42380731,buy,9707.46,0.084 -binance-futures,BTCUSDT,1582331364366000,1582331364489287,42380732,buy,9707.67,0.001 -binance-futures,BTCUSDT,1582331367622000,1582331367745360,42380733,buy,9707.67,0.05 -binance-futures,BTCUSDT,1582331369605000,1582331369727618,42380734,buy,9707.67,0.009 -binance-futures,BTCUSDT,1582331369605000,1582331369727652,42380735,buy,9707.67,0.1 -binance-futures,BTCUSDT,1582331369605000,1582331369731736,42380736,buy,9707.97,0.623 -binance-futures,BTCUSDT,1582331369605000,1582331369731746,42380737,buy,9707.97,0.623 -binance-futures,BTCUSDT,1582331369605000,1582331369733629,42380738,buy,9707.97,0.623 -binance-futures,BTCUSDT,1582331369605000,1582331369733638,42380739,buy,9708,0.959 -binance-futures,BTCUSDT,1582331374637000,1582331374762348,42380740,sell,9707.8,0.001 -binance-futures,BTCUSDT,1582331377088000,1582331377210275,42380741,buy,9707.81,0.051 -binance-futures,BTCUSDT,1582331379638000,1582331379760340,42380742,buy,9707.81,0.009 -binance-futures,BTCUSDT,1582331379638000,1582331379760828,42380743,buy,9707.81,0.1 -binance-futures,BTCUSDT,1582331379638000,1582331379760843,42380744,buy,9708,3.141 -binance-futures,BTCUSDT,1582331379640000,1582331379781993,42380745,buy,9708.26,0.106 -binance-futures,BTCUSDT,1582331379640000,1582331379783617,42380746,buy,9708.38,0.081 -binance-futures,BTCUSDT,1582331379640000,1582331379783637,42380747,buy,9708.39,0.615 -binance-futures,BTCUSDT,1582331379640000,1582331379783800,42380748,buy,9708.39,0.615 -binance-futures,BTCUSDT,1582331379640000,1582331379783808,42380749,buy,9708.83,0.1 -binance-futures,BTCUSDT,1582331379640000,1582331379785507,42380750,buy,9708.83,0.08 -binance-futures,BTCUSDT,1582331379640000,1582331379785522,42380751,buy,9708.83,0.16 -binance-futures,BTCUSDT,1582331379640000,1582331379786068,42380752,buy,9708.96,4.849 -binance-futures,BTCUSDT,1582331379640000,1582331379786611,42380753,buy,9709,0.1 -binance-futures,BTCUSDT,1582331379640000,1582331379786918,42380754,buy,9709.03,0.04 -binance-futures,BTCUSDT,1582331379640000,1582331379787427,42380755,buy,9709.2,0.005 -binance-futures,BTCUSDT,1582331379640000,1582331379787434,42380756,buy,9709.36,0.191 -binance-futures,BTCUSDT,1582331380541000,1582331380666677,42380757,buy,9708.35,0.011 -binance-futures,BTCUSDT,1582331383440000,1582331383568426,42380758,buy,9708.35,0.049 -binance-futures,BTCUSDT,1582331383440000,1582331383568434,42380759,buy,9708.35,0.073 -binance-futures,BTCUSDT,1582331384945000,1582331385071346,42380760,sell,9708.34,0.051 -binance-futures,BTCUSDT,1582331386004000,1582331386132313,42380761,buy,9708.35,0.027 -binance-futures,BTCUSDT,1582331386004000,1582331386132319,42380762,buy,9708.35,0.011 -binance-futures,BTCUSDT,1582331387846000,1582331387975529,42380763,buy,9708.35,0.049 -binance-futures,BTCUSDT,1582331387846000,1582331387975535,42380764,buy,9708.37,0.064 -binance-futures,BTCUSDT,1582331388787000,1582331388916748,42380765,buy,9708.41,0.006 -binance-futures,BTCUSDT,1582331389915000,1582331390043466,42380766,sell,9708.4,0.021 -binance-futures,BTCUSDT,1582331390532000,1582331390663089,42380767,sell,9708.4,0.031 -binance-futures,BTCUSDT,1582331390532000,1582331390663099,42380768,sell,9708.4,0.009 -binance-futures,BTCUSDT,1582331390595000,1582331390719354,42380769,buy,9708.41,0.001 -binance-futures,BTCUSDT,1582331394143000,1582331394270099,42380770,sell,9708.4,0.01 -binance-futures,BTCUSDT,1582331395500000,1582331395626168,42380771,sell,9708.4,0.067 -binance-futures,BTCUSDT,1582331395500000,1582331395627272,42380772,sell,9708.34,2.698 -binance-futures,BTCUSDT,1582331395500000,1582331395631929,42380773,sell,9708.34,0.008 -binance-futures,BTCUSDT,1582331395500000,1582331395636046,42380774,sell,9708.3,0.005 -binance-futures,BTCUSDT,1582331395500000,1582331395636065,42380775,sell,9708,0.314 -binance-futures,BTCUSDT,1582331400130000,1582331400259952,42380776,sell,9708.46,0.001 -binance-futures,BTCUSDT,1582331400466000,1582331400694699,42380777,sell,9708.46,0.005 -binance-futures,BTCUSDT,1582331400587000,1582331400735086,42380778,sell,9708.46,0.338 -binance-futures,BTCUSDT,1582331402489000,1582331402612588,42380779,sell,9708.46,0.073 -binance-futures,BTCUSDT,1582331405501000,1582331405639906,42380780,sell,9708.46,0.07 -binance-futures,BTCUSDT,1582331405800000,1582331405926911,42380781,buy,9708.47,0.1 -binance-futures,BTCUSDT,1582331405800000,1582331405927731,42380782,buy,9708.47,0.619 -binance-futures,BTCUSDT,1582331405953000,1582331406078106,42380783,buy,9708.47,0.064 -binance-futures,BTCUSDT,1582331405953000,1582331406078483,42380784,buy,9709.06,1.936 -binance-futures,BTCUSDT,1582331407444000,1582331407574155,42380785,sell,9708.46,0.5 -binance-futures,BTCUSDT,1582331409031000,1582331409157609,42380786,buy,9708.47,0.1 -binance-futures,BTCUSDT,1582331409031000,1582331409158752,42380787,buy,9708.78,0.61 -binance-futures,BTCUSDT,1582331410835000,1582331410964772,42380788,sell,9708.5,0.003 -binance-futures,BTCUSDT,1582331413636000,1582331413763972,42380789,buy,9708.41,1.465 -binance-futures,BTCUSDT,1582331415228000,1582331415359305,42380790,sell,9708.77,0.031 -binance-futures,BTCUSDT,1582331415228000,1582331415359321,42380791,sell,9708.77,0.037 -binance-futures,BTCUSDT,1582331415662000,1582331415788388,42380792,sell,9708.77,0.74 -binance-futures,BTCUSDT,1582331415662000,1582331415788398,42380793,sell,9708.77,0.58 -binance-futures,BTCUSDT,1582331415662000,1582331415788888,42380794,sell,9708.77,0.67 -binance-futures,BTCUSDT,1582331415662000,1582331415788894,42380795,sell,9708.77,0.44 -binance-futures,BTCUSDT,1582331415663000,1582331415788897,42380796,sell,9708.77,0.07 -binance-futures,BTCUSDT,1582331417187000,1582331417328401,42380797,sell,9708.64,0.031 -binance-futures,BTCUSDT,1582331417187000,1582331417329383,42380798,sell,9708.63,0.013 -binance-futures,BTCUSDT,1582331419905000,1582331420027268,42380799,buy,9708.78,0.002 -binance-futures,BTCUSDT,1582331421086000,1582331421206094,42380800,buy,9708.78,0.06 -binance-futures,BTCUSDT,1582331430319000,1582331430442541,42380801,sell,9708.77,0.044 -binance-futures,BTCUSDT,1582331431792000,1582331431917865,42380802,sell,9708.77,0.44 -binance-futures,BTCUSDT,1582331432508000,1582331432636749,42380803,buy,9708.78,0.008 -binance-futures,BTCUSDT,1582331432508000,1582331432636758,42380804,buy,9708.78,0.1 -binance-futures,BTCUSDT,1582331432508000,1582331432636763,42380805,buy,9709,5.149 -binance-futures,BTCUSDT,1582331432508000,1582331432638888,42380806,buy,9709,0.01 -binance-futures,BTCUSDT,1582331434623000,1582331434748820,42380807,buy,9709.49,0.1 -binance-futures,BTCUSDT,1582331435050000,1582331435169963,42380808,buy,9709.49,0.005 -binance-futures,BTCUSDT,1582331436655000,1582331436784527,42380809,buy,9709.26,0.1 -binance-futures,BTCUSDT,1582331436655000,1582331436784534,42380810,buy,9709.49,0.045 -binance-futures,BTCUSDT,1582331436655000,1582331436791347,42380811,buy,9709.52,1.355 -binance-futures,BTCUSDT,1582331438853000,1582331438979226,42380812,buy,9709.22,0.031 -binance-futures,BTCUSDT,1582331438853000,1582331438984716,42380813,buy,9709.23,0.031 -binance-futures,BTCUSDT,1582331438853000,1582331438985503,42380814,buy,9709.24,0.031 -binance-futures,BTCUSDT,1582331438853000,1582331438986535,42380815,buy,9709.26,0.033 -binance-futures,BTCUSDT,1582331440721000,1582331440855459,42380816,sell,9709.25,0.031 -binance-futures,BTCUSDT,1582331440721000,1582331440855467,42380817,sell,9709.24,0.031 -binance-futures,BTCUSDT,1582331440721000,1582331440855472,42380818,sell,9709.23,0.031 -binance-futures,BTCUSDT,1582331440721000,1582331440861993,42380819,sell,9709.22,0.031 -binance-futures,BTCUSDT,1582331440721000,1582331440864047,42380820,sell,9709.2,0.005 -binance-futures,BTCUSDT,1582331440721000,1582331440866021,42380821,sell,9709,0.071 -binance-futures,BTCUSDT,1582331441942000,1582331442068880,42380822,sell,9709,0.188 -binance-futures,BTCUSDT,1582331442051000,1582331442178610,42380823,sell,9709,0.327 -binance-futures,BTCUSDT,1582331442142000,1582331442269994,42380824,sell,9709,0.001 -binance-futures,BTCUSDT,1582331442786000,1582331442911527,42380825,buy,9709.01,0.009 -binance-futures,BTCUSDT,1582331445580000,1582331445707288,42380826,buy,9709.01,0.091 -binance-futures,BTCUSDT,1582331445580000,1582331445707297,42380827,buy,9709.51,0.15 -binance-futures,BTCUSDT,1582331445580000,1582331445712278,42380828,buy,9709.52,0.009 -binance-futures,BTCUSDT,1582331446395000,1582331446524454,42380829,sell,9709.08,0.1 -binance-futures,BTCUSDT,1582331447953000,1582331448079978,42380830,buy,9709.11,0.1 -binance-futures,BTCUSDT,1582331447953000,1582331448079985,42380831,buy,9709.51,0.08 -binance-futures,BTCUSDT,1582331448264000,1582331448548717,42380832,buy,9709.11,0.01 -binance-futures,BTCUSDT,1582331450869000,1582331450994264,42380833,sell,9709.1,0.001 -binance-futures,BTCUSDT,1582331450869000,1582331450994436,42380834,sell,9709.1,0.001 -binance-futures,BTCUSDT,1582331450869000,1582331450997540,42380835,sell,9709.1,0.002 -binance-futures,BTCUSDT,1582331454171000,1582331454300996,42380836,buy,9709.11,0.1 -binance-futures,BTCUSDT,1582331454171000,1582331454305070,42380837,buy,9709.73,0.004 -binance-futures,BTCUSDT,1582331454171000,1582331454305077,42380838,buy,9709.74,0.649 -binance-futures,BTCUSDT,1582331454171000,1582331454306725,42380839,buy,9709.74,0.649 -binance-futures,BTCUSDT,1582331454171000,1582331454306735,42380840,buy,9709.74,0.649 -binance-futures,BTCUSDT,1582331454171000,1582331454306739,42380841,buy,9709.74,0.649 -binance-futures,BTCUSDT,1582331454171000,1582331454306744,42380842,buy,9709.74,0.31 -binance-futures,BTCUSDT,1582331454937000,1582331455064599,42380843,sell,9709.11,0.002 -binance-futures,BTCUSDT,1582331454937000,1582331455064604,42380844,sell,9709.1,0.098 -binance-futures,BTCUSDT,1582331455458000,1582331455584296,42380845,sell,9709.1,0.01 -binance-futures,BTCUSDT,1582331457752000,1582331457873970,42380846,sell,9709.71,0.031 -binance-futures,BTCUSDT,1582331457752000,1582331457876969,42380847,sell,9709.7,0.031 -binance-futures,BTCUSDT,1582331457752000,1582331457876978,42380848,sell,9709.69,0.031 -binance-futures,BTCUSDT,1582331457752000,1582331457876984,42380849,sell,9709.68,0.031 -binance-futures,BTCUSDT,1582331457752000,1582331457879431,42380850,sell,9709.52,0.076 -binance-futures,BTCUSDT,1582331458010000,1582331458133585,42380851,buy,9709.7,0.01 -binance-futures,BTCUSDT,1582331458071000,1582331458201731,42380852,buy,9709.69,0.031 -binance-futures,BTCUSDT,1582331458071000,1582331458202220,42380853,buy,9709.7,0.021 -binance-futures,BTCUSDT,1582331458071000,1582331458204395,42380854,buy,9709.71,0.031 -binance-futures,BTCUSDT,1582331458071000,1582331458207472,42380855,buy,9709.72,0.031 -binance-futures,BTCUSDT,1582331458071000,1582331458208591,42380856,buy,9709.74,0.649 -binance-futures,BTCUSDT,1582331458118000,1582331458253200,42380857,buy,9709.65,0.031 -binance-futures,BTCUSDT,1582331458118000,1582331458253210,42380858,buy,9709.66,0.031 -binance-futures,BTCUSDT,1582331458118000,1582331458258913,42380859,buy,9709.67,0.031 -binance-futures,BTCUSDT,1582331458118000,1582331458259988,42380860,buy,9709.83,0.24 -binance-futures,BTCUSDT,1582331458118000,1582331458260005,42380861,buy,9709.89,0.24 -binance-futures,BTCUSDT,1582331458118000,1582331458262194,42380862,buy,9709.95,0.147 -binance-futures,BTCUSDT,1582331458128000,1582331458265626,42380863,buy,9709.95,0.67 -binance-futures,BTCUSDT,1582331458130000,1582331458265634,42380864,buy,9709.95,0.67 -binance-futures,BTCUSDT,1582331458189000,1582331458316860,42380865,buy,9709.95,0.68 -binance-futures,BTCUSDT,1582331458191000,1582331458319237,42380866,buy,9709.95,0.01 -binance-futures,BTCUSDT,1582331458195000,1582331458324505,42380867,buy,9709.95,0.01 -binance-futures,BTCUSDT,1582331458199000,1582331458327153,42380868,buy,9709.95,0.74 -binance-futures,BTCUSDT,1582331458203000,1582331458331008,42380869,buy,9709.95,0.01 -binance-futures,BTCUSDT,1582331458333000,1582331458460167,42380870,sell,9709.94,0.001 -binance-futures,BTCUSDT,1582331458712000,1582331458838175,42380871,buy,9710,0.02 -binance-futures,BTCUSDT,1582331459143000,1582331459270158,42380872,buy,9710.18,0.006 -binance-futures,BTCUSDT,1582331459143000,1582331459270488,42380873,buy,9710.18,0.1 -binance-futures,BTCUSDT,1582331459143000,1582331459274267,42380874,buy,9710.37,0.003 -binance-futures,BTCUSDT,1582331459143000,1582331459274277,42380875,buy,9710.38,1.96 -binance-futures,BTCUSDT,1582331459965000,1582331460088232,42380876,buy,9710.55,0.037 -binance-futures,BTCUSDT,1582331459965000,1582331460088713,42380877,buy,9710.67,0.963 -binance-futures,BTCUSDT,1582331460217000,1582331460338884,42380878,buy,9710.67,2.827 -binance-futures,BTCUSDT,1582331460550000,1582331460670586,42380879,sell,9710.54,0.005 -binance-futures,BTCUSDT,1582331461275000,1582331461453307,42380880,sell,9710.54,0.026 -binance-futures,BTCUSDT,1582331461275000,1582331461453311,42380881,sell,9710.53,0.031 -binance-futures,BTCUSDT,1582331461275000,1582331461455730,42380882,sell,9710.52,0.031 -binance-futures,BTCUSDT,1582331461275000,1582331461457655,42380883,sell,9710.51,0.012 -binance-futures,BTCUSDT,1582331461307000,1582331461458089,42380884,buy,9710.55,0.1 -binance-futures,BTCUSDT,1582331464126000,1582331464252706,42380885,buy,9710.7,0.006 -binance-futures,BTCUSDT,1582331464292000,1582331464423606,42380886,sell,9710.55,0.003 -binance-futures,BTCUSDT,1582331464292000,1582331464423610,42380887,sell,9710.54,0.221 -binance-futures,BTCUSDT,1582331466237000,1582331466372737,42380888,buy,9710.65,0.031 -binance-futures,BTCUSDT,1582331466237000,1582331466372760,42380889,buy,9710.66,0.031 -binance-futures,BTCUSDT,1582331466237000,1582331466375103,42380890,buy,9710.67,0.031 -binance-futures,BTCUSDT,1582331466237000,1582331466376982,42380891,buy,9710.68,0.007 -binance-futures,BTCUSDT,1582331466862000,1582331466985488,42380892,sell,9710.64,0.1 -binance-futures,BTCUSDT,1582331466862000,1582331466985744,42380893,sell,9710.61,0.131 -binance-futures,BTCUSDT,1582331467072000,1582331467198549,42380894,sell,9710.66,0.001 -binance-futures,BTCUSDT,1582331467943000,1582331468067686,42380895,sell,9710.67,0.031 -binance-futures,BTCUSDT,1582331467943000,1582331468068190,42380896,sell,9710.66,0.03 -binance-futures,BTCUSDT,1582331467943000,1582331468073961,42380897,sell,9710.65,0.031 -binance-futures,BTCUSDT,1582331467943000,1582331468076503,42380898,sell,9710.64,0.008 -binance-futures,BTCUSDT,1582331468039000,1582331468169783,42380899,sell,9710.61,0.55 -binance-futures,BTCUSDT,1582331469998000,1582331470123322,42380900,buy,9710.68,0.1 -binance-futures,BTCUSDT,1582331470013000,1582331470139682,42380901,sell,9710.68,0.1 -binance-futures,BTCUSDT,1582331471089000,1582331471211755,42380902,sell,9710.68,0.103 -binance-futures,BTCUSDT,1582331471089000,1582331471211806,42380903,sell,9710.68,0.103 -binance-futures,BTCUSDT,1582331471121000,1582331471246159,42380904,sell,9710.68,0.103 -binance-futures,BTCUSDT,1582331471468000,1582331471592181,42380905,buy,9710.69,0.25 -binance-futures,BTCUSDT,1582331472353000,1582331472478934,42380906,sell,9710.68,0.24 -binance-futures,BTCUSDT,1582331473662000,1582331473786557,42380907,sell,9710.68,0.1 -binance-futures,BTCUSDT,1582331477494000,1582331477617732,42380908,sell,9710.68,0.163 -binance-futures,BTCUSDT,1582331477494000,1582331477617761,42380909,sell,9710.55,0.016 -binance-futures,BTCUSDT,1582331477494000,1582331477621043,42380910,sell,9710.55,0.001 -binance-futures,BTCUSDT,1582331477494000,1582331477626349,42380911,sell,9710.54,1.285 -binance-futures,BTCUSDT,1582331477968000,1582331478091464,42380912,buy,9710.56,1 -binance-futures,BTCUSDT,1582331479990000,1582331480114319,42380913,sell,9710.55,0.645 -binance-futures,BTCUSDT,1582331480087000,1582331480217183,42380914,sell,9710.54,0.155 -binance-futures,BTCUSDT,1582331481826000,1582331481953377,42380915,sell,9710.54,0.67 -binance-futures,BTCUSDT,1582331481856000,1582331481985663,42380916,sell,9710.54,2 -binance-futures,BTCUSDT,1582331481857000,1582331481985695,42380917,sell,9710.54,0.669 -binance-futures,BTCUSDT,1582331481857000,1582331481985805,42380918,sell,9710.54,0.726 -binance-futures,BTCUSDT,1582331481874000,1582331482006379,42380919,sell,9710.42,0.3 -binance-futures,BTCUSDT,1582331481874000,1582331482007419,42380920,sell,9710.3,0.005 -binance-futures,BTCUSDT,1582331481931000,1582331482063024,42380921,sell,9709.48,0.001 -binance-futures,BTCUSDT,1582331481931000,1582331482071409,42380922,sell,9709.34,0.019 -binance-futures,BTCUSDT,1582331482593000,1582331482727645,42380923,sell,9709.1,0.057 -binance-futures,BTCUSDT,1582331482593000,1582331482727833,42380924,sell,9709.1,0.613 -binance-futures,BTCUSDT,1582331482636000,1582331482761944,42380925,sell,9709.1,0.01 -binance-futures,BTCUSDT,1582331484197000,1582331484324319,42380926,buy,9709.01,0.012 -binance-futures,BTCUSDT,1582331484613000,1582331484737143,42380927,buy,9709.01,1.988 -binance-futures,BTCUSDT,1582331484613000,1582331484737686,42380928,buy,9709.01,1 -binance-futures,BTCUSDT,1582331484613000,1582331484737695,42380929,buy,9709.01,0.735 -binance-futures,BTCUSDT,1582331484942000,1582331485069207,42380930,sell,9709,1.03 -binance-futures,BTCUSDT,1582331485400000,1582331485528051,42380931,sell,9709,0.1 -binance-futures,BTCUSDT,1582331485531000,1582331485656607,42380932,sell,9709,0.113 -binance-futures,BTCUSDT,1582331485551000,1582331485688690,42380933,sell,9708.78,0.001 -binance-futures,BTCUSDT,1582331485551000,1582331485688698,42380934,sell,9708.78,0.001 -binance-futures,BTCUSDT,1582331485551000,1582331485688701,42380935,sell,9708.77,1.573 -binance-futures,BTCUSDT,1582331485551000,1582331485688709,42380936,sell,9708.77,0.008 -binance-futures,BTCUSDT,1582331485551000,1582331485691150,42380937,sell,9708.7,0.005 -binance-futures,BTCUSDT,1582331485558000,1582331485694165,42380938,sell,9708.26,0.001 -binance-futures,BTCUSDT,1582331485585000,1582331485722751,42380939,sell,9708.25,2 -binance-futures,BTCUSDT,1582331485585000,1582331485722762,42380940,sell,9708.25,0.131 -binance-futures,BTCUSDT,1582331485616000,1582331485754047,42380941,sell,9708,2 -binance-futures,BTCUSDT,1582331485617000,1582331485754064,42380942,sell,9708,0.574 -binance-futures,BTCUSDT,1582331485796000,1582331485921490,42380943,sell,9706.8,0.124 -binance-futures,BTCUSDT,1582331485826000,1582331485962469,42380944,sell,9706.81,0.037 -binance-futures,BTCUSDT,1582331485830000,1582331485964212,42380945,sell,9706.8,2 -binance-futures,BTCUSDT,1582331485891000,1582331486019542,42380946,sell,9706.8,0.68 -binance-futures,BTCUSDT,1582331485925000,1582331486054508,42380947,sell,9706.8,0.446 -binance-futures,BTCUSDT,1582331485952000,1582331486083304,42380948,sell,9706.8,0.144 -binance-futures,BTCUSDT,1582331485976000,1582331486108441,42380949,sell,9706.8,1 -binance-futures,BTCUSDT,1582331486021000,1582331486152800,42380950,sell,9706.8,0.062 -binance-futures,BTCUSDT,1582331486023000,1582331486152840,42380951,sell,9706.8,0.72 -binance-futures,BTCUSDT,1582331486033000,1582331486160765,42380952,sell,9706.8,0.05 -binance-futures,BTCUSDT,1582331486093000,1582331486223619,42380953,sell,9706.8,0.577 -binance-futures,BTCUSDT,1582331486171000,1582331486298986,42380954,sell,9706.8,0.144 -binance-futures,BTCUSDT,1582331486242000,1582331486371494,42380955,sell,9705.89,0.165 -binance-futures,BTCUSDT,1582331486337000,1582331486472268,42380956,buy,9706.67,0.081 -binance-futures,BTCUSDT,1582331486337000,1582331486472279,42380957,buy,9706.68,2 -binance-futures,BTCUSDT,1582331486337000,1582331486472291,42380958,buy,9706.68,0.031 -binance-futures,BTCUSDT,1582331486337000,1582331486472296,42380959,buy,9706.68,4.234 -binance-futures,BTCUSDT,1582331486342000,1582331486479696,42380960,sell,9705.89,0.72 -binance-futures,BTCUSDT,1582331486400000,1582331486530156,42380961,sell,9705.9,0.75 -binance-futures,BTCUSDT,1582331486951000,1582331487082832,42380962,sell,9705.69,0.5 -binance-futures,BTCUSDT,1582331487530000,1582331487656300,42380963,sell,9705.69,0.009 -binance-futures,BTCUSDT,1582331487857000,1582331487983701,42380964,sell,9705.69,0.24 -binance-futures,BTCUSDT,1582331487861000,1582331487990802,42380965,buy,9705.7,0.031 -binance-futures,BTCUSDT,1582331487861000,1582331487990809,42380966,buy,9705.7,0.1 -binance-futures,BTCUSDT,1582331487861000,1582331487990813,42380967,buy,9705.7,0.1 -binance-futures,BTCUSDT,1582331487861000,1582331487996725,42380968,buy,9705.7,1 -binance-futures,BTCUSDT,1582331487861000,1582331487997835,42380969,buy,9705.71,0.031 -binance-futures,BTCUSDT,1582331487861000,1582331487997851,42380970,buy,9705.72,0.031 -binance-futures,BTCUSDT,1582331487861000,1582331487997856,42380971,buy,9705.72,0.05 -binance-futures,BTCUSDT,1582331487861000,1582331487998965,42380972,buy,9705.73,0.031 -binance-futures,BTCUSDT,1582331487947000,1582331488082477,42380973,buy,9705.9,0.67 -binance-futures,BTCUSDT,1582331487947000,1582331488084160,42380974,buy,9705.91,0.5 -binance-futures,BTCUSDT,1582331488086000,1582331488211084,42380975,sell,9706.35,0.1 -binance-futures,BTCUSDT,1582331488499000,1582331488624235,42380976,sell,9705.9,0.009 -binance-futures,BTCUSDT,1582331488847000,1582331488974928,42380977,sell,9705.95,0.001 -binance-futures,BTCUSDT,1582331488847000,1582331488979986,42380978,sell,9705.95,0.01 -binance-futures,BTCUSDT,1582331488847000,1582331488980276,42380979,sell,9705.95,0.67 -binance-futures,BTCUSDT,1582331488847000,1582331488980281,42380980,sell,9705.95,0.68 -binance-futures,BTCUSDT,1582331488847000,1582331488980621,42380981,sell,9705.95,0.71 -binance-futures,BTCUSDT,1582331488847000,1582331488980634,42380982,sell,9705.94,0.46 -binance-futures,BTCUSDT,1582331488847000,1582331488987769,42380983,sell,9705.92,0.002 -binance-futures,BTCUSDT,1582331488847000,1582331488987775,42380984,sell,9705.9,0.467 -binance-futures,BTCUSDT,1582331489178000,1582331489343238,42380985,sell,9705.9,0.107 -binance-futures,BTCUSDT,1582331489178000,1582331489343246,42380986,sell,9705.9,0.583 -binance-futures,BTCUSDT,1582331489178000,1582331489343251,42380987,sell,9705.9,0.583 -binance-futures,BTCUSDT,1582331489178000,1582331489343256,42380988,sell,9705.9,0.583 -binance-futures,BTCUSDT,1582331489178000,1582331489343261,42380989,sell,9705.77,0.144 -binance-futures,BTCUSDT,1582331491076000,1582331491203804,42380990,buy,9705.85,0.1 -binance-futures,BTCUSDT,1582331491076000,1582331491206046,42380991,buy,9706.92,0.249 -binance-futures,BTCUSDT,1582331491076000,1582331491215969,42380992,buy,9707.09,0.023 -binance-futures,BTCUSDT,1582331491076000,1582331491215975,42380993,buy,9707.09,0.005 -binance-futures,BTCUSDT,1582331491076000,1582331491220416,42380994,buy,9707.14,0.571 -binance-futures,BTCUSDT,1582331491076000,1582331491220471,42380995,buy,9707.14,0.571 -binance-futures,BTCUSDT,1582331491076000,1582331491220476,42380996,buy,9707.14,0.571 -binance-futures,BTCUSDT,1582331491076000,1582331491220481,42380997,buy,9707.14,0.572 -binance-futures,BTCUSDT,1582331491076000,1582331491220492,42380998,buy,9707.15,0.1 -binance-futures,BTCUSDT,1582331491076000,1582331491220502,42380999,buy,9707.3,0.005 -binance-futures,BTCUSDT,1582331491076000,1582331491220507,42381000,buy,9707.52,0.5 -binance-futures,BTCUSDT,1582331491076000,1582331491224861,42381001,buy,9707.55,0.16 -binance-futures,BTCUSDT,1582331491076000,1582331491224883,42381002,buy,9708.05,1.723 -binance-futures,BTCUSDT,1582331491906000,1582331492032976,42381003,sell,9706.07,0.004 -binance-futures,BTCUSDT,1582331491906000,1582331492034360,42381004,sell,9706.07,2.3 -binance-futures,BTCUSDT,1582331491906000,1582331492034369,42381005,sell,9705.84,3.664 -binance-futures,BTCUSDT,1582331492528000,1582331492655050,42381006,buy,9706.74,0.001 -binance-futures,BTCUSDT,1582331494230000,1582331494357445,42381007,sell,9705.9,0.001 -binance-futures,BTCUSDT,1582331494230000,1582331494357458,42381008,sell,9705.9,0.002 -binance-futures,BTCUSDT,1582331494230000,1582331494357947,42381009,sell,9705.89,0.262 -binance-futures,BTCUSDT,1582331494433000,1582331494558357,42381010,buy,9707.19,0.02 -binance-futures,BTCUSDT,1582331494931000,1582331495057683,42381011,buy,9706.35,0.049 -binance-futures,BTCUSDT,1582331500584000,1582331500710851,42381012,buy,9707.95,0.031 -binance-futures,BTCUSDT,1582331500584000,1582331500710869,42381013,buy,9707.96,0.031 -binance-futures,BTCUSDT,1582331500584000,1582331500720161,42381014,buy,9707.97,0.031 -binance-futures,BTCUSDT,1582331500584000,1582331500720172,42381015,buy,9707.98,0.031 -binance-futures,BTCUSDT,1582331500584000,1582331500726047,42381016,buy,9708,0.1 -binance-futures,BTCUSDT,1582331500584000,1582331500726075,42381017,buy,9708,0.1 -binance-futures,BTCUSDT,1582331500622000,1582331500751557,42381018,buy,9709,0.005 -binance-futures,BTCUSDT,1582331500649000,1582331500781645,42381019,buy,9709.44,0.152 -binance-futures,BTCUSDT,1582331500649000,1582331500781660,42381020,buy,9709.5,0.003 -binance-futures,BTCUSDT,1582331500649000,1582331500781664,42381021,buy,9709.5,0.005 -binance-futures,BTCUSDT,1582331500649000,1582331500783256,42381022,buy,9709.51,0.737 -binance-futures,BTCUSDT,1582331500663000,1582331500791286,42381023,buy,9709.51,3.36 -binance-futures,BTCUSDT,1582331500663000,1582331500795710,42381024,buy,9709.51,1.103 -binance-futures,BTCUSDT,1582331500689000,1582331500822370,42381025,buy,9709.71,0.012 -binance-futures,BTCUSDT,1582331500689000,1582331500822379,42381026,buy,9709.71,3.988 -binance-futures,BTCUSDT,1582331500691000,1582331500822401,42381027,buy,9709.71,1.187 -binance-futures,BTCUSDT,1582331500715000,1582331500845630,42381028,buy,9710,3 -binance-futures,BTCUSDT,1582331500734000,1582331500861373,42381029,buy,9710,2 -binance-futures,BTCUSDT,1582331500788000,1582331500913470,42381030,buy,9710,0.1 -binance-futures,BTCUSDT,1582331500788000,1582331500918383,42381031,buy,9710,0.67 -binance-futures,BTCUSDT,1582331500793000,1582331500922811,42381032,buy,9710,0.72 -binance-futures,BTCUSDT,1582331500799000,1582331500927805,42381033,buy,9710,0.202 -binance-futures,BTCUSDT,1582331503772000,1582331503892273,42381034,buy,9710.54,0.036 -binance-futures,BTCUSDT,1582331504675000,1582331504800459,42381035,sell,9710.53,0.1 -binance-futures,BTCUSDT,1582331505297000,1582331505427550,42381036,sell,9710.53,1.116 -binance-futures,BTCUSDT,1582331505999000,1582331506124680,42381037,sell,9710.17,0.002 -binance-futures,BTCUSDT,1582331507596000,1582331507723056,42381038,buy,9710.54,0.1 -binance-futures,BTCUSDT,1582331508318000,1582331508446146,42381039,sell,9710.53,0.031 -binance-futures,BTCUSDT,1582331508318000,1582331508450630,42381040,sell,9710.52,0.019 -binance-futures,BTCUSDT,1582331510265000,1582331510422632,42381041,buy,9710.54,0.154 -binance-futures,BTCUSDT,1582331510265000,1582331510424298,42381042,buy,9710.7,0.034 -binance-futures,BTCUSDT,1582331510327000,1582331510454476,42381043,sell,9710.7,0.463 -binance-futures,BTCUSDT,1582331513788000,1582331513911472,42381044,sell,9710.7,0.349 -binance-futures,BTCUSDT,1582331513905000,1582331514033493,42381045,sell,9709.84,0.004 -binance-futures,BTCUSDT,1582331513905000,1582331514038634,42381046,sell,9709.83,2.111 -binance-futures,BTCUSDT,1582331513917000,1582331514047388,42381047,sell,9709.7,0.004 -binance-futures,BTCUSDT,1582331513934000,1582331514059534,42381048,sell,9709.7,0.001 -binance-futures,BTCUSDT,1582331513934000,1582331514059537,42381049,sell,9709.7,1.999 -binance-futures,BTCUSDT,1582331513940000,1582331514067709,42381050,sell,9709.7,0.897 -binance-futures,BTCUSDT,1582331513956000,1582331514086277,42381051,sell,9709.7,1.244 -binance-futures,BTCUSDT,1582331513957000,1582331514086893,42381052,sell,9709.65,0.519 -binance-futures,BTCUSDT,1582331513957000,1582331514088415,42381053,sell,9709.65,0.237 -binance-futures,BTCUSDT,1582331513966000,1582331514096856,42381054,sell,9709.65,0.282 -binance-futures,BTCUSDT,1582331513966000,1582331514096866,42381055,sell,9709.65,0.519 -binance-futures,BTCUSDT,1582331513966000,1582331514097042,42381056,sell,9709.65,0.52 -binance-futures,BTCUSDT,1582331514133000,1582331514262251,42381057,sell,9709.14,0.091 -binance-futures,BTCUSDT,1582331514319000,1582331514444794,42381058,sell,9709.14,0.77 -binance-futures,BTCUSDT,1582331514376000,1582331514502537,42381059,sell,9709.14,0.1 -binance-futures,BTCUSDT,1582331514603000,1582331514731484,42381060,sell,9709.14,2 -binance-futures,BTCUSDT,1582331514634000,1582331514762094,42381061,sell,9709.14,0.244 -binance-futures,BTCUSDT,1582331514774000,1582331514902662,42381062,sell,9709,0.005 -binance-futures,BTCUSDT,1582331514774000,1582331514902793,42381063,sell,9709,4.592 -binance-futures,BTCUSDT,1582331514891000,1582331515021623,42381064,sell,9707.46,0.02 -binance-futures,BTCUSDT,1582331514891000,1582331515021633,42381065,sell,9707.45,1.01 -binance-futures,BTCUSDT,1582331515666000,1582331515793763,42381066,sell,9707.19,0.442 -binance-futures,BTCUSDT,1582331520412000,1582331520569231,42381067,buy,9706.56,0.1 -binance-futures,BTCUSDT,1582331520458000,1582331520582640,42381068,buy,9707.19,0.544 -binance-futures,BTCUSDT,1582331520458000,1582331520586715,42381069,buy,9707.19,0.544 -binance-futures,BTCUSDT,1582331520517000,1582331520646156,42381070,buy,9708.04,0.031 -binance-futures,BTCUSDT,1582331520517000,1582331520650599,42381071,buy,9708.05,0.031 -binance-futures,BTCUSDT,1582331520517000,1582331520653022,42381072,buy,9708.06,0.031 -binance-futures,BTCUSDT,1582331520517000,1582331520655410,42381073,buy,9708.08,2.368 -binance-futures,BTCUSDT,1582331520961000,1582331521087787,42381074,sell,9708.17,0.005 -binance-futures,BTCUSDT,1582331526650000,1582331526778449,42381075,buy,9707.91,0.1 -binance-futures,BTCUSDT,1582331526650000,1582331526778455,42381076,buy,9708.16,0.092 -binance-futures,BTCUSDT,1582331526650000,1582331526778462,42381077,buy,9708.4,0.005 -binance-futures,BTCUSDT,1582331526650000,1582331526790834,42381078,buy,9708.95,0.5 -binance-futures,BTCUSDT,1582331526650000,1582331526793296,42381079,buy,9709,2.56 -binance-futures,BTCUSDT,1582331526650000,1582331526795002,42381080,buy,9709.39,0.704 -binance-futures,BTCUSDT,1582331540648000,1582331540775102,42381081,buy,9708.06,0.041 -binance-futures,BTCUSDT,1582331540993000,1582331541119148,42381082,buy,9708.06,0.059 -binance-futures,BTCUSDT,1582331541787000,1582331541914731,42381083,sell,9708.93,0.038 -binance-futures,BTCUSDT,1582331542755000,1582331542879483,42381084,buy,9708.94,0.002 -binance-futures,BTCUSDT,1582331542933000,1582331543058235,42381085,sell,9708.93,0.071 -binance-futures,BTCUSDT,1582331543459000,1582331543583293,42381086,buy,9708.94,0.027 -binance-futures,BTCUSDT,1582331543459000,1582331543583311,42381087,buy,9708.94,0.1 -binance-futures,BTCUSDT,1582331543459000,1582331543583604,42381088,buy,9709,0.1 -binance-futures,BTCUSDT,1582331543459000,1582331543586407,42381089,buy,9709.2,0.005 -binance-futures,BTCUSDT,1582331543459000,1582331543591034,42381090,buy,9709.38,0.258 -binance-futures,BTCUSDT,1582331543510000,1582331543636194,42381091,buy,9709.38,0.01 -binance-futures,BTCUSDT,1582331544019000,1582331544144988,42381092,buy,9709.38,0.413 -binance-futures,BTCUSDT,1582331544292000,1582331544420099,42381093,sell,9709.66,0.01 -binance-futures,BTCUSDT,1582331545440000,1582331545565011,42381094,buy,9709.67,0.001 -binance-futures,BTCUSDT,1582331547505000,1582331547633114,42381095,sell,9709.66,2.751 -binance-futures,BTCUSDT,1582331547505000,1582331547633330,42381096,sell,9709.66,0.249 -binance-futures,BTCUSDT,1582331549490000,1582331549617774,42381097,sell,9709.08,0.01 -binance-futures,BTCUSDT,1582331553093000,1582331553220247,42381098,sell,9709.71,0.031 -binance-futures,BTCUSDT,1582331553093000,1582331553221032,42381099,sell,9709.7,0.031 -binance-futures,BTCUSDT,1582331553093000,1582331553225083,42381100,sell,9709.69,0.028 -binance-futures,BTCUSDT,1582331553971000,1582331554096727,42381101,sell,9709.05,0.031 -binance-futures,BTCUSDT,1582331553971000,1582331554098154,42381102,sell,9709.05,0.42 -binance-futures,BTCUSDT,1582331553971000,1582331554098164,42381103,sell,9709.04,0.031 -binance-futures,BTCUSDT,1582331553971000,1582331554098171,42381104,sell,9709.03,0.031 -binance-futures,BTCUSDT,1582331553971000,1582331554102449,42381105,sell,9709,0.005 -binance-futures,BTCUSDT,1582331553971000,1582331554105473,42381106,sell,9708.5,0.589 -binance-futures,BTCUSDT,1582331554013000,1582331554141483,42381107,sell,9709.09,0.031 -binance-futures,BTCUSDT,1582331554013000,1582331554146356,42381108,sell,9709.08,0.031 -binance-futures,BTCUSDT,1582331554013000,1582331554146370,42381109,sell,9709.07,0.031 -binance-futures,BTCUSDT,1582331554013000,1582331554147986,42381110,sell,9709.06,0.031 -binance-futures,BTCUSDT,1582331554013000,1582331554149122,42381111,sell,9708.5,0.493 -binance-futures,BTCUSDT,1582331554017000,1582331554151266,42381112,sell,9708.5,0.1 -binance-futures,BTCUSDT,1582331554141000,1582331554265432,42381113,sell,9708.7,0.005 -binance-futures,BTCUSDT,1582331554141000,1582331554265684,42381114,sell,9708.5,0.087 -binance-futures,BTCUSDT,1582331554176000,1582331554300425,42381115,sell,9708.5,0.144 -binance-futures,BTCUSDT,1582331554311000,1582331554435051,42381116,sell,9708.5,0.01 -binance-futures,BTCUSDT,1582331554567000,1582331554692092,42381117,sell,9708.5,0.05 -binance-futures,BTCUSDT,1582331556560000,1582331556682842,42381118,buy,9708.51,0.02 -binance-futures,BTCUSDT,1582331556875000,1582331556999400,42381119,sell,9708.5,0.001 -binance-futures,BTCUSDT,1582331557314000,1582331557436516,42381120,buy,9708.51,0.08 -binance-futures,BTCUSDT,1582331557314000,1582331557437317,42381121,buy,9708.53,0.031 -binance-futures,BTCUSDT,1582331557314000,1582331557444335,42381122,buy,9708.54,0.031 -binance-futures,BTCUSDT,1582331557314000,1582331557448002,42381123,buy,9708.55,0.031 -binance-futures,BTCUSDT,1582331557314000,1582331557448009,42381124,buy,9708.56,0.031 -binance-futures,BTCUSDT,1582331557314000,1582331557448016,42381125,buy,9708.71,0.056 -binance-futures,BTCUSDT,1582331557314000,1582331557451693,42381126,buy,9709.78,0.003 -binance-futures,BTCUSDT,1582331557314000,1582331557451701,42381127,buy,9709.78,0.012 -binance-futures,BTCUSDT,1582331557314000,1582331557451705,42381128,buy,9709.79,0.725 -binance-futures,BTCUSDT,1582331558741000,1582331558864945,42381129,sell,9708.73,0.002 -binance-futures,BTCUSDT,1582331558741000,1582331558865495,42381130,sell,9708.72,0.008 -binance-futures,BTCUSDT,1582331558921000,1582331559049392,42381131,sell,9708.72,0.002 -binance-futures,BTCUSDT,1582331560392000,1582331560518940,42381132,sell,9708.72,0.022 -binance-futures,BTCUSDT,1582331560717000,1582331560839310,42381133,sell,9708.72,0.206 -binance-futures,BTCUSDT,1582331560717000,1582331560839335,42381134,sell,9708.72,0.926 -binance-futures,BTCUSDT,1582331560732000,1582331560852173,42381135,sell,9708.72,0.412 -binance-futures,BTCUSDT,1582331560735000,1582331560857748,42381136,sell,9708.72,0.206 -binance-futures,BTCUSDT,1582331560736000,1582331560857979,42381137,sell,9708.72,0.309 -binance-futures,BTCUSDT,1582331562419000,1582331562539976,42381138,buy,9708.73,0.012 -binance-futures,BTCUSDT,1582331564151000,1582331564275896,42381139,sell,9708.54,0.317 -binance-futures,BTCUSDT,1582331564410000,1582331564539342,42381140,sell,9708.53,0.01 -binance-futures,BTCUSDT,1582331565526000,1582331565654681,42381141,sell,9708.53,0.309 -binance-futures,BTCUSDT,1582331565540000,1582331565666023,42381142,sell,9708.53,0.206 -binance-futures,BTCUSDT,1582331569233000,1582331569356646,42381143,sell,9708.84,0.1 -binance-futures,BTCUSDT,1582331569233000,1582331569356653,42381144,sell,9708.53,0.159 -binance-futures,BTCUSDT,1582331569233000,1582331569358372,42381145,sell,9708.53,0.206 -binance-futures,BTCUSDT,1582331569233000,1582331569358382,42381146,sell,9708.53,0.206 -binance-futures,BTCUSDT,1582331569233000,1582331569358393,42381147,sell,9708.53,0.412 -binance-futures,BTCUSDT,1582331569262000,1582331569387711,42381148,sell,9708.53,0.183 -binance-futures,BTCUSDT,1582331569322000,1582331569448012,42381149,sell,9708.53,0.382 -binance-futures,BTCUSDT,1582331569527000,1582331569653101,42381150,sell,9708.53,0.002 -binance-futures,BTCUSDT,1582331571088000,1582331571208011,42381151,sell,9708.53,0.01 -binance-futures,BTCUSDT,1582331572885000,1582331573017214,42381152,sell,9708.05,0.358 -binance-futures,BTCUSDT,1582331572885000,1582331573017224,42381153,sell,9708.05,0.206 -binance-futures,BTCUSDT,1582331572885000,1582331573017240,42381154,sell,9708.05,0.044 -binance-futures,BTCUSDT,1582331576845000,1582331576969815,42381155,sell,9708.13,0.206 -binance-futures,BTCUSDT,1582331576845000,1582331576975857,42381156,sell,9708.13,0.206 -binance-futures,BTCUSDT,1582331576845000,1582331576975864,42381157,sell,9708.13,0.162 -binance-futures,BTCUSDT,1582331576847000,1582331576980031,42381158,sell,9708.13,0.412 -binance-futures,BTCUSDT,1582331576847000,1582331576980330,42381159,sell,9708.13,0.617 -binance-futures,BTCUSDT,1582331577038000,1582331577163659,42381160,sell,9708.13,0.01 -binance-futures,BTCUSDT,1582331577707000,1582331577832943,42381161,buy,9708.85,0.1 -binance-futures,BTCUSDT,1582331578932000,1582331579059487,42381162,buy,9709.03,0.108 -binance-futures,BTCUSDT,1582331582073000,1582331582200182,42381163,buy,9708.91,0.116 -binance-futures,BTCUSDT,1582331582073000,1582331582205399,42381164,buy,9709.01,0.384 -binance-futures,BTCUSDT,1582331582597000,1582331582723818,42381165,sell,9708.9,0.005 -binance-futures,BTCUSDT,1582331582838000,1582331582963748,42381166,sell,9708.53,0.006 -binance-futures,BTCUSDT,1582331582838000,1582331582963757,42381167,sell,9708.24,0.001 -binance-futures,BTCUSDT,1582331583198000,1582331583341385,42381168,sell,9708.24,0.01 -binance-futures,BTCUSDT,1582331583743000,1582331583870931,42381169,sell,9708.1,0.011 -binance-futures,BTCUSDT,1582331583743000,1582331583874731,42381170,sell,9708.05,0.002 -binance-futures,BTCUSDT,1582331585109000,1582331585234119,42381171,sell,9708.05,0.075 -binance-futures,BTCUSDT,1582331585109000,1582331585236406,42381172,sell,9707.92,0.025 -binance-futures,BTCUSDT,1582331586755000,1582331586885977,42381173,sell,9708.5,0.005 -binance-futures,BTCUSDT,1582331586755000,1582331586885981,42381174,sell,9707.92,0.201 -binance-futures,BTCUSDT,1582331586756000,1582331586889609,42381175,sell,9707.92,0.206 -binance-futures,BTCUSDT,1582331586758000,1582331586891473,42381176,sell,9707.92,0.605 -binance-futures,BTCUSDT,1582331586758000,1582331586891479,42381177,sell,9707.92,0.206 -binance-futures,BTCUSDT,1582331589108000,1582331589232460,42381178,sell,9707.79,0.5 -binance-futures,BTCUSDT,1582331589635000,1582331589760645,42381179,sell,9707.79,0.123 -binance-futures,BTCUSDT,1582331589701000,1582331589825120,42381180,sell,9707.79,0.4 -binance-futures,BTCUSDT,1582331590980000,1582331591101621,42381181,sell,9707.87,0.01 -binance-futures,BTCUSDT,1582331592100000,1582331592225985,42381182,sell,9707.79,0.031 -binance-futures,BTCUSDT,1582331592100000,1582331592226009,42381183,sell,9707.78,0.031 -binance-futures,BTCUSDT,1582331592100000,1582331592226233,42381184,sell,9707.77,0.031 -binance-futures,BTCUSDT,1582331592100000,1582331592229217,42381185,sell,9707.76,0.007 -binance-futures,BTCUSDT,1582331592234000,1582331592362257,42381186,sell,9707.62,0.707 -binance-futures,BTCUSDT,1582331593817000,1582331593943937,42381187,sell,9707.49,4.835 -binance-futures,BTCUSDT,1582331593817000,1582331593944483,42381188,sell,9706.55,2 -binance-futures,BTCUSDT,1582331593817000,1582331593952098,42381189,sell,9705.9,0.173 -binance-futures,BTCUSDT,1582331593817000,1582331593952109,42381190,sell,9705.89,0.001 -binance-futures,BTCUSDT,1582331593817000,1582331593954305,42381191,sell,9705.64,2.185 -binance-futures,BTCUSDT,1582331593817000,1582331593954314,42381192,sell,9705,0.01 -binance-futures,BTCUSDT,1582331593817000,1582331593954324,42381193,sell,9705,0.2 -binance-futures,BTCUSDT,1582331593817000,1582331593956839,42381194,sell,9704.77,0.014 -binance-futures,BTCUSDT,1582331600251000,1582331600386912,42381195,sell,9707.03,0.447 -binance-futures,BTCUSDT,1582331600251000,1582331600386922,42381196,sell,9707.02,1.553 -binance-futures,BTCUSDT,1582331600272000,1582331600405181,42381197,sell,9707.02,0.447 -binance-futures,BTCUSDT,1582331600272000,1582331600406211,42381198,sell,9707.01,1.727 -binance-futures,BTCUSDT,1582331600283000,1582331600415687,42381199,sell,9707.03,0.468 -binance-futures,BTCUSDT,1582331600283000,1582331600415694,42381200,sell,9707.01,0.717 -binance-futures,BTCUSDT,1582331600332000,1582331600461817,42381201,sell,9706.47,2 -binance-futures,BTCUSDT,1582331600367000,1582331600493976,42381202,sell,9706.47,2 -binance-futures,BTCUSDT,1582331600388000,1582331600513778,42381203,sell,9706.47,1.725 -binance-futures,BTCUSDT,1582331600417000,1582331600547064,42381204,sell,9706.18,0.685 -binance-futures,BTCUSDT,1582331600417000,1582331600549990,42381205,sell,9706.18,1.315 -binance-futures,BTCUSDT,1582331600417000,1582331600551122,42381206,sell,9706.18,2 -binance-futures,BTCUSDT,1582331600419000,1582331600551432,42381207,sell,9706.18,1.667 -binance-futures,BTCUSDT,1582331600421000,1582331600561421,42381208,sell,9706.12,0.464 -binance-futures,BTCUSDT,1582331600421000,1582331600561427,42381209,sell,9706.12,0.464 -binance-futures,BTCUSDT,1582331600421000,1582331600561910,42381210,sell,9706.1,0.005 -binance-futures,BTCUSDT,1582331600459000,1582331600593037,42381211,sell,9705.98,5.865 -binance-futures,BTCUSDT,1582331600497000,1582331600628605,42381212,sell,9705.79,0.06 -binance-futures,BTCUSDT,1582331600506000,1582331600636688,42381213,sell,9705.79,0.04 -binance-futures,BTCUSDT,1582331600506000,1582331600636694,42381214,sell,9705.79,1.96 -binance-futures,BTCUSDT,1582331600533000,1582331600661652,42381215,sell,9705.79,2.828 -binance-futures,BTCUSDT,1582331600578000,1582331600702292,42381216,sell,9705.79,0.1 -binance-futures,BTCUSDT,1582331600663000,1582331600791928,42381217,sell,9705.79,0.54 -binance-futures,BTCUSDT,1582331600714000,1582331600841075,42381218,sell,9705.79,0.272 -binance-futures,BTCUSDT,1582331600924000,1582331601054755,42381219,sell,9704.05,0.41 -binance-futures,BTCUSDT,1582331601042000,1582331601169311,42381220,sell,9704.05,0.057 -binance-futures,BTCUSDT,1582331601042000,1582331601169930,42381221,sell,9704.05,0.464 -binance-futures,BTCUSDT,1582331601042000,1582331601169937,42381222,sell,9704.05,0.464 -binance-futures,BTCUSDT,1582331601042000,1582331601170394,42381223,sell,9704.04,0.455 -binance-futures,BTCUSDT,1582331601065000,1582331601193429,42381224,sell,9704.04,1.07 -binance-futures,BTCUSDT,1582331601111000,1582331601244727,42381225,sell,9704.04,0.01 -binance-futures,BTCUSDT,1582331601138000,1582331601537818,42381226,sell,9704.04,0.23 -binance-futures,BTCUSDT,1582331601147000,1582331601537914,42381227,sell,9704.04,0.77 -binance-futures,BTCUSDT,1582331601147000,1582331601537918,42381228,sell,9703.93,0.026 -binance-futures,BTCUSDT,1582331601576000,1582331601706737,42381229,sell,9702.23,0.55 -binance-futures,BTCUSDT,1582331601579000,1582331601712845,42381230,sell,9702.23,0.09 -binance-futures,BTCUSDT,1582331603299000,1582331603426676,42381231,buy,9701.83,0.02 -binance-futures,BTCUSDT,1582331603299000,1582331603430422,42381232,sell,9701.82,0.047 -binance-futures,BTCUSDT,1582331603299000,1582331603432538,42381233,sell,9701.79,0.203 -binance-futures,BTCUSDT,1582331604103000,1582331604231286,42381234,sell,9701.79,0.01 -binance-futures,BTCUSDT,1582331604803000,1582331604933523,42381235,sell,9701.79,0.193 -binance-futures,BTCUSDT,1582331606858000,1582331606984132,42381236,sell,9701.79,0.651 -binance-futures,BTCUSDT,1582331608071000,1582331608200099,42381237,sell,9701.79,0.768 -binance-futures,BTCUSDT,1582331608119000,1582331608255447,42381238,sell,9701.5,0.005 -binance-futures,BTCUSDT,1582331608119000,1582331608255461,42381239,sell,9701.24,0.01 -binance-futures,BTCUSDT,1582331608152000,1582331608277745,42381240,sell,9701.24,0.002 -binance-futures,BTCUSDT,1582331608176000,1582331608304702,42381241,sell,9701.07,0.047 -binance-futures,BTCUSDT,1582331608359000,1582331608484506,42381242,sell,9700.17,0.29 -binance-futures,BTCUSDT,1582331608359000,1582331608485035,42381243,sell,9700,0.25 -binance-futures,BTCUSDT,1582331608359000,1582331608489684,42381244,sell,9700,0.1 -binance-futures,BTCUSDT,1582331608359000,1582331608489693,42381245,sell,9700,0.001 -binance-futures,BTCUSDT,1582331608359000,1582331608489698,42381246,sell,9699.48,0.173 -binance-futures,BTCUSDT,1582331608359000,1582331608494299,42381247,sell,9699.47,0.012 -binance-futures,BTCUSDT,1582331608359000,1582331608494312,42381248,sell,9699.25,0.019 -binance-futures,BTCUSDT,1582331608359000,1582331608495655,42381249,sell,9699.25,0.011 -binance-futures,BTCUSDT,1582331610180000,1582331610314346,42381250,sell,9699.4,0.038 -binance-futures,BTCUSDT,1582331610484000,1582331610613236,42381251,sell,9699.44,0.031 -binance-futures,BTCUSDT,1582331610484000,1582331610615097,42381252,sell,9699.43,0.031 -binance-futures,BTCUSDT,1582331610484000,1582331610618698,42381253,sell,9699.43,0.262 -binance-futures,BTCUSDT,1582331612113000,1582331612247659,42381254,buy,9699.72,0.1 -binance-futures,BTCUSDT,1582331612113000,1582331612247666,42381255,buy,9699.78,0.1 -binance-futures,BTCUSDT,1582331612113000,1582331612247671,42381256,buy,9699.88,0.432 -binance-futures,BTCUSDT,1582331612113000,1582331612254685,42381257,buy,9699.89,0.031 -binance-futures,BTCUSDT,1582331612113000,1582331612258518,42381258,buy,9699.89,0.337 -binance-futures,BTCUSDT,1582331613176000,1582331613319295,42381259,buy,9699.81,0.1 -binance-futures,BTCUSDT,1582331613197000,1582331613597058,42381260,buy,9699.81,0.2 -binance-futures,BTCUSDT,1582331613250000,1582331613597402,42381261,buy,9699.81,2 -binance-futures,BTCUSDT,1582331613272000,1582331613597719,42381262,buy,9699.81,0.308 -binance-futures,BTCUSDT,1582331613400000,1582331613599037,42381263,buy,9700.5,0.005 -binance-futures,BTCUSDT,1582331613400000,1582331613599065,42381264,buy,9700.5,0.095 -binance-futures,BTCUSDT,1582331613596000,1582331613723778,42381265,buy,9700.5,0.1 -binance-futures,BTCUSDT,1582331613820000,1582331613946302,42381266,buy,9700.5,0.1 -binance-futures,BTCUSDT,1582331614028000,1582331614156266,42381267,buy,9700.5,0.1 -binance-futures,BTCUSDT,1582331614258000,1582331614383715,42381268,buy,9700.5,0.1 -binance-futures,BTCUSDT,1582331614445000,1582331614570848,42381269,buy,9700.5,0.1 -binance-futures,BTCUSDT,1582331615098000,1582331615224427,42381270,buy,9700.5,0.1 -binance-futures,BTCUSDT,1582331615271000,1582331615415412,42381271,buy,9700.5,0.1 -binance-futures,BTCUSDT,1582331615526000,1582331615653720,42381272,buy,9700.5,0.1 -binance-futures,BTCUSDT,1582331616994000,1582331617120941,42381273,sell,9700.49,0.1 -binance-futures,BTCUSDT,1582331617583000,1582331617706836,42381274,sell,9699,0.004 -binance-futures,BTCUSDT,1582331617583000,1582331617709442,42381275,sell,9698.6,0.005 -binance-futures,BTCUSDT,1582331617583000,1582331617712689,42381276,sell,9697.15,0.086 -binance-futures,BTCUSDT,1582331617684000,1582331617815207,42381277,sell,9697,0.005 -binance-futures,BTCUSDT,1582331617684000,1582331617815212,42381278,sell,9696.52,0.295 -binance-futures,BTCUSDT,1582331618628000,1582331618756192,42381279,sell,9696.52,0.01 -binance-futures,BTCUSDT,1582331618790000,1582331618916025,42381280,buy,9697.16,0.1 -binance-futures,BTCUSDT,1582331618928000,1582331619056421,42381281,buy,9697.3,0.005 -binance-futures,BTCUSDT,1582331618928000,1582331619056433,42381282,buy,9698.18,0.095 -binance-futures,BTCUSDT,1582331619219000,1582331619355383,42381283,buy,9697.46,0.1 -binance-futures,BTCUSDT,1582331619620000,1582331619748512,42381284,buy,9699.15,0.012 -binance-futures,BTCUSDT,1582331619621000,1582331619748520,42381285,buy,9699.23,0.088 -binance-futures,BTCUSDT,1582331619678000,1582331619807686,42381286,sell,9697.75,0.039 -binance-futures,BTCUSDT,1582331619914000,1582331620044604,42381287,buy,9697.48,0.1 -binance-futures,BTCUSDT,1582331620101000,1582331620227588,42381288,buy,9699.59,0.012 -binance-futures,BTCUSDT,1582331620101000,1582331620228049,42381289,buy,9699.64,0.088 -binance-futures,BTCUSDT,1582331620654000,1582331620780270,42381290,buy,9698.85,0.031 -binance-futures,BTCUSDT,1582331620654000,1582331620786322,42381291,buy,9698.86,0.031 -binance-futures,BTCUSDT,1582331620654000,1582331620791315,42381292,buy,9698.87,0.031 -binance-futures,BTCUSDT,1582331620654000,1582331620791319,42381293,buy,9699.63,0.007 -binance-futures,BTCUSDT,1582331620805000,1582331620929822,42381294,buy,9698.75,0.031 -binance-futures,BTCUSDT,1582331620805000,1582331620929835,42381295,buy,9698.75,0.069 -binance-futures,BTCUSDT,1582331620873000,1582331621001369,42381296,buy,9699.86,0.1 -binance-futures,BTCUSDT,1582331621869000,1582331621994779,42381297,buy,9699.86,1 -binance-futures,BTCUSDT,1582331622938000,1582331623065653,42381298,sell,9698.19,2 -binance-futures,BTCUSDT,1582331622938000,1582331623065662,42381299,sell,9698.13,0.095 -binance-futures,BTCUSDT,1582331622938000,1582331623070978,42381300,sell,9697.97,0.3 -binance-futures,BTCUSDT,1582331622938000,1582331623070986,42381301,sell,9697.97,0.1 -binance-futures,BTCUSDT,1582331623868000,1582331623997516,42381302,buy,9699.45,0.227 -binance-futures,BTCUSDT,1582331623868000,1582331623997525,42381303,buy,9699.52,0.273 -binance-futures,BTCUSDT,1582331627029000,1582331627153162,42381304,sell,9696.9,0.005 -binance-futures,BTCUSDT,1582331627029000,1582331627155767,42381305,sell,9696.01,0.047 -binance-futures,BTCUSDT,1582331627029000,1582331627160391,42381306,sell,9695.96,0.185 -binance-futures,BTCUSDT,1582331629187000,1582331629320046,42381307,buy,9697.87,0.154 -binance-futures,BTCUSDT,1582331629187000,1582331629321130,42381308,buy,9697.87,0.154 -binance-futures,BTCUSDT,1582331629187000,1582331629321401,42381309,buy,9698.7,0.005 -binance-futures,BTCUSDT,1582331629187000,1582331629325112,42381310,buy,9699.29,0.003 -binance-futures,BTCUSDT,1582331629187000,1582331629325124,42381311,buy,9699.3,1.022 -binance-futures,BTCUSDT,1582331629771000,1582331629895535,42381312,buy,9699.3,0.268 -binance-futures,BTCUSDT,1582331634050000,1582331634180325,42381313,sell,9700.13,0.242 -binance-futures,BTCUSDT,1582331634336000,1582331634465369,42381314,sell,9700.13,0.758 -binance-futures,BTCUSDT,1582331634336000,1582331634466200,42381315,sell,9700.13,2 -binance-futures,BTCUSDT,1582331646553000,1582331646681763,42381316,buy,9699.59,0.126 -binance-futures,BTCUSDT,1582331653588000,1582331653716882,42381317,buy,9697.83,0.031 -binance-futures,BTCUSDT,1582331653588000,1582331653717990,42381318,buy,9697.84,0.031 -binance-futures,BTCUSDT,1582331653588000,1582331653727591,42381319,buy,9697.85,0.031 -binance-futures,BTCUSDT,1582331653588000,1582331653727597,42381320,buy,9697.86,0.031 -binance-futures,BTCUSDT,1582331653773000,1582331653900477,42381321,buy,9698.63,0.5 -binance-futures,BTCUSDT,1582331656332000,1582331656459136,42381322,sell,9697.76,0.1 -binance-futures,BTCUSDT,1582331656332000,1582331656460992,42381323,sell,9697.37,0.021 -binance-futures,BTCUSDT,1582331656332000,1582331656462317,42381324,sell,9697,0.005 -binance-futures,BTCUSDT,1582331656332000,1582331656464231,42381325,sell,9697,0.005 -binance-futures,BTCUSDT,1582331656332000,1582331656465919,42381326,sell,9696.96,0.1 -binance-futures,BTCUSDT,1582331656332000,1582331656465929,42381327,sell,9696.52,0.169 -binance-futures,BTCUSDT,1582331667388000,1582331667515456,42381328,buy,9696.82,2 -binance-futures,BTCUSDT,1582331667391000,1582331667520865,42381329,buy,9696.82,0.681 -binance-futures,BTCUSDT,1582331667414000,1582331667538727,42381330,buy,9697,0.005 -binance-futures,BTCUSDT,1582331667435000,1582331667567277,42381331,buy,9697.72,0.426 -binance-futures,BTCUSDT,1582331667435000,1582331667567283,42381332,buy,9697.72,0.425 -binance-futures,BTCUSDT,1582331667435000,1582331667567287,42381333,buy,9697.72,1.149 -binance-futures,BTCUSDT,1582331667457000,1582331667583323,42381334,buy,9697.72,1.739 -binance-futures,BTCUSDT,1582331667457000,1582331667583333,42381335,buy,9697.78,0.426 -binance-futures,BTCUSDT,1582331667457000,1582331667586862,42381336,buy,9697.78,0.426 -binance-futures,BTCUSDT,1582331667457000,1582331667589513,42381337,buy,9697.79,0.1 -binance-futures,BTCUSDT,1582331667486000,1582331667617316,42381338,buy,9698.06,2 -binance-futures,BTCUSDT,1582331667509000,1582331667637884,42381339,buy,9698.06,1.715 -binance-futures,BTCUSDT,1582331667853000,1582331667979176,42381340,buy,9698.99,0.427 -binance-futures,BTCUSDT,1582331667853000,1582331667979482,42381341,buy,9698.99,1.573 -binance-futures,BTCUSDT,1582331667867000,1582331667996580,42381342,buy,9698.99,0.897 -binance-futures,BTCUSDT,1582331667877000,1582331668007088,42381343,buy,9698.99,2.278 -binance-futures,BTCUSDT,1582331667890000,1582331668017432,42381344,buy,9699,0.1 -binance-futures,BTCUSDT,1582331667920000,1582331668055217,42381345,buy,9699.58,0.681 -binance-futures,BTCUSDT,1582331667940000,1582331668065629,42381346,sell,9699.58,0.337 -binance-futures,BTCUSDT,1582331668002000,1582331668129231,42381347,buy,9699.89,0.65 -binance-futures,BTCUSDT,1582331668027000,1582331668159457,42381348,buy,9699.89,2.313 -binance-futures,BTCUSDT,1582331668057000,1582331668189810,42381349,buy,9700.13,1.242 -binance-futures,BTCUSDT,1582331668077000,1582331668211507,42381350,buy,9700.13,2.16 -binance-futures,BTCUSDT,1582331668103000,1582331668231345,42381351,buy,9700.14,0.004 -binance-futures,BTCUSDT,1582331668110000,1582331668247807,42381352,buy,9700.14,0.283 -binance-futures,BTCUSDT,1582331668110000,1582331668247813,42381353,buy,9700.14,0.004 -binance-futures,BTCUSDT,1582331668142000,1582331668268715,42381354,buy,9700.14,0.283 -binance-futures,BTCUSDT,1582331668148000,1582331668277627,42381355,buy,9700.14,1.896 -binance-futures,BTCUSDT,1582331668295000,1582331668422495,42381356,buy,9700.74,0.48 -binance-futures,BTCUSDT,1582331668295000,1582331668422500,42381357,buy,9700.74,0.86 -binance-futures,BTCUSDT,1582331668309000,1582331668436052,42381358,buy,9700.74,0.72 -binance-futures,BTCUSDT,1582331668337000,1582331668470031,42381359,buy,9700.74,0.6 -binance-futures,BTCUSDT,1582331668341000,1582331668472065,42381360,buy,9700.74,0.998 -binance-futures,BTCUSDT,1582331668394000,1582331668522744,42381361,buy,9701.74,2 -binance-futures,BTCUSDT,1582331668403000,1582331668534195,42381362,buy,9701.74,2.148 -binance-futures,BTCUSDT,1582331668428000,1582331668554608,42381363,buy,9701.85,0.1 -binance-futures,BTCUSDT,1582331668454000,1582331668584245,42381364,buy,9702.2,0.038 -binance-futures,BTCUSDT,1582331668454000,1582331668587280,42381365,buy,9702.2,1.962 -binance-futures,BTCUSDT,1582331668573000,1582331668706145,42381366,buy,9702.2,0.01 -binance-futures,BTCUSDT,1582331668630000,1582331668757063,42381367,sell,9702.19,0.088 -binance-futures,BTCUSDT,1582331668973000,1582331669105111,42381368,buy,9702.2,0.897 -binance-futures,BTCUSDT,1582331669185000,1582331669313683,42381369,sell,9702.19,0.049 -binance-futures,BTCUSDT,1582331669282000,1582331669434510,42381370,sell,9702.19,0.04 -binance-futures,BTCUSDT,1582331669299000,1582331669444872,42381371,buy,9702.2,0.68 -binance-futures,BTCUSDT,1582331669453000,1582331669578174,42381372,buy,9702.2,0.336 -binance-futures,BTCUSDT,1582331669652000,1582331669778117,42381373,sell,9702.76,0.434 -binance-futures,BTCUSDT,1582331669652000,1582331669778128,42381374,sell,9702.72,1.076 -binance-futures,BTCUSDT,1582331673680000,1582331673807215,42381375,buy,9703.05,0.047 -binance-futures,BTCUSDT,1582331673680000,1582331673807218,42381376,buy,9703.05,0.953 -binance-futures,BTCUSDT,1582331674410000,1582331674534659,42381377,buy,9703.05,0.04 -binance-futures,BTCUSDT,1582331674721000,1582331674849654,42381378,buy,9703.05,0.1 -binance-futures,BTCUSDT,1582331674893000,1582331675017132,42381379,buy,9703.05,0.1 -binance-futures,BTCUSDT,1582331675149000,1582331675273553,42381380,buy,9703.5,0.005 -binance-futures,BTCUSDT,1582331675149000,1582331675278822,42381381,buy,9703.52,0.095 -binance-futures,BTCUSDT,1582331675316000,1582331675442646,42381382,buy,9703.52,0.586 -binance-futures,BTCUSDT,1582331675722000,1582331675850042,42381383,sell,9703.76,0.01 -binance-futures,BTCUSDT,1582331678122000,1582331678249640,42381384,sell,9704.25,0.002 -binance-futures,BTCUSDT,1582331678872000,1582331678995826,42381385,buy,9704.26,2 -binance-futures,BTCUSDT,1582331678872000,1582331678996284,42381386,buy,9704.26,1 -binance-futures,BTCUSDT,1582331678872000,1582331678996293,42381387,buy,9704.26,0.01 -binance-futures,BTCUSDT,1582331678872000,1582331678996299,42381388,buy,9704.26,0.351 -binance-futures,BTCUSDT,1582331678895000,1582331679021210,42381389,buy,9704.26,0.025 -binance-futures,BTCUSDT,1582331680554000,1582331680682295,42381390,sell,9702.68,0.01 -binance-futures,BTCUSDT,1582331684796000,1582331684923579,42381391,buy,9703.71,0.018 -binance-futures,BTCUSDT,1582331684796000,1582331684923592,42381392,buy,9703.73,1.982 -binance-futures,BTCUSDT,1582331684818000,1582331684943164,42381393,buy,9703.73,0.273 -binance-futures,BTCUSDT,1582331684840000,1582331684968331,42381394,buy,9703.91,0.1 -binance-futures,BTCUSDT,1582331685913000,1582331686040210,42381395,sell,9704.44,0.01 -binance-futures,BTCUSDT,1582331686896000,1582331687035660,42381396,sell,9704.87,0.01 -binance-futures,BTCUSDT,1582331687307000,1582331687432468,42381397,buy,9704.88,0.35 -binance-futures,BTCUSDT,1582331688952000,1582331689079226,42381398,buy,9705,0.025 -binance-futures,BTCUSDT,1582331689292000,1582331689415477,42381399,sell,9704.99,2 -binance-futures,BTCUSDT,1582331689292000,1582331689415482,42381400,sell,9704.99,0.031 -binance-futures,BTCUSDT,1582331689292000,1582331689415490,42381401,sell,9704.99,0.74 -binance-futures,BTCUSDT,1582331689292000,1582331689416051,42381402,sell,9704.99,0.66 -binance-futures,BTCUSDT,1582331689292000,1582331689416347,42381403,sell,9704.99,0.1 -binance-futures,BTCUSDT,1582331689292000,1582331689416356,42381404,sell,9704.98,0.031 -binance-futures,BTCUSDT,1582331689292000,1582331689423139,42381405,sell,9704.97,0.031 -binance-futures,BTCUSDT,1582331689292000,1582331689428153,42381406,sell,9704.95,0.031 -binance-futures,BTCUSDT,1582331689292000,1582331689429577,42381407,sell,9704.94,0.031 -binance-futures,BTCUSDT,1582331690742000,1582331690867752,42381408,buy,9704.85,0.009 -binance-futures,BTCUSDT,1582331692073000,1582331692200986,42381409,sell,9704.22,0.01 -binance-futures,BTCUSDT,1582331696420000,1582331696546894,42381410,buy,9704.87,0.4 -binance-futures,BTCUSDT,1582331698232000,1582331698378078,42381411,sell,9704.22,0.01 -binance-futures,BTCUSDT,1582331698886000,1582331699015279,42381412,buy,9704.23,0.031 -binance-futures,BTCUSDT,1582331698886000,1582331699015288,42381413,buy,9704.23,0.369 -binance-futures,BTCUSDT,1582331698886000,1582331699015293,42381414,buy,9704.24,0.031 -binance-futures,BTCUSDT,1582331698886000,1582331699021883,42381415,buy,9704.25,0.031 -binance-futures,BTCUSDT,1582331698886000,1582331699024722,42381416,buy,9704.28,0.1 -binance-futures,BTCUSDT,1582331698886000,1582331699028165,42381417,buy,9704.3,0.1 -binance-futures,BTCUSDT,1582331698886000,1582331699028174,42381418,buy,9704.87,0.338 -binance-futures,BTCUSDT,1582331699118000,1582331699244951,42381419,sell,9704.32,0.031 -binance-futures,BTCUSDT,1582331699118000,1582331699245222,42381420,sell,9704.31,0.031 -binance-futures,BTCUSDT,1582331699118000,1582331699251853,42381421,sell,9704.3,0.031 -binance-futures,BTCUSDT,1582331699118000,1582331699251861,42381422,sell,9704.29,0.031 -binance-futures,BTCUSDT,1582331699118000,1582331699255034,42381423,sell,9704.28,0.031 -binance-futures,BTCUSDT,1582331699118000,1582331699255050,42381424,sell,9704.27,0.031 -binance-futures,BTCUSDT,1582331699118000,1582331699259609,42381425,sell,9704.26,0.031 -binance-futures,BTCUSDT,1582331699118000,1582331699259612,42381426,sell,9704.25,0.031 -binance-futures,BTCUSDT,1582331699118000,1582331699259618,42381427,sell,9704.24,0.031 -binance-futures,BTCUSDT,1582331699118000,1582331699260987,42381428,sell,9704.22,0.1 -binance-futures,BTCUSDT,1582331702630000,1582331702752748,42381429,sell,9704.45,0.06 -binance-futures,BTCUSDT,1582331703179000,1582331703303127,42381430,sell,9704.65,0.01 -binance-futures,BTCUSDT,1582331703995000,1582331704121029,42381431,buy,9704.87,0.006 -binance-futures,BTCUSDT,1582331709019000,1582331709146468,42381432,sell,9704.69,0.018 -binance-futures,BTCUSDT,1582331710026000,1582331710151339,42381433,sell,9704.69,0.01 -binance-futures,BTCUSDT,1582331713044000,1582331713167440,42381434,buy,9704.29,0.031 -binance-futures,BTCUSDT,1582331713044000,1582331713167516,42381435,buy,9704.29,0.019 -binance-futures,BTCUSDT,1582331716379000,1582331716503347,42381436,sell,9704.86,0.01 -binance-futures,BTCUSDT,1582331722773000,1582331722897643,42381437,sell,9704.86,0.67 -binance-futures,BTCUSDT,1582331722814000,1582331722936502,42381438,sell,9704.86,0.015 -binance-futures,BTCUSDT,1582331722846000,1582331722971941,42381439,sell,9704.29,0.003 -binance-futures,BTCUSDT,1582331722846000,1582331722976100,42381440,sell,9704.28,0.737 -binance-futures,BTCUSDT,1582331722856000,1582331722981938,42381441,sell,9704.28,0.72 -binance-futures,BTCUSDT,1582331722902000,1582331723035195,42381442,sell,9704.28,1.36 -binance-futures,BTCUSDT,1582331722914000,1582331723040177,42381443,sell,9704.28,1.34 -binance-futures,BTCUSDT,1582331722960000,1582331723085898,42381444,sell,9704.28,0.01 -binance-futures,BTCUSDT,1582331722995000,1582331723121533,42381445,sell,9704.28,0.01 -binance-futures,BTCUSDT,1582331723269000,1582331723394271,42381446,sell,9704.28,0.01 -binance-futures,BTCUSDT,1582331724354000,1582331724478655,42381447,sell,9704.11,0.65 -binance-futures,BTCUSDT,1582331727401000,1582331727525746,42381448,sell,9704,0.046 -binance-futures,BTCUSDT,1582331727871000,1582331727996511,42381449,sell,9703.28,0.897 -binance-futures,BTCUSDT,1582331727932000,1582331728058702,42381450,sell,9703.08,2 -binance-futures,BTCUSDT,1582331727934000,1582331728062905,42381451,sell,9703.08,2.681 -binance-futures,BTCUSDT,1582331727957000,1582331728082234,42381452,sell,9702.73,3.089 -binance-futures,BTCUSDT,1582331727976000,1582331728099593,42381453,sell,9702.4,0.005 -binance-futures,BTCUSDT,1582331727976000,1582331728102635,42381454,sell,9702.4,1.995 -binance-futures,BTCUSDT,1582331727979000,1582331728106392,42381455,sell,9702.4,0.447 -binance-futures,BTCUSDT,1582331728309000,1582331728437261,42381456,sell,9700.95,0.015 -binance-futures,BTCUSDT,1582331728999000,1582331729122757,42381457,sell,9700.94,0.01 -binance-futures,BTCUSDT,1582331735740000,1582331735865899,42381458,buy,9701.03,0.031 -binance-futures,BTCUSDT,1582331735740000,1582331735865905,42381459,buy,9701.03,0.999 -binance-futures,BTCUSDT,1582331737238000,1582331737377937,42381460,sell,9700.99,0.01 -binance-futures,BTCUSDT,1582331739182000,1582331739306006,42381461,sell,9700.2,0.08 -binance-futures,BTCUSDT,1582331739182000,1582331739306015,42381462,sell,9700,0.001 -binance-futures,BTCUSDT,1582331739182000,1582331739314723,42381463,sell,9699.73,0.434 -binance-futures,BTCUSDT,1582331739182000,1582331739316154,42381464,sell,9699.71,0.485 -binance-futures,BTCUSDT,1582331739628000,1582331739754125,42381465,buy,9700.91,0.031 -binance-futures,BTCUSDT,1582331739628000,1582331739754139,42381466,buy,9700.91,0.169 -binance-futures,BTCUSDT,1582331747952000,1582331748078977,42381467,sell,9697.29,0.01 -binance-futures,BTCUSDT,1582331750409000,1582331750535020,42381468,sell,9696.73,0.002 -binance-futures,BTCUSDT,1582331750409000,1582331750535033,42381469,sell,9696.73,0.389 -binance-futures,BTCUSDT,1582331750409000,1582331750535215,42381470,sell,9696.71,0.109 -binance-futures,BTCUSDT,1582331752421000,1582331752545113,42381471,sell,9697.28,0.433 -binance-futures,BTCUSDT,1582331756106000,1582331756228595,42381472,sell,9696.78,0.01 -binance-futures,BTCUSDT,1582331760200000,1582331760320809,42381473,sell,9696.71,1 -binance-futures,BTCUSDT,1582331760347000,1582331760481101,42381474,sell,9696.71,0.07 -binance-futures,BTCUSDT,1582331760595000,1582331760723663,42381475,buy,9696.72,0.03 -binance-futures,BTCUSDT,1582331760709000,1582331760838008,42381476,sell,9696.71,1.102 -binance-futures,BTCUSDT,1582331760738000,1582331760864696,42381477,sell,9696.71,0.719 -binance-futures,BTCUSDT,1582331760792000,1582331760921814,42381478,sell,9696.01,0.047 -binance-futures,BTCUSDT,1582331761418000,1582331761544633,42381479,sell,9695.81,0.32 -binance-futures,BTCUSDT,1582331762288000,1582331762414550,42381480,buy,9695.82,0.1 -binance-futures,BTCUSDT,1582331767419000,1582331767545924,42381481,sell,9695.81,0.365 -binance-futures,BTCUSDT,1582331768551000,1582331768678168,42381482,sell,9695.41,0.012 -binance-futures,BTCUSDT,1582331768551000,1582331768678174,42381483,sell,9695.41,0.038 -binance-futures,BTCUSDT,1582331774130000,1582331774253823,42381484,sell,9695.41,0.097 -binance-futures,BTCUSDT,1582331775017000,1582331775305103,42381485,buy,9695.42,0.005 -binance-futures,BTCUSDT,1582331775069000,1582331775305632,42381486,buy,9695.42,0.7 -binance-futures,BTCUSDT,1582331776174000,1582331776303831,42381487,sell,9695.25,0.008 -binance-futures,BTCUSDT,1582331776174000,1582331776303836,42381488,sell,9695.24,0.047 -binance-futures,BTCUSDT,1582331776199000,1582331776342100,42381489,sell,9695,0.322 -binance-futures,BTCUSDT,1582331776241000,1582331776369083,42381490,sell,9694.79,0.002 -binance-futures,BTCUSDT,1582331776291000,1582331776421695,42381491,sell,9693.87,0.04 -binance-futures,BTCUSDT,1582331777603000,1582331777731212,42381492,sell,9693.66,0.012 -binance-futures,BTCUSDT,1582331777603000,1582331777731453,42381493,sell,9693.01,0.001 -binance-futures,BTCUSDT,1582331777603000,1582331777733680,42381494,sell,9693,0.072 -binance-futures,BTCUSDT,1582331779464000,1582331779588178,42381495,sell,9693,0.121 -binance-futures,BTCUSDT,1582331779464000,1582331779588733,42381496,sell,9693,0.079 -binance-futures,BTCUSDT,1582331779610000,1582331779733215,42381497,sell,9693,0.01 -binance-futures,BTCUSDT,1582331779851000,1582331779975954,42381498,sell,9693,0.911 -binance-futures,BTCUSDT,1582331779851000,1582331779977169,42381499,sell,9692.08,0.685 -binance-futures,BTCUSDT,1582331779851000,1582331779979912,42381500,sell,9691.72,0.04 -binance-futures,BTCUSDT,1582331779851000,1582331779982975,42381501,sell,9691.61,2.336 -binance-futures,BTCUSDT,1582331779851000,1582331779982982,42381502,sell,9691.61,0.25 -binance-futures,BTCUSDT,1582331779998000,1582331780124887,42381503,sell,9691.41,0.001 -binance-futures,BTCUSDT,1582331779998000,1582331780125264,42381504,sell,9691.4,0.017 -binance-futures,BTCUSDT,1582331780783000,1582331780909604,42381505,buy,9692.08,0.031 -binance-futures,BTCUSDT,1582331781140000,1582331781263895,42381506,sell,9691.58,0.176 -binance-futures,BTCUSDT,1582331781304000,1582331781450653,42381507,buy,9691.59,0.1 -binance-futures,BTCUSDT,1582331781304000,1582331781450675,42381508,buy,9691.59,4.883 -binance-futures,BTCUSDT,1582331782405000,1582331782533142,42381509,buy,9692.98,0.278 -binance-futures,BTCUSDT,1582331782405000,1582331782534019,42381510,buy,9692.98,0.279 -binance-futures,BTCUSDT,1582331782426000,1582331782551446,42381511,buy,9693.06,2 -binance-futures,BTCUSDT,1582331782430000,1582331782556559,42381512,buy,9693.06,1.053 -binance-futures,BTCUSDT,1582331782738000,1582331782865830,42381513,buy,9694.37,1.3 -binance-futures,BTCUSDT,1582331783492000,1582331783623375,42381514,buy,9694.37,0.002 -binance-futures,BTCUSDT,1582331784399000,1582331784539066,42381515,sell,9694.36,0.05 -binance-futures,BTCUSDT,1582331786695000,1582331786818152,42381516,sell,9694.36,0.798 -binance-futures,BTCUSDT,1582331787157000,1582331787282870,42381517,sell,9694.36,0.008 -binance-futures,BTCUSDT,1582331790062000,1582331790186516,42381518,sell,9694,0.01 -binance-futures,BTCUSDT,1582331790062000,1582331790186530,42381519,sell,9692.7,0.19 -binance-futures,BTCUSDT,1582331790062000,1582331790197969,42381520,buy,9694.01,1.237 -binance-futures,BTCUSDT,1582331792633000,1582331792755971,42381521,buy,9694.01,0.242 -binance-futures,BTCUSDT,1582331793265000,1582331793390216,42381522,buy,9694.01,0.059 -binance-futures,BTCUSDT,1582331794945000,1582331795069304,42381523,buy,9693.81,0.2 -binance-futures,BTCUSDT,1582331797251000,1582331797377066,42381524,sell,9693.8,0.17 -binance-futures,BTCUSDT,1582331800229000,1582331800355317,42381525,sell,9693.87,2 -binance-futures,BTCUSDT,1582331800229000,1582331800359451,42381526,sell,9693.87,2 -binance-futures,BTCUSDT,1582331800229000,1582331800363605,42381527,sell,9693.87,1.328 -binance-futures,BTCUSDT,1582331804115000,1582331804238877,42381528,sell,9693.87,0.316 -binance-futures,BTCUSDT,1582331804521000,1582331804646538,42381529,buy,9693.88,0.1 -binance-futures,BTCUSDT,1582331804521000,1582331804646617,42381530,buy,9694.37,0.096 -binance-futures,BTCUSDT,1582331813594000,1582331813719769,42381531,buy,9693.88,0.1 -binance-futures,BTCUSDT,1582331813594000,1582331813722422,42381532,buy,9694.36,0.013 -binance-futures,BTCUSDT,1582331813594000,1582331813726807,42381533,buy,9694.36,0.003 -binance-futures,BTCUSDT,1582331813594000,1582331813726817,42381534,buy,9694.37,0.384 -binance-futures,BTCUSDT,1582331823254000,1582331823383840,42381535,sell,9694.99,0.1 -binance-futures,BTCUSDT,1582331824140000,1582331824262459,42381536,buy,9695,0.11 -binance-futures,BTCUSDT,1582331826830000,1582331826952190,42381537,buy,9695,0.245 -binance-futures,BTCUSDT,1582331827006000,1582331827132674,42381538,sell,9694.99,0.02 -binance-futures,BTCUSDT,1582331829324000,1582331829455289,42381539,buy,9695,0.038 -binance-futures,BTCUSDT,1582331829324000,1582331829459138,42381540,buy,9695,0.1 -binance-futures,BTCUSDT,1582331829324000,1582331829461339,42381541,buy,9695.31,0.681 -binance-futures,BTCUSDT,1582331829324000,1582331829464120,42381542,buy,9695.32,1.676 -binance-futures,BTCUSDT,1582331829599000,1582331829726362,42381543,sell,9695.31,2 -binance-futures,BTCUSDT,1582331829599000,1582331829726371,42381544,sell,9695.31,2 -binance-futures,BTCUSDT,1582331829599000,1582331829726376,42381545,sell,9695.31,2 -binance-futures,BTCUSDT,1582331829599000,1582331829726380,42381546,sell,9695.31,2 -binance-futures,BTCUSDT,1582331829599000,1582331829726384,42381547,sell,9695.31,0.237 -binance-futures,BTCUSDT,1582331829599000,1582331829728547,42381548,sell,9695.31,0.1 -binance-futures,BTCUSDT,1582331829599000,1582331829728558,42381549,sell,9695.3,0.67 -binance-futures,BTCUSDT,1582331829599000,1582331829733696,42381550,sell,9695.3,0.63 -binance-futures,BTCUSDT,1582331829599000,1582331829733718,42381551,sell,9695.3,0.74 -binance-futures,BTCUSDT,1582331829599000,1582331829733724,42381552,sell,9695.3,0.72 -binance-futures,BTCUSDT,1582331829599000,1582331829734506,42381553,sell,9695.15,0.1 -binance-futures,BTCUSDT,1582331829599000,1582331829736934,42381554,sell,9694.99,2 -binance-futures,BTCUSDT,1582331829599000,1582331829741541,42381555,sell,9694.54,0.673 -binance-futures,BTCUSDT,1582331829599000,1582331829741824,42381556,sell,9694.54,0.673 -binance-futures,BTCUSDT,1582331829599000,1582331829741834,42381557,sell,9694.54,0.673 -binance-futures,BTCUSDT,1582331829599000,1582331829741837,42381558,sell,9694.54,0.673 -binance-futures,BTCUSDT,1582331829599000,1582331829742647,42381559,sell,9694.26,1.31 -binance-futures,BTCUSDT,1582331829599000,1582331829742660,42381560,sell,9694.24,2 -binance-futures,BTCUSDT,1582331829599000,1582331829744602,42381561,sell,9694.17,2 -binance-futures,BTCUSDT,1582331829599000,1582331829745458,42381562,sell,9694.15,2 -binance-futures,BTCUSDT,1582331829599000,1582331829747392,42381563,sell,9694.11,1.801 -binance-futures,BTCUSDT,1582331831398000,1582331831523046,42381564,sell,9693.91,0.25 -binance-futures,BTCUSDT,1582331831680000,1582331831804006,42381565,buy,9693.94,0.031 -binance-futures,BTCUSDT,1582331831680000,1582331831806797,42381566,buy,9693.95,0.031 -binance-futures,BTCUSDT,1582331831680000,1582331831810083,42381567,buy,9693.96,0.031 -binance-futures,BTCUSDT,1582331831680000,1582331831812027,42381568,buy,9693.97,0.007 -binance-futures,BTCUSDT,1582331834999000,1582331835124747,42381569,buy,9694.65,0.031 -binance-futures,BTCUSDT,1582331834999000,1582331835130103,42381570,buy,9694.66,0.031 -binance-futures,BTCUSDT,1582331834999000,1582331835130111,42381571,buy,9694.67,0.011 -binance-futures,BTCUSDT,1582331836574000,1582331836701846,42381572,buy,9695.28,0.06 -binance-futures,BTCUSDT,1582331837154000,1582331837276406,42381573,sell,9695.27,0.2 -binance-futures,BTCUSDT,1582331840504000,1582331840633358,42381574,buy,9694.47,0.1 -binance-futures,BTCUSDT,1582331840739000,1582331840865808,42381575,buy,9694.47,0.272 -binance-futures,BTCUSDT,1582331840829000,1582331840959760,42381576,buy,9694.48,0.031 -binance-futures,BTCUSDT,1582331840829000,1582331840965779,42381577,buy,9694.49,0.031 -binance-futures,BTCUSDT,1582331840830000,1582331840965810,42381578,buy,9694.5,0.029 -binance-futures,BTCUSDT,1582331840861000,1582331840986546,42381579,buy,9694.94,3.136 -binance-futures,BTCUSDT,1582331840881000,1582331841007471,42381580,buy,9695.28,0.1 -binance-futures,BTCUSDT,1582331840881000,1582331841010064,42381581,buy,9695.28,1.9 -binance-futures,BTCUSDT,1582331840891000,1582331841017729,42381582,buy,9695.28,2 -binance-futures,BTCUSDT,1582331840912000,1582331841040342,42381583,buy,9695.28,1.235 -binance-futures,BTCUSDT,1582331840912000,1582331841040638,42381584,buy,9695.42,1.361 -binance-futures,BTCUSDT,1582331840932000,1582331841060151,42381585,sell,9695.28,0.027 -binance-futures,BTCUSDT,1582331840947000,1582331841075709,42381586,buy,9695.8,0.647 -binance-futures,BTCUSDT,1582331840947000,1582331841077335,42381587,buy,9695.8,0.647 -binance-futures,BTCUSDT,1582331840947000,1582331841077344,42381588,buy,9695.8,0.706 -binance-futures,BTCUSDT,1582331844119000,1582331844262474,42381589,buy,9695.61,0.1 -binance-futures,BTCUSDT,1582331844119000,1582331844264046,42381590,buy,9695.81,0.316 -binance-futures,BTCUSDT,1582331844119000,1582331844264058,42381591,buy,9696.33,0.37 -binance-futures,BTCUSDT,1582331844428000,1582331844552656,42381592,buy,9696.33,1 -binance-futures,BTCUSDT,1582331845402000,1582331845526206,42381593,buy,9696.17,2.74 -binance-futures,BTCUSDT,1582331847005000,1582331847134541,42381594,buy,9696.59,0.039 -binance-futures,BTCUSDT,1582331848873000,1582331849001679,42381595,buy,9698.75,0.804 -binance-futures,BTCUSDT,1582331848905000,1582331849038555,42381596,buy,9699.34,0.72 -binance-futures,BTCUSDT,1582331848914000,1582331849049893,42381597,buy,9699.34,0.67 -binance-futures,BTCUSDT,1582331848914000,1582331849049899,42381598,buy,9699.34,0.74 -binance-futures,BTCUSDT,1582331848921000,1582331849052441,42381599,buy,9699.34,0.67 -binance-futures,BTCUSDT,1582331849269000,1582331849397462,42381600,buy,9699.47,0.01 -binance-futures,BTCUSDT,1582331849273000,1582331849402219,42381601,buy,9699.47,0.002 -binance-futures,BTCUSDT,1582331849273000,1582331849402223,42381602,buy,9699.64,0.008 -binance-futures,BTCUSDT,1582331849288000,1582331849415959,42381603,buy,9699.64,0.01 -binance-futures,BTCUSDT,1582331849294000,1582331849425131,42381604,buy,9699.64,0.01 -binance-futures,BTCUSDT,1582331849589000,1582331849734962,42381605,buy,9699.64,0.897 -binance-futures,BTCUSDT,1582331851590000,1582331851715818,42381606,sell,9701.37,0.031 -binance-futures,BTCUSDT,1582331851591000,1582331851715876,42381607,sell,9701.36,0.031 -binance-futures,BTCUSDT,1582331851591000,1582331851716310,42381608,sell,9701.36,0.326 -binance-futures,BTCUSDT,1582331852213000,1582331852352919,42381609,sell,9700.96,0.2 -binance-futures,BTCUSDT,1582331853240000,1582331853368104,42381610,buy,9701.38,0.047 -binance-futures,BTCUSDT,1582331853241000,1582331853368109,42381611,buy,9701.58,0.012 -binance-futures,BTCUSDT,1582331853241000,1582331853372926,42381612,buy,9701.82,0.047 -binance-futures,BTCUSDT,1582331853300000,1582331853439690,42381613,buy,9701.87,0.04 -binance-futures,BTCUSDT,1582331853300000,1582331853439695,42381614,buy,9702.69,1.528 -binance-futures,BTCUSDT,1582331853300000,1582331853439706,42381615,buy,9702.96,0.46 -binance-futures,BTCUSDT,1582331853300000,1582331853442533,42381616,buy,9703.48,3.498 -binance-futures,BTCUSDT,1582331853301000,1582331853442552,42381617,buy,9704,0.16 -binance-futures,BTCUSDT,1582331853301000,1582331853442559,42381618,buy,9704.16,0.08 -binance-futures,BTCUSDT,1582331853301000,1582331853446401,42381619,buy,9704.16,0.12 -binance-futures,BTCUSDT,1582331853301000,1582331853446433,42381620,buy,9704.2,0.025 -binance-futures,BTCUSDT,1582331853301000,1582331853446442,42381621,buy,9704.26,0.132 -binance-futures,BTCUSDT,1582331856518000,1582331856642971,42381622,buy,9701.98,0.031 -binance-futures,BTCUSDT,1582331856518000,1582331856644943,42381623,buy,9701.99,0.031 -binance-futures,BTCUSDT,1582331856518000,1582331856648975,42381624,buy,9702,0.031 -binance-futures,BTCUSDT,1582331856518000,1582331856654968,42381625,buy,9702.01,0.031 -binance-futures,BTCUSDT,1582331856518000,1582331856658835,42381626,buy,9702.62,0.31 -binance-futures,BTCUSDT,1582331856518000,1582331856658846,42381627,buy,9702.68,0.196 -binance-futures,BTCUSDT,1582331864440000,1582331864563269,42381628,sell,9701.87,0.05 -binance-futures,BTCUSDT,1582331864483000,1582331864611010,42381629,sell,9701.16,0.65 -binance-futures,BTCUSDT,1582331864533000,1582331864660138,42381630,sell,9700.98,1.34 -binance-futures,BTCUSDT,1582331864743000,1582331864869397,42381631,buy,9701.03,0.1 -binance-futures,BTCUSDT,1582331864743000,1582331864870428,42381632,buy,9701.06,0.1 -binance-futures,BTCUSDT,1582331864743000,1582331864872321,42381633,buy,9701.21,0.05 -binance-futures,BTCUSDT,1582331866281000,1582331866447945,42381634,buy,9702.69,0.04 -binance-futures,BTCUSDT,1582331866454000,1582331866580635,42381635,sell,9703.28,0.1 -binance-futures,BTCUSDT,1582331866454000,1582331866580658,42381636,sell,9703.28,0.9 -binance-futures,BTCUSDT,1582331867349000,1582331867475859,42381637,buy,9703.91,0.189 -binance-futures,BTCUSDT,1582331867349000,1582331867475909,42381638,buy,9703.93,1.141 -binance-futures,BTCUSDT,1582331867507000,1582331867632698,42381639,sell,9703.92,0.05 -binance-futures,BTCUSDT,1582331867507000,1582331867632701,42381640,sell,9703.72,0.06 -binance-futures,BTCUSDT,1582331867831000,1582331867960850,42381641,buy,9704.28,0.015 -binance-futures,BTCUSDT,1582331874200000,1582331874326928,42381642,buy,9705,0.01 -binance-futures,BTCUSDT,1582331874907000,1582331875033163,42381643,buy,9705,0.68 -binance-futures,BTCUSDT,1582331874941000,1582331875065552,42381644,buy,9705,0.01 -binance-futures,BTCUSDT,1582331882765000,1582331882889468,42381645,buy,9705,0.1 -binance-futures,BTCUSDT,1582331883567000,1582331883692335,42381646,buy,9705,0.1 -binance-futures,BTCUSDT,1582331886334000,1582331886456929,42381647,buy,9705,2 -binance-futures,BTCUSDT,1582331886352000,1582331886475440,42381648,buy,9705,0.875 -binance-futures,BTCUSDT,1582331886352000,1582331886475659,42381649,buy,9705,0.078 -binance-futures,BTCUSDT,1582331886358000,1582331886488547,42381650,buy,9705.29,0.012 -binance-futures,BTCUSDT,1582331886391000,1582331886517917,42381651,buy,9705.76,0.1 -binance-futures,BTCUSDT,1582331886431000,1582331886560950,42381652,sell,9706.2,0.077 -binance-futures,BTCUSDT,1582331886453000,1582331886577890,42381653,buy,9706.48,2 -binance-futures,BTCUSDT,1582331886509000,1582331886635197,42381654,buy,9706.48,0.609 -binance-futures,BTCUSDT,1582331888726000,1582331888851078,42381655,buy,9706.88,0.097 -binance-futures,BTCUSDT,1582331890172000,1582331890297671,42381656,sell,9706.87,0.031 -binance-futures,BTCUSDT,1582331890172000,1582331890298088,42381657,sell,9706.86,0.031 -binance-futures,BTCUSDT,1582331890172000,1582331890303985,42381658,sell,9706.85,0.031 -binance-futures,BTCUSDT,1582331890172000,1582331890309242,42381659,sell,9706.84,0.002 -binance-futures,BTCUSDT,1582331892290000,1582331892415180,42381660,sell,9706.27,0.001 -binance-futures,BTCUSDT,1582331893969000,1582331894095626,42381661,sell,9706.27,0.03 -binance-futures,BTCUSDT,1582331893969000,1582331894097263,42381662,sell,9706.27,0.091 -binance-futures,BTCUSDT,1582331895245000,1582331895368454,42381663,sell,9706.27,0.005 -binance-futures,BTCUSDT,1582331895900000,1582331896026793,42381664,sell,9706.27,0.001 -binance-futures,BTCUSDT,1582331896344000,1582331896469381,42381665,buy,9706.28,0.1 -binance-futures,BTCUSDT,1582331896921000,1582331897047949,42381666,sell,9706.82,0.001 -binance-futures,BTCUSDT,1582331897451000,1582331897577201,42381667,buy,9706.85,0.001 -binance-futures,BTCUSDT,1582331898914000,1582331899037857,42381668,sell,9706.25,0.016 -binance-futures,BTCUSDT,1582331899562000,1582331899685989,42381669,buy,9706.26,0.035 -binance-futures,BTCUSDT,1582331899562000,1582331899686345,42381670,buy,9706.26,0.1 -binance-futures,BTCUSDT,1582331899562000,1582331899686351,42381671,buy,9706.39,0.865 -binance-futures,BTCUSDT,1582331900996000,1582331901122042,42381672,buy,9706.39,0.817 -binance-futures,BTCUSDT,1582331901378000,1582331901500746,42381673,sell,9707.18,0.002 -binance-futures,BTCUSDT,1582331903063000,1582331903188426,42381674,buy,9707.19,0.01 -binance-futures,BTCUSDT,1582331905612000,1582331905733932,42381675,sell,9707.17,0.043 -binance-futures,BTCUSDT,1582331907461000,1582331907586372,42381676,sell,9707.17,0.053 -binance-futures,BTCUSDT,1582331907970000,1582331908097702,42381677,sell,9707.17,0.67 -binance-futures,BTCUSDT,1582331908023000,1582331908150652,42381678,sell,9707.17,0.68 -binance-futures,BTCUSDT,1582331908027000,1582331908155533,42381679,sell,9707.17,0.67 -binance-futures,BTCUSDT,1582331908027000,1582331908155539,42381680,sell,9707.17,0.67 -binance-futures,BTCUSDT,1582331908031000,1582331908160122,42381681,sell,9707.17,0.72 -binance-futures,BTCUSDT,1582331908031000,1582331908160184,42381682,sell,9707.17,0.19 -binance-futures,BTCUSDT,1582331908098000,1582331908226455,42381683,sell,9706.11,0.003 -binance-futures,BTCUSDT,1582331908098000,1582331908228723,42381684,sell,9706.11,0.011 -binance-futures,BTCUSDT,1582331908098000,1582331908229524,42381685,sell,9706.1,0.696 -binance-futures,BTCUSDT,1582331908161000,1582331908289199,42381686,sell,9706.11,0.002 -binance-futures,BTCUSDT,1582331908161000,1582331908290693,42381687,sell,9706.1,0.008 -binance-futures,BTCUSDT,1582331909177000,1582331909301610,42381688,sell,9706.1,0.003 -binance-futures,BTCUSDT,1582331913735000,1582331913861487,42381689,buy,9706.11,0.005 -binance-futures,BTCUSDT,1582331915641000,1582331915764139,42381690,sell,9706.1,1.589 -binance-futures,BTCUSDT,1582331915761000,1582331915883580,42381691,sell,9706.1,0.353 -binance-futures,BTCUSDT,1582331916327000,1582331916451154,42381692,sell,9706.1,0.007 -binance-futures,BTCUSDT,1582331921495000,1582331921619970,42381693,buy,9706.11,0.069 -binance-futures,BTCUSDT,1582331926460000,1582331926588080,42381694,sell,9706.1,0.68 -binance-futures,BTCUSDT,1582331926462000,1582331926590034,42381695,sell,9706.1,0.341 -binance-futures,BTCUSDT,1582331926462000,1582331926590037,42381696,sell,9705.84,0.329 -binance-futures,BTCUSDT,1582331926464000,1582331926596722,42381697,sell,9705.84,0.354 -binance-futures,BTCUSDT,1582331927234000,1582331927361009,42381698,buy,9705.66,0.1 -binance-futures,BTCUSDT,1582331928425000,1582331928549093,42381699,buy,9705.31,0.077 -binance-futures,BTCUSDT,1582331928752000,1582331928877746,42381700,sell,9705.55,0.388 -binance-futures,BTCUSDT,1582331934703000,1582331934831283,42381701,sell,9705.8,0.86 -binance-futures,BTCUSDT,1582331945526000,1582331945645845,42381702,buy,9705.56,0.212 -binance-futures,BTCUSDT,1582331946602000,1582331946722197,42381703,buy,9705.41,0.009 -binance-futures,BTCUSDT,1582331947134000,1582331947258663,42381704,sell,9705.4,0.5 -binance-futures,BTCUSDT,1582331947796000,1582331947924514,42381705,sell,9705.25,0.01 -binance-futures,BTCUSDT,1582331950527000,1582331950651725,42381706,sell,9705.11,0.442 -binance-futures,BTCUSDT,1582331952081000,1582331952206063,42381707,sell,9705.11,1 -binance-futures,BTCUSDT,1582331956275000,1582331956400902,42381708,buy,9705.12,0.1 -binance-futures,BTCUSDT,1582331956275000,1582331956400959,42381709,buy,9705.12,3.113 -binance-futures,BTCUSDT,1582331956275000,1582331956401241,42381710,buy,9705.12,0.497 -binance-futures,BTCUSDT,1582331956491000,1582331956620981,42381711,sell,9705.11,2.059 -binance-futures,BTCUSDT,1582331956491000,1582331956620988,42381712,sell,9705,0.013 -binance-futures,BTCUSDT,1582331956491000,1582331956631785,42381713,sell,9704.29,3.186 -binance-futures,BTCUSDT,1582331956491000,1582331956631788,42381714,sell,9704.27,0.1 -binance-futures,BTCUSDT,1582331956491000,1582331956635725,42381715,sell,9704,0.465 -binance-futures,BTCUSDT,1582331956491000,1582331956640083,42381716,sell,9703.2,0.024 -binance-futures,BTCUSDT,1582331956491000,1582331956640090,42381717,sell,9702.68,7 -binance-futures,BTCUSDT,1582331956491000,1582331956640098,42381718,sell,9702.47,0.81 -binance-futures,BTCUSDT,1582331956491000,1582331956640882,42381719,sell,9702.47,0.81 -binance-futures,BTCUSDT,1582331956491000,1582331956642039,42381720,sell,9702.46,0.704 -binance-futures,BTCUSDT,1582331956491000,1582331956643692,42381721,sell,9702.44,2.569 -binance-futures,BTCUSDT,1582331956491000,1582331956644166,42381722,sell,9701.72,0.58 -binance-futures,BTCUSDT,1582331956491000,1582331956645187,42381723,sell,9701.57,0.1 -binance-futures,BTCUSDT,1582331956491000,1582331956646061,42381724,sell,9701,0.4 -binance-futures,BTCUSDT,1582331956491000,1582331956646628,42381725,sell,9700.9,2.906 -binance-futures,BTCUSDT,1582331956492000,1582331956647150,42381726,sell,9700.78,0.306 -binance-futures,BTCUSDT,1582331956492000,1582331956647414,42381727,sell,9700.76,0.065 -binance-futures,BTCUSDT,1582331956492000,1582331956657023,42381728,sell,9700.7,0.5 -binance-futures,BTCUSDT,1582331956492000,1582331956657720,42381729,sell,9700.42,1.512 -binance-futures,BTCUSDT,1582331956492000,1582331956657730,42381730,sell,9700.19,1.188 -binance-futures,BTCUSDT,1582331956492000,1582331956657733,42381731,sell,9700.19,1.188 -binance-futures,BTCUSDT,1582331956492000,1582331956657740,42381732,sell,9700.14,0.04 -binance-futures,BTCUSDT,1582331956492000,1582331956658515,42381733,sell,9700,0.25 -binance-futures,BTCUSDT,1582331956492000,1582331956658533,42381734,sell,9699.93,1.028 -binance-futures,BTCUSDT,1582331956492000,1582331956658542,42381735,sell,9699.92,0.5 -binance-futures,BTCUSDT,1582331956492000,1582331956658552,42381736,sell,9699.9,1.188 -binance-futures,BTCUSDT,1582331956492000,1582331956658601,42381737,sell,9699.86,0.08 -binance-futures,BTCUSDT,1582331956492000,1582331956658604,42381738,sell,9699.86,0.04 -binance-futures,BTCUSDT,1582331956492000,1582331956658611,42381739,sell,9699.76,0.601 -binance-futures,BTCUSDT,1582331959713000,1582331959835079,42381740,buy,9703.59,0.022 -binance-futures,BTCUSDT,1582331961466000,1582331961590053,42381741,buy,9703.59,0.1 -binance-futures,BTCUSDT,1582331961466000,1582331961590071,42381742,buy,9704.17,0.012 -binance-futures,BTCUSDT,1582331961466000,1582331961590281,42381743,buy,9704.17,0.002 -binance-futures,BTCUSDT,1582331961466000,1582331961590605,42381744,buy,9704.18,0.435 -binance-futures,BTCUSDT,1582331962593000,1582331962711701,42381745,sell,9703.65,0.004 -binance-futures,BTCUSDT,1582331970807000,1582331970930626,42381746,sell,9703.71,0.091 -binance-futures,BTCUSDT,1582331972784000,1582331972907826,42381747,sell,9703.71,0.002 -binance-futures,BTCUSDT,1582331976528000,1582331976651415,42381748,buy,9703.59,0.297 -binance-futures,BTCUSDT,1582331976528000,1582331976651429,42381749,buy,9703.6,0.1 -binance-futures,BTCUSDT,1582331976528000,1582331976651442,42381750,buy,9703.65,0.086 -binance-futures,BTCUSDT,1582331981569000,1582331981696386,42381751,buy,9703.59,0.2 -binance-futures,BTCUSDT,1582331982022000,1582331982147488,42381752,buy,9703.59,0.237 -binance-futures,BTCUSDT,1582331982032000,1582331982156985,42381753,buy,9703.59,2.166 -binance-futures,BTCUSDT,1582331982032000,1582331982156992,42381754,buy,9703.59,0.105 -binance-futures,BTCUSDT,1582331982032000,1582331982156995,42381755,buy,9703.59,0.095 -binance-futures,BTCUSDT,1582331982032000,1582331982157242,42381756,buy,9703.59,3.321 -binance-futures,BTCUSDT,1582331983263000,1582331983391348,42381757,buy,9703.59,0.092 -binance-futures,BTCUSDT,1582331984441000,1582331984565812,42381758,sell,9703.58,0.154 -binance-futures,BTCUSDT,1582331984736000,1582331984859474,42381759,sell,9703.58,0.38 -binance-futures,BTCUSDT,1582331984739000,1582331984863260,42381760,sell,9703.58,0.149 -binance-futures,BTCUSDT,1582331984739000,1582331984863269,42381761,sell,9703.58,0.781 -binance-futures,BTCUSDT,1582331984748000,1582331984874069,42381762,sell,9703.58,0.01 -binance-futures,BTCUSDT,1582331984756000,1582331984880691,42381763,sell,9703.58,0.01 -binance-futures,BTCUSDT,1582331985155000,1582331985283658,42381764,sell,9703.45,0.37 -binance-futures,BTCUSDT,1582331993355000,1582331993480033,42381765,buy,9702.6,0.009 -binance-futures,BTCUSDT,1582331996870000,1582331996997045,42381766,sell,9702.49,0.012 -binance-futures,BTCUSDT,1582331996972000,1582331997103741,42381767,sell,9702.24,0.595 -binance-futures,BTCUSDT,1582331996989000,1582331997119485,42381768,sell,9702.24,0.139 -binance-futures,BTCUSDT,1582331997042000,1582331997174015,42381769,sell,9702.24,0.528 -binance-futures,BTCUSDT,1582331997067000,1582331997195767,42381770,sell,9702.24,0.387 -binance-futures,BTCUSDT,1582331997083000,1582331997211416,42381771,sell,9702.24,0.4 -binance-futures,BTCUSDT,1582331997104000,1582331997229722,42381772,sell,9702.24,0.352 -binance-futures,BTCUSDT,1582331997161000,1582331997301906,42381773,sell,9702.09,0.292 -binance-futures,BTCUSDT,1582331997338000,1582331997462855,42381774,sell,9701.9,0.02 -binance-futures,BTCUSDT,1582331997351000,1582331997478729,42381775,sell,9701.9,0.319 -binance-futures,BTCUSDT,1582331997383000,1582331997510627,42381776,sell,9701.9,0.144 -binance-futures,BTCUSDT,1582331997399000,1582331997528491,42381777,sell,9701.9,0.608 -binance-futures,BTCUSDT,1582331997478000,1582331997606660,42381778,sell,9701.77,0.015 -binance-futures,BTCUSDT,1582331998051000,1582331998178353,42381779,sell,9701.66,0.279 -binance-futures,BTCUSDT,1582331998671000,1582331998796781,42381780,sell,9701.66,0.5 -binance-futures,BTCUSDT,1582331998741000,1582331998865897,42381781,sell,9701.66,0.012 -binance-futures,BTCUSDT,1582332002174000,1582332002298147,42381782,sell,9701.49,0.031 -binance-futures,BTCUSDT,1582332002174000,1582332002299282,42381783,sell,9701.49,0.813 -binance-futures,BTCUSDT,1582332002552000,1582332002678182,42381784,buy,9701.4,0.001 -binance-futures,BTCUSDT,1582332002947000,1582332003198856,42381785,buy,9701.41,0.031 -binance-futures,BTCUSDT,1582332002947000,1582332003205666,42381786,buy,9701.42,0.031 -binance-futures,BTCUSDT,1582332002947000,1582332003205674,42381787,buy,9701.43,0.031 -binance-futures,BTCUSDT,1582332002947000,1582332003205682,42381788,buy,9701.44,0.002 -binance-futures,BTCUSDT,1582332002947000,1582332003207640,42381789,buy,9701.46,0.049 -binance-futures,BTCUSDT,1582332006791000,1582332006917401,42381790,sell,9701.43,0.031 -binance-futures,BTCUSDT,1582332006791000,1582332006917635,42381791,sell,9701.42,0.031 -binance-futures,BTCUSDT,1582332006791000,1582332006927687,42381792,sell,9701.41,0.031 -binance-futures,BTCUSDT,1582332006791000,1582332006927702,42381793,sell,9701.39,0.132 -binance-futures,BTCUSDT,1582332010815000,1582332010941467,42381794,buy,9701.39,0.001 -binance-futures,BTCUSDT,1582332012578000,1582332012703732,42381795,sell,9701.38,0.528 -binance-futures,BTCUSDT,1582332013850000,1582332013973730,42381796,sell,9701.38,0.008 -binance-futures,BTCUSDT,1582332017756000,1582332017882134,42381797,sell,9701.38,0.897 -binance-futures,BTCUSDT,1582332017799000,1582332017925995,42381798,sell,9701.38,0.609 -binance-futures,BTCUSDT,1582332017851000,1582332017975951,42381799,buy,9701.39,0.34 -binance-futures,BTCUSDT,1582332022052000,1582332022173265,42381800,buy,9701.39,0.006 -binance-futures,BTCUSDT,1582332023122000,1582332023246611,42381801,sell,9701.38,0.2 -binance-futures,BTCUSDT,1582332027416000,1582332027542047,42381802,buy,9701.39,0.206 -binance-futures,BTCUSDT,1582332041796000,1582332041920542,42381803,buy,9701.39,0.74 -binance-futures,BTCUSDT,1582332041803000,1582332041928597,42381804,buy,9701.39,0.248 -binance-futures,BTCUSDT,1582332041803000,1582332041928603,42381805,buy,9701.39,0.422 -binance-futures,BTCUSDT,1582332041803000,1582332041928607,42381806,buy,9701.39,0.259 -binance-futures,BTCUSDT,1582332041803000,1582332041928610,42381807,buy,9701.39,0.421 -binance-futures,BTCUSDT,1582332041807000,1582332041931407,42381808,buy,9701.39,0.72 -binance-futures,BTCUSDT,1582332041809000,1582332041933977,42381809,buy,9701.39,0.67 -binance-futures,BTCUSDT,1582332041844000,1582332041964974,42381810,buy,9701.39,0.68 -binance-futures,BTCUSDT,1582332041849000,1582332041974042,42381811,buy,9701.39,0.193 -binance-futures,BTCUSDT,1582332041849000,1582332041974231,42381812,buy,9701.39,0.527 -binance-futures,BTCUSDT,1582332041872000,1582332041999489,42381813,buy,9701.39,0.67 -binance-futures,BTCUSDT,1582332041884000,1582332042011813,42381814,buy,9701.39,0.01 -binance-futures,BTCUSDT,1582332041886000,1582332042011824,42381815,buy,9701.39,0.09 -binance-futures,BTCUSDT,1582332041886000,1582332042012085,42381816,buy,9701.39,0.58 -binance-futures,BTCUSDT,1582332041890000,1582332042015547,42381817,buy,9701.39,0.74 -binance-futures,BTCUSDT,1582332041897000,1582332042024884,42381818,buy,9701.39,0.01 -binance-futures,BTCUSDT,1582332041903000,1582332042029240,42381819,buy,9701.39,2 -binance-futures,BTCUSDT,1582332041912000,1582332042037897,42381820,buy,9701.39,0.01 -binance-futures,BTCUSDT,1582332041987000,1582332042110844,42381821,buy,9701.39,0.181 -binance-futures,BTCUSDT,1582332042023000,1582332042150759,42381822,buy,9701.46,0.161 -binance-futures,BTCUSDT,1582332042111000,1582332042247921,42381823,buy,9701.49,2 -binance-futures,BTCUSDT,1582332042131000,1582332042252968,42381824,buy,9701.49,2 -binance-futures,BTCUSDT,1582332042257000,1582332042382951,42381825,buy,9701.5,0.108 -binance-futures,BTCUSDT,1582332042257000,1582332042383013,42381826,buy,9701.5,1.892 -binance-futures,BTCUSDT,1582332046109000,1582332046234825,42381827,sell,9702.07,0.243 -binance-futures,BTCUSDT,1582332048850000,1582332048977996,42381828,sell,9701.85,0.2 -binance-futures,BTCUSDT,1582332051507000,1582332051632791,42381829,buy,9701.86,0.01 -binance-futures,BTCUSDT,1582332056508000,1582332056632034,42381830,sell,9701.85,0.376 -binance-futures,BTCUSDT,1582332059399000,1582332059524243,42381831,sell,9701.85,0.909 -binance-futures,BTCUSDT,1582332064004000,1582332064128603,42381832,sell,9701.85,0.611 -binance-futures,BTCUSDT,1582332069285000,1582332069408647,42381833,sell,9701.85,0.62 -binance-futures,BTCUSDT,1582332069828000,1582332069949417,42381834,sell,9701.85,0.2 -binance-futures,BTCUSDT,1582332074546000,1582332074671654,42381835,sell,9701.85,0.2 -binance-futures,BTCUSDT,1582332082576000,1582332082699347,42381836,sell,9701.85,0.4 -binance-futures,BTCUSDT,1582332085754000,1582332085882639,42381837,sell,9701.85,1.073 -binance-futures,BTCUSDT,1582332085754000,1582332085882649,42381838,sell,9701.85,0.427 -binance-futures,BTCUSDT,1582332086531000,1582332086659002,42381839,sell,9701.85,0.256 -binance-futures,BTCUSDT,1582332091391000,1582332091520990,42381840,buy,9701.8,0.36 -binance-futures,BTCUSDT,1582332091393000,1582332091529403,42381841,buy,9701.8,0.214 -binance-futures,BTCUSDT,1582332091393000,1582332091530145,42381842,buy,9701.8,0.198 -binance-futures,BTCUSDT,1582332091393000,1582332091530160,42381843,buy,9701.8,0.412 -binance-futures,BTCUSDT,1582332091397000,1582332091533086,42381844,buy,9701.8,0.463 -binance-futures,BTCUSDT,1582332097230000,1582332097352997,42381845,buy,9701.74,0.031 -binance-futures,BTCUSDT,1582332097230000,1582332097353003,42381846,buy,9701.74,0.195 -binance-futures,BTCUSDT,1582332098096000,1582332098221387,42381847,sell,9701.73,0.5 -binance-futures,BTCUSDT,1582332098579000,1582332098704021,42381848,buy,9701.74,0.083 -binance-futures,BTCUSDT,1582332098579000,1582332098704028,42381849,buy,9701.74,0.329 -binance-futures,BTCUSDT,1582332100536000,1582332100659680,42381850,sell,9701.73,0.323 -binance-futures,BTCUSDT,1582332101215000,1582332101337766,42381851,buy,9701.74,0.59 -binance-futures,BTCUSDT,1582332101215000,1582332101337976,42381852,buy,9701.74,1.597 -binance-futures,BTCUSDT,1582332101215000,1582332101338224,42381853,buy,9701.74,0.082 -binance-futures,BTCUSDT,1582332101300000,1582332101421836,42381854,buy,9701.74,0.204 -binance-futures,BTCUSDT,1582332101406000,1582332101533376,42381855,buy,9701.74,0.509 -binance-futures,BTCUSDT,1582332102117000,1582332102236919,42381856,buy,9701.74,0.01 -binance-futures,BTCUSDT,1582332102728000,1582332102851746,42381857,sell,9701.73,0.5 -binance-futures,BTCUSDT,1582332102907000,1582332103033777,42381858,buy,9701.74,0.102 -binance-futures,BTCUSDT,1582332103103000,1582332103232998,42381859,buy,9701.74,0.223 -binance-futures,BTCUSDT,1582332103623000,1582332103747446,42381860,buy,9701.74,0.215 -binance-futures,BTCUSDT,1582332107999000,1582332108117352,42381861,sell,9701.73,0.5 -binance-futures,BTCUSDT,1582332109255000,1582332109382051,42381862,buy,9701.74,0.098 -binance-futures,BTCUSDT,1582332111000000,1582332111121995,42381863,buy,9701.74,0.051 -binance-futures,BTCUSDT,1582332114667000,1582332114790807,42381864,buy,9701.74,0.385 -binance-futures,BTCUSDT,1582332114903000,1582332115027025,42381865,buy,9701.74,0.006 -binance-futures,BTCUSDT,1582332114943000,1582332115067291,42381866,buy,9701.74,0.164 -binance-futures,BTCUSDT,1582332114959000,1582332115079832,42381867,buy,9701.74,0.247 -binance-futures,BTCUSDT,1582332115157000,1582332115279630,42381868,sell,9701.73,0.001 -binance-futures,BTCUSDT,1582332115320000,1582332115441782,42381869,buy,9701.74,0.065 -binance-futures,BTCUSDT,1582332115366000,1582332115490148,42381870,buy,9701.74,0.412 -binance-futures,BTCUSDT,1582332115369000,1582332115493609,42381871,buy,9701.74,0.226 -binance-futures,BTCUSDT,1582332115371000,1582332115497527,42381872,buy,9701.74,0.077 -binance-futures,BTCUSDT,1582332115372000,1582332115497541,42381873,buy,9701.74,0.412 -binance-futures,BTCUSDT,1582332115516000,1582332115640287,42381874,buy,9701.74,3.351 -binance-futures,BTCUSDT,1582332115543000,1582332115670475,42381875,buy,9701.74,0.626 -binance-futures,BTCUSDT,1582332115543000,1582332115671888,42381876,buy,9701.74,4.127 -binance-futures,BTCUSDT,1582332115543000,1582332115671895,42381877,buy,9701.85,0.001 -binance-futures,BTCUSDT,1582332115543000,1582332115677527,42381878,buy,9701.85,0.005 -binance-futures,BTCUSDT,1582332115543000,1582332115677541,42381879,buy,9701.86,0.68 -binance-futures,BTCUSDT,1582332115543000,1582332115679399,42381880,buy,9702,0.291 -binance-futures,BTCUSDT,1582332115595000,1582332115724205,42381881,buy,9702,2 -binance-futures,BTCUSDT,1582332115689000,1582332115814160,42381882,buy,9702,0.1 -binance-futures,BTCUSDT,1582332116505000,1582332116630092,42381883,sell,9701.99,0.5 -binance-futures,BTCUSDT,1582332118155000,1582332118285099,42381884,buy,9702,0.412 -binance-futures,BTCUSDT,1582332118166000,1582332118292981,42381885,buy,9702,0.412 -binance-futures,BTCUSDT,1582332119097000,1582332119221872,42381886,buy,9702,0.006 -binance-futures,BTCUSDT,1582332121172000,1582332121300682,42381887,sell,9701.99,0.001 -binance-futures,BTCUSDT,1582332121590000,1582332121717516,42381888,sell,9701.99,0.031 -binance-futures,BTCUSDT,1582332121590000,1582332121717523,42381889,sell,9701.99,0.969 -binance-futures,BTCUSDT,1582332127144000,1582332127269440,42381890,buy,9702,0.26 -binance-futures,BTCUSDT,1582332127144000,1582332127269782,42381891,buy,9702,0.01 -binance-futures,BTCUSDT,1582332127167000,1582332127293721,42381892,buy,9702,1.509 -binance-futures,BTCUSDT,1582332127230000,1582332127367017,42381893,buy,9702.42,0.002 -binance-futures,BTCUSDT,1582332127361000,1582332127486655,42381894,buy,9702.99,0.001 -binance-futures,BTCUSDT,1582332127361000,1582332127486659,42381895,buy,9702.99,0.002 -binance-futures,BTCUSDT,1582332127361000,1582332127486662,42381896,buy,9703,0.647 -binance-futures,BTCUSDT,1582332127385000,1582332127508896,42381897,buy,9703,0.353 -binance-futures,BTCUSDT,1582332127743000,1582332127868854,42381898,buy,9703.04,0.284 -binance-futures,BTCUSDT,1582332128558000,1582332128686238,42381899,buy,9703.04,0.28 -binance-futures,BTCUSDT,1582332129511000,1582332129641816,42381900,buy,9703.04,0.117 -binance-futures,BTCUSDT,1582332129511000,1582332129641823,42381901,buy,9703.59,0.183 -binance-futures,BTCUSDT,1582332129759000,1582332129885730,42381902,sell,9703.72,0.457 -binance-futures,BTCUSDT,1582332129759000,1582332129888167,42381903,sell,9703.71,0.031 -binance-futures,BTCUSDT,1582332129759000,1582332129888174,42381904,sell,9703.71,3.119 -binance-futures,BTCUSDT,1582332136195000,1582332136331310,42381905,buy,9704.34,0.008 -binance-futures,BTCUSDT,1582332136410000,1582332136535496,42381906,sell,9704.37,0.031 -binance-futures,BTCUSDT,1582332136410000,1582332136535842,42381907,sell,9704.36,0.026 -binance-futures,BTCUSDT,1582332141974000,1582332142101607,42381908,buy,9705.19,0.289 -binance-futures,BTCUSDT,1582332141974000,1582332142105014,42381909,buy,9705.19,0.003 -binance-futures,BTCUSDT,1582332141974000,1582332142106652,42381910,buy,9705.25,0.096 -binance-futures,BTCUSDT,1582332145906000,1582332146031735,42381911,buy,9705.19,0.004 -binance-futures,BTCUSDT,1582332152536000,1582332152661704,42381912,sell,9705.4,0.04 -binance-futures,BTCUSDT,1582332152654000,1582332152775647,42381913,buy,9705.41,0.001 -binance-futures,BTCUSDT,1582332155828000,1582332155954906,42381914,buy,9705.3,0.1 -binance-futures,BTCUSDT,1582332155828000,1582332155958201,42381915,buy,9705.41,0.285 -binance-futures,BTCUSDT,1582332159690000,1582332159816158,42381916,sell,9705.4,2.366 -binance-futures,BTCUSDT,1582332159978000,1582332160105863,42381917,sell,9705.19,0.897 -binance-futures,BTCUSDT,1582332160218000,1582332160346727,42381918,sell,9705.19,0.2 -binance-futures,BTCUSDT,1582332160515000,1582332160640533,42381919,sell,9705.18,0.67 -binance-futures,BTCUSDT,1582332160518000,1582332160649033,42381920,sell,9705.18,0.499 -binance-futures,BTCUSDT,1582332160519000,1582332160649252,42381921,sell,9704.9,0.151 -binance-futures,BTCUSDT,1582332160601000,1582332160727439,42381922,sell,9704.9,0.67 -binance-futures,BTCUSDT,1582332160667000,1582332160791518,42381923,sell,9704.9,0.01 -binance-futures,BTCUSDT,1582332160748000,1582332160876190,42381924,buy,9704.91,0.031 -binance-futures,BTCUSDT,1582332160748000,1582332160876196,42381925,buy,9704.91,0.756 -binance-futures,BTCUSDT,1582332160958000,1582332161084642,42381926,sell,9704.72,0.67 -binance-futures,BTCUSDT,1582332161004000,1582332161137221,42381927,sell,9704.48,0.67 -binance-futures,BTCUSDT,1582332162289000,1582332162416200,42381928,buy,9704.49,0.68 -binance-futures,BTCUSDT,1582332162289000,1582332162418337,42381929,buy,9704.49,0.32 -binance-futures,BTCUSDT,1582332163311000,1582332163438847,42381930,buy,9704.49,0.01 -binance-futures,BTCUSDT,1582332164593000,1582332164719653,42381931,buy,9704.49,0.01 -binance-futures,BTCUSDT,1582332165047000,1582332165167677,42381932,buy,9704.49,0.01 -binance-futures,BTCUSDT,1582332165483000,1582332165608155,42381933,buy,9704.49,0.01 -binance-futures,BTCUSDT,1582332165895000,1582332166018484,42381934,buy,9704.49,0.001 -binance-futures,BTCUSDT,1582332165895000,1582332166018503,42381935,buy,9704.49,0.009 -binance-futures,BTCUSDT,1582332166272000,1582332166403704,42381936,buy,9704.49,0.01 -binance-futures,BTCUSDT,1582332166846000,1582332166968366,42381937,buy,9704.49,0.01 -binance-futures,BTCUSDT,1582332167499000,1582332167624208,42381938,buy,9704.49,0.01 -binance-futures,BTCUSDT,1582332167787000,1582332167910850,42381939,sell,9704.48,0.012 -binance-futures,BTCUSDT,1582332167787000,1582332167914350,42381940,sell,9704.48,0.153 -binance-futures,BTCUSDT,1582332167787000,1582332167914359,42381941,sell,9704.1,0.003 -binance-futures,BTCUSDT,1582332167787000,1582332167915842,42381942,sell,9704.1,3.26 -binance-futures,BTCUSDT,1582332168530000,1582332168655680,42381943,buy,9704.65,0.01 -binance-futures,BTCUSDT,1582332170450000,1582332170571816,42381944,buy,9704.16,0.031 -binance-futures,BTCUSDT,1582332174558000,1582332174680713,42381945,buy,9704.49,0.031 -binance-futures,BTCUSDT,1582332174558000,1582332174686728,42381946,buy,9704.5,0.031 -binance-futures,BTCUSDT,1582332174559000,1582332174686737,42381947,buy,9704.5,0.159 -binance-futures,BTCUSDT,1582332174559000,1582332174688916,42381948,buy,9704.51,0.031 -binance-futures,BTCUSDT,1582332175468000,1582332175592490,42381949,buy,9704.64,0.1 -binance-futures,BTCUSDT,1582332179364000,1582332179491680,42381950,sell,9704.61,0.031 -binance-futures,BTCUSDT,1582332179364000,1582332179493217,42381951,sell,9704.6,0.031 -binance-futures,BTCUSDT,1582332179364000,1582332179496791,42381952,sell,9704.59,0.031 -binance-futures,BTCUSDT,1582332179364000,1582332179496797,42381953,sell,9704.58,0.031 -binance-futures,BTCUSDT,1582332179364000,1582332179500106,42381954,sell,9704.48,0.049 -binance-futures,BTCUSDT,1582332179364000,1582332179503341,42381955,sell,9704.12,0.014 -binance-futures,BTCUSDT,1582332179364000,1582332179503347,42381956,sell,9704.12,0.001 -binance-futures,BTCUSDT,1582332179364000,1582332179506724,42381957,sell,9704.11,1.012 -binance-futures,BTCUSDT,1582332180805000,1582332180935674,42381958,sell,9704.19,0.455 -binance-futures,BTCUSDT,1582332180805000,1582332180936530,42381959,sell,9704.18,0.031 -binance-futures,BTCUSDT,1582332180805000,1582332180940348,42381960,sell,9704.17,0.031 -binance-futures,BTCUSDT,1582332180805000,1582332180945535,42381961,sell,9704.16,0.031 -binance-futures,BTCUSDT,1582332180805000,1582332180948659,42381962,sell,9704.14,1.471 -binance-futures,BTCUSDT,1582332191710000,1582332191831954,42381963,buy,9704.59,4.623 -binance-futures,BTCUSDT,1582332191710000,1582332191832156,42381964,buy,9704.59,3.539 -binance-futures,BTCUSDT,1582332198576000,1582332198700346,42381965,sell,9704.39,0.99 -binance-futures,BTCUSDT,1582332199756000,1582332199885224,42381966,buy,9704.4,0.104 -binance-futures,BTCUSDT,1582332200433000,1582332200556555,42381967,buy,9704.4,0.33 -binance-futures,BTCUSDT,1582332200443000,1582332200566482,42381968,buy,9704.4,0.68 -binance-futures,BTCUSDT,1582332200965000,1582332201091635,42381969,buy,9704.4,1.3 -binance-futures,BTCUSDT,1582332202042000,1582332202170702,42381970,buy,9704.4,0.298 -binance-futures,BTCUSDT,1582332218961000,1582332219084901,42381971,buy,9704.57,1.791 -binance-futures,BTCUSDT,1582332218961000,1582332219088548,42381972,buy,9704.58,1.209 -binance-futures,BTCUSDT,1582332219004000,1582332219132228,42381973,buy,9704.58,0.01 -binance-futures,BTCUSDT,1582332219006000,1582332219132651,42381974,buy,9704.58,0.132 -binance-futures,BTCUSDT,1582332220654000,1582332220783384,42381975,sell,9704.4,0.2 -binance-futures,BTCUSDT,1582332229119000,1582332229247504,42381976,sell,9704.64,0.05 -binance-futures,BTCUSDT,1582332234076000,1582332234197163,42381977,sell,9705.37,0.031 -binance-futures,BTCUSDT,1582332234077000,1582332234202543,42381978,sell,9705.36,0.013 -binance-futures,BTCUSDT,1582332238159000,1582332238283666,42381979,buy,9705.38,0.01 -binance-futures,BTCUSDT,1582332257410000,1582332257537986,42381980,buy,9705.38,0.09 -binance-futures,BTCUSDT,1582332263698000,1582332263826917,42381981,sell,9706,0.01 -binance-futures,BTCUSDT,1582332264992000,1582332265113779,42381982,sell,9706.03,0.006 -binance-futures,BTCUSDT,1582332267671000,1582332267795486,42381983,sell,9706.04,0.103 -binance-futures,BTCUSDT,1582332267671000,1582332267798837,42381984,sell,9706.04,0.007 -binance-futures,BTCUSDT,1582332271547000,1582332271672965,42381985,buy,9706.06,0.395 -binance-futures,BTCUSDT,1582332271547000,1582332271673253,42381986,buy,9706.06,0.1 -binance-futures,BTCUSDT,1582332271547000,1582332271674062,42381987,buy,9706.25,0.016 -binance-futures,BTCUSDT,1582332271547000,1582332271678074,42381988,buy,9706.49,0.294 -binance-futures,BTCUSDT,1582332271547000,1582332271683307,42381989,buy,9706.67,0.297 -binance-futures,BTCUSDT,1582332272476000,1582332272600680,42381990,sell,9706.66,0.03 -binance-futures,BTCUSDT,1582332273981000,1582332274102833,42381991,buy,9706.04,0.05 -binance-futures,BTCUSDT,1582332275550000,1582332275672245,42381992,buy,9706.04,0.589 -binance-futures,BTCUSDT,1582332275550000,1582332275672252,42381993,buy,9706.04,0.1 -binance-futures,BTCUSDT,1582332275550000,1582332275672543,42381994,buy,9706.5,0.053 -binance-futures,BTCUSDT,1582332276481000,1582332276605277,42381995,sell,9706.25,0.204 -binance-futures,BTCUSDT,1582332285610000,1582332285734903,42381996,buy,9706.64,0.265 -binance-futures,BTCUSDT,1582332286325000,1582332286451893,42381997,sell,9705.81,0.02 -binance-futures,BTCUSDT,1582332286623000,1582332286749313,42381998,buy,9706.18,0.001 -binance-futures,BTCUSDT,1582332286844000,1582332286970340,42381999,sell,9706.33,0.009 -binance-futures,BTCUSDT,1582332288816000,1582332288941649,42382000,sell,9706.71,0.031 -binance-futures,BTCUSDT,1582332288816000,1582332288954107,42382001,sell,9706.7,0.031 -binance-futures,BTCUSDT,1582332288816000,1582332288954118,42382002,sell,9706.69,0.031 -binance-futures,BTCUSDT,1582332288816000,1582332288955857,42382003,sell,9706.68,0.031 -binance-futures,BTCUSDT,1582332288816000,1582332288955871,42382004,sell,9706.66,0.027 -binance-futures,BTCUSDT,1582332293846000,1582332293973217,42382005,sell,9706.24,0.217 -binance-futures,BTCUSDT,1582332296444000,1582332296567621,42382006,sell,9705.8,0.06 -binance-futures,BTCUSDT,1582332296444000,1582332296567659,42382007,sell,9705.8,0.046 -binance-futures,BTCUSDT,1582332300822000,1582332300954357,42382008,sell,9705.38,0.2 -binance-futures,BTCUSDT,1582332301644000,1582332301769836,42382009,sell,9705.38,0.001 -binance-futures,BTCUSDT,1582332302217000,1582332302345477,42382010,buy,9705.39,0.001 -binance-futures,BTCUSDT,1582332302332000,1582332302461239,42382011,buy,9705.41,0.031 -binance-futures,BTCUSDT,1582332302559000,1582332302687338,42382012,buy,9706.1,0.002 -binance-futures,BTCUSDT,1582332302559000,1582332302687341,42382013,buy,9706.1,0.307 -binance-futures,BTCUSDT,1582332304698000,1582332304824870,42382014,buy,9706.57,0.001 -binance-futures,BTCUSDT,1582332310843000,1582332310970128,42382015,buy,9706.55,0.031 -binance-futures,BTCUSDT,1582332310843000,1582332310970139,42382016,buy,9706.55,0.1 -binance-futures,BTCUSDT,1582332310843000,1582332310970142,42382017,buy,9706.56,0.031 -binance-futures,BTCUSDT,1582332310843000,1582332310975361,42382018,buy,9706.57,0.031 -binance-futures,BTCUSDT,1582332310843000,1582332310978501,42382019,buy,9706.58,0.031 -binance-futures,BTCUSDT,1582332313256000,1582332313397700,42382020,buy,9706.59,0.002 -binance-futures,BTCUSDT,1582332317406000,1582332317537916,42382021,sell,9706.6,0.008 -binance-futures,BTCUSDT,1582332323328000,1582332323455211,42382022,sell,9706.72,0.13 -binance-futures,BTCUSDT,1582332323386000,1582332323513482,42382023,sell,9706.59,0.68 -binance-futures,BTCUSDT,1582332323386000,1582332323519227,42382024,sell,9706.58,0.62 -binance-futures,BTCUSDT,1582332323390000,1582332323523177,42382025,sell,9706.58,0.01 -binance-futures,BTCUSDT,1582332323418000,1582332323544078,42382026,sell,9706.58,0.574 -binance-futures,BTCUSDT,1582332323431000,1582332323557441,42382027,sell,9706.58,0.01 -binance-futures,BTCUSDT,1582332323448000,1582332323576655,42382028,sell,9706.58,0.74 -binance-futures,BTCUSDT,1582332323521000,1582332323646267,42382029,sell,9706.58,0.74 -binance-futures,BTCUSDT,1582332323617000,1582332323747728,42382030,sell,9706.58,1.36 -binance-futures,BTCUSDT,1582332323683000,1582332323808656,42382031,sell,9706.58,0.01 -binance-futures,BTCUSDT,1582332323700000,1582332323827738,42382032,sell,9706.58,0.01 -binance-futures,BTCUSDT,1582332329161000,1582332329284909,42382033,sell,9706.58,0.72 -binance-futures,BTCUSDT,1582332329212000,1582332329334308,42382034,sell,9706.58,0.648 -binance-futures,BTCUSDT,1582332334264000,1582332334396422,42382035,buy,9705.58,0.031 -binance-futures,BTCUSDT,1582332334264000,1582332334398395,42382036,buy,9705.59,0.031 -binance-futures,BTCUSDT,1582332334264000,1582332334404913,42382037,buy,9705.6,0.031 -binance-futures,BTCUSDT,1582332334265000,1582332334408725,42382038,buy,9705.61,0.031 -binance-futures,BTCUSDT,1582332334265000,1582332334408738,42382039,buy,9706.36,0.1 -binance-futures,BTCUSDT,1582332334265000,1582332334411752,42382040,buy,9706.4,0.733 -binance-futures,BTCUSDT,1582332334265000,1582332334412990,42382041,buy,9706.4,0.104 -binance-futures,BTCUSDT,1582332335625000,1582332335750467,42382042,sell,9705.37,0.011 -binance-futures,BTCUSDT,1582332342761000,1582332342891129,42382043,sell,9705.37,0.002 -binance-futures,BTCUSDT,1582332345950000,1582332346077888,42382044,sell,9705.37,0.05 -binance-futures,BTCUSDT,1582332348919000,1582332349052097,42382045,sell,9705.37,0.081 -binance-futures,BTCUSDT,1582332348919000,1582332349052108,42382046,sell,9705.37,0.153 -binance-futures,BTCUSDT,1582332351945000,1582332352074360,42382047,sell,9705.37,0.226 -binance-futures,BTCUSDT,1582332357327000,1582332357454169,42382048,buy,9705.38,0.001 -binance-futures,BTCUSDT,1582332357423000,1582332357552511,42382049,sell,9705.37,0.08 -binance-futures,BTCUSDT,1582332359794000,1582332359915462,42382050,buy,9705.38,0.099 -binance-futures,BTCUSDT,1582332359794000,1582332359917652,42382051,buy,9705.38,0.972 -binance-futures,BTCUSDT,1582332360456000,1582332360583967,42382052,sell,9705.37,0.107 -binance-futures,BTCUSDT,1582332363769000,1582332363896660,42382053,sell,9705.37,0.002 -binance-futures,BTCUSDT,1582332372238000,1582332372372733,42382054,buy,9705.38,0.766 -binance-futures,BTCUSDT,1582332377718000,1582332377846091,42382055,sell,9705.37,0.114 -binance-futures,BTCUSDT,1582332390356000,1582332390489951,42382056,sell,9704.99,0.04 -binance-futures,BTCUSDT,1582332391060000,1582332391184114,42382057,sell,9704.83,0.031 -binance-futures,BTCUSDT,1582332391060000,1582332391186861,42382058,sell,9704.82,0.031 -binance-futures,BTCUSDT,1582332391060000,1582332391188507,42382059,sell,9704.81,0.031 -binance-futures,BTCUSDT,1582332391060000,1582332391190724,42382060,sell,9704.8,0.031 -binance-futures,BTCUSDT,1582332391060000,1582332391191829,42382061,sell,9704.73,0.876 -binance-futures,BTCUSDT,1582332391729000,1582332391856717,42382062,buy,9704.88,0.031 -binance-futures,BTCUSDT,1582332391729000,1582332391856723,42382063,buy,9704.88,0.519 -binance-futures,BTCUSDT,1582332392828000,1582332392955799,42382064,buy,9704.78,0.002 -binance-futures,BTCUSDT,1582332392927000,1582332393053397,42382065,buy,9704.78,0.029 -binance-futures,BTCUSDT,1582332392927000,1582332393054500,42382066,buy,9704.79,0.031 -binance-futures,BTCUSDT,1582332392927000,1582332393058236,42382067,buy,9704.8,0.031 -binance-futures,BTCUSDT,1582332392927000,1582332393061553,42382068,buy,9704.81,0.029 -binance-futures,BTCUSDT,1582332392927000,1582332393061589,42382069,buy,9705,0.02 -binance-futures,BTCUSDT,1582332392927000,1582332393063805,42382070,buy,9705.34,0.06 -binance-futures,BTCUSDT,1582332393998000,1582332394120615,42382071,sell,9704.73,0.229 -binance-futures,BTCUSDT,1582332399702000,1582332399829729,42382072,sell,9704.88,0.082 -binance-futures,BTCUSDT,1582332402498000,1582332402628841,42382073,sell,9704.84,1 -binance-futures,BTCUSDT,1582332403769000,1582332403897605,42382074,sell,9704.69,0.24 -binance-futures,BTCUSDT,1582332404055000,1582332404184480,42382075,sell,9704.69,0.129 -binance-futures,BTCUSDT,1582332423587000,1582332423712203,42382076,sell,9704.69,0.312 -binance-futures,BTCUSDT,1582332428203000,1582332428327241,42382077,buy,9704.69,0.106 -binance-futures,BTCUSDT,1582332429249000,1582332429371638,42382078,sell,9704.53,0.001 -binance-futures,BTCUSDT,1582332431694000,1582332431820994,42382079,sell,9704.53,4.224 -binance-futures,BTCUSDT,1582332431694000,1582332431825459,42382080,sell,9704.4,0.025 -binance-futures,BTCUSDT,1582332432107000,1582332432232013,42382081,sell,9704.01,0.682 -binance-futures,BTCUSDT,1582332432222000,1582332432612677,42382082,buy,9703.39,0.005 -binance-futures,BTCUSDT,1582332434514000,1582332434643770,42382083,sell,9702.75,0.091 -binance-futures,BTCUSDT,1582332436333000,1582332436458322,42382084,buy,9702.01,0.03 -binance-futures,BTCUSDT,1582332442251000,1582332442515833,42382085,sell,9702,0.002 -binance-futures,BTCUSDT,1582332452624000,1582332452749463,42382086,sell,9702,5.069 -binance-futures,BTCUSDT,1582332452697000,1582332452823897,42382087,sell,9702,0.054 -binance-futures,BTCUSDT,1582332452730000,1582332452856627,42382088,sell,9702,0.15 -binance-futures,BTCUSDT,1582332452734000,1582332452860086,42382089,sell,9702,0.35 -binance-futures,BTCUSDT,1582332452742000,1582332452866998,42382090,sell,9702,0.478 -binance-futures,BTCUSDT,1582332452742000,1582332452867109,42382091,sell,9702,0.227 -binance-futures,BTCUSDT,1582332452742000,1582332452867115,42382092,sell,9702,0.005 -binance-futures,BTCUSDT,1582332452992000,1582332453121686,42382093,sell,9701.57,0.1 -binance-futures,BTCUSDT,1582332454705000,1582332454830538,42382094,sell,9700.1,0.028 -binance-futures,BTCUSDT,1582332455598000,1582332455724285,42382095,buy,9700.11,0.002 -binance-futures,BTCUSDT,1582332455925000,1582332456048989,42382096,sell,9700.1,0.001 -binance-futures,BTCUSDT,1582332457878000,1582332458003148,42382097,sell,9700.1,0.071 -binance-futures,BTCUSDT,1582332457878000,1582332458003191,42382098,sell,9700,0.1 -binance-futures,BTCUSDT,1582332457878000,1582332458003888,42382099,sell,9700,0.005 -binance-futures,BTCUSDT,1582332457878000,1582332458010221,42382100,sell,9699.47,0.012 -binance-futures,BTCUSDT,1582332457878000,1582332458013544,42382101,sell,9698.31,0.05 -binance-futures,BTCUSDT,1582332457878000,1582332458015154,42382102,sell,9697.74,0.01 -binance-futures,BTCUSDT,1582332457878000,1582332458018454,42382103,sell,9697.3,0.006 -binance-futures,BTCUSDT,1582332457878000,1582332458019579,42382104,sell,9697.29,2.794 -binance-futures,BTCUSDT,1582332458910000,1582332459036315,42382105,sell,9697.34,0.057 -binance-futures,BTCUSDT,1582332458910000,1582332459036407,42382106,sell,9697.3,0.44 -binance-futures,BTCUSDT,1582332458910000,1582332459040740,42382107,sell,9697.29,0.538 -binance-futures,BTCUSDT,1582332459047000,1582332459172233,42382108,buy,9698.73,0.05 -binance-futures,BTCUSDT,1582332459324000,1582332459449074,42382109,sell,9697.29,0.029 -binance-futures,BTCUSDT,1582332460348000,1582332460471670,42382110,sell,9697.29,0.133 -binance-futures,BTCUSDT,1582332460350000,1582332460475752,42382111,sell,9697.29,0.578 -binance-futures,BTCUSDT,1582332460350000,1582332460475761,42382112,sell,9696.49,0.222 -binance-futures,BTCUSDT,1582332463286000,1582332463414932,42382113,sell,9696.41,0.258 -binance-futures,BTCUSDT,1582332463303000,1582332463428305,42382114,sell,9696.41,0.153 -binance-futures,BTCUSDT,1582332463895000,1582332464023250,42382115,buy,9697.17,0.003 -binance-futures,BTCUSDT,1582332464232000,1582332464354262,42382116,buy,9696.42,0.005 -binance-futures,BTCUSDT,1582332464952000,1582332465078533,42382117,sell,9696.41,0.002 -binance-futures,BTCUSDT,1582332466635000,1582332466756636,42382118,sell,9696.42,0.1 -binance-futures,BTCUSDT,1582332466875000,1582332467001884,42382119,buy,9697.1,0.005 -binance-futures,BTCUSDT,1582332466875000,1582332467002019,42382120,buy,9697.15,0.199 -binance-futures,BTCUSDT,1582332467971000,1582332468095833,42382121,buy,9696.75,0.442 -binance-futures,BTCUSDT,1582332467972000,1582332468095842,42382122,buy,9696.87,0.031 -binance-futures,BTCUSDT,1582332467972000,1582332468101398,42382123,buy,9697.34,0.527 -binance-futures,BTCUSDT,1582332468471000,1582332468591990,42382124,sell,9696.41,3 -binance-futures,BTCUSDT,1582332468580000,1582332468706388,42382125,buy,9697.42,0.295 -binance-futures,BTCUSDT,1582332468580000,1582332468706404,42382126,buy,9697.42,7.5 -binance-futures,BTCUSDT,1582332468723000,1582332468846242,42382127,buy,9697.7,0.18 -binance-futures,BTCUSDT,1582332468723000,1582332468846272,42382128,buy,9697.9,0.654 -binance-futures,BTCUSDT,1582332468723000,1582332468849975,42382129,buy,9697.9,0.654 -binance-futures,BTCUSDT,1582332468723000,1582332468850480,42382130,buy,9697.9,0.613 -binance-futures,BTCUSDT,1582332468723000,1582332468850485,42382131,buy,9697.9,0.366 -binance-futures,BTCUSDT,1582332468723000,1582332468854848,42382132,buy,9697.91,0.077 -binance-futures,BTCUSDT,1582332468723000,1582332468854859,42382133,buy,9697.95,0.5 -binance-futures,BTCUSDT,1582332468723000,1582332468858978,42382134,buy,9697.99,4.663 -binance-futures,BTCUSDT,1582332468723000,1582332468859259,42382135,buy,9698,1 -binance-futures,BTCUSDT,1582332468723000,1582332468862758,42382136,buy,9698.48,0.009 -binance-futures,BTCUSDT,1582332469098000,1582332469223733,42382137,buy,9697.89,2.601 -binance-futures,BTCUSDT,1582332469098000,1582332469228330,42382138,buy,9698.48,0.195 -binance-futures,BTCUSDT,1582332469098000,1582332469228337,42382139,buy,9698.48,0.194 -binance-futures,BTCUSDT,1582332471238000,1582332471359910,42382140,buy,9698.48,0.001 -binance-futures,BTCUSDT,1582332471456000,1582332471583144,42382141,buy,9698.48,0.09 -binance-futures,BTCUSDT,1582332471957000,1582332472082375,42382142,buy,9698.48,0.434 -binance-futures,BTCUSDT,1582332472621000,1582332472748450,42382143,buy,9698,0.01 -binance-futures,BTCUSDT,1582332478240000,1582332478364305,42382144,buy,9698,0.009 -binance-futures,BTCUSDT,1582332489074000,1582332489199558,42382145,sell,9697.99,0.004 -binance-futures,BTCUSDT,1582332490376000,1582332490499097,42382146,buy,9698,0.603 -binance-futures,BTCUSDT,1582332493932000,1582332494054820,42382147,buy,9698,0.26 -binance-futures,BTCUSDT,1582332493932000,1582332494055370,42382148,buy,9698,0.077 -binance-futures,BTCUSDT,1582332493932000,1582332494055903,42382149,buy,9698,0.1 -binance-futures,BTCUSDT,1582332493932000,1582332494058986,42382150,buy,9698.01,0.563 -binance-futures,BTCUSDT,1582332498443000,1582332498566444,42382151,sell,9698,0.019 -binance-futures,BTCUSDT,1582332505151000,1582332505270602,42382152,sell,9697.99,0.103 -binance-futures,BTCUSDT,1582332505271000,1582332505402627,42382153,buy,9698,0.1 -binance-futures,BTCUSDT,1582332505271000,1582332505402631,42382154,buy,9698,0.145 -binance-futures,BTCUSDT,1582332507140000,1582332507269437,42382155,sell,9697.99,0.5 -binance-futures,BTCUSDT,1582332508104000,1582332508227380,42382156,sell,9697.99,0.002 -binance-futures,BTCUSDT,1582332508360000,1582332508485311,42382157,sell,9697.99,0.02 -binance-futures,BTCUSDT,1582332510458000,1582332510585158,42382158,buy,9698,0.052 -binance-futures,BTCUSDT,1582332510458000,1582332510585705,42382159,buy,9698,0.1 -binance-futures,BTCUSDT,1582332511853000,1582332511980323,42382160,sell,9698,0.692 -binance-futures,BTCUSDT,1582332511853000,1582332511980923,42382161,sell,9698,0.403 -binance-futures,BTCUSDT,1582332514527000,1582332514653910,42382162,sell,9697.99,0.042 -binance-futures,BTCUSDT,1582332514559000,1582332514686242,42382163,sell,9697.99,0.264 -binance-futures,BTCUSDT,1582332514666000,1582332514790066,42382164,sell,9697.99,0.065 -binance-futures,BTCUSDT,1582332514666000,1582332514790081,42382165,sell,9697.99,0.014 -binance-futures,BTCUSDT,1582332514680000,1582332514806906,42382166,sell,9697.99,0.2 -binance-futures,BTCUSDT,1582332514740000,1582332514862936,42382167,sell,9697.99,0.047 -binance-futures,BTCUSDT,1582332514752000,1582332514877955,42382168,sell,9697.99,0.264 -binance-futures,BTCUSDT,1582332514776000,1582332514901399,42382169,sell,9697.99,0.246 -binance-futures,BTCUSDT,1582332515009000,1582332515135442,42382170,sell,9697.99,0.6 -binance-futures,BTCUSDT,1582332515251000,1582332515374458,42382171,sell,9697.99,0.021 -binance-futures,BTCUSDT,1582332515293000,1582332515423181,42382172,sell,9697.6,0.005 -binance-futures,BTCUSDT,1582332517545000,1582332517671218,42382173,buy,9696.4,0.1 -binance-futures,BTCUSDT,1582332518792000,1582332518917246,42382174,sell,9697.99,0.11 -binance-futures,BTCUSDT,1582332521488000,1582332521615908,42382175,buy,9697.6,0.005 -binance-futures,BTCUSDT,1582332521488000,1582332521620049,42382176,buy,9697.88,0.005 -binance-futures,BTCUSDT,1582332521834000,1582332521953581,42382177,sell,9697.52,0.031 -binance-futures,BTCUSDT,1582332521834000,1582332521956176,42382178,sell,9697.51,0.021 -binance-futures,BTCUSDT,1582332521879000,1582332522008453,42382179,sell,9697.54,0.031 -binance-futures,BTCUSDT,1582332521879000,1582332522010941,42382180,sell,9697.53,0.031 -binance-futures,BTCUSDT,1582332521879000,1582332522012121,42382181,sell,9697.52,0.22 -binance-futures,BTCUSDT,1582332521879000,1582332522012128,42382182,sell,9697.52,0.031 -binance-futures,BTCUSDT,1582332521879000,1582332522012131,42382183,sell,9697.52,0.67 -binance-futures,BTCUSDT,1582332521879000,1582332522012134,42382184,sell,9697.52,0.517 -binance-futures,BTCUSDT,1582332524264000,1582332524407382,42382185,sell,9696.69,0.031 -binance-futures,BTCUSDT,1582332524264000,1582332524407385,42382186,sell,9696.68,0.031 -binance-futures,BTCUSDT,1582332524264000,1582332524409803,42382187,sell,9696.67,0.031 -binance-futures,BTCUSDT,1582332524264000,1582332524412583,42382188,sell,9696.67,0.433 -binance-futures,BTCUSDT,1582332524264000,1582332524416676,42382189,sell,9696.65,2.783 -binance-futures,BTCUSDT,1582332524264000,1582332524416700,42382190,sell,9696.62,0.031 -binance-futures,BTCUSDT,1582332524264000,1582332524419421,42382191,sell,9696.61,0.031 -binance-futures,BTCUSDT,1582332524264000,1582332524422439,42382192,sell,9696.6,0.031 -binance-futures,BTCUSDT,1582332524264000,1582332524422451,42382193,sell,9696.53,0.002 -binance-futures,BTCUSDT,1582332524264000,1582332524422454,42382194,sell,9696.38,1.749 -binance-futures,BTCUSDT,1582332531357000,1582332531482510,42382195,sell,9697.15,0.009 -binance-futures,BTCUSDT,1582332531357000,1582332531485745,42382196,sell,9696.65,0.68 -binance-futures,BTCUSDT,1582332531889000,1582332532016111,42382197,sell,9696.15,0.51 -binance-futures,BTCUSDT,1582332531950000,1582332532077876,42382198,sell,9696.15,0.72 -binance-futures,BTCUSDT,1582332531952000,1582332532077892,42382199,sell,9696.15,0.67 -binance-futures,BTCUSDT,1582332532903000,1582332533030347,42382200,sell,9696.01,0.047 -binance-futures,BTCUSDT,1582332532903000,1582332533030773,42382201,sell,9696,0.131 -binance-futures,BTCUSDT,1582332532903000,1582332533036789,42382202,sell,9695.97,0.256 -binance-futures,BTCUSDT,1582332534583000,1582332534707678,42382203,buy,9695.98,0.002 -binance-futures,BTCUSDT,1582332556819000,1582332556942684,42382204,buy,9695.49,1 -binance-futures,BTCUSDT,1582332557785000,1582332557908084,42382205,sell,9695.48,0.05 -binance-futures,BTCUSDT,1582332557785000,1582332557908269,42382206,sell,9695.41,0.012 -binance-futures,BTCUSDT,1582332557785000,1582332557914203,42382207,sell,9695.24,0.047 -binance-futures,BTCUSDT,1582332557785000,1582332557918590,42382208,sell,9695,0.02 -binance-futures,BTCUSDT,1582332557785000,1582332557920696,42382209,sell,9694.8,0.1 -binance-futures,BTCUSDT,1582332557785000,1582332557922782,42382210,sell,9694.37,0.2 -binance-futures,BTCUSDT,1582332557785000,1582332557922799,42382211,sell,9694.1,0.18 -binance-futures,BTCUSDT,1582332560142000,1582332560268092,42382212,buy,9694.11,0.1 -binance-futures,BTCUSDT,1582332560421000,1582332560545677,42382213,buy,9694.11,1 -binance-futures,BTCUSDT,1582332562464000,1582332562588377,42382214,sell,9694.1,0.1 -binance-futures,BTCUSDT,1582332566232000,1582332566354739,42382215,sell,9694.1,0.004 -binance-futures,BTCUSDT,1582332568127000,1582332568272034,42382216,sell,9694.1,0.396 -binance-futures,BTCUSDT,1582332568127000,1582332568272049,42382217,sell,9694,0.102 -binance-futures,BTCUSDT,1582332570913000,1582332571037267,42382218,buy,9693.71,0.039 -binance-futures,BTCUSDT,1582332575913000,1582332576041226,42382219,buy,9693.71,0.008 -binance-futures,BTCUSDT,1582332576527000,1582332576651441,42382220,buy,9693.7,0.051 -binance-futures,BTCUSDT,1582332576952000,1582332577077734,42382221,buy,9693.71,0.078 -binance-futures,BTCUSDT,1582332578900000,1582332579022856,42382222,buy,9693.71,0.001 -binance-futures,BTCUSDT,1582332593223000,1582332593361803,42382223,buy,9693.71,0.125 -binance-futures,BTCUSDT,1582332601647000,1582332601772887,42382224,buy,9693.71,0.6 -binance-futures,BTCUSDT,1582332602752000,1582332602873945,42382225,sell,9693.7,1 -binance-futures,BTCUSDT,1582332602752000,1582332602874202,42382226,sell,9693.7,0.125 -binance-futures,BTCUSDT,1582332602752000,1582332602877481,42382227,sell,9693.7,0.125 -binance-futures,BTCUSDT,1582332602752000,1582332602877491,42382228,sell,9693.66,0.012 -binance-futures,BTCUSDT,1582332602752000,1582332602879182,42382229,sell,9693.66,12.295 -binance-futures,BTCUSDT,1582332608179000,1582332608306484,42382230,buy,9693.5,0.1 -binance-futures,BTCUSDT,1582332608179000,1582332608306633,42382231,buy,9693.5,0.005 -binance-futures,BTCUSDT,1582332608179000,1582332608306924,42382232,buy,9693.5,0.395 -binance-futures,BTCUSDT,1582332608663000,1582332608788851,42382233,sell,9693.49,0.021 -binance-futures,BTCUSDT,1582332616680000,1582332616801057,42382234,buy,9693.5,0.1 -binance-futures,BTCUSDT,1582332616680000,1582332616801629,42382235,buy,9693.5,0.5 -binance-futures,BTCUSDT,1582332620787000,1582332620913346,42382236,buy,9693.5,0.243 -binance-futures,BTCUSDT,1582332620968000,1582332621089323,42382237,sell,9693.49,0.019 -binance-futures,BTCUSDT,1582332620968000,1582332621089338,42382238,sell,9693.49,0.459 -binance-futures,BTCUSDT,1582332621976000,1582332622103222,42382239,buy,9693.5,0.05 -binance-futures,BTCUSDT,1582332623194000,1582332623319795,42382240,sell,9693.49,0.221 -binance-futures,BTCUSDT,1582332623194000,1582332623319807,42382241,sell,9693,0.25 -binance-futures,BTCUSDT,1582332623194000,1582332623322895,42382242,sell,9693,0.044 -binance-futures,BTCUSDT,1582332623917000,1582332624093154,42382243,buy,9693.01,0.003 -binance-futures,BTCUSDT,1582332624355000,1582332624479725,42382244,sell,9693,0.002 -binance-futures,BTCUSDT,1582332625345000,1582332625469951,42382245,buy,9693.01,0.12 -binance-futures,BTCUSDT,1582332625635000,1582332625760733,42382246,sell,9693,0.002 -binance-futures,BTCUSDT,1582332631662000,1582332631785269,42382247,sell,9693,0.001 -binance-futures,BTCUSDT,1582332636971000,1582332637096910,42382248,sell,9693,0.1 -binance-futures,BTCUSDT,1582332639921000,1582332640051623,42382249,sell,9693,0.851 -binance-futures,BTCUSDT,1582332639939000,1582332640073474,42382250,sell,9692.45,0.04 -binance-futures,BTCUSDT,1582332639939000,1582332640074983,42382251,sell,9692.36,0.356 -binance-futures,BTCUSDT,1582332639954000,1582332640084248,42382252,sell,9692.36,0.267 -binance-futures,BTCUSDT,1582332639954000,1582332640084253,42382253,sell,9692.36,0.623 -binance-futures,BTCUSDT,1582332639954000,1582332640084917,42382254,sell,9692.36,0.623 -binance-futures,BTCUSDT,1582332639954000,1582332640085416,42382255,sell,9692.35,0.079 -binance-futures,BTCUSDT,1582332639969000,1582332640104549,42382256,sell,9692,0.1 -binance-futures,BTCUSDT,1582332640015000,1582332640147044,42382257,sell,9690.59,0.003 -binance-futures,BTCUSDT,1582332640016000,1582332640149923,42382258,sell,9690.54,0.167 -binance-futures,BTCUSDT,1582332640043000,1582332640177432,42382259,buy,9692.57,0.001 -binance-futures,BTCUSDT,1582332640043000,1582332640177441,42382260,buy,9692.57,0.099 -binance-futures,BTCUSDT,1582332640063000,1582332640196250,42382261,sell,9692.4,0.005 -binance-futures,BTCUSDT,1582332640119000,1582332640246720,42382262,sell,9690.55,0.442 -binance-futures,BTCUSDT,1582332640281000,1582332640429928,42382263,sell,9690.54,0.067 -binance-futures,BTCUSDT,1582332640425000,1582332640555345,42382264,sell,9690.54,0.028 -binance-futures,BTCUSDT,1582332642020000,1582332642149032,42382265,buy,9690.36,0.011 -binance-futures,BTCUSDT,1582332644658000,1582332644785738,42382266,sell,9690.2,0.047 -binance-futures,BTCUSDT,1582332644659000,1582332644788469,42382267,sell,9690.1,0.04 -binance-futures,BTCUSDT,1582332644659000,1582332644788476,42382268,sell,9690,0.001 -binance-futures,BTCUSDT,1582332644659000,1582332644791163,42382269,sell,9689.65,0.332 -binance-futures,BTCUSDT,1582332644659000,1582332644796821,42382270,sell,9689.57,0.012 -binance-futures,BTCUSDT,1582332644659000,1582332644798790,42382271,sell,9689.49,0.1 -binance-futures,BTCUSDT,1582332644659000,1582332644798805,42382272,sell,9689.4,0.047 -binance-futures,BTCUSDT,1582332644659000,1582332644800144,42382273,sell,9689.18,0.006 -binance-futures,BTCUSDT,1582332644659000,1582332644803458,42382274,sell,9689.13,0.015 -binance-futures,BTCUSDT,1582332645293000,1582332645423333,42382275,buy,9689.96,0.031 -binance-futures,BTCUSDT,1582332645293000,1582332645426296,42382276,buy,9689.97,0.031 -binance-futures,BTCUSDT,1582332645293000,1582332645427939,42382277,buy,9689.98,0.031 -binance-futures,BTCUSDT,1582332645293000,1582332645429605,42382278,buy,9690,0.04 -binance-futures,BTCUSDT,1582332646672000,1582332646803102,42382279,sell,9689.33,0.001 -binance-futures,BTCUSDT,1582332647049000,1582332647177797,42382280,buy,9689.61,0.01 -binance-futures,BTCUSDT,1582332647330000,1582332647466621,42382281,buy,9689.61,0.025 -binance-futures,BTCUSDT,1582332648114000,1582332648244519,42382282,buy,9689.61,0.04 -binance-futures,BTCUSDT,1582332648137000,1582332648268085,42382283,buy,9689.61,0.002 -binance-futures,BTCUSDT,1582332648357000,1582332648489925,42382284,buy,9690,0.65 -binance-futures,BTCUSDT,1582332648375000,1582332648516067,42382285,buy,9690,0.68 -binance-futures,BTCUSDT,1582332648425000,1582332648553388,42382286,buy,9690,0.63 -binance-futures,BTCUSDT,1582332648478000,1582332648608393,42382287,buy,9690.22,0.052 -binance-futures,BTCUSDT,1582332648648000,1582332648776321,42382288,buy,9690.58,0.68 -binance-futures,BTCUSDT,1582332648678000,1582332648807375,42382289,buy,9690.58,0.71 -binance-futures,BTCUSDT,1582332648680000,1582332648811919,42382290,buy,9690.58,0.01 -binance-futures,BTCUSDT,1582332648765000,1582332648894032,42382291,sell,9690.7,0.005 -binance-futures,BTCUSDT,1582332648901000,1582332649030686,42382292,buy,9690.88,0.01 -binance-futures,BTCUSDT,1582332649005000,1582332649133556,42382293,buy,9691.03,1.3 -binance-futures,BTCUSDT,1582332649145000,1582332649275999,42382294,buy,9691.18,1.48 -binance-futures,BTCUSDT,1582332649322000,1582332649450772,42382295,buy,9691.47,0.01 -binance-futures,BTCUSDT,1582332650345000,1582332650472966,42382296,buy,9691.57,0.1 -binance-futures,BTCUSDT,1582332650411000,1582332650547373,42382297,buy,9691.59,0.031 -binance-futures,BTCUSDT,1582332650411000,1582332650547382,42382298,buy,9691.6,0.031 -binance-futures,BTCUSDT,1582332650411000,1582332650548503,42382299,buy,9691.61,0.031 -binance-futures,BTCUSDT,1582332650411000,1582332650550743,42382300,buy,9691.64,0.007 -binance-futures,BTCUSDT,1582332652626000,1582332652753651,42382301,buy,9692.14,0.63 -binance-futures,BTCUSDT,1582332653451000,1582332653582233,42382302,buy,9692.42,0.042 -binance-futures,BTCUSDT,1582332653995000,1582332654125036,42382303,buy,9692.74,0.1 -binance-futures,BTCUSDT,1582332654267000,1582332654395941,42382304,buy,9692.74,0.1 -binance-futures,BTCUSDT,1582332654791000,1582332654920538,42382305,buy,9692.74,0.1 -binance-futures,BTCUSDT,1582332655288000,1582332655418282,42382306,buy,9692.99,0.1 -binance-futures,BTCUSDT,1582332655781000,1582332655907698,42382307,buy,9692.98,0.073 -binance-futures,BTCUSDT,1582332656571000,1582332656697156,42382308,buy,9692.98,0.031 -binance-futures,BTCUSDT,1582332656571000,1582332656697173,42382309,buy,9692.99,0.031 -binance-futures,BTCUSDT,1582332656571000,1582332656697179,42382310,buy,9693.1,0.005 -binance-futures,BTCUSDT,1582332656571000,1582332656701955,42382311,buy,9693.12,5.675 -binance-futures,BTCUSDT,1582332656571000,1582332656706352,42382312,buy,9693.5,0.1 -binance-futures,BTCUSDT,1582332656571000,1582332656713486,42382313,buy,9693.61,0.446 -binance-futures,BTCUSDT,1582332656571000,1582332656713501,42382314,buy,9694,0.502 -binance-futures,BTCUSDT,1582332656571000,1582332656713503,42382315,buy,9694.51,2.893 -binance-futures,BTCUSDT,1582332656571000,1582332656713510,42382316,buy,9695.55,0.047 -binance-futures,BTCUSDT,1582332656571000,1582332656998582,42382317,buy,9695.75,0.012 -binance-futures,BTCUSDT,1582332656571000,1582332656998623,42382318,buy,9695.78,0.068 -binance-futures,BTCUSDT,1582332656571000,1582332656998627,42382319,buy,9695.78,0.068 -binance-futures,BTCUSDT,1582332656571000,1582332656998636,42382320,buy,9695.79,0.04 -binance-futures,BTCUSDT,1582332656571000,1582332656998646,42382321,buy,9696.01,0.047 -binance-futures,BTCUSDT,1582332656571000,1582332656998656,42382322,buy,9696.24,0.041 -binance-futures,BTCUSDT,1582332656571000,1582332656998689,42382323,buy,9696.5,5.634 -binance-futures,BTCUSDT,1582332656571000,1582332656998701,42382324,buy,9696.57,0.1 -binance-futures,BTCUSDT,1582332656571000,1582332656998724,42382325,buy,9696.82,0.041 -binance-futures,BTCUSDT,1582332656571000,1582332656998729,42382326,buy,9697,0.4 -binance-futures,BTCUSDT,1582332656571000,1582332656998744,42382327,buy,9697.11,0.15 -binance-futures,BTCUSDT,1582332656571000,1582332656998755,42382328,buy,9697.25,0.5 -binance-futures,BTCUSDT,1582332656571000,1582332656998765,42382329,buy,9697.29,1.512 -binance-futures,BTCUSDT,1582332656571000,1582332656998780,42382330,buy,9697.31,0.02 -binance-futures,BTCUSDT,1582332656571000,1582332656998791,42382331,buy,9697.41,0.16 -binance-futures,BTCUSDT,1582332656571000,1582332656998795,42382332,buy,9697.41,0.12 -binance-futures,BTCUSDT,1582332656571000,1582332656998803,42382333,buy,9697.44,1.357 -binance-futures,BTCUSDT,1582332657318000,1582332657450339,42382334,sell,9693.32,0.586 -binance-futures,BTCUSDT,1582332660971000,1582332661101516,42382335,buy,9694.72,0.1 -binance-futures,BTCUSDT,1582332662661000,1582332662793749,42382336,buy,9695.61,0.897 -binance-futures,BTCUSDT,1582332662706000,1582332662834970,42382337,buy,9695.61,0.75 -binance-futures,BTCUSDT,1582332662749000,1582332662877302,42382338,buy,9695.61,0.45 -binance-futures,BTCUSDT,1582332662749000,1582332662877310,42382339,buy,9695.61,0.05 -binance-futures,BTCUSDT,1582332662753000,1582332662883838,42382340,buy,9695.61,0.1 -binance-futures,BTCUSDT,1582332662755000,1582332662884252,42382341,buy,9695.61,0.95 -binance-futures,BTCUSDT,1582332662757000,1582332662888571,42382342,buy,9695.61,0.529 -binance-futures,BTCUSDT,1582332662807000,1582332662937484,42382343,buy,9696.3,0.002 -binance-futures,BTCUSDT,1582332664061000,1582332664195192,42382344,buy,9698.34,1.1 -binance-futures,BTCUSDT,1582332666749000,1582332666878549,42382345,sell,9698.49,0.013 -binance-futures,BTCUSDT,1582332675116000,1582332675243123,42382346,sell,9698.49,0.029 -binance-futures,BTCUSDT,1582332675654000,1582332675787159,42382347,buy,9698.5,0.1 -binance-futures,BTCUSDT,1582332675654000,1582332675787170,42382348,buy,9698.5,0.077 -binance-futures,BTCUSDT,1582332675654000,1582332675787173,42382349,buy,9698.5,0.659 -binance-futures,BTCUSDT,1582332680357000,1582332680484646,42382350,buy,9698.6,0.1 -binance-futures,BTCUSDT,1582332680357000,1582332680492610,42382351,buy,9698.7,0.005 -binance-futures,BTCUSDT,1582332680357000,1582332680492643,42382352,buy,9698.97,0.005 -binance-futures,BTCUSDT,1582332680733000,1582332680860482,42382353,buy,9698.96,0.031 -binance-futures,BTCUSDT,1582332680733000,1582332680860621,42382354,buy,9698.97,0.031 -binance-futures,BTCUSDT,1582332686749000,1582332686878506,42382355,buy,9699.01,0.001 -binance-futures,BTCUSDT,1582332694308000,1582332694435478,42382356,sell,9699,0.095 -binance-futures,BTCUSDT,1582332694308000,1582332694435488,42382357,sell,9698.97,0.031 -binance-futures,BTCUSDT,1582332694356000,1582332694484311,42382358,sell,9698.59,0.67 -binance-futures,BTCUSDT,1582332694358000,1582332694489663,42382359,sell,9698.59,0.01 -binance-futures,BTCUSDT,1582332694358000,1582332694489893,42382360,sell,9698.5,0.1 -binance-futures,BTCUSDT,1582332702545000,1582332702676062,42382361,buy,9697.7,0.005 -binance-futures,BTCUSDT,1582332702545000,1582332702676077,42382362,buy,9698.28,0.1 -binance-futures,BTCUSDT,1582332702545000,1582332702687895,42382363,buy,9698.32,0.495 -binance-futures,BTCUSDT,1582332706424000,1582332706550365,42382364,buy,9697.8,0.005 -binance-futures,BTCUSDT,1582332706424000,1582332706551168,42382365,buy,9697.81,0.077 -binance-futures,BTCUSDT,1582332706424000,1582332706556271,42382366,buy,9698.24,0.018 -binance-futures,BTCUSDT,1582332708479000,1582332708606396,42382367,sell,9697.69,0.557 -binance-futures,BTCUSDT,1582332724197000,1582332724327231,42382368,sell,9697.99,0.1 -binance-futures,BTCUSDT,1582332724349000,1582332724477200,42382369,sell,9697.9,0.897 -binance-futures,BTCUSDT,1582332726939000,1582332727066841,42382370,sell,9697.9,3.608 -binance-futures,BTCUSDT,1582332726939000,1582332727066853,42382371,sell,9697.69,0.22 -binance-futures,BTCUSDT,1582332727517000,1582332727645693,42382372,sell,9697.57,0.61 -binance-futures,BTCUSDT,1582332727517000,1582332727645707,42382373,sell,9697.57,4.603 -binance-futures,BTCUSDT,1582332727517000,1582332727646134,42382374,sell,9696.5,0.005 -binance-futures,BTCUSDT,1582332727517000,1582332727653838,42382375,sell,9696.26,0.1 -binance-futures,BTCUSDT,1582332727517000,1582332727659902,42382376,sell,9695.98,0.002 -binance-futures,BTCUSDT,1582332727517000,1582332727659912,42382377,sell,9695.97,0.865 -binance-futures,BTCUSDT,1582332727524000,1582332727661348,42382378,sell,9695.97,3.64 -binance-futures,BTCUSDT,1582332727527000,1582332727662530,42382379,sell,9695.97,0.093 -binance-futures,BTCUSDT,1582332727535000,1582332727666722,42382380,sell,9695.97,0.567 -binance-futures,BTCUSDT,1582332727535000,1582332727666737,42382381,sell,9694.31,0.052 -binance-futures,BTCUSDT,1582332727558000,1582332727687271,42382382,sell,9694.31,0.002 -binance-futures,BTCUSDT,1582332729450000,1582332729580204,42382383,buy,9693.75,0.001 -binance-futures,BTCUSDT,1582332729612000,1582332729754335,42382384,buy,9693.75,0.011 -binance-futures,BTCUSDT,1582332729612000,1582332729754353,42382385,buy,9693.75,0.555 -binance-futures,BTCUSDT,1582332736726000,1582332736854179,42382386,buy,9693.6,0.001 -binance-futures,BTCUSDT,1582332743819000,1582332743945073,42382387,sell,9693.59,0.001 -binance-futures,BTCUSDT,1582332746463000,1582332746596603,42382388,sell,9693.79,0.024 -binance-futures,BTCUSDT,1582332749816000,1582332749942775,42382389,sell,9693.78,0.021 -binance-futures,BTCUSDT,1582332755147000,1582332755271764,42382390,sell,9693.59,0.001 -binance-futures,BTCUSDT,1582332758382000,1582332758509072,42382391,buy,9693.6,0.082 -binance-futures,BTCUSDT,1582332760313000,1582332760440674,42382392,sell,9693.59,0.583 -binance-futures,BTCUSDT,1582332760313000,1582332760441002,42382393,sell,9692.88,0.44 -binance-futures,BTCUSDT,1582332760313000,1582332760447731,42382394,sell,9692.7,0.005 -binance-futures,BTCUSDT,1582332760313000,1582332760454232,42382395,sell,9692.66,0.439 -binance-futures,BTCUSDT,1582332761940000,1582332762068625,42382396,sell,9693.11,0.031 -binance-futures,BTCUSDT,1582332761940000,1582332762072506,42382397,sell,9693.11,0.093 -binance-futures,BTCUSDT,1582332765567000,1582332765695488,42382398,sell,9692.7,0.005 -binance-futures,BTCUSDT,1582332765567000,1582332765699947,42382399,sell,9692.65,0.681 -binance-futures,BTCUSDT,1582332766079000,1582332766213045,42382400,buy,9691.76,0.5 -binance-futures,BTCUSDT,1582332766223000,1582332766352179,42382401,sell,9691.46,0.236 -binance-futures,BTCUSDT,1582332767674000,1582332767802184,42382402,buy,9691.76,0.1 -binance-futures,BTCUSDT,1582332768067000,1582332768198182,42382403,sell,9691.75,0.005 -binance-futures,BTCUSDT,1582332769412000,1582332769538223,42382404,buy,9691.76,0.1 -binance-futures,BTCUSDT,1582332770787000,1582332770915887,42382405,buy,9691.76,1.5 -binance-futures,BTCUSDT,1582332774462000,1582332774586865,42382406,sell,9691.75,0.392 -binance-futures,BTCUSDT,1582332775745000,1582332775875146,42382407,sell,9691.75,0.001 -binance-futures,BTCUSDT,1582332777617000,1582332777743152,42382408,sell,9691.75,0.001 -binance-futures,BTCUSDT,1582332779288000,1582332779416332,42382409,sell,9691.75,5.135 -binance-futures,BTCUSDT,1582332779352000,1582332779481394,42382410,sell,9691.3,0.67 -binance-futures,BTCUSDT,1582332779361000,1582332779497270,42382411,sell,9691.57,0.68 -binance-futures,BTCUSDT,1582332779365000,1582332779505385,42382412,sell,9691.3,0.94 -binance-futures,BTCUSDT,1582332779390000,1582332779520366,42382413,sell,9691.3,0.01 -binance-futures,BTCUSDT,1582332779390000,1582332779520379,42382414,sell,9691.3,0.01 -binance-futures,BTCUSDT,1582332781336000,1582332781468539,42382415,buy,9691.34,0.02 -binance-futures,BTCUSDT,1582332792273000,1582332792423669,42382416,sell,9691.12,1 -binance-futures,BTCUSDT,1582332792677000,1582332792805237,42382417,sell,9690.9,0.173 -binance-futures,BTCUSDT,1582332792679000,1582332792810419,42382418,sell,9690.9,0.077 -binance-futures,BTCUSDT,1582332802969000,1582332803097258,42382419,sell,9690.65,0.031 -binance-futures,BTCUSDT,1582332802969000,1582332803097310,42382420,sell,9690.64,0.031 -binance-futures,BTCUSDT,1582332802969000,1582332803103664,42382421,sell,9690.63,0.031 -binance-futures,BTCUSDT,1582332802969000,1582332803103676,42382422,sell,9690.62,0.01 -binance-futures,BTCUSDT,1582332802975000,1582332803121906,42382423,sell,9690.62,0.021 -binance-futures,BTCUSDT,1582332802975000,1582332803121943,42382424,sell,9690.2,0.047 -binance-futures,BTCUSDT,1582332802975000,1582332803121949,42382425,sell,9690,0.015 -binance-futures,BTCUSDT,1582332802978000,1582332803121992,42382426,sell,9690,0.085 -binance-futures,BTCUSDT,1582332802978000,1582332803121996,42382427,sell,9690,0.017 -binance-futures,BTCUSDT,1582332802978000,1582332803122006,42382428,sell,9689.9,0.001 -binance-futures,BTCUSDT,1582332802978000,1582332803122015,42382429,buy,9690.66,0.418 -binance-futures,BTCUSDT,1582332804232000,1582332804356766,42382430,sell,9689.9,0.004 -binance-futures,BTCUSDT,1582332804232000,1582332804356852,42382431,sell,9689.57,0.012 -binance-futures,BTCUSDT,1582332804232000,1582332804358447,42382432,sell,9689.4,0.047 -binance-futures,BTCUSDT,1582332804232000,1582332804358459,42382433,sell,9689.13,0.025 -binance-futures,BTCUSDT,1582332804232000,1582332804360720,42382434,sell,9689.13,0.575 -binance-futures,BTCUSDT,1582332808222000,1582332808363234,42382435,sell,9689.02,0.005 -binance-futures,BTCUSDT,1582332808483000,1582332808610369,42382436,sell,9689.02,0.227 -binance-futures,BTCUSDT,1582332811098000,1582332811225143,42382437,sell,9689.02,0.02 -binance-futures,BTCUSDT,1582332816628000,1582332816757955,42382438,sell,9689.02,0.005 -binance-futures,BTCUSDT,1582332823664000,1582332823790109,42382439,sell,9689.17,0.02 -binance-futures,BTCUSDT,1582332824392000,1582332824517343,42382440,buy,9689.21,0.031 -binance-futures,BTCUSDT,1582332824617000,1582332824744344,42382441,buy,9689.17,0.003 -binance-futures,BTCUSDT,1582332828690000,1582332828814982,42382442,buy,9689.05,0.031 -binance-futures,BTCUSDT,1582332828690000,1582332828816065,42382443,buy,9689.06,0.031 -binance-futures,BTCUSDT,1582332828690000,1582332828818727,42382444,buy,9689.07,0.031 -binance-futures,BTCUSDT,1582332828690000,1582332828820331,42382445,buy,9689.08,0.02 -binance-futures,BTCUSDT,1582332835549000,1582332835679770,42382446,sell,9689.09,0.031 -binance-futures,BTCUSDT,1582332835549000,1582332835679779,42382447,sell,9689.09,0.013 -binance-futures,BTCUSDT,1582332838385000,1582332838514626,42382448,sell,9689.09,0.657 -binance-futures,BTCUSDT,1582332838385000,1582332838514635,42382449,sell,9689.09,0.343 -binance-futures,BTCUSDT,1582332840280000,1582332840414506,42382450,buy,9689.2,0.001 -binance-futures,BTCUSDT,1582332840984000,1582332841115783,42382451,buy,9689.2,0.005 -binance-futures,BTCUSDT,1582332841461000,1582332841592648,42382452,sell,9689.19,0.082 -binance-futures,BTCUSDT,1582332841461000,1582332841592656,42382453,sell,9689.19,6 -binance-futures,BTCUSDT,1582332841461000,1582332841592670,42382454,sell,9689.19,0.233 -binance-futures,BTCUSDT,1582332845651000,1582332845776228,42382455,buy,9689.09,0.4 -binance-futures,BTCUSDT,1582332846822000,1582332846947813,42382456,buy,9689.09,0.5 -binance-futures,BTCUSDT,1582332847836000,1582332847962009,42382457,sell,9689.08,0.021 -binance-futures,BTCUSDT,1582332851074000,1582332851201796,42382458,buy,9689.09,0.093 -binance-futures,BTCUSDT,1582332851074000,1582332851207403,42382459,buy,9689.09,0.007 -binance-futures,BTCUSDT,1582332852756000,1582332852884467,42382460,buy,9689.09,0.045 -binance-futures,BTCUSDT,1582332852756000,1582332852886144,42382461,buy,9689.2,1.455 -binance-futures,BTCUSDT,1582332853667000,1582332853796888,42382462,buy,9689.2,0.103 -binance-futures,BTCUSDT,1582332853721000,1582332853848228,42382463,buy,9689.2,0.67 -binance-futures,BTCUSDT,1582332853722000,1582332853852505,42382464,buy,9689.2,0.567 -binance-futures,BTCUSDT,1582332853722000,1582332853852821,42382465,buy,9689.2,0.005 -binance-futures,BTCUSDT,1582332854593000,1582332854721911,42382466,buy,9690,0.012 -binance-futures,BTCUSDT,1582332858133000,1582332858263673,42382467,buy,9691.14,0.002 -binance-futures,BTCUSDT,1582332858170000,1582332858301282,42382468,buy,9691.14,0.669 -binance-futures,BTCUSDT,1582332858256000,1582332858383722,42382469,buy,9691.14,0.334 -binance-futures,BTCUSDT,1582332861617000,1582332861748701,42382470,buy,9691.4,0.003 -binance-futures,BTCUSDT,1582332865192000,1582332865319665,42382471,buy,9691.5,0.005 -binance-futures,BTCUSDT,1582332865192000,1582332865319674,42382472,buy,9691.6,0.305 -binance-futures,BTCUSDT,1582332865202000,1582332865341789,42382473,buy,9691.6,0.1 -binance-futures,BTCUSDT,1582332865228000,1582332865363678,42382474,buy,9691.6,0.3 -binance-futures,BTCUSDT,1582332865261000,1582332865394425,42382475,buy,9691.6,0.82 -binance-futures,BTCUSDT,1582332865285000,1582332865415949,42382476,buy,9691.6,0.897 -binance-futures,BTCUSDT,1582332865321000,1582332865451087,42382477,buy,9691.6,0.01 -binance-futures,BTCUSDT,1582332865837000,1582332865968760,42382478,buy,9691.72,0.003 -binance-futures,BTCUSDT,1582332876207000,1582332876336807,42382479,sell,9691.59,1 -binance-futures,BTCUSDT,1582332877919000,1582332878048773,42382480,buy,9691.75,0.021 -binance-futures,BTCUSDT,1582332880494000,1582332880624759,42382481,sell,9691.59,0.01 -binance-futures,BTCUSDT,1582332881052000,1582332881179882,42382482,buy,9691.65,0.016 -binance-futures,BTCUSDT,1582332886392000,1582332886512752,42382483,buy,9691.75,0.043 -binance-futures,BTCUSDT,1582332887614000,1582332887741203,42382484,buy,9691.75,0.001 -binance-futures,BTCUSDT,1582332888952000,1582332889081038,42382485,buy,9691.75,0.003 -binance-futures,BTCUSDT,1582332889519000,1582332889645934,42382486,sell,9691.74,2.604 -binance-futures,BTCUSDT,1582332892148000,1582332892276237,42382487,buy,9691.75,0.512 -binance-futures,BTCUSDT,1582332892164000,1582332892293003,42382488,buy,9691.75,0.02 -binance-futures,BTCUSDT,1582332898495000,1582332898622816,42382489,buy,9691.75,0.003 -binance-futures,BTCUSDT,1582332898570000,1582332898695315,42382490,buy,9691.75,0.192 -binance-futures,BTCUSDT,1582332899578000,1582332899708287,42382491,buy,9691.75,1.252 -binance-futures,BTCUSDT,1582332899578000,1582332899708518,42382492,buy,9691.76,0.1 -binance-futures,BTCUSDT,1582332899578000,1582332899713515,42382493,buy,9691.92,3.803 -binance-futures,BTCUSDT,1582332905775000,1582332905910069,42382494,buy,9692,0.2 -binance-futures,BTCUSDT,1582332908080000,1582332908215729,42382495,sell,9692.29,0.67 -binance-futures,BTCUSDT,1582332908160000,1582332908290895,42382496,sell,9692.29,0.67 -binance-futures,BTCUSDT,1582332908186000,1582332908316875,42382497,sell,9692.29,0.68 -binance-futures,BTCUSDT,1582332908196000,1582332908325129,42382498,sell,9692.29,0.83 -binance-futures,BTCUSDT,1582332908196000,1582332908326993,42382499,sell,9692.29,0.74 -binance-futures,BTCUSDT,1582332909000000,1582332909132901,42382500,sell,9691.8,0.005 -binance-futures,BTCUSDT,1582332909000000,1582332909136502,42382501,sell,9691.74,0.005 -binance-futures,BTCUSDT,1582332909008000,1582332909144751,42382502,sell,9691.74,0.68 -binance-futures,BTCUSDT,1582332909020000,1582332909149580,42382503,sell,9691.74,0.74 -binance-futures,BTCUSDT,1582332909052000,1582332909181833,42382504,sell,9691.74,0.01 -binance-futures,BTCUSDT,1582332909065000,1582332909195447,42382505,sell,9691.74,0.01 -binance-futures,BTCUSDT,1582332910475000,1582332910609053,42382506,buy,9692.05,0.007 -binance-futures,BTCUSDT,1582332910999000,1582332911129250,42382507,buy,9691.84,0.031 -binance-futures,BTCUSDT,1582332911000000,1582332911129257,42382508,buy,9691.85,0.031 -binance-futures,BTCUSDT,1582332911000000,1582332911135769,42382509,buy,9691.86,0.008 -binance-futures,BTCUSDT,1582332914232000,1582332914365446,42382510,buy,9691.75,0.031 -binance-futures,BTCUSDT,1582332914232000,1582332914365452,42382511,buy,9691.75,0.469 -binance-futures,BTCUSDT,1582332914232000,1582332914365456,42382512,buy,9691.75,0.1 -binance-futures,BTCUSDT,1582332914232000,1582332914365458,42382513,buy,9691.76,0.004 -binance-futures,BTCUSDT,1582332914232000,1582332914373309,42382514,buy,9691.77,0.031 -binance-futures,BTCUSDT,1582332914232000,1582332914373314,42382515,buy,9691.89,0.272 -binance-futures,BTCUSDT,1582332914232000,1582332914377957,42382516,buy,9691.9,0.077 -binance-futures,BTCUSDT,1582332914232000,1582332914381527,42382517,buy,9691.9,0.052 -binance-futures,BTCUSDT,1582332914232000,1582332914381545,42382518,buy,9692.1,0.005 -binance-futures,BTCUSDT,1582332914232000,1582332914381766,42382519,buy,9692.29,0.521 -binance-futures,BTCUSDT,1582332914232000,1582332914381771,42382520,buy,9692.29,0.043 -binance-futures,BTCUSDT,1582332918233000,1582332918366272,42382521,sell,9691.75,0.201 -binance-futures,BTCUSDT,1582332919830000,1582332919958741,42382522,buy,9692.19,2.72 -binance-futures,BTCUSDT,1582332919830000,1582332919958758,42382523,buy,9692.22,0.1 -binance-futures,BTCUSDT,1582332919830000,1582332919971786,42382524,buy,9692.99,0.454 -binance-futures,BTCUSDT,1582332919830000,1582332919973173,42382525,buy,9693.15,0.439 -binance-futures,BTCUSDT,1582332919830000,1582332919973184,42382526,buy,9693.15,0.419 -binance-futures,BTCUSDT,1582332919830000,1582332919973190,42382527,buy,9693.15,0.419 -binance-futures,BTCUSDT,1582332919830000,1582332919973196,42382528,buy,9693.15,0.085 -binance-futures,BTCUSDT,1582332919830000,1582332919973202,42382529,buy,9693.24,0.522 -binance-futures,BTCUSDT,1582332925369000,1582332925503701,42382530,sell,9692.27,0.031 -binance-futures,BTCUSDT,1582332925369000,1582332925503709,42382531,sell,9692.26,0.031 -binance-futures,BTCUSDT,1582332925369000,1582332925507554,42382532,sell,9692.25,0.03 -binance-futures,BTCUSDT,1582332925371000,1582332925511834,42382533,sell,9692.25,0.001 -binance-futures,BTCUSDT,1582332925371000,1582332925511947,42382534,sell,9692.24,0.031 -binance-futures,BTCUSDT,1582332925437000,1582332925573051,42382535,sell,9691.75,0.093 -binance-futures,BTCUSDT,1582332925455000,1582332925580784,42382536,sell,9691.75,0.385 -binance-futures,BTCUSDT,1582332925455000,1582332925580859,42382537,sell,9691.74,0.187 -binance-futures,BTCUSDT,1582332925468000,1582332925597284,42382538,sell,9691.74,0.015 -binance-futures,BTCUSDT,1582332925490000,1582332925618384,42382539,sell,9691.74,0.051 -binance-futures,BTCUSDT,1582332925504000,1582332925632705,42382540,sell,9691.74,0.415 -binance-futures,BTCUSDT,1582332927350000,1582332927479153,42382541,buy,9691.75,0.031 -binance-futures,BTCUSDT,1582332927350000,1582332927481528,42382542,buy,9691.75,0.046 -binance-futures,BTCUSDT,1582332928660000,1582332928786010,42382543,sell,9691.74,1.001 -binance-futures,BTCUSDT,1582332928660000,1582332928786284,42382544,sell,9691.72,0.001 -binance-futures,BTCUSDT,1582332928660000,1582332928794844,42382545,sell,9691.6,0.005 -binance-futures,BTCUSDT,1582332928660000,1582332928796921,42382546,sell,9691,0.2 -binance-futures,BTCUSDT,1582332928660000,1582332928796939,42382547,sell,9691,0.001 -binance-futures,BTCUSDT,1582332928660000,1582332928797948,42382548,sell,9690.68,0.292 -binance-futures,BTCUSDT,1582332939428000,1582332939574732,42382549,sell,9690.68,0.388 -binance-futures,BTCUSDT,1582332939428000,1582332939574953,42382550,sell,9690.68,0.509 -binance-futures,BTCUSDT,1582332939543000,1582332939672980,42382551,sell,9690.68,0.1 -binance-futures,BTCUSDT,1582332939579000,1582332939710769,42382552,sell,9690.68,0.391 -binance-futures,BTCUSDT,1582332939617000,1582332939747599,42382553,sell,9690.5,0.005 -binance-futures,BTCUSDT,1582332939651000,1582332939786850,42382554,sell,9690,0.114 -binance-futures,BTCUSDT,1582332939728000,1582332939857803,42382555,sell,9689.09,0.2 -binance-futures,BTCUSDT,1582332939728000,1582332939861809,42382556,sell,9689.02,0.161 -binance-futures,BTCUSDT,1582332940143000,1582332940278076,42382557,sell,9689.02,0.263 -binance-futures,BTCUSDT,1582332940143000,1582332940278086,42382558,sell,9689.02,0.11 -binance-futures,BTCUSDT,1582332940143000,1582332940280865,42382559,sell,9689,0.003 -binance-futures,BTCUSDT,1582332940143000,1582332940280874,42382560,sell,9689,0.003 -binance-futures,BTCUSDT,1582332940143000,1582332940280879,42382561,sell,9688,0.004 -binance-futures,BTCUSDT,1582332940143000,1582332940282241,42382562,sell,9688,0.004 -binance-futures,BTCUSDT,1582332940143000,1582332940282250,42382563,sell,9688,0.002 -binance-futures,BTCUSDT,1582332940143000,1582332940282254,42382564,sell,9688,0.1 -binance-futures,BTCUSDT,1582332940143000,1582332940282258,42382565,sell,9688,0.13 -binance-futures,BTCUSDT,1582332940854000,1582332940985241,42382566,sell,9688,0.87 -binance-futures,BTCUSDT,1582332940854000,1582332940986026,42382567,sell,9688,0.001 -binance-futures,BTCUSDT,1582332940854000,1582332940987651,42382568,sell,9687.85,0.012 -binance-futures,BTCUSDT,1582332940854000,1582332940994329,42382569,sell,9687.66,0.006 -binance-futures,BTCUSDT,1582332940854000,1582332940995898,42382570,sell,9687.63,0.376 -binance-futures,BTCUSDT,1582332940854000,1582332940995906,42382571,sell,9687.39,4.778 -binance-futures,BTCUSDT,1582332941242000,1582332941406111,42382572,sell,9687.39,0.222 -binance-futures,BTCUSDT,1582332941242000,1582332941406277,42382573,sell,9687,0.04 -binance-futures,BTCUSDT,1582332941242000,1582332941407433,42382574,sell,9687,0.005 -binance-futures,BTCUSDT,1582332941242000,1582332941407440,42382575,sell,9687,0.001 -binance-futures,BTCUSDT,1582332941242000,1582332941407448,42382576,sell,9687,0.01 -binance-futures,BTCUSDT,1582332941242000,1582332941407452,42382577,sell,9687,0.072 -binance-futures,BTCUSDT,1582332941662000,1582332941790102,42382578,buy,9687.58,0.031 -binance-futures,BTCUSDT,1582332941662000,1582332941795500,42382579,buy,9687.61,0.031 -binance-futures,BTCUSDT,1582332941662000,1582332941800464,42382580,buy,9687.62,0.013 -binance-futures,BTCUSDT,1582332947699000,1582332947826484,42382581,sell,9687.38,0.1 -binance-futures,BTCUSDT,1582332947699000,1582332947828140,42382582,sell,9687.28,0.241 -binance-futures,BTCUSDT,1582332947728000,1582332947852991,42382583,sell,9687.28,2.147 -binance-futures,BTCUSDT,1582332952766000,1582332952894984,42382584,sell,9687,0.053 -binance-futures,BTCUSDT,1582332952766000,1582332952895725,42382585,sell,9687,0.005 -binance-futures,BTCUSDT,1582332952766000,1582332952897910,42382586,sell,9686.84,1 -binance-futures,BTCUSDT,1582332952766000,1582332952904699,42382587,sell,9686.42,0.002 -binance-futures,BTCUSDT,1582332952766000,1582332952906871,42382588,sell,9686.4,0.437 -binance-futures,BTCUSDT,1582332952766000,1582332952908776,42382589,sell,9686.39,0.04 -binance-futures,BTCUSDT,1582332952766000,1582332952908786,42382590,sell,9686.27,2.681 -binance-futures,BTCUSDT,1582332952766000,1582332952915467,42382591,sell,9686.16,0.006 -binance-futures,BTCUSDT,1582332952766000,1582332952915753,42382592,sell,9686,0.049 -binance-futures,BTCUSDT,1582332952766000,1582332953195182,42382593,sell,9685.75,0.008 -binance-futures,BTCUSDT,1582332952766000,1582332953195218,42382594,sell,9685.36,0.719 -binance-futures,BTCUSDT,1582332952766000,1582332953195221,42382595,sell,9685.36,0.1 -binance-futures,BTCUSDT,1582332952766000,1582332953195224,42382596,sell,9685.36,0.1 -binance-futures,BTCUSDT,1582332952766000,1582332953195228,42382597,sell,9685.36,0.1 -binance-futures,BTCUSDT,1582332952766000,1582332953195231,42382598,sell,9685.36,0.1 -binance-futures,BTCUSDT,1582332952766000,1582332953195234,42382599,sell,9685.36,0.969 -binance-futures,BTCUSDT,1582332952766000,1582332953195244,42382600,sell,9685,0.003 -binance-futures,BTCUSDT,1582332952766000,1582332953195247,42382601,sell,9685,0.023 -binance-futures,BTCUSDT,1582332952766000,1582332953195255,42382602,sell,9684.83,0.005 -binance-futures,BTCUSDT,1582332952766000,1582332953195264,42382603,sell,9684.7,0.1 -binance-futures,BTCUSDT,1582332952766000,1582332953195273,42382604,sell,9684.43,0.001 -binance-futures,BTCUSDT,1582332952766000,1582332953195281,42382605,sell,9684.39,0.047 -binance-futures,BTCUSDT,1582332952766000,1582332953195290,42382606,sell,9684.06,0.04 -binance-futures,BTCUSDT,1582332952766000,1582332953195293,42382607,sell,9683.95,0.16 -binance-futures,BTCUSDT,1582332952766000,1582332953195307,42382608,sell,9683.93,0.652 -binance-futures,BTCUSDT,1582332952766000,1582332953195310,42382609,sell,9683.93,0.86 -binance-futures,BTCUSDT,1582332952766000,1582332953195314,42382610,sell,9683.91,0.006 -binance-futures,BTCUSDT,1582332952766000,1582332953195327,42382611,sell,9683.76,0.006 -binance-futures,BTCUSDT,1582332952766000,1582332953195336,42382612,sell,9683.73,0.012 -binance-futures,BTCUSDT,1582332952766000,1582332953195342,42382613,sell,9683.56,0.047 -binance-futures,BTCUSDT,1582332952766000,1582332953195357,42382614,sell,9683.47,0.069 -binance-futures,BTCUSDT,1582332952766000,1582332953195360,42382615,sell,9683.47,0.25 -binance-futures,BTCUSDT,1582332952766000,1582332953195363,42382616,sell,9683.47,3 -binance-futures,BTCUSDT,1582332952766000,1582332953195366,42382617,sell,9683.47,1.061 -binance-futures,BTCUSDT,1582332953992000,1582332954119914,42382618,buy,9684.54,1 -binance-futures,BTCUSDT,1582332955358000,1582332955487289,42382619,buy,9684.54,0.05 -binance-futures,BTCUSDT,1582332955645000,1582332955772291,42382620,sell,9684.53,0.001 -binance-futures,BTCUSDT,1582332956214000,1582332956342435,42382621,sell,9684.53,0.099 -binance-futures,BTCUSDT,1582332956214000,1582332956345716,42382622,sell,9684.53,0.077 -binance-futures,BTCUSDT,1582332956663000,1582332956793321,42382623,buy,9684.54,0.354 -binance-futures,BTCUSDT,1582332958347000,1582332958475520,42382624,sell,9684.53,0.18 -binance-futures,BTCUSDT,1582332958635000,1582332958767527,42382625,buy,9684.54,0.596 -binance-futures,BTCUSDT,1582332958893000,1582332959027679,42382626,buy,9687.16,0.002 -binance-futures,BTCUSDT,1582332958893000,1582332959032616,42382627,buy,9687.17,0.002 -binance-futures,BTCUSDT,1582332959063000,1582332959193199,42382628,buy,9687.17,0.04 -binance-futures,BTCUSDT,1582332959223000,1582332959353520,42382629,buy,9687.17,0.058 -binance-futures,BTCUSDT,1582332959256000,1582332959402472,42382630,sell,9687.34,0.031 -binance-futures,BTCUSDT,1582332959256000,1582332959403049,42382631,sell,9687.34,0.337 -binance-futures,BTCUSDT,1582332959256000,1582332959403753,42382632,sell,9687.33,0.031 -binance-futures,BTCUSDT,1582332959256000,1582332959405121,42382633,sell,9687.32,0.031 -binance-futures,BTCUSDT,1582332959256000,1582332959405749,42382634,sell,9687.3,0.303 -binance-futures,BTCUSDT,1582332959425000,1582332959560463,42382635,sell,9687.49,0.105 -binance-futures,BTCUSDT,1582332959687000,1582332959819045,42382636,buy,9687.5,0.001 -binance-futures,BTCUSDT,1582332960067000,1582332960197302,42382637,sell,9687.49,0.575 -binance-futures,BTCUSDT,1582332960067000,1582332960198711,42382638,sell,9687.49,0.56 -binance-futures,BTCUSDT,1582332960067000,1582332960198720,42382639,sell,9687.49,0.68 -binance-futures,BTCUSDT,1582332960067000,1582332960198723,42382640,sell,9687.49,0.685 -binance-futures,BTCUSDT,1582332960438000,1582332960570240,42382641,buy,9687.51,0.005 -binance-futures,BTCUSDT,1582332961664000,1582332961795293,42382642,sell,9687.11,0.001 -binance-futures,BTCUSDT,1582332968687000,1582332968820545,42382643,sell,9687.24,0.03 -binance-futures,BTCUSDT,1582332968687000,1582332968820550,42382644,sell,9686.9,0.005 -binance-futures,BTCUSDT,1582332968687000,1582332968824878,42382645,sell,9686.89,0.079 -binance-futures,BTCUSDT,1582332968689000,1582332968827846,42382646,sell,9686.89,0.103 -binance-futures,BTCUSDT,1582332971779000,1582332971907780,42382647,buy,9687.1,0.003 -binance-futures,BTCUSDT,1582332972751000,1582332972880272,42382648,sell,9687.11,0.097 -binance-futures,BTCUSDT,1582332972751000,1582332972880472,42382649,sell,9686.43,0.002 -binance-futures,BTCUSDT,1582332972751000,1582332972883147,42382650,sell,9686.42,0.201 -binance-futures,BTCUSDT,1582332974046000,1582332974174111,42382651,sell,9686.91,0.031 -binance-futures,BTCUSDT,1582332974046000,1582332974176924,42382652,sell,9686.9,0.031 -binance-futures,BTCUSDT,1582332974046000,1582332974182390,42382653,sell,9686.9,0.031 -binance-futures,BTCUSDT,1582332974046000,1582332974184008,42382654,sell,9686.89,0.031 -binance-futures,BTCUSDT,1582332974046000,1582332974184834,42382655,sell,9686.88,0.031 -binance-futures,BTCUSDT,1582332974046000,1582332974185907,42382656,sell,9686.71,0.163 -binance-futures,BTCUSDT,1582332980343000,1582332980544222,42382657,buy,9687.23,0.031 -binance-futures,BTCUSDT,1582332980343000,1582332980544899,42382658,buy,9687.24,0.031 -binance-futures,BTCUSDT,1582332980343000,1582332980545313,42382659,buy,9687.25,0.031 -binance-futures,BTCUSDT,1582332980343000,1582332980545341,42382660,buy,9687.27,0.446 -binance-futures,BTCUSDT,1582332980343000,1582332980546120,42382661,buy,9687.46,0.052 -binance-futures,BTCUSDT,1582332980343000,1582332980546129,42382662,buy,9687.46,0.077 -binance-futures,BTCUSDT,1582332980343000,1582332980546147,42382663,buy,9687.5,0.005 -binance-futures,BTCUSDT,1582332980444000,1582332980609883,42382664,sell,9687.5,0.99 -binance-futures,BTCUSDT,1582332982017000,1582332982144665,42382665,sell,9687.73,0.031 -binance-futures,BTCUSDT,1582332982017000,1582332982150146,42382666,sell,9687.71,0.031 -binance-futures,BTCUSDT,1582332982017000,1582332982150156,42382667,sell,9687.7,0.031 -binance-futures,BTCUSDT,1582332982017000,1582332982154645,42382668,sell,9687.69,0.031 -binance-futures,BTCUSDT,1582332982017000,1582332982154668,42382669,sell,9687.5,0.06 -binance-futures,BTCUSDT,1582332994559000,1582332994693010,42382670,sell,9687.58,0.009 -binance-futures,BTCUSDT,1582332994612000,1582332994733188,42382671,sell,9687.58,0.022 -binance-futures,BTCUSDT,1582332994612000,1582332994733626,42382672,sell,9687.57,0.031 -binance-futures,BTCUSDT,1582332994612000,1582332994733638,42382673,sell,9687.54,0.031 -binance-futures,BTCUSDT,1582332994612000,1582332994739809,42382674,sell,9687.53,0.009 -binance-futures,BTCUSDT,1582332994621000,1582332994747473,42382675,sell,9687.53,0.022 -binance-futures,BTCUSDT,1582332994621000,1582332994751147,42382676,sell,9687.5,0.329 -binance-futures,BTCUSDT,1582332994641000,1582332994770792,42382677,sell,9687.5,0.299 -binance-futures,BTCUSDT,1582332995061000,1582332995189234,42382678,buy,9687.51,0.209 -binance-futures,BTCUSDT,1582332997625000,1582332997752454,42382679,sell,9687.5,0.01 -binance-futures,BTCUSDT,1582332997627000,1582332997762083,42382680,sell,9687.5,4.321 -binance-futures,BTCUSDT,1582332997627000,1582332997763076,42382681,sell,9687.5,0.25 -binance-futures,BTCUSDT,1582332997676000,1582332997808202,42382682,sell,9687.2,0.005 -binance-futures,BTCUSDT,1582332997785000,1582332997915199,42382683,sell,9686.72,0.68 -binance-futures,BTCUSDT,1582332997785000,1582332997915210,42382684,sell,9686.36,0.03 -binance-futures,BTCUSDT,1582332997868000,1582332998010811,42382685,sell,9685.76,0.03 -binance-futures,BTCUSDT,1582332997936000,1582332998069034,42382686,sell,9685.76,0.373 -binance-futures,BTCUSDT,1582332997936000,1582332998069047,42382687,sell,9685.76,0.528 -binance-futures,BTCUSDT,1582332997936000,1582332998069085,42382688,sell,9685.51,2.299 -binance-futures,BTCUSDT,1582332997942000,1582332998075171,42382689,sell,9685.51,0.619 -binance-futures,BTCUSDT,1582332998023000,1582332998154515,42382690,buy,9685.75,0.031 -binance-futures,BTCUSDT,1582332998023000,1582332998157195,42382691,buy,9685.75,0.132 -binance-futures,BTCUSDT,1582332998436000,1582332998571867,42382692,sell,9685.51,0.68 -binance-futures,BTCUSDT,1582332998438000,1582332998574644,42382693,sell,9685.54,0.379 -binance-futures,BTCUSDT,1582332998438000,1582332998579297,42382694,sell,9685.51,0.341 -binance-futures,BTCUSDT,1582332998451000,1582332998588282,42382695,sell,9685.51,0.66 -binance-futures,BTCUSDT,1582333001850000,1582333001978709,42382696,sell,9685.26,0.446 -binance-futures,BTCUSDT,1582333002263000,1582333002393875,42382697,sell,9685.26,0.005 -binance-futures,BTCUSDT,1582333002696000,1582333002829151,42382698,buy,9685.29,0.2 -binance-futures,BTCUSDT,1582333003279000,1582333003409301,42382699,sell,9685.28,0.152 -binance-futures,BTCUSDT,1582333004499000,1582333004627865,42382700,sell,9685.26,0.1 -binance-futures,BTCUSDT,1582333008754000,1582333008879381,42382701,sell,9685.26,0.449 -binance-futures,BTCUSDT,1582333008754000,1582333008887772,42382702,sell,9685.22,0.081 -binance-futures,BTCUSDT,1582333009067000,1582333009195820,42382703,buy,9685.23,0.031 -binance-futures,BTCUSDT,1582333009067000,1582333009201411,42382704,buy,9685.24,0.031 -binance-futures,BTCUSDT,1582333009067000,1582333009201421,42382705,buy,9685.25,0.031 -binance-futures,BTCUSDT,1582333009067000,1582333009204683,42382706,buy,9685.27,0.031 -binance-futures,BTCUSDT,1582333009067000,1582333009204693,42382707,buy,9685.27,0.076 -binance-futures,BTCUSDT,1582333009277000,1582333009406573,42382708,sell,9685.22,0.155 -binance-futures,BTCUSDT,1582333009277000,1582333009406705,42382709,sell,9685,0.6 -binance-futures,BTCUSDT,1582333009277000,1582333009412993,42382710,sell,9684.24,0.232 -binance-futures,BTCUSDT,1582333009277000,1582333009414965,42382711,sell,9684.21,0.013 -binance-futures,BTCUSDT,1582333011732000,1582333011861377,42382712,sell,9684.22,0.002 -binance-futures,BTCUSDT,1582333011732000,1582333011861686,42382713,sell,9684.22,0.001 -binance-futures,BTCUSDT,1582333011732000,1582333011862228,42382714,sell,9684.22,0.007 -binance-futures,BTCUSDT,1582333012164000,1582333012291132,42382715,buy,9684.77,0.002 -binance-futures,BTCUSDT,1582333013011000,1582333013140994,42382716,buy,9684.21,0.001 -binance-futures,BTCUSDT,1582333022951000,1582333023081737,42382717,sell,9684.2,0.048 -binance-futures,BTCUSDT,1582333022975000,1582333023107390,42382718,sell,9684,0.01 -binance-futures,BTCUSDT,1582333022976000,1582333023107400,42382719,sell,9684,0.001 -binance-futures,BTCUSDT,1582333023018000,1582333023147696,42382720,sell,9683.7,0.005 -binance-futures,BTCUSDT,1582333023018000,1582333023151966,42382721,sell,9683.53,0.095 -binance-futures,BTCUSDT,1582333023024000,1582333023153759,42382722,sell,9683.53,0.005 -binance-futures,BTCUSDT,1582333023049000,1582333023182504,42382723,sell,9683.37,0.48 -binance-futures,BTCUSDT,1582333023075000,1582333023204689,42382724,sell,9683.34,0.006 -binance-futures,BTCUSDT,1582333023101000,1582333023236060,42382725,sell,9683.33,0.02 -binance-futures,BTCUSDT,1582333023101000,1582333023236070,42382726,sell,9683.33,3.232 -binance-futures,BTCUSDT,1582333023101000,1582333023236076,42382727,sell,9683.33,1.931 -binance-futures,BTCUSDT,1582333023197000,1582333023328086,42382728,sell,9683.18,0.006 -binance-futures,BTCUSDT,1582333023318000,1582333023483356,42382729,sell,9683,0.088 -binance-futures,BTCUSDT,1582333023490000,1582333023617060,42382730,buy,9683.01,0.005 -binance-futures,BTCUSDT,1582333025162000,1582333025291592,42382731,sell,9683.01,0.163 -binance-futures,BTCUSDT,1582333027192000,1582333027324772,42382732,sell,9683.01,0.228 -binance-futures,BTCUSDT,1582333027192000,1582333027325018,42382733,sell,9683,0.912 -binance-futures,BTCUSDT,1582333027192000,1582333027328552,42382734,sell,9683,0.1 -binance-futures,BTCUSDT,1582333027192000,1582333027331220,42382735,sell,9682.69,0.04 -binance-futures,BTCUSDT,1582333027192000,1582333027333709,42382736,sell,9682.63,0.006 -binance-futures,BTCUSDT,1582333027192000,1582333027336356,42382737,sell,9682.5,0.005 -binance-futures,BTCUSDT,1582333027192000,1582333027336363,42382738,sell,9682.17,0.012 -binance-futures,BTCUSDT,1582333027192000,1582333027338614,42382739,sell,9682.14,0.012 -binance-futures,BTCUSDT,1582333027192000,1582333027340143,42382740,sell,9682.12,0.001 -binance-futures,BTCUSDT,1582333027192000,1582333027342622,42382741,sell,9682.1,0.12 -binance-futures,BTCUSDT,1582333027192000,1582333027344250,42382742,sell,9682.09,0.143 -binance-futures,BTCUSDT,1582333027192000,1582333027344828,42382743,sell,9682.05,0.012 -binance-futures,BTCUSDT,1582333027192000,1582333027344838,42382744,sell,9682,3 -binance-futures,BTCUSDT,1582333027192000,1582333027345024,42382745,sell,9682,0.002 -binance-futures,BTCUSDT,1582333027192000,1582333027345876,42382746,sell,9681.96,2.407 -binance-futures,BTCUSDT,1582333028598000,1582333028725266,42382747,sell,9681.92,0.04 -binance-futures,BTCUSDT,1582333028598000,1582333028727811,42382748,sell,9681.66,0.06 -binance-futures,BTCUSDT,1582333028727000,1582333028856705,42382749,sell,9681.66,0.038 -binance-futures,BTCUSDT,1582333029470000,1582333029596698,42382750,sell,9681.66,0.25 -binance-futures,BTCUSDT,1582333029491000,1582333029614410,42382751,sell,9681.66,0.024 -binance-futures,BTCUSDT,1582333032889000,1582333033015375,42382752,sell,9681.66,0.065 -binance-futures,BTCUSDT,1582333041104000,1582333041231504,42382753,buy,9681.8,0.001 -binance-futures,BTCUSDT,1582333042205000,1582333042334045,42382754,sell,9681.7,0.087 -binance-futures,BTCUSDT,1582333042205000,1582333042338103,42382755,sell,9681.69,0.051 -binance-futures,BTCUSDT,1582333042320000,1582333042449924,42382756,sell,9681.69,0.215 -binance-futures,BTCUSDT,1582333042320000,1582333042450166,42382757,sell,9681.69,0.535 -binance-futures,BTCUSDT,1582333044422000,1582333044550327,42382758,buy,9681.72,0.031 -binance-futures,BTCUSDT,1582333044422000,1582333044550330,42382759,buy,9681.73,0.031 -binance-futures,BTCUSDT,1582333044422000,1582333044556789,42382760,buy,9681.74,0.031 -binance-futures,BTCUSDT,1582333044422000,1582333044561687,42382761,buy,9681.75,0.031 -binance-futures,BTCUSDT,1582333044422000,1582333044561701,42382762,buy,9681.8,0.004 -binance-futures,BTCUSDT,1582333044422000,1582333044563780,42382763,buy,9682,0.072 -binance-futures,BTCUSDT,1582333046684000,1582333046811198,42382764,buy,9682.57,0.125 -binance-futures,BTCUSDT,1582333047383000,1582333047511210,42382765,buy,9681.95,0.031 -binance-futures,BTCUSDT,1582333047383000,1582333047511275,42382766,buy,9681.96,0.021 -binance-futures,BTCUSDT,1582333048004000,1582333048133209,42382767,buy,9682.3,5.381 -binance-futures,BTCUSDT,1582333048004000,1582333048133220,42382768,buy,9683.16,0.424 -binance-futures,BTCUSDT,1582333051412000,1582333051539918,42382769,buy,9681.89,0.031 -binance-futures,BTCUSDT,1582333051412000,1582333051543424,42382770,buy,9681.9,0.031 -binance-futures,BTCUSDT,1582333051412000,1582333051543434,42382771,buy,9681.91,0.031 -binance-futures,BTCUSDT,1582333051412000,1582333051547277,42382772,buy,9681.92,0.007 -binance-futures,BTCUSDT,1582333051510000,1582333051638795,42382773,buy,9682.26,0.02 -binance-futures,BTCUSDT,1582333053758000,1582333053890367,42382774,sell,9682.04,0.1 -binance-futures,BTCUSDT,1582333059129000,1582333059259365,42382775,buy,9681.75,0.1 -binance-futures,BTCUSDT,1582333059780000,1582333059911086,42382776,sell,9681.74,0.414 -binance-futures,BTCUSDT,1582333059780000,1582333059911094,42382777,sell,9681.69,0.145 -binance-futures,BTCUSDT,1582333059780000,1582333059915358,42382778,sell,9681.66,0.423 -binance-futures,BTCUSDT,1582333059780000,1582333059917797,42382779,sell,9681.66,0.5 -binance-futures,BTCUSDT,1582333059780000,1582333059922369,42382780,sell,9681.38,0.04 -binance-futures,BTCUSDT,1582333059780000,1582333059922373,42382781,sell,9681.3,0.051 -binance-futures,BTCUSDT,1582333059780000,1582333059926205,42382782,sell,9681.01,0.04 -binance-futures,BTCUSDT,1582333059780000,1582333059928059,42382783,sell,9681,0.001 -binance-futures,BTCUSDT,1582333059780000,1582333059931241,42382784,sell,9680.65,0.396 -binance-futures,BTCUSDT,1582333059780000,1582333059931248,42382785,sell,9680.65,0.396 -binance-futures,BTCUSDT,1582333059780000,1582333059932923,42382786,sell,9680.64,0.006 -binance-futures,BTCUSDT,1582333059780000,1582333059934159,42382787,sell,9680.61,0.006 -binance-futures,BTCUSDT,1582333059780000,1582333059934940,42382788,sell,9680.59,0.1 -binance-futures,BTCUSDT,1582333059780000,1582333059935775,42382789,sell,9680.41,0.1 -binance-futures,BTCUSDT,1582333059780000,1582333059936630,42382790,sell,9680.28,0.053 -binance-futures,BTCUSDT,1582333059780000,1582333059936637,42382791,sell,9680.26,0.522 -binance-futures,BTCUSDT,1582333059780000,1582333059937643,42382792,sell,9680,0.087 -binance-futures,BTCUSDT,1582333059780000,1582333059938146,42382793,sell,9680,0.01 -binance-futures,BTCUSDT,1582333059780000,1582333059938151,42382794,sell,9680,0.027 -binance-futures,BTCUSDT,1582333059780000,1582333059938155,42382795,sell,9680,0.006 -binance-futures,BTCUSDT,1582333059780000,1582333059938406,42382796,sell,9680,0.012 -binance-futures,BTCUSDT,1582333059781000,1582333059938415,42382797,sell,9680,0.037 -binance-futures,BTCUSDT,1582333059781000,1582333059938419,42382798,sell,9680,0.01 -binance-futures,BTCUSDT,1582333059781000,1582333059938965,42382799,sell,9679.68,0.001 -binance-futures,BTCUSDT,1582333059781000,1582333059938974,42382800,sell,9679.65,2.15 -binance-futures,BTCUSDT,1582333059781000,1582333059939559,42382801,sell,9679.65,0.25 -binance-futures,BTCUSDT,1582333059781000,1582333059939584,42382802,sell,9679.65,1 -binance-futures,BTCUSDT,1582333060543000,1582333060671398,42382803,sell,9680.73,0.031 -binance-futures,BTCUSDT,1582333060543000,1582333060671959,42382804,sell,9680.72,0.008 -binance-futures,BTCUSDT,1582333063471000,1582333063599480,42382805,sell,9680.51,0.1 -binance-futures,BTCUSDT,1582333063471000,1582333063608618,42382806,sell,9679.63,0.006 -binance-futures,BTCUSDT,1582333063471000,1582333063611835,42382807,sell,9679.55,0.397 -binance-futures,BTCUSDT,1582333063471000,1582333063611840,42382808,sell,9679.55,0.396 -binance-futures,BTCUSDT,1582333063471000,1582333063611845,42382809,sell,9679.55,0.397 -binance-futures,BTCUSDT,1582333063471000,1582333063611849,42382810,sell,9679.55,0.397 -binance-futures,BTCUSDT,1582333063471000,1582333063613220,42382811,sell,9679.54,0.006 -binance-futures,BTCUSDT,1582333063471000,1582333063613230,42382812,sell,9679.54,0.004 -binance-futures,BTCUSDT,1582333063471000,1582333063613235,42382813,sell,9679.48,0.392 -binance-futures,BTCUSDT,1582333065324000,1582333065450985,42382814,buy,9680,0.005 -binance-futures,BTCUSDT,1582333065324000,1582333065454316,42382815,buy,9680.59,0.01 -binance-futures,BTCUSDT,1582333066085000,1582333066215927,42382816,buy,9680.88,0.002 -binance-futures,BTCUSDT,1582333066361000,1582333066493195,42382817,buy,9681.3,0.56 -binance-futures,BTCUSDT,1582333066667000,1582333066797261,42382818,sell,9680.13,0.014 -binance-futures,BTCUSDT,1582333067484000,1582333067614170,42382819,buy,9680.66,0.824 -binance-futures,BTCUSDT,1582333067662000,1582333067790158,42382820,buy,9680.65,0.194 -binance-futures,BTCUSDT,1582333067915000,1582333068044863,42382821,sell,9680.54,0.031 -binance-futures,BTCUSDT,1582333067915000,1582333068044874,42382822,sell,9680.54,2.2 -binance-futures,BTCUSDT,1582333067915000,1582333068045300,42382823,sell,9680.53,0.031 -binance-futures,BTCUSDT,1582333067915000,1582333068047379,42382824,sell,9680.52,0.031 -binance-futures,BTCUSDT,1582333067915000,1582333068049819,42382825,sell,9680.52,0.707 -binance-futures,BTCUSDT,1582333071203000,1582333071334933,42382826,buy,9680.51,0.039 -binance-futures,BTCUSDT,1582333071607000,1582333071735989,42382827,sell,9680.5,0.002 -binance-futures,BTCUSDT,1582333074455000,1582333074585039,42382828,sell,9680.57,0.002 -binance-futures,BTCUSDT,1582333075003000,1582333075128361,42382829,sell,9680.57,0.029 -binance-futures,BTCUSDT,1582333075003000,1582333075128513,42382830,sell,9680.57,0.115 -binance-futures,BTCUSDT,1582333076082000,1582333076211199,42382831,buy,9680.59,0.1 -binance-futures,BTCUSDT,1582333078388000,1582333078515849,42382832,buy,9680.51,0.031 -binance-futures,BTCUSDT,1582333078388000,1582333078516666,42382833,buy,9680.52,0.029 -binance-futures,BTCUSDT,1582333080156000,1582333080285648,42382834,sell,9680.5,0.015 -binance-futures,BTCUSDT,1582333080499000,1582333080662504,42382835,buy,9680.51,0.005 -binance-futures,BTCUSDT,1582333083607000,1582333083735919,42382836,buy,9680.53,0.031 -binance-futures,BTCUSDT,1582333083607000,1582333083736137,42382837,buy,9680.54,0.019 -binance-futures,BTCUSDT,1582333084956000,1582333085081028,42382838,buy,9680.51,0.02 -binance-futures,BTCUSDT,1582333084956000,1582333085081188,42382839,buy,9680.51,0.115 -binance-futures,BTCUSDT,1582333088215000,1582333088369457,42382840,buy,9680.6,0.005 -binance-futures,BTCUSDT,1582333088215000,1582333088369770,42382841,buy,9680.66,0.995 -binance-futures,BTCUSDT,1582333089876000,1582333090002861,42382842,buy,9680.66,0.1 -binance-futures,BTCUSDT,1582333089922000,1582333090048085,42382843,sell,9680.65,0.017 -binance-futures,BTCUSDT,1582333090743000,1582333090871223,42382844,buy,9680.94,0.469 -binance-futures,BTCUSDT,1582333090743000,1582333090871638,42382845,buy,9680.96,0.087 -binance-futures,BTCUSDT,1582333094205000,1582333094334899,42382846,sell,9680.95,0.073 -binance-futures,BTCUSDT,1582333095363000,1582333095495371,42382847,sell,9680.8,0.031 -binance-futures,BTCUSDT,1582333095363000,1582333095495380,42382848,sell,9680.79,0.031 -binance-futures,BTCUSDT,1582333095363000,1582333095497272,42382849,sell,9680.78,0.031 -binance-futures,BTCUSDT,1582333095363000,1582333095499476,42382850,sell,9680.77,0.007 -binance-futures,BTCUSDT,1582333096719000,1582333096845846,42382851,sell,9680.8,0.031 -binance-futures,BTCUSDT,1582333096719000,1582333096845856,42382852,sell,9680.79,0.031 -binance-futures,BTCUSDT,1582333096719000,1582333096851752,42382853,sell,9680.78,0.031 -binance-futures,BTCUSDT,1582333096719000,1582333096851760,42382854,sell,9680.77,0.024 -binance-futures,BTCUSDT,1582333096719000,1582333096854734,42382855,sell,9680.51,0.103 -binance-futures,BTCUSDT,1582333097548000,1582333097675215,42382856,buy,9680.82,0.341 -binance-futures,BTCUSDT,1582333098688000,1582333098818029,42382857,buy,9680.82,0.001 -binance-futures,BTCUSDT,1582333099712000,1582333099841729,42382858,buy,9680.9,0.005 -binance-futures,BTCUSDT,1582333099712000,1582333099843976,42382859,buy,9681.17,0.007 -binance-futures,BTCUSDT,1582333100006000,1582333100132210,42382860,buy,9681.17,0.011 -binance-futures,BTCUSDT,1582333100757000,1582333100888126,42382861,buy,9681,0.001 -binance-futures,BTCUSDT,1582333100846000,1582333100974024,42382862,buy,9680.84,0.001 -binance-futures,BTCUSDT,1582333101009000,1582333101138556,42382863,buy,9680.88,2.703 -binance-futures,BTCUSDT,1582333101112000,1582333101243226,42382864,buy,9681.17,0.05 -binance-futures,BTCUSDT,1582333101117000,1582333101249247,42382865,buy,9681.17,0.15 -binance-futures,BTCUSDT,1582333101121000,1582333101252022,42382866,buy,9681.17,4.792 -binance-futures,BTCUSDT,1582333101152000,1582333101287417,42382867,buy,9681.23,0.1 -binance-futures,BTCUSDT,1582333101205000,1582333101339751,42382868,buy,9681.28,0.1 -binance-futures,BTCUSDT,1582333101242000,1582333101384204,42382869,buy,9681.28,3.75 -binance-futures,BTCUSDT,1582333101268000,1582333101401640,42382870,buy,9681.28,1.987 -binance-futures,BTCUSDT,1582333101708000,1582333101838181,42382871,buy,9681.9,0.003 -binance-futures,BTCUSDT,1582333101806000,1582333101934853,42382872,buy,9681.9,0.78 -binance-futures,BTCUSDT,1582333102141000,1582333102270037,42382873,buy,9681.9,0.001 -binance-futures,BTCUSDT,1582333102182000,1582333102314006,42382874,buy,9681.9,0.46 -binance-futures,BTCUSDT,1582333102549000,1582333102679602,42382875,buy,9682.04,0.001 -binance-futures,BTCUSDT,1582333103190000,1582333103344363,42382876,buy,9682.04,0.001 -binance-futures,BTCUSDT,1582333103784000,1582333103914498,42382877,sell,9682.03,0.74 -binance-futures,BTCUSDT,1582333103784000,1582333103914701,42382878,sell,9682.03,0.26 -binance-futures,BTCUSDT,1582333104178000,1582333104310309,42382879,sell,9682.17,0.005 -binance-futures,BTCUSDT,1582333106920000,1582333107052975,42382880,buy,9682.2,0.017 -binance-futures,BTCUSDT,1582333106920000,1582333107056262,42382881,buy,9682.2,0.086 -binance-futures,BTCUSDT,1582333108879000,1582333109004137,42382882,buy,9682.1,2.1 -binance-futures,BTCUSDT,1582333108879000,1582333109006219,42382883,buy,9682.1,0.485 -binance-futures,BTCUSDT,1582333112242000,1582333112370986,42382884,sell,9681.55,0.1 -binance-futures,BTCUSDT,1582333112242000,1582333112376258,42382885,sell,9681,0.1 -binance-futures,BTCUSDT,1582333112242000,1582333112383486,42382886,sell,9680.81,0.682 -binance-futures,BTCUSDT,1582333114596000,1582333114722739,42382887,buy,9680.81,0.237 -binance-futures,BTCUSDT,1582333122490000,1582333122616552,42382888,buy,9680.81,0.1 -binance-futures,BTCUSDT,1582333123709000,1582333123837781,42382889,sell,9680.8,0.002 -binance-futures,BTCUSDT,1582333129646000,1582333129773307,42382890,sell,9680.8,0.01 -binance-futures,BTCUSDT,1582333137056000,1582333137183227,42382891,sell,9680.99,4.754 -binance-futures,BTCUSDT,1582333137056000,1582333137184040,42382892,sell,9680.99,0.1 -binance-futures,BTCUSDT,1582333137056000,1582333137184054,42382893,sell,9680.99,0.72 -binance-futures,BTCUSDT,1582333137056000,1582333137184294,42382894,sell,9680.99,0.53 -binance-futures,BTCUSDT,1582333137056000,1582333137184302,42382895,sell,9680.99,0.41 -binance-futures,BTCUSDT,1582333137056000,1582333137184600,42382896,sell,9680.6,0.005 -binance-futures,BTCUSDT,1582333137056000,1582333137188344,42382897,sell,9680.34,0.301 -binance-futures,BTCUSDT,1582333137056000,1582333137194363,42382898,sell,9679.6,3.18 -binance-futures,BTCUSDT,1582333137093000,1582333137224289,42382899,sell,9679.8,0.67 -binance-futures,BTCUSDT,1582333137099000,1582333137227198,42382900,sell,9679.8,0.68 -binance-futures,BTCUSDT,1582333137112000,1582333137245818,42382901,sell,9679.82,0.183 -binance-futures,BTCUSDT,1582333137112000,1582333137245824,42382902,sell,9679.8,0.557 -binance-futures,BTCUSDT,1582333137211000,1582333137340210,42382903,buy,9680.84,0.031 -binance-futures,BTCUSDT,1582333137211000,1582333137340217,42382904,buy,9680.84,0.076 -binance-futures,BTCUSDT,1582333137424000,1582333137557576,42382905,buy,9680.85,0.003 -binance-futures,BTCUSDT,1582333137424000,1582333137559461,42382906,buy,9680.98,0.097 -binance-futures,BTCUSDT,1582333142089000,1582333142217774,42382907,buy,9681,0.72 -binance-futures,BTCUSDT,1582333142090000,1582333142218292,42382908,buy,9681,0.68 -binance-futures,BTCUSDT,1582333142096000,1582333142226649,42382909,buy,9681,0.48 -binance-futures,BTCUSDT,1582333142096000,1582333142226659,42382910,buy,9681,0.67 -binance-futures,BTCUSDT,1582333142098000,1582333142226662,42382911,buy,9681,0.74 -binance-futures,BTCUSDT,1582333142137000,1582333142268623,42382912,buy,9681,0.68 -binance-futures,BTCUSDT,1582333142154000,1582333142284502,42382913,buy,9681,0.01 -binance-futures,BTCUSDT,1582333142167000,1582333142295827,42382914,buy,9681,0.74 -binance-futures,BTCUSDT,1582333142167000,1582333142295863,42382915,buy,9681,0.67 -binance-futures,BTCUSDT,1582333142176000,1582333142306537,42382916,buy,9681,0.01 -binance-futures,BTCUSDT,1582333142466000,1582333142593543,42382917,buy,9681,0.01 -binance-futures,BTCUSDT,1582333142700000,1582333142825507,42382918,buy,9681,0.096 -binance-futures,BTCUSDT,1582333142703000,1582333142830166,42382919,buy,9681,0.005 -binance-futures,BTCUSDT,1582333142711000,1582333142841423,42382920,buy,9681,4.489 -binance-futures,BTCUSDT,1582333142737000,1582333142865530,42382921,buy,9681.3,0.005 -binance-futures,BTCUSDT,1582333147914000,1582333148047387,42382922,buy,9683.3,0.005 -binance-futures,BTCUSDT,1582333148294000,1582333148433733,42382923,buy,9684.69,0.032 -binance-futures,BTCUSDT,1582333148294000,1582333148435141,42382924,buy,9684.83,0.047 -binance-futures,BTCUSDT,1582333148343000,1582333148475837,42382925,buy,9684.99,0.206 -binance-futures,BTCUSDT,1582333148365000,1582333148490962,42382926,buy,9684.99,0.2 -binance-futures,BTCUSDT,1582333151444000,1582333151577581,42382927,buy,9686.54,0.004 -binance-futures,BTCUSDT,1582333151826000,1582333151960186,42382928,buy,9687,0.005 -binance-futures,BTCUSDT,1582333152160000,1582333152294285,42382929,buy,9687.86,0.012 -binance-futures,BTCUSDT,1582333152248000,1582333152388147,42382930,buy,9688,0.005 -binance-futures,BTCUSDT,1582333152283000,1582333152417399,42382931,buy,9688.28,0.041 -binance-futures,BTCUSDT,1582333152334000,1582333152470474,42382932,buy,9688.77,0.04 -binance-futures,BTCUSDT,1582333152341000,1582333152478980,42382933,buy,9689.42,0.01 -binance-futures,BTCUSDT,1582333152341000,1582333152480925,42382934,buy,9689.73,0.047 -binance-futures,BTCUSDT,1582333152341000,1582333152491023,42382935,buy,9689.93,0.012 -binance-futures,BTCUSDT,1582333152341000,1582333152491035,42382936,buy,9690,0.1 -binance-futures,BTCUSDT,1582333152341000,1582333152491045,42382937,buy,9690,0.01 -binance-futures,BTCUSDT,1582333152341000,1582333152494293,42382938,buy,9690.14,0.008 -binance-futures,BTCUSDT,1582333152341000,1582333152497765,42382939,buy,9690.2,0.047 -binance-futures,BTCUSDT,1582333152341000,1582333152497801,42382940,buy,9691.07,0.663 -binance-futures,BTCUSDT,1582333152343000,1582333152497806,42382941,buy,9691.07,0.169 -binance-futures,BTCUSDT,1582333152344000,1582333152497825,42382942,buy,9691.07,0.554 -binance-futures,BTCUSDT,1582333152447000,1582333152583457,42382943,buy,9691.07,0.897 -binance-futures,BTCUSDT,1582333152938000,1582333153071590,42382944,buy,9691.07,0.846 -binance-futures,BTCUSDT,1582333153030000,1582333153166364,42382945,buy,9692,0.005 -binance-futures,BTCUSDT,1582333153030000,1582333153173054,42382946,buy,9692.37,0.005 -binance-futures,BTCUSDT,1582333154160000,1582333154295663,42382947,buy,9693.13,0.863 -binance-futures,BTCUSDT,1582333154183000,1582333154320364,42382948,buy,9693,0.033 -binance-futures,BTCUSDT,1582333154580000,1582333154713319,42382949,buy,9692.63,0.466 -binance-futures,BTCUSDT,1582333154580000,1582333154714183,42382950,buy,9692.68,0.031 -binance-futures,BTCUSDT,1582333154580000,1582333154719241,42382951,buy,9692.69,0.031 -binance-futures,BTCUSDT,1582333154580000,1582333154721904,42382952,buy,9692.7,0.031 -binance-futures,BTCUSDT,1582333154580000,1582333154723279,42382953,buy,9692.73,0.031 -binance-futures,BTCUSDT,1582333154580000,1582333154724079,42382954,buy,9692.74,0.031 -binance-futures,BTCUSDT,1582333154580000,1582333154725430,42382955,buy,9692.75,0.031 -binance-futures,BTCUSDT,1582333154580000,1582333154726201,42382956,buy,9692.77,0.788 -binance-futures,BTCUSDT,1582333155490000,1582333155677811,42382957,buy,9692.76,0.002 -binance-futures,BTCUSDT,1582333155628000,1582333155759166,42382958,buy,9693.31,0.008 -binance-futures,BTCUSDT,1582333155628000,1582333155759451,42382959,buy,9693.32,0.01 -binance-futures,BTCUSDT,1582333155628000,1582333155764016,42382960,buy,9693.46,0.232 -binance-futures,BTCUSDT,1582333156428000,1582333156562354,42382961,buy,9693.35,0.138 -binance-futures,BTCUSDT,1582333156619000,1582333156749935,42382962,sell,9692.97,0.031 -binance-futures,BTCUSDT,1582333156619000,1582333156750154,42382963,sell,9692.96,0.025 -binance-futures,BTCUSDT,1582333159825000,1582333159955329,42382964,buy,9692.79,0.175 -binance-futures,BTCUSDT,1582333159825000,1582333159957284,42382965,buy,9692.8,0.02 -binance-futures,BTCUSDT,1582333159825000,1582333159960833,42382966,buy,9692.92,0.805 -binance-futures,BTCUSDT,1582333161044000,1582333161171781,42382967,buy,9692.1,0.005 -binance-futures,BTCUSDT,1582333161044000,1582333161172132,42382968,buy,9692.92,0.504 -binance-futures,BTCUSDT,1582333161044000,1582333161177618,42382969,buy,9693.65,0.328 -binance-futures,BTCUSDT,1582333161044000,1582333161178917,42382970,buy,9693.71,0.163 -binance-futures,BTCUSDT,1582333162940000,1582333163069487,42382971,buy,9692.1,0.01 -binance-futures,BTCUSDT,1582333164741000,1582333164868391,42382972,sell,9691.36,0.014 -binance-futures,BTCUSDT,1582333167541000,1582333167669030,42382973,sell,9692.4,0.05 -binance-futures,BTCUSDT,1582333189201000,1582333189326524,42382974,buy,9692.7,0.005 -binance-futures,BTCUSDT,1582333189201000,1582333189331303,42382975,buy,9693.44,0.007 -binance-futures,BTCUSDT,1582333193664000,1582333193792316,42382976,sell,9693.43,0.031 -binance-futures,BTCUSDT,1582333193664000,1582333193794066,42382977,sell,9693.41,0.009 -binance-futures,BTCUSDT,1582333194257000,1582333194391943,42382978,sell,9693.43,0.031 -binance-futures,BTCUSDT,1582333194257000,1582333194391948,42382979,sell,9693.43,0.044 -binance-futures,BTCUSDT,1582333195177000,1582333195305300,42382980,buy,9693.44,0.007 -binance-futures,BTCUSDT,1582333195575000,1582333195704483,42382981,buy,9693.42,0.01 -binance-futures,BTCUSDT,1582333195820000,1582333195945927,42382982,sell,9693.41,0.075 -binance-futures,BTCUSDT,1582333196553000,1582333196683106,42382983,sell,9693.43,0.001 -binance-futures,BTCUSDT,1582333199979000,1582333200110475,42382984,buy,9693.44,0.018 -binance-futures,BTCUSDT,1582333200851000,1582333200982726,42382985,buy,9693.44,0.583 -binance-futures,BTCUSDT,1582333201183000,1582333201314895,42382986,sell,9693.43,0.025 -binance-futures,BTCUSDT,1582333202166000,1582333202295320,42382987,buy,9693.44,0.002 -binance-futures,BTCUSDT,1582333202561000,1582333202688453,42382988,sell,9693.43,0.005 -binance-futures,BTCUSDT,1582333202561000,1582333202690886,42382989,sell,9693.43,0.005 -binance-futures,BTCUSDT,1582333202561000,1582333202690893,42382990,sell,9693.43,0.029 -binance-futures,BTCUSDT,1582333202585000,1582333202712265,42382991,buy,9693.44,0.002 -binance-futures,BTCUSDT,1582333202944000,1582333203070786,42382992,buy,9693.44,0.002 -binance-futures,BTCUSDT,1582333203103000,1582333203230283,42382993,sell,9693.43,0.015 -binance-futures,BTCUSDT,1582333203224000,1582333203355362,42382994,sell,9693.43,0.012 -binance-futures,BTCUSDT,1582333203292000,1582333203442890,42382995,buy,9693.44,0.002 -binance-futures,BTCUSDT,1582333203868000,1582333203998171,42382996,sell,9693.43,0.005 -binance-futures,BTCUSDT,1582333204044000,1582333204172474,42382997,sell,9693.43,0.058 -binance-futures,BTCUSDT,1582333204044000,1582333204172692,42382998,sell,9693.43,0.641 -binance-futures,BTCUSDT,1582333204979000,1582333205107246,42382999,sell,9693.43,0.031 -binance-futures,BTCUSDT,1582333204979000,1582333205107294,42383000,sell,9693.43,0.434 -binance-futures,BTCUSDT,1582333204979000,1582333205107317,42383001,sell,9693.43,0.1 -binance-futures,BTCUSDT,1582333204979000,1582333205107923,42383002,sell,9693.41,0.373 -binance-futures,BTCUSDT,1582333205279000,1582333205420635,42383003,buy,9693.44,0.1 -binance-futures,BTCUSDT,1582333205761000,1582333205886719,42383004,sell,9693.43,0.006 -binance-futures,BTCUSDT,1582333205922000,1582333206049675,42383005,buy,9693.44,0.513 -binance-futures,BTCUSDT,1582333205922000,1582333206049848,42383006,buy,9693.44,0.197 -binance-futures,BTCUSDT,1582333205922000,1582333206049859,42383007,buy,9693.72,0.001 -binance-futures,BTCUSDT,1582333205922000,1582333206053926,42383008,buy,9693.75,0.04 -binance-futures,BTCUSDT,1582333205922000,1582333206055604,42383009,buy,9694.1,0.005 -binance-futures,BTCUSDT,1582333205922000,1582333206057006,42383010,buy,9694.38,0.379 -binance-futures,BTCUSDT,1582333205922000,1582333206057011,42383011,buy,9695,0.005 -binance-futures,BTCUSDT,1582333205922000,1582333206058662,42383012,buy,9695,0.02 -binance-futures,BTCUSDT,1582333205922000,1582333206058670,42383013,buy,9695,0.26 -binance-futures,BTCUSDT,1582333205922000,1582333206060843,42383014,buy,9695.29,2.658 -binance-futures,BTCUSDT,1582333205922000,1582333206062234,42383015,buy,9695.4,0.603 -binance-futures,BTCUSDT,1582333205922000,1582333206062244,42383016,buy,9695.4,0.603 -binance-futures,BTCUSDT,1582333205922000,1582333206062247,42383017,buy,9695.41,2 -binance-futures,BTCUSDT,1582333205922000,1582333206064912,42383018,buy,9695.47,0.1 -binance-futures,BTCUSDT,1582333205923000,1582333206064926,42383019,buy,9695.55,0.047 -binance-futures,BTCUSDT,1582333205923000,1582333206065703,42383020,buy,9695.63,2 -binance-futures,BTCUSDT,1582333205923000,1582333206067680,42383021,buy,9695.75,0.012 -binance-futures,BTCUSDT,1582333205923000,1582333206067688,42383022,buy,9696,0.039 -binance-futures,BTCUSDT,1582333205923000,1582333206068787,42383023,buy,9696,3 -binance-futures,BTCUSDT,1582333205923000,1582333206068797,42383024,buy,9696.34,0.012 -binance-futures,BTCUSDT,1582333205923000,1582333206069596,42383025,buy,9696.41,0.047 -binance-futures,BTCUSDT,1582333205923000,1582333206070129,42383026,buy,9696.7,2.671 -binance-futures,BTCUSDT,1582333205923000,1582333206070657,42383027,buy,9697.82,0.002 -binance-futures,BTCUSDT,1582333205923000,1582333206071742,42383028,buy,9698,0.005 -binance-futures,BTCUSDT,1582333205923000,1582333206071748,42383029,buy,9698,0.04 -binance-futures,BTCUSDT,1582333205923000,1582333206071751,42383030,buy,9698,0.4 -binance-futures,BTCUSDT,1582333205923000,1582333206072332,42383031,buy,9698.06,7.216 -binance-futures,BTCUSDT,1582333205923000,1582333206072358,42383032,buy,9698.06,1 -binance-futures,BTCUSDT,1582333205968000,1582333206102018,42383033,sell,9697,0.015 -binance-futures,BTCUSDT,1582333206347000,1582333206507346,42383034,sell,9697,0.038 -binance-futures,BTCUSDT,1582333206347000,1582333206507352,42383035,sell,9695.45,0.672 -binance-futures,BTCUSDT,1582333206700000,1582333206829673,42383036,sell,9695.1,0.001 -binance-futures,BTCUSDT,1582333206890000,1582333207016079,42383037,sell,9695.31,0.001 -binance-futures,BTCUSDT,1582333207021000,1582333207154869,42383038,buy,9696.4,0.001 -binance-futures,BTCUSDT,1582333207214000,1582333207352168,42383039,sell,9695.48,0.031 -binance-futures,BTCUSDT,1582333207214000,1582333207352173,42383040,sell,9695.44,0.031 -binance-futures,BTCUSDT,1582333207214000,1582333207352177,42383041,sell,9695.42,0.31 -binance-futures,BTCUSDT,1582333207239000,1582333207368546,42383042,sell,9695.47,0.001 -binance-futures,BTCUSDT,1582333207548000,1582333207674741,42383043,sell,9694.53,0.001 -binance-futures,BTCUSDT,1582333207672000,1582333207801775,42383044,sell,9694.58,0.002 -binance-futures,BTCUSDT,1582333208622000,1582333208757650,42383045,sell,9694.68,0.031 -binance-futures,BTCUSDT,1582333208622000,1582333208757655,42383046,sell,9694.67,0.031 -binance-futures,BTCUSDT,1582333208622000,1582333208761750,42383047,sell,9694.66,0.031 -binance-futures,BTCUSDT,1582333208622000,1582333208761758,42383048,sell,9694.65,0.005 -binance-futures,BTCUSDT,1582333208622000,1582333208763959,42383049,sell,9694.62,0.002 -binance-futures,BTCUSDT,1582333209165000,1582333209293928,42383050,buy,9695.9,0.003 -binance-futures,BTCUSDT,1582333209572000,1582333209700764,42383051,buy,9695.91,0.007 -binance-futures,BTCUSDT,1582333209600000,1582333209730593,42383052,sell,9694.74,0.031 -binance-futures,BTCUSDT,1582333209600000,1582333209730599,42383053,sell,9694.74,0.678 -binance-futures,BTCUSDT,1582333210406000,1582333210535235,42383054,buy,9695.85,0.1 -binance-futures,BTCUSDT,1582333211337000,1582333211465663,42383055,sell,9694.91,0.008 -binance-futures,BTCUSDT,1582333211945000,1582333212073477,42383056,sell,9695.11,0.007 -binance-futures,BTCUSDT,1582333212309000,1582333212439717,42383057,sell,9695.24,0.031 -binance-futures,BTCUSDT,1582333212309000,1582333212440140,42383058,sell,9695.23,0.031 -binance-futures,BTCUSDT,1582333212309000,1582333212440412,42383059,sell,9695.21,0.024 -binance-futures,BTCUSDT,1582333212309000,1582333212445865,42383060,sell,9695.21,2.163 -binance-futures,BTCUSDT,1582333212309000,1582333212445874,42383061,sell,9694.97,0.002 -binance-futures,BTCUSDT,1582333213133000,1582333213269092,42383062,buy,9694.89,0.001 -binance-futures,BTCUSDT,1582333213418000,1582333213546757,42383063,buy,9694.89,0.001 -binance-futures,BTCUSDT,1582333213898000,1582333214025176,42383064,buy,9694.89,0.008 -binance-futures,BTCUSDT,1582333216116000,1582333216247777,42383065,buy,9694.89,0.031 -binance-futures,BTCUSDT,1582333216116000,1582333216247782,42383066,buy,9694.89,0.09 -binance-futures,BTCUSDT,1582333216116000,1582333216248555,42383067,buy,9694.91,0.171 -binance-futures,BTCUSDT,1582333216116000,1582333216253141,42383068,buy,9695.61,0.237 -binance-futures,BTCUSDT,1582333216116000,1582333216255851,42383069,buy,9695.67,0.161 -binance-futures,BTCUSDT,1582333220339000,1582333220466925,42383070,sell,9694.89,0.028 -binance-futures,BTCUSDT,1582333222858000,1582333222985766,42383071,buy,9694.9,0.4 -binance-futures,BTCUSDT,1582333226101000,1582333226228723,42383072,sell,9694.89,0.005 -binance-futures,BTCUSDT,1582333227370000,1582333227500050,42383073,buy,9694.9,0.004 -binance-futures,BTCUSDT,1582333227726000,1582333227852370,42383074,buy,9694.9,0.019 -binance-futures,BTCUSDT,1582333228443000,1582333228566782,42383075,sell,9694.89,0.649 -binance-futures,BTCUSDT,1582333228443000,1582333228570238,42383076,sell,9694.88,0.307 -binance-futures,BTCUSDT,1582333228443000,1582333228573546,42383077,sell,9693.79,0.007 -binance-futures,BTCUSDT,1582333228443000,1582333228573553,42383078,sell,9693.78,0.797 -binance-futures,BTCUSDT,1582333231381000,1582333231510436,42383079,buy,9693.97,0.022 -binance-futures,BTCUSDT,1582333232497000,1582333232625830,42383080,buy,9693.51,0.031 -binance-futures,BTCUSDT,1582333232497000,1582333232628278,42383081,buy,9693.52,0.031 -binance-futures,BTCUSDT,1582333232497000,1582333232631060,42383082,buy,9693.53,0.031 -binance-futures,BTCUSDT,1582333232497000,1582333232632445,42383083,buy,9693.53,0.157 -binance-futures,BTCUSDT,1582333232684000,1582333232813949,42383084,sell,9692.78,1.18 -binance-futures,BTCUSDT,1582333232694000,1582333232824090,42383085,sell,9692.78,1.36 -binance-futures,BTCUSDT,1582333233075000,1582333233205859,42383086,sell,9692.78,0.01 -binance-futures,BTCUSDT,1582333233229000,1582333233375799,42383087,sell,9692.78,0.125 -binance-futures,BTCUSDT,1582333233394000,1582333233528116,42383088,buy,9692.79,0.06 -binance-futures,BTCUSDT,1582333233619000,1582333233749475,42383089,sell,9692.78,0.075 -binance-futures,BTCUSDT,1582333235198000,1582333235330835,42383090,sell,9692.69,0.01 -binance-futures,BTCUSDT,1582333235205000,1582333235336934,42383091,sell,9692.69,0.023 -binance-futures,BTCUSDT,1582333235205000,1582333235336939,42383092,sell,9692.68,0.777 -binance-futures,BTCUSDT,1582333241113000,1582333241242190,42383093,buy,9693.98,0.1 -binance-futures,BTCUSDT,1582333241113000,1582333241244155,42383094,buy,9694.11,0.25 -binance-futures,BTCUSDT,1582333241113000,1582333241247966,42383095,buy,9694.38,0.716 -binance-futures,BTCUSDT,1582333242605000,1582333242739538,42383096,sell,9693.96,0.2 -binance-futures,BTCUSDT,1582333243033000,1582333243166341,42383097,sell,9693.96,0.1 -binance-futures,BTCUSDT,1582333243045000,1582333243172814,42383098,sell,9693.96,0.55 -binance-futures,BTCUSDT,1582333244044000,1582333244169109,42383099,sell,9693.96,0.15 -binance-futures,BTCUSDT,1582333244044000,1582333244174738,42383100,sell,9693.31,0.001 -binance-futures,BTCUSDT,1582333244044000,1582333244179214,42383101,sell,9693.3,0.255 -binance-futures,BTCUSDT,1582333244135000,1582333244270031,42383102,sell,9693.3,0.773 -binance-futures,BTCUSDT,1582333244197000,1582333244337134,42383103,sell,9692.65,0.92 -binance-futures,BTCUSDT,1582333244503000,1582333244633920,42383104,buy,9692.56,0.031 -binance-futures,BTCUSDT,1582333244503000,1582333244634185,42383105,buy,9692.57,0.031 -binance-futures,BTCUSDT,1582333244503000,1582333244637983,42383106,buy,9692.58,0.031 -binance-futures,BTCUSDT,1582333244503000,1582333244639513,42383107,buy,9692.58,0.032 -binance-futures,BTCUSDT,1582333247326000,1582333247454089,42383108,sell,9692.1,0.001 -binance-futures,BTCUSDT,1582333251129000,1582333251257745,42383109,sell,9692.1,0.004 -binance-futures,BTCUSDT,1582333251129000,1582333251257752,42383110,sell,9691.43,0.317 -binance-futures,BTCUSDT,1582333252437000,1582333252566754,42383111,sell,9691.42,0.016 -binance-futures,BTCUSDT,1582333258701000,1582333258828852,42383112,sell,9691.58,1 -binance-futures,BTCUSDT,1582333259644000,1582333259773007,42383113,buy,9691.37,0.031 -binance-futures,BTCUSDT,1582333259644000,1582333259775446,42383114,buy,9691.37,0.039 -binance-futures,BTCUSDT,1582333265256000,1582333265382817,42383115,sell,9691.36,0.668 -binance-futures,BTCUSDT,1582333265321000,1582333265452708,42383116,sell,9690.82,0.002 -binance-futures,BTCUSDT,1582333265367000,1582333265503123,42383117,sell,9690.2,0.047 -binance-futures,BTCUSDT,1582333265367000,1582333265503131,42383118,sell,9690.1,0.233 -binance-futures,BTCUSDT,1582333265369000,1582333265505096,42383119,sell,9690.1,1.34 -binance-futures,BTCUSDT,1582333269659000,1582333269788677,42383120,buy,9690.01,0.008 -binance-futures,BTCUSDT,1582333276262000,1582333276387398,42383121,sell,9690,0.04 -binance-futures,BTCUSDT,1582333279270000,1582333279396759,42383122,sell,9690,0.051 -binance-futures,BTCUSDT,1582333279270000,1582333279397816,42383123,sell,9689.57,0.012 -binance-futures,BTCUSDT,1582333279270000,1582333279402243,42383124,sell,9689.49,0.682 -binance-futures,BTCUSDT,1582333279270000,1582333279402250,42383125,sell,9689.4,0.047 -binance-futures,BTCUSDT,1582333279270000,1582333279406674,42383126,sell,9689.22,2.208 -binance-futures,BTCUSDT,1582333281387000,1582333281513661,42383127,sell,9689.22,0.031 -binance-futures,BTCUSDT,1582333282327000,1582333282457156,42383128,sell,9688.94,0.002 -binance-futures,BTCUSDT,1582333282327000,1582333282459927,42383129,buy,9689.11,0.031 -binance-futures,BTCUSDT,1582333282327000,1582333282459934,42383130,buy,9689.12,0.031 -binance-futures,BTCUSDT,1582333282327000,1582333282461850,42383131,buy,9689.13,0.031 -binance-futures,BTCUSDT,1582333282327000,1582333282464270,42383132,buy,9689.24,5.056 -binance-futures,BTCUSDT,1582333294187000,1582333294315321,42383133,buy,9689.24,0.084 -binance-futures,BTCUSDT,1582333294216000,1582333294344648,42383134,sell,9688.94,0.012 -binance-futures,BTCUSDT,1582333294357000,1582333294486797,42383135,sell,9689.23,0.025 -binance-futures,BTCUSDT,1582333294357000,1582333294486810,42383136,sell,9689.06,0.031 -binance-futures,BTCUSDT,1582333294357000,1582333294491450,42383137,sell,9689.05,0.001 -binance-futures,BTCUSDT,1582333295209000,1582333295340320,42383138,sell,9689.07,0.005 -binance-futures,BTCUSDT,1582333297207000,1582333297337435,42383139,sell,9688.65,0.67 -binance-futures,BTCUSDT,1582333297221000,1582333297350740,42383140,sell,9688.65,0.01 -binance-futures,BTCUSDT,1582333297245000,1582333297376134,42383141,sell,9688.48,0.01 -binance-futures,BTCUSDT,1582333302697000,1582333302823751,42383142,sell,9687.85,0.012 -binance-futures,BTCUSDT,1582333302697000,1582333302824280,42383143,sell,9686.66,5.161 -binance-futures,BTCUSDT,1582333302697000,1582333302829523,42383144,sell,9686.51,0.005 -binance-futures,BTCUSDT,1582333302697000,1582333302832473,42383145,sell,9686.2,0.435 -binance-futures,BTCUSDT,1582333302697000,1582333302835236,42383146,sell,9686.07,5.368 -binance-futures,BTCUSDT,1582333302697000,1582333302839075,42383147,sell,9685.91,0.01 -binance-futures,BTCUSDT,1582333302697000,1582333302841846,42383148,sell,9685.84,2 -binance-futures,BTCUSDT,1582333302697000,1582333302841877,42383149,sell,9685.17,0.466 -binance-futures,BTCUSDT,1582333302697000,1582333302841881,42383150,sell,9685.17,0.466 -binance-futures,BTCUSDT,1582333302697000,1582333302846309,42383151,sell,9685.16,5.373 -binance-futures,BTCUSDT,1582333307879000,1582333308007197,42383152,buy,9685.04,0.031 -binance-futures,BTCUSDT,1582333307879000,1582333308011220,42383153,buy,9685.05,0.031 -binance-futures,BTCUSDT,1582333307879000,1582333308011227,42383154,buy,9685.06,0.031 -binance-futures,BTCUSDT,1582333307879000,1582333308011232,42383155,buy,9685.07,0.031 -binance-futures,BTCUSDT,1582333307879000,1582333308019152,42383156,buy,9685.32,1.876 -binance-futures,BTCUSDT,1582333311988000,1582333312116489,42383157,sell,9685.14,2 -binance-futures,BTCUSDT,1582333312540000,1582333312666758,42383158,buy,9685.32,0.05 -binance-futures,BTCUSDT,1582333315056000,1582333315184844,42383159,sell,9685.01,0.004 -binance-futures,BTCUSDT,1582333315056000,1582333315191396,42383160,sell,9684.52,0.066 -binance-futures,BTCUSDT,1582333320251000,1582333320376831,42383161,sell,9684.68,0.031 -binance-futures,BTCUSDT,1582333320251000,1582333320376855,42383162,sell,9684.67,0.031 -binance-futures,BTCUSDT,1582333320251000,1582333320382321,42383163,sell,9684.66,0.031 -binance-futures,BTCUSDT,1582333320251000,1582333320385450,42383164,sell,9684.65,0.031 -binance-futures,BTCUSDT,1582333320251000,1582333320388016,42383165,sell,9684.39,0.047 -binance-futures,BTCUSDT,1582333320251000,1582333320390840,42383166,sell,9683.84,0.347 -binance-futures,BTCUSDT,1582333320669000,1582333320798221,42383167,buy,9684.57,0.2 -binance-futures,BTCUSDT,1582333322377000,1582333322505273,42383168,sell,9683.87,0.092 -binance-futures,BTCUSDT,1582333328041000,1582333328171346,42383169,buy,9684.01,0.1 -binance-futures,BTCUSDT,1582333328041000,1582333328171353,42383170,buy,9684.01,0.15 -binance-futures,BTCUSDT,1582333328908000,1582333329035531,42383171,sell,9684,0.027 -binance-futures,BTCUSDT,1582333328970000,1582333329098182,42383172,sell,9683.73,0.012 -binance-futures,BTCUSDT,1582333329011000,1582333329138543,42383173,sell,9683.66,0.003 -binance-futures,BTCUSDT,1582333329035000,1582333329166102,42383174,sell,9683.56,0.047 -binance-futures,BTCUSDT,1582333335497000,1582333335623034,42383175,sell,9683.35,0.005 -binance-futures,BTCUSDT,1582333335497000,1582333335623371,42383176,sell,9683.35,0.492 -binance-futures,BTCUSDT,1582333335733000,1582333335862723,42383177,buy,9683.17,0.031 -binance-futures,BTCUSDT,1582333335733000,1582333335864423,42383178,buy,9683.18,0.028 -binance-futures,BTCUSDT,1582333335767000,1582333335897337,42383179,buy,9683.18,0.003 -binance-futures,BTCUSDT,1582333335767000,1582333335897346,42383180,buy,9683.19,0.031 -binance-futures,BTCUSDT,1582333335767000,1582333335904172,42383181,buy,9683.21,0.966 -binance-futures,BTCUSDT,1582333336553000,1582333336676104,42383182,sell,9683,0.001 -binance-futures,BTCUSDT,1582333336553000,1582333336681551,42383183,sell,9683,0.019 -binance-futures,BTCUSDT,1582333336553000,1582333336681634,42383184,sell,9682.45,0.01 -binance-futures,BTCUSDT,1582333336553000,1582333336683127,42383185,sell,9682.44,0.01 -binance-futures,BTCUSDT,1582333337699000,1582333337828500,42383186,buy,9682.86,0.05 -binance-futures,BTCUSDT,1582333338154000,1582333338281232,42383187,buy,9682.86,0.67 -binance-futures,BTCUSDT,1582333338163000,1582333338290677,42383188,buy,9682.86,0.76 -binance-futures,BTCUSDT,1582333338213000,1582333338343746,42383189,buy,9682.86,0.642 -binance-futures,BTCUSDT,1582333344130000,1582333344274300,42383190,buy,9683.67,0.031 -binance-futures,BTCUSDT,1582333344130000,1582333344274303,42383191,buy,9683.67,0.169 -binance-futures,BTCUSDT,1582333344317000,1582333344442846,42383192,sell,9683.66,0.1 -binance-futures,BTCUSDT,1582333344317000,1582333344442856,42383193,sell,9682.53,0.411 -binance-futures,BTCUSDT,1582333346257000,1582333346394362,42383194,buy,9683.4,0.02 -binance-futures,BTCUSDT,1582333354855000,1582333354984932,42383195,sell,9682.89,0.019 -binance-futures,BTCUSDT,1582333357268000,1582333357396716,42383196,buy,9683.53,0.63 -binance-futures,BTCUSDT,1582333357268000,1582333357396959,42383197,buy,9683.54,0.073 -binance-futures,BTCUSDT,1582333368966000,1582333369090449,42383198,sell,9682.83,0.001 -binance-futures,BTCUSDT,1582333370294000,1582333370421799,42383199,buy,9682.87,0.23 -binance-futures,BTCUSDT,1582333370303000,1582333370428706,42383200,buy,9682.87,0.68 -binance-futures,BTCUSDT,1582333370378000,1582333370504666,42383201,buy,9682.87,0.67 -binance-futures,BTCUSDT,1582333370380000,1582333370508801,42383202,buy,9682.87,0.72 -binance-futures,BTCUSDT,1582333370382000,1582333370508808,42383203,buy,9682.87,0.67 -binance-futures,BTCUSDT,1582333370410000,1582333370537648,42383204,buy,9682.87,0.68 -binance-futures,BTCUSDT,1582333370457000,1582333370587506,42383205,buy,9682.87,0.01 -binance-futures,BTCUSDT,1582333370467000,1582333370598104,42383206,buy,9682.87,0.67 -binance-futures,BTCUSDT,1582333370468000,1582333370598270,42383207,buy,9682.87,0.72 -binance-futures,BTCUSDT,1582333370524000,1582333370654898,42383208,buy,9682.99,0.01 -binance-futures,BTCUSDT,1582333370533000,1582333370664366,42383209,buy,9682.99,0.01 -binance-futures,BTCUSDT,1582333371965000,1582333372092846,42383210,buy,9682.99,0.014 -binance-futures,BTCUSDT,1582333373339000,1582333373467866,42383211,sell,9684,0.002 -binance-futures,BTCUSDT,1582333389221000,1582333389350163,42383212,sell,9684,0.001 -binance-futures,BTCUSDT,1582333392012000,1582333392139249,42383213,sell,9684,0.03 -binance-futures,BTCUSDT,1582333393606000,1582333393732767,42383214,sell,9683.98,0.25 -binance-futures,BTCUSDT,1582333393606000,1582333393732937,42383215,sell,9683.95,0.42 -binance-futures,BTCUSDT,1582333393658000,1582333393785962,42383216,sell,9683.95,0.67 -binance-futures,BTCUSDT,1582333393691000,1582333393819762,42383217,sell,9683.95,0.01 -binance-futures,BTCUSDT,1582333393857000,1582333393978969,42383218,buy,9683.96,0.501 -binance-futures,BTCUSDT,1582333404010000,1582333404139867,42383219,buy,9683.96,0.177 -binance-futures,BTCUSDT,1582333404991000,1582333405119692,42383220,buy,9683.96,0.042 -binance-futures,BTCUSDT,1582333404991000,1582333405122108,42383221,buy,9683.96,0.68 -binance-futures,BTCUSDT,1582333404991000,1582333405122116,42383222,buy,9683.96,0.74 -binance-futures,BTCUSDT,1582333404991000,1582333405122120,42383223,buy,9683.96,0.038 -binance-futures,BTCUSDT,1582333409973000,1582333410099602,42383224,buy,9683.96,0.001 -binance-futures,BTCUSDT,1582333410772000,1582333410903161,42383225,buy,9683.96,0.004 -binance-futures,BTCUSDT,1582333410772000,1582333410903175,42383226,buy,9683.96,0.63 -binance-futures,BTCUSDT,1582333410772000,1582333410903179,42383227,buy,9683.97,0.839 -binance-futures,BTCUSDT,1582333410772000,1582333410909039,42383228,buy,9683.99,0.377 -binance-futures,BTCUSDT,1582333410772000,1582333410911914,42383229,buy,9684,0.98 -binance-futures,BTCUSDT,1582333410772000,1582333410913981,42383230,buy,9684.01,0.681 -binance-futures,BTCUSDT,1582333410772000,1582333410919648,42383231,buy,9684.01,0.032 -binance-futures,BTCUSDT,1582333410772000,1582333410923274,42383232,buy,9684.06,5.054 -binance-futures,BTCUSDT,1582333410772000,1582333410923285,42383233,buy,9684.19,0.375 -binance-futures,BTCUSDT,1582333410772000,1582333410923288,42383234,buy,9684.19,0.376 -binance-futures,BTCUSDT,1582333410772000,1582333410923291,42383235,buy,9684.19,0.375 -binance-futures,BTCUSDT,1582333410772000,1582333410925076,42383236,buy,9684.19,0.383 -binance-futures,BTCUSDT,1582333410772000,1582333410925083,42383237,buy,9684.19,0.383 -binance-futures,BTCUSDT,1582333410772000,1582333411206549,42383238,buy,9684.2,0.681 -binance-futures,BTCUSDT,1582333410772000,1582333411206625,42383239,buy,9684.25,4.945 -binance-futures,BTCUSDT,1582333410772000,1582333411206642,42383240,buy,9684.56,0.02 -binance-futures,BTCUSDT,1582333410772000,1582333411206655,42383241,buy,9684.78,0.04 -binance-futures,BTCUSDT,1582333410772000,1582333411206658,42383242,buy,9684.79,1.078 -binance-futures,BTCUSDT,1582333410772000,1582333411206666,42383243,buy,9684.95,1.002 -binance-futures,BTCUSDT,1582333410772000,1582333411206676,42383244,buy,9685,0.4 -binance-futures,BTCUSDT,1582333410772000,1582333411206686,42383245,buy,9685,1.326 -binance-futures,BTCUSDT,1582333410772000,1582333411206690,42383246,buy,9685.38,0.56 -binance-futures,BTCUSDT,1582333410772000,1582333411206702,42383247,buy,9685.38,0.48 -binance-futures,BTCUSDT,1582333410772000,1582333411206707,42383248,buy,9685.38,1.026 -binance-futures,BTCUSDT,1582333410772000,1582333411206712,42383249,buy,9685.38,1.026 -binance-futures,BTCUSDT,1582333410772000,1582333411206717,42383250,buy,9686,0.64 -binance-futures,BTCUSDT,1582333410772000,1582333411206736,42383251,buy,9686.04,0.5 -binance-futures,BTCUSDT,1582333410772000,1582333411206762,42383252,buy,9686.08,0.051 -binance-futures,BTCUSDT,1582333411295000,1582333411422869,42383253,buy,9683.96,0.72 -binance-futures,BTCUSDT,1582333411304000,1582333411432533,42383254,buy,9683.96,0.67 -binance-futures,BTCUSDT,1582333411306000,1582333411432547,42383255,buy,9683.96,0.67 -binance-futures,BTCUSDT,1582333411344000,1582333411472228,42383256,buy,9683.96,0.63 -binance-futures,BTCUSDT,1582333411383000,1582333411511817,42383257,buy,9683.96,0.67 -binance-futures,BTCUSDT,1582333411421000,1582333411549248,42383258,buy,9683.96,0.01 -binance-futures,BTCUSDT,1582333411653000,1582333411780365,42383259,buy,9683.96,0.657 -binance-futures,BTCUSDT,1582333411685000,1582333411819362,42383260,sell,9684.41,0.861 -binance-futures,BTCUSDT,1582333417589000,1582333417716413,42383261,sell,9684.21,0.3 -binance-futures,BTCUSDT,1582333418956000,1582333419086455,42383262,buy,9684.78,0.042 -binance-futures,BTCUSDT,1582333423877000,1582333424000941,42383263,sell,9683.95,0.1 -binance-futures,BTCUSDT,1582333424579000,1582333424705643,42383264,sell,9683.95,0.74 -binance-futures,BTCUSDT,1582333424610000,1582333424738355,42383265,sell,9683.95,0.01 -binance-futures,BTCUSDT,1582333424643000,1582333424772575,42383266,sell,9683.95,0.05 -binance-futures,BTCUSDT,1582333424695000,1582333424824099,42383267,sell,9683.9,0.02 -binance-futures,BTCUSDT,1582333425677000,1582333425804213,42383268,buy,9683.91,0.043 -binance-futures,BTCUSDT,1582333426968000,1582333427100665,42383269,buy,9683.91,0.25 -binance-futures,BTCUSDT,1582333428645000,1582333428773391,42383270,buy,9683.91,1.409 -binance-futures,BTCUSDT,1582333430266000,1582333430393041,42383271,sell,9683.9,0.422 -binance-futures,BTCUSDT,1582333430266000,1582333430393204,42383272,sell,9683.9,0.006 -binance-futures,BTCUSDT,1582333430266000,1582333430393657,42383273,sell,9683.01,0.102 -binance-futures,BTCUSDT,1582333430266000,1582333430397234,42383274,sell,9683,0.005 -binance-futures,BTCUSDT,1582333430266000,1582333430399165,42383275,sell,9683,0.229 -binance-futures,BTCUSDT,1582333431895000,1582333432022936,42383276,sell,9683.02,0.001 -binance-futures,BTCUSDT,1582333434591000,1582333434719466,42383277,buy,9683.46,0.002 -binance-futures,BTCUSDT,1582333434591000,1582333434719775,42383278,buy,9683.47,0.012 -binance-futures,BTCUSDT,1582333434995000,1582333435119927,42383279,sell,9683.46,0.003 -binance-futures,BTCUSDT,1582333437139000,1582333437269044,42383280,buy,9683.68,0.014 -binance-futures,BTCUSDT,1582333447574000,1582333447698425,42383281,buy,9683.02,0.001 -binance-futures,BTCUSDT,1582333447719000,1582333447847317,42383282,sell,9683.01,0.681 -binance-futures,BTCUSDT,1582333448728000,1582333448859597,42383283,buy,9683.15,0.002 -binance-futures,BTCUSDT,1582333448728000,1582333448859604,42383284,buy,9683.16,0.031 -binance-futures,BTCUSDT,1582333448728000,1582333448872994,42383285,buy,9683.17,0.031 -binance-futures,BTCUSDT,1582333448728000,1582333448875470,42383286,buy,9683.18,0.031 -binance-futures,BTCUSDT,1582333448728000,1582333448877189,42383287,buy,9683.19,0.031 -binance-futures,BTCUSDT,1582333448728000,1582333448877199,42383288,buy,9683.19,0.67 -binance-futures,BTCUSDT,1582333448728000,1582333448877202,42383289,buy,9683.19,0.009 -binance-futures,BTCUSDT,1582333448728000,1582333448877206,42383290,buy,9683.19,0.72 -binance-futures,BTCUSDT,1582333448728000,1582333448877209,42383291,buy,9683.22,0.59 -binance-futures,BTCUSDT,1582333448728000,1582333448882268,42383292,buy,9683.42,2.395 -binance-futures,BTCUSDT,1582333448728000,1582333448883693,42383293,buy,9683.91,0.648 -binance-futures,BTCUSDT,1582333449051000,1582333449180555,42383294,buy,9683.43,0.073 -binance-futures,BTCUSDT,1582333456441000,1582333456572736,42383295,sell,9683.35,0.5 -binance-futures,BTCUSDT,1582333464837000,1582333464960922,42383296,sell,9683.43,0.031 -binance-futures,BTCUSDT,1582333464837000,1582333464969987,42383297,sell,9683.42,0.031 -binance-futures,BTCUSDT,1582333464837000,1582333464974149,42383298,sell,9683.41,0.031 -binance-futures,BTCUSDT,1582333464837000,1582333464976653,42383299,sell,9683.4,0.031 -binance-futures,BTCUSDT,1582333464837000,1582333464976662,42383300,sell,9683.02,0.002 -binance-futures,BTCUSDT,1582333464837000,1582333464976678,42383301,sell,9683.01,0.681 -binance-futures,BTCUSDT,1582333464837000,1582333464979473,42383302,sell,9683,0.694 -binance-futures,BTCUSDT,1582333471125000,1582333471253180,42383303,buy,9683.01,0.1 -binance-futures,BTCUSDT,1582333476777000,1582333476903096,42383304,buy,9683.36,0.1 -binance-futures,BTCUSDT,1582333476777000,1582333476903109,42383305,buy,9683.49,0.094 -binance-futures,BTCUSDT,1582333477739000,1582333477866758,42383306,sell,9683.35,0.08 -binance-futures,BTCUSDT,1582333477739000,1582333477867012,42383307,sell,9683,0.59 -binance-futures,BTCUSDT,1582333477784000,1582333477913590,42383308,sell,9683,0.67 -binance-futures,BTCUSDT,1582333477793000,1582333477918500,42383309,sell,9683,0.72 -binance-futures,BTCUSDT,1582333477798000,1582333477924893,42383310,sell,9683,0.68 -binance-futures,BTCUSDT,1582333477805000,1582333477934387,42383311,sell,9683,0.67 -binance-futures,BTCUSDT,1582333477821000,1582333477949483,42383312,sell,9683,0.01 -binance-futures,BTCUSDT,1582333477834000,1582333477961047,42383313,sell,9683,0.01 -binance-futures,BTCUSDT,1582333477842000,1582333477970980,42383314,sell,9683,0.01 -binance-futures,BTCUSDT,1582333477865000,1582333477993683,42383315,sell,9683,0.897 -binance-futures,BTCUSDT,1582333477885000,1582333478011366,42383316,sell,9683,0.046 -binance-futures,BTCUSDT,1582333477930000,1582333478058923,42383317,sell,9683,0.774 -binance-futures,BTCUSDT,1582333477930000,1582333478059259,42383318,sell,9683,0.1 -binance-futures,BTCUSDT,1582333477930000,1582333478059269,42383319,sell,9682.82,0.681 -binance-futures,BTCUSDT,1582333477930000,1582333478066786,42383320,sell,9682.44,0.03 -binance-futures,BTCUSDT,1582333477930000,1582333478068695,42383321,sell,9682.15,3.937 -binance-futures,BTCUSDT,1582333477930000,1582333478068706,42383322,sell,9682.05,0.012 -binance-futures,BTCUSDT,1582333477930000,1582333478072049,42383323,sell,9682,0.1 -binance-futures,BTCUSDT,1582333477930000,1582333478072059,42383324,sell,9682,0.001 -binance-futures,BTCUSDT,1582333477930000,1582333478072084,42383325,sell,9682,0.6 -binance-futures,BTCUSDT,1582333477930000,1582333478072090,42383326,sell,9681.66,0.1 -binance-futures,BTCUSDT,1582333477930000,1582333478073407,42383327,sell,9681.66,0.546 -binance-futures,BTCUSDT,1582333477930000,1582333478074771,42383328,sell,9681.07,2.28 -binance-futures,BTCUSDT,1582333479406000,1582333479535975,42383329,sell,9681.69,0.001 -binance-futures,BTCUSDT,1582333479406000,1582333479538709,42383330,sell,9681.68,0.016 -binance-futures,BTCUSDT,1582333479429000,1582333479554210,42383331,sell,9681.68,0.037 -binance-futures,BTCUSDT,1582333489149000,1582333489274619,42383332,buy,9681.9,0.031 -binance-futures,BTCUSDT,1582333489149000,1582333489274628,42383333,buy,9681.91,0.031 -binance-futures,BTCUSDT,1582333489149000,1582333489277669,42383334,buy,9681.92,0.031 -binance-futures,BTCUSDT,1582333489149000,1582333489280869,42383335,buy,9681.93,0.031 -binance-futures,BTCUSDT,1582333489149000,1582333489283311,42383336,buy,9681.96,0.1 -binance-futures,BTCUSDT,1582333489149000,1582333489284919,42383337,buy,9682.26,0.776 -binance-futures,BTCUSDT,1582333492111000,1582333492244242,42383338,buy,9681.28,0.1 -binance-futures,BTCUSDT,1582333492980000,1582333493107625,42383339,buy,9682.84,0.648 -binance-futures,BTCUSDT,1582333497732000,1582333497861780,42383340,buy,9682.21,0.1 -binance-futures,BTCUSDT,1582333497732000,1582333497861788,42383341,buy,9682.21,0.9 -binance-futures,BTCUSDT,1582333498586000,1582333498710215,42383342,buy,9682.82,0.25 -binance-futures,BTCUSDT,1582333503031000,1582333503157145,42383343,buy,9681.16,0.032 -binance-futures,BTCUSDT,1582333505446000,1582333505572224,42383344,buy,9681.16,0.025 -binance-futures,BTCUSDT,1582333509604000,1582333509731615,42383345,buy,9681.16,0.001 -binance-futures,BTCUSDT,1582333512304000,1582333512449969,42383346,sell,9681.18,0.031 -binance-futures,BTCUSDT,1582333512304000,1582333512455093,42383347,sell,9681.17,0.031 -binance-futures,BTCUSDT,1582333512304000,1582333512456961,42383348,sell,9681.16,0.031 -binance-futures,BTCUSDT,1582333512304000,1582333512458378,42383349,sell,9681.15,0.017 -binance-futures,BTCUSDT,1582333518138000,1582333518263070,42383350,sell,9681.13,0.104 -binance-futures,BTCUSDT,1582333518138000,1582333518269234,42383351,sell,9681.04,0.702 -binance-futures,BTCUSDT,1582333518138000,1582333518269241,42383352,sell,9681.01,0.681 -binance-futures,BTCUSDT,1582333518138000,1582333518275100,42383353,sell,9681,0.813 -binance-futures,BTCUSDT,1582333521141000,1582333521267628,42383354,sell,9681,2.187 -binance-futures,BTCUSDT,1582333521141000,1582333521267979,42383355,sell,9681,0.1 -binance-futures,BTCUSDT,1582333521141000,1582333521268242,42383356,sell,9681,0.013 -binance-futures,BTCUSDT,1582333526004000,1582333526128619,42383357,sell,9681,0.016 -binance-futures,BTCUSDT,1582333526004000,1582333526129765,42383358,sell,9681,0.204 -binance-futures,BTCUSDT,1582333526295000,1582333526426337,42383359,buy,9681.01,0.2 -binance-futures,BTCUSDT,1582333528794000,1582333528924509,42383360,sell,9681,0.249 -binance-futures,BTCUSDT,1582333528794000,1582333528925320,42383361,sell,9681,0.68 -binance-futures,BTCUSDT,1582333528794000,1582333528925329,42383362,sell,9681,0.071 -binance-futures,BTCUSDT,1582333530891000,1582333531020398,42383363,sell,9680.97,0.014 -binance-futures,BTCUSDT,1582333531016000,1582333531146028,42383364,sell,9680.97,0.027 -binance-futures,BTCUSDT,1582333531199000,1582333531329969,42383365,sell,9680.81,0.35 -binance-futures,BTCUSDT,1582333532449000,1582333532576899,42383366,buy,9680.51,0.004 -binance-futures,BTCUSDT,1582333532449000,1582333532577140,42383367,buy,9680.51,5.155 -binance-futures,BTCUSDT,1582333541420000,1582333541547833,42383368,sell,9680.5,0.02 -binance-futures,BTCUSDT,1582333541420000,1582333541548346,42383369,sell,9680.5,0.019 -binance-futures,BTCUSDT,1582333541420000,1582333541548361,42383370,sell,9680.5,0.68 -binance-futures,BTCUSDT,1582333541420000,1582333541548621,42383371,sell,9680.5,0.564 -binance-futures,BTCUSDT,1582333542615000,1582333542742489,42383372,sell,9680,0.06 -binance-futures,BTCUSDT,1582333549205000,1582333549329179,42383373,sell,9680,0.043 -binance-futures,BTCUSDT,1582333549923000,1582333550050667,42383374,buy,9680.01,0.1 -binance-futures,BTCUSDT,1582333549923000,1582333550050885,42383375,buy,9680.01,0.15 -binance-futures,BTCUSDT,1582333550233000,1582333550356923,42383376,sell,9680,0.051 -binance-futures,BTCUSDT,1582333551709000,1582333551837234,42383377,buy,9680.01,0.02 -binance-futures,BTCUSDT,1582333551779000,1582333551908201,42383378,sell,9680,0.67 -binance-futures,BTCUSDT,1582333552314000,1582333552441720,42383379,sell,9680,0.03 -binance-futures,BTCUSDT,1582333558094000,1582333558223294,42383380,buy,9680.01,0.68 -binance-futures,BTCUSDT,1582333558099000,1582333558230394,42383381,buy,9680.01,0.74 -binance-futures,BTCUSDT,1582333558135000,1582333558263846,42383382,buy,9680.01,0.01 -binance-futures,BTCUSDT,1582333558155000,1582333558282104,42383383,buy,9680.01,0.74 -binance-futures,BTCUSDT,1582333558399000,1582333558525454,42383384,buy,9680.01,0.01 -binance-futures,BTCUSDT,1582333558431000,1582333558561175,42383385,sell,9680,0.01 -binance-futures,BTCUSDT,1582333558803000,1582333558928062,42383386,buy,9680.01,0.05 -binance-futures,BTCUSDT,1582333559007000,1582333559134933,42383387,buy,9680.01,0.105 -binance-futures,BTCUSDT,1582333559094000,1582333559225007,42383388,sell,9680,0.005 -binance-futures,BTCUSDT,1582333559798000,1582333559933928,42383389,sell,9680,2.948 -binance-futures,BTCUSDT,1582333559798000,1582333559933932,42383390,sell,9680,0.011 -binance-futures,BTCUSDT,1582333559798000,1582333559933935,42383391,sell,9680,0.01 -binance-futures,BTCUSDT,1582333559798000,1582333559933938,42383392,sell,9680,0.5 -binance-futures,BTCUSDT,1582333559798000,1582333559933941,42383393,sell,9680,0.01 -binance-futures,BTCUSDT,1582333559798000,1582333559934176,42383394,sell,9680,0.003 -binance-futures,BTCUSDT,1582333559798000,1582333559934186,42383395,sell,9680,0.6 -binance-futures,BTCUSDT,1582333559798000,1582333559934189,42383396,sell,9680,0.16 -binance-futures,BTCUSDT,1582333559798000,1582333559934192,42383397,sell,9680,0.67 -binance-futures,BTCUSDT,1582333559798000,1582333559934195,42383398,sell,9679.99,0.246 -binance-futures,BTCUSDT,1582333560033000,1582333560160886,42383399,sell,9679.99,0.004 -binance-futures,BTCUSDT,1582333560033000,1582333560160896,42383400,sell,9679.13,0.159 -binance-futures,BTCUSDT,1582333560363000,1582333560503004,42383401,buy,9679.76,0.005 -binance-futures,BTCUSDT,1582333561324000,1582333561454044,42383402,sell,9679.1,0.04 -binance-futures,BTCUSDT,1582333561324000,1582333561454062,42383403,sell,9679,0.215 -binance-futures,BTCUSDT,1582333561324000,1582333561457078,42383404,sell,9678.87,0.015 -binance-futures,BTCUSDT,1582333562530000,1582333562660857,42383405,sell,9678.87,0.025 -binance-futures,BTCUSDT,1582333564574000,1582333564704800,42383406,sell,9678.85,0.04 -binance-futures,BTCUSDT,1582333564574000,1582333564704811,42383407,sell,9678.59,0.047 -binance-futures,BTCUSDT,1582333564574000,1582333564709732,42383408,sell,9678.59,0.04 -binance-futures,BTCUSDT,1582333564574000,1582333564709741,42383409,sell,9678.49,0.04 -binance-futures,BTCUSDT,1582333564574000,1582333564709753,42383410,sell,9678.44,0.141 -binance-futures,BTCUSDT,1582333564593000,1582333564719925,42383411,buy,9678.87,0.011 -binance-futures,BTCUSDT,1582333564593000,1582333564726361,42383412,buy,9678.9,0.1 -binance-futures,BTCUSDT,1582333564593000,1582333564728806,42383413,buy,9679.28,0.003 -binance-futures,BTCUSDT,1582333564593000,1582333564728819,42383414,buy,9679.29,0.086 -binance-futures,BTCUSDT,1582333571564000,1582333571693924,42383415,buy,9678.66,0.02 -binance-futures,BTCUSDT,1582333574064000,1582333574190914,42383416,sell,9678.65,0.001 -binance-futures,BTCUSDT,1582333574064000,1582333574193059,42383417,sell,9678.43,0.186 -binance-futures,BTCUSDT,1582333575631000,1582333575759686,42383418,buy,9678.93,0.02 -binance-futures,BTCUSDT,1582333576563000,1582333576692378,42383419,sell,9678.9,0.031 -binance-futures,BTCUSDT,1582333576563000,1582333576693414,42383420,sell,9678.89,0.031 -binance-futures,BTCUSDT,1582333576563000,1582333576698663,42383421,sell,9678.88,0.031 -binance-futures,BTCUSDT,1582333576563000,1582333576699711,42383422,sell,9678.87,0.007 -binance-futures,BTCUSDT,1582333582500000,1582333582625999,42383423,buy,9678.5,0.001 -binance-futures,BTCUSDT,1582333583108000,1582333583234292,42383424,sell,9678.49,0.031 -binance-futures,BTCUSDT,1582333583108000,1582333583235392,42383425,sell,9678.49,0.075 -binance-futures,BTCUSDT,1582333584064000,1582333584192428,42383426,sell,9678.64,0.001 -binance-futures,BTCUSDT,1582333584855000,1582333584983969,42383427,buy,9678.65,0.01 -binance-futures,BTCUSDT,1582333585547000,1582333585677096,42383428,sell,9678.45,0.244 -binance-futures,BTCUSDT,1582333586100000,1582333586228342,42383429,sell,9678.45,0.001 -binance-futures,BTCUSDT,1582333587656000,1582333587785922,42383430,sell,9678.51,0.001 -binance-futures,BTCUSDT,1582333588887000,1582333589014377,42383431,sell,9678.66,0.1 -binance-futures,BTCUSDT,1582333588887000,1582333589017391,42383432,sell,9678.56,0.489 -binance-futures,BTCUSDT,1582333588887000,1582333589017397,42383433,sell,9678.53,0.082 -binance-futures,BTCUSDT,1582333589030000,1582333589160531,42383434,sell,9678.62,0.001 -binance-futures,BTCUSDT,1582333589852000,1582333589983559,42383435,buy,9678.64,0.1 -binance-futures,BTCUSDT,1582333589852000,1582333589986543,42383436,buy,9678.67,0.9 -binance-futures,BTCUSDT,1582333593475000,1582333593605802,42383437,buy,9678.46,0.031 -binance-futures,BTCUSDT,1582333593475000,1582333593610256,42383438,buy,9678.47,0.031 -binance-futures,BTCUSDT,1582333593475000,1582333593612959,42383439,buy,9678.48,0.031 -binance-futures,BTCUSDT,1582333593475000,1582333593616782,42383440,buy,9678.49,0.031 -binance-futures,BTCUSDT,1582333593475000,1582333593616792,42383441,buy,9678.5,0.546 -binance-futures,BTCUSDT,1582333593477000,1582333593618117,42383442,buy,9678.5,0.67 -binance-futures,BTCUSDT,1582333598431000,1582333598558410,42383443,buy,9678.93,0.01 -binance-futures,BTCUSDT,1582333598431000,1582333598565738,42383444,buy,9678.93,0.652 -binance-futures,BTCUSDT,1582333598431000,1582333598565747,42383445,buy,9679.02,0.068 -binance-futures,BTCUSDT,1582333598468000,1582333598597534,42383446,buy,9679.02,0.65 -binance-futures,BTCUSDT,1582333598491000,1582333598619551,42383447,buy,9679.02,0.01 -binance-futures,BTCUSDT,1582333600922000,1582333601049123,42383448,buy,9679.62,0.1 -binance-futures,BTCUSDT,1582333600922000,1582333601049136,42383449,buy,9679.62,0.522 -binance-futures,BTCUSDT,1582333601517000,1582333601645178,42383450,sell,9679.36,0.031 -binance-futures,BTCUSDT,1582333601517000,1582333601645379,42383451,sell,9679.35,0.031 -binance-futures,BTCUSDT,1582333601517000,1582333601650442,42383452,sell,9679.34,0.031 -binance-futures,BTCUSDT,1582333601517000,1582333601652404,42383453,sell,9679.33,0.007 -binance-futures,BTCUSDT,1582333602033000,1582333602161806,42383454,buy,9679.62,1.5 -binance-futures,BTCUSDT,1582333604532000,1582333604662210,42383455,buy,9679.62,0.03 -binance-futures,BTCUSDT,1582333604550000,1582333604678418,42383456,buy,9679.62,0.464 -binance-futures,BTCUSDT,1582333604550000,1582333604678450,42383457,buy,9679.64,0.1 -binance-futures,BTCUSDT,1582333604843000,1582333604972956,42383458,buy,9680.32,0.001 -binance-futures,BTCUSDT,1582333605687000,1582333605815183,42383459,buy,9680.27,0.001 -binance-futures,BTCUSDT,1582333608852000,1582333608983104,42383460,sell,9680,0.003 -binance-futures,BTCUSDT,1582333610227000,1582333610360678,42383461,sell,9680,0.433 -binance-futures,BTCUSDT,1582333610227000,1582333610360693,42383462,sell,9680,0.07 -binance-futures,BTCUSDT,1582333610227000,1582333610360697,42383463,sell,9680,0.001 -binance-futures,BTCUSDT,1582333612191000,1582333612326946,42383464,sell,9679.31,0.09 -binance-futures,BTCUSDT,1582333613734000,1582333613862677,42383465,buy,9679.29,0.09 -binance-futures,BTCUSDT,1582333613734000,1582333613862693,42383466,buy,9679.32,0.019 -binance-futures,BTCUSDT,1582333618842000,1582333618972690,42383467,buy,9679.18,0.01 -binance-futures,BTCUSDT,1582333619290000,1582333619419882,42383468,buy,9679.23,0.031 -binance-futures,BTCUSDT,1582333619290000,1582333619419900,42383469,buy,9679.24,0.031 -binance-futures,BTCUSDT,1582333619290000,1582333619422645,42383470,buy,9679.25,0.031 -binance-futures,BTCUSDT,1582333619290000,1582333619429189,42383471,buy,9679.26,0.011 -binance-futures,BTCUSDT,1582333619290000,1582333619429793,42383472,buy,9679.28,0.096 -binance-futures,BTCUSDT,1582333621145000,1582333621276021,42383473,buy,9679.35,0.51 -binance-futures,BTCUSDT,1582333621400000,1582333621529239,42383474,buy,9679.35,0.01 -binance-futures,BTCUSDT,1582333621701000,1582333621834485,42383475,sell,9679.12,0.003 -binance-futures,BTCUSDT,1582333621761000,1582333621893668,42383476,buy,9679.35,0.005 -binance-futures,BTCUSDT,1582333622352000,1582333622480828,42383477,buy,9679.51,0.01 -binance-futures,BTCUSDT,1582333622597000,1582333622726656,42383478,buy,9679.51,0.014 -binance-futures,BTCUSDT,1582333623691000,1582333623820916,42383479,buy,9679.51,0.01 -binance-futures,BTCUSDT,1582333625539000,1582333625664331,42383480,buy,9679.51,0.01 -binance-futures,BTCUSDT,1582333626353000,1582333626479170,42383481,sell,9679.5,0.1 -binance-futures,BTCUSDT,1582333626353000,1582333626481197,42383482,sell,9679.48,0.031 -binance-futures,BTCUSDT,1582333626353000,1582333626483455,42383483,sell,9679.48,0.296 -binance-futures,BTCUSDT,1582333628032000,1582333628164146,42383484,buy,9679.48,0.024 -binance-futures,BTCUSDT,1582333629926000,1582333630056482,42383485,sell,9679.47,0.013 -binance-futures,BTCUSDT,1582333632115000,1582333632244981,42383486,sell,9679.45,0.031 -binance-futures,BTCUSDT,1582333640139000,1582333640270651,42383487,sell,9679.44,0.031 -binance-futures,BTCUSDT,1582333640139000,1582333640271508,42383488,sell,9679.44,1.038 -binance-futures,BTCUSDT,1582333640940000,1582333641070357,42383489,sell,9679.44,0.681 -binance-futures,BTCUSDT,1582333640940000,1582333641070364,42383490,sell,9679.43,0.031 -binance-futures,BTCUSDT,1582333640940000,1582333641073729,42383491,sell,9679.42,0.031 -binance-futures,BTCUSDT,1582333647201000,1582333647330516,42383492,buy,9679.4,1 -binance-futures,BTCUSDT,1582333648775000,1582333648899655,42383493,sell,9679.39,0.01 -binance-futures,BTCUSDT,1582333651638000,1582333651771210,42383494,sell,9679.39,1.274 -binance-futures,BTCUSDT,1582333657126000,1582333657256383,42383495,buy,9679.4,1.888 -binance-futures,BTCUSDT,1582333657199000,1582333657331449,42383496,sell,9679.39,1.002 -binance-futures,BTCUSDT,1582333657587000,1582333657714288,42383497,buy,9679.4,0.1 -binance-futures,BTCUSDT,1582333657888000,1582333658017345,42383498,buy,9679.4,0.131 -binance-futures,BTCUSDT,1582333658728000,1582333658858603,42383499,buy,9679.4,0.499 -binance-futures,BTCUSDT,1582333658736000,1582333658861453,42383500,buy,9679.4,3 -binance-futures,BTCUSDT,1582333658762000,1582333658889794,42383501,buy,9679.4,0.1 -binance-futures,BTCUSDT,1582333658766000,1582333658894630,42383502,buy,9679.4,0.1 -binance-futures,BTCUSDT,1582333658768000,1582333658898602,42383503,buy,9679.4,0.25 -binance-futures,BTCUSDT,1582333658771000,1582333658898607,42383504,buy,9679.4,0.2 -binance-futures,BTCUSDT,1582333658773000,1582333658902948,42383505,buy,9679.4,0.25 -binance-futures,BTCUSDT,1582333658784000,1582333658911964,42383506,buy,9679.4,1.6 -binance-futures,BTCUSDT,1582333658784000,1582333658912233,42383507,buy,9679.4,0.05 -binance-futures,BTCUSDT,1582333658796000,1582333658924720,42383508,buy,9679.4,0.85 -binance-futures,BTCUSDT,1582333658796000,1582333658924734,42383509,buy,9679.4,0.1 -binance-futures,BTCUSDT,1582333658806000,1582333658932586,42383510,buy,9679.4,0.2 -binance-futures,BTCUSDT,1582333658806000,1582333658932609,42383511,buy,9679.4,0.05 -binance-futures,BTCUSDT,1582333658809000,1582333658936974,42383512,buy,9679.4,0.05 -binance-futures,BTCUSDT,1582333658809000,1582333658936977,42383513,buy,9679.4,0.15 -binance-futures,BTCUSDT,1582333659017000,1582333659146486,42383514,buy,9679.4,8.689 -binance-futures,BTCUSDT,1582333659017000,1582333659153066,42383515,buy,9679.51,0.637 -binance-futures,BTCUSDT,1582333659017000,1582333659153072,42383516,buy,9679.99,0.682 -binance-futures,BTCUSDT,1582333659017000,1582333659155625,42383517,buy,9680,0.252 -binance-futures,BTCUSDT,1582333659331000,1582333659463788,42383518,buy,9681.26,0.001 -binance-futures,BTCUSDT,1582333660171000,1582333660303736,42383519,buy,9681.77,0.001 -binance-futures,BTCUSDT,1582333660184000,1582333660319624,42383520,sell,9681.59,0.031 -binance-futures,BTCUSDT,1582333660184000,1582333660319634,42383521,sell,9681.58,0.031 -binance-futures,BTCUSDT,1582333660184000,1582333660323413,42383522,sell,9681.57,0.015 -binance-futures,BTCUSDT,1582333660187000,1582333660329770,42383523,sell,9681.6,0.031 -binance-futures,BTCUSDT,1582333660187000,1582333660329803,42383524,sell,9681.57,0.016 -binance-futures,BTCUSDT,1582333660187000,1582333660331660,42383525,sell,9681.56,0.031 -binance-futures,BTCUSDT,1582333660187000,1582333660331743,42383526,sell,9681.56,0.149 -binance-futures,BTCUSDT,1582333660657000,1582333660786874,42383527,sell,9681.61,0.031 -binance-futures,BTCUSDT,1582333660657000,1582333660794962,42383528,sell,9681.6,0.031 -binance-futures,BTCUSDT,1582333660657000,1582333660796835,42383529,sell,9681.59,0.031 -binance-futures,BTCUSDT,1582333660657000,1582333660797667,42383530,sell,9681.58,0.03 -binance-futures,BTCUSDT,1582333661823000,1582333661955037,42383531,buy,9681.92,0.011 -binance-futures,BTCUSDT,1582333661823000,1582333661956851,42383532,buy,9681.92,0.001 -binance-futures,BTCUSDT,1582333661823000,1582333661956859,42383533,buy,9681.93,0.138 -binance-futures,BTCUSDT,1582333665404000,1582333665531945,42383534,sell,9681.5,0.013 -binance-futures,BTCUSDT,1582333665404000,1582333665534972,42383535,sell,9681.5,0.004 -binance-futures,BTCUSDT,1582333665404000,1582333665534982,42383536,sell,9681.5,0.005 -binance-futures,BTCUSDT,1582333665404000,1582333665534985,42383537,sell,9681.5,0.005 -binance-futures,BTCUSDT,1582333665404000,1582333665535823,42383538,sell,9681.5,0.467 -binance-futures,BTCUSDT,1582333667603000,1582333667735372,42383539,buy,9682.34,0.012 -binance-futures,BTCUSDT,1582333667603000,1582333667739983,42383540,buy,9682.44,0.918 -binance-futures,BTCUSDT,1582333667603000,1582333667743953,42383541,buy,9682.45,1.555 -binance-futures,BTCUSDT,1582333669705000,1582333669833240,42383542,buy,9682.05,0.031 -binance-futures,BTCUSDT,1582333669705000,1582333669839970,42383543,buy,9682.06,0.031 -binance-futures,BTCUSDT,1582333669705000,1582333669839982,42383544,buy,9682.07,0.031 -binance-futures,BTCUSDT,1582333669705000,1582333669842719,42383545,buy,9682.08,0.029 -binance-futures,BTCUSDT,1582333673703000,1582333673832011,42383546,buy,9682.07,0.031 -binance-futures,BTCUSDT,1582333673703000,1582333673834446,42383547,buy,9682.08,0.031 -binance-futures,BTCUSDT,1582333673703000,1582333673837985,42383548,buy,9682.09,0.031 -binance-futures,BTCUSDT,1582333673703000,1582333673840345,42383549,buy,9682.1,0.031 -binance-futures,BTCUSDT,1582333675489000,1582333675620994,42383550,buy,9682.95,1 -binance-futures,BTCUSDT,1582333676281000,1582333676408664,42383551,buy,9683.29,1 -binance-futures,BTCUSDT,1582333677243000,1582333677369904,42383552,sell,9683.15,0.006 -binance-futures,BTCUSDT,1582333677395000,1582333677522942,42383553,sell,9683.15,0.025 -binance-futures,BTCUSDT,1582333677395000,1582333677523153,42383554,sell,9683.14,0.031 -binance-futures,BTCUSDT,1582333677395000,1582333677527287,42383555,sell,9683.13,0.031 -binance-futures,BTCUSDT,1582333677395000,1582333677527297,42383556,sell,9683.12,0.013 -binance-futures,BTCUSDT,1582333678365000,1582333678493446,42383557,sell,9682.42,0.022 -binance-futures,BTCUSDT,1582333683768000,1582333683897421,42383558,sell,9682.63,0.015 -binance-futures,BTCUSDT,1582333686406000,1582333686534457,42383559,sell,9682.7,0.5 -binance-futures,BTCUSDT,1582333692585000,1582333692713742,42383560,buy,9683.38,0.897 -binance-futures,BTCUSDT,1582333692928000,1582333693063703,42383561,buy,9683.62,0.681 -binance-futures,BTCUSDT,1582333692928000,1582333693064888,42383562,buy,9683.65,0.491 -binance-futures,BTCUSDT,1582333694945000,1582333695075086,42383563,sell,9683.99,0.024 -binance-futures,BTCUSDT,1582333698362000,1582333698488896,42383564,buy,9684,0.25 -binance-futures,BTCUSDT,1582333698454000,1582333698589643,42383565,buy,9684.39,0.047 -binance-futures,BTCUSDT,1582333698622000,1582333698750137,42383566,buy,9685.73,0.011 -binance-futures,BTCUSDT,1582333698622000,1582333698750146,42383567,buy,9685.73,0.003 -binance-futures,BTCUSDT,1582333698631000,1582333698763090,42383568,buy,9685.85,0.04 -binance-futures,BTCUSDT,1582333698631000,1582333698763099,42383569,buy,9686,0.001 -binance-futures,BTCUSDT,1582333699459000,1582333699593655,42383570,sell,9686.42,0.001 -binance-futures,BTCUSDT,1582333700473000,1582333700602267,42383571,buy,9686.83,0.244 -binance-futures,BTCUSDT,1582333701536000,1582333701665781,42383572,sell,9686.88,0.006 -binance-futures,BTCUSDT,1582333702085000,1582333702212746,42383573,buy,9685.93,0.1 -binance-futures,BTCUSDT,1582333702085000,1582333702212755,42383574,buy,9685.93,0.4 -binance-futures,BTCUSDT,1582333702605000,1582333702732671,42383575,buy,9686.83,0.001 -binance-futures,BTCUSDT,1582333706780000,1582333706914625,42383576,buy,9686.49,0.031 -binance-futures,BTCUSDT,1582333706780000,1582333706914631,42383577,buy,9686.49,0.756 -binance-futures,BTCUSDT,1582333710065000,1582333710194511,42383578,buy,9686.1,0.03 -binance-futures,BTCUSDT,1582333711628000,1582333711757994,42383579,sell,9686.09,0.001 -binance-futures,BTCUSDT,1582333716946000,1582333717075711,42383580,buy,9686.71,0.901 -binance-futures,BTCUSDT,1582333716946000,1582333717081860,42383581,buy,9686.76,1.9 -binance-futures,BTCUSDT,1582333725988000,1582333726119008,42383582,buy,9686.93,0.001 -binance-futures,BTCUSDT,1582333726115000,1582333726245738,42383583,sell,9686.75,0.06 -binance-futures,BTCUSDT,1582333726291000,1582333726423936,42383584,buy,9686.93,0.039 -binance-futures,BTCUSDT,1582333726291000,1582333726426734,42383585,buy,9687.22,0.015 -binance-futures,BTCUSDT,1582333726291000,1582333726427512,42383586,buy,9687.76,0.024 -binance-futures,BTCUSDT,1582333726759000,1582333726888988,42383587,buy,9687.86,0.012 -binance-futures,BTCUSDT,1582333726759000,1582333726889249,42383588,buy,9688.04,0.008 -binance-futures,BTCUSDT,1582333727912000,1582333728038081,42383589,buy,9688.04,3.406 -binance-futures,BTCUSDT,1582333727912000,1582333728042813,42383590,buy,9688.95,0.717 -binance-futures,BTCUSDT,1582333730636000,1582333730767207,42383591,buy,9687.87,0.031 -binance-futures,BTCUSDT,1582333730636000,1582333730767210,42383592,buy,9687.88,0.031 -binance-futures,BTCUSDT,1582333730636000,1582333730776199,42383593,buy,9687.89,0.031 -binance-futures,BTCUSDT,1582333730636000,1582333730776748,42383594,buy,9687.9,0.031 -binance-futures,BTCUSDT,1582333730636000,1582333730777521,42383595,buy,9687.96,0.876 -binance-futures,BTCUSDT,1582333731548000,1582333731676656,42383596,sell,9687.29,0.02 -binance-futures,BTCUSDT,1582333741457000,1582333741585152,42383597,sell,9687.28,1 -binance-futures,BTCUSDT,1582333743126000,1582333743254492,42383598,buy,9687.29,5 -binance-futures,BTCUSDT,1582333743631000,1582333743761735,42383599,buy,9688.22,0.004 -binance-futures,BTCUSDT,1582333743631000,1582333743766549,42383600,buy,9688.48,0.053 -binance-futures,BTCUSDT,1582333743631000,1582333743770602,42383601,buy,9688.5,0.943 -binance-futures,BTCUSDT,1582333744976000,1582333745102396,42383602,sell,9688.26,0.031 -binance-futures,BTCUSDT,1582333744976000,1582333745105304,42383603,sell,9688.25,0.031 -binance-futures,BTCUSDT,1582333744976000,1582333745113539,42383604,sell,9688.24,0.031 -binance-futures,BTCUSDT,1582333744976000,1582333745117274,42383605,sell,9688.23,0.031 -binance-futures,BTCUSDT,1582333744976000,1582333745120638,42383606,sell,9688.17,1.148 -binance-futures,BTCUSDT,1582333751195000,1582333751323662,42383607,buy,9688.49,0.681 -binance-futures,BTCUSDT,1582333751195000,1582333751323671,42383608,buy,9688.5,0.419 -binance-futures,BTCUSDT,1582333753978000,1582333754107187,42383609,sell,9688.49,0.03 -binance-futures,BTCUSDT,1582333753978000,1582333754111939,42383610,sell,9688.49,0.07 -binance-futures,BTCUSDT,1582333754938000,1582333755063936,42383611,buy,9688.5,0.092 -binance-futures,BTCUSDT,1582333759388000,1582333759520358,42383612,buy,9688.5,0.034 -binance-futures,BTCUSDT,1582333761521000,1582333761647520,42383613,buy,9688.5,0.016 -binance-futures,BTCUSDT,1582333763817000,1582333763945043,42383614,sell,9688.49,0.67 -binance-futures,BTCUSDT,1582333763879000,1582333764005600,42383615,sell,9688.49,0.67 -binance-futures,BTCUSDT,1582333763922000,1582333764051111,42383616,sell,9688.49,0.01 -binance-futures,BTCUSDT,1582333764135000,1582333764280420,42383617,sell,9688.49,0.67 -binance-futures,BTCUSDT,1582333764138000,1582333764281792,42383618,sell,9688.49,0.68 -binance-futures,BTCUSDT,1582333764142000,1582333764283401,42383619,sell,9688.49,0.74 -binance-futures,BTCUSDT,1582333764142000,1582333764283411,42383620,sell,9688.49,0.72 -binance-futures,BTCUSDT,1582333764206000,1582333764333684,42383621,sell,9688.49,0.016 -binance-futures,BTCUSDT,1582333764206000,1582333764333694,42383622,sell,9688.49,0.681 -binance-futures,BTCUSDT,1582333764238000,1582333764369317,42383623,sell,9688.18,0.002 -binance-futures,BTCUSDT,1582333764238000,1582333764371129,42383624,sell,9688.17,0.738 -binance-futures,BTCUSDT,1582333764242000,1582333764373279,42383625,sell,9688.17,1.3 -binance-futures,BTCUSDT,1582333764247000,1582333764379312,42383626,sell,9688.17,0.335 -binance-futures,BTCUSDT,1582333764247000,1582333764379318,42383627,sell,9688,0.345 -binance-futures,BTCUSDT,1582333764249000,1582333764380718,42383628,sell,9688,0.72 -binance-futures,BTCUSDT,1582333764269000,1582333764397040,42383629,sell,9688,0.1 -binance-futures,BTCUSDT,1582333764271000,1582333764402705,42383630,sell,9688,0.67 -binance-futures,BTCUSDT,1582333764280000,1582333764406737,42383631,sell,9688,0.67 -binance-futures,BTCUSDT,1582333764294000,1582333764424128,42383632,sell,9688,0.194 -binance-futures,BTCUSDT,1582333764296000,1582333764424137,42383633,sell,9688,0.1 -binance-futures,BTCUSDT,1582333764296000,1582333764424141,42383634,sell,9688,0.05 -binance-futures,BTCUSDT,1582333764297000,1582333764424144,42383635,sell,9688,0.15 -binance-futures,BTCUSDT,1582333764299000,1582333764428524,42383636,sell,9688,0.4 -binance-futures,BTCUSDT,1582333764301000,1582333764430070,42383637,sell,9688,0.05 -binance-futures,BTCUSDT,1582333764303000,1582333764431326,42383638,sell,9688,0.1 -binance-futures,BTCUSDT,1582333764340000,1582333764464778,42383639,sell,9688,0.01 -binance-futures,BTCUSDT,1582333764564000,1582333764692993,42383640,sell,9688,0.02 -binance-futures,BTCUSDT,1582333764993000,1582333765119505,42383641,sell,9688,0.316 -binance-futures,BTCUSDT,1582333765915000,1582333766042135,42383642,sell,9688,0.306 -binance-futures,BTCUSDT,1582333766013000,1582333766141077,42383643,sell,9688,1.3 -binance-futures,BTCUSDT,1582333766013000,1582333766142712,42383644,sell,9688,0.15 -binance-futures,BTCUSDT,1582333766035000,1582333766161666,42383645,sell,9688,0.05 -binance-futures,BTCUSDT,1582333766035000,1582333766161775,42383646,sell,9688,0.2 -binance-futures,BTCUSDT,1582333766037000,1582333766165846,42383647,sell,9688,0.1 -binance-futures,BTCUSDT,1582333766044000,1582333766170678,42383648,sell,9688,0.05 -binance-futures,BTCUSDT,1582333766044000,1582333766170774,42383649,sell,9688,0.1 -binance-futures,BTCUSDT,1582333766135000,1582333766264068,42383650,sell,9688,0.15 -binance-futures,BTCUSDT,1582333766137000,1582333766264087,42383651,sell,9688,0.05 -binance-futures,BTCUSDT,1582333766142000,1582333766269203,42383652,sell,9688,0.1 -binance-futures,BTCUSDT,1582333766142000,1582333766269372,42383653,sell,9688,0.549 -binance-futures,BTCUSDT,1582333766142000,1582333766269387,42383654,sell,9688,0.001 -binance-futures,BTCUSDT,1582333766838000,1582333766968205,42383655,sell,9688,0.302 -binance-futures,BTCUSDT,1582333767393000,1582333767521249,42383656,sell,9688,0.038 -binance-futures,BTCUSDT,1582333768013000,1582333768140168,42383657,sell,9688,0.331 -binance-futures,BTCUSDT,1582333768211000,1582333768340254,42383658,buy,9688.01,0.031 -binance-futures,BTCUSDT,1582333768211000,1582333768340261,42383659,buy,9688.01,0.069 -binance-futures,BTCUSDT,1582333768742000,1582333768872206,42383660,sell,9688,0.312 -binance-futures,BTCUSDT,1582333769103000,1582333769234661,42383661,sell,9688,2.726 -binance-futures,BTCUSDT,1582333770013000,1582333770144833,42383662,buy,9687.87,0.069 -binance-futures,BTCUSDT,1582333770013000,1582333770144845,42383663,buy,9687.87,0.031 -binance-futures,BTCUSDT,1582333773819000,1582333774000003,42383664,buy,9687.89,0.003 -binance-futures,BTCUSDT,1582333786644000,1582333786773719,42383665,buy,9688,0.01 -binance-futures,BTCUSDT,1582333787391000,1582333787513212,42383666,buy,9688,0.004 -binance-futures,BTCUSDT,1582333790961000,1582333791086342,42383667,buy,9688,0.1 -binance-futures,BTCUSDT,1582333791811000,1582333791938925,42383668,sell,9687.99,0.702 -binance-futures,BTCUSDT,1582333796250000,1582333796380460,42383669,sell,9687.99,0.004 -binance-futures,BTCUSDT,1582333797468000,1582333797596974,42383670,sell,9687.99,0.001 -binance-futures,BTCUSDT,1582333798736000,1582333798862698,42383671,sell,9687.99,1.1 -binance-futures,BTCUSDT,1582333798763000,1582333798890148,42383672,sell,9687.99,2.287 -binance-futures,BTCUSDT,1582333798763000,1582333798893793,42383673,sell,9687.99,0.013 -binance-futures,BTCUSDT,1582333798783000,1582333798910983,42383674,sell,9687.99,0.087 -binance-futures,BTCUSDT,1582333798783000,1582333798911134,42383675,sell,9687.99,0.436 -binance-futures,BTCUSDT,1582333811577000,1582333811701809,42383676,sell,9687.99,0.104 -binance-futures,BTCUSDT,1582333811663000,1582333811791619,42383677,buy,9688,0.005 -binance-futures,BTCUSDT,1582333812225000,1582333812355877,42383678,sell,9687.99,0.01 -binance-futures,BTCUSDT,1582333812553000,1582333812679401,42383679,sell,9687.99,0.002 -binance-futures,BTCUSDT,1582333812662000,1582333812792847,42383680,sell,9687.99,0.1 -binance-futures,BTCUSDT,1582333813640000,1582333813768729,42383681,buy,9688,0.001 -binance-futures,BTCUSDT,1582333823154000,1582333823283289,42383682,sell,9687.99,0.01 -binance-futures,BTCUSDT,1582333823660000,1582333823788766,42383683,sell,9687.99,1.685 -binance-futures,BTCUSDT,1582333823681000,1582333823810125,42383684,sell,9687.99,3.663 -binance-futures,BTCUSDT,1582333823681000,1582333823810131,42383685,sell,9687.99,0.681 -binance-futures,BTCUSDT,1582333823681000,1582333823810155,42383686,sell,9687.99,0.681 -binance-futures,BTCUSDT,1582333823819000,1582333823950551,42383687,buy,9687.84,0.189 -binance-futures,BTCUSDT,1582333824001000,1582333824131775,42383688,sell,9686.87,0.045 -binance-futures,BTCUSDT,1582333824001000,1582333824131788,42383689,sell,9686.87,0.852 -binance-futures,BTCUSDT,1582333824369000,1582333824501037,42383690,sell,9686.87,1 -binance-futures,BTCUSDT,1582333824617000,1582333824747432,42383691,sell,9686.87,0.04 -binance-futures,BTCUSDT,1582333824825000,1582333824960062,42383692,sell,9686.87,1 -binance-futures,BTCUSDT,1582333824825000,1582333824960079,42383693,sell,9686.87,0.602 -binance-futures,BTCUSDT,1582333824827000,1582333824960084,42383694,sell,9686.87,0.342 -binance-futures,BTCUSDT,1582333826536000,1582333826675290,42383695,buy,9684.39,0.002 -binance-futures,BTCUSDT,1582333828523000,1582333828654885,42383696,sell,9682.69,0.012 -binance-futures,BTCUSDT,1582333828523000,1582333828659430,42383697,sell,9682.48,0.003 -binance-futures,BTCUSDT,1582333831625000,1582333831755760,42383698,sell,9683.25,0.001 -binance-futures,BTCUSDT,1582333832062000,1582333832195555,42383699,sell,9683.24,0.001 -binance-futures,BTCUSDT,1582333832062000,1582333832195577,42383700,sell,9683.22,0.275 -binance-futures,BTCUSDT,1582333832443000,1582333832570013,42383701,sell,9683.22,0.001 -binance-futures,BTCUSDT,1582333834879000,1582333835009694,42383702,sell,9682.18,0.1 -binance-futures,BTCUSDT,1582333839179000,1582333839306723,42383703,buy,9682.12,0.031 -binance-futures,BTCUSDT,1582333839179000,1582333839308697,42383704,buy,9682.13,0.031 -binance-futures,BTCUSDT,1582333839179000,1582333839311944,42383705,buy,9682.14,0.031 -binance-futures,BTCUSDT,1582333839179000,1582333839317955,42383706,buy,9682.15,0.031 -binance-futures,BTCUSDT,1582333839179000,1582333839317965,42383707,buy,9682.44,0.5 -binance-futures,BTCUSDT,1582333839179000,1582333839321007,42383708,buy,9682.73,0.513 -binance-futures,BTCUSDT,1582333839179000,1582333839321902,42383709,buy,9682.76,4.026 -binance-futures,BTCUSDT,1582333846363000,1582333846492175,42383710,sell,9682.05,0.012 -binance-futures,BTCUSDT,1582333846363000,1582333846492425,42383711,sell,9681.71,0.01 -binance-futures,BTCUSDT,1582333846363000,1582333846502641,42383712,sell,9681.71,0.004 -binance-futures,BTCUSDT,1582333846363000,1582333846502665,42383713,sell,9680.95,0.419 -binance-futures,BTCUSDT,1582333846406000,1582333846537407,42383714,sell,9682.05,0.72 -binance-futures,BTCUSDT,1582333846406000,1582333846540555,42383715,sell,9682.05,1.33 -binance-futures,BTCUSDT,1582333846406000,1582333846540619,42383716,sell,9682.05,1.43 -binance-futures,BTCUSDT,1582333846406000,1582333846540625,42383717,sell,9682.05,0.67 -binance-futures,BTCUSDT,1582333846406000,1582333846540631,42383718,sell,9682.05,0.404 -binance-futures,BTCUSDT,1582333849815000,1582333849942299,42383719,sell,9681.17,0.005 -binance-futures,BTCUSDT,1582333852250000,1582333852375399,42383720,sell,9681.17,0.091 -binance-futures,BTCUSDT,1582333862836000,1582333862966956,42383721,sell,9680.5,0.002 -binance-futures,BTCUSDT,1582333862836000,1582333862972849,42383722,sell,9680.24,0.098 -binance-futures,BTCUSDT,1582333865970000,1582333866099219,42383723,buy,9680.25,0.001 -binance-futures,BTCUSDT,1582333866227000,1582333866377233,42383724,buy,9680.82,0.047 -binance-futures,BTCUSDT,1582333866227000,1582333866378667,42383725,buy,9681.17,0.618 -binance-futures,BTCUSDT,1582333866847000,1582333866978040,42383726,buy,9681.12,0.031 -binance-futures,BTCUSDT,1582333866957000,1582333867084717,42383727,buy,9681.12,0.031 -binance-futures,BTCUSDT,1582333866957000,1582333867093131,42383728,buy,9681.13,0.003 -binance-futures,BTCUSDT,1582333878166000,1582333878295405,42383729,sell,9680.92,0.1 -binance-futures,BTCUSDT,1582333879265000,1582333879397591,42383730,sell,9680.47,0.001 -binance-futures,BTCUSDT,1582333884242000,1582333884371842,42383731,sell,9680.47,0.68 -binance-futures,BTCUSDT,1582333884242000,1582333884372062,42383732,sell,9679.89,0.04 -binance-futures,BTCUSDT,1582333884242000,1582333884379734,42383733,sell,9679.03,0.532 -binance-futures,BTCUSDT,1582333884242000,1582333884379740,42383734,sell,9679.03,0.532 -binance-futures,BTCUSDT,1582333884242000,1582333884379747,42383735,sell,9679.02,0.009 -binance-futures,BTCUSDT,1582333884242000,1582333884379750,42383736,sell,9679.01,0.868 -binance-futures,BTCUSDT,1582333884242000,1582333884385776,42383737,sell,9679,0.01 -binance-futures,BTCUSDT,1582333884242000,1582333884385784,42383738,sell,9679,0.1 -binance-futures,BTCUSDT,1582333884242000,1582333884388043,42383739,sell,9678.77,5.216 -binance-futures,BTCUSDT,1582333884242000,1582333884391042,42383740,sell,9678.59,0.013 -binance-futures,BTCUSDT,1582333885234000,1582333885362930,42383741,sell,9678.59,0.034 -binance-futures,BTCUSDT,1582333885234000,1582333885367699,42383742,sell,9678.5,0.04 -binance-futures,BTCUSDT,1582333885234000,1582333885367703,42383743,sell,9678.46,0.1 -binance-futures,BTCUSDT,1582333885234000,1582333885369612,42383744,sell,9678.46,0.387 -binance-futures,BTCUSDT,1582333886756000,1582333886884081,42383745,buy,9678.69,0.25 -binance-futures,BTCUSDT,1582333894598000,1582333894725745,42383746,buy,9678.69,2.753 -binance-futures,BTCUSDT,1582333894598000,1582333894726292,42383747,buy,9678.78,0.001 -binance-futures,BTCUSDT,1582333895547000,1582333895674421,42383748,buy,9679.96,0.031 -binance-futures,BTCUSDT,1582333895547000,1582333895675549,42383749,buy,9679.97,0.031 -binance-futures,BTCUSDT,1582333895547000,1582333895677742,42383750,buy,9679.98,0.031 -binance-futures,BTCUSDT,1582333895547000,1582333895682101,42383751,buy,9680,0.003 -binance-futures,BTCUSDT,1582333895547000,1582333895683993,42383752,buy,9680.01,0.14 -binance-futures,BTCUSDT,1582333896427000,1582333896556718,42383753,sell,9679.59,0.03 -binance-futures,BTCUSDT,1582333902707000,1582333902831786,42383754,buy,9679.61,0.098 -binance-futures,BTCUSDT,1582333907432000,1582333907561423,42383755,sell,9679.62,0.902 -binance-futures,BTCUSDT,1582333907432000,1582333907563689,42383756,sell,9679.1,0.858 -binance-futures,BTCUSDT,1582333907432000,1582333907567979,42383757,sell,9679.06,1 -binance-futures,BTCUSDT,1582333907432000,1582333907567990,42383758,sell,9679,0.246 -binance-futures,BTCUSDT,1582333907432000,1582333907574781,42383759,sell,9678.67,0.1 -binance-futures,BTCUSDT,1582333907432000,1582333907575282,42383760,sell,9678.46,0.35 -binance-futures,BTCUSDT,1582333907432000,1582333907576983,42383761,sell,9678.45,0.001 -binance-futures,BTCUSDT,1582333907432000,1582333907579144,42383762,sell,9678.44,0.002 -binance-futures,BTCUSDT,1582333907432000,1582333907581095,42383763,sell,9678.43,0.541 -binance-futures,BTCUSDT,1582333907512000,1582333907639849,42383764,sell,9678.44,0.001 -binance-futures,BTCUSDT,1582333907512000,1582333907645550,42383765,sell,9678.43,0.739 -binance-futures,BTCUSDT,1582333907512000,1582333907645558,42383766,sell,9678.43,0.72 -binance-futures,BTCUSDT,1582333907516000,1582333907648011,42383767,sell,9678.43,0.4 -binance-futures,BTCUSDT,1582333907518000,1582333907648018,42383768,sell,9678.43,0.67 -binance-futures,BTCUSDT,1582333919633000,1582333919762624,42383769,sell,9678.55,0.001 -binance-futures,BTCUSDT,1582333921837000,1582333921967078,42383770,sell,9678.75,0.031 -binance-futures,BTCUSDT,1582333921837000,1582333921969917,42383771,sell,9678.74,0.031 -binance-futures,BTCUSDT,1582333921837000,1582333921976972,42383772,sell,9678.73,0.031 -binance-futures,BTCUSDT,1582333921837000,1582333921979803,42383773,sell,9678.72,0.031 -binance-futures,BTCUSDT,1582333921837000,1582333921981478,42383774,sell,9678.55,0.074 -binance-futures,BTCUSDT,1582333923796000,1582333923927772,42383775,buy,9678.76,5.014 -binance-futures,BTCUSDT,1582333923833000,1582333923966958,42383776,buy,9678.89,0.681 -binance-futures,BTCUSDT,1582333923913000,1582333924048849,42383777,buy,9679.62,0.034 -binance-futures,BTCUSDT,1582333923913000,1582333924048858,42383778,buy,9679.78,0.436 -binance-futures,BTCUSDT,1582333924132000,1582333924265815,42383779,buy,9679.78,0.897 -binance-futures,BTCUSDT,1582333924192000,1582333924320786,42383780,buy,9679.78,4.037 -binance-futures,BTCUSDT,1582333924192000,1582333924321228,42383781,buy,9679.86,0.108 -binance-futures,BTCUSDT,1582333924211000,1582333924344324,42383782,buy,9679.86,0.192 -binance-futures,BTCUSDT,1582333925288000,1582333925420730,42383783,buy,9680.57,0.1 -binance-futures,BTCUSDT,1582333925288000,1582333925424893,42383784,sell,9680.56,0.1 -binance-futures,BTCUSDT,1582333925288000,1582333925424913,42383785,sell,9680.56,0.9 -binance-futures,BTCUSDT,1582333925612000,1582333925744258,42383786,buy,9680.93,0.12 -binance-futures,BTCUSDT,1582333925634000,1582333925767361,42383787,buy,9680.93,0.62 -binance-futures,BTCUSDT,1582333925661000,1582333925791097,42383788,buy,9680.93,1.44 -binance-futures,BTCUSDT,1582333925731000,1582333925861981,42383789,buy,9680.93,0.62 -binance-futures,BTCUSDT,1582333925741000,1582333925872709,42383790,buy,9680.93,0.01 -binance-futures,BTCUSDT,1582333925780000,1582333925912707,42383791,buy,9680.93,0.791 -binance-futures,BTCUSDT,1582333925780000,1582333925913065,42383792,buy,9680.93,0.592 -binance-futures,BTCUSDT,1582333930550000,1582333930679874,42383793,sell,9682.03,0.096 -binance-futures,BTCUSDT,1582333933105000,1582333933235629,42383794,sell,9682.03,0.1 -binance-futures,BTCUSDT,1582333935230000,1582333935357942,42383795,sell,9682.03,0.1 -binance-futures,BTCUSDT,1582333935230000,1582333935360955,42383796,sell,9682.03,0.005 -binance-futures,BTCUSDT,1582333935230000,1582333935360970,42383797,sell,9682.03,0.68 -binance-futures,BTCUSDT,1582333935230000,1582333935360974,42383798,sell,9682.03,0.16 -binance-futures,BTCUSDT,1582333938880000,1582333939008164,42383799,sell,9682.01,0.031 -binance-futures,BTCUSDT,1582333938880000,1582333939009266,42383800,sell,9682,0.031 -binance-futures,BTCUSDT,1582333940776000,1582333940903957,42383801,buy,9682,0.071 -binance-futures,BTCUSDT,1582333946411000,1582333946540226,42383802,buy,9682,0.31 -binance-futures,BTCUSDT,1582333946738000,1582333946867299,42383803,sell,9681.99,0.031 -binance-futures,BTCUSDT,1582333946738000,1582333946869378,42383804,sell,9681.99,0.074 -binance-futures,BTCUSDT,1582333947382000,1582333947511024,42383805,sell,9681.99,0.77 -binance-futures,BTCUSDT,1582333949033000,1582333949159947,42383806,buy,9682,0.057 -binance-futures,BTCUSDT,1582333949033000,1582333949159982,42383807,buy,9682,0.187 -binance-futures,BTCUSDT,1582333954673000,1582333954800394,42383808,buy,9682.04,0.331 -binance-futures,BTCUSDT,1582333958476000,1582333958600491,42383809,buy,9682.04,0.024 -binance-futures,BTCUSDT,1582333960788000,1582333960916382,42383810,buy,9682.04,0.327 -binance-futures,BTCUSDT,1582333960894000,1582333961022514,42383811,buy,9682.65,0.18 -binance-futures,BTCUSDT,1582333960915000,1582333961045157,42383812,buy,9682.65,0.502 -binance-futures,BTCUSDT,1582333962221000,1582333962353163,42383813,buy,9684.18,0.166 -binance-futures,BTCUSDT,1582333962537000,1582333962664252,42383814,buy,9684.39,0.047 -binance-futures,BTCUSDT,1582333966270000,1582333966399346,42383815,buy,9687,0.003 -binance-futures,BTCUSDT,1582333966270000,1582333966400522,42383816,buy,9687.26,0.003 -binance-futures,BTCUSDT,1582333966270000,1582333966404091,42383817,buy,9687.27,0.863 -binance-futures,BTCUSDT,1582333966270000,1582333966404099,42383818,buy,9687.34,0.131 -binance-futures,BTCUSDT,1582333967099000,1582333967229305,42383819,buy,9687.34,0.03 -binance-futures,BTCUSDT,1582333967546000,1582333967672876,42383820,sell,9687.25,0.004 -binance-futures,BTCUSDT,1582333968112000,1582333968240918,42383821,buy,9687.3,0.001 -binance-futures,BTCUSDT,1582333970791000,1582333970922546,42383822,sell,9687.33,0.02 -binance-futures,BTCUSDT,1582333976682000,1582333976807687,42383823,sell,9687.27,0.87 -binance-futures,BTCUSDT,1582333981124000,1582333981251791,42383824,buy,9687.29,0.03 -binance-futures,BTCUSDT,1582333981458000,1582333981587990,42383825,sell,9687.27,0.06 -binance-futures,BTCUSDT,1582333981756000,1582333981882933,42383826,sell,9687.27,0.001 -binance-futures,BTCUSDT,1582333985738000,1582333985865470,42383827,sell,9686.61,3.096 -binance-futures,BTCUSDT,1582333985738000,1582333985868184,42383828,sell,9686.04,2.231 -binance-futures,BTCUSDT,1582333985763000,1582333985893154,42383829,sell,9686.04,1.864 -binance-futures,BTCUSDT,1582333985763000,1582333985898339,42383830,sell,9685.47,0.499 -binance-futures,BTCUSDT,1582333985763000,1582333985898348,42383831,sell,9685.47,0.499 -binance-futures,BTCUSDT,1582333985763000,1582333985903012,42383832,sell,9685.07,0.898 -binance-futures,BTCUSDT,1582333985764000,1582333985903023,42383833,sell,9684.96,0.5 -binance-futures,BTCUSDT,1582333985764000,1582333985903037,42383834,sell,9684.09,0.186 -binance-futures,BTCUSDT,1582333985927000,1582333986060132,42383835,sell,9685.16,0.897 -binance-futures,BTCUSDT,1582333986338000,1582333986468388,42383836,sell,9684.6,1.27 -binance-futures,BTCUSDT,1582333987901000,1582333988029626,42383837,sell,9684.42,0.65 -binance-futures,BTCUSDT,1582333987924000,1582333988053831,42383838,sell,9684.42,0.2 -binance-futures,BTCUSDT,1582333987924000,1582333988053870,42383839,sell,9684.42,0.4 -binance-futures,BTCUSDT,1582333987941000,1582333988071482,42383840,sell,9684.42,1.4 -binance-futures,BTCUSDT,1582333987948000,1582333988078539,42383841,sell,9684.42,0.095 -binance-futures,BTCUSDT,1582333989280000,1582333989604483,42383842,sell,9682.61,0.015 -binance-futures,BTCUSDT,1582333989317000,1582333989604709,42383843,sell,9682.61,0.01 -binance-futures,BTCUSDT,1582333989673000,1582333989803295,42383844,sell,9682.62,0.299 -binance-futures,BTCUSDT,1582333989673000,1582333989803806,42383845,sell,9682.61,0.168 -binance-futures,BTCUSDT,1582333998168000,1582333998297805,42383846,sell,9680.99,0.069 -binance-futures,BTCUSDT,1582333999074000,1582333999201850,42383847,sell,9680.68,0.108 -binance-futures,BTCUSDT,1582334003665000,1582334003794533,42383848,sell,9679.62,0.001 -binance-futures,BTCUSDT,1582334003783000,1582334003911451,42383849,buy,9681.06,0.206 -binance-futures,BTCUSDT,1582334005346000,1582334005473772,42383850,buy,9680.57,0.031 -binance-futures,BTCUSDT,1582334005346000,1582334005473863,42383851,buy,9680.58,0.031 -binance-futures,BTCUSDT,1582334005346000,1582334005477075,42383852,buy,9680.59,0.031 -binance-futures,BTCUSDT,1582334005346000,1582334005481896,42383853,buy,9680.6,0.031 -binance-futures,BTCUSDT,1582334005346000,1582334005483305,42383854,buy,9681.21,0.04 -binance-futures,BTCUSDT,1582334005346000,1582334005484364,42383855,buy,9681.38,0.248 -binance-futures,BTCUSDT,1582334005504000,1582334005634697,42383856,buy,9681.33,0.031 -binance-futures,BTCUSDT,1582334005504000,1582334005634707,42383857,buy,9681.33,0.005 -binance-futures,BTCUSDT,1582334005504000,1582334005642450,42383858,buy,9681.34,0.031 -binance-futures,BTCUSDT,1582334005504000,1582334005642457,42383859,buy,9681.35,0.031 -binance-futures,BTCUSDT,1582334005504000,1582334005644376,42383860,buy,9681.36,0.031 -binance-futures,BTCUSDT,1582334005504000,1582334005644897,42383861,buy,9681.38,0.037 -binance-futures,BTCUSDT,1582334010826000,1582334010951440,42383862,sell,9679.87,0.006 -binance-futures,BTCUSDT,1582334014935000,1582334015060838,42383863,sell,9679.92,0.031 -binance-futures,BTCUSDT,1582334014935000,1582334015069726,42383864,sell,9679.91,0.031 -binance-futures,BTCUSDT,1582334014935000,1582334015069741,42383865,sell,9679.9,0.031 -binance-futures,BTCUSDT,1582334014935000,1582334015074767,42383866,sell,9679.88,0.207 -binance-futures,BTCUSDT,1582334025388000,1582334025541723,42383867,sell,9680.25,0.002 -binance-futures,BTCUSDT,1582334030544000,1582334030675611,42383868,sell,9680.3,0.001 -binance-futures,BTCUSDT,1582334031100000,1582334031228631,42383869,buy,9681.13,0.001 -binance-futures,BTCUSDT,1582334033463000,1582334033592933,42383870,buy,9680.7,0.012 -binance-futures,BTCUSDT,1582334033463000,1582334033597071,42383871,buy,9680.73,0.031 -binance-futures,BTCUSDT,1582334033463000,1582334033602839,42383872,buy,9680.74,0.007 -binance-futures,BTCUSDT,1582334037952000,1582334038082804,42383873,buy,9680.48,0.031 -binance-futures,BTCUSDT,1582334037952000,1582334038083391,42383874,buy,9680.49,0.031 -binance-futures,BTCUSDT,1582334037952000,1582334038091973,42383875,buy,9680.5,0.031 -binance-futures,BTCUSDT,1582334037952000,1582334038094773,42383876,buy,9680.51,0.024 -binance-futures,BTCUSDT,1582334037952000,1582334038094793,42383877,buy,9680.54,0.361 -binance-futures,BTCUSDT,1582334041639000,1582334041765025,42383878,sell,9680.37,0.001 -binance-futures,BTCUSDT,1582334045672000,1582334045803928,42383879,buy,9680.38,4.72 -binance-futures,BTCUSDT,1582334045672000,1582334045805742,42383880,buy,9680.82,0.1 -binance-futures,BTCUSDT,1582334045672000,1582334045813696,42383881,buy,9681.16,0.575 -binance-futures,BTCUSDT,1582334045672000,1582334045813704,42383882,buy,9681.16,0.575 -binance-futures,BTCUSDT,1582334045672000,1582334045815476,42383883,buy,9681.51,0.64 -binance-futures,BTCUSDT,1582334046454000,1582334046620531,42383884,sell,9680.75,0.031 -binance-futures,BTCUSDT,1582334046454000,1582334046620535,42383885,sell,9680.74,0.031 -binance-futures,BTCUSDT,1582334046454000,1582334046620581,42383886,sell,9680.73,0.031 -binance-futures,BTCUSDT,1582334046454000,1582334046620588,42383887,sell,9680.72,0.007 -binance-futures,BTCUSDT,1582334047121000,1582334047251267,42383888,sell,9680,0.05 -binance-futures,BTCUSDT,1582334047121000,1582334047251272,42383889,sell,9680,0.35 -binance-futures,BTCUSDT,1582334049248000,1582334049380078,42383890,buy,9680.9,0.1 -binance-futures,BTCUSDT,1582334052343000,1582334052473208,42383891,buy,9680.84,0.1 -binance-futures,BTCUSDT,1582334052343000,1582334052479739,42383892,buy,9680.9,0.4 -binance-futures,BTCUSDT,1582334057563000,1582334057694097,42383893,sell,9680,0.1 -binance-futures,BTCUSDT,1582334070115000,1582334070242531,42383894,sell,9680,0.1 -binance-futures,BTCUSDT,1582334073475000,1582334073603821,42383895,sell,9680,0.67 -binance-futures,BTCUSDT,1582334073560000,1582334073686790,42383896,sell,9680,0.67 -binance-futures,BTCUSDT,1582334076519000,1582334076648476,42383897,sell,9680,0.01 -binance-futures,BTCUSDT,1582334076545000,1582334076673299,42383898,sell,9680,0.26 -binance-futures,BTCUSDT,1582334076547000,1582334076677534,42383899,sell,9680,0.72 -binance-futures,BTCUSDT,1582334076547000,1582334076684089,42383900,sell,9680,0.231 -binance-futures,BTCUSDT,1582334076547000,1582334076684096,42383901,sell,9680,0.489 -binance-futures,BTCUSDT,1582334076592000,1582334076719827,42383902,sell,9680,0.01 -binance-futures,BTCUSDT,1582334076597000,1582334076725661,42383903,sell,9680,0.501 -binance-futures,BTCUSDT,1582334076597000,1582334076725916,42383904,sell,9680,0.1 -binance-futures,BTCUSDT,1582334076597000,1582334076726172,42383905,sell,9679.62,0.08 -binance-futures,BTCUSDT,1582334076647000,1582334076782323,42383906,sell,9679.39,0.5 -binance-futures,BTCUSDT,1582334076647000,1582334076782330,42383907,sell,9679.33,0.04 -binance-futures,BTCUSDT,1582334076944000,1582334077073498,42383908,sell,9678.59,0.047 -binance-futures,BTCUSDT,1582334076944000,1582334077073507,42383909,sell,9678.55,0.025 -binance-futures,BTCUSDT,1582334076944000,1582334077081147,42383910,sell,9678.5,0.282 -binance-futures,BTCUSDT,1582334078500000,1582334078624852,42383911,sell,9678.5,0.02 -binance-futures,BTCUSDT,1582334079103000,1582334079232429,42383912,buy,9678.51,0.1 -binance-futures,BTCUSDT,1582334085390000,1582334085525868,42383913,buy,9678.51,0.011 -binance-futures,BTCUSDT,1582334086821000,1582334086951910,42383914,sell,9678.5,0.058 -binance-futures,BTCUSDT,1582334089426000,1582334089553232,42383915,sell,9678.5,0.64 -binance-futures,BTCUSDT,1582334089426000,1582334089553239,42383916,sell,9678.5,0.028 -binance-futures,BTCUSDT,1582334089426000,1582334089553756,42383917,sell,9678.5,0.332 -binance-futures,BTCUSDT,1582334089992000,1582334090120648,42383918,buy,9678.51,1.111 -binance-futures,BTCUSDT,1582334090242000,1582334090373269,42383919,buy,9678.51,2.333 -binance-futures,BTCUSDT,1582334092210000,1582334092334833,42383920,sell,9678.48,0.031 -binance-futures,BTCUSDT,1582334092210000,1582334092335140,42383921,sell,9678.47,0.031 -binance-futures,BTCUSDT,1582334092210000,1582334092339718,42383922,sell,9678.46,0.031 -binance-futures,BTCUSDT,1582334092210000,1582334092343298,42383923,sell,9678.45,0.031 -binance-futures,BTCUSDT,1582334092210000,1582334092346270,42383924,sell,9678.43,0.097 -binance-futures,BTCUSDT,1582334100058000,1582334100189874,42383925,buy,9678.75,0.303 -binance-futures,BTCUSDT,1582334103486000,1582334103610553,42383926,sell,9678.43,0.011 -binance-futures,BTCUSDT,1582334105612000,1582334105741930,42383927,sell,9678.43,0.011 -binance-futures,BTCUSDT,1582334106000000,1582334106131123,42383928,sell,9678.43,0.33 -binance-futures,BTCUSDT,1582334106030000,1582334106158511,42383929,sell,9678.43,2.295 -binance-futures,BTCUSDT,1582334106030000,1582334106158797,42383930,sell,9678.33,0.024 -binance-futures,BTCUSDT,1582334106085000,1582334106218734,42383931,sell,9678.09,0.071 -binance-futures,BTCUSDT,1582334106092000,1582334106223550,42383932,sell,9678,0.01 -binance-futures,BTCUSDT,1582334106092000,1582334106223556,42383933,sell,9678,0.05 -binance-futures,BTCUSDT,1582334106092000,1582334106228486,42383934,sell,9677.91,0.011 -binance-futures,BTCUSDT,1582334106092000,1582334106228493,42383935,sell,9677.91,0.001 -binance-futures,BTCUSDT,1582334106092000,1582334106228501,42383936,sell,9677.74,0.047 -binance-futures,BTCUSDT,1582334106092000,1582334106228507,42383937,sell,9677.19,0.82 -binance-futures,BTCUSDT,1582334107009000,1582334107136786,42383938,buy,9677.23,0.001 -binance-futures,BTCUSDT,1582334107551000,1582334107682459,42383939,sell,9677,0.003 -binance-futures,BTCUSDT,1582334107551000,1582334107682469,42383940,sell,9677,0.091 -binance-futures,BTCUSDT,1582334107551000,1582334107682683,42383941,sell,9676.97,0.909 -binance-futures,BTCUSDT,1582334108222000,1582334108376713,42383942,sell,9676.97,0.001 -binance-futures,BTCUSDT,1582334111382000,1582334111513102,42383943,sell,9676.97,0.787 -binance-futures,BTCUSDT,1582334113432000,1582334113560811,42383944,buy,9677,0.031 -binance-futures,BTCUSDT,1582334113432000,1582334113561254,42383945,buy,9677.01,0.031 -binance-futures,BTCUSDT,1582334113432000,1582334113570061,42383946,buy,9677.02,0.031 -binance-futures,BTCUSDT,1582334113432000,1582334113570079,42383947,buy,9677.03,0.031 -binance-futures,BTCUSDT,1582334113432000,1582334113577706,42383948,buy,9677.9,0.001 -binance-futures,BTCUSDT,1582334113432000,1582334113577714,42383949,buy,9677.9,0.01 -binance-futures,BTCUSDT,1582334113432000,1582334113577726,42383950,buy,9677.91,2.18 -binance-futures,BTCUSDT,1582334113777000,1582334113905291,42383951,buy,9677.96,0.002 -binance-futures,BTCUSDT,1582334113878000,1582334114007995,42383952,sell,9677.95,0.62 -binance-futures,BTCUSDT,1582334113879000,1582334114008127,42383953,sell,9677.95,0.165 -binance-futures,BTCUSDT,1582334113879000,1582334114008281,42383954,sell,9676.99,0.01 -binance-futures,BTCUSDT,1582334113879000,1582334114011024,42383955,sell,9676.99,0.003 -binance-futures,BTCUSDT,1582334113879000,1582334114011030,42383956,sell,9676.98,2.488 -binance-futures,BTCUSDT,1582334113884000,1582334114016552,42383957,sell,9676.98,0.112 -binance-futures,BTCUSDT,1582334113884000,1582334114016596,42383958,sell,9676.98,0.508 -binance-futures,BTCUSDT,1582334114619000,1582334114748167,42383959,buy,9677.42,0.001 -binance-futures,BTCUSDT,1582334117158000,1582334117289143,42383960,sell,9676.81,0.96 -binance-futures,BTCUSDT,1582334119843000,1582334119974947,42383961,buy,9676.37,0.1 -binance-futures,BTCUSDT,1582334119843000,1582334119975185,42383962,buy,9677.29,0.429 -binance-futures,BTCUSDT,1582334119844000,1582334119984992,42383963,buy,9677.33,0.003 -binance-futures,BTCUSDT,1582334119844000,1582334119984999,42383964,buy,9677.34,0.011 -binance-futures,BTCUSDT,1582334119844000,1582334119985002,42383965,buy,9677.34,0.457 -binance-futures,BTCUSDT,1582334119955000,1582334120081851,42383966,sell,9676.27,0.501 -binance-futures,BTCUSDT,1582334120192000,1582334120320836,42383967,buy,9676.84,0.001 -binance-futures,BTCUSDT,1582334122390000,1582334122518925,42383968,buy,9676.47,0.031 -binance-futures,BTCUSDT,1582334122390000,1582334122519455,42383969,buy,9676.48,0.031 -binance-futures,BTCUSDT,1582334122390000,1582334122523574,42383970,buy,9676.49,0.031 -binance-futures,BTCUSDT,1582334122390000,1582334122523587,42383971,buy,9676.5,0.007 -binance-futures,BTCUSDT,1582334123457000,1582334123581502,42383972,sell,9676.32,0.001 -binance-futures,BTCUSDT,1582334136051000,1582334136179670,42383973,sell,9676.34,0.031 -binance-futures,BTCUSDT,1582334136051000,1582334136179680,42383974,sell,9676.33,0.005 -binance-futures,BTCUSDT,1582334138803000,1582334138928711,42383975,sell,9676.32,0.031 -binance-futures,BTCUSDT,1582334138803000,1582334138928877,42383976,sell,9676.31,0.031 -binance-futures,BTCUSDT,1582334138803000,1582334138937058,42383977,sell,9676.27,0.18 -binance-futures,BTCUSDT,1582334138803000,1582334138939236,42383978,sell,9676.25,0.012 -binance-futures,BTCUSDT,1582334138803000,1582334138940956,42383979,sell,9676.16,0.131 -binance-futures,BTCUSDT,1582334148461000,1582334148589905,42383980,sell,9676.35,0.031 -binance-futures,BTCUSDT,1582334148461000,1582334148596722,42383981,sell,9676.34,0.031 -binance-futures,BTCUSDT,1582334148461000,1582334148596732,42383982,sell,9676.33,0.031 -binance-futures,BTCUSDT,1582334148461000,1582334148600790,42383983,sell,9676.32,0.031 -binance-futures,BTCUSDT,1582334148461000,1582334148601872,42383984,sell,9676.3,0.704 -binance-futures,BTCUSDT,1582334148882000,1582334149011949,42383985,buy,9676.13,0.031 -binance-futures,BTCUSDT,1582334148882000,1582334149011961,42383986,buy,9676.13,0.969 -binance-futures,BTCUSDT,1582334153152000,1582334153276750,42383987,sell,9676.12,0.005 -binance-futures,BTCUSDT,1582334154904000,1582334155032020,42383988,buy,9676.13,0.031 -binance-futures,BTCUSDT,1582334154904000,1582334155032757,42383989,buy,9676.14,0.031 -binance-futures,BTCUSDT,1582334154904000,1582334155032766,42383990,buy,9676.15,0.031 -binance-futures,BTCUSDT,1582334154904000,1582334155042682,42383991,buy,9676.16,0.017 -binance-futures,BTCUSDT,1582334159550000,1582334159677370,42383992,buy,9676.13,0.02 -binance-futures,BTCUSDT,1582334160829000,1582334160956028,42383993,buy,9676.13,0.25 -binance-futures,BTCUSDT,1582334162374000,1582334162502993,42383994,buy,9676.13,0.03 -binance-futures,BTCUSDT,1582334166052000,1582334166185027,42383995,sell,9676.12,0.035 -binance-futures,BTCUSDT,1582334166052000,1582334166185037,42383996,sell,9676,0.095 -binance-futures,BTCUSDT,1582334166052000,1582334166191220,42383997,sell,9676,4.905 -binance-futures,BTCUSDT,1582334166052000,1582334166191227,42383998,sell,9676,1.198 -binance-futures,BTCUSDT,1582334166052000,1582334166191230,42383999,sell,9676,0.152 -binance-futures,BTCUSDT,1582334166052000,1582334166197910,42384000,sell,9675.81,0.006 -binance-futures,BTCUSDT,1582334166052000,1582334166202740,42384001,sell,9675.63,0.062 -binance-futures,BTCUSDT,1582334166052000,1582334166205245,42384002,sell,9675.45,0.04 -binance-futures,BTCUSDT,1582334166052000,1582334166206913,42384003,sell,9675.32,0.002 -binance-futures,BTCUSDT,1582334166052000,1582334166208137,42384004,sell,9675.29,0.004 -binance-futures,BTCUSDT,1582334166052000,1582334166488104,42384005,sell,9675.21,0.006 -binance-futures,BTCUSDT,1582334166052000,1582334166488111,42384006,sell,9675.06,0.038 -binance-futures,BTCUSDT,1582334166052000,1582334166488132,42384007,sell,9675,0.5 -binance-futures,BTCUSDT,1582334166052000,1582334166488139,42384008,sell,9675,1 -binance-futures,BTCUSDT,1582334166052000,1582334166488145,42384009,sell,9675,0.012 -binance-futures,BTCUSDT,1582334166052000,1582334166488150,42384010,sell,9675,0.178 -binance-futures,BTCUSDT,1582334166052000,1582334166488156,42384011,sell,9675,0.03 -binance-futures,BTCUSDT,1582334170406000,1582334170532980,42384012,buy,9675.37,0.001 -binance-futures,BTCUSDT,1582334170406000,1582334170532986,42384013,buy,9675.38,0.002 -binance-futures,BTCUSDT,1582334172732000,1582334172862090,42384014,sell,9675,0.167 -binance-futures,BTCUSDT,1582334174466000,1582334174593794,42384015,sell,9675,0.081 -binance-futures,BTCUSDT,1582334174466000,1582334174594086,42384016,sell,9675,0.07 -binance-futures,BTCUSDT,1582334174466000,1582334174594621,42384017,sell,9675,0.328 -binance-futures,BTCUSDT,1582334174484000,1582334174614867,42384018,sell,9675,0.1 -binance-futures,BTCUSDT,1582334174496000,1582334174625273,42384019,sell,9675,0.345 -binance-futures,BTCUSDT,1582334174508000,1582334174634934,42384020,sell,9675,0.227 -binance-futures,BTCUSDT,1582334174508000,1582334174635041,42384021,sell,9675,0.05 -binance-futures,BTCUSDT,1582334174508000,1582334174635097,42384022,sell,9675,0.322 -binance-futures,BTCUSDT,1582334174529000,1582334174658934,42384023,sell,9674.93,0.04 -binance-futures,BTCUSDT,1582334174531000,1582334174667225,42384024,sell,9674.12,0.011 -binance-futures,BTCUSDT,1582334174531000,1582334174667235,42384025,sell,9674.12,0.003 -binance-futures,BTCUSDT,1582334174531000,1582334174668032,42384026,sell,9673.95,0.002 -binance-futures,BTCUSDT,1582334174539000,1582334174675061,42384027,sell,9673.79,0.04 -binance-futures,BTCUSDT,1582334174539000,1582334174675839,42384028,sell,9673.67,0.002 -binance-futures,BTCUSDT,1582334174539000,1582334174676753,42384029,sell,9673.67,0.08 -binance-futures,BTCUSDT,1582334174552000,1582334174685177,42384030,buy,9674.94,0.099 -binance-futures,BTCUSDT,1582334174552000,1582334174685191,42384031,buy,9675,0.084 -binance-futures,BTCUSDT,1582334174556000,1582334174693524,42384032,sell,9673.62,0.511 -binance-futures,BTCUSDT,1582334174572000,1582334174702687,42384033,sell,9673.62,0.056 -binance-futures,BTCUSDT,1582334174577000,1582334174706707,42384034,sell,9673.62,0.433 -binance-futures,BTCUSDT,1582334174577000,1582334174706713,42384035,sell,9673.13,0.1 -binance-futures,BTCUSDT,1582334174577000,1582334174709089,42384036,sell,9673.04,0.002 -binance-futures,BTCUSDT,1582334174577000,1582334174710175,42384037,sell,9673,1 -binance-futures,BTCUSDT,1582334174607000,1582334174744276,42384038,sell,9672.79,0.047 -binance-futures,BTCUSDT,1582334174628000,1582334174763758,42384039,sell,9672.99,0.1 -binance-futures,BTCUSDT,1582334174628000,1582334174765847,42384040,sell,9672.8,0.147 -binance-futures,BTCUSDT,1582334174662000,1582334174798313,42384041,sell,9672.8,0.67 -binance-futures,BTCUSDT,1582334174693000,1582334174828830,42384042,sell,9672.69,0.006 -binance-futures,BTCUSDT,1582334174727000,1582334174861957,42384043,sell,9672.44,0.001 -binance-futures,BTCUSDT,1582334174797000,1582334174929210,42384044,sell,9672.27,0.001 -binance-futures,BTCUSDT,1582334174889000,1582334175027117,42384045,sell,9672.08,0.012 -binance-futures,BTCUSDT,1582334174960000,1582334175097316,42384046,sell,9672,0.01 -binance-futures,BTCUSDT,1582334174960000,1582334175106258,42384047,sell,9671.91,0.047 -binance-futures,BTCUSDT,1582334174960000,1582334175109103,42384048,sell,9671.8,0.006 -binance-futures,BTCUSDT,1582334174960000,1582334175395704,42384049,sell,9671.54,0.002 -binance-futures,BTCUSDT,1582334174960000,1582334175395731,42384050,sell,9671.43,0.25 -binance-futures,BTCUSDT,1582334174960000,1582334175395738,42384051,sell,9671.42,0.006 -binance-futures,BTCUSDT,1582334174960000,1582334175395741,42384052,sell,9671.42,0.1 -binance-futures,BTCUSDT,1582334174960000,1582334175395752,42384053,sell,9671.18,0.006 -binance-futures,BTCUSDT,1582334174960000,1582334175395758,42384054,sell,9671,0.1 -binance-futures,BTCUSDT,1582334174960000,1582334175395762,42384055,sell,9671,0.032 -binance-futures,BTCUSDT,1582334174960000,1582334175395772,42384056,sell,9670.75,0.04 -binance-futures,BTCUSDT,1582334174960000,1582334175395779,42384057,sell,9670.71,0.009 -binance-futures,BTCUSDT,1582334174960000,1582334175395782,42384058,sell,9670.71,0.01 -binance-futures,BTCUSDT,1582334174960000,1582334175395785,42384059,sell,9670.71,0.004 -binance-futures,BTCUSDT,1582334174960000,1582334175395788,42384060,sell,9670.71,0.004 -binance-futures,BTCUSDT,1582334174960000,1582334175395792,42384061,sell,9670.71,0.003 -binance-futures,BTCUSDT,1582334174960000,1582334175395795,42384062,sell,9670.71,0.071 -binance-futures,BTCUSDT,1582334174960000,1582334175395798,42384063,sell,9670.71,0.006 -binance-futures,BTCUSDT,1582334174960000,1582334175395801,42384064,sell,9670.71,0.005 -binance-futures,BTCUSDT,1582334174960000,1582334175395804,42384065,sell,9670.71,0.011 -binance-futures,BTCUSDT,1582334174960000,1582334175395807,42384066,sell,9670.71,0.004 -binance-futures,BTCUSDT,1582334174960000,1582334175395810,42384067,sell,9670.71,0.007 -binance-futures,BTCUSDT,1582334174960000,1582334175395813,42384068,sell,9670.71,0.017 -binance-futures,BTCUSDT,1582334174960000,1582334175395817,42384069,sell,9670.71,0.008 -binance-futures,BTCUSDT,1582334174960000,1582334175395820,42384070,sell,9670.71,0.003 -binance-futures,BTCUSDT,1582334174960000,1582334175395823,42384071,sell,9670.71,0.001 -binance-futures,BTCUSDT,1582334174960000,1582334175395834,42384072,sell,9670.5,0.079 -binance-futures,BTCUSDT,1582334174960000,1582334175396713,42384073,sell,9670.46,0.58 -binance-futures,BTCUSDT,1582334174960000,1582334175396730,42384074,sell,9670.45,0.012 -binance-futures,BTCUSDT,1582334174960000,1582334175396743,42384075,sell,9670.37,0.891 -binance-futures,BTCUSDT,1582334174960000,1582334175396746,42384076,sell,9670.37,0.254 -binance-futures,BTCUSDT,1582334174960000,1582334175396752,42384077,sell,9670.01,0.001 -binance-futures,BTCUSDT,1582334174960000,1582334175396759,42384078,sell,9670,0.001 -binance-futures,BTCUSDT,1582334174960000,1582334175396762,42384079,sell,9670,0.038 -binance-futures,BTCUSDT,1582334174960000,1582334175396765,42384080,sell,9670,0.54 -binance-futures,BTCUSDT,1582334174960000,1582334175396768,42384081,sell,9670,0.364 -binance-futures,BTCUSDT,1582334174960000,1582334175396771,42384082,sell,9670,1 -binance-futures,BTCUSDT,1582334174960000,1582334175396774,42384083,sell,9670,0.312 -binance-futures,BTCUSDT,1582334174960000,1582334175396779,42384084,sell,9670,0.011 -binance-futures,BTCUSDT,1582334174960000,1582334175396782,42384085,sell,9670,0.014 -binance-futures,BTCUSDT,1582334174960000,1582334175396785,42384086,sell,9670,0.05 -binance-futures,BTCUSDT,1582334174960000,1582334175396793,42384087,sell,9670,0.025 -binance-futures,BTCUSDT,1582334174960000,1582334175396796,42384088,sell,9670,0.001 -binance-futures,BTCUSDT,1582334174960000,1582334175396802,42384089,sell,9669.97,0.005 -binance-futures,BTCUSDT,1582334174960000,1582334175396805,42384090,sell,9669.96,1.512 -binance-futures,BTCUSDT,1582334174960000,1582334175396815,42384091,sell,9669.93,0.037 -binance-futures,BTCUSDT,1582334174960000,1582334175396822,42384092,sell,9669.9,0.04 -binance-futures,BTCUSDT,1582334174960000,1582334175396828,42384093,sell,9669.43,2.277 -binance-futures,BTCUSDT,1582334174960000,1582334175396834,42384094,sell,9669.41,0.065 -binance-futures,BTCUSDT,1582334174960000,1582334175396840,42384095,sell,9669,0.1 -binance-futures,BTCUSDT,1582334174960000,1582334175396843,42384096,sell,9669,0.1 -binance-futures,BTCUSDT,1582334174960000,1582334175396846,42384097,sell,9669,0.001 -binance-futures,BTCUSDT,1582334174960000,1582334175396850,42384098,sell,9669,0.4 -binance-futures,BTCUSDT,1582334174960000,1582334175396856,42384099,sell,9668.96,0.538 -binance-futures,BTCUSDT,1582334174960000,1582334175396859,42384100,sell,9668.96,0.1 -binance-futures,BTCUSDT,1582334174960000,1582334175396862,42384101,sell,9668.96,0.1 -binance-futures,BTCUSDT,1582334175101000,1582334175400582,42384102,sell,9669.07,0.004 -binance-futures,BTCUSDT,1582334175554000,1582334175685188,42384103,buy,9669.89,0.08 -binance-futures,BTCUSDT,1582334175660000,1582334175802629,42384104,buy,9669.89,0.006 -binance-futures,BTCUSDT,1582334175674000,1582334175811163,42384105,buy,9669.89,0.001 -binance-futures,BTCUSDT,1582334175692000,1582334175829622,42384106,buy,9669.89,0.001 -binance-futures,BTCUSDT,1582334175941000,1582334176078431,42384107,sell,9669.88,0.022 -binance-futures,BTCUSDT,1582334176645000,1582334176778508,42384108,sell,9669.88,0.002 -binance-futures,BTCUSDT,1582334177726000,1582334177857869,42384109,sell,9669.88,0.038 -binance-futures,BTCUSDT,1582334179947000,1582334180076892,42384110,buy,9669.89,0.111 -binance-futures,BTCUSDT,1582334179947000,1582334180081845,42384111,buy,9670,0.007 -binance-futures,BTCUSDT,1582334179947000,1582334180086544,42384112,buy,9670.88,0.486 -binance-futures,BTCUSDT,1582334179947000,1582334180086549,42384113,buy,9670.9,0.396 -binance-futures,BTCUSDT,1582334183411000,1582334183539872,42384114,sell,9670.29,0.03 -binance-futures,BTCUSDT,1582334185513000,1582334185641297,42384115,sell,9670.89,0.01 -binance-futures,BTCUSDT,1582334186317000,1582334186459820,42384116,sell,9670.89,0.205 -binance-futures,BTCUSDT,1582334186317000,1582334186459826,42384117,sell,9670.88,0.795 -binance-futures,BTCUSDT,1582334191666000,1582334191795954,42384118,sell,9670.11,0.001 -binance-futures,BTCUSDT,1582334192700000,1582334192832632,42384119,sell,9670.39,0.031 -binance-futures,BTCUSDT,1582334192700000,1582334192834651,42384120,sell,9670.38,0.031 -binance-futures,BTCUSDT,1582334192700000,1582334192843712,42384121,sell,9670.37,0.031 -binance-futures,BTCUSDT,1582334192700000,1582334192854738,42384122,sell,9670.35,0.013 -binance-futures,BTCUSDT,1582334194532000,1582334194663940,42384123,buy,9670.9,0.02 -binance-futures,BTCUSDT,1582334194661000,1582334194792685,42384124,buy,9670.9,0.348 -binance-futures,BTCUSDT,1582334194661000,1582334194792695,42384125,buy,9670.9,0.005 -binance-futures,BTCUSDT,1582334194661000,1582334194792699,42384126,buy,9671.14,1.647 -binance-futures,BTCUSDT,1582334195820000,1582334195950050,42384127,sell,9671.03,0.153 -binance-futures,BTCUSDT,1582334195992000,1582334196129958,42384128,buy,9671.14,2.244 -binance-futures,BTCUSDT,1582334195992000,1582334196129961,42384129,buy,9671.69,0.1 -binance-futures,BTCUSDT,1582334195992000,1582334196131947,42384130,buy,9672.38,0.367 -binance-futures,BTCUSDT,1582334195992000,1582334196131956,42384131,buy,9672.39,0.289 -binance-futures,BTCUSDT,1582334197262000,1582334197394354,42384132,buy,9671.18,0.25 -binance-futures,BTCUSDT,1582334197995000,1582334198128322,42384133,sell,9670.99,0.055 -binance-futures,BTCUSDT,1582334199044000,1582334199174673,42384134,sell,9671.17,0.038 -binance-futures,BTCUSDT,1582334199044000,1582334199174683,42384135,sell,9671.17,1.048 -binance-futures,BTCUSDT,1582334199057000,1582334199188432,42384136,sell,9671.17,0.538 -binance-futures,BTCUSDT,1582334201693000,1582334201822758,42384137,buy,9670.89,0.1 -binance-futures,BTCUSDT,1582334201693000,1582334201826804,42384138,buy,9670.9,0.005 -binance-futures,BTCUSDT,1582334201693000,1582334201827536,42384139,buy,9670.9,0.003 -binance-futures,BTCUSDT,1582334204925000,1582334205054674,42384140,buy,9670.9,0.002 -binance-futures,BTCUSDT,1582334204925000,1582334205055199,42384141,buy,9671.18,0.018 -binance-futures,BTCUSDT,1582334205299000,1582334205432517,42384142,sell,9671.17,0.03 -binance-futures,BTCUSDT,1582334207622000,1582334207747992,42384143,sell,9670.91,0.031 -binance-futures,BTCUSDT,1582334207622000,1582334207748260,42384144,sell,9670.9,0.031 -binance-futures,BTCUSDT,1582334207622000,1582334207751772,42384145,sell,9670.89,0.031 -binance-futures,BTCUSDT,1582334207622000,1582334207755011,42384146,sell,9670.86,0.031 -binance-futures,BTCUSDT,1582334207622000,1582334207760706,42384147,sell,9670.85,0.031 -binance-futures,BTCUSDT,1582334207622000,1582334207763321,42384148,sell,9670.84,0.031 -binance-futures,BTCUSDT,1582334207622000,1582334207765003,42384149,sell,9670.25,0.791 -binance-futures,BTCUSDT,1582334207622000,1582334207765009,42384150,sell,9670.18,0.544 -binance-futures,BTCUSDT,1582334207622000,1582334207765650,42384151,sell,9670.18,0.544 -binance-futures,BTCUSDT,1582334207622000,1582334207766653,42384152,sell,9670.11,3 -binance-futures,BTCUSDT,1582334208559000,1582334208687923,42384153,buy,9670,0.007 -binance-futures,BTCUSDT,1582334208785000,1582334208911770,42384154,buy,9670,1 -binance-futures,BTCUSDT,1582334209785000,1582334209910930,42384155,buy,9670,0.01 -binance-futures,BTCUSDT,1582334214110000,1582334214238494,42384156,sell,9669.92,0.8 -binance-futures,BTCUSDT,1582334218309000,1582334218449231,42384157,sell,9669.92,0.383 -binance-futures,BTCUSDT,1582334218320000,1582334218452865,42384158,sell,9669.92,1.613 -binance-futures,BTCUSDT,1582334218415000,1582334218540978,42384159,sell,9669.92,0.383 -binance-futures,BTCUSDT,1582334222613000,1582334222747967,42384160,sell,9669.88,0.682 -binance-futures,BTCUSDT,1582334222613000,1582334222747977,42384161,sell,9669.87,0.25 -binance-futures,BTCUSDT,1582334222613000,1582334222751556,42384162,sell,9669.87,2.627 -binance-futures,BTCUSDT,1582334222613000,1582334222751606,42384163,sell,9669.87,0.22 -binance-futures,BTCUSDT,1582334222613000,1582334222751610,42384164,sell,9669.87,0.221 -binance-futures,BTCUSDT,1582334223120000,1582334223252670,42384165,buy,9669.81,0.005 -binance-futures,BTCUSDT,1582334225188000,1582334225316452,42384166,buy,9669.73,0.031 -binance-futures,BTCUSDT,1582334225188000,1582334225322790,42384167,buy,9669.74,0.031 -binance-futures,BTCUSDT,1582334225188000,1582334225322808,42384168,buy,9669.75,0.031 -binance-futures,BTCUSDT,1582334225188000,1582334225322811,42384169,buy,9669.76,0.031 -binance-futures,BTCUSDT,1582334225266000,1582334225394244,42384170,buy,9669.68,0.031 -binance-futures,BTCUSDT,1582334225266000,1582334225397023,42384171,buy,9669.69,0.031 -binance-futures,BTCUSDT,1582334225266000,1582334225407357,42384172,buy,9669.7,0.031 -binance-futures,BTCUSDT,1582334225266000,1582334225414151,42384173,buy,9669.71,0.031 -binance-futures,BTCUSDT,1582334225266000,1582334225414176,42384174,buy,9669.87,3.338 -binance-futures,BTCUSDT,1582334225266000,1582334225416058,42384175,buy,9669.93,0.005 -binance-futures,BTCUSDT,1582334225266000,1582334225416074,42384176,buy,9670,3.533 -binance-futures,BTCUSDT,1582334225288000,1582334225419893,42384177,buy,9670,1.243 -binance-futures,BTCUSDT,1582334225360000,1582334225491189,42384178,buy,9670,0.72 -binance-futures,BTCUSDT,1582334225372000,1582334225504011,42384179,buy,9670,0.67 -binance-futures,BTCUSDT,1582334225471000,1582334225599419,42384180,buy,9670,0.142 -binance-futures,BTCUSDT,1582334225917000,1582334226053643,42384181,buy,9670,0.04 -binance-futures,BTCUSDT,1582334226203000,1582334226623126,42384182,sell,9669.99,0.1 -binance-futures,BTCUSDT,1582334226203000,1582334226623130,42384183,sell,9669.99,0.4 -binance-futures,BTCUSDT,1582334227812000,1582334227940818,42384184,buy,9670,0.696 -binance-futures,BTCUSDT,1582334228949000,1582334229080750,42384185,buy,9670,0.425 -binance-futures,BTCUSDT,1582334229116000,1582334229244783,42384186,buy,9670,0.01 -binance-futures,BTCUSDT,1582334229129000,1582334229258629,42384187,buy,9670,0.01 -binance-futures,BTCUSDT,1582334229189000,1582334229322685,42384188,buy,9670,0.121 -binance-futures,BTCUSDT,1582334229190000,1582334229322693,42384189,buy,9670,6.308 -binance-futures,BTCUSDT,1582334229190000,1582334229322712,42384190,buy,9670,1.76 -binance-futures,BTCUSDT,1582334229190000,1582334229322717,42384191,buy,9670,0.682 -binance-futures,BTCUSDT,1582334229248000,1582334229378543,42384192,buy,9671.17,1.058 -binance-futures,BTCUSDT,1582334229248000,1582334229381550,42384193,buy,9671.7,1.749 -binance-futures,BTCUSDT,1582334229265000,1582334229395611,42384194,buy,9671.7,0.448 -binance-futures,BTCUSDT,1582334229353000,1582334229484786,42384195,buy,9671.7,0.436 -binance-futures,BTCUSDT,1582334229520000,1582334229652349,42384196,buy,9672.58,0.408 -binance-futures,BTCUSDT,1582334229520000,1582334229653935,42384197,buy,9672.58,0.148 -binance-futures,BTCUSDT,1582334230661000,1582334230791743,42384198,buy,9672.58,0.1 -binance-futures,BTCUSDT,1582334230661000,1582334230794489,42384199,buy,9672.83,0.006 -binance-futures,BTCUSDT,1582334231156000,1582334231321462,42384200,buy,9673.04,2.153 -binance-futures,BTCUSDT,1582334231156000,1582334231321484,42384201,buy,9673.48,0.065 -binance-futures,BTCUSDT,1582334231156000,1582334231321489,42384202,buy,9674.67,0.544 -binance-futures,BTCUSDT,1582334231156000,1582334231321495,42384203,buy,9674.67,0.544 -binance-futures,BTCUSDT,1582334231156000,1582334231321500,42384204,buy,9674.68,0.896 -binance-futures,BTCUSDT,1582334231156000,1582334231326659,42384205,buy,9674.76,0.011 -binance-futures,BTCUSDT,1582334231156000,1582334231326665,42384206,buy,9674.76,0.003 -binance-futures,BTCUSDT,1582334231156000,1582334231326671,42384207,buy,9674.77,1.712 -binance-futures,BTCUSDT,1582334231583000,1582334231713844,42384208,buy,9673.91,0.1 -binance-futures,BTCUSDT,1582334231583000,1582334231713965,42384209,buy,9673.91,0.9 -binance-futures,BTCUSDT,1582334234448000,1582334234576151,42384210,buy,9675.23,0.021 -binance-futures,BTCUSDT,1582334236668000,1582334236794782,42384211,buy,9673.91,0.03 -binance-futures,BTCUSDT,1582334238654000,1582334238781776,42384212,buy,9673.91,0.001 -binance-futures,BTCUSDT,1582334241702000,1582334241824645,42384213,sell,9673.9,0.002 -binance-futures,BTCUSDT,1582334242433000,1582334242562546,42384214,buy,9672.9,0.16 -binance-futures,BTCUSDT,1582334252804000,1582334252929531,42384215,buy,9673.7,0.014 -binance-futures,BTCUSDT,1582334252804000,1582334252929631,42384216,buy,9673.71,0.036 -binance-futures,BTCUSDT,1582334255184000,1582334255310625,42384217,buy,9672.96,0.031 -binance-futures,BTCUSDT,1582334255184000,1582334255310646,42384218,buy,9672.97,0.019 -binance-futures,BTCUSDT,1582334256513000,1582334256642079,42384219,sell,9672.99,0.009 -binance-futures,BTCUSDT,1582334257184000,1582334257319313,42384220,buy,9673.82,0.845 -binance-futures,BTCUSDT,1582334265519000,1582334265647858,42384221,buy,9673.29,0.01 -binance-futures,BTCUSDT,1582334265519000,1582334265650328,42384222,buy,9673.66,0.5 -binance-futures,BTCUSDT,1582334267345000,1582334267475270,42384223,sell,9673.69,0.52 -binance-futures,BTCUSDT,1582334267345000,1582334267475285,42384224,sell,9673.69,0.68 -binance-futures,BTCUSDT,1582334267345000,1582334267475291,42384225,sell,9673.69,0.1 -binance-futures,BTCUSDT,1582334267345000,1582334267475297,42384226,sell,9673.15,1 -binance-futures,BTCUSDT,1582334267345000,1582334267481516,42384227,sell,9672.81,0.56 -binance-futures,BTCUSDT,1582334267345000,1582334267484866,42384228,sell,9672.81,0.559 -binance-futures,BTCUSDT,1582334267345000,1582334267484877,42384229,sell,9672.8,0.565 -binance-futures,BTCUSDT,1582334267345000,1582334267484888,42384230,sell,9672.7,0.895 -binance-futures,BTCUSDT,1582334267345000,1582334267486208,42384231,sell,9672.33,0.121 -binance-futures,BTCUSDT,1582334270279000,1582334270406339,42384232,buy,9673.14,0.679 -binance-futures,BTCUSDT,1582334274091000,1582334274218716,42384233,buy,9673.14,0.005 -binance-futures,BTCUSDT,1582334283209000,1582334283347411,42384234,sell,9673.13,0.004 -binance-futures,BTCUSDT,1582334288455000,1582334288584059,42384235,sell,9673.13,0.033 -binance-futures,BTCUSDT,1582334290023000,1582334290149278,42384236,buy,9673.14,0.18 -binance-futures,BTCUSDT,1582334290023000,1582334290151945,42384237,buy,9673.6,0.001 -binance-futures,BTCUSDT,1582334290023000,1582334290156445,42384238,buy,9673.61,0.244 -binance-futures,BTCUSDT,1582334290205000,1582334290346150,42384239,sell,9673.18,0.031 -binance-futures,BTCUSDT,1582334290205000,1582334290355361,42384240,sell,9673.17,0.031 -binance-futures,BTCUSDT,1582334290205000,1582334290355369,42384241,sell,9673.16,0.031 -binance-futures,BTCUSDT,1582334290205000,1582334290355381,42384242,sell,9673.15,0.031 -binance-futures,BTCUSDT,1582334293831000,1582334293961922,42384243,buy,9673.14,0.942 -binance-futures,BTCUSDT,1582334299673000,1582334299800978,42384244,sell,9673.15,0.004 -binance-futures,BTCUSDT,1582334301624000,1582334301750340,42384245,buy,9673.7,0.005 -binance-futures,BTCUSDT,1582334301624000,1582334301751691,42384246,buy,9673.83,0.019 -binance-futures,BTCUSDT,1582334310058000,1582334310188198,42384247,sell,9673.15,0.002 -binance-futures,BTCUSDT,1582334311972000,1582334312098734,42384248,buy,9673.61,4.552 -binance-futures,BTCUSDT,1582334311972000,1582334312102291,42384249,buy,9673.87,0.683 -binance-futures,BTCUSDT,1582334311972000,1582334312102298,42384250,buy,9673.9,0.025 -binance-futures,BTCUSDT,1582334311972000,1582334312105870,42384251,buy,9673.92,0.74 -binance-futures,BTCUSDT,1582334320558000,1582334320686402,42384252,buy,9673.92,0.509 -binance-futures,BTCUSDT,1582334320558000,1582334320686854,42384253,buy,9674,0.167 -binance-futures,BTCUSDT,1582334322342000,1582334322471201,42384254,buy,9674,0.09 -binance-futures,BTCUSDT,1582334323050000,1582334323171853,42384255,buy,9674,0.3 -binance-futures,BTCUSDT,1582334326894000,1582334327023014,42384256,sell,9673.98,0.051 -binance-futures,BTCUSDT,1582334326894000,1582334327027653,42384257,sell,9673.97,0.031 -binance-futures,BTCUSDT,1582334326894000,1582334327032479,42384258,sell,9673.96,0.031 -binance-futures,BTCUSDT,1582334326894000,1582334327032492,42384259,sell,9673.95,0.031 -binance-futures,BTCUSDT,1582334326894000,1582334327037167,42384260,sell,9673.94,0.031 -binance-futures,BTCUSDT,1582334326894000,1582334327040108,42384261,sell,9673.8,0.165 -binance-futures,BTCUSDT,1582334329681000,1582334329811230,42384262,buy,9673.66,0.199 -binance-futures,BTCUSDT,1582334329743000,1582334329874380,42384263,buy,9674,0.443 -binance-futures,BTCUSDT,1582334329922000,1582334330051300,42384264,buy,9674.38,0.68 -binance-futures,BTCUSDT,1582334329928000,1582334330057351,42384265,buy,9674.38,0.74 -binance-futures,BTCUSDT,1582334329939000,1582334330068930,42384266,buy,9674.38,0.66 -binance-futures,BTCUSDT,1582334330155000,1582334330286763,42384267,buy,9674.38,0.01 -binance-futures,BTCUSDT,1582334330161000,1582334330289512,42384268,buy,9674.38,0.01 -binance-futures,BTCUSDT,1582334330318000,1582334330447265,42384269,buy,9674.53,0.01 -binance-futures,BTCUSDT,1582334330355000,1582334330485138,42384270,buy,9674.53,0.897 -binance-futures,BTCUSDT,1582334335355000,1582334335481455,42384271,buy,9675.45,0.03 -binance-futures,BTCUSDT,1582334336936000,1582334337063697,42384272,sell,9675.19,0.031 -binance-futures,BTCUSDT,1582334336936000,1582334337069010,42384273,sell,9675.18,0.031 -binance-futures,BTCUSDT,1582334336936000,1582334337069018,42384274,sell,9675.17,0.031 -binance-futures,BTCUSDT,1582334336936000,1582334337074518,42384275,sell,9675.16,0.02 -binance-futures,BTCUSDT,1582334337421000,1582334337550670,42384276,sell,9675.28,0.031 -binance-futures,BTCUSDT,1582334337421000,1582334337551758,42384277,sell,9675.27,0.031 -binance-futures,BTCUSDT,1582334337421000,1582334337555613,42384278,sell,9675.26,0.031 -binance-futures,BTCUSDT,1582334337421000,1582334337559680,42384279,sell,9675.25,0.02 -binance-futures,BTCUSDT,1582334337421000,1582334337561313,42384280,sell,9675.14,0.05 -binance-futures,BTCUSDT,1582334337421000,1582334337561319,42384281,sell,9674.65,0.144 -binance-futures,BTCUSDT,1582334337421000,1582334337562447,42384282,sell,9674.65,0.145 -binance-futures,BTCUSDT,1582334337421000,1582334337562454,42384283,sell,9673.94,0.048 -binance-futures,BTCUSDT,1582334338280000,1582334338410065,42384284,buy,9675.51,0.013 -binance-futures,BTCUSDT,1582334345010000,1582334345136437,42384285,buy,9675.27,0.031 -binance-futures,BTCUSDT,1582334345010000,1582334345140116,42384286,buy,9675.28,0.017 -binance-futures,BTCUSDT,1582334347310000,1582334347437989,42384287,sell,9674.51,0.003 -binance-futures,BTCUSDT,1582334347310000,1582334347437997,42384288,sell,9674.5,0.017 -binance-futures,BTCUSDT,1582334353491000,1582334353617400,42384289,sell,9674.52,0.001 -binance-futures,BTCUSDT,1582334353491000,1582334353617419,42384290,sell,9674.51,0.412 -binance-futures,BTCUSDT,1582334354726000,1582334354853607,42384291,sell,9674.51,0.27 -binance-futures,BTCUSDT,1582334354726000,1582334354858589,42384292,sell,9673.76,0.5 -binance-futures,BTCUSDT,1582334354726000,1582334354858712,42384293,sell,9673.74,0.1 -binance-futures,BTCUSDT,1582334354726000,1582334354861634,42384294,sell,9673.55,2.309 -binance-futures,BTCUSDT,1582334354726000,1582334354871638,42384295,sell,9673.54,0.008 -binance-futures,BTCUSDT,1582334354726000,1582334354871662,42384296,sell,9673.52,0.455 -binance-futures,BTCUSDT,1582334354726000,1582334354871666,42384297,sell,9673.52,0.455 -binance-futures,BTCUSDT,1582334354726000,1582334354874105,42384298,sell,9673.45,0.25 -binance-futures,BTCUSDT,1582334354726000,1582334354874120,42384299,sell,9673.41,0.217 -binance-futures,BTCUSDT,1582334354726000,1582334354874124,42384300,sell,9673.18,0.436 -binance-futures,BTCUSDT,1582334357563000,1582334357691019,42384301,buy,9674.48,0.004 -binance-futures,BTCUSDT,1582334363746000,1582334363870261,42384302,sell,9673.71,0.014 -binance-futures,BTCUSDT,1582334370324000,1582334370458442,42384303,sell,9674.04,0.031 -binance-futures,BTCUSDT,1582334370324000,1582334370458450,42384304,sell,9674.03,0.031 -binance-futures,BTCUSDT,1582334370324000,1582334370466014,42384305,sell,9674.02,0.031 -binance-futures,BTCUSDT,1582334370324000,1582334370466909,42384306,sell,9674.01,0.014 -binance-futures,BTCUSDT,1582334370324000,1582334370466915,42384307,sell,9673.97,0.025 -binance-futures,BTCUSDT,1582334371061000,1582334371188515,42384308,buy,9674.83,0.031 -binance-futures,BTCUSDT,1582334371061000,1582334371188537,42384309,buy,9674.83,0.969 -binance-futures,BTCUSDT,1582334371673000,1582334371804104,42384310,sell,9673.81,5.368 -binance-futures,BTCUSDT,1582334371695000,1582334371831113,42384311,sell,9673.71,0.668 -binance-futures,BTCUSDT,1582334371695000,1582334371841091,42384312,sell,9673.56,0.631 -binance-futures,BTCUSDT,1582334371695000,1582334371841103,42384313,sell,9673.5,2.85 -binance-futures,BTCUSDT,1582334371695000,1582334371844917,42384314,sell,9673.19,0.039 -binance-futures,BTCUSDT,1582334371695000,1582334371844924,42384315,sell,9673.19,0.039 -binance-futures,BTCUSDT,1582334371695000,1582334371844931,42384316,sell,9673.18,0.438 -binance-futures,BTCUSDT,1582334371695000,1582334371844937,42384317,sell,9673.15,0.676 -binance-futures,BTCUSDT,1582334371695000,1582334371846326,42384318,sell,9673.14,3.502 -binance-futures,BTCUSDT,1582334371748000,1582334371879728,42384319,sell,9673.71,0.72 -binance-futures,BTCUSDT,1582334371752000,1582334371883001,42384320,sell,9673.71,0.68 -binance-futures,BTCUSDT,1582334371760000,1582334371890725,42384321,sell,9673.71,0.74 -binance-futures,BTCUSDT,1582334371769000,1582334371900006,42384322,sell,9673.71,0.67 -binance-futures,BTCUSDT,1582334371810000,1582334371938885,42384323,sell,9673.71,0.74 -binance-futures,BTCUSDT,1582334371814000,1582334371944031,42384324,sell,9673.71,0.897 -binance-futures,BTCUSDT,1582334371817000,1582334371946576,42384325,sell,9673.71,0.68 -binance-futures,BTCUSDT,1582334371833000,1582334371967416,42384326,sell,9673.71,0.72 -binance-futures,BTCUSDT,1582334371875000,1582334372004623,42384327,sell,9673.52,0.01 -binance-futures,BTCUSDT,1582334371897000,1582334372028983,42384328,sell,9673.52,0.67 -binance-futures,BTCUSDT,1582334371906000,1582334372038451,42384329,sell,9673.52,0.01 -binance-futures,BTCUSDT,1582334371912000,1582334372041408,42384330,sell,9673.52,0.01 -binance-futures,BTCUSDT,1582334371924000,1582334372060461,42384331,sell,9673.36,0.01 -binance-futures,BTCUSDT,1582334371932000,1582334372063692,42384332,sell,9673.36,0.071 -binance-futures,BTCUSDT,1582334371955000,1582334372085375,42384333,sell,9673.34,0.01 -binance-futures,BTCUSDT,1582334388009000,1582334388137700,42384334,sell,9673.14,0.05 -binance-futures,BTCUSDT,1582334390873000,1582334391003186,42384335,buy,9673.15,0.031 -binance-futures,BTCUSDT,1582334390873000,1582334391003384,42384336,buy,9673.15,0.148 -binance-futures,BTCUSDT,1582334390873000,1582334391004495,42384337,buy,9673.15,2.02 -binance-futures,BTCUSDT,1582334390873000,1582334391004504,42384338,buy,9673.15,0.67 -binance-futures,BTCUSDT,1582334390873000,1582334391004509,42384339,buy,9673.15,0.131 -binance-futures,BTCUSDT,1582334392039000,1582334392169107,42384340,sell,9673.14,1 -binance-futures,BTCUSDT,1582334397663000,1582334397791932,42384341,sell,9673.14,0.208 -binance-futures,BTCUSDT,1582334397712000,1582334397841777,42384342,sell,9673.14,0.67 -binance-futures,BTCUSDT,1582334397984000,1582334398112697,42384343,sell,9673.14,0.47 -binance-futures,BTCUSDT,1582334398039000,1582334398179733,42384344,sell,9673.14,0.01 -binance-futures,BTCUSDT,1582334398973000,1582334399101491,42384345,buy,9673.15,0.019 -binance-futures,BTCUSDT,1582334400374000,1582334400510528,42384346,sell,9673.14,0.413 -binance-futures,BTCUSDT,1582334402117000,1582334402244983,42384347,sell,9673.14,0.5 -binance-futures,BTCUSDT,1582334406015000,1582334406139899,42384348,sell,9673.14,0.575 -binance-futures,BTCUSDT,1582334420483000,1582334420612201,42384349,sell,9673.14,3.681 -binance-futures,BTCUSDT,1582334422376000,1582334422501855,42384350,buy,9673.15,0.032 -binance-futures,BTCUSDT,1582334422376000,1582334422502228,42384351,buy,9673.15,0.1 -binance-futures,BTCUSDT,1582334422376000,1582334422502999,42384352,buy,9673.15,0.004 -binance-futures,BTCUSDT,1582334422376000,1582334422503006,42384353,buy,9673.15,0.683 -binance-futures,BTCUSDT,1582334422376000,1582334422503009,42384354,buy,9673.15,0.902 -binance-futures,BTCUSDT,1582334422376000,1582334422503840,42384355,buy,9673.15,0.12 -binance-futures,BTCUSDT,1582334422376000,1582334422503846,42384356,buy,9673.15,0.005 -binance-futures,BTCUSDT,1582334422376000,1582334422510275,42384357,buy,9673.15,0.1 -binance-futures,BTCUSDT,1582334422376000,1582334422510289,42384358,buy,9673.15,0.32 -binance-futures,BTCUSDT,1582334422376000,1582334422510293,42384359,buy,9673.15,1.734 -binance-futures,BTCUSDT,1582334422585000,1582334422713483,42384360,sell,9673.14,0.104 -binance-futures,BTCUSDT,1582334424433000,1582334424561406,42384361,sell,9673.14,0.119 -binance-futures,BTCUSDT,1582334429743000,1582334429872312,42384362,sell,9673.14,0.414 -binance-futures,BTCUSDT,1582334429787000,1582334429916478,42384363,sell,9673.14,2.007 -binance-futures,BTCUSDT,1582334429794000,1582334429922648,42384364,sell,9673.14,0.15 -binance-futures,BTCUSDT,1582334429797000,1582334429925433,42384365,sell,9673.14,0.15 -binance-futures,BTCUSDT,1582334429799000,1582334429925575,42384366,sell,9673.14,0.55 -binance-futures,BTCUSDT,1582334429886000,1582334430015311,42384367,sell,9673.14,0.1 -binance-futures,BTCUSDT,1582334430053000,1582334430186274,42384368,sell,9673.14,9.385 -binance-futures,BTCUSDT,1582334430053000,1582334430186278,42384369,sell,9673.14,0.049 -binance-futures,BTCUSDT,1582334430053000,1582334430186281,42384370,sell,9673.14,0.116 -binance-futures,BTCUSDT,1582334430055000,1582334430191967,42384371,sell,9673.14,0.566 -binance-futures,BTCUSDT,1582334430165000,1582334430295701,42384372,sell,9671.89,1 -binance-futures,BTCUSDT,1582334430888000,1582334431017006,42384373,sell,9671.33,0.31 -binance-futures,BTCUSDT,1582334431091000,1582334431224160,42384374,sell,9671.33,0.69 -binance-futures,BTCUSDT,1582334431091000,1582334431230713,42384375,sell,9671,0.078 -binance-futures,BTCUSDT,1582334431091000,1582334431230721,42384376,sell,9670.9,0.001 -binance-futures,BTCUSDT,1582334431091000,1582334431235031,42384377,sell,9670.02,0.003 -binance-futures,BTCUSDT,1582334431091000,1582334431235053,42384378,sell,9670.01,0.01 -binance-futures,BTCUSDT,1582334431091000,1582334431235060,42384379,sell,9670,0.139 -binance-futures,BTCUSDT,1582334431091000,1582334431235063,42384380,sell,9670,0.079 -binance-futures,BTCUSDT,1582334431131000,1582334431263762,42384381,sell,9670,0.025 -binance-futures,BTCUSDT,1582334431241000,1582334431381125,42384382,sell,9670,0.025 -binance-futures,BTCUSDT,1582334433430000,1582334433558093,42384383,sell,9670,1 -binance-futures,BTCUSDT,1582334433593000,1582334433722683,42384384,sell,9670,1.5 -binance-futures,BTCUSDT,1582334434141000,1582334434268632,42384385,sell,9670,1.034 -binance-futures,BTCUSDT,1582334434160000,1582334434290711,42384386,sell,9670,0.62 -binance-futures,BTCUSDT,1582334436622000,1582334436745473,42384387,sell,9670,0.02 -binance-futures,BTCUSDT,1582334439567000,1582334439687904,42384388,buy,9670.01,0.012 -binance-futures,BTCUSDT,1582334439567000,1582334439687989,42384389,buy,9670.01,0.03 -binance-futures,BTCUSDT,1582334440637000,1582334440760237,42384390,sell,9670,0.001 -binance-futures,BTCUSDT,1582334449727000,1582334449848110,42384391,sell,9670,0.03 -binance-futures,BTCUSDT,1582334450512000,1582334450633073,42384392,sell,9670,1 -binance-futures,BTCUSDT,1582334451567000,1582334451693964,42384393,buy,9670.01,0.001 -binance-futures,BTCUSDT,1582334454370000,1582334454495093,42384394,buy,9670.01,0.5 -binance-futures,BTCUSDT,1582334455129000,1582334455253082,42384395,sell,9670,0.02 -binance-futures,BTCUSDT,1582334456793000,1582334456915106,42384396,buy,9670.01,1 -binance-futures,BTCUSDT,1582334456861000,1582334456981653,42384397,buy,9670.01,0.128 -binance-futures,BTCUSDT,1582334457566000,1582334457691784,42384398,sell,9670,1.851 -binance-futures,BTCUSDT,1582334457570000,1582334457695105,42384399,sell,9670,0.795 -binance-futures,BTCUSDT,1582334457570000,1582334457695129,42384400,sell,9669.09,0.01 -binance-futures,BTCUSDT,1582334457570000,1582334457695398,42384401,sell,9669,0.146 -binance-futures,BTCUSDT,1582334457570000,1582334457702232,42384402,sell,9669,0.01 -binance-futures,BTCUSDT,1582334457570000,1582334457706250,42384403,sell,9668.96,0.073 -binance-futures,BTCUSDT,1582334457572000,1582334457706256,42384404,sell,9668.96,0.427 -binance-futures,BTCUSDT,1582334457572000,1582334457706260,42384405,sell,9668.82,0.006 -binance-futures,BTCUSDT,1582334457572000,1582334457706270,42384406,sell,9668.43,0.187 -binance-futures,BTCUSDT,1582334457942000,1582334458064802,42384407,sell,9668.44,0.019 -binance-futures,BTCUSDT,1582334457942000,1582334458065069,42384408,sell,9668.43,0.056 -binance-futures,BTCUSDT,1582334458560000,1582334458681002,42384409,sell,9668.43,0.136 -binance-futures,BTCUSDT,1582334460089000,1582334460217782,42384410,buy,9668.44,0.039 -binance-futures,BTCUSDT,1582334460445000,1582334460568447,42384411,buy,9668.44,0.005 -binance-futures,BTCUSDT,1582334464958000,1582334465078210,42384412,sell,9668.43,0.02 -binance-futures,BTCUSDT,1582334466003000,1582334466125420,42384413,sell,9668.43,0.069 -binance-futures,BTCUSDT,1582334466070000,1582334466196620,42384414,sell,9668.43,0.017 -binance-futures,BTCUSDT,1582334466088000,1582334466213447,42384415,sell,9668.43,0.515 -binance-futures,BTCUSDT,1582334466088000,1582334466213800,42384416,sell,9668,0.003 -binance-futures,BTCUSDT,1582334466088000,1582334466216172,42384417,sell,9668,0.291 -binance-futures,BTCUSDT,1582334466155000,1582334466297687,42384418,sell,9668,0.085 -binance-futures,BTCUSDT,1582334466171000,1582334466301096,42384419,sell,9668,0.07 -binance-futures,BTCUSDT,1582334466287000,1582334466408850,42384420,sell,9668,0.017 -binance-futures,BTCUSDT,1582334466300000,1582334466424190,42384421,sell,9668,2.05 -binance-futures,BTCUSDT,1582334466300000,1582334466424574,42384422,sell,9668,0.35 -binance-futures,BTCUSDT,1582334466302000,1582334466427262,42384423,sell,9668,0.354 -binance-futures,BTCUSDT,1582334466318000,1582334466440660,42384424,sell,9668,0.083 -binance-futures,BTCUSDT,1582334466326000,1582334466450248,42384425,sell,9668,0.1 -binance-futures,BTCUSDT,1582334466338000,1582334466462610,42384426,sell,9668,0.081 -binance-futures,BTCUSDT,1582334466347000,1582334466470906,42384427,sell,9668,0.042 -binance-futures,BTCUSDT,1582334466347000,1582334466470911,42384428,sell,9668,0.054 -binance-futures,BTCUSDT,1582334466413000,1582334466543234,42384429,sell,9667.83,0.04 -binance-futures,BTCUSDT,1582334466413000,1582334466543239,42384430,sell,9667.74,0.039 -binance-futures,BTCUSDT,1582334466413000,1582334466547098,42384431,sell,9667.65,0.006 -binance-futures,BTCUSDT,1582334466413000,1582334466548987,42384432,sell,9667.42,0.004 -binance-futures,BTCUSDT,1582334466444000,1582334466571114,42384433,sell,9667.42,0.036 -binance-futures,BTCUSDT,1582334466444000,1582334466572771,42384434,sell,9667.4,0.039 -binance-futures,BTCUSDT,1582334466461000,1582334466584413,42384435,sell,9667.4,0.001 -binance-futures,BTCUSDT,1582334466541000,1582334466672117,42384436,sell,9667.11,0.006 -binance-futures,BTCUSDT,1582334466541000,1582334466672132,42384437,sell,9667.09,0.04 -binance-futures,BTCUSDT,1582334466571000,1582334466695149,42384438,sell,9667.01,0.001 -binance-futures,BTCUSDT,1582334466571000,1582334466699936,42384439,sell,9667,0.024 -binance-futures,BTCUSDT,1582334467077000,1582334467202929,42384440,buy,9667.01,0.199 -binance-futures,BTCUSDT,1582334467077000,1582334467202936,42384441,buy,9667.01,0.031 -binance-futures,BTCUSDT,1582334467077000,1582334467202940,42384442,buy,9667.02,0.031 -binance-futures,BTCUSDT,1582334467077000,1582334467207821,42384443,buy,9667.03,0.031 -binance-futures,BTCUSDT,1582334467077000,1582334467212116,42384444,buy,9667.04,0.031 -binance-futures,BTCUSDT,1582334467077000,1582334467212844,42384445,buy,9667.12,0.1 -binance-futures,BTCUSDT,1582334467077000,1582334467212854,42384446,buy,9667.12,0.077 -binance-futures,BTCUSDT,1582334467535000,1582334467655088,42384447,sell,9667,0.008 -binance-futures,BTCUSDT,1582334467535000,1582334467655122,42384448,sell,9667,0.061 -binance-futures,BTCUSDT,1582334467535000,1582334467655279,42384449,sell,9667,0.407 -binance-futures,BTCUSDT,1582334467543000,1582334467666917,42384450,sell,9667,0.259 -binance-futures,BTCUSDT,1582334467643000,1582334467764452,42384451,sell,9667,0.166 -binance-futures,BTCUSDT,1582334468171000,1582334468295106,42384452,sell,9667,0.168 -binance-futures,BTCUSDT,1582334468568000,1582334468694243,42384453,buy,9667.01,0.028 -binance-futures,BTCUSDT,1582334469643000,1582334469765896,42384454,sell,9667,0.01 -binance-futures,BTCUSDT,1582334473669000,1582334473791149,42384455,sell,9667,0.04 -binance-futures,BTCUSDT,1582334473669000,1582334473791164,42384456,sell,9667,0.06 -binance-futures,BTCUSDT,1582334478153000,1582334478287620,42384457,sell,9667,0.042 -binance-futures,BTCUSDT,1582334478997000,1582334479124290,42384458,buy,9667.01,0.2 -binance-futures,BTCUSDT,1582334480773000,1582334480893796,42384459,buy,9667.01,0.483 -binance-futures,BTCUSDT,1582334480773000,1582334480893800,42384460,buy,9667.01,0.1 -binance-futures,BTCUSDT,1582334480773000,1582334480893810,42384461,buy,9667.01,0.917 -binance-futures,BTCUSDT,1582334481681000,1582334481803615,42384462,sell,9667,0.023 -binance-futures,BTCUSDT,1582334481977000,1582334482098967,42384463,buy,9667.01,0.047 -binance-futures,BTCUSDT,1582334482288000,1582334482410498,42384464,buy,9667.01,0.023 -binance-futures,BTCUSDT,1582334482518000,1582334482640706,42384465,sell,9667,2.772 -binance-futures,BTCUSDT,1582334482521000,1582334482644955,42384466,sell,9667,0.621 -binance-futures,BTCUSDT,1582334482542000,1582334482666474,42384467,sell,9667,0.482 -binance-futures,BTCUSDT,1582334482542000,1582334482666552,42384468,sell,9667,0.028 -binance-futures,BTCUSDT,1582334482542000,1582334482666998,42384469,sell,9667,0.524 -binance-futures,BTCUSDT,1582334482900000,1582334483024264,42384470,sell,9667,0.158 -binance-futures,BTCUSDT,1582334482900000,1582334483026383,42384471,sell,9666.99,0.047 -binance-futures,BTCUSDT,1582334482900000,1582334483031286,42384472,sell,9666.75,0.008 -binance-futures,BTCUSDT,1582334482900000,1582334483031294,42384473,sell,9666.66,1.295 -binance-futures,BTCUSDT,1582334482900000,1582334483032643,42384474,sell,9666.66,0.507 -binance-futures,BTCUSDT,1582334483250000,1582334483373752,42384475,buy,9666.67,0.001 -binance-futures,BTCUSDT,1582334485438000,1582334485560609,42384476,sell,9666.66,0.079 -binance-futures,BTCUSDT,1582334486154000,1582334486281734,42384477,sell,9666.66,0.035 -binance-futures,BTCUSDT,1582334486154000,1582334486282005,42384478,sell,9666.66,0.379 -binance-futures,BTCUSDT,1582334486154000,1582334486282263,42384479,sell,9666.66,2.621 -binance-futures,BTCUSDT,1582334487615000,1582334487735862,42384480,sell,9666.66,0.227 -binance-futures,BTCUSDT,1582334487806000,1582334487927026,42384481,sell,9666.66,0.217 -binance-futures,BTCUSDT,1582334487806000,1582334487927234,42384482,sell,9666.66,0.4 -binance-futures,BTCUSDT,1582334487806000,1582334487933214,42384483,sell,9666.46,0.04 -binance-futures,BTCUSDT,1582334487806000,1582334487938645,42384484,sell,9666.24,0.012 -binance-futures,BTCUSDT,1582334487806000,1582334487942182,42384485,sell,9666.13,0.04 -binance-futures,BTCUSDT,1582334487806000,1582334487942189,42384486,sell,9666.08,0.04 -binance-futures,BTCUSDT,1582334487806000,1582334487944668,42384487,sell,9666.08,0.047 -binance-futures,BTCUSDT,1582334487806000,1582334487946841,42384488,sell,9666.07,0.006 -binance-futures,BTCUSDT,1582334487806000,1582334487946852,42384489,sell,9666,0.02 -binance-futures,BTCUSDT,1582334487806000,1582334487948518,42384490,sell,9666,0.109 -binance-futures,BTCUSDT,1582334487806000,1582334487948529,42384491,sell,9666,0.1 -binance-futures,BTCUSDT,1582334487806000,1582334487948534,42384492,sell,9666,0.1 -binance-futures,BTCUSDT,1582334487806000,1582334487948539,42384493,sell,9666,0.1 -binance-futures,BTCUSDT,1582334487806000,1582334487948543,42384494,sell,9666,0.1 -binance-futures,BTCUSDT,1582334487806000,1582334487948547,42384495,sell,9666,0.491 -binance-futures,BTCUSDT,1582334487806000,1582334487948579,42384496,sell,9665.79,0.004 -binance-futures,BTCUSDT,1582334487806000,1582334487950765,42384497,sell,9665.77,0.04 -binance-futures,BTCUSDT,1582334487806000,1582334487950771,42384498,sell,9665.77,0.006 -binance-futures,BTCUSDT,1582334487806000,1582334487951772,42384499,sell,9665.59,0.04 -binance-futures,BTCUSDT,1582334487806000,1582334487952406,42384500,sell,9665.53,0.006 -binance-futures,BTCUSDT,1582334487806000,1582334487952415,42384501,sell,9665.53,0.006 -binance-futures,BTCUSDT,1582334487806000,1582334487952959,42384502,sell,9665.4,0.011 -binance-futures,BTCUSDT,1582334487806000,1582334487953555,42384503,sell,9665.23,2 -binance-futures,BTCUSDT,1582334487806000,1582334487955881,42384504,sell,9665.13,0.004 -binance-futures,BTCUSDT,1582334487806000,1582334487956056,42384505,sell,9665.1,0.196 -binance-futures,BTCUSDT,1582334487806000,1582334487956071,42384506,sell,9665,0.005 -binance-futures,BTCUSDT,1582334487806000,1582334487956076,42384507,sell,9665,0.025 -binance-futures,BTCUSDT,1582334487806000,1582334487956081,42384508,sell,9665,1.472 -binance-futures,BTCUSDT,1582334487806000,1582334487956094,42384509,sell,9664.99,0.857 -binance-futures,BTCUSDT,1582334487806000,1582334487956099,42384510,sell,9664.99,1 -binance-futures,BTCUSDT,1582334487806000,1582334487956104,42384511,sell,9664.99,0.532 -binance-futures,BTCUSDT,1582334487806000,1582334487956109,42384512,sell,9664.99,2.485 -binance-futures,BTCUSDT,1582334488206000,1582334488338819,42384513,sell,9664.99,1.035 -binance-futures,BTCUSDT,1582334489536000,1582334489659517,42384514,buy,9665,0.01 -binance-futures,BTCUSDT,1582334489565000,1582334489688655,42384515,buy,9665,0.19 -binance-futures,BTCUSDT,1582334489565000,1582334489689077,42384516,buy,9665,0.21 -binance-futures,BTCUSDT,1582334490141000,1582334490263892,42384517,sell,9664.99,0.01 -binance-futures,BTCUSDT,1582334490646000,1582334490768243,42384518,buy,9665,0.072 -binance-futures,BTCUSDT,1582334491460000,1582334491582695,42384519,sell,9664.99,0.308 -binance-futures,BTCUSDT,1582334491645000,1582334491766831,42384520,sell,9664.99,0.001 -binance-futures,BTCUSDT,1582334491759000,1582334491880991,42384521,sell,9664.99,0.003 -binance-futures,BTCUSDT,1582334491897000,1582334492020577,42384522,sell,9664.99,3.86 -binance-futures,BTCUSDT,1582334491897000,1582334492026853,42384523,sell,9664.94,0.001 -binance-futures,BTCUSDT,1582334491897000,1582334492026890,42384524,sell,9664.93,0.04 -binance-futures,BTCUSDT,1582334491897000,1582334492026897,42384525,sell,9664.87,0.04 -binance-futures,BTCUSDT,1582334491897000,1582334492031403,42384526,sell,9664.66,0.012 -binance-futures,BTCUSDT,1582334491897000,1582334492034716,42384527,sell,9664.44,0.08 -binance-futures,BTCUSDT,1582334491897000,1582334492038197,42384528,sell,9664.4,0.02 -binance-futures,BTCUSDT,1582334491897000,1582334492038207,42384529,sell,9664.22,0.004 -binance-futures,BTCUSDT,1582334491897000,1582334492310444,42384530,sell,9664.1,0.002 -binance-futures,BTCUSDT,1582334491897000,1582334492310449,42384531,sell,9664.1,0.144 -binance-futures,BTCUSDT,1582334491897000,1582334492315102,42384532,sell,9664,0.01 -binance-futures,BTCUSDT,1582334491897000,1582334492315126,42384533,sell,9664,0.002 -binance-futures,BTCUSDT,1582334491897000,1582334492315129,42384534,sell,9663.93,0.04 -binance-futures,BTCUSDT,1582334491897000,1582334492315146,42384535,sell,9663.54,0.002 -binance-futures,BTCUSDT,1582334491897000,1582334492315157,42384536,sell,9663.45,0.04 -binance-futures,BTCUSDT,1582334491897000,1582334492315167,42384537,sell,9663.15,0.703 -binance-futures,BTCUSDT,1582334491897000,1582334492315170,42384538,sell,9663.15,0.097 -binance-futures,BTCUSDT,1582334491897000,1582334492315173,42384539,sell,9663.15,0.788 -binance-futures,BTCUSDT,1582334491897000,1582334492315184,42384540,sell,9663.05,0.106 -binance-futures,BTCUSDT,1582334491897000,1582334492315189,42384541,sell,9663.05,0.158 -binance-futures,BTCUSDT,1582334491897000,1582334492315194,42384542,sell,9663,0.842 -binance-futures,BTCUSDT,1582334492271000,1582334492402952,42384543,sell,9663,0.158 -binance-futures,BTCUSDT,1582334492271000,1582334492406272,42384544,sell,9663,0.005 -binance-futures,BTCUSDT,1582334492271000,1582334492406279,42384545,sell,9663,0.085 -binance-futures,BTCUSDT,1582334492587000,1582334492709478,42384546,buy,9663.01,0.008 -binance-futures,BTCUSDT,1582334493567000,1582334493691835,42384547,buy,9663.01,0.023 -binance-futures,BTCUSDT,1582334493567000,1582334493691845,42384548,buy,9663.01,0.051 -binance-futures,BTCUSDT,1582334493732000,1582334493855545,42384549,sell,9663,3.361 -binance-futures,BTCUSDT,1582334494397000,1582334494521975,42384550,buy,9663.01,0.01 -binance-futures,BTCUSDT,1582334494541000,1582334494662734,42384551,buy,9663.01,0.01 -binance-futures,BTCUSDT,1582334494638000,1582334494763929,42384552,sell,9663,0.001 -binance-futures,BTCUSDT,1582334494803000,1582334494926135,42384553,sell,9663,0.053 -binance-futures,BTCUSDT,1582334494803000,1582334494926145,42384554,sell,9663,0.68 -binance-futures,BTCUSDT,1582334494803000,1582334494926336,42384555,sell,9663,0.167 -binance-futures,BTCUSDT,1582334495482000,1582334495604618,42384556,sell,9662.9,0.04 -binance-futures,BTCUSDT,1582334497750000,1582334497872354,42384557,sell,9662.66,0.02 -binance-futures,BTCUSDT,1582334498459000,1582334498585410,42384558,sell,9662.66,0.004 -binance-futures,BTCUSDT,1582334498961000,1582334499084106,42384559,buy,9662.67,0.031 -binance-futures,BTCUSDT,1582334498961000,1582334499086411,42384560,buy,9662.67,0.169 -binance-futures,BTCUSDT,1582334499161000,1582334499285433,42384561,sell,9662.66,0.102 -binance-futures,BTCUSDT,1582334499391000,1582334499514688,42384562,buy,9662.67,0.011 -binance-futures,BTCUSDT,1582334499391000,1582334499514936,42384563,buy,9662.67,0.669 -binance-futures,BTCUSDT,1582334499408000,1582334499530859,42384564,buy,9662.67,0.74 -binance-futures,BTCUSDT,1582334499430000,1582334499552407,42384565,buy,9662.67,0.83 -binance-futures,BTCUSDT,1582334499433000,1582334499556068,42384566,buy,9662.67,0.72 -binance-futures,BTCUSDT,1582334499440000,1582334499562266,42384567,buy,9662.67,0.67 -binance-futures,BTCUSDT,1582334499442000,1582334499569306,42384568,buy,9662.67,1 -binance-futures,BTCUSDT,1582334499448000,1582334499574927,42384569,buy,9662.67,0.01 -binance-futures,BTCUSDT,1582334499451000,1582334499579656,42384570,buy,9662.67,0.676 -binance-futures,BTCUSDT,1582334499451000,1582334499579662,42384571,buy,9662.87,0.064 -binance-futures,BTCUSDT,1582334499483000,1582334499608949,42384572,buy,9662.87,0.036 -binance-futures,BTCUSDT,1582334499498000,1582334499622956,42384573,buy,9662.87,0.826 -binance-futures,BTCUSDT,1582334499498000,1582334499622963,42384574,buy,9662.87,0.35 -binance-futures,BTCUSDT,1582334499502000,1582334499632803,42384575,buy,9662.87,0.1 -binance-futures,BTCUSDT,1582334499502000,1582334499632815,42384576,buy,9662.87,0.1 -binance-futures,BTCUSDT,1582334499502000,1582334499632818,42384577,buy,9662.87,0.72 -binance-futures,BTCUSDT,1582334499504000,1582334499637020,42384578,buy,9662.87,1.89 -binance-futures,BTCUSDT,1582334499548000,1582334499679164,42384579,buy,9663.35,0.67 -binance-futures,BTCUSDT,1582334499548000,1582334499679169,42384580,buy,9663.35,0.01 -binance-futures,BTCUSDT,1582334499556000,1582334499681908,42384581,buy,9663.35,0.21 -binance-futures,BTCUSDT,1582334499557000,1582334499685008,42384582,buy,9663.35,0.01 -binance-futures,BTCUSDT,1582334499557000,1582334499685027,42384583,buy,9663.35,0.05 -binance-futures,BTCUSDT,1582334499581000,1582334499707323,42384584,buy,9663.35,1.469 -binance-futures,BTCUSDT,1582334499614000,1582334499742371,42384585,sell,9663.59,0.01 -binance-futures,BTCUSDT,1582334499774000,1582334499896448,42384586,buy,9665.14,0.001 -binance-futures,BTCUSDT,1582334499836000,1582334499960969,42384587,buy,9665.1,0.001 -binance-futures,BTCUSDT,1582334499874000,1582334500001456,42384588,buy,9665.09,0.001 -binance-futures,BTCUSDT,1582334500665000,1582334500785311,42384589,sell,9663.22,0.481 -binance-futures,BTCUSDT,1582334500665000,1582334500788364,42384590,sell,9663.18,1.916 -binance-futures,BTCUSDT,1582334501161000,1582334501290491,42384591,buy,9664.54,0.031 -binance-futures,BTCUSDT,1582334501161000,1582334501290516,42384592,buy,9664.55,0.569 -binance-futures,BTCUSDT,1582334501183000,1582334501310461,42384593,buy,9664.55,0.001 -binance-futures,BTCUSDT,1582334502929000,1582334503057403,42384594,sell,9663.51,0.003 -binance-futures,BTCUSDT,1582334502929000,1582334503057413,42384595,sell,9663.51,0.139 -binance-futures,BTCUSDT,1582334502929000,1582334503059340,42384596,sell,9662.81,0.002 -binance-futures,BTCUSDT,1582334502929000,1582334503059351,42384597,sell,9662.77,0.516 -binance-futures,BTCUSDT,1582334502929000,1582334503063057,42384598,sell,9662.66,0.074 -binance-futures,BTCUSDT,1582334502929000,1582334503068336,42384599,sell,9662.44,0.001 -binance-futures,BTCUSDT,1582334502929000,1582334503068347,42384600,sell,9662.1,0.765 -binance-futures,BTCUSDT,1582334505234000,1582334505356342,42384601,sell,9663.57,0.01 -binance-futures,BTCUSDT,1582334506225000,1582334506347764,42384602,sell,9663.57,0.09 -binance-futures,BTCUSDT,1582334506225000,1582334506353885,42384603,sell,9662.39,0.314 -binance-futures,BTCUSDT,1582334506225000,1582334506353898,42384604,sell,9662.28,2.02 -binance-futures,BTCUSDT,1582334506225000,1582334506353903,42384605,sell,9662.06,0.006 -binance-futures,BTCUSDT,1582334506225000,1582334506358844,42384606,sell,9662,0.053 -binance-futures,BTCUSDT,1582334506225000,1582334506366316,42384607,sell,9661.97,0.006 -binance-futures,BTCUSDT,1582334506225000,1582334506366335,42384608,sell,9661.9,2.267 -binance-futures,BTCUSDT,1582334506225000,1582334506367411,42384609,sell,9661.88,0.244 -binance-futures,BTCUSDT,1582334506225000,1582334506367419,42384610,sell,9661.88,0.212 -binance-futures,BTCUSDT,1582334506472000,1582334506595840,42384611,buy,9663.8,0.031 -binance-futures,BTCUSDT,1582334506472000,1582334506600264,42384612,buy,9663.81,0.031 -binance-futures,BTCUSDT,1582334506472000,1582334506600272,42384613,buy,9663.82,0.031 -binance-futures,BTCUSDT,1582334506472000,1582334506601963,42384614,buy,9663.84,0.267 -binance-futures,BTCUSDT,1582334506479000,1582334506609307,42384615,buy,9663.84,0.01 -binance-futures,BTCUSDT,1582334507535000,1582334507660194,42384616,sell,9663.79,0.025 -binance-futures,BTCUSDT,1582334509457000,1582334509579159,42384617,buy,9664.55,0.03 -binance-futures,BTCUSDT,1582334509739000,1582334509862131,42384618,buy,9664.56,2.581 -binance-futures,BTCUSDT,1582334512257000,1582334512399478,42384619,buy,9664.09,0.862 -binance-futures,BTCUSDT,1582334512257000,1582334512399483,42384620,buy,9664.11,0.031 -binance-futures,BTCUSDT,1582334512257000,1582334512400451,42384621,buy,9664.12,0.031 -binance-futures,BTCUSDT,1582334512257000,1582334512400984,42384622,buy,9664.13,0.031 -binance-futures,BTCUSDT,1582334512257000,1582334512401868,42384623,buy,9664.14,0.031 -binance-futures,BTCUSDT,1582334512257000,1582334512402653,42384624,buy,9664.18,0.031 -binance-futures,BTCUSDT,1582334512257000,1582334512403750,42384625,buy,9664.23,0.983 -binance-futures,BTCUSDT,1582334513540000,1582334513663387,42384626,sell,9663.5,0.075 -binance-futures,BTCUSDT,1582334513540000,1582334513667021,42384627,sell,9663.35,0.025 -binance-futures,BTCUSDT,1582334516894000,1582334517015437,42384628,sell,9663.6,0.031 -binance-futures,BTCUSDT,1582334516894000,1582334517021765,42384629,sell,9663.6,0.486 -binance-futures,BTCUSDT,1582334518726000,1582334518853023,42384630,buy,9663.98,0.039 -binance-futures,BTCUSDT,1582334518726000,1582334518853601,42384631,buy,9663.98,0.017 -binance-futures,BTCUSDT,1582334518726000,1582334518856634,42384632,buy,9663.99,0.914 -binance-futures,BTCUSDT,1582334518726000,1582334518858761,42384633,buy,9664.03,1.03 -binance-futures,BTCUSDT,1582334522752000,1582334522875689,42384634,sell,9663.16,0.034 -binance-futures,BTCUSDT,1582334523348000,1582334523470947,42384635,buy,9663.72,0.005 -binance-futures,BTCUSDT,1582334523643000,1582334523765450,42384636,sell,9663.16,0.079 -binance-futures,BTCUSDT,1582334525079000,1582334525197892,42384637,buy,9663.17,0.027 -binance-futures,BTCUSDT,1582334525346000,1582334525469751,42384638,buy,9663.17,0.073 -binance-futures,BTCUSDT,1582334525346000,1582334525474912,42384639,buy,9663.47,0.004 -binance-futures,BTCUSDT,1582334525346000,1582334525474919,42384640,buy,9663.48,0.366 -binance-futures,BTCUSDT,1582334526054000,1582334526173060,42384641,buy,9663.57,0.234 -binance-futures,BTCUSDT,1582334530146000,1582334530271728,42384642,buy,9663.5,0.031 -binance-futures,BTCUSDT,1582334530146000,1582334530273075,42384643,buy,9663.5,0.504 -binance-futures,BTCUSDT,1582334530738000,1582334530862128,42384644,buy,9663.49,0.5 -binance-futures,BTCUSDT,1582334530846000,1582334530969430,42384645,sell,9663.18,0.004 -binance-futures,BTCUSDT,1582334530846000,1582334530973170,42384646,sell,9663.16,0.396 -binance-futures,BTCUSDT,1582334533963000,1582334534087659,42384647,buy,9663.47,0.004 -binance-futures,BTCUSDT,1582334533963000,1582334534090767,42384648,buy,9663.48,0.518 -binance-futures,BTCUSDT,1582334533963000,1582334534090781,42384649,buy,9663.5,2.614 -binance-futures,BTCUSDT,1582334538206000,1582334538328573,42384650,sell,9663.69,0.005 -binance-futures,BTCUSDT,1582334538512000,1582334538637085,42384651,buy,9663.7,0.18 -binance-futures,BTCUSDT,1582334538512000,1582334538637486,42384652,buy,9663.7,0.72 -binance-futures,BTCUSDT,1582334538512000,1582334538637519,42384653,buy,9663.7,0.05 -binance-futures,BTCUSDT,1582334538663000,1582334538787115,42384654,sell,9663.62,0.1 -binance-futures,BTCUSDT,1582334538700000,1582334538824637,42384655,sell,9663.62,0.414 -binance-futures,BTCUSDT,1582334538964000,1582334539087100,42384656,sell,9663.62,0.21 -binance-futures,BTCUSDT,1582334538986000,1582334539112058,42384657,sell,9663.55,0.05 -binance-futures,BTCUSDT,1582334538988000,1582334539112065,42384658,sell,9663.55,0.061 -binance-futures,BTCUSDT,1582334538991000,1582334539115657,42384659,sell,9663.55,0.3 -binance-futures,BTCUSDT,1582334538993000,1582334539116184,42384660,sell,9663.55,0.271 -binance-futures,BTCUSDT,1582334539134000,1582334539258376,42384661,sell,9663.16,0.182 -binance-futures,BTCUSDT,1582334539385000,1582334539514559,42384662,sell,9663.16,0.232 -binance-futures,BTCUSDT,1582334539748000,1582334539874098,42384663,sell,9663.16,0.414 -binance-futures,BTCUSDT,1582334543396000,1582334543517707,42384664,sell,9663.16,0.069 -binance-futures,BTCUSDT,1582334547339000,1582334547463372,42384665,sell,9663.16,0.165 -binance-futures,BTCUSDT,1582334547802000,1582334547925870,42384666,buy,9663.17,0.01 -binance-futures,BTCUSDT,1582334549051000,1582334549175145,42384667,sell,9663.16,0.429 -binance-futures,BTCUSDT,1582334549051000,1582334549175152,42384668,sell,9663.16,0.095 -binance-futures,BTCUSDT,1582334552712000,1582334552834968,42384669,buy,9662.46,0.181 -binance-futures,BTCUSDT,1582334552781000,1582334552907669,42384670,buy,9662.46,0.063 -binance-futures,BTCUSDT,1582334552919000,1582334553043313,42384671,buy,9662.46,0.013 -binance-futures,BTCUSDT,1582334553569000,1582334553691633,42384672,buy,9662.46,0.097 -binance-futures,BTCUSDT,1582334553776000,1582334553898077,42384673,sell,9662.45,0.013 -binance-futures,BTCUSDT,1582334554619000,1582334554740786,42384674,sell,9662.45,0.002 -binance-futures,BTCUSDT,1582334555583000,1582334555705399,42384675,buy,9662.46,0.08 -binance-futures,BTCUSDT,1582334555583000,1582334555705697,42384676,buy,9662.63,0.12 -binance-futures,BTCUSDT,1582334561712000,1582334561833188,42384677,sell,9662.63,0.2 -binance-futures,BTCUSDT,1582334564505000,1582334564629258,42384678,sell,9662.63,0.001 -binance-futures,BTCUSDT,1582334576359000,1582334576480942,42384679,buy,9662.64,0.508 -binance-futures,BTCUSDT,1582334577626000,1582334577746429,42384680,buy,9662.64,0.123 -binance-futures,BTCUSDT,1582334579571000,1582334579859916,42384681,sell,9662.63,0.001 -binance-futures,BTCUSDT,1582334579620000,1582334579862293,42384682,buy,9662.64,0.1 -binance-futures,BTCUSDT,1582334579971000,1582334580093237,42384683,sell,9662.63,0.1 -binance-futures,BTCUSDT,1582334580122000,1582334580245086,42384684,buy,9662.64,0.001 -binance-futures,BTCUSDT,1582334580130000,1582334580256215,42384685,sell,9662.63,0.014 -binance-futures,BTCUSDT,1582334580462000,1582334580583033,42384686,buy,9662.64,0.005 -binance-futures,BTCUSDT,1582334581682000,1582334581801788,42384687,sell,9662.63,0.001 -binance-futures,BTCUSDT,1582334581783000,1582334581911137,42384688,sell,9662.63,1.25 -binance-futures,BTCUSDT,1582334581783000,1582334581915663,42384689,sell,9662.45,0.035 -binance-futures,BTCUSDT,1582334581783000,1582334581915672,42384690,sell,9662.45,0.05 -binance-futures,BTCUSDT,1582334581783000,1582334581915677,42384691,sell,9662.45,0.25 -binance-futures,BTCUSDT,1582334581783000,1582334581915681,42384692,sell,9662.37,0.006 -binance-futures,BTCUSDT,1582334581783000,1582334581915696,42384693,sell,9662,0.087 -binance-futures,BTCUSDT,1582334581783000,1582334581915700,42384694,sell,9662,0.322 -binance-futures,BTCUSDT,1582334589864000,1582334589988939,42384695,buy,9662.45,2.253 -binance-futures,BTCUSDT,1582334589864000,1582334589990882,42384696,buy,9662.63,0.704 -binance-futures,BTCUSDT,1582334589864000,1582334589997170,42384697,buy,9662.63,0.8 -binance-futures,BTCUSDT,1582334589864000,1582334589997179,42384698,buy,9662.63,0.704 -binance-futures,BTCUSDT,1582334589864000,1582334589997184,42384699,buy,9662.63,0.8 -binance-futures,BTCUSDT,1582334589864000,1582334589997194,42384700,buy,9662.64,0.682 -binance-futures,BTCUSDT,1582334589864000,1582334589999274,42384701,buy,9662.64,0.683 -binance-futures,BTCUSDT,1582334589864000,1582334590002738,42384702,buy,9663.16,1.476 -binance-futures,BTCUSDT,1582334589864000,1582334590002745,42384703,buy,9663.16,0.743 -binance-futures,BTCUSDT,1582334589864000,1582334590002749,42384704,buy,9663.16,0.743 -binance-futures,BTCUSDT,1582334589864000,1582334590002758,42384705,buy,9663.17,0.372 -binance-futures,BTCUSDT,1582334589864000,1582334590002763,42384706,buy,9663.17,3.078 -binance-futures,BTCUSDT,1582334590549000,1582334590671228,42384707,sell,9662.77,0.1 -binance-futures,BTCUSDT,1582334590549000,1582334590671232,42384708,sell,9662.77,0.521 -binance-futures,BTCUSDT,1582334593071000,1582334593192683,42384709,sell,9662.75,0.031 -binance-futures,BTCUSDT,1582334593071000,1582334593192703,42384710,sell,9662.74,0.031 -binance-futures,BTCUSDT,1582334593071000,1582334593195526,42384711,sell,9662.73,0.031 -binance-futures,BTCUSDT,1582334593071000,1582334593198483,42384712,sell,9662.72,0.031 -binance-futures,BTCUSDT,1582334593071000,1582334593202528,42384713,sell,9662.09,0.012 -binance-futures,BTCUSDT,1582334593071000,1582334593203608,42384714,sell,9662.08,0.264 -binance-futures,BTCUSDT,1582334594075000,1582334594198735,42384715,buy,9662.76,0.003 -binance-futures,BTCUSDT,1582334594675000,1582334594798244,42384716,buy,9662.78,1.017 -binance-futures,BTCUSDT,1582334596157000,1582334596282691,42384717,sell,9662.59,0.103 -binance-futures,BTCUSDT,1582334597436000,1582334597557684,42384718,buy,9662.71,0.156 -binance-futures,BTCUSDT,1582334598416000,1582334598539307,42384719,buy,9662.71,2.22 -binance-futures,BTCUSDT,1582334600179000,1582334600299614,42384720,sell,9662.73,0.008 -binance-futures,BTCUSDT,1582334600624000,1582334600746694,42384721,buy,9662.74,2.09 -binance-futures,BTCUSDT,1582334600624000,1582334600750013,42384722,buy,9662.74,0.1 -binance-futures,BTCUSDT,1582334600991000,1582334601110676,42384723,sell,9662.93,0.083 -binance-futures,BTCUSDT,1582334600998000,1582334601120335,42384724,sell,9662.93,0.776 -binance-futures,BTCUSDT,1582334601125000,1582334601259939,42384725,sell,9662.93,0.119 -binance-futures,BTCUSDT,1582334601321000,1582334601444048,42384726,buy,9662.94,0.001 -binance-futures,BTCUSDT,1582334603326000,1582334603453520,42384727,buy,9662.97,0.002 -binance-futures,BTCUSDT,1582334604289000,1582334604413720,42384728,buy,9663.17,0.05 -binance-futures,BTCUSDT,1582334604295000,1582334604421535,42384729,buy,9663.17,0.271 -binance-futures,BTCUSDT,1582334604295000,1582334604423631,42384730,buy,9663.58,0.1 -binance-futures,BTCUSDT,1582334605109000,1582334605237212,42384731,buy,9663.72,0.5 -binance-futures,BTCUSDT,1582334606329000,1582334606459077,42384732,buy,9663.72,0.183 -binance-futures,BTCUSDT,1582334607382000,1582334607511311,42384733,buy,9665.37,0.35 -binance-futures,BTCUSDT,1582334608074000,1582334608203851,42384734,buy,9665.81,0.5 -binance-futures,BTCUSDT,1582334608659000,1582334608790261,42384735,buy,9666.02,0.5 -binance-futures,BTCUSDT,1582334609012000,1582334609135245,42384736,buy,9666.02,0.001 -binance-futures,BTCUSDT,1582334610169000,1582334610295188,42384737,sell,9665.59,0.01 -binance-futures,BTCUSDT,1582334613275000,1582334613408372,42384738,buy,9665.79,0.009 -binance-futures,BTCUSDT,1582334614365000,1582334614487059,42384739,buy,9665.8,0.03 -binance-futures,BTCUSDT,1582334615506000,1582334615630813,42384740,buy,9665.8,0.105 -binance-futures,BTCUSDT,1582334617555000,1582334617675404,42384741,buy,9666.14,0.231 -binance-futures,BTCUSDT,1582334619093000,1582334619214761,42384742,buy,9666.33,0.6 -binance-futures,BTCUSDT,1582334620209000,1582334620337558,42384743,sell,9666.33,0.031 -binance-futures,BTCUSDT,1582334620209000,1582334620340849,42384744,sell,9666.32,0.031 -binance-futures,BTCUSDT,1582334620209000,1582334620340857,42384745,sell,9666.31,0.031 -binance-futures,BTCUSDT,1582334620209000,1582334620347853,42384746,sell,9666.3,0.031 -binance-futures,BTCUSDT,1582334620209000,1582334620350619,42384747,sell,9666.29,0.007 -binance-futures,BTCUSDT,1582334620209000,1582334620352993,42384748,sell,9666.28,0.1 -binance-futures,BTCUSDT,1582334620209000,1582334620353798,42384749,sell,9666.2,0.06 -binance-futures,BTCUSDT,1582334622276000,1582334622418168,42384750,buy,9666.34,0.103 -binance-futures,BTCUSDT,1582334625730000,1582334625852795,42384751,buy,9666.34,0.897 -binance-futures,BTCUSDT,1582334625804000,1582334625926487,42384752,buy,9666.34,0.1 -binance-futures,BTCUSDT,1582334625984000,1582334626109948,42384753,buy,9666.59,0.66 -binance-futures,BTCUSDT,1582334626182000,1582334626303937,42384754,buy,9666.87,0.64 -binance-futures,BTCUSDT,1582334627552000,1582334627680109,42384755,buy,9667.8,0.05 -binance-futures,BTCUSDT,1582334628274000,1582334628506553,42384756,buy,9669,0.03 -binance-futures,BTCUSDT,1582334628595000,1582334628775940,42384757,buy,9669.44,0.183 -binance-futures,BTCUSDT,1582334628699000,1582334628825686,42384758,buy,9669.44,0.05 -binance-futures,BTCUSDT,1582334628919000,1582334629039358,42384759,buy,9669.44,0.003 -binance-futures,BTCUSDT,1582334629583000,1582334629702602,42384760,buy,9669.65,0.04 -binance-futures,BTCUSDT,1582334631207000,1582334631335266,42384761,buy,9669.82,0.031 -binance-futures,BTCUSDT,1582334631207000,1582334631335272,42384762,buy,9669.83,0.031 -binance-futures,BTCUSDT,1582334631207000,1582334631337927,42384763,buy,9669.84,0.031 -binance-futures,BTCUSDT,1582334631207000,1582334631339312,42384764,buy,9669.85,0.007 -binance-futures,BTCUSDT,1582334631786000,1582334631909907,42384765,buy,9669.87,2.028 -binance-futures,BTCUSDT,1582334631786000,1582334631914263,42384766,buy,9670.46,0.012 -binance-futures,BTCUSDT,1582334631786000,1582334631914270,42384767,buy,9670.59,0.1 -binance-futures,BTCUSDT,1582334631786000,1582334631917271,42384768,buy,9670.63,0.04 -binance-futures,BTCUSDT,1582334631786000,1582334631922460,42384769,buy,9670.66,0.012 -binance-futures,BTCUSDT,1582334631786000,1582334631922475,42384770,buy,9670.82,0.704 -binance-futures,BTCUSDT,1582334631786000,1582334631923517,42384771,buy,9670.87,1.71 -binance-futures,BTCUSDT,1582334631786000,1582334631923530,42384772,buy,9670.87,3 -binance-futures,BTCUSDT,1582334632028000,1582334632151129,42384773,buy,9670.87,0.116 -binance-futures,BTCUSDT,1582334632144000,1582334632265188,42384774,buy,9670.87,0.105 -binance-futures,BTCUSDT,1582334634955000,1582334635076872,42384775,buy,9670.87,0.001 -binance-futures,BTCUSDT,1582334635728000,1582334635853854,42384776,sell,9670.07,0.012 -binance-futures,BTCUSDT,1582334635877000,1582334636001342,42384777,buy,9670.76,0.031 -binance-futures,BTCUSDT,1582334635877000,1582334636001349,42384778,buy,9670.77,0.031 -binance-futures,BTCUSDT,1582334635877000,1582334636007249,42384779,buy,9670.78,0.029 -binance-futures,BTCUSDT,1582334635877000,1582334636007256,42384780,buy,9670.8,0.031 -binance-futures,BTCUSDT,1582334635877000,1582334636007260,42384781,buy,9670.8,1.85 -binance-futures,BTCUSDT,1582334635877000,1582334636012957,42384782,buy,9670.81,0.031 -binance-futures,BTCUSDT,1582334635877000,1582334636012969,42384783,buy,9670.82,0.031 -binance-futures,BTCUSDT,1582334635877000,1582334636016473,42384784,buy,9670.83,0.031 -binance-futures,BTCUSDT,1582334635877000,1582334636016479,42384785,buy,9670.87,0.092 -binance-futures,BTCUSDT,1582334636864000,1582334636983491,42384786,buy,9671.18,0.012 -binance-futures,BTCUSDT,1582334636864000,1582334636983671,42384787,buy,9671.18,1.622 -binance-futures,BTCUSDT,1582334643126000,1582334643247720,42384788,buy,9672,0.001 -binance-futures,BTCUSDT,1582334643476000,1582334643601724,42384789,sell,9672.15,0.004 -binance-futures,BTCUSDT,1582334647345000,1582334647466788,42384790,sell,9672.17,0.025 -binance-futures,BTCUSDT,1582334647577000,1582334647711445,42384791,sell,9672.17,0.006 -binance-futures,BTCUSDT,1582334647577000,1582334647716189,42384792,sell,9672.16,0.019 -binance-futures,BTCUSDT,1582334648293000,1582334648414104,42384793,buy,9672.28,0.01 -binance-futures,BTCUSDT,1582334649268000,1582334649399677,42384794,buy,9672.28,0.01 -binance-futures,BTCUSDT,1582334649334000,1582334649456178,42384795,buy,9672.28,0.027 -binance-futures,BTCUSDT,1582334649334000,1582334649460031,42384796,buy,9672.42,0.073 -binance-futures,BTCUSDT,1582334651754000,1582334651876606,42384797,buy,9672.42,0.861 -binance-futures,BTCUSDT,1582334652780000,1582334652898744,42384798,buy,9672.42,0.05 -binance-futures,BTCUSDT,1582334653494000,1582334653613422,42384799,buy,9672.42,2 -binance-futures,BTCUSDT,1582334654528000,1582334654649372,42384800,buy,9672.48,0.012 -binance-futures,BTCUSDT,1582334662447000,1582334662567825,42384801,sell,9672.6,0.001 -binance-futures,BTCUSDT,1582334662634000,1582334662753179,42384802,buy,9672.61,0.1 -binance-futures,BTCUSDT,1582334662634000,1582334662753278,42384803,buy,9672.75,0.15 -binance-futures,BTCUSDT,1582334663583000,1582334663706777,42384804,sell,9672.72,0.006 -binance-futures,BTCUSDT,1582334665137000,1582334665260002,42384805,buy,9672.73,0.1 -binance-futures,BTCUSDT,1582334665137000,1582334665260230,42384806,buy,9672.75,1.9 -binance-futures,BTCUSDT,1582334667299000,1582334667430049,42384807,buy,9672.79,0.047 -binance-futures,BTCUSDT,1582334667299000,1582334667430056,42384808,buy,9673.2,0.013 -binance-futures,BTCUSDT,1582334667299000,1582334667430060,42384809,buy,9673.32,0.673 -binance-futures,BTCUSDT,1582334668648000,1582334668769257,42384810,buy,9673.32,0.068 -binance-futures,BTCUSDT,1582334669683000,1582334669811487,42384811,buy,9673.32,0.5 -binance-futures,BTCUSDT,1582334671167000,1582334671291480,42384812,buy,9673.32,0.3 -binance-futures,BTCUSDT,1582334676646000,1582334676766080,42384813,sell,9673.36,0.003 -binance-futures,BTCUSDT,1582334678002000,1582334678128093,42384814,buy,9673.65,0.1 -binance-futures,BTCUSDT,1582334678002000,1582334678128101,42384815,buy,9673.68,0.039 -binance-futures,BTCUSDT,1582334678002000,1582334678128105,42384816,buy,9673.91,0.061 -binance-futures,BTCUSDT,1582334678013000,1582334678132632,42384817,buy,9673.91,0.3 -binance-futures,BTCUSDT,1582334682900000,1582334683023399,42384818,buy,9673.86,0.1 -binance-futures,BTCUSDT,1582334684358000,1582334684483665,42384819,buy,9673.94,0.001 -binance-futures,BTCUSDT,1582334684358000,1582334684487364,42384820,buy,9674,0.004 -binance-futures,BTCUSDT,1582334684358000,1582334684490102,42384821,buy,9674.41,0.362 -binance-futures,BTCUSDT,1582334684358000,1582334684491696,42384822,buy,9674.43,0.067 -binance-futures,BTCUSDT,1582334685050000,1582334685172596,42384823,buy,9674.43,0.004 -binance-futures,BTCUSDT,1582334686390000,1582334686514615,42384824,buy,9674.43,0.035 -binance-futures,BTCUSDT,1582334690683000,1582334690805542,42384825,buy,9674.43,0.193 -binance-futures,BTCUSDT,1582334695685000,1582334695807380,42384826,buy,9674.43,1 -binance-futures,BTCUSDT,1582334699719000,1582334699840874,42384827,sell,9673.57,0.031 -binance-futures,BTCUSDT,1582334699719000,1582334699841079,42384828,sell,9673.57,6.6 -binance-futures,BTCUSDT,1582334699719000,1582334699845189,42384829,sell,9673.56,0.031 -binance-futures,BTCUSDT,1582334699719000,1582334699856219,42384830,sell,9673.55,0.031 -binance-futures,BTCUSDT,1582334699719000,1582334699856230,42384831,sell,9673.55,0.871 -binance-futures,BTCUSDT,1582334699719000,1582334699858174,42384832,sell,9673.54,0.031 -binance-futures,BTCUSDT,1582334699719000,1582334699858180,42384833,sell,9673.54,2.804 -binance-futures,BTCUSDT,1582334700330000,1582334700467991,42384834,buy,9673.97,0.031 -binance-futures,BTCUSDT,1582334700330000,1582334700467997,42384835,buy,9673.98,0.031 -binance-futures,BTCUSDT,1582334700330000,1582334700468004,42384836,buy,9673.99,0.031 -binance-futures,BTCUSDT,1582334700330000,1582334700469417,42384837,buy,9674.01,0.007 -binance-futures,BTCUSDT,1582334701102000,1582334701229453,42384838,buy,9674.28,0.558 -binance-futures,BTCUSDT,1582334710680000,1582334710801085,42384839,sell,9674.4,0.031 -binance-futures,BTCUSDT,1582334710680000,1582334710807502,42384840,sell,9674.39,0.031 -binance-futures,BTCUSDT,1582334710680000,1582334710807511,42384841,sell,9674.38,0.031 -binance-futures,BTCUSDT,1582334710680000,1582334710813859,42384842,sell,9674.37,0.031 -binance-futures,BTCUSDT,1582334710680000,1582334710815187,42384843,sell,9674.35,0.076 -binance-futures,BTCUSDT,1582334713110000,1582334713237848,42384844,buy,9674.43,0.08 -binance-futures,BTCUSDT,1582334713817000,1582334713938930,42384845,buy,9674.36,0.031 -binance-futures,BTCUSDT,1582334713817000,1582334713939537,42384846,buy,9674.37,0.031 -binance-futures,BTCUSDT,1582334713817000,1582334713946104,42384847,buy,9674.38,0.004 -binance-futures,BTCUSDT,1582334714094000,1582334714217060,42384848,buy,9674.39,0.031 -binance-futures,BTCUSDT,1582334714094000,1582334714217834,42384849,buy,9674.4,0.031 -binance-futures,BTCUSDT,1582334714094000,1582334714227405,42384850,buy,9674.41,0.031 -binance-futures,BTCUSDT,1582334714094000,1582334714227423,42384851,buy,9674.43,0.007 -binance-futures,BTCUSDT,1582334718396000,1582334718521983,42384852,buy,9674.37,0.3 -binance-futures,BTCUSDT,1582334718430000,1582334718555172,42384853,sell,9674.36,0.2 -binance-futures,BTCUSDT,1582334720291000,1582334720437131,42384854,sell,9674.36,0.1 -binance-futures,BTCUSDT,1582334721815000,1582334721936619,42384855,sell,9674.36,0.173 -binance-futures,BTCUSDT,1582334727450000,1582334727575675,42384856,buy,9674.37,0.091 -binance-futures,BTCUSDT,1582334728470000,1582334728594769,42384857,sell,9674.36,0.209 -binance-futures,BTCUSDT,1582334728876000,1582334728996529,42384858,buy,9674.36,2 -binance-futures,BTCUSDT,1582334730205000,1582334730328923,42384859,buy,9674.36,0.002 -binance-futures,BTCUSDT,1582334731400000,1582334731524054,42384860,buy,9674.36,0.836 -binance-futures,BTCUSDT,1582334734988000,1582334735111607,42384861,sell,9674.35,0.763 -binance-futures,BTCUSDT,1582334734988000,1582334735119665,42384862,sell,9674.35,0.051 -binance-futures,BTCUSDT,1582334734988000,1582334735120385,42384863,sell,9674,0.01 -binance-futures,BTCUSDT,1582334735067000,1582334735190232,42384864,sell,9673.85,0.196 -binance-futures,BTCUSDT,1582334735448000,1582334735570505,42384865,sell,9673.23,0.075 -binance-futures,BTCUSDT,1582334739369000,1582334739490224,42384866,sell,9673.23,0.607 -binance-futures,BTCUSDT,1582334739369000,1582334739490730,42384867,sell,9672.5,0.011 -binance-futures,BTCUSDT,1582334739369000,1582334739495948,42384868,sell,9672.49,0.382 -binance-futures,BTCUSDT,1582334740623000,1582334740745135,42384869,sell,9672.53,0.031 -binance-futures,BTCUSDT,1582334740623000,1582334740745141,42384870,sell,9672.52,0.031 -binance-futures,BTCUSDT,1582334740623000,1582334740748054,42384871,sell,9672.51,0.031 -binance-futures,BTCUSDT,1582334740623000,1582334740752441,42384872,sell,9672.49,0.016 -binance-futures,BTCUSDT,1582334742924000,1582334743048627,42384873,buy,9672.52,0.031 -binance-futures,BTCUSDT,1582334742924000,1582334743056003,42384874,buy,9672.53,0.031 -binance-futures,BTCUSDT,1582334742924000,1582334743056013,42384875,buy,9672.54,0.031 -binance-futures,BTCUSDT,1582334742924000,1582334743056023,42384876,buy,9672.55,0.025 -binance-futures,BTCUSDT,1582334742924000,1582334743060669,42384877,buy,9672.89,0.13 -binance-futures,BTCUSDT,1582334746236000,1582334746361079,42384878,sell,9672.96,0.031 -binance-futures,BTCUSDT,1582334746236000,1582334746362077,42384879,sell,9672.95,0.031 -binance-futures,BTCUSDT,1582334746236000,1582334746365735,42384880,sell,9672.94,0.021 -binance-futures,BTCUSDT,1582334755470000,1582334755596673,42384881,buy,9672.98,0.01 -binance-futures,BTCUSDT,1582334755872000,1582334755994815,42384882,buy,9672.98,0.16 -binance-futures,BTCUSDT,1582334755872000,1582334755994844,42384883,buy,9672.98,0.1 -binance-futures,BTCUSDT,1582334755872000,1582334755995498,42384884,buy,9673,0.74 -binance-futures,BTCUSDT,1582334758049000,1582334758174611,42384885,sell,9673.21,0.031 -binance-futures,BTCUSDT,1582334758049000,1582334758174622,42384886,sell,9673.2,0.031 -binance-futures,BTCUSDT,1582334758049000,1582334758179761,42384887,sell,9673.19,0.031 -binance-futures,BTCUSDT,1582334758049000,1582334758188139,42384888,sell,9673.15,0.031 -binance-futures,BTCUSDT,1582334758049000,1582334758190636,42384889,sell,9673.13,0.031 -binance-futures,BTCUSDT,1582334758049000,1582334758191977,42384890,sell,9673.05,0.003 -binance-futures,BTCUSDT,1582334758049000,1582334758197375,42384891,sell,9672.99,0.1 -binance-futures,BTCUSDT,1582334758049000,1582334758198714,42384892,sell,9672.91,0.024 -binance-futures,BTCUSDT,1582334758049000,1582334758198724,42384893,sell,9672.91,0.862 -binance-futures,BTCUSDT,1582334758049000,1582334758199633,42384894,sell,9672.8,2.749 -binance-futures,BTCUSDT,1582334758049000,1582334758200662,42384895,sell,9672.55,0.107 -binance-futures,BTCUSDT,1582334763400000,1582334763525768,42384896,sell,9673.39,0.031 -binance-futures,BTCUSDT,1582334763400000,1582334763528694,42384897,sell,9673.38,0.031 -binance-futures,BTCUSDT,1582334763400000,1582334763528701,42384898,sell,9673.37,0.031 -binance-futures,BTCUSDT,1582334763400000,1582334763534791,42384899,sell,9673.36,0.031 -binance-futures,BTCUSDT,1582334763400000,1582334763534802,42384900,sell,9673.34,0.001 -binance-futures,BTCUSDT,1582334763400000,1582334763538095,42384901,sell,9673.34,1.811 -binance-futures,BTCUSDT,1582334766521000,1582334766642666,42384902,buy,9673.59,0.1 -binance-futures,BTCUSDT,1582334766521000,1582334766643021,42384903,buy,9673.85,0.004 -binance-futures,BTCUSDT,1582334766521000,1582334766646814,42384904,buy,9673.85,0.046 -binance-futures,BTCUSDT,1582334776930000,1582334777054593,42384905,buy,9673.88,0.007 -binance-futures,BTCUSDT,1582334783996000,1582334784118107,42384906,buy,9673.32,0.1 -binance-futures,BTCUSDT,1582334787449000,1582334787572129,42384907,buy,9673.93,0.031 -binance-futures,BTCUSDT,1582334787449000,1582334787574367,42384908,buy,9673.94,0.031 -binance-futures,BTCUSDT,1582334787449000,1582334787574373,42384909,buy,9673.95,0.031 -binance-futures,BTCUSDT,1582334787449000,1582334787577666,42384910,buy,9673.96,0.031 -binance-futures,BTCUSDT,1582334787449000,1582334787577673,42384911,buy,9674,0.142 -binance-futures,BTCUSDT,1582334787449000,1582334787584878,42384912,buy,9674,0.122 -binance-futures,BTCUSDT,1582334787449000,1582334787584892,42384913,buy,9674.33,0.683 -binance-futures,BTCUSDT,1582334787449000,1582334787587912,42384914,buy,9674.36,0.231 -binance-futures,BTCUSDT,1582334793830000,1582334793951371,42384915,buy,9674.36,0.338 -binance-futures,BTCUSDT,1582334795000000,1582334795119389,42384916,buy,9674.36,0.5 -binance-futures,BTCUSDT,1582334799643000,1582334799762145,42384917,buy,9674.36,0.003 -binance-futures,BTCUSDT,1582334800230000,1582334800354695,42384918,buy,9674.36,0.054 -binance-futures,BTCUSDT,1582334800315000,1582334800438684,42384919,sell,9674.35,0.425 -binance-futures,BTCUSDT,1582334801143000,1582334801266333,42384920,buy,9674.36,0.5 -binance-futures,BTCUSDT,1582334801159000,1582334801282259,42384921,buy,9674.36,0.2 -binance-futures,BTCUSDT,1582334801229000,1582334801352039,42384922,buy,9674.36,0.017 -binance-futures,BTCUSDT,1582334805448000,1582334805570658,42384923,buy,9674.36,0.3 -binance-futures,BTCUSDT,1582334808707000,1582334808828493,42384924,buy,9674.36,0.018 -binance-futures,BTCUSDT,1582334814192000,1582334814313447,42384925,buy,9674.36,0.434 -binance-futures,BTCUSDT,1582334821485000,1582334821607491,42384926,sell,9674.35,3.485 -binance-futures,BTCUSDT,1582334821505000,1582334821629550,42384927,sell,9674.13,0.429 -binance-futures,BTCUSDT,1582334821505000,1582334821632186,42384928,sell,9674.13,0.429 -binance-futures,BTCUSDT,1582334821505000,1582334821632193,42384929,sell,9674.13,0.429 -binance-futures,BTCUSDT,1582334821505000,1582334821632197,42384930,sell,9674.13,0.429 -binance-futures,BTCUSDT,1582334821505000,1582334821632200,42384931,sell,9674.13,0.284 -binance-futures,BTCUSDT,1582334821506000,1582334821632203,42384932,sell,9674.13,2 -binance-futures,BTCUSDT,1582334821506000,1582334821632206,42384933,sell,9674.13,2 -binance-futures,BTCUSDT,1582334821508000,1582334821638096,42384934,sell,9674.13,1.287 -binance-futures,BTCUSDT,1582334821535000,1582334821661671,42384935,sell,9673.85,2 -binance-futures,BTCUSDT,1582334821561000,1582334821683675,42384936,sell,9673.85,2 -binance-futures,BTCUSDT,1582334821563000,1582334821686116,42384937,sell,9673.85,1.248 -binance-futures,BTCUSDT,1582334821586000,1582334821709245,42384938,sell,9673.21,2 -binance-futures,BTCUSDT,1582334821607000,1582334821732643,42384939,sell,9673.21,0.1 -binance-futures,BTCUSDT,1582334821607000,1582334821733149,42384940,sell,9673.2,0.012 -binance-futures,BTCUSDT,1582334821607000,1582334821734793,42384941,sell,9673.2,3.569 -binance-futures,BTCUSDT,1582334821636000,1582334821762617,42384942,sell,9672.92,0.934 -binance-futures,BTCUSDT,1582334821636000,1582334821765586,42384943,sell,9672.81,0.284 -binance-futures,BTCUSDT,1582334821636000,1582334821767263,42384944,sell,9672.81,0.796 -binance-futures,BTCUSDT,1582334821638000,1582334821768641,42384945,sell,9672.81,2.014 -binance-futures,BTCUSDT,1582334821638000,1582334821768644,42384946,sell,9672.81,1.058 -binance-futures,BTCUSDT,1582334821638000,1582334821768647,42384947,sell,9672.74,0.815 -binance-futures,BTCUSDT,1582334821638000,1582334821769874,42384948,sell,9672.74,0.141 -binance-futures,BTCUSDT,1582334821650000,1582334821779786,42384949,sell,9672.74,0.674 -binance-futures,BTCUSDT,1582334821650000,1582334821779790,42384950,sell,9672.73,0.1 -binance-futures,BTCUSDT,1582334821690000,1582334821817411,42384951,sell,9672.66,0.683 -binance-futures,BTCUSDT,1582334821690000,1582334821820613,42384952,sell,9672.6,0.039 -binance-futures,BTCUSDT,1582334821738000,1582334821868896,42384953,sell,9672.46,0.012 -binance-futures,BTCUSDT,1582334821738000,1582334821871742,42384954,sell,9672.46,3.216 -binance-futures,BTCUSDT,1582334821768000,1582334821896156,42384955,sell,9672.46,0.701 -binance-futures,BTCUSDT,1582334821951000,1582334822077711,42384956,sell,9672.46,1.409 -binance-futures,BTCUSDT,1582334821951000,1582334822077943,42384957,sell,9672.46,0.005 -binance-futures,BTCUSDT,1582334822487000,1582334822614506,42384958,sell,9671.95,4.682 -binance-futures,BTCUSDT,1582334822544000,1582334822669546,42384959,sell,9671.36,0.007 -binance-futures,BTCUSDT,1582334822544000,1582334822672399,42384960,sell,9671.36,3.053 -binance-futures,BTCUSDT,1582334822575000,1582334822697364,42384961,sell,9671.01,0.004 -binance-futures,BTCUSDT,1582334822575000,1582334822702001,42384962,sell,9671.01,0.002 -binance-futures,BTCUSDT,1582334822575000,1582334822702010,42384963,sell,9671.01,3.936 -binance-futures,BTCUSDT,1582334822575000,1582334822703749,42384964,sell,9671,0.548 -binance-futures,BTCUSDT,1582334822575000,1582334822703766,42384965,sell,9671,2 -binance-futures,BTCUSDT,1582334822603000,1582334822728748,42384966,sell,9671.01,0.039 -binance-futures,BTCUSDT,1582334822603000,1582334822733804,42384967,sell,9671,2.887 -binance-futures,BTCUSDT,1582334824359000,1582334824496370,42384968,sell,9671,0.039 -binance-futures,BTCUSDT,1582334826721000,1582334826838019,42384969,sell,9671,0.1 -binance-futures,BTCUSDT,1582334831193000,1582334831313166,42384970,buy,9671.01,1 -binance-futures,BTCUSDT,1582334832256000,1582334832398060,42384971,sell,9671.2,0.03 -binance-futures,BTCUSDT,1582334838762000,1582334838881523,42384972,buy,9671.02,0.721 -binance-futures,BTCUSDT,1582334839111000,1582334839233888,42384973,buy,9671.02,1.222 -binance-futures,BTCUSDT,1582334844063000,1582334844269263,42384974,sell,9671.01,0.978 -binance-futures,BTCUSDT,1582334847995000,1582334848119968,42384975,sell,9671.01,0.022 -binance-futures,BTCUSDT,1582334847995000,1582334848120243,42384976,sell,9671.01,0.682 -binance-futures,BTCUSDT,1582334847995000,1582334848120256,42384977,sell,9671,0.294 -binance-futures,BTCUSDT,1582334847995000,1582334848126930,42384978,sell,9671,3.194 -binance-futures,BTCUSDT,1582334847995000,1582334848126941,42384979,sell,9670.49,2.425 -binance-futures,BTCUSDT,1582334847995000,1582334848132818,42384980,sell,9670.27,0.587 -binance-futures,BTCUSDT,1582334847995000,1582334848138525,42384981,sell,9670,0.05 -binance-futures,BTCUSDT,1582334847995000,1582334848142233,42384982,sell,9670,0.005 -binance-futures,BTCUSDT,1582334847995000,1582334848144002,42384983,sell,9669.95,2.138 -binance-futures,BTCUSDT,1582334847995000,1582334848148271,42384984,sell,9669.69,0.1 -binance-futures,BTCUSDT,1582334847995000,1582334848148696,42384985,sell,9668.2,0.089 -binance-futures,BTCUSDT,1582334847995000,1582334848150128,42384986,sell,9667.84,0.453 -binance-futures,BTCUSDT,1582334849729000,1582334849862193,42384987,sell,9669.78,2 -binance-futures,BTCUSDT,1582334849881000,1582334850008524,42384988,sell,9669.46,0.426 -binance-futures,BTCUSDT,1582334852834000,1582334852956166,42384989,sell,9669.95,1.2 -binance-futures,BTCUSDT,1582334854157000,1582334854280187,42384990,buy,9670.57,0.031 -binance-futures,BTCUSDT,1582334854157000,1582334854281146,42384991,buy,9670.58,0.031 -binance-futures,BTCUSDT,1582334854157000,1582334854281155,42384992,buy,9670.59,0.031 -binance-futures,BTCUSDT,1582334854157000,1582334854286046,42384993,buy,9670.6,0.031 -binance-futures,BTCUSDT,1582334854157000,1582334854288716,42384994,buy,9671.02,0.076 -binance-futures,BTCUSDT,1582334858450000,1582334858573031,42384995,sell,9671.03,0.1 -binance-futures,BTCUSDT,1582334859404000,1582334859525290,42384996,sell,9669.58,0.001 -binance-futures,BTCUSDT,1582334864979000,1582334865102141,42384997,sell,9669.94,0.031 -binance-futures,BTCUSDT,1582334864979000,1582334865102153,42384998,sell,9669.93,0.031 -binance-futures,BTCUSDT,1582334864979000,1582334865102720,42384999,sell,9669.92,0.031 -binance-futures,BTCUSDT,1582334864979000,1582334865107170,42385000,sell,9669.91,0.031 -binance-futures,BTCUSDT,1582334864979000,1582334865115032,42385001,sell,9669.89,0.001 -binance-futures,BTCUSDT,1582334868420000,1582334868540120,42385002,buy,9670.2,0.001 -binance-futures,BTCUSDT,1582334870536000,1582334870657902,42385003,sell,9669.27,0.091 -binance-futures,BTCUSDT,1582334876183000,1582334876306203,42385004,sell,9669.65,0.031 -binance-futures,BTCUSDT,1582334876183000,1582334876306278,42385005,sell,9669.64,0.031 -binance-futures,BTCUSDT,1582334876183000,1582334876306672,42385006,sell,9669.63,0.013 -binance-futures,BTCUSDT,1582334880369000,1582334880487284,42385007,buy,9669.71,0.001 -binance-futures,BTCUSDT,1582334880522000,1582334880646547,42385008,buy,9669.77,0.031 -binance-futures,BTCUSDT,1582334880522000,1582334880652093,42385009,buy,9669.78,0.031 -binance-futures,BTCUSDT,1582334880522000,1582334880652100,42385010,buy,9669.79,0.031 -binance-futures,BTCUSDT,1582334880522000,1582334880655098,42385011,buy,9669.8,0.031 -binance-futures,BTCUSDT,1582334880522000,1582334880655105,42385012,buy,9670.38,0.119 -binance-futures,BTCUSDT,1582334882473000,1582334882599307,42385013,buy,9669.76,0.01 -binance-futures,BTCUSDT,1582334882688000,1582334882810159,42385014,sell,9669.59,0.1 -binance-futures,BTCUSDT,1582334882729000,1582334882853189,42385015,sell,9669.34,0.1 -binance-futures,BTCUSDT,1582334882855000,1582334882979156,42385016,sell,9669.34,0.075 -binance-futures,BTCUSDT,1582334882973000,1582334883095235,42385017,sell,9669.34,0.825 -binance-futures,BTCUSDT,1582334883014000,1582334883138202,42385018,sell,9669.03,1.3 -binance-futures,BTCUSDT,1582334883017000,1582334883144665,42385019,sell,9669.03,2.057 -binance-futures,BTCUSDT,1582334883019000,1582334883148752,42385020,sell,9669.03,1.247 -binance-futures,BTCUSDT,1582334883171000,1582334883309011,42385021,sell,9667.79,0.21 -binance-futures,BTCUSDT,1582334883184000,1582334883317679,42385022,sell,9667.79,0.67 -binance-futures,BTCUSDT,1582334883217000,1582334883348632,42385023,buy,9667.8,0.03 -binance-futures,BTCUSDT,1582334883217000,1582334883349729,42385024,buy,9667.8,0.145 -binance-futures,BTCUSDT,1582334883502000,1582334883629032,42385025,buy,9667.72,0.857 -binance-futures,BTCUSDT,1582334883502000,1582334883629042,42385026,buy,9667.73,0.143 -binance-futures,BTCUSDT,1582334884873000,1582334884994931,42385027,buy,9667,0.224 -binance-futures,BTCUSDT,1582334885566000,1582334885685552,42385028,buy,9667,0.001 -binance-futures,BTCUSDT,1582334888542000,1582334888664666,42385029,sell,9666.99,0.047 -binance-futures,BTCUSDT,1582334888542000,1582334888667638,42385030,sell,9666.99,3.534 -binance-futures,BTCUSDT,1582334888542000,1582334888670859,42385031,sell,9666.26,0.014 -binance-futures,BTCUSDT,1582334888542000,1582334888670864,42385032,sell,9666.25,0.012 -binance-futures,BTCUSDT,1582334888542000,1582334888675204,42385033,sell,9666.18,0.1 -binance-futures,BTCUSDT,1582334888542000,1582334888679871,42385034,sell,9666.08,0.047 -binance-futures,BTCUSDT,1582334888542000,1582334888679890,42385035,sell,9665.86,5.16 -binance-futures,BTCUSDT,1582334888542000,1582334888682354,42385036,sell,9665.45,0.686 -binance-futures,BTCUSDT,1582334889961000,1582334890083789,42385037,sell,9665.45,0.3 -binance-futures,BTCUSDT,1582334892848000,1582334892972524,42385038,sell,9666.29,0.031 -binance-futures,BTCUSDT,1582334892848000,1582334892973049,42385039,sell,9666.28,0.031 -binance-futures,BTCUSDT,1582334892848000,1582334892973058,42385040,sell,9666.27,0.031 -binance-futures,BTCUSDT,1582334892848000,1582334892976303,42385041,sell,9666.17,0.001 -binance-futures,BTCUSDT,1582334892848000,1582334892983373,42385042,sell,9666.12,1.906 -binance-futures,BTCUSDT,1582334892917000,1582334893043195,42385043,sell,9666.03,0.006 -binance-futures,BTCUSDT,1582334894987000,1582334895112627,42385044,sell,9666.75,0.031 -binance-futures,BTCUSDT,1582334894987000,1582334895112644,42385045,sell,9666.74,0.031 -binance-futures,BTCUSDT,1582334894987000,1582334895114735,42385046,sell,9666.73,0.008 -binance-futures,BTCUSDT,1582334894987000,1582334895121709,42385047,sell,9666.72,0.031 -binance-futures,BTCUSDT,1582334894987000,1582334895121729,42385048,sell,9666.71,0.002 -binance-futures,BTCUSDT,1582334897515000,1582334897636722,42385049,buy,9666.96,0.93 -binance-futures,BTCUSDT,1582334899307000,1582334899433016,42385050,sell,9667,0.07 -binance-futures,BTCUSDT,1582334899307000,1582334899433022,42385051,sell,9666.83,4.319 -binance-futures,BTCUSDT,1582334901031000,1582334901153763,42385052,sell,9666.43,0.08 -binance-futures,BTCUSDT,1582334901474000,1582334901594373,42385053,sell,9666.43,0.001 -binance-futures,BTCUSDT,1582334901519000,1582334901642725,42385054,buy,9666.77,0.001 -binance-futures,BTCUSDT,1582334905679000,1582334905800536,42385055,sell,9666.44,0.15 -binance-futures,BTCUSDT,1582334905771000,1582334905894248,42385056,buy,9666.7,0.031 -binance-futures,BTCUSDT,1582334905771000,1582334905894254,42385057,buy,9666.71,0.031 -binance-futures,BTCUSDT,1582334905771000,1582334905895653,42385058,buy,9666.72,0.031 -binance-futures,BTCUSDT,1582334905771000,1582334905895666,42385059,buy,9666.73,0.031 -binance-futures,BTCUSDT,1582334905771000,1582334905899647,42385060,buy,9666.83,0.008 -binance-futures,BTCUSDT,1582334905922000,1582334906045631,42385061,buy,9666.83,0.055 -binance-futures,BTCUSDT,1582334906997000,1582334907114677,42385062,sell,9666.43,0.601 -binance-futures,BTCUSDT,1582334906997000,1582334907114699,42385063,sell,9666.43,0.25 -binance-futures,BTCUSDT,1582334908431000,1582334908553155,42385064,buy,9666.39,0.031 -binance-futures,BTCUSDT,1582334908431000,1582334908553427,42385065,buy,9666.4,0.031 -binance-futures,BTCUSDT,1582334908431000,1582334908559538,42385066,buy,9666.41,0.031 -binance-futures,BTCUSDT,1582334908431000,1582334908559545,42385067,buy,9666.43,0.007 -binance-futures,BTCUSDT,1582334913297000,1582334913419492,42385068,sell,9666.28,0.24 -binance-futures,BTCUSDT,1582334914931000,1582334915057029,42385069,buy,9666.43,0.32 -binance-futures,BTCUSDT,1582334914938000,1582334915066228,42385070,buy,9666.43,0.67 -binance-futures,BTCUSDT,1582334914940000,1582334915066235,42385071,buy,9666.43,0.152 -binance-futures,BTCUSDT,1582334915006000,1582334915129048,42385072,buy,9666.83,0.548 -binance-futures,BTCUSDT,1582334917920000,1582334918040835,42385073,buy,9668.22,0.042 -binance-futures,BTCUSDT,1582334917920000,1582334918041150,42385074,buy,9668.22,0.008 -binance-futures,BTCUSDT,1582334920493000,1582334920614198,42385075,sell,9666.96,0.02 -binance-futures,BTCUSDT,1582334920493000,1582334920614637,42385076,sell,9666.95,0.792 -binance-futures,BTCUSDT,1582334920866000,1582334920987315,42385077,buy,9666.79,0.188 -binance-futures,BTCUSDT,1582334920894000,1582334921020019,42385078,sell,9668.14,0.012 -binance-futures,BTCUSDT,1582334921610000,1582334921733525,42385079,sell,9666.34,0.009 -binance-futures,BTCUSDT,1582334921610000,1582334921733574,42385080,sell,9666.34,0.001 -binance-futures,BTCUSDT,1582334923602000,1582334923722359,42385081,buy,9667.77,0.015 -binance-futures,BTCUSDT,1582334923602000,1582334923722453,42385082,buy,9667.77,0.004 -binance-futures,BTCUSDT,1582334923602000,1582334923722764,42385083,buy,9667.77,0.026 -binance-futures,BTCUSDT,1582334923602000,1582334923726002,42385084,buy,9667.78,0.155 -binance-futures,BTCUSDT,1582334923605000,1582334923731758,42385085,buy,9667.78,0.2 -binance-futures,BTCUSDT,1582334923617000,1582334923737245,42385086,buy,9667.78,0.548 -binance-futures,BTCUSDT,1582334923617000,1582334923737521,42385087,buy,9667.81,0.052 -binance-futures,BTCUSDT,1582334923705000,1582334923830910,42385088,buy,9667.75,0.048 -binance-futures,BTCUSDT,1582334924235000,1582334924358716,42385089,buy,9667.75,0.38 -binance-futures,BTCUSDT,1582334924693000,1582334924814893,42385090,buy,9667.81,0.4 -binance-futures,BTCUSDT,1582334937927000,1582334938046432,42385091,sell,9667.13,0.011 -binance-futures,BTCUSDT,1582334939700000,1582334939821307,42385092,sell,9667.13,0.003 -binance-futures,BTCUSDT,1582334940895000,1582334941015525,42385093,buy,9667.39,0.24 -binance-futures,BTCUSDT,1582334941725000,1582334941849794,42385094,sell,9667.38,0.884 -binance-futures,BTCUSDT,1582334941725000,1582334941849800,42385095,sell,9667.38,0.292 -binance-futures,BTCUSDT,1582334941913000,1582334942036358,42385096,buy,9667.39,0.02 -binance-futures,BTCUSDT,1582334953000000,1582334953125052,42385097,sell,9667.13,0.67 -binance-futures,BTCUSDT,1582334953046000,1582334953167909,42385098,sell,9667.13,0.316 -binance-futures,BTCUSDT,1582334953265000,1582334953387315,42385099,buy,9666.8,0.005 -binance-futures,BTCUSDT,1582334953743000,1582334953868157,42385100,buy,9666.38,0.031 -binance-futures,BTCUSDT,1582334953743000,1582334953868175,42385101,buy,9666.38,1.969 -binance-futures,BTCUSDT,1582334958185000,1582334958322025,42385102,sell,9666.35,0.1 -binance-futures,BTCUSDT,1582334958185000,1582334958322035,42385103,sell,9666.33,0.1 -binance-futures,BTCUSDT,1582334958185000,1582334958327356,42385104,sell,9666.28,0.682 -binance-futures,BTCUSDT,1582334958185000,1582334958327363,42385105,sell,9666.27,1 -binance-futures,BTCUSDT,1582334958185000,1582334958330103,42385106,sell,9666.27,1 -binance-futures,BTCUSDT,1582334958185000,1582334958330114,42385107,sell,9666.19,0.228 -binance-futures,BTCUSDT,1582334958185000,1582334958330117,42385108,sell,9665.78,0.1 -binance-futures,BTCUSDT,1582334958185000,1582334958335664,42385109,sell,9665.38,0.5 -binance-futures,BTCUSDT,1582334958750000,1582334958871736,42385110,buy,9665.85,0.257 -binance-futures,BTCUSDT,1582334959922000,1582334960043756,42385111,buy,9666.08,0.093 -binance-futures,BTCUSDT,1582334968735000,1582334968862698,42385112,buy,9665.7,0.031 -binance-futures,BTCUSDT,1582334968735000,1582334968862706,42385113,buy,9665.71,0.031 -binance-futures,BTCUSDT,1582334968735000,1582334968862710,42385114,buy,9665.72,0.031 -binance-futures,BTCUSDT,1582334968735000,1582334968871069,42385115,buy,9665.74,0.159 -binance-futures,BTCUSDT,1582334970366000,1582334970491746,42385116,sell,9665.21,0.006 -binance-futures,BTCUSDT,1582334970366000,1582334970491755,42385117,sell,9665.14,0.01 -binance-futures,BTCUSDT,1582334970366000,1582334970495333,42385118,sell,9665,0.05 -binance-futures,BTCUSDT,1582334970366000,1582334970497878,42385119,sell,9665,0.025 -binance-futures,BTCUSDT,1582334970366000,1582334970498911,42385120,sell,9664.7,0.004 -binance-futures,BTCUSDT,1582334970366000,1582334970498918,42385121,sell,9664.7,0.012 -binance-futures,BTCUSDT,1582334970366000,1582334970498921,42385122,sell,9664.7,0.093 -binance-futures,BTCUSDT,1582334971367000,1582334971491893,42385123,sell,9664.93,0.01 -binance-futures,BTCUSDT,1582334974117000,1582334974241627,42385124,sell,9665.05,0.002 -binance-futures,BTCUSDT,1582334975803000,1582334975923979,42385125,sell,9665.05,0.01 -binance-futures,BTCUSDT,1582334978748000,1582334978865854,42385126,sell,9664.98,0.031 -binance-futures,BTCUSDT,1582334978748000,1582334978866218,42385127,sell,9664.97,0.031 -binance-futures,BTCUSDT,1582334978748000,1582334978869921,42385128,sell,9664.96,0.031 -binance-futures,BTCUSDT,1582334978749000,1582334978875925,42385129,sell,9664.95,0.031 -binance-futures,BTCUSDT,1582334978749000,1582334978880834,42385130,sell,9664.66,0.012 -binance-futures,BTCUSDT,1582334978749000,1582334978880853,42385131,sell,9664.33,0.002 -binance-futures,BTCUSDT,1582334978749000,1582334978880859,42385132,sell,9664.32,0.37 -binance-futures,BTCUSDT,1582334979086000,1582334979207490,42385133,sell,9664.33,0.01 -binance-futures,BTCUSDT,1582334980307000,1582334980428924,42385134,sell,9664.34,0.01 -binance-futures,BTCUSDT,1582334982860000,1582334982985847,42385135,sell,9664.33,0.01 -binance-futures,BTCUSDT,1582334985309000,1582334985432511,42385136,sell,9664.33,0.042 -binance-futures,BTCUSDT,1582334985534000,1582334985659204,42385137,sell,9664.52,0.031 -binance-futures,BTCUSDT,1582334985534000,1582334985659806,42385138,sell,9664.51,0.031 -binance-futures,BTCUSDT,1582334985534000,1582334985666831,42385139,sell,9664.5,0.031 -binance-futures,BTCUSDT,1582334985534000,1582334985671948,42385140,sell,9664.49,0.3 -binance-futures,BTCUSDT,1582334985534000,1582334985671959,42385141,sell,9664.48,0.526 -binance-futures,BTCUSDT,1582334985534000,1582334985673322,42385142,sell,9664.44,0.031 -binance-futures,BTCUSDT,1582334985534000,1582334985675544,42385143,sell,9664.44,0.05 -binance-futures,BTCUSDT,1582334986097000,1582334986224524,42385144,buy,9665.45,0.67 -binance-futures,BTCUSDT,1582334986097000,1582334986224527,42385145,buy,9665.45,0.15 -binance-futures,BTCUSDT,1582334986097000,1582334986224530,42385146,buy,9665.45,0.09 -binance-futures,BTCUSDT,1582334986149000,1582334986268158,42385147,buy,9665.45,0.6 -binance-futures,BTCUSDT,1582334986151000,1582334986278080,42385148,buy,9665.45,0.01 -binance-futures,BTCUSDT,1582334986206000,1582334986330852,42385149,buy,9665.45,1 -binance-futures,BTCUSDT,1582334986411000,1582334986545791,42385150,buy,9665.45,0.01 -binance-futures,BTCUSDT,1582334986614000,1582334986738217,42385151,buy,9665.45,0.1 -binance-futures,BTCUSDT,1582334987079000,1582334987204735,42385152,sell,9665.73,0.01 -binance-futures,BTCUSDT,1582334987324000,1582334987449885,42385153,buy,9665.74,0.5 -binance-futures,BTCUSDT,1582334988554000,1582334988684400,42385154,sell,9667.14,0.004 -binance-futures,BTCUSDT,1582334989482000,1582334989605859,42385155,sell,9667.36,0.113 -binance-futures,BTCUSDT,1582334989858000,1582334989981040,42385156,buy,9667.37,0.026 -binance-futures,BTCUSDT,1582334989858000,1582334989986206,42385157,buy,9667.39,0.024 -binance-futures,BTCUSDT,1582334990002000,1582334990126859,42385158,buy,9667.39,0.083 -binance-futures,BTCUSDT,1582334990221000,1582334990361319,42385159,buy,9667.39,0.316 -binance-futures,BTCUSDT,1582334990262000,1582334990414635,42385160,buy,9667.64,1.366 -binance-futures,BTCUSDT,1582334990307000,1582334990436263,42385161,buy,9668.02,0.683 -binance-futures,BTCUSDT,1582334990612000,1582334990744927,42385162,sell,9668.41,0.031 -binance-futures,BTCUSDT,1582334990612000,1582334990744936,42385163,sell,9668.4,0.031 -binance-futures,BTCUSDT,1582334990612000,1582334990749888,42385164,sell,9668.39,0.031 -binance-futures,BTCUSDT,1582334990612000,1582334990749902,42385165,sell,9668.37,0.32 -binance-futures,BTCUSDT,1582334990665000,1582334990789145,42385166,sell,9668.45,0.003 -binance-futures,BTCUSDT,1582334990739000,1582334990865324,42385167,buy,9669,0.044 -binance-futures,BTCUSDT,1582334990984000,1582334991116084,42385168,buy,9669,0.056 -binance-futures,BTCUSDT,1582334990984000,1582334991116272,42385169,buy,9669,0.01 -binance-futures,BTCUSDT,1582334990984000,1582334991116281,42385170,buy,9669,0.001 -binance-futures,BTCUSDT,1582334993420000,1582334993542868,42385171,sell,9668.99,2 -binance-futures,BTCUSDT,1582334993752000,1582334993876258,42385172,buy,9669,0.009 -binance-futures,BTCUSDT,1582334993752000,1582334993876266,42385173,buy,9669,0.001 -binance-futures,BTCUSDT,1582334993752000,1582334993876283,42385174,buy,9669,0.001 -binance-futures,BTCUSDT,1582334993752000,1582334993876288,42385175,buy,9669,0.001 -binance-futures,BTCUSDT,1582334993752000,1582334993877104,42385176,buy,9669,0.001 -binance-futures,BTCUSDT,1582334993752000,1582334993877111,42385177,buy,9669,0.001 -binance-futures,BTCUSDT,1582334993752000,1582334993877114,42385178,buy,9669,0.001 -binance-futures,BTCUSDT,1582334993752000,1582334993877117,42385179,buy,9669,0.001 -binance-futures,BTCUSDT,1582334993752000,1582334993882007,42385180,buy,9669.81,0.004 -binance-futures,BTCUSDT,1582334993752000,1582334993886888,42385181,buy,9669.82,2.052 -binance-futures,BTCUSDT,1582334993752000,1582334993889076,42385182,buy,9669.83,0.782 -binance-futures,BTCUSDT,1582334993752000,1582334993891589,42385183,buy,9670.46,0.012 -binance-futures,BTCUSDT,1582334993752000,1582334993893311,42385184,buy,9670.84,0.886 -binance-futures,BTCUSDT,1582334993752000,1582334993894612,42385185,buy,9671.04,0.192 -binance-futures,BTCUSDT,1582334993752000,1582334993895290,42385186,buy,9671.05,0.443 -binance-futures,BTCUSDT,1582334993753000,1582334993895359,42385187,buy,9671.05,0.443 -binance-futures,BTCUSDT,1582334993753000,1582334993895869,42385188,buy,9671.15,3.37 -binance-futures,BTCUSDT,1582334994644000,1582334994764274,42385189,buy,9670.51,0.1 -binance-futures,BTCUSDT,1582334994644000,1582334994765544,42385190,buy,9670.51,0.127 -binance-futures,BTCUSDT,1582334999265000,1582334999386761,42385191,sell,9670.5,0.001 -binance-futures,BTCUSDT,1582335002165000,1582335002293922,42385192,buy,9670.51,2.035 -binance-futures,BTCUSDT,1582335002345000,1582335002476085,42385193,buy,9671.15,0.265 -binance-futures,BTCUSDT,1582335004221000,1582335004344170,42385194,buy,9671.15,0.035 -binance-futures,BTCUSDT,1582335004221000,1582335004350132,42385195,buy,9672.19,0.229 -binance-futures,BTCUSDT,1582335005043000,1582335005169382,42385196,buy,9670.8,0.06 -binance-futures,BTCUSDT,1582335005324000,1582335005448415,42385197,buy,9670.8,0.04 -binance-futures,BTCUSDT,1582335005324000,1582335005453496,42385198,buy,9671.04,0.557 -binance-futures,BTCUSDT,1582335005621000,1582335005745187,42385199,buy,9670.67,0.1 -binance-futures,BTCUSDT,1582335006652000,1582335006775695,42385200,buy,9670.68,0.01 -binance-futures,BTCUSDT,1582335006993000,1582335007115267,42385201,buy,9670.67,0.009 -binance-futures,BTCUSDT,1582335006993000,1582335007117552,42385202,buy,9670.68,0.001 -binance-futures,BTCUSDT,1582335008344000,1582335008469931,42385203,buy,9670.67,0.01 -binance-futures,BTCUSDT,1582335009162000,1582335009289671,42385204,buy,9670.67,0.01 -binance-futures,BTCUSDT,1582335010358000,1582335010483540,42385205,sell,9670.66,0.008 -binance-futures,BTCUSDT,1582335011220000,1582335011344353,42385206,buy,9670.67,0.01 -binance-futures,BTCUSDT,1582335012399000,1582335012529352,42385207,buy,9670.67,0.653 -binance-futures,BTCUSDT,1582335012399000,1582335012529360,42385208,buy,9670.67,0.347 -binance-futures,BTCUSDT,1582335015471000,1582335015598869,42385209,sell,9671.71,0.031 -binance-futures,BTCUSDT,1582335015471000,1582335015605445,42385210,sell,9671.7,0.031 -binance-futures,BTCUSDT,1582335015471000,1582335015605456,42385211,sell,9671.69,0.031 -binance-futures,BTCUSDT,1582335015471000,1582335015609310,42385212,sell,9671.67,0.076 -binance-futures,BTCUSDT,1582335023038000,1582335023163427,42385213,sell,9672.27,0.005 -binance-futures,BTCUSDT,1582335023038000,1582335023163998,42385214,sell,9672.26,0.031 -binance-futures,BTCUSDT,1582335023038000,1582335023173536,42385215,sell,9672.25,0.031 -binance-futures,BTCUSDT,1582335023038000,1582335023173552,42385216,sell,9672.24,0.014 -binance-futures,BTCUSDT,1582335023813000,1582335023938533,42385217,buy,9672.04,0.74 -binance-futures,BTCUSDT,1582335023813000,1582335023938543,42385218,buy,9672.04,0.72 -binance-futures,BTCUSDT,1582335023813000,1582335023938547,42385219,buy,9672.04,0.68 -binance-futures,BTCUSDT,1582335023813000,1582335023938556,42385220,buy,9672.04,0.67 -binance-futures,BTCUSDT,1582335023813000,1582335023938608,42385221,buy,9672.04,0.67 -binance-futures,BTCUSDT,1582335023813000,1582335023938611,42385222,buy,9672.04,0.672 -binance-futures,BTCUSDT,1582335023813000,1582335023938614,42385223,buy,9672.05,0.031 -binance-futures,BTCUSDT,1582335023813000,1582335023941430,42385224,buy,9672.06,0.031 -binance-futures,BTCUSDT,1582335023813000,1582335023948707,42385225,buy,9672.07,0.031 -binance-futures,BTCUSDT,1582335023813000,1582335023948722,42385226,buy,9672.08,0.031 -binance-futures,BTCUSDT,1582335023813000,1582335023953353,42385227,buy,9672.14,3.45 -binance-futures,BTCUSDT,1582335023813000,1582335023953368,42385228,buy,9672.28,0.047 -binance-futures,BTCUSDT,1582335023813000,1582335023954946,42385229,buy,9672.48,0.012 -binance-futures,BTCUSDT,1582335023813000,1582335023956313,42385230,buy,9672.67,1.221 -binance-futures,BTCUSDT,1582335023813000,1582335023958269,42385231,buy,9672.79,0.047 -binance-futures,BTCUSDT,1582335023813000,1582335023958273,42385232,buy,9672.79,0.947 -binance-futures,BTCUSDT,1582335024391000,1582335024516025,42385233,sell,9672.03,0.072 -binance-futures,BTCUSDT,1582335026393000,1582335026512362,42385234,sell,9672.4,0.039 -binance-futures,BTCUSDT,1582335027624000,1582335027750724,42385235,buy,9672.41,0.14 -binance-futures,BTCUSDT,1582335027748000,1582335027867474,42385236,buy,9672.41,1.034 -binance-futures,BTCUSDT,1582335030431000,1582335030554669,42385237,buy,9672.41,0.2 -binance-futures,BTCUSDT,1582335034497000,1582335034621195,42385238,buy,9673,0.68 -binance-futures,BTCUSDT,1582335034499000,1582335034623279,42385239,buy,9673,0.74 -binance-futures,BTCUSDT,1582335034505000,1582335034631888,42385240,buy,9672.58,0.72 -binance-futures,BTCUSDT,1582335034507000,1582335034634549,42385241,buy,9672.58,0.67 -binance-futures,BTCUSDT,1582335034511000,1582335034635296,42385242,buy,9672.58,0.67 -binance-futures,BTCUSDT,1582335035920000,1582335036040998,42385243,buy,9673,0.005 -binance-futures,BTCUSDT,1582335036279000,1582335036399853,42385244,buy,9673,1.034 -binance-futures,BTCUSDT,1582335038149000,1582335038272351,42385245,buy,9673.37,1.892 -binance-futures,BTCUSDT,1582335038220000,1582335038364632,42385246,buy,9673.37,1.034 -binance-futures,BTCUSDT,1582335038243000,1582335038368525,42385247,buy,9673.37,0.01 -binance-futures,BTCUSDT,1582335041821000,1582335041943734,42385248,sell,9674.01,0.178 -binance-futures,BTCUSDT,1582335042258000,1582335042414593,42385249,buy,9674.02,0.047 -binance-futures,BTCUSDT,1582335042383000,1582335042507116,42385250,buy,9674.02,0.318 -binance-futures,BTCUSDT,1582335050377000,1582335050503215,42385251,buy,9674.36,0.2 -binance-futures,BTCUSDT,1582335054403000,1582335054526821,42385252,buy,9674.36,0.109 -binance-futures,BTCUSDT,1582335058835000,1582335058956659,42385253,buy,9674.36,0.007 -binance-futures,BTCUSDT,1582335061771000,1582335061894662,42385254,sell,9674.35,0.1 -binance-futures,BTCUSDT,1582335061771000,1582335061895795,42385255,sell,9674.35,0.087 -binance-futures,BTCUSDT,1582335061771000,1582335061895804,42385256,sell,9674.35,0.052 -binance-futures,BTCUSDT,1582335061771000,1582335061895807,42385257,sell,9674.35,1.108 -binance-futures,BTCUSDT,1582335062010000,1582335062129880,42385258,sell,9674.02,0.02 -binance-futures,BTCUSDT,1582335069336000,1582335069473190,42385259,buy,9674.36,0.897 -binance-futures,BTCUSDT,1582335069337000,1582335069473432,42385260,buy,9674.36,2 -binance-futures,BTCUSDT,1582335069362000,1582335069483424,42385261,buy,9674.36,2 -binance-futures,BTCUSDT,1582335069363000,1582335069488343,42385262,buy,9674.36,10 -binance-futures,BTCUSDT,1582335069363000,1582335069488352,42385263,buy,9674.36,4.145 -binance-futures,BTCUSDT,1582335069363000,1582335069488357,42385264,buy,9674.36,0.682 -binance-futures,BTCUSDT,1582335069363000,1582335069488361,42385265,buy,9674.38,0.04 -binance-futures,BTCUSDT,1582335069390000,1582335069513832,42385266,buy,9675,0.004 -binance-futures,BTCUSDT,1582335069418000,1582335069542445,42385267,buy,9675.51,0.012 -binance-futures,BTCUSDT,1582335069442000,1582335069567928,42385268,buy,9675.89,2 -binance-futures,BTCUSDT,1582335069443000,1582335069570238,42385269,buy,9675.89,2.32 -binance-futures,BTCUSDT,1582335069476000,1582335069606329,42385270,buy,9676.25,0.012 -binance-futures,BTCUSDT,1582335069503000,1582335069626416,42385271,buy,9676.41,0.001 -binance-futures,BTCUSDT,1582335069503000,1582335069628446,42385272,buy,9676.41,0.001 -binance-futures,BTCUSDT,1582335069503000,1582335069628456,42385273,buy,9676.44,0.04 -binance-futures,BTCUSDT,1582335069507000,1582335069637070,42385274,buy,9676.5,3.234 -binance-futures,BTCUSDT,1582335069581000,1582335069706758,42385275,buy,9676.56,0.019 -binance-futures,BTCUSDT,1582335071759000,1582335071882756,42385276,sell,9676.55,0.057 -binance-futures,BTCUSDT,1582335072192000,1582335072598985,42385277,sell,9676.03,0.031 -binance-futures,BTCUSDT,1582335072192000,1582335072598990,42385278,sell,9676.02,0.031 -binance-futures,BTCUSDT,1582335072192000,1582335072599002,42385279,sell,9676.01,0.013 -binance-futures,BTCUSDT,1582335075539000,1582335075660210,42385280,sell,9676.55,0.1 -binance-futures,BTCUSDT,1582335075539000,1582335075660286,42385281,sell,9676.55,0.1 -binance-futures,BTCUSDT,1582335076059000,1582335076186119,42385282,buy,9676.56,0.019 -binance-futures,BTCUSDT,1582335076059000,1582335076186122,42385283,buy,9676.59,0.002 -binance-futures,BTCUSDT,1582335076287000,1582335076438027,42385284,buy,9676.59,0.001 -binance-futures,BTCUSDT,1582335076500000,1582335076621400,42385285,buy,9676.59,0.155 -binance-futures,BTCUSDT,1582335076597000,1582335076734785,42385286,buy,9676.59,0.155 -binance-futures,BTCUSDT,1582335076669000,1582335076791897,42385287,buy,9676.59,0.031 -binance-futures,BTCUSDT,1582335077424000,1582335077543784,42385288,buy,9676.59,0.589 -binance-futures,BTCUSDT,1582335077874000,1582335077995798,42385289,buy,9676.59,0.539 -binance-futures,BTCUSDT,1582335077880000,1582335078005331,42385290,buy,9676.59,0.777 -binance-futures,BTCUSDT,1582335077913000,1582335078036659,42385291,buy,9676.59,0.172 -binance-futures,BTCUSDT,1582335077930000,1582335078054421,42385292,buy,9676.59,0.554 -binance-futures,BTCUSDT,1582335077954000,1582335078075764,42385293,buy,9676.59,0.129 -binance-futures,BTCUSDT,1582335077974000,1582335078101652,42385294,buy,9676.59,1.265 -binance-futures,BTCUSDT,1582335077974000,1582335078101667,42385295,buy,9676.59,0.023 -binance-futures,BTCUSDT,1582335077992000,1582335078113708,42385296,buy,9676.59,0.259 -binance-futures,BTCUSDT,1582335078010000,1582335078132391,42385297,buy,9676.59,0.511 -binance-futures,BTCUSDT,1582335081381000,1582335081502400,42385298,buy,9676.59,5.167 -binance-futures,BTCUSDT,1582335081933000,1582335082051681,42385299,buy,9676.59,1.966 -binance-futures,BTCUSDT,1582335081933000,1582335082053547,42385300,buy,9676.77,2.877 -binance-futures,BTCUSDT,1582335081971000,1582335082104197,42385301,sell,9676.76,2.1 -binance-futures,BTCUSDT,1582335081971000,1582335082114944,42385302,sell,9676.7,2 -binance-futures,BTCUSDT,1582335081971000,1582335082116760,42385303,sell,9676.64,2 -binance-futures,BTCUSDT,1582335081971000,1582335082118673,42385304,sell,9676.64,2 -binance-futures,BTCUSDT,1582335081971000,1582335082118687,42385305,sell,9676.64,2.226 -binance-futures,BTCUSDT,1582335086369000,1582335086493848,42385306,buy,9677,0.002 -binance-futures,BTCUSDT,1582335086369000,1582335086493856,42385307,buy,9677.58,0.033 -binance-futures,BTCUSDT,1582335087801000,1582335087923207,42385308,buy,9677.58,0.007 -binance-futures,BTCUSDT,1582335087801000,1582335087927456,42385309,buy,9678,0.001 -binance-futures,BTCUSDT,1582335087801000,1582335087928378,42385310,buy,9678,0.203 -binance-futures,BTCUSDT,1582335088270000,1582335088395099,42385311,buy,9677.76,0.093 -binance-futures,BTCUSDT,1582335088958000,1582335089078836,42385312,buy,9677.58,0.08 -binance-futures,BTCUSDT,1582335089506000,1582335089631939,42385313,buy,9677.58,0.84 -binance-futures,BTCUSDT,1582335091909000,1582335092030096,42385314,buy,9677.77,0.031 -binance-futures,BTCUSDT,1582335091909000,1582335092030110,42385315,buy,9677.77,0.134 -binance-futures,BTCUSDT,1582335091923000,1582335092041909,42385316,buy,9677.77,0.039 -binance-futures,BTCUSDT,1582335092391000,1582335092516133,42385317,sell,9677.76,0.1 -binance-futures,BTCUSDT,1582335092736000,1582335092856300,42385318,buy,9677.58,2 -binance-futures,BTCUSDT,1582335093458000,1582335093583124,42385319,buy,9677.92,0.017 -binance-futures,BTCUSDT,1582335095149000,1582335095269367,42385320,buy,9677.81,0.031 -binance-futures,BTCUSDT,1582335095149000,1582335095273676,42385321,buy,9677.82,0.026 -binance-futures,BTCUSDT,1582335097393000,1582335097514484,42385322,buy,9678,0.032 -binance-futures,BTCUSDT,1582335097818000,1582335097938262,42385323,buy,9678,0.093 -binance-futures,BTCUSDT,1582335099125000,1582335099245807,42385324,buy,9678,0.03 -binance-futures,BTCUSDT,1582335100642000,1582335100764706,42385325,buy,9678,0.006 -binance-futures,BTCUSDT,1582335102785000,1582335102905901,42385326,sell,9677.99,0.031 -binance-futures,BTCUSDT,1582335102785000,1582335102908979,42385327,sell,9677.99,0.037 -binance-futures,BTCUSDT,1582335103842000,1582335103959029,42385328,buy,9678,1 -binance-futures,BTCUSDT,1582335106595000,1582335106718288,42385329,buy,9678,1 -binance-futures,BTCUSDT,1582335108900000,1582335109021197,42385330,buy,9678,0.007 -binance-futures,BTCUSDT,1582335109407000,1582335109532502,42385331,buy,9678,0.001 -binance-futures,BTCUSDT,1582335109520000,1582335109637800,42385332,buy,9678,0.01 -binance-futures,BTCUSDT,1582335110118000,1582335110233088,42385333,buy,9678,0.019 -binance-futures,BTCUSDT,1582335110432000,1582335110554936,42385334,buy,9678,0.047 -binance-futures,BTCUSDT,1582335110712000,1582335110832952,42385335,buy,9678,0.016 -binance-futures,BTCUSDT,1582335111894000,1582335112013480,42385336,buy,9678,0.413 -binance-futures,BTCUSDT,1582335112328000,1582335112453138,42385337,buy,9678,0.008 -binance-futures,BTCUSDT,1582335113180000,1582335113304817,42385338,buy,9678,1.002 -binance-futures,BTCUSDT,1582335113798000,1582335113916759,42385339,sell,9677.89,0.027 -binance-futures,BTCUSDT,1582335124898000,1582335125019627,42385340,sell,9677.99,0.4 -binance-futures,BTCUSDT,1582335124898000,1582335125021984,42385341,sell,9677.9,0.205 -binance-futures,BTCUSDT,1582335126615000,1582335126737524,42385342,buy,9678,0.1 -binance-futures,BTCUSDT,1582335126626000,1582335126749802,42385343,buy,9678,0.013 -binance-futures,BTCUSDT,1582335126626000,1582335126749815,42385344,buy,9678,0.167 -binance-futures,BTCUSDT,1582335130290000,1582335130412290,42385345,buy,9678,0.05 -binance-futures,BTCUSDT,1582335133533000,1582335133653474,42385346,sell,9677.99,0.01 -binance-futures,BTCUSDT,1582335134505000,1582335134627770,42385347,buy,9678,0.029 -binance-futures,BTCUSDT,1582335137675000,1582335137796173,42385348,buy,9678,0.059 -binance-futures,BTCUSDT,1582335137759000,1582335137880186,42385349,buy,9678,0.195 -binance-futures,BTCUSDT,1582335137797000,1582335137920726,42385350,buy,9678.09,0.047 -binance-futures,BTCUSDT,1582335137839000,1582335137961349,42385351,buy,9678.29,0.012 -binance-futures,BTCUSDT,1582335137947000,1582335138068809,42385352,buy,9678.51,0.003 -binance-futures,BTCUSDT,1582335147309000,1582335147437824,42385353,buy,9678.09,0.291 -binance-futures,BTCUSDT,1582335147327000,1582335147450458,42385354,buy,9678.09,0.01 -binance-futures,BTCUSDT,1582335148426000,1582335148548716,42385355,buy,9678.09,0.124 -binance-futures,BTCUSDT,1582335156069000,1582335156192727,42385356,buy,9678.09,0.077 -binance-futures,BTCUSDT,1582335156477000,1582335156599899,42385357,buy,9678.09,0.093 -binance-futures,BTCUSDT,1582335156477000,1582335156600181,42385358,buy,9678.51,0.041 -binance-futures,BTCUSDT,1582335159834000,1582335159959517,42385359,buy,9678.46,0.031 -binance-futures,BTCUSDT,1582335159834000,1582335159962025,42385360,buy,9678.51,0.475 -binance-futures,BTCUSDT,1582335165076000,1582335165198256,42385361,sell,9678.5,0.4 -binance-futures,BTCUSDT,1582335167940000,1582335168061688,42385362,buy,9678.51,0.124 -binance-futures,BTCUSDT,1582335171821000,1582335171944116,42385363,buy,9678.51,0.039 -binance-futures,BTCUSDT,1582335171821000,1582335171945776,42385364,buy,9678.52,0.003 -binance-futures,BTCUSDT,1582335171821000,1582335171949544,42385365,buy,9678.59,0.047 -binance-futures,BTCUSDT,1582335171821000,1582335171952017,42385366,buy,9678.59,0.039 -binance-futures,BTCUSDT,1582335171821000,1582335171953624,42385367,buy,9679.08,0.389 -binance-futures,BTCUSDT,1582335173342000,1582335173463879,42385368,buy,9679.58,0.762 -binance-futures,BTCUSDT,1582335173355000,1582335173478114,42385369,buy,9679.58,0.034 -binance-futures,BTCUSDT,1582335173433000,1582335173555089,42385370,buy,9679.58,0.032 -binance-futures,BTCUSDT,1582335173461000,1582335173581650,42385371,buy,9679.58,0.321 -binance-futures,BTCUSDT,1582335173611000,1582335173731277,42385372,buy,9679.58,2.638 -binance-futures,BTCUSDT,1582335173814000,1582335173940422,42385373,buy,9680,0.005 -binance-futures,BTCUSDT,1582335173814000,1582335173940428,42385374,buy,9680,0.002 -binance-futures,BTCUSDT,1582335173814000,1582335173940432,42385375,buy,9680,1 -binance-futures,BTCUSDT,1582335173814000,1582335173940435,42385376,buy,9680,0.1 -binance-futures,BTCUSDT,1582335173814000,1582335173940438,42385377,buy,9680,0.22 -binance-futures,BTCUSDT,1582335173814000,1582335173940441,42385378,buy,9680,0.75 -binance-futures,BTCUSDT,1582335180276000,1582335180404439,42385379,sell,9679.99,0.001 -binance-futures,BTCUSDT,1582335182434000,1582335182559123,42385380,buy,9680,0.025 -binance-futures,BTCUSDT,1582335184532000,1582335184655020,42385381,buy,9680,0.005 -binance-futures,BTCUSDT,1582335184532000,1582335184655368,42385382,buy,9680,0.001 -binance-futures,BTCUSDT,1582335184532000,1582335184656739,42385383,buy,9680,0.001 -binance-futures,BTCUSDT,1582335184532000,1582335184656756,42385384,buy,9680,0.001 -binance-futures,BTCUSDT,1582335184532000,1582335184656761,42385385,buy,9680,0.005 -binance-futures,BTCUSDT,1582335186585000,1582335186714729,42385386,buy,9680,0.495 -binance-futures,BTCUSDT,1582335186585000,1582335186716688,42385387,buy,9680,2.781 -binance-futures,BTCUSDT,1582335186585000,1582335186716695,42385388,buy,9680,0.144 -binance-futures,BTCUSDT,1582335186585000,1582335186716699,42385389,buy,9680.34,5.264 -binance-futures,BTCUSDT,1582335186585000,1582335186724805,42385390,buy,9680.63,0.1 -binance-futures,BTCUSDT,1582335186585000,1582335186726657,42385391,buy,9680.72,0.04 -binance-futures,BTCUSDT,1582335186585000,1582335186726678,42385392,buy,9680.86,0.41 -binance-futures,BTCUSDT,1582335186585000,1582335186729062,42385393,buy,9681,0.011 -binance-futures,BTCUSDT,1582335186585000,1582335186730690,42385394,buy,9681,0.004 -binance-futures,BTCUSDT,1582335186585000,1582335186730697,42385395,buy,9681,0.004 -binance-futures,BTCUSDT,1582335186585000,1582335186730700,42385396,buy,9681,0.009 -binance-futures,BTCUSDT,1582335186585000,1582335186730703,42385397,buy,9681,0.003 -binance-futures,BTCUSDT,1582335186585000,1582335186730707,42385398,buy,9681,0.071 -binance-futures,BTCUSDT,1582335186585000,1582335186730710,42385399,buy,9681,0.007 -binance-futures,BTCUSDT,1582335186585000,1582335186730713,42385400,buy,9681,0.017 -binance-futures,BTCUSDT,1582335186585000,1582335186730716,42385401,buy,9681,0.006 -binance-futures,BTCUSDT,1582335186585000,1582335186730719,42385402,buy,9681,0.001 -binance-futures,BTCUSDT,1582335186585000,1582335186730722,42385403,buy,9681,0.004 -binance-futures,BTCUSDT,1582335186585000,1582335186730725,42385404,buy,9681,0.005 -binance-futures,BTCUSDT,1582335186585000,1582335186730728,42385405,buy,9681,0.008 -binance-futures,BTCUSDT,1582335186585000,1582335186730731,42385406,buy,9681,0.003 -binance-futures,BTCUSDT,1582335186585000,1582335186730735,42385407,buy,9681,0.01 -binance-futures,BTCUSDT,1582335186585000,1582335186730738,42385408,buy,9681,0.055 -binance-futures,BTCUSDT,1582335186585000,1582335186730741,42385409,buy,9681.14,0.04 -binance-futures,BTCUSDT,1582335186585000,1582335187001648,42385410,buy,9681.81,0.107 -binance-futures,BTCUSDT,1582335186585000,1582335187001752,42385411,buy,9681.82,0.04 -binance-futures,BTCUSDT,1582335186585000,1582335187005043,42385412,buy,9681.97,0.006 -binance-futures,BTCUSDT,1582335186585000,1582335187005064,42385413,buy,9682.05,0.012 -binance-futures,BTCUSDT,1582335186585000,1582335187005078,42385414,buy,9682.09,3.978 -binance-futures,BTCUSDT,1582335186585000,1582335187005093,42385415,buy,9682.49,0.614 -binance-futures,BTCUSDT,1582335186585000,1582335187005102,42385416,buy,9682.54,0.002 -binance-futures,BTCUSDT,1582335186585000,1582335187005112,42385417,buy,9682.62,0.098 -binance-futures,BTCUSDT,1582335186585000,1582335187005122,42385418,buy,9682.82,0.1 -binance-futures,BTCUSDT,1582335186585000,1582335187005135,42385419,buy,9683,0.551 -binance-futures,BTCUSDT,1582335186585000,1582335187005143,42385420,buy,9683,0.449 -binance-futures,BTCUSDT,1582335186585000,1582335187005149,42385421,buy,9683,0.001 -binance-futures,BTCUSDT,1582335186585000,1582335187005154,42385422,buy,9683,0.4 -binance-futures,BTCUSDT,1582335186585000,1582335187005165,42385423,buy,9683.03,0.04 -binance-futures,BTCUSDT,1582335186585000,1582335187005176,42385424,buy,9683.17,3.11 -binance-futures,BTCUSDT,1582335186907000,1582335187032579,42385425,buy,9680.94,0.005 -binance-futures,BTCUSDT,1582335186907000,1582335187032588,42385426,buy,9680.95,0.122 -binance-futures,BTCUSDT,1582335188197000,1582335188318019,42385427,buy,9680.95,0.001 -binance-futures,BTCUSDT,1582335190699000,1582335190817322,42385428,buy,9680.95,0.003 -binance-futures,BTCUSDT,1582335202869000,1582335202990961,42385429,buy,9680.95,0.014 -binance-futures,BTCUSDT,1582335203012000,1582335203131123,42385430,buy,9680.95,0.203 -binance-futures,BTCUSDT,1582335203027000,1582335203147422,42385431,buy,9680.95,0.371 -binance-futures,BTCUSDT,1582335204213000,1582335204339196,42385432,buy,9680.95,0.094 -binance-futures,BTCUSDT,1582335204284000,1582335204403914,42385433,buy,9681.49,0.07 -binance-futures,BTCUSDT,1582335205175000,1582335205299847,42385434,buy,9681.51,0.001 -binance-futures,BTCUSDT,1582335205360000,1582335205482434,42385435,buy,9681.51,0.002 -binance-futures,BTCUSDT,1582335206222000,1582335206348104,42385436,buy,9681.51,0.22 -binance-futures,BTCUSDT,1582335206242000,1582335206391536,42385437,buy,9681.51,0.274 -binance-futures,BTCUSDT,1582335206269000,1582335206393499,42385438,buy,9681.51,0.085 -binance-futures,BTCUSDT,1582335206284000,1582335206408049,42385439,buy,9681.51,0.689 -binance-futures,BTCUSDT,1582335206300000,1582335206420885,42385440,buy,9681.51,0.434 -binance-futures,BTCUSDT,1582335206317000,1582335206441868,42385441,buy,9681.51,0.085 -binance-futures,BTCUSDT,1582335207037000,1582335207157807,42385442,buy,9681.95,0.125 -binance-futures,BTCUSDT,1582335207516000,1582335207641113,42385443,sell,9681.61,0.002 -binance-futures,BTCUSDT,1582335207746000,1582335207871452,42385444,buy,9682.41,0.001 -binance-futures,BTCUSDT,1582335208630000,1582335208755169,42385445,buy,9682.37,0.001 -binance-futures,BTCUSDT,1582335211591000,1582335211711924,42385446,sell,9681.22,0.001 -binance-futures,BTCUSDT,1582335215084000,1582335215209101,42385447,buy,9682.05,0.031 -binance-futures,BTCUSDT,1582335215084000,1582335215209508,42385448,buy,9682.06,0.031 -binance-futures,BTCUSDT,1582335215084000,1582335215217038,42385449,buy,9682.07,0.031 -binance-futures,BTCUSDT,1582335215084000,1582335215222210,42385450,buy,9682.08,0.031 -binance-futures,BTCUSDT,1582335215084000,1582335215224040,42385451,buy,9682.1,0.876 -binance-futures,BTCUSDT,1582335216321000,1582335216444664,42385452,sell,9681.7,0.031 -binance-futures,BTCUSDT,1582335216321000,1582335216445674,42385453,sell,9681.7,0.101 -binance-futures,BTCUSDT,1582335228182000,1582335228303558,42385454,buy,9682.03,0.015 -binance-futures,BTCUSDT,1582335228983000,1582335229106729,42385455,sell,9682,0.04 -binance-futures,BTCUSDT,1582335231994000,1582335232114951,42385456,buy,9682.03,0.016 -binance-futures,BTCUSDT,1582335231994000,1582335232115299,42385457,buy,9682.04,0.018 -binance-futures,BTCUSDT,1582335241463000,1582335241588377,42385458,buy,9682.03,0.031 -binance-futures,BTCUSDT,1582335241463000,1582335241588383,42385459,buy,9682.04,0.013 -binance-futures,BTCUSDT,1582335241463000,1582335241594420,42385460,buy,9682.05,0.016 -binance-futures,BTCUSDT,1582335241503000,1582335241627672,42385461,buy,9682.1,0.476 -binance-futures,BTCUSDT,1582335241537000,1582335241660821,42385462,buy,9682.1,0.227 -binance-futures,BTCUSDT,1582335241553000,1582335241676644,42385463,buy,9682.1,0.445 -binance-futures,BTCUSDT,1582335241571000,1582335241695743,42385464,buy,9682.1,0.148 -binance-futures,BTCUSDT,1582335243369000,1582335243489532,42385465,buy,9682.1,0.003 -binance-futures,BTCUSDT,1582335244881000,1582335245003789,42385466,sell,9682.09,0.134 -binance-futures,BTCUSDT,1582335245515000,1582335245637168,42385467,buy,9682.1,0.018 -binance-futures,BTCUSDT,1582335246156000,1582335246277843,42385468,buy,9682.1,0.001 -binance-futures,BTCUSDT,1582335250969000,1582335251093049,42385469,buy,9682.1,0.001 -binance-futures,BTCUSDT,1582335254797000,1582335254915102,42385470,sell,9682.09,0.866 -binance-futures,BTCUSDT,1582335254797000,1582335254917175,42385471,sell,9682.09,0.1 -binance-futures,BTCUSDT,1582335254797000,1582335254921010,42385472,sell,9682,1.034 -binance-futures,BTCUSDT,1582335255723000,1582335255846039,42385473,buy,9682.1,0.001 -binance-futures,BTCUSDT,1582335256358000,1582335256479915,42385474,buy,9682.05,0.031 -binance-futures,BTCUSDT,1582335256358000,1582335256482083,42385475,buy,9682.06,0.031 -binance-futures,BTCUSDT,1582335256358000,1582335256488826,42385476,buy,9682.07,0.031 -binance-futures,BTCUSDT,1582335256358000,1582335256491185,42385477,buy,9682.08,0.031 -binance-futures,BTCUSDT,1582335256358000,1582335256492000,42385478,buy,9682.1,0.681 -binance-futures,BTCUSDT,1582335256358000,1582335256493426,42385479,buy,9682.32,0.243 -binance-futures,BTCUSDT,1582335256767000,1582335256888794,42385480,buy,9682.32,0.001 -binance-futures,BTCUSDT,1582335257355000,1582335257477677,42385481,sell,9682.14,0.031 -binance-futures,BTCUSDT,1582335257355000,1582335257477874,42385482,sell,9682.13,0.031 -binance-futures,BTCUSDT,1582335257355000,1582335257483123,42385483,sell,9682.12,0.031 -binance-futures,BTCUSDT,1582335257355000,1582335257484840,42385484,sell,9682.11,0.007 -binance-futures,BTCUSDT,1582335264140000,1582335264265853,42385485,buy,9682.11,0.031 -binance-futures,BTCUSDT,1582335264140000,1582335264266347,42385486,buy,9682.11,0.1 -binance-futures,BTCUSDT,1582335264140000,1582335264266990,42385487,buy,9682.11,0.1 -binance-futures,BTCUSDT,1582335264140000,1582335264267753,42385488,buy,9682.13,0.031 -binance-futures,BTCUSDT,1582335264140000,1582335264270912,42385489,buy,9682.13,0.738 -binance-futures,BTCUSDT,1582335269516000,1582335269639317,42385490,sell,9682.52,0.2 -binance-futures,BTCUSDT,1582335270059000,1582335270181278,42385491,buy,9682.64,0.005 -binance-futures,BTCUSDT,1582335271024000,1582335271150847,42385492,buy,9682.73,0.005 -binance-futures,BTCUSDT,1582335276360000,1582335276484794,42385493,buy,9682.99,0.026 -binance-futures,BTCUSDT,1582335278670000,1582335278791659,42385494,buy,9682.99,0.005 -binance-futures,BTCUSDT,1582335280294000,1582335280418959,42385495,buy,9682.99,0.01 -binance-futures,BTCUSDT,1582335282789000,1582335282915420,42385496,buy,9682.99,0.01 -binance-futures,BTCUSDT,1582335283261000,1582335283383923,42385497,sell,9682.98,1 -binance-futures,BTCUSDT,1582335284032000,1582335284154215,42385498,sell,9682.98,0.67 -binance-futures,BTCUSDT,1582335284085000,1582335284206595,42385499,sell,9682.98,0.67 -binance-futures,BTCUSDT,1582335284109000,1582335284233178,42385500,sell,9682.98,0.72 -binance-futures,BTCUSDT,1582335284115000,1582335284238239,42385501,sell,9682.98,0.68 -binance-futures,BTCUSDT,1582335284115000,1582335284238908,42385502,sell,9682.98,0.74 -binance-futures,BTCUSDT,1582335284118000,1582335284243337,42385503,sell,9682.98,0.67 -binance-futures,BTCUSDT,1582335284146000,1582335284270702,42385504,sell,9682.98,0.01 -binance-futures,BTCUSDT,1582335284176000,1582335284297309,42385505,sell,9682.98,0.68 -binance-futures,BTCUSDT,1582335284177000,1582335284301516,42385506,sell,9682.98,0.144 -binance-futures,BTCUSDT,1582335284204000,1582335284330279,42385507,sell,9682.33,0.004 -binance-futures,BTCUSDT,1582335284204000,1582335284330286,42385508,sell,9682.33,0.011 -binance-futures,BTCUSDT,1582335284204000,1582335284330289,42385509,sell,9682.33,0.705 -binance-futures,BTCUSDT,1582335284222000,1582335284349164,42385510,sell,9682.33,0.74 -binance-futures,BTCUSDT,1582335284234000,1582335284358805,42385511,sell,9682.33,0.67 -binance-futures,BTCUSDT,1582335284236000,1582335284361918,42385512,sell,9682.33,0.01 -binance-futures,BTCUSDT,1582335284264000,1582335284388989,42385513,sell,9682.34,0.001 -binance-futures,BTCUSDT,1582335284264000,1582335284392453,42385514,sell,9682.33,0.625 -binance-futures,BTCUSDT,1582335284264000,1582335284395967,42385515,sell,9682.32,0.026 -binance-futures,BTCUSDT,1582335284280000,1582335284416621,42385516,sell,9682.1,0.01 -binance-futures,BTCUSDT,1582335284358000,1582335284501914,42385517,sell,9682.1,0.028 -binance-futures,BTCUSDT,1582335284358000,1582335284501925,42385518,sell,9682.03,1.122 -binance-futures,BTCUSDT,1582335284603000,1582335284727542,42385519,sell,9682.03,1.427 -binance-futures,BTCUSDT,1582335290488000,1582335290612927,42385520,sell,9682.47,0.031 -binance-futures,BTCUSDT,1582335290488000,1582335290615859,42385521,sell,9682.46,0.031 -binance-futures,BTCUSDT,1582335290488000,1582335290623510,42385522,sell,9682.45,0.031 -binance-futures,BTCUSDT,1582335290488000,1582335290625994,42385523,sell,9682.44,0.031 -binance-futures,BTCUSDT,1582335290488000,1582335290628203,42385524,sell,9681.81,0.874 -binance-futures,BTCUSDT,1582335290489000,1582335290629451,42385525,sell,9681.77,2.067 -binance-futures,BTCUSDT,1582335297219000,1582335297589519,42385526,sell,9682.13,2.581 -binance-futures,BTCUSDT,1582335297589000,1582335297713781,42385527,sell,9682.13,0.001 -binance-futures,BTCUSDT,1582335298289000,1582335298411458,42385528,sell,9681.78,0.156 -binance-futures,BTCUSDT,1582335301563000,1582335301687699,42385529,buy,9682.99,0.001 -binance-futures,BTCUSDT,1582335302109000,1582335302231454,42385530,buy,9682.99,0.348 -binance-futures,BTCUSDT,1582335302109000,1582335302232988,42385531,buy,9682.99,0.852 -binance-futures,BTCUSDT,1582335305585000,1582335305713737,42385532,buy,9682.99,1.148 -binance-futures,BTCUSDT,1582335305585000,1582335305713748,42385533,buy,9683.17,0.5 -binance-futures,BTCUSDT,1582335305585000,1582335305716998,42385534,buy,9683.42,1.352 -binance-futures,BTCUSDT,1582335305762000,1582335305886127,42385535,buy,9683.44,0.08 -binance-futures,BTCUSDT,1582335305762000,1582335305886138,42385536,buy,9683.55,0.04 -binance-futures,BTCUSDT,1582335305762000,1582335305890386,42385537,buy,9683.63,0.007 -binance-futures,BTCUSDT,1582335307456000,1582335307581105,42385538,sell,9683.6,0.031 -binance-futures,BTCUSDT,1582335307456000,1582335307582457,42385539,sell,9683.59,0.031 -binance-futures,BTCUSDT,1582335307456000,1582335307589209,42385540,sell,9683.58,0.031 -binance-futures,BTCUSDT,1582335307456000,1582335307591341,42385541,sell,9683.57,0.031 -binance-futures,BTCUSDT,1582335307456000,1582335307591823,42385542,sell,9682.76,0.076 -binance-futures,BTCUSDT,1582335312451000,1582335312574791,42385543,buy,9683.17,0.01 -binance-futures,BTCUSDT,1582335313385000,1582335313505299,42385544,buy,9683.17,0.02 -binance-futures,BTCUSDT,1582335313446000,1582335313567968,42385545,buy,9683.17,0.683 -binance-futures,BTCUSDT,1582335313446000,1582335313567976,42385546,buy,9683.17,0.014 -binance-futures,BTCUSDT,1582335313446000,1582335313567982,42385547,buy,9683.17,0.03 -binance-futures,BTCUSDT,1582335314743000,1582335314866540,42385548,buy,9683.62,0.01 -binance-futures,BTCUSDT,1582335316844000,1582335316972824,42385549,buy,9683.62,0.001 -binance-futures,BTCUSDT,1582335317274000,1582335317420542,42385550,buy,9683.62,0.671 -binance-futures,BTCUSDT,1582335317274000,1582335317421884,42385551,buy,9683.67,0.002 -binance-futures,BTCUSDT,1582335317274000,1582335317425736,42385552,buy,9683.88,0.327 -binance-futures,BTCUSDT,1582335318781000,1582335318904930,42385553,sell,9683.38,0.1 -binance-futures,BTCUSDT,1582335321080000,1582335321200544,42385554,buy,9683.39,0.005 -binance-futures,BTCUSDT,1582335322079000,1582335322204025,42385555,sell,9683.38,0.5 -binance-futures,BTCUSDT,1582335322203000,1582335322567871,42385556,buy,9683.39,0.048 -binance-futures,BTCUSDT,1582335327898000,1582335328020139,42385557,sell,9683.38,0.084 -binance-futures,BTCUSDT,1582335327898000,1582335328021036,42385558,sell,9683.37,0.73 -binance-futures,BTCUSDT,1582335327898000,1582335328025471,42385559,sell,9683.37,0.68 -binance-futures,BTCUSDT,1582335327898000,1582335328025480,42385560,sell,9683.37,0.67 -binance-futures,BTCUSDT,1582335327898000,1582335328025485,42385561,sell,9683.37,0.06 -binance-futures,BTCUSDT,1582335332532000,1582335332652901,42385562,buy,9683.28,0.125 -binance-futures,BTCUSDT,1582335332532000,1582335332654635,42385563,buy,9683.3,0.1 -binance-futures,BTCUSDT,1582335333119000,1582335333241139,42385564,sell,9683.47,0.068 -binance-futures,BTCUSDT,1582335337226000,1582335337372137,42385565,buy,9683.22,0.031 -binance-futures,BTCUSDT,1582335337226000,1582335337372140,42385566,buy,9683.23,0.031 -binance-futures,BTCUSDT,1582335337226000,1582335337377284,42385567,buy,9683.24,0.031 -binance-futures,BTCUSDT,1582335337226000,1582335337377288,42385568,buy,9683.26,0.004 -binance-futures,BTCUSDT,1582335337226000,1582335337381754,42385569,buy,9683.27,0.031 -binance-futures,BTCUSDT,1582335337226000,1582335337383075,42385570,buy,9683.28,0.031 -binance-futures,BTCUSDT,1582335337226000,1582335337383086,42385571,buy,9683.29,0.021 -binance-futures,BTCUSDT,1582335346555000,1582335346671128,42385572,buy,9683.37,0.001 -binance-futures,BTCUSDT,1582335351881000,1582335352005456,42385573,sell,9683.36,0.4 -binance-futures,BTCUSDT,1582335354977000,1582335355099079,42385574,buy,9683.37,0.001 -binance-futures,BTCUSDT,1582335363312000,1582335363541837,42385575,sell,9683.36,0.956 -binance-futures,BTCUSDT,1582335363312000,1582335363541856,42385576,sell,9683.36,0.044 -binance-futures,BTCUSDT,1582335364435000,1582335364561716,42385577,buy,9683.37,0.01 -binance-futures,BTCUSDT,1582335366988000,1582335367111412,42385578,buy,9683.31,0.031 -binance-futures,BTCUSDT,1582335366988000,1582335367120679,42385579,buy,9683.32,0.031 -binance-futures,BTCUSDT,1582335366988000,1582335367120686,42385580,buy,9683.33,0.031 -binance-futures,BTCUSDT,1582335366988000,1582335367123478,42385581,buy,9683.34,0.031 -binance-futures,BTCUSDT,1582335366988000,1582335367129638,42385582,buy,9683.37,0.658 -binance-futures,BTCUSDT,1582335367943000,1582335368064053,42385583,buy,9683.32,0.003 -binance-futures,BTCUSDT,1582335373174000,1582335373301909,42385584,sell,9683.3,0.252 -binance-futures,BTCUSDT,1582335373174000,1582335373302404,42385585,sell,9682.63,0.004 -binance-futures,BTCUSDT,1582335373174000,1582335373306038,42385586,sell,9682.62,0.292 -binance-futures,BTCUSDT,1582335373174000,1582335373308616,42385587,sell,9682.62,0.345 -binance-futures,BTCUSDT,1582335373174000,1582335373309760,42385588,sell,9682.62,0.211 -binance-futures,BTCUSDT,1582335373174000,1582335373309767,42385589,sell,9682.62,0.211 -binance-futures,BTCUSDT,1582335373174000,1582335373315962,42385590,sell,9682.55,0.574 -binance-futures,BTCUSDT,1582335373174000,1582335373317542,42385591,sell,9682.55,0.111 -binance-futures,BTCUSDT,1582335373518000,1582335373646194,42385592,buy,9683.13,0.008 -binance-futures,BTCUSDT,1582335376176000,1582335376306508,42385593,sell,9682.11,0.132 -binance-futures,BTCUSDT,1582335377761000,1582335377887895,42385594,buy,9682.95,0.031 -binance-futures,BTCUSDT,1582335377761000,1582335377888144,42385595,buy,9682.95,0.169 -binance-futures,BTCUSDT,1582335378521000,1582335378647844,42385596,buy,9682.37,0.189 -binance-futures,BTCUSDT,1582335379717000,1582335379842482,42385597,buy,9683.37,0.1 -binance-futures,BTCUSDT,1582335387888000,1582335388017509,42385598,buy,9682.96,0.031 -binance-futures,BTCUSDT,1582335387888000,1582335388024997,42385599,buy,9682.97,0.031 -binance-futures,BTCUSDT,1582335387888000,1582335388027414,42385600,buy,9682.98,0.031 -binance-futures,BTCUSDT,1582335387888000,1582335388027436,42385601,buy,9683,0.5 -binance-futures,BTCUSDT,1582335387888000,1582335388031032,42385602,buy,9683.09,0.004 -binance-futures,BTCUSDT,1582335387888000,1582335388035902,42385603,buy,9683.1,0.038 -binance-futures,BTCUSDT,1582335387889000,1582335388037397,42385604,buy,9683.12,0.658 -binance-futures,BTCUSDT,1582335387889000,1582335388039533,42385605,buy,9683.29,2.707 -binance-futures,BTCUSDT,1582335396056000,1582335396180704,42385606,buy,9683.27,0.401 -binance-futures,BTCUSDT,1582335396056000,1582335396183301,42385607,buy,9683.29,0.204 -binance-futures,BTCUSDT,1582335412989000,1582335413114352,42385608,sell,9683.33,0.002 -binance-futures,BTCUSDT,1582335413310000,1582335413428714,42385609,buy,9683.37,0.03 -binance-futures,BTCUSDT,1582335420647000,1582335420774046,42385610,buy,9683.37,0.2 -binance-futures,BTCUSDT,1582335420647000,1582335420774049,42385611,buy,9683.37,0.1 -binance-futures,BTCUSDT,1582335420647000,1582335420774052,42385612,buy,9683.37,0.78 -binance-futures,BTCUSDT,1582335420650000,1582335420783242,42385613,buy,9683.37,0.22 -binance-futures,BTCUSDT,1582335420650000,1582335420785547,42385614,buy,9683.42,0.52 -binance-futures,BTCUSDT,1582335420656000,1582335420790819,42385615,buy,9683.42,0.37 -binance-futures,BTCUSDT,1582335420658000,1582335420790827,42385616,buy,9683.42,0.68 -binance-futures,BTCUSDT,1582335420660000,1582335420790832,42385617,buy,9683.42,0.458 -binance-futures,BTCUSDT,1582335420703000,1582335420831989,42385618,buy,9683.78,0.22 -binance-futures,BTCUSDT,1582335420709000,1582335420837806,42385619,buy,9683.78,0.01 -binance-futures,BTCUSDT,1582335420712000,1582335420840328,42385620,buy,9683.78,0.01 -binance-futures,BTCUSDT,1582335420722000,1582335420848217,42385621,buy,9683.78,0.442 -binance-futures,BTCUSDT,1582335420722000,1582335420853774,42385622,buy,9683.79,0.848 -binance-futures,BTCUSDT,1582335420726000,1582335420857055,42385623,buy,9683.79,0.01 -binance-futures,BTCUSDT,1582335420777000,1582335420907159,42385624,buy,9683.79,0.01 -binance-futures,BTCUSDT,1582335420822000,1582335420947702,42385625,buy,9683.79,0.1 -binance-futures,BTCUSDT,1582335421061000,1582335421189620,42385626,sell,9683.78,0.003 -binance-futures,BTCUSDT,1582335426433000,1582335426658884,42385627,buy,9683.91,0.047 -binance-futures,BTCUSDT,1582335426433000,1582335426658889,42385628,buy,9684,0.38 -binance-futures,BTCUSDT,1582335426433000,1582335426658898,42385629,buy,9684.11,0.012 -binance-futures,BTCUSDT,1582335426433000,1582335426658907,42385630,buy,9684.16,0.04 -binance-futures,BTCUSDT,1582335426433000,1582335426658917,42385631,buy,9684.16,1.521 -binance-futures,BTCUSDT,1582335428699000,1582335428825829,42385632,buy,9684.15,0.034 -binance-futures,BTCUSDT,1582335438478000,1582335438605732,42385633,buy,9684.15,0.03 -binance-futures,BTCUSDT,1582335441524000,1582335441645910,42385634,sell,9683.66,0.001 -binance-futures,BTCUSDT,1582335442642000,1582335442769730,42385635,buy,9684.11,0.001 -binance-futures,BTCUSDT,1582335444361000,1582335444484627,42385636,sell,9683.25,0.031 -binance-futures,BTCUSDT,1582335444361000,1582335444494695,42385637,sell,9683.24,0.031 -binance-futures,BTCUSDT,1582335444361000,1582335444494703,42385638,sell,9683.23,0.031 -binance-futures,BTCUSDT,1582335444361000,1582335444494715,42385639,sell,9683.15,0.035 -binance-futures,BTCUSDT,1582335446682000,1582335446808946,42385640,sell,9683.15,0.649 -binance-futures,BTCUSDT,1582335446682000,1582335446810060,42385641,sell,9683.14,0.651 -binance-futures,BTCUSDT,1582335446753000,1582335446880433,42385642,sell,9683.14,0.1 -binance-futures,BTCUSDT,1582335446898000,1582335447027301,42385643,sell,9682.35,0.004 -binance-futures,BTCUSDT,1582335446898000,1582335447027304,42385644,sell,9682.32,0.006 -binance-futures,BTCUSDT,1582335448505000,1582335448632356,42385645,buy,9682.93,0.1 -binance-futures,BTCUSDT,1582335448505000,1582335448635684,42385646,buy,9683.38,0.434 -binance-futures,BTCUSDT,1582335448505000,1582335448638249,42385647,buy,9683.38,0.434 -binance-futures,BTCUSDT,1582335448505000,1582335448638267,42385648,buy,9683.38,0.032 -binance-futures,BTCUSDT,1582335451661000,1582335451788393,42385649,sell,9682.33,0.001 -binance-futures,BTCUSDT,1582335451796000,1582335451922509,42385650,buy,9683.13,0.031 -binance-futures,BTCUSDT,1582335451796000,1582335451922624,42385651,buy,9683.14,0.031 -binance-futures,BTCUSDT,1582335451796000,1582335451932746,42385652,buy,9683.15,0.031 -binance-futures,BTCUSDT,1582335451796000,1582335451932753,42385653,buy,9683.16,0.031 -binance-futures,BTCUSDT,1582335451796000,1582335451934613,42385654,buy,9683.19,0.003 -binance-futures,BTCUSDT,1582335451796000,1582335451934624,42385655,buy,9683.2,0.005 -binance-futures,BTCUSDT,1582335454131000,1582335454255073,42385656,sell,9682.74,0.001 -binance-futures,BTCUSDT,1582335461949000,1582335462077861,42385657,sell,9682.69,0.031 -binance-futures,BTCUSDT,1582335461949000,1582335462077866,42385658,sell,9682.68,0.031 -binance-futures,BTCUSDT,1582335461949000,1582335462087875,42385659,sell,9682.67,0.031 -binance-futures,BTCUSDT,1582335461949000,1582335462087888,42385660,sell,9682.66,0.031 -binance-futures,BTCUSDT,1582335461949000,1582335462087890,42385661,sell,9682.35,0.721 -binance-futures,BTCUSDT,1582335464185000,1582335464328471,42385662,sell,9683.27,0.1 -binance-futures,BTCUSDT,1582335464185000,1582335464329841,42385663,sell,9682.36,0.3 -binance-futures,BTCUSDT,1582335465056000,1582335465179438,42385664,sell,9683.31,0.091 -binance-futures,BTCUSDT,1582335466984000,1582335467110513,42385665,sell,9683.31,0.1 -binance-futures,BTCUSDT,1582335466984000,1582335467112542,42385666,sell,9683.31,0.1 -binance-futures,BTCUSDT,1582335466984000,1582335467112600,42385667,sell,9683.31,0.8 -binance-futures,BTCUSDT,1582335467457000,1582335467579546,42385668,sell,9683.31,0.027 -binance-futures,BTCUSDT,1582335468036000,1582335468163418,42385669,buy,9683.32,0.1 -binance-futures,BTCUSDT,1582335471475000,1582335471600720,42385670,sell,9683.44,0.08 -binance-futures,BTCUSDT,1582335471959000,1582335472081576,42385671,buy,9683.45,0.2 -binance-futures,BTCUSDT,1582335486342000,1582335486466645,42385672,buy,9683.45,0.001 -binance-futures,BTCUSDT,1582335489159000,1582335489281547,42385673,sell,9683.44,0.1 -binance-futures,BTCUSDT,1582335489159000,1582335489281682,42385674,sell,9683.15,0.008 -binance-futures,BTCUSDT,1582335490159000,1582335490284495,42385675,buy,9683.15,0.892 -binance-futures,BTCUSDT,1582335490159000,1582335490287254,42385676,buy,9683.45,0.108 -binance-futures,BTCUSDT,1582335492443000,1582335492568533,42385677,sell,9683.44,0.1 -binance-futures,BTCUSDT,1582335492443000,1582335492568538,42385678,sell,9683.42,0.031 -binance-futures,BTCUSDT,1582335492443000,1582335492572588,42385679,sell,9683.41,0.031 -binance-futures,BTCUSDT,1582335492443000,1582335492579420,42385680,sell,9683.4,0.031 -binance-futures,BTCUSDT,1582335492443000,1582335492580818,42385681,sell,9683.39,0.031 -binance-futures,BTCUSDT,1582335494886000,1582335495013839,42385682,sell,9682.78,0.031 -binance-futures,BTCUSDT,1582335494886000,1582335495016398,42385683,sell,9682.78,3.424 -binance-futures,BTCUSDT,1582335498525000,1582335498649374,42385684,sell,9683.03,0.031 -binance-futures,BTCUSDT,1582335498525000,1582335498649853,42385685,sell,9683.02,0.019 -binance-futures,BTCUSDT,1582335498683000,1582335498810478,42385686,sell,9683.05,0.031 -binance-futures,BTCUSDT,1582335498683000,1582335498814478,42385687,sell,9683.04,0.031 -binance-futures,BTCUSDT,1582335498683000,1582335498814495,42385688,sell,9683.03,0.031 -binance-futures,BTCUSDT,1582335498683000,1582335498818236,42385689,sell,9683.02,0.012 -binance-futures,BTCUSDT,1582335498683000,1582335498820273,42385690,sell,9682.36,0.39 -binance-futures,BTCUSDT,1582335505377000,1582335505515767,42385691,sell,9683.36,0.4 -binance-futures,BTCUSDT,1582335508000000,1582335508123880,42385692,sell,9683.36,0.001 -binance-futures,BTCUSDT,1582335508090000,1582335508217614,42385693,buy,9683.37,0.021 -binance-futures,BTCUSDT,1582335509628000,1582335509752415,42385694,sell,9683.36,0.005 -binance-futures,BTCUSDT,1582335514960000,1582335515083364,42385695,buy,9683.37,0.599 -binance-futures,BTCUSDT,1582335517331000,1582335517457307,42385696,sell,9683.36,0.226 -binance-futures,BTCUSDT,1582335522840000,1582335522965739,42385697,sell,9683.36,1.774 -binance-futures,BTCUSDT,1582335522840000,1582335522966219,42385698,sell,9683.36,0.1 -binance-futures,BTCUSDT,1582335522840000,1582335522966226,42385699,sell,9683.36,0.926 -binance-futures,BTCUSDT,1582335523464000,1582335523590233,42385700,buy,9683.37,0.051 -binance-futures,BTCUSDT,1582335527049000,1582335527172889,42385701,buy,9683.37,0.032 -binance-futures,BTCUSDT,1582335527817000,1582335527944215,42385702,sell,9683.36,0.972 -binance-futures,BTCUSDT,1582335534003000,1582335534123978,42385703,buy,9683.37,0.073 -binance-futures,BTCUSDT,1582335534003000,1582335534124683,42385704,buy,9683.37,0.391 -binance-futures,BTCUSDT,1582335534003000,1582335534129078,42385705,buy,9683.45,0.683 -binance-futures,BTCUSDT,1582335534003000,1582335534129088,42385706,buy,9683.5,0.02 -binance-futures,BTCUSDT,1582335534003000,1582335534134347,42385707,buy,9683.75,0.833 -binance-futures,BTCUSDT,1582335535965000,1582335536093124,42385708,sell,9684.13,0.031 -binance-futures,BTCUSDT,1582335535965000,1582335536093131,42385709,sell,9684.12,0.031 -binance-futures,BTCUSDT,1582335535965000,1582335536100200,42385710,sell,9684.11,0.031 -binance-futures,BTCUSDT,1582335535965000,1582335536100207,42385711,sell,9684.1,0.031 -binance-futures,BTCUSDT,1582335540041000,1582335540167808,42385712,buy,9684,0.448 -binance-futures,BTCUSDT,1582335540041000,1582335540168300,42385713,buy,9684.28,0.047 -binance-futures,BTCUSDT,1582335540695000,1582335540818372,42385714,buy,9684.23,0.031 -binance-futures,BTCUSDT,1582335540695000,1582335540818508,42385715,buy,9684.24,0.031 -binance-futures,BTCUSDT,1582335540695000,1582335540824147,42385716,buy,9684.25,0.031 -binance-futures,BTCUSDT,1582335540695000,1582335540824153,42385717,buy,9684.26,0.031 -binance-futures,BTCUSDT,1582335540695000,1582335540831295,42385718,buy,9684.28,0.571 -binance-futures,BTCUSDT,1582335540695000,1582335540831306,42385719,buy,9684.32,0.691 -binance-futures,BTCUSDT,1582335541077000,1582335541203225,42385720,sell,9683.95,0.031 -binance-futures,BTCUSDT,1582335541077000,1582335541209837,42385721,sell,9683.94,0.031 -binance-futures,BTCUSDT,1582335541077000,1582335541211751,42385722,sell,9683.93,0.031 -binance-futures,BTCUSDT,1582335541077000,1582335541211758,42385723,sell,9683.92,0.018 -binance-futures,BTCUSDT,1582335541077000,1582335541213367,42385724,sell,9683.89,1.889 -binance-futures,BTCUSDT,1582335546498000,1582335546623370,42385725,buy,9683.96,0.031 -binance-futures,BTCUSDT,1582335546498000,1582335546633699,42385726,buy,9683.97,0.031 -binance-futures,BTCUSDT,1582335546498000,1582335546633714,42385727,buy,9683.98,0.031 -binance-futures,BTCUSDT,1582335546498000,1582335546633718,42385728,buy,9683.99,0.031 -binance-futures,BTCUSDT,1582335546498000,1582335546635547,42385729,buy,9684.02,0.876 -binance-futures,BTCUSDT,1582335548541000,1582335548668708,42385730,buy,9684.02,1.363 -binance-futures,BTCUSDT,1582335548541000,1582335548668907,42385731,buy,9684.38,0.637 -binance-futures,BTCUSDT,1582335548991000,1582335549116699,42385732,buy,9684.28,0.031 -binance-futures,BTCUSDT,1582335548991000,1582335549116706,42385733,buy,9684.29,0.031 -binance-futures,BTCUSDT,1582335548991000,1582335549121210,42385734,buy,9684.3,0.031 -binance-futures,BTCUSDT,1582335548991000,1582335549126003,42385735,buy,9684.32,0.004 -binance-futures,BTCUSDT,1582335548991000,1582335549127341,42385736,buy,9684.33,0.031 -binance-futures,BTCUSDT,1582335548991000,1582335549129102,42385737,buy,9684.34,0.025 -binance-futures,BTCUSDT,1582335558428000,1582335558553213,42385738,sell,9684.05,0.519 -binance-futures,BTCUSDT,1582335565863000,1582335565983025,42385739,sell,9684.05,0.022 -binance-futures,BTCUSDT,1582335569564000,1582335569692118,42385740,sell,9684.05,0.143 -binance-futures,BTCUSDT,1582335569602000,1582335569728363,42385741,sell,9683.5,0.05 -binance-futures,BTCUSDT,1582335569606000,1582335569739735,42385742,sell,9683.44,0.004 -binance-futures,BTCUSDT,1582335569606000,1582335569739742,42385743,sell,9683.4,0.1 -binance-futures,BTCUSDT,1582335569625000,1582335569753745,42385744,sell,9683.36,2.177 -binance-futures,BTCUSDT,1582335569649000,1582335569779963,42385745,sell,9683.36,0.263 -binance-futures,BTCUSDT,1582335569682000,1582335569812679,42385746,sell,9683.03,2 -binance-futures,BTCUSDT,1582335569707000,1582335569834375,42385747,sell,9683.03,2 -binance-futures,BTCUSDT,1582335569741000,1582335569872081,42385748,sell,9683.03,1.15 -binance-futures,BTCUSDT,1582335569741000,1582335569872096,42385749,sell,9682.74,0.85 -binance-futures,BTCUSDT,1582335569892000,1582335570021226,42385750,sell,9682.26,0.1 -binance-futures,BTCUSDT,1582335570158000,1582335570302074,42385751,sell,9682.12,0.68 -binance-futures,BTCUSDT,1582335570220000,1582335570348998,42385752,sell,9682.12,1.34 -binance-futures,BTCUSDT,1582335570254000,1582335570388953,42385753,sell,9682.12,0.01 -binance-futures,BTCUSDT,1582335570276000,1582335570408546,42385754,sell,9682.12,0.68 -binance-futures,BTCUSDT,1582335570333000,1582335570461843,42385755,sell,9682.12,0.01 -binance-futures,BTCUSDT,1582335570608000,1582335570736195,42385756,sell,9682.03,0.46 -binance-futures,BTCUSDT,1582335570627000,1582335570758675,42385757,sell,9681.99,1.48 -binance-futures,BTCUSDT,1582335570630000,1582335570761106,42385758,sell,9681.99,2 -binance-futures,BTCUSDT,1582335570638000,1582335570770399,42385759,sell,9681.99,1.44 -binance-futures,BTCUSDT,1582335570651000,1582335570776305,42385760,sell,9681.99,0.44 -binance-futures,BTCUSDT,1582335570656000,1582335570784216,42385761,sell,9681.61,3.65 -binance-futures,BTCUSDT,1582335570680000,1582335570808219,42385762,sell,9681.61,2 -binance-futures,BTCUSDT,1582335570700000,1582335570829804,42385763,sell,9681.61,2 -binance-futures,BTCUSDT,1582335570871000,1582335570998903,42385764,buy,9680.73,1 -binance-futures,BTCUSDT,1582335570871000,1582335571005699,42385765,buy,9680.79,0.754 -binance-futures,BTCUSDT,1582335571086000,1582335571408826,42385766,sell,9680.64,0.04 -binance-futures,BTCUSDT,1582335572450000,1582335572575042,42385767,sell,9680.64,0.9 -binance-futures,BTCUSDT,1582335572460000,1582335572586269,42385768,sell,9680.64,0.01 -binance-futures,BTCUSDT,1582335572464000,1582335572594147,42385769,sell,9680.64,0.01 -binance-futures,BTCUSDT,1582335572499000,1582335572621796,42385770,sell,9680.64,0.01 -binance-futures,BTCUSDT,1582335572501000,1582335572630260,42385771,sell,9680.64,0.897 -binance-futures,BTCUSDT,1582335579453000,1582335579579002,42385772,sell,9680.65,0.012 -binance-futures,BTCUSDT,1582335586719000,1582335586847545,42385773,sell,9680.65,0.007 -binance-futures,BTCUSDT,1582335598194000,1582335598321886,42385774,sell,9680.65,0.181 -binance-futures,BTCUSDT,1582335598194000,1582335598322803,42385775,sell,9680,0.119 -binance-futures,BTCUSDT,1582335603168000,1582335603294375,42385776,sell,9680,0.2 -binance-futures,BTCUSDT,1582335606594000,1582335606715783,42385777,sell,9680,0.681 -binance-futures,BTCUSDT,1582335606594000,1582335606715796,42385778,sell,9680,0.05 -binance-futures,BTCUSDT,1582335606594000,1582335606716044,42385779,sell,9678.52,0.257 -binance-futures,BTCUSDT,1582335606594000,1582335606721732,42385780,sell,9678.39,0.02 -binance-futures,BTCUSDT,1582335609153000,1582335609565230,42385781,buy,9678,0.031 -binance-futures,BTCUSDT,1582335609153000,1582335609565235,42385782,buy,9678.01,0.006 -binance-futures,BTCUSDT,1582335611535000,1582335611656293,42385783,buy,9677.92,0.2 -binance-futures,BTCUSDT,1582335612083000,1582335612206657,42385784,sell,9677.91,0.005 -binance-futures,BTCUSDT,1582335618245000,1582335618371200,42385785,buy,9677.92,0.087 -binance-futures,BTCUSDT,1582335624436000,1582335624577353,42385786,sell,9677.91,0.007 -binance-futures,BTCUSDT,1582335625115000,1582335625238651,42385787,buy,9677.91,0.003 -binance-futures,BTCUSDT,1582335632702000,1582335632828415,42385788,sell,9677.89,0.035 -binance-futures,BTCUSDT,1582335633152000,1582335633292840,42385789,buy,9677.9,0.1 -binance-futures,BTCUSDT,1582335633152000,1582335633293169,42385790,buy,9677.9,0.1 -binance-futures,BTCUSDT,1582335633152000,1582335633293824,42385791,buy,9677.9,0.3 -binance-futures,BTCUSDT,1582335637151000,1582335637278713,42385792,buy,9677.9,0.5 -binance-futures,BTCUSDT,1582335638531000,1582335638659343,42385793,buy,9677.9,0.082 -binance-futures,BTCUSDT,1582335643418000,1582335643542355,42385794,sell,9677.89,0.46 -binance-futures,BTCUSDT,1582335643418000,1582335643544068,42385795,sell,9677.74,0.047 -binance-futures,BTCUSDT,1582335643418000,1582335643547284,42385796,sell,9677.57,0.031 -binance-futures,BTCUSDT,1582335643418000,1582335643549247,42385797,sell,9677.55,0.683 -binance-futures,BTCUSDT,1582335643418000,1582335643552293,42385798,sell,9677.55,0.676 -binance-futures,BTCUSDT,1582335643418000,1582335643553946,42385799,sell,9677,0.05 -binance-futures,BTCUSDT,1582335643418000,1582335643553955,42385800,sell,9676.65,3.053 -binance-futures,BTCUSDT,1582335645773000,1582335645896956,42385801,buy,9677.11,0.012 -binance-futures,BTCUSDT,1582335646181000,1582335646305454,42385802,sell,9676.6,0.005 -binance-futures,BTCUSDT,1582335646181000,1582335646307041,42385803,sell,9676.31,0.873 -binance-futures,BTCUSDT,1582335646181000,1582335646311120,42385804,sell,9676.3,2.122 -binance-futures,BTCUSDT,1582335650848000,1582335650972602,42385805,sell,9676.35,0.027 -binance-futures,BTCUSDT,1582335652756000,1582335652875955,42385806,sell,9676.25,0.012 -binance-futures,BTCUSDT,1582335652756000,1582335652878903,42385807,sell,9676.01,0.057 -binance-futures,BTCUSDT,1582335653960000,1582335654093019,42385808,sell,9676.06,0.031 -binance-futures,BTCUSDT,1582335653960000,1582335654093028,42385809,sell,9676.05,0.031 -binance-futures,BTCUSDT,1582335653960000,1582335654096231,42385810,sell,9676.04,0.031 -binance-futures,BTCUSDT,1582335653960000,1582335654096242,42385811,sell,9676.03,0.031 -binance-futures,BTCUSDT,1582335653960000,1582335654100012,42385812,sell,9676,2.612 -binance-futures,BTCUSDT,1582335658023000,1582335658152908,42385813,sell,9675.33,0.018 -binance-futures,BTCUSDT,1582335658023000,1582335658156033,42385814,sell,9675.32,0.04 -binance-futures,BTCUSDT,1582335658023000,1582335658162053,42385815,sell,9675.32,0.001 -binance-futures,BTCUSDT,1582335658023000,1582335658162075,42385816,sell,9675.31,0.151 -binance-futures,BTCUSDT,1582335658023000,1582335658165520,42385817,sell,9675.31,0.01 -binance-futures,BTCUSDT,1582335659787000,1582335659914468,42385818,sell,9675.28,0.2 -binance-futures,BTCUSDT,1582335661872000,1582335661999637,42385819,sell,9675.34,0.031 -binance-futures,BTCUSDT,1582335661873000,1582335662006676,42385820,sell,9675.33,0.031 -binance-futures,BTCUSDT,1582335661873000,1582335662012530,42385821,sell,9675.32,0.031 -binance-futures,BTCUSDT,1582335661873000,1582335662012537,42385822,sell,9675.31,0.031 -binance-futures,BTCUSDT,1582335661873000,1582335662015043,42385823,sell,9675.29,0.011 -binance-futures,BTCUSDT,1582335661873000,1582335662019751,42385824,sell,9675.28,0.031 -binance-futures,BTCUSDT,1582335661873000,1582335662019765,42385825,sell,9675.27,0.031 -binance-futures,BTCUSDT,1582335661873000,1582335662022468,42385826,sell,9675.26,0.031 -binance-futures,BTCUSDT,1582335661873000,1582335662022482,42385827,sell,9675.22,0.068 -binance-futures,BTCUSDT,1582335661986000,1582335662110662,42385828,sell,9675.22,0.032 -binance-futures,BTCUSDT,1582335661986000,1582335662111175,42385829,sell,9675.1,0.381 -binance-futures,BTCUSDT,1582335663965000,1582335664087895,42385830,sell,9676,0.003 -binance-futures,BTCUSDT,1582335663965000,1582335664090386,42385831,sell,9675.2,0.007 -binance-futures,BTCUSDT,1582335664439000,1582335664564633,42385832,sell,9675.25,0.007 -binance-futures,BTCUSDT,1582335664439000,1582335664564889,42385833,sell,9675.24,0.012 -binance-futures,BTCUSDT,1582335669526000,1582335669653989,42385834,sell,9675.21,0.1 -binance-futures,BTCUSDT,1582335669526000,1582335669653996,42385835,sell,9675,0.05 -binance-futures,BTCUSDT,1582335669526000,1582335669660165,42385836,sell,9674.99,0.44 -binance-futures,BTCUSDT,1582335669526000,1582335669662959,42385837,sell,9674.98,0.41 -binance-futures,BTCUSDT,1582335681551000,1582335681680950,42385838,buy,9676,0.05 -binance-futures,BTCUSDT,1582335681551000,1582335681685978,42385839,sell,9676.16,0.5 -binance-futures,BTCUSDT,1582335682568000,1582335682694754,42385840,buy,9676.19,0.01 -binance-futures,BTCUSDT,1582335685846000,1582335685972052,42385841,buy,9676.19,0.01 -binance-futures,BTCUSDT,1582335685957000,1582335686082178,42385842,sell,9676.18,0.617 -binance-futures,BTCUSDT,1582335686277000,1582335686403715,42385843,buy,9676.19,0.519 -binance-futures,BTCUSDT,1582335699866000,1582335699990667,42385844,buy,9676.14,0.013 -binance-futures,BTCUSDT,1582335700030000,1582335700152484,42385845,sell,9676.18,0.001 -binance-futures,BTCUSDT,1582335702061000,1582335702181677,42385846,sell,9676.13,0.5 -binance-futures,BTCUSDT,1582335706705000,1582335706831272,42385847,sell,9675.6,0.01 -binance-futures,BTCUSDT,1582335712568000,1582335712696148,42385848,sell,9675.35,0.2 -binance-futures,BTCUSDT,1582335715353000,1582335715479214,42385849,sell,9675.35,0.602 -binance-futures,BTCUSDT,1582335720277000,1582335720401869,42385850,buy,9676.03,0.001 -binance-futures,BTCUSDT,1582335722627000,1582335722753960,42385851,buy,9675.3,0.005 -binance-futures,BTCUSDT,1582335724445000,1582335724571036,42385852,buy,9675.3,0.001 -binance-futures,BTCUSDT,1582335725461000,1582335725586327,42385853,sell,9675.25,0.1 -binance-futures,BTCUSDT,1582335725515000,1582335725645749,42385854,sell,9674.73,0.5 -binance-futures,BTCUSDT,1582335725517000,1582335725647458,42385855,sell,9674.73,0.184 -binance-futures,BTCUSDT,1582335726331000,1582335726455629,42385856,sell,9674.13,0.01 -binance-futures,BTCUSDT,1582335728869000,1582335728993886,42385857,sell,9674.13,0.03 -binance-futures,BTCUSDT,1582335729255000,1582335729376479,42385858,buy,9673.63,0.111 -binance-futures,BTCUSDT,1582335729494000,1582335729619991,42385859,buy,9673.63,0.031 -binance-futures,BTCUSDT,1582335729494000,1582335729620156,42385860,buy,9673.63,0.08 -binance-futures,BTCUSDT,1582335729794000,1582335729917765,42385861,buy,9673.63,0.312 -binance-futures,BTCUSDT,1582335731937000,1582335732060490,42385862,sell,9673.62,0.026 -binance-futures,BTCUSDT,1582335746069000,1582335746193208,42385863,sell,9673.62,0.358 -binance-futures,BTCUSDT,1582335747208000,1582335747331160,42385864,sell,9673.62,0.2 -binance-futures,BTCUSDT,1582335749895000,1582335750018338,42385865,buy,9673.63,0.005 -binance-futures,BTCUSDT,1582335752363000,1582335752489591,42385866,sell,9673.62,0.043 -binance-futures,BTCUSDT,1582335761853000,1582335761981602,42385867,sell,9673.62,0.15 -binance-futures,BTCUSDT,1582335761853000,1582335761981613,42385868,sell,9673.62,0.85 -binance-futures,BTCUSDT,1582335762466000,1582335762591366,42385869,sell,9673.62,1.15 -binance-futures,BTCUSDT,1582335762488000,1582335762615075,42385870,sell,9673.01,0.684 -binance-futures,BTCUSDT,1582335762488000,1582335762615634,42385871,sell,9673.01,0.073 -binance-futures,BTCUSDT,1582335762488000,1582335762618843,42385872,sell,9673,1 -binance-futures,BTCUSDT,1582335762488000,1582335762618852,42385873,sell,9673,0.014 -binance-futures,BTCUSDT,1582335762502000,1582335762631003,42385874,sell,9672.79,0.047 -binance-futures,BTCUSDT,1582335762618000,1582335762742465,42385875,sell,9672.64,0.04 -binance-futures,BTCUSDT,1582335762618000,1582335762742481,42385876,sell,9672.64,0.039 -binance-futures,BTCUSDT,1582335764584000,1582335764707395,42385877,sell,9672.31,0.01 -binance-futures,BTCUSDT,1582335764584000,1582335764713435,42385878,sell,9672.08,0.012 -binance-futures,BTCUSDT,1582335764584000,1582335764713440,42385879,sell,9671.91,0.047 -binance-futures,BTCUSDT,1582335764584000,1582335764715819,42385880,sell,9671.4,0.466 -binance-futures,BTCUSDT,1582335765099000,1582335765225350,42385881,sell,9672,0.2 -binance-futures,BTCUSDT,1582335765099000,1582335765225357,42385882,sell,9671.56,0.1 -binance-futures,BTCUSDT,1582335765099000,1582335765228876,42385883,sell,9671.4,0.54 -binance-futures,BTCUSDT,1582335765447000,1582335765574510,42385884,buy,9671.64,0.031 -binance-futures,BTCUSDT,1582335765447000,1582335765574945,42385885,buy,9671.64,0.08 -binance-futures,BTCUSDT,1582335765697000,1582335765820006,42385886,buy,9671.53,0.031 -binance-futures,BTCUSDT,1582335765697000,1582335765821657,42385887,buy,9671.54,0.031 -binance-futures,BTCUSDT,1582335765697000,1582335765823886,42385888,buy,9671.55,0.031 -binance-futures,BTCUSDT,1582335765697000,1582335765829813,42385889,buy,9671.56,0.018 -binance-futures,BTCUSDT,1582335765994000,1582335766119532,42385890,buy,9671.81,0.031 -binance-futures,BTCUSDT,1582335765994000,1582335766122170,42385891,buy,9671.82,0.031 -binance-futures,BTCUSDT,1582335765994000,1582335766127706,42385892,buy,9671.83,0.031 -binance-futures,BTCUSDT,1582335765994000,1582335766127725,42385893,buy,9671.84,0.031 -binance-futures,BTCUSDT,1582335765994000,1582335766129550,42385894,buy,9671.86,0.149 -binance-futures,BTCUSDT,1582335767035000,1582335767158906,42385895,sell,9671.45,0.03 -binance-futures,BTCUSDT,1582335768589000,1582335768713741,42385896,buy,9671.6,0.005 -binance-futures,BTCUSDT,1582335770231000,1582335770353943,42385897,sell,9671.59,0.031 -binance-futures,BTCUSDT,1582335770231000,1582335770353947,42385898,sell,9671.59,0.74 -binance-futures,BTCUSDT,1582335770231000,1582335770353951,42385899,sell,9671.59,0.229 -binance-futures,BTCUSDT,1582335770543000,1582335770671522,42385900,buy,9671.6,0.727 -binance-futures,BTCUSDT,1582335770543000,1582335770671537,42385901,buy,9671.63,0.253 -binance-futures,BTCUSDT,1582335770544000,1582335770674685,42385902,buy,9671.63,0.67 -binance-futures,BTCUSDT,1582335770546000,1582335770681515,42385903,buy,9671.63,0.68 -binance-futures,BTCUSDT,1582335770548000,1582335770681520,42385904,buy,9671.63,0.72 -binance-futures,BTCUSDT,1582335770552000,1582335770682209,42385905,buy,9671.63,0.541 -binance-futures,BTCUSDT,1582335777320000,1582335777448420,42385906,sell,9671.9,0.67 -binance-futures,BTCUSDT,1582335777341000,1582335777466121,42385907,sell,9671.9,0.33 -binance-futures,BTCUSDT,1582335777479000,1582335777608141,42385908,sell,9671.55,0.1 -binance-futures,BTCUSDT,1582335777479000,1582335777608552,42385909,sell,9671.4,0.001 -binance-futures,BTCUSDT,1582335777479000,1582335777614304,42385910,sell,9671.18,1.899 -binance-futures,BTCUSDT,1582335780248000,1582335780368304,42385911,buy,9670.96,0.001 -binance-futures,BTCUSDT,1582335790758000,1582335790883954,42385912,sell,9671.13,0.1 -binance-futures,BTCUSDT,1582335790758000,1582335790883967,42385913,sell,9670.99,1.215 -binance-futures,BTCUSDT,1582335794630000,1582335794752354,42385914,sell,9671.13,0.033 -binance-futures,BTCUSDT,1582335794694000,1582335794816786,42385915,sell,9671.13,0.067 -binance-futures,BTCUSDT,1582335794706000,1582335794831176,42385916,buy,9670.99,0.005 -binance-futures,BTCUSDT,1582335796534000,1582335796658416,42385917,sell,9670.79,0.03 -binance-futures,BTCUSDT,1582335807910000,1582335808048797,42385918,sell,9670.98,0.1 -binance-futures,BTCUSDT,1582335807910000,1582335808048800,42385919,sell,9670.98,0.1 -binance-futures,BTCUSDT,1582335809646000,1582335809770867,42385920,buy,9670.98,0.425 -binance-futures,BTCUSDT,1582335809646000,1582335809771097,42385921,buy,9671.14,0.1 -binance-futures,BTCUSDT,1582335809692000,1582335809819664,42385922,buy,9671.56,0.005 -binance-futures,BTCUSDT,1582335809802000,1582335809928113,42385923,buy,9671.56,0.257 -binance-futures,BTCUSDT,1582335809802000,1582335809928124,42385924,buy,9671.56,0.253 -binance-futures,BTCUSDT,1582335812280000,1582335812405133,42385925,sell,9671.5,0.1 -binance-futures,BTCUSDT,1582335812280000,1582335812405154,42385926,sell,9671.14,0.242 -binance-futures,BTCUSDT,1582335812280000,1582335812408903,42385927,sell,9670.64,2.158 -binance-futures,BTCUSDT,1582335818225000,1582335818355614,42385928,buy,9671.57,1 -binance-futures,BTCUSDT,1582335831107000,1582335831227993,42385929,buy,9671.53,0.001 -binance-futures,BTCUSDT,1582335835639000,1582335835765645,42385930,sell,9671.52,0.253 -binance-futures,BTCUSDT,1582335836136000,1582335836261167,42385931,buy,9671.53,0.005 -binance-futures,BTCUSDT,1582335839673000,1582335839797972,42385932,buy,9671.53,0.025 -binance-futures,BTCUSDT,1582335839673000,1582335839797985,42385933,buy,9671.53,0.1 -binance-futures,BTCUSDT,1582335839673000,1582335839798271,42385934,buy,9671.54,0.031 -binance-futures,BTCUSDT,1582335839673000,1582335839801022,42385935,buy,9671.54,0.557 -binance-futures,BTCUSDT,1582335840256000,1582335840381572,42385936,buy,9671.54,0.001 -binance-futures,BTCUSDT,1582335841645000,1582335841771517,42385937,buy,9671.54,0.269 -binance-futures,BTCUSDT,1582335841645000,1582335841771612,42385938,buy,9671.57,0.731 -binance-futures,BTCUSDT,1582335843858000,1582335843979523,42385939,sell,9671.52,0.001 -binance-futures,BTCUSDT,1582335849049000,1582335849176850,42385940,buy,9671.53,0.01 -binance-futures,BTCUSDT,1582335852520000,1582335852641793,42385941,buy,9671.54,0.01 -binance-futures,BTCUSDT,1582335854016000,1582335854144777,42385942,buy,9671.53,0.01 -binance-futures,BTCUSDT,1582335854048000,1582335854174017,42385943,sell,9671.52,0.001 -binance-futures,BTCUSDT,1582335855544000,1582335855667507,42385944,buy,9671.54,0.01 -binance-futures,BTCUSDT,1582335861174000,1582335861298759,42385945,sell,9671.52,0.001 -binance-futures,BTCUSDT,1582335861182000,1582335861309112,42385946,sell,9671.52,0.744 -binance-futures,BTCUSDT,1582335861182000,1582335861316268,42385947,sell,9671.49,0.1 -binance-futures,BTCUSDT,1582335861182000,1582335861316279,42385948,sell,9670.66,0.25 -binance-futures,BTCUSDT,1582335861182000,1582335861321337,42385949,sell,9670.58,0.684 -binance-futures,BTCUSDT,1582335861182000,1582335861321351,42385950,sell,9670.5,0.04 -binance-futures,BTCUSDT,1582335861182000,1582335861324503,42385951,sell,9670.45,0.012 -binance-futures,BTCUSDT,1582335861182000,1582335861324518,42385952,sell,9670.24,0.684 -binance-futures,BTCUSDT,1582335861182000,1582335861324523,42385953,sell,9670.22,0.486 -binance-futures,BTCUSDT,1582335866971000,1582335867091675,42385954,sell,9671.14,0.068 -binance-futures,BTCUSDT,1582335867878000,1582335868006643,42385955,sell,9671.14,0.032 -binance-futures,BTCUSDT,1582335867878000,1582335868006901,42385956,sell,9670.22,0.096 -binance-futures,BTCUSDT,1582335877036000,1582335877160193,42385957,sell,9671.57,0.031 -binance-futures,BTCUSDT,1582335877036000,1582335877160229,42385958,sell,9671.56,0.025 -binance-futures,BTCUSDT,1582335880188000,1582335880347214,42385959,buy,9671.59,0.21 -binance-futures,BTCUSDT,1582335880190000,1582335880351536,42385960,buy,9671.59,0.473 -binance-futures,BTCUSDT,1582335880246000,1582335880375829,42385961,buy,9671.88,0.51 -binance-futures,BTCUSDT,1582335880266000,1582335880395592,42385962,buy,9671.88,0.06 -binance-futures,BTCUSDT,1582335880284000,1582335880413089,42385963,buy,9671.88,0.113 -binance-futures,BTCUSDT,1582335880284000,1582335880413612,42385964,buy,9672.29,0.027 -binance-futures,BTCUSDT,1582335880405000,1582335880535288,42385965,buy,9672.29,0.008 -binance-futures,BTCUSDT,1582335880452000,1582335880577072,42385966,buy,9672.29,0.65 -binance-futures,BTCUSDT,1582335880486000,1582335880614982,42385967,buy,9672.29,0.67 -binance-futures,BTCUSDT,1582335880583000,1582335880708825,42385968,buy,9672.29,0.65 -binance-futures,BTCUSDT,1582335880605000,1582335880730500,42385969,buy,9672.29,0.67 -binance-futures,BTCUSDT,1582335880634000,1582335880761412,42385970,buy,9672.29,0.01 -binance-futures,BTCUSDT,1582335880686000,1582335880815040,42385971,buy,9672.29,2 -binance-futures,BTCUSDT,1582335880708000,1582335880839394,42385972,buy,9672.29,1.247 -binance-futures,BTCUSDT,1582335880772000,1582335880899425,42385973,buy,9672.69,0.55 -binance-futures,BTCUSDT,1582335885583000,1582335885711281,42385974,buy,9673.67,0.01 -binance-futures,BTCUSDT,1582335885583000,1582335885713203,42385975,buy,9673.67,1.99 -binance-futures,BTCUSDT,1582335885972000,1582335886102448,42385976,buy,9673.67,0.2 -binance-futures,BTCUSDT,1582335886099000,1582335886224916,42385977,sell,9673.66,0.001 -binance-futures,BTCUSDT,1582335886567000,1582335886694407,42385978,buy,9673.67,0.036 -binance-futures,BTCUSDT,1582335886626000,1582335886752509,42385979,buy,9673.67,0.19 -binance-futures,BTCUSDT,1582335889827000,1582335889947782,42385980,buy,9673.67,0.005 -binance-futures,BTCUSDT,1582335891133000,1582335891267113,42385981,buy,9673.51,0.019 -binance-futures,BTCUSDT,1582335891133000,1582335891267117,42385982,buy,9673.52,0.054 -binance-futures,BTCUSDT,1582335891488000,1582335891612682,42385983,buy,9673.52,0.002 -binance-futures,BTCUSDT,1582335899493000,1582335899618736,42385984,buy,9672.77,0.031 -binance-futures,BTCUSDT,1582335899493000,1582335899621378,42385985,buy,9672.78,0.012 -binance-futures,BTCUSDT,1582335901304000,1582335901431932,42385986,sell,9672.01,0.1 -binance-futures,BTCUSDT,1582335903421000,1582335903546683,42385987,sell,9672.31,0.023 -binance-futures,BTCUSDT,1582335903500000,1582335903629762,42385988,buy,9672.32,0.031 -binance-futures,BTCUSDT,1582335903500000,1582335903629772,42385989,buy,9672.32,0.072 -binance-futures,BTCUSDT,1582335904547000,1582335904667962,42385990,sell,9672.36,0.04 -binance-futures,BTCUSDT,1582335905209000,1582335905334652,42385991,buy,9673.67,0.005 -binance-futures,BTCUSDT,1582335905621000,1582335905748338,42385992,buy,9673.67,0.001 -binance-futures,BTCUSDT,1582335909774000,1582335909899378,42385993,sell,9673.66,0.079 -binance-futures,BTCUSDT,1582335911009000,1582335911134154,42385994,buy,9673.65,0.04 -binance-futures,BTCUSDT,1582335911009000,1582335911134168,42385995,buy,9673.65,0.09 -binance-futures,BTCUSDT,1582335912627000,1582335912751778,42385996,sell,9673.64,0.028 -binance-futures,BTCUSDT,1582335913304000,1582335913430697,42385997,buy,9673.65,0.005 -binance-futures,BTCUSDT,1582335919384000,1582335919512348,42385998,buy,9673.46,0.001 -binance-futures,BTCUSDT,1582335919488000,1582335919613140,42385999,buy,9673.46,0.6 -binance-futures,BTCUSDT,1582335921569000,1582335921694626,42386000,buy,9673.46,1.065 -binance-futures,BTCUSDT,1582335923300000,1582335923427999,42386001,buy,9673.46,0.001 -binance-futures,BTCUSDT,1582335923722000,1582335923847877,42386002,buy,9673.46,1.742 -binance-futures,BTCUSDT,1582335923742000,1582335923867833,42386003,buy,9673.67,0.494 -binance-futures,BTCUSDT,1582335923742000,1582335923871204,42386004,buy,9673.67,0.682 -binance-futures,BTCUSDT,1582335923742000,1582335923871212,42386005,buy,9673.67,0.824 -binance-futures,BTCUSDT,1582335923744000,1582335923871223,42386006,buy,9673.67,2 -binance-futures,BTCUSDT,1582335923766000,1582335923906364,42386007,buy,9673.67,1.499 -binance-futures,BTCUSDT,1582335923774000,1582335923910904,42386008,buy,9674,0.253 -binance-futures,BTCUSDT,1582335924550000,1582335924679669,42386009,sell,9673.45,0.031 -binance-futures,BTCUSDT,1582335924550000,1582335924680068,42386010,sell,9673.44,0.009 -binance-futures,BTCUSDT,1582335925136000,1582335925262461,42386011,buy,9674.79,0.001 -binance-futures,BTCUSDT,1582335926300000,1582335926426650,42386012,buy,9674.79,0.001 -binance-futures,BTCUSDT,1582335928588000,1582335928718867,42386013,buy,9674.79,1 -binance-futures,BTCUSDT,1582335929635000,1582335929761040,42386014,buy,9674.79,0.001 -binance-futures,BTCUSDT,1582335932296000,1582335932423191,42386015,buy,9674.79,0.001 -binance-futures,BTCUSDT,1582335932536000,1582335932658797,42386016,buy,9674.79,0.48 -binance-futures,BTCUSDT,1582335935252000,1582335935396650,42386017,buy,9674.79,0.001 -binance-futures,BTCUSDT,1582335937658000,1582335937784091,42386018,buy,9674.79,1.034 -binance-futures,BTCUSDT,1582335937677000,1582335937801922,42386019,buy,9674.79,0.62 -binance-futures,BTCUSDT,1582335937679000,1582335937806746,42386020,buy,9674.79,0.517 -binance-futures,BTCUSDT,1582335937679000,1582335937806755,42386021,buy,9675,0.156 -binance-futures,BTCUSDT,1582335937679000,1582335937811532,42386022,buy,9675.48,0.219 -binance-futures,BTCUSDT,1582335937679000,1582335937814054,42386023,buy,9675.48,0.27 -binance-futures,BTCUSDT,1582335937679000,1582335937814061,42386024,buy,9675.48,0.219 -binance-futures,BTCUSDT,1582335937679000,1582335937814065,42386025,buy,9675.48,0.27 -binance-futures,BTCUSDT,1582335937679000,1582335937814072,42386026,buy,9675.9,0.551 -binance-futures,BTCUSDT,1582335937971000,1582335938097541,42386027,sell,9674.8,0.032 -binance-futures,BTCUSDT,1582335938773000,1582335938896022,42386028,buy,9674.81,0.001 -binance-futures,BTCUSDT,1582335941930000,1582335942051185,42386029,buy,9674.81,0.001 -binance-futures,BTCUSDT,1582335944983000,1582335945109437,42386030,buy,9674.81,0.002 -binance-futures,BTCUSDT,1582335945283000,1582335945408130,42386031,buy,9674.81,0.001 -binance-futures,BTCUSDT,1582335945571000,1582335945697652,42386032,buy,9674.81,0.995 -binance-futures,BTCUSDT,1582335945571000,1582335945699332,42386033,buy,9674.81,1.005 -binance-futures,BTCUSDT,1582335947492000,1582335947618041,42386034,buy,9674.81,0.625 -binance-futures,BTCUSDT,1582335948576000,1582335948703410,42386035,sell,9674.8,0.32 -binance-futures,BTCUSDT,1582335948693000,1582335948819707,42386036,sell,9674.8,0.648 -binance-futures,BTCUSDT,1582335949224000,1582335949346910,42386037,buy,9673.96,0.001 -binance-futures,BTCUSDT,1582335953351000,1582335953472673,42386038,buy,9673.89,0.001 -binance-futures,BTCUSDT,1582335957453000,1582335957579158,42386039,buy,9673.89,0.001 -binance-futures,BTCUSDT,1582335960234000,1582335960363417,42386040,buy,9673.89,0.001 -binance-futures,BTCUSDT,1582335960767000,1582335960893716,42386041,buy,9673.89,0.001 -binance-futures,BTCUSDT,1582335964420000,1582335964543702,42386042,buy,9673.65,0.001 -binance-futures,BTCUSDT,1582335968408000,1582335968532802,42386043,sell,9673.69,2 -binance-futures,BTCUSDT,1582335968408000,1582335968533625,42386044,sell,9673.64,0.104 -binance-futures,BTCUSDT,1582335968408000,1582335968538784,42386045,sell,9673,0.068 -binance-futures,BTCUSDT,1582335968408000,1582335968543740,42386046,sell,9672.4,0.002 -binance-futures,BTCUSDT,1582335968408000,1582335968543744,42386047,sell,9672.39,0.684 -binance-futures,BTCUSDT,1582335968408000,1582335968548151,42386048,sell,9672.2,0.142 -binance-futures,BTCUSDT,1582335974944000,1582335975071176,42386049,sell,9673.63,0.559 -binance-futures,BTCUSDT,1582335975262000,1582335975390814,42386050,sell,9673.63,0.428 -binance-futures,BTCUSDT,1582335982704000,1582335982826306,42386051,buy,9673.64,0.001 -binance-futures,BTCUSDT,1582335986112000,1582335986238344,42386052,buy,9673.64,0.001 -binance-futures,BTCUSDT,1582335988356000,1582335988483741,42386053,sell,9673.63,0.01 -binance-futures,BTCUSDT,1582335993953000,1582335994076858,42386054,sell,9673.63,0.003 -binance-futures,BTCUSDT,1582335993953000,1582335994076874,42386055,sell,9673.63,0.684 -binance-futures,BTCUSDT,1582335993953000,1582335994076994,42386056,sell,9673.63,0.003 -binance-futures,BTCUSDT,1582335994071000,1582335994193362,42386057,sell,9673.63,1.34 -binance-futures,BTCUSDT,1582335994076000,1582335994200005,42386058,sell,9673.63,1.44 -binance-futures,BTCUSDT,1582335994076000,1582335994200013,42386059,sell,9673.63,1.36 -binance-futures,BTCUSDT,1582335994079000,1582335994204905,42386060,sell,9673.63,0.857 -binance-futures,BTCUSDT,1582335994111000,1582335994238295,42386061,sell,9672.35,0.01 -binance-futures,BTCUSDT,1582335995721000,1582335995844979,42386062,buy,9672.89,0.001 -binance-futures,BTCUSDT,1582335999795000,1582335999917616,42386063,buy,9672.89,0.001 -binance-futures,BTCUSDT,1582336002721000,1582336002845550,42386064,sell,9672.59,0.01 -binance-futures,BTCUSDT,1582336009606000,1582336009729296,42386065,sell,9672.73,0.014 -binance-futures,BTCUSDT,1582336014180000,1582336014327406,42386066,buy,9672.74,0.005 -binance-futures,BTCUSDT,1582336016069000,1582336016190297,42386067,sell,9672.75,0.01 -binance-futures,BTCUSDT,1582336016538000,1582336016664819,42386068,buy,9672.53,0.001 -binance-futures,BTCUSDT,1582336020139000,1582336020272012,42386069,buy,9672.23,0.001 -binance-futures,BTCUSDT,1582336020261000,1582336020389114,42386070,buy,9672.23,0.001 -binance-futures,BTCUSDT,1582336023875000,1582336024003969,42386071,buy,9673.27,0.001 -binance-futures,BTCUSDT,1582336023900000,1582336024025752,42386072,buy,9673.27,0.67 -binance-futures,BTCUSDT,1582336024114000,1582336024240364,42386073,sell,9673.26,0.001 -binance-futures,BTCUSDT,1582336024743000,1582336024868517,42386074,sell,9673.26,0.03 -binance-futures,BTCUSDT,1582336025578000,1582336025705790,42386075,buy,9673.27,0.001 -binance-futures,BTCUSDT,1582336030050000,1582336030176019,42386076,buy,9673.26,0.25 -binance-futures,BTCUSDT,1582336033189000,1582336033316506,42386077,buy,9673.26,0.001 -binance-futures,BTCUSDT,1582336033242000,1582336033369853,42386078,sell,9673.23,0.031 -binance-futures,BTCUSDT,1582336033242000,1582336033371871,42386079,sell,9673.22,0.031 -binance-futures,BTCUSDT,1582336033242000,1582336033371883,42386080,sell,9673.21,0.031 -binance-futures,BTCUSDT,1582336033242000,1582336033373184,42386081,sell,9673.2,0.031 -binance-futures,BTCUSDT,1582336033242000,1582336033373200,42386082,sell,9672.17,0.105 -binance-futures,BTCUSDT,1582336034913000,1582336035038101,42386083,buy,9673.25,0.133 -binance-futures,BTCUSDT,1582336034913000,1582336035038109,42386084,buy,9673.26,0.432 -binance-futures,BTCUSDT,1582336034913000,1582336035042226,42386085,buy,9673.26,0.052 -binance-futures,BTCUSDT,1582336034913000,1582336035044419,42386086,buy,9673.27,0.383 -binance-futures,BTCUSDT,1582336036947000,1582336037076305,42386087,buy,9673.2,0.001 -binance-futures,BTCUSDT,1582336037215000,1582336037343015,42386088,buy,9673.2,0.651 -binance-futures,BTCUSDT,1582336037860000,1582336037985753,42386089,buy,9673.2,0.06 -binance-futures,BTCUSDT,1582336038722000,1582336038846608,42386090,buy,9673.2,1.008 -binance-futures,BTCUSDT,1582336040098000,1582336040224686,42386091,buy,9673.2,0.001 -binance-futures,BTCUSDT,1582336043181000,1582336043323464,42386092,buy,9672.5,0.001 -binance-futures,BTCUSDT,1582336044227000,1582336044366165,42386093,buy,9672.5,0.027 -binance-futures,BTCUSDT,1582336044227000,1582336044366168,42386094,buy,9673.19,0.005 -binance-futures,BTCUSDT,1582336045834000,1582336045960019,42386095,buy,9673.2,0.001 -binance-futures,BTCUSDT,1582336048937000,1582336049064010,42386096,buy,9673.2,0.001 -binance-futures,BTCUSDT,1582336052550000,1582336052673254,42386097,buy,9673.2,0.001 -binance-futures,BTCUSDT,1582336055458000,1582336055586411,42386098,sell,9673.19,0.088 -binance-futures,BTCUSDT,1582336056405000,1582336056528043,42386099,buy,9673.2,1.504 -binance-futures,BTCUSDT,1582336059575000,1582336059699475,42386100,buy,9673.2,0.252 -binance-futures,BTCUSDT,1582336064181000,1582336064307433,42386101,buy,9673.2,0.001 -binance-futures,BTCUSDT,1582336067215000,1582336067341320,42386102,buy,9673.2,0.001 -binance-futures,BTCUSDT,1582336069089000,1582336069210676,42386103,sell,9673.19,0.001 -binance-futures,BTCUSDT,1582336071125000,1582336071246579,42386104,buy,9673.2,0.001 -binance-futures,BTCUSDT,1582336072070000,1582336072195328,42386105,buy,9673.2,0.69 -binance-futures,BTCUSDT,1582336072081000,1582336072205697,42386106,buy,9673.2,0.354 -binance-futures,BTCUSDT,1582336072081000,1582336072205710,42386107,buy,9673.2,0.057 -binance-futures,BTCUSDT,1582336072081000,1582336072205960,42386108,buy,9673.21,0.052 -binance-futures,BTCUSDT,1582336073881000,1582336074007189,42386109,buy,9673.64,0.001 -binance-futures,BTCUSDT,1582336074499000,1582336074625964,42386110,sell,9673.36,0.031 -binance-futures,BTCUSDT,1582336074499000,1582336074626457,42386111,sell,9673.33,0.161 -binance-futures,BTCUSDT,1582336076744000,1582336076871165,42386112,buy,9673.64,0.001 -binance-futures,BTCUSDT,1582336076999000,1582336077121053,42386113,buy,9673.64,0.196 -binance-futures,BTCUSDT,1582336076999000,1582336077121418,42386114,buy,9673.64,1.804 -binance-futures,BTCUSDT,1582336078197000,1582336078325552,42386115,sell,9673.63,0.1 -binance-futures,BTCUSDT,1582336078399000,1582336078524442,42386116,buy,9673.64,0.003 -binance-futures,BTCUSDT,1582336079577000,1582336079703997,42386117,buy,9673.64,0.001 -binance-futures,BTCUSDT,1582336080295000,1582336080422370,42386118,buy,9673.64,0.001 -binance-futures,BTCUSDT,1582336080459000,1582336080585641,42386119,buy,9673.64,0.165 -binance-futures,BTCUSDT,1582336080709000,1582336080831964,42386120,sell,9673.63,0.033 -binance-futures,BTCUSDT,1582336082463000,1582336082585431,42386121,buy,9673.64,0.496 -binance-futures,BTCUSDT,1582336082478000,1582336082602984,42386122,buy,9673.64,0.29 -binance-futures,BTCUSDT,1582336082478000,1582336082603437,42386123,buy,9673.76,0.1 -binance-futures,BTCUSDT,1582336082478000,1582336082607858,42386124,buy,9674.52,0.23 -binance-futures,BTCUSDT,1582336083227000,1582336083356286,42386125,buy,9674.52,0.452 -binance-futures,BTCUSDT,1582336083227000,1582336083356307,42386126,buy,9674.53,0.218 -binance-futures,BTCUSDT,1582336083270000,1582336083416429,42386127,buy,9674.53,0.01 -binance-futures,BTCUSDT,1582336083338000,1582336083465090,42386128,buy,9674.53,1.43 -binance-futures,BTCUSDT,1582336083346000,1582336083473702,42386129,buy,9674.53,1.203 -binance-futures,BTCUSDT,1582336083553000,1582336083681363,42386130,sell,9674.72,0.013 -binance-futures,BTCUSDT,1582336083553000,1582336083681372,42386131,sell,9674.52,0.067 -binance-futures,BTCUSDT,1582336084124000,1582336084250456,42386132,buy,9675.95,0.002 -binance-futures,BTCUSDT,1582336084124000,1582336084252940,42386133,buy,9675.95,0.001 -binance-futures,BTCUSDT,1582336087216000,1582336087340148,42386134,buy,9675.97,0.001 -binance-futures,BTCUSDT,1582336088605000,1582336088734466,42386135,buy,9675.97,0.413 -binance-futures,BTCUSDT,1582336088626000,1582336088753812,42386136,buy,9675.97,0.4 -binance-futures,BTCUSDT,1582336088631000,1582336088756781,42386137,buy,9675.97,0.01 -binance-futures,BTCUSDT,1582336088635000,1582336088760851,42386138,buy,9675.97,0.67 -binance-futures,BTCUSDT,1582336088638000,1582336088765024,42386139,buy,9675.97,0.15 -binance-futures,BTCUSDT,1582336088903000,1582336089029926,42386140,buy,9675.97,1.938 -binance-futures,BTCUSDT,1582336088903000,1582336089031315,42386141,buy,9675.97,0.062 -binance-futures,BTCUSDT,1582336088905000,1582336089033714,42386142,buy,9675.97,0.621 -binance-futures,BTCUSDT,1582336088927000,1582336089054933,42386143,buy,9676.25,0.012 -binance-futures,BTCUSDT,1582336088927000,1582336089058918,42386144,buy,9676.28,2.286 -binance-futures,BTCUSDT,1582336088954000,1582336089083878,42386145,buy,9677,0.01 -binance-futures,BTCUSDT,1582336088954000,1582336089086199,42386146,buy,9677,0.01 -binance-futures,BTCUSDT,1582336088954000,1582336089086215,42386147,buy,9677,0.01 -binance-futures,BTCUSDT,1582336088954000,1582336089086219,42386148,buy,9677,0.01 -binance-futures,BTCUSDT,1582336088954000,1582336089086224,42386149,buy,9677,0.001 -binance-futures,BTCUSDT,1582336088954000,1582336089086228,42386150,buy,9677,0.001 -binance-futures,BTCUSDT,1582336088954000,1582336089086233,42386151,buy,9677,0.001 -binance-futures,BTCUSDT,1582336088954000,1582336089086237,42386152,buy,9677,0.001 -binance-futures,BTCUSDT,1582336088954000,1582336089086242,42386153,buy,9677,0.001 -binance-futures,BTCUSDT,1582336088954000,1582336089086246,42386154,buy,9677,0.001 -binance-futures,BTCUSDT,1582336088954000,1582336089086251,42386155,buy,9677,0.001 -binance-futures,BTCUSDT,1582336088954000,1582336089086256,42386156,buy,9677,0.001 -binance-futures,BTCUSDT,1582336088954000,1582336089086261,42386157,buy,9677,0.001 -binance-futures,BTCUSDT,1582336088954000,1582336089086265,42386158,buy,9677,0.001 -binance-futures,BTCUSDT,1582336088954000,1582336089086270,42386159,buy,9677,1.95 -binance-futures,BTCUSDT,1582336088955000,1582336089087687,42386160,buy,9677,2 -binance-futures,BTCUSDT,1582336088981000,1582336089108079,42386161,buy,9677,1.415 -binance-futures,BTCUSDT,1582336089153000,1582336089281702,42386162,buy,9677.94,0.413 -binance-futures,BTCUSDT,1582336089561000,1582336089688286,42386163,sell,9676.55,0.04 -binance-futures,BTCUSDT,1582336090154000,1582336090279559,42386164,buy,9678.08,0.001 -binance-futures,BTCUSDT,1582336090827000,1582336090951351,42386165,buy,9678.08,0.001 -binance-futures,BTCUSDT,1582336093646000,1582336093774799,42386166,buy,9677.86,0.001 -binance-futures,BTCUSDT,1582336095485000,1582336095610440,42386167,buy,9677.87,0.056 -binance-futures,BTCUSDT,1582336096928000,1582336097055139,42386168,buy,9677.84,0.001 -binance-futures,BTCUSDT,1582336099006000,1582336099134317,42386169,buy,9677.57,0.01 -binance-futures,BTCUSDT,1582336100166000,1582336100296472,42386170,buy,9676.93,1 -binance-futures,BTCUSDT,1582336102974000,1582336103102503,42386171,sell,9676.43,0.67 -binance-futures,BTCUSDT,1582336103039000,1582336103164897,42386172,sell,9676.43,0.014 -binance-futures,BTCUSDT,1582336103869000,1582336103995819,42386173,sell,9676.07,0.5 -binance-futures,BTCUSDT,1582336103961000,1582336104088892,42386174,sell,9675.38,0.012 -binance-futures,BTCUSDT,1582336112445000,1582336112569111,42386175,buy,9676.06,0.001 -binance-futures,BTCUSDT,1582336113447000,1582336113577662,42386176,buy,9675.89,0.031 -binance-futures,BTCUSDT,1582336113447000,1582336113579636,42386177,buy,9675.89,0.007 -binance-futures,BTCUSDT,1582336114180000,1582336114304552,42386178,sell,9674.95,0.011 -binance-futures,BTCUSDT,1582336114913000,1582336115039818,42386179,sell,9674.33,0.01 -binance-futures,BTCUSDT,1582336115300000,1582336115437678,42386180,buy,9674.82,0.001 -binance-futures,BTCUSDT,1582336116557000,1582336116683911,42386181,buy,9674.64,0.031 -binance-futures,BTCUSDT,1582336116557000,1582336116683916,42386182,buy,9674.65,0.029 -binance-futures,BTCUSDT,1582336117123000,1582336117252368,42386183,sell,9673.63,0.001 -binance-futures,BTCUSDT,1582336118462000,1582336118586358,42386184,buy,9674.66,0.001 -binance-futures,BTCUSDT,1582336121307000,1582336121431824,42386185,buy,9674.67,0.001 -binance-futures,BTCUSDT,1582336122567000,1582336122695922,42386186,buy,9674.66,0.004 -binance-futures,BTCUSDT,1582336124364000,1582336124494784,42386187,buy,9675.16,0.001 -binance-futures,BTCUSDT,1582336126712000,1582336126836459,42386188,sell,9674.23,0.003 -binance-futures,BTCUSDT,1582336126712000,1582336126836483,42386189,sell,9673.68,0.521 -binance-futures,BTCUSDT,1582336127216000,1582336127341674,42386190,buy,9675.26,0.001 -binance-futures,BTCUSDT,1582336130542000,1582336130665941,42386191,buy,9674.98,0.001 -binance-futures,BTCUSDT,1582336131140000,1582336131279973,42386192,buy,9675.53,0.001 -binance-futures,BTCUSDT,1582336133818000,1582336133946022,42386193,buy,9675.19,0.001 -binance-futures,BTCUSDT,1582336136840000,1582336136965848,42386194,sell,9674.11,1.192 -binance-futures,BTCUSDT,1582336137218000,1582336137340710,42386195,buy,9675.19,0.001 -binance-futures,BTCUSDT,1582336140238000,1582336140364276,42386196,buy,9675.12,0.001 -binance-futures,BTCUSDT,1582336141340000,1582336141466117,42386197,buy,9675.12,0.001 -binance-futures,BTCUSDT,1582336142466000,1582336142594142,42386198,buy,9674.58,0.006 -binance-futures,BTCUSDT,1582336147265000,1582336147390186,42386199,buy,9674.58,0.031 -binance-futures,BTCUSDT,1582336147265000,1582336147394733,42386200,buy,9674.59,0.031 -binance-futures,BTCUSDT,1582336147265000,1582336147402929,42386201,buy,9674.6,0.031 -binance-futures,BTCUSDT,1582336147265000,1582336147405108,42386202,buy,9674.61,0.031 -binance-futures,BTCUSDT,1582336147265000,1582336147409115,42386203,buy,9674.63,0.052 -binance-futures,BTCUSDT,1582336147265000,1582336147409122,42386204,buy,9675.15,0.1 -binance-futures,BTCUSDT,1582336147265000,1582336147412235,42386205,buy,9675.19,0.194 -binance-futures,BTCUSDT,1582336151126000,1582336151252739,42386206,buy,9674.78,0.01 -binance-futures,BTCUSDT,1582336151719000,1582336151846099,42386207,buy,9674.5,0.001 -binance-futures,BTCUSDT,1582336153475000,1582336153599006,42386208,buy,9675.12,0.031 -binance-futures,BTCUSDT,1582336153475000,1582336153603013,42386209,buy,9675.13,0.031 -binance-futures,BTCUSDT,1582336153475000,1582336153607230,42386210,buy,9675.14,0.031 -binance-futures,BTCUSDT,1582336153475000,1582336153607247,42386211,buy,9675.15,0.018 -binance-futures,BTCUSDT,1582336154770000,1582336154900692,42386212,buy,9674.51,0.031 -binance-futures,BTCUSDT,1582336154770000,1582336154900696,42386213,buy,9674.52,0.031 -binance-futures,BTCUSDT,1582336154770000,1582336154905167,42386214,buy,9674.53,0.031 -binance-futures,BTCUSDT,1582336154770000,1582336154908187,42386215,buy,9674.54,0.029 -binance-futures,BTCUSDT,1582336154770000,1582336154908194,42386216,buy,9675.16,0.002 -binance-futures,BTCUSDT,1582336154770000,1582336154910120,42386217,buy,9675.17,0.517 -binance-futures,BTCUSDT,1582336154770000,1582336154910123,42386218,buy,9675.17,0.517 -binance-futures,BTCUSDT,1582336154770000,1582336154912033,42386219,buy,9675.18,0.682 -binance-futures,BTCUSDT,1582336154770000,1582336154913941,42386220,buy,9675.19,3.16 -binance-futures,BTCUSDT,1582336155913000,1582336156038490,42386221,buy,9675.19,0.001 -binance-futures,BTCUSDT,1582336158473000,1582336158600573,42386222,buy,9674.77,0.033 -binance-futures,BTCUSDT,1582336159548000,1582336159672635,42386223,buy,9674.13,0.01 -binance-futures,BTCUSDT,1582336160649000,1582336160774105,42386224,buy,9674.78,0.001 -binance-futures,BTCUSDT,1582336160767000,1582336160895395,42386225,sell,9673.86,0.003 -binance-futures,BTCUSDT,1582336161157000,1582336161315189,42386226,sell,9673.82,0.5 -binance-futures,BTCUSDT,1582336165648000,1582336165774582,42386227,buy,9673.88,0.1 -binance-futures,BTCUSDT,1582336166545000,1582336166670546,42386228,buy,9674.41,0.005 -binance-futures,BTCUSDT,1582336167275000,1582336167402964,42386229,buy,9674.41,0.001 -binance-futures,BTCUSDT,1582336167479000,1582336167608112,42386230,sell,9674.4,0.02 -binance-futures,BTCUSDT,1582336169155000,1582336169286775,42386231,buy,9674.41,0.001 -binance-futures,BTCUSDT,1582336170356000,1582336170483881,42386232,buy,9674.78,0.001 -binance-futures,BTCUSDT,1582336170781000,1582336170908506,42386233,buy,9674.78,0.001 -binance-futures,BTCUSDT,1582336174330000,1582336174453873,42386234,buy,9674.78,0.001 -binance-futures,BTCUSDT,1582336176924000,1582336177048631,42386235,sell,9674.77,0.031 -binance-futures,BTCUSDT,1582336176924000,1582336177050774,42386236,sell,9674.77,0.54 -binance-futures,BTCUSDT,1582336176924000,1582336177050780,42386237,sell,9674.75,0.031 -binance-futures,BTCUSDT,1582336176924000,1582336177050783,42386238,sell,9674.75,0.398 -binance-futures,BTCUSDT,1582336177498000,1582336177625422,42386239,buy,9674.76,0.1 -binance-futures,BTCUSDT,1582336177498000,1582336177625430,42386240,buy,9674.78,0.68 -binance-futures,BTCUSDT,1582336177498000,1582336177630642,42386241,buy,9675.19,0.1 -binance-futures,BTCUSDT,1582336177502000,1582336177634597,42386242,buy,9675.45,1.004 -binance-futures,BTCUSDT,1582336177512000,1582336177637994,42386243,buy,9675.45,0.001 -binance-futures,BTCUSDT,1582336180469000,1582336180594590,42386244,buy,9675.25,0.001 -binance-futures,BTCUSDT,1582336182607000,1582336182734197,42386245,sell,9675.24,0.031 -binance-futures,BTCUSDT,1582336182607000,1582336182751906,42386246,sell,9675.23,0.031 -binance-futures,BTCUSDT,1582336182607000,1582336182751925,42386247,sell,9675.22,0.031 -binance-futures,BTCUSDT,1582336182607000,1582336182752194,42386248,sell,9675.21,0.031 -binance-futures,BTCUSDT,1582336182607000,1582336182755059,42386249,sell,9675.19,0.076 -binance-futures,BTCUSDT,1582336183137000,1582336183264593,42386250,buy,9675.45,0.005 -binance-futures,BTCUSDT,1582336183170000,1582336183295145,42386251,buy,9675.45,0.001 -binance-futures,BTCUSDT,1582336183924000,1582336184050579,42386252,buy,9675.2,0.027 -binance-futures,BTCUSDT,1582336186037000,1582336186165026,42386253,buy,9675.2,0.001 -binance-futures,BTCUSDT,1582336188808000,1582336188933270,42386254,buy,9675.21,0.001 -binance-futures,BTCUSDT,1582336189410000,1582336189538431,42386255,buy,9675.21,0.051 -binance-futures,BTCUSDT,1582336189410000,1582336189539630,42386256,buy,9675.43,0.349 -binance-futures,BTCUSDT,1582336190185000,1582336190311706,42386257,buy,9675.38,0.031 -binance-futures,BTCUSDT,1582336190185000,1582336190313727,42386258,buy,9675.39,0.031 -binance-futures,BTCUSDT,1582336190185000,1582336190315334,42386259,buy,9675.4,0.031 -binance-futures,BTCUSDT,1582336190185000,1582336190315343,42386260,buy,9675.41,0.031 -binance-futures,BTCUSDT,1582336190185000,1582336190319147,42386261,buy,9675.43,4.342 -binance-futures,BTCUSDT,1582336190185000,1582336190321274,42386262,buy,9675.54,0.1 -binance-futures,BTCUSDT,1582336192033000,1582336192159823,42386263,buy,9676.09,0.001 -binance-futures,BTCUSDT,1582336194896000,1582336195020000,42386264,buy,9676.08,0.001 -binance-futures,BTCUSDT,1582336199128000,1582336199263306,42386265,buy,9676.09,0.001 -binance-futures,BTCUSDT,1582336199491000,1582336199616916,42386266,buy,9675.6,0.05 -binance-futures,BTCUSDT,1582336200250000,1582336200378733,42386267,buy,9676.09,0.001 -binance-futures,BTCUSDT,1582336202155000,1582336202280779,42386268,buy,9675.76,0.001 -binance-futures,BTCUSDT,1582336202698000,1582336202821506,42386269,buy,9675.71,0.031 -binance-futures,BTCUSDT,1582336202698000,1582336202827151,42386270,buy,9675.72,0.031 -binance-futures,BTCUSDT,1582336202698000,1582336202832623,42386271,buy,9675.73,0.031 -binance-futures,BTCUSDT,1582336202698000,1582336202832634,42386272,buy,9675.74,0.031 -binance-futures,BTCUSDT,1582336202698000,1582336202832641,42386273,buy,9675.76,0.753 -binance-futures,BTCUSDT,1582336203678000,1582336203802911,42386274,buy,9676.09,0.381 -binance-futures,BTCUSDT,1582336203718000,1582336203846784,42386275,buy,9676.35,0.29 -binance-futures,BTCUSDT,1582336203821000,1582336203948094,42386276,buy,9676.35,0.079 -binance-futures,BTCUSDT,1582336204694000,1582336204821412,42386277,buy,9676.35,0.002 -binance-futures,BTCUSDT,1582336205113000,1582336205238346,42386278,buy,9676.35,0.001 -binance-futures,BTCUSDT,1582336205251000,1582336205376045,42386279,buy,9676.35,0.002 -binance-futures,BTCUSDT,1582336205813000,1582336205938226,42386280,buy,9676.35,0.002 -binance-futures,BTCUSDT,1582336206392000,1582336206518324,42386281,buy,9676.35,0.002 -binance-futures,BTCUSDT,1582336207766000,1582336207888126,42386282,buy,9676.35,0.001 -binance-futures,BTCUSDT,1582336210612000,1582336210736229,42386283,buy,9676.35,0.1 -binance-futures,BTCUSDT,1582336210612000,1582336210736756,42386284,buy,9676.6,0.536 -binance-futures,BTCUSDT,1582336211119000,1582336211239744,42386285,buy,9676.6,0.001 -binance-futures,BTCUSDT,1582336214291000,1582336214424944,42386286,buy,9676.48,0.001 -binance-futures,BTCUSDT,1582336216080000,1582336216207649,42386287,buy,9676.48,0.099 -binance-futures,BTCUSDT,1582336216080000,1582336216209823,42386288,buy,9676.48,0.987 -binance-futures,BTCUSDT,1582336216080000,1582336216209830,42386289,buy,9676.6,0.146 -binance-futures,BTCUSDT,1582336216080000,1582336216211906,42386290,buy,9676.6,0.921 -binance-futures,BTCUSDT,1582336218132000,1582336218550789,42386291,buy,9676.66,0.001 -binance-futures,BTCUSDT,1582336222299000,1582336222425875,42386292,buy,9676.66,0.001 -binance-futures,BTCUSDT,1582336225454000,1582336225582306,42386293,buy,9676.66,0.001 -binance-futures,BTCUSDT,1582336226731000,1582336226862157,42386294,sell,9676.65,0.031 -binance-futures,BTCUSDT,1582336226731000,1582336226864911,42386295,sell,9676.64,0.031 -binance-futures,BTCUSDT,1582336226731000,1582336226873109,42386296,sell,9676.63,0.02 -binance-futures,BTCUSDT,1582336228175000,1582336228301345,42386297,buy,9676.66,0.001 -binance-futures,BTCUSDT,1582336230427000,1582336230554438,42386298,sell,9676.65,0.031 -binance-futures,BTCUSDT,1582336230427000,1582336230558470,42386299,sell,9676.65,0.048 -binance-futures,BTCUSDT,1582336231526000,1582336231651807,42386300,buy,9676.66,0.001 -binance-futures,BTCUSDT,1582336231685000,1582336231808553,42386301,buy,9676.66,0.246 -binance-futures,BTCUSDT,1582336231729000,1582336231855310,42386302,buy,9676.66,0.013 -binance-futures,BTCUSDT,1582336232566000,1582336232691487,42386303,buy,9676.66,0.016 -binance-futures,BTCUSDT,1582336233134000,1582336233255127,42386304,buy,9676.66,0.404 -binance-futures,BTCUSDT,1582336233134000,1582336233259455,42386305,buy,9677.35,0.046 -binance-futures,BTCUSDT,1582336234592000,1582336234717326,42386306,buy,9677.57,0.001 -binance-futures,BTCUSDT,1582336237885000,1582336238010045,42386307,buy,9677.57,0.001 -binance-futures,BTCUSDT,1582336241521000,1582336241644459,42386308,buy,9677.57,0.001 -binance-futures,BTCUSDT,1582336244208000,1582336244334325,42386309,buy,9678.09,0.001 -binance-futures,BTCUSDT,1582336247018000,1582336247146179,42386310,buy,9678.09,0.001 -binance-futures,BTCUSDT,1582336248471000,1582336248596282,42386311,buy,9678.09,0.045 -binance-futures,BTCUSDT,1582336248471000,1582336248596617,42386312,buy,9678.29,0.005 -binance-futures,BTCUSDT,1582336249812000,1582336249938289,42386313,buy,9678.29,0.007 -binance-futures,BTCUSDT,1582336250117000,1582336250246800,42386314,buy,9678.59,0.001 -binance-futures,BTCUSDT,1582336250542000,1582336250664705,42386315,buy,9678.59,0.046 -binance-futures,BTCUSDT,1582336250542000,1582336250664859,42386316,buy,9678.62,0.039 -binance-futures,BTCUSDT,1582336250542000,1582336250668398,42386317,buy,9678.96,0.015 -binance-futures,BTCUSDT,1582336250607000,1582336250733390,42386318,buy,9678.96,0.025 -binance-futures,BTCUSDT,1582336250607000,1582336250733414,42386319,buy,9678.98,0.075 -binance-futures,BTCUSDT,1582336253389000,1582336253515092,42386320,buy,9678.84,0.001 -binance-futures,BTCUSDT,1582336254401000,1582336254529647,42386321,sell,9678.33,0.005 -binance-futures,BTCUSDT,1582336254983000,1582336255105860,42386322,buy,9678.98,1.525 -binance-futures,BTCUSDT,1582336254983000,1582336255105873,42386323,buy,9678.98,0.475 -binance-futures,BTCUSDT,1582336257333000,1582336257459494,42386324,buy,9679.25,0.001 -binance-futures,BTCUSDT,1582336258162000,1582336258292348,42386325,buy,9679.25,0.396 -binance-futures,BTCUSDT,1582336259326000,1582336259453642,42386326,buy,9679.25,0.32 -binance-futures,BTCUSDT,1582336260461000,1582336260590700,42386327,buy,9679.3,0.048 -binance-futures,BTCUSDT,1582336260461000,1582336260591615,42386328,buy,9679.52,0.106 -binance-futures,BTCUSDT,1582336260562000,1582336260706005,42386329,buy,9679.52,0.524 -binance-futures,BTCUSDT,1582336260651000,1582336260779665,42386330,buy,9679.51,0.001 -binance-futures,BTCUSDT,1582336261202000,1582336261331828,42386331,sell,9678.23,0.001 -binance-futures,BTCUSDT,1582336263375000,1582336263502544,42386332,buy,9679.76,2 -binance-futures,BTCUSDT,1582336263943000,1582336264070452,42386333,buy,9679.76,0.001 -binance-futures,BTCUSDT,1582336267598000,1582336267762092,42386334,buy,9679.99,0.001 -binance-futures,BTCUSDT,1582336268308000,1582336268432416,42386335,sell,9678.73,0.003 -binance-futures,BTCUSDT,1582336269259000,1582336269386893,42386336,buy,9679.98,0.002 -binance-futures,BTCUSDT,1582336270887000,1582336271012713,42386337,buy,9679.99,0.001 -binance-futures,BTCUSDT,1582336271454000,1582336271580197,42386338,sell,9679.16,0.005 -binance-futures,BTCUSDT,1582336274573000,1582336274702289,42386339,sell,9679.4,0.031 -binance-futures,BTCUSDT,1582336274573000,1582336274706552,42386340,sell,9679.39,0.019 -binance-futures,BTCUSDT,1582336275538000,1582336275666598,42386341,buy,9679.99,0.681 -binance-futures,BTCUSDT,1582336275538000,1582336275666607,42386342,buy,9680,0.216 -binance-futures,BTCUSDT,1582336275741000,1582336275866757,42386343,buy,9680,0.1 -binance-futures,BTCUSDT,1582336277941000,1582336278064730,42386344,buy,9679.99,0.01 -binance-futures,BTCUSDT,1582336278382000,1582336278511810,42386345,buy,9679.99,0.001 -binance-futures,BTCUSDT,1582336281528000,1582336281653315,42386346,buy,9679.99,0.001 -binance-futures,BTCUSDT,1582336284803000,1582336284928119,42386347,buy,9679.99,0.001 -binance-futures,BTCUSDT,1582336288522000,1582336288645598,42386348,buy,9679.99,0.001 -binance-futures,BTCUSDT,1582336288974000,1582336289104087,42386349,sell,9679.92,0.2 -binance-futures,BTCUSDT,1582336289686000,1582336289815759,42386350,sell,9679.51,2 -binance-futures,BTCUSDT,1582336289699000,1582336289826687,42386351,sell,9679.51,0.897 -binance-futures,BTCUSDT,1582336289709000,1582336289836981,42386352,sell,9679.51,1.058 -binance-futures,BTCUSDT,1582336290020000,1582336290150956,42386353,sell,9678.32,0.005 -binance-futures,BTCUSDT,1582336290020000,1582336290150967,42386354,sell,9678.31,0.735 -binance-futures,BTCUSDT,1582336291726000,1582336291853970,42386355,buy,9679,0.154 -binance-futures,BTCUSDT,1582336292425000,1582336292550370,42386356,buy,9679.03,0.001 -binance-futures,BTCUSDT,1582336295468000,1582336295591615,42386357,buy,9678.55,0.001 -binance-futures,BTCUSDT,1582336298447000,1582336298569316,42386358,buy,9679.4,0.001 -binance-futures,BTCUSDT,1582336301309000,1582336301431347,42386359,buy,9679.69,0.001 -binance-futures,BTCUSDT,1582336304245000,1582336304374222,42386360,buy,9679.8,0.001 -binance-futures,BTCUSDT,1582336307935000,1582336308055285,42386361,buy,9678.42,0.001 -binance-futures,BTCUSDT,1582336311046000,1582336311170695,42386362,buy,9678.42,0.001 -binance-futures,BTCUSDT,1582336314587000,1582336314709931,42386363,buy,9678.42,0.001 -binance-futures,BTCUSDT,1582336316115000,1582336316239127,42386364,sell,9678.41,0.002 -binance-futures,BTCUSDT,1582336318303000,1582336318424280,42386365,buy,9678.42,0.001 -binance-futures,BTCUSDT,1582336320225000,1582336320353466,42386366,buy,9678.42,0.012 -binance-futures,BTCUSDT,1582336321262000,1582336321384867,42386367,buy,9678.42,0.001 -binance-futures,BTCUSDT,1582336325262000,1582336325383325,42386368,buy,9679.99,0.001 -binance-futures,BTCUSDT,1582336328499000,1582336328620029,42386369,buy,9679.76,0.001 -binance-futures,BTCUSDT,1582336329951000,1582336330075339,42386370,buy,9679.81,0.017 -binance-futures,BTCUSDT,1582336331991000,1582336332111439,42386371,buy,9679.31,0.001 -binance-futures,BTCUSDT,1582336335206000,1582336335346163,42386372,buy,9679.41,0.001 -binance-futures,BTCUSDT,1582336338698000,1582336338817294,42386373,buy,9679.75,0.001 -binance-futures,BTCUSDT,1582336342138000,1582336342258577,42386374,buy,9679.67,0.001 -binance-futures,BTCUSDT,1582336345342000,1582336345486684,42386375,buy,9679.11,0.001 -binance-futures,BTCUSDT,1582336348420000,1582336348544084,42386376,buy,9679.16,0.001 -binance-futures,BTCUSDT,1582336351755000,1582336351881232,42386377,buy,9679.08,0.001 -binance-futures,BTCUSDT,1582336361875000,1582336361998811,42386378,buy,9679.77,0.1 -binance-futures,BTCUSDT,1582336367509000,1582336367636379,42386379,sell,9678.91,0.031 -binance-futures,BTCUSDT,1582336367509000,1582336367636390,42386380,sell,9678.9,0.031 -binance-futures,BTCUSDT,1582336367509000,1582336367639284,42386381,sell,9678.89,0.031 -binance-futures,BTCUSDT,1582336367509000,1582336367644201,42386382,sell,9678.87,0.007 -binance-futures,BTCUSDT,1582336380248000,1582336380373361,42386383,buy,9679.76,0.001 -binance-futures,BTCUSDT,1582336382101000,1582336382225350,42386384,sell,9678.95,2 -binance-futures,BTCUSDT,1582336387804000,1582336387925358,42386385,sell,9678.87,0.177 -binance-futures,BTCUSDT,1582336390766000,1582336390888690,42386386,sell,9678.29,1.017 -binance-futures,BTCUSDT,1582336391178000,1582336391301048,42386387,sell,9678.29,0.72 -binance-futures,BTCUSDT,1582336391187000,1582336391307275,42386388,sell,9678.29,0.74 -binance-futures,BTCUSDT,1582336391221000,1582336391346275,42386389,sell,9678.29,2 -binance-futures,BTCUSDT,1582336391225000,1582336391349275,42386390,sell,9678.29,0.01 -binance-futures,BTCUSDT,1582336391243000,1582336391381251,42386391,sell,9678.29,0.115 -binance-futures,BTCUSDT,1582336391245000,1582336391382064,42386392,sell,9677.95,0.041 -binance-futures,BTCUSDT,1582336391286000,1582336391413826,42386393,sell,9677.95,1.95 -binance-futures,BTCUSDT,1582336391286000,1582336391413829,42386394,sell,9677.95,0.72 -binance-futures,BTCUSDT,1582336391286000,1582336391413832,42386395,sell,9677.95,0.182 -binance-futures,BTCUSDT,1582336391580000,1582336391702755,42386396,sell,9677.02,0.01 -binance-futures,BTCUSDT,1582336391910000,1582336392033379,42386397,sell,9677.02,1.34 -binance-futures,BTCUSDT,1582336391948000,1582336392073080,42386398,sell,9677.02,0.01 -binance-futures,BTCUSDT,1582336391962000,1582336392089508,42386399,sell,9677.02,1.21 -binance-futures,BTCUSDT,1582336391977000,1582336392102391,42386400,sell,9677.02,0.102 -binance-futures,BTCUSDT,1582336392069000,1582336392190909,42386401,sell,9675.85,0.01 -binance-futures,BTCUSDT,1582336392069000,1582336392191240,42386402,buy,9676.59,0.031 -binance-futures,BTCUSDT,1582336392069000,1582336392194800,42386403,buy,9676.61,0.57 -binance-futures,BTCUSDT,1582336392069000,1582336392196649,42386404,buy,9676.63,9.399 -binance-futures,BTCUSDT,1582336392431000,1582336392557743,42386405,sell,9675.92,0.01 -binance-futures,BTCUSDT,1582336392431000,1582336392557752,42386406,sell,9675.86,0.001 -binance-futures,BTCUSDT,1582336392431000,1582336392557756,42386407,sell,9675.85,0.659 -binance-futures,BTCUSDT,1582336392499000,1582336392622320,42386408,sell,9675.85,0.01 -binance-futures,BTCUSDT,1582336396992000,1582336397120288,42386409,buy,9674.58,0.001 -binance-futures,BTCUSDT,1582336401062000,1582336401186072,42386410,buy,9673.93,0.001 -binance-futures,BTCUSDT,1582336403604000,1582336403730983,42386411,buy,9673.93,0.1 -binance-futures,BTCUSDT,1582336403604000,1582336403730992,42386412,buy,9675.03,0.012 -binance-futures,BTCUSDT,1582336403604000,1582336403733754,42386413,buy,9675.42,0.685 -binance-futures,BTCUSDT,1582336403604000,1582336403735761,42386414,buy,9676,0.776 -binance-futures,BTCUSDT,1582336403604000,1582336403738150,42386415,buy,9676.86,0.857 -binance-futures,BTCUSDT,1582336404702000,1582336404824123,42386416,buy,9676.76,0.001 -binance-futures,BTCUSDT,1582336406797000,1582336406924067,42386417,sell,9673.9,0.154 -binance-futures,BTCUSDT,1582336406914000,1582336407036495,42386418,sell,9673.9,10.26 -binance-futures,BTCUSDT,1582336406959000,1582336407079290,42386419,sell,9673.9,2 -binance-futures,BTCUSDT,1582336406978000,1582336407103887,42386420,sell,9673.9,1.507 -binance-futures,BTCUSDT,1582336407115000,1582336407241098,42386421,sell,9673.19,0.034 -binance-futures,BTCUSDT,1582336407115000,1582336407243751,42386422,sell,9673.08,0.006 -binance-futures,BTCUSDT,1582336407890000,1582336408013507,42386423,buy,9672.98,0.001 -binance-futures,BTCUSDT,1582336407962000,1582336408087406,42386424,sell,9672.89,2 -binance-futures,BTCUSDT,1582336407985000,1582336408111058,42386425,sell,9672.89,1.675 -binance-futures,BTCUSDT,1582336407985000,1582336408111585,42386426,sell,9672.79,0.047 -binance-futures,BTCUSDT,1582336410190000,1582336410314870,42386427,sell,9672.08,0.012 -binance-futures,BTCUSDT,1582336410212000,1582336410354289,42386428,sell,9671.95,0.113 -binance-futures,BTCUSDT,1582336410212000,1582336410355218,42386429,sell,9671.91,0.047 -binance-futures,BTCUSDT,1582336411051000,1582336411186076,42386430,buy,9671.68,0.001 -binance-futures,BTCUSDT,1582336411242000,1582336411364874,42386431,buy,9671.4,0.018 -binance-futures,BTCUSDT,1582336411489000,1582336411614535,42386432,buy,9671.13,0.112 -binance-futures,BTCUSDT,1582336411489000,1582336411614541,42386433,sell,9670.55,0.001 -binance-futures,BTCUSDT,1582336412705000,1582336412830313,42386434,sell,9670.55,0.039 -binance-futures,BTCUSDT,1582336412705000,1582336412830320,42386435,sell,9670.5,0.013 -binance-futures,BTCUSDT,1582336412705000,1582336412835229,42386436,sell,9670.45,0.012 -binance-futures,BTCUSDT,1582336412705000,1582336412837699,42386437,sell,9670.37,0.095 -binance-futures,BTCUSDT,1582336412705000,1582336412838522,42386438,sell,9670.24,0.031 -binance-futures,BTCUSDT,1582336414490000,1582336414613467,42386439,buy,9670.77,0.1 -binance-futures,BTCUSDT,1582336414627000,1582336414750720,42386440,buy,9672.8,0.001 -binance-futures,BTCUSDT,1582336415379000,1582336415504243,42386441,sell,9670.87,0.317 -binance-futures,BTCUSDT,1582336418382000,1582336418504250,42386442,buy,9671.48,0.001 -binance-futures,BTCUSDT,1582336421208000,1582336421331769,42386443,buy,9670.59,0.001 -binance-futures,BTCUSDT,1582336423820000,1582336423942441,42386444,sell,9670.54,0.005 -binance-futures,BTCUSDT,1582336423820000,1582336423945556,42386445,sell,9670,0.001 -binance-futures,BTCUSDT,1582336423820000,1582336423948515,42386446,sell,9670,0.001 -binance-futures,BTCUSDT,1582336423820000,1582336423949048,42386447,sell,9670,0.01 -binance-futures,BTCUSDT,1582336423820000,1582336423949075,42386448,sell,9670,0.007 -binance-futures,BTCUSDT,1582336423820000,1582336423953941,42386449,sell,9670,0.1 -binance-futures,BTCUSDT,1582336423820000,1582336423956106,42386450,sell,9669.28,0.934 -binance-futures,BTCUSDT,1582336423820000,1582336423956112,42386451,sell,9669.18,0.524 -binance-futures,BTCUSDT,1582336423820000,1582336423957485,42386452,sell,9669.18,0.524 -binance-futures,BTCUSDT,1582336423820000,1582336423957505,42386453,sell,9669.18,0.524 -binance-futures,BTCUSDT,1582336423820000,1582336423957509,42386454,sell,9669.18,0.524 -binance-futures,BTCUSDT,1582336423820000,1582336423957514,42386455,sell,9669.17,0.03 -binance-futures,BTCUSDT,1582336423820000,1582336423959698,42386456,sell,9669.11,0.816 -binance-futures,BTCUSDT,1582336423820000,1582336423959706,42386457,sell,9669.11,0.04 -binance-futures,BTCUSDT,1582336424497000,1582336424619131,42386458,buy,9670.59,0.001 -binance-futures,BTCUSDT,1582336424599000,1582336424719651,42386459,sell,9669.57,0.031 -binance-futures,BTCUSDT,1582336427888000,1582336428012748,42386460,buy,9670.47,0.001 -binance-futures,BTCUSDT,1582336431618000,1582336431734793,42386461,buy,9669.62,0.001 -binance-futures,BTCUSDT,1582336433497000,1582336433622431,42386462,buy,9669.83,0.1 -binance-futures,BTCUSDT,1582336434499000,1582336434622950,42386463,buy,9670.54,0.001 -binance-futures,BTCUSDT,1582336435783000,1582336435908625,42386464,buy,9669.25,0.111 -binance-futures,BTCUSDT,1582336436030000,1582336436152202,42386465,buy,9669.25,0.222 -binance-futures,BTCUSDT,1582336436356000,1582336436478367,42386466,sell,9668.76,0.04 -binance-futures,BTCUSDT,1582336436922000,1582336437046398,42386467,buy,9667.4,1.757 -binance-futures,BTCUSDT,1582336437243000,1582336437392661,42386468,buy,9667.4,0.111 -binance-futures,BTCUSDT,1582336437417000,1582336437539836,42386469,sell,9667.39,0.729 -binance-futures,BTCUSDT,1582336437417000,1582336437540090,42386470,sell,9667.39,0.01 -binance-futures,BTCUSDT,1582336437417000,1582336437540101,42386471,sell,9667.39,2.176 -binance-futures,BTCUSDT,1582336437417000,1582336437540344,42386472,sell,9667,2.1 -binance-futures,BTCUSDT,1582336437417000,1582336437545223,42386473,sell,9666.99,0.047 -binance-futures,BTCUSDT,1582336437417000,1582336437549608,42386474,sell,9666.4,0.065 -binance-futures,BTCUSDT,1582336437417000,1582336437550896,42386475,sell,9666.36,0.04 -binance-futures,BTCUSDT,1582336437417000,1582336437552860,42386476,sell,9666.34,0.761 -binance-futures,BTCUSDT,1582336437417000,1582336437552877,42386477,sell,9666.34,0.751 -binance-futures,BTCUSDT,1582336437509000,1582336437634781,42386478,buy,9667.51,0.222 -binance-futures,BTCUSDT,1582336437567000,1582336437691418,42386479,buy,9667.43,0.031 -binance-futures,BTCUSDT,1582336437567000,1582336437697020,42386480,buy,9667.44,0.031 -binance-futures,BTCUSDT,1582336437567000,1582336437700071,42386481,buy,9667.45,0.031 -binance-futures,BTCUSDT,1582336437567000,1582336437700086,42386482,buy,9667.47,0.307 -binance-futures,BTCUSDT,1582336438239000,1582336438391140,42386483,sell,9666.85,0.01 -binance-futures,BTCUSDT,1582336441486000,1582336441619190,42386484,sell,9667.57,0.098 -binance-futures,BTCUSDT,1582336441486000,1582336441619196,42386485,sell,9666.73,0.007 -binance-futures,BTCUSDT,1582336442053000,1582336442175493,42386486,buy,9667.58,0.005 -binance-futures,BTCUSDT,1582336442785000,1582336442906866,42386487,sell,9667.57,0.378 -binance-futures,BTCUSDT,1582336444746000,1582336444868976,42386488,buy,9667.58,0.001 -binance-futures,BTCUSDT,1582336444859000,1582336444979590,42386489,sell,9667.57,0.021 -binance-futures,BTCUSDT,1582336445622000,1582336445745167,42386490,sell,9667.57,0.013 -binance-futures,BTCUSDT,1582336449659000,1582336449779469,42386491,buy,9667.57,0.683 -binance-futures,BTCUSDT,1582336449659000,1582336449779823,42386492,buy,9667.58,5.083 -binance-futures,BTCUSDT,1582336449659000,1582336449785480,42386493,buy,9668.01,0.1 -binance-futures,BTCUSDT,1582336449659000,1582336449789603,42386494,buy,9668.53,0.134 -binance-futures,BTCUSDT,1582336452040000,1582336452162423,42386495,buy,9667.99,0.232 -binance-futures,BTCUSDT,1582336453816000,1582336453939946,42386496,buy,9668.13,0.1 -binance-futures,BTCUSDT,1582336454957000,1582336455080726,42386497,buy,9668.13,0.306 -binance-futures,BTCUSDT,1582336458015000,1582336458137540,42386498,buy,9668.27,0.322 -binance-futures,BTCUSDT,1582336458061000,1582336458183652,42386499,buy,9668.27,1.3 -binance-futures,BTCUSDT,1582336458067000,1582336458189557,42386500,buy,9668.27,0.486 -binance-futures,BTCUSDT,1582336458100000,1582336458223709,42386501,buy,9668.72,0.683 -binance-futures,BTCUSDT,1582336458100000,1582336458226056,42386502,buy,9668.72,0.037 -binance-futures,BTCUSDT,1582336458103000,1582336458229453,42386503,buy,9668.72,0.74 -binance-futures,BTCUSDT,1582336458105000,1582336458231462,42386504,buy,9668.72,0.98 -binance-futures,BTCUSDT,1582336458108000,1582336458231665,42386505,buy,9668.72,0.663 -binance-futures,BTCUSDT,1582336458880000,1582336459001921,42386506,buy,9669.72,0.001 -binance-futures,BTCUSDT,1582336462177000,1582336462299125,42386507,buy,9669.71,0.001 -binance-futures,BTCUSDT,1582336465407000,1582336465528523,42386508,buy,9669.72,0.001 -binance-futures,BTCUSDT,1582336468468000,1582336468589897,42386509,buy,9668.69,0.001 -binance-futures,BTCUSDT,1582336471533000,1582336471659887,42386510,buy,9668.72,0.001 -binance-futures,BTCUSDT,1582336473620000,1582336473744424,42386511,sell,9668.66,2 -binance-futures,BTCUSDT,1582336473879000,1582336474000772,42386512,sell,9668.78,0.031 -binance-futures,BTCUSDT,1582336473879000,1582336474006429,42386513,sell,9668.77,0.031 -binance-futures,BTCUSDT,1582336473879000,1582336474006438,42386514,sell,9668.76,0.031 -binance-futures,BTCUSDT,1582336473879000,1582336474011915,42386515,sell,9668.74,0.67 -binance-futures,BTCUSDT,1582336473879000,1582336474014406,42386516,sell,9668.73,0.031 -binance-futures,BTCUSDT,1582336473879000,1582336474014416,42386517,sell,9668.72,0.031 -binance-futures,BTCUSDT,1582336473879000,1582336474015722,42386518,sell,9668.71,0.031 -binance-futures,BTCUSDT,1582336473879000,1582336474016693,42386519,sell,9668.7,0.031 -binance-futures,BTCUSDT,1582336473879000,1582336474017549,42386520,sell,9668.69,0.031 -binance-futures,BTCUSDT,1582336473879000,1582336474019417,42386521,sell,9668.26,0.684 -binance-futures,BTCUSDT,1582336473879000,1582336474020258,42386522,sell,9667.95,0.18 -binance-futures,BTCUSDT,1582336473879000,1582336474020264,42386523,sell,9667.95,0.18 -binance-futures,BTCUSDT,1582336473879000,1582336474020273,42386524,sell,9667.94,0.947 -binance-futures,BTCUSDT,1582336474361000,1582336474481663,42386525,sell,9667.94,0.059 -binance-futures,BTCUSDT,1582336474779000,1582336474901030,42386526,buy,9668.26,0.001 -binance-futures,BTCUSDT,1582336476648000,1582336476770584,42386527,sell,9667.94,2 -binance-futures,BTCUSDT,1582336477732000,1582336477853162,42386528,buy,9668.31,0.001 -binance-futures,BTCUSDT,1582336480581000,1582336480704810,42386529,buy,9667.97,0.005 -binance-futures,BTCUSDT,1582336480775000,1582336480892379,42386530,buy,9667.97,0.001 -binance-futures,BTCUSDT,1582336481443000,1582336481564416,42386531,buy,9667.97,0.025 -binance-futures,BTCUSDT,1582336481443000,1582336481565541,42386532,buy,9667.98,0.031 -binance-futures,BTCUSDT,1582336481443000,1582336481569816,42386533,buy,9667.99,0.031 -binance-futures,BTCUSDT,1582336481443000,1582336481572007,42386534,buy,9668,0.031 -binance-futures,BTCUSDT,1582336481443000,1582336481574679,42386535,buy,9668.85,0.283 -binance-futures,BTCUSDT,1582336482033000,1582336482157793,42386536,sell,9667.94,1.968 -binance-futures,BTCUSDT,1582336482033000,1582336482158214,42386537,sell,9667.94,0.032 -binance-futures,BTCUSDT,1582336483807000,1582336483928750,42386538,buy,9668.3,0.001 -binance-futures,BTCUSDT,1582336484917000,1582336485041652,42386539,sell,9667.97,0.031 -binance-futures,BTCUSDT,1582336487078000,1582336487198271,42386540,buy,9667.97,0.001 -binance-futures,BTCUSDT,1582336490307000,1582336490425823,42386541,buy,9667.97,0.05 -binance-futures,BTCUSDT,1582336490772000,1582336490893276,42386542,buy,9667.97,0.001 -binance-futures,BTCUSDT,1582336492430000,1582336492570844,42386543,sell,9667.73,0.5 -binance-futures,BTCUSDT,1582336493936000,1582336494056113,42386544,buy,9667.97,0.001 -binance-futures,BTCUSDT,1582336495480000,1582336495604693,42386545,buy,9667.49,0.031 -binance-futures,BTCUSDT,1582336495480000,1582336495607309,42386546,buy,9667.49,0.158 -binance-futures,BTCUSDT,1582336495808000,1582336495932630,42386547,buy,9667.48,0.031 -binance-futures,BTCUSDT,1582336495808000,1582336495935382,42386548,buy,9667.49,0.031 -binance-futures,BTCUSDT,1582336495808000,1582336495940472,42386549,buy,9667.5,0.031 -binance-futures,BTCUSDT,1582336495808000,1582336495943235,42386550,buy,9667.51,0.031 -binance-futures,BTCUSDT,1582336495808000,1582336495943249,42386551,buy,9667.96,0.107 -binance-futures,BTCUSDT,1582336497036000,1582336497158922,42386552,sell,9667.51,0.031 -binance-futures,BTCUSDT,1582336497036000,1582336497160693,42386553,sell,9667.5,0.031 -binance-futures,BTCUSDT,1582336497036000,1582336497168233,42386554,sell,9667.49,0.031 -binance-futures,BTCUSDT,1582336497036000,1582336497168246,42386555,sell,9667.48,0.031 -binance-futures,BTCUSDT,1582336497036000,1582336497168249,42386556,sell,9667.46,0.005 -binance-futures,BTCUSDT,1582336497036000,1582336497171251,42386557,sell,9667.22,0.026 -binance-futures,BTCUSDT,1582336497827000,1582336497947612,42386558,buy,9667.55,0.001 -binance-futures,BTCUSDT,1582336500186000,1582336500309420,42386559,buy,9667.55,0.052 -binance-futures,BTCUSDT,1582336500186000,1582336500310138,42386560,buy,9667.55,0.387 -binance-futures,BTCUSDT,1582336500254000,1582336500381140,42386561,buy,9667.64,0.001 -binance-futures,BTCUSDT,1582336501376000,1582336501500164,42386562,buy,9667.55,0.005 -binance-futures,BTCUSDT,1582336501402000,1582336501523983,42386563,buy,9667.55,0.001 -binance-futures,BTCUSDT,1582336502194000,1582336502337251,42386564,buy,9667.57,0.005 -binance-futures,BTCUSDT,1582336503752000,1582336503873373,42386565,buy,9667.55,0.051 -binance-futures,BTCUSDT,1582336504410000,1582336504533759,42386566,buy,9667.57,0.001 -binance-futures,BTCUSDT,1582336505265000,1582336505386084,42386567,buy,9667.57,0.001 -binance-futures,BTCUSDT,1582336508977000,1582336509096498,42386568,buy,9667.55,0.001 -binance-futures,BTCUSDT,1582336510791000,1582336510913699,42386569,sell,9667.52,0.66 -binance-futures,BTCUSDT,1582336510856000,1582336510982920,42386570,sell,9667.52,0.72 -binance-futures,BTCUSDT,1582336510858000,1582336510982929,42386571,sell,9667.52,0.74 -binance-futures,BTCUSDT,1582336510858000,1582336510982934,42386572,sell,9667.52,0.95 -binance-futures,BTCUSDT,1582336510861000,1582336510986194,42386573,sell,9667.52,0.67 -binance-futures,BTCUSDT,1582336511619000,1582336511741965,42386574,sell,9667.45,0.01 -binance-futures,BTCUSDT,1582336517069000,1582336517196226,42386575,buy,9667.46,0.005 -binance-futures,BTCUSDT,1582336518602000,1582336518725866,42386576,buy,9667.46,1.032 -binance-futures,BTCUSDT,1582336518893000,1582336519015491,42386577,sell,9667.45,5.637 -binance-futures,BTCUSDT,1582336521251000,1582336521378489,42386578,buy,9667.45,1.032 -binance-futures,BTCUSDT,1582336521630000,1582336521756189,42386579,buy,9667.45,0.063 -binance-futures,BTCUSDT,1582336521764000,1582336521889780,42386580,sell,9667.44,0.103 -binance-futures,BTCUSDT,1582336521764000,1582336521892770,42386581,sell,9667.01,0.003 -binance-futures,BTCUSDT,1582336521764000,1582336521892777,42386582,sell,9667,0.5 -binance-futures,BTCUSDT,1582336521764000,1582336521897040,42386583,sell,9667,0.15 -binance-futures,BTCUSDT,1582336521764000,1582336521900480,42386584,sell,9666.5,0.1 -binance-futures,BTCUSDT,1582336521764000,1582336521900496,42386585,sell,9666.39,3.354 -binance-futures,BTCUSDT,1582336521764000,1582336521904188,42386586,sell,9666.25,0.012 -binance-futures,BTCUSDT,1582336521764000,1582336521906584,42386587,sell,9666.08,0.047 -binance-futures,BTCUSDT,1582336521764000,1582336521906591,42386588,sell,9665.86,3.579 -binance-futures,BTCUSDT,1582336521764000,1582336521907702,42386589,sell,9665.86,0.655 -binance-futures,BTCUSDT,1582336521764000,1582336521907713,42386590,sell,9665.86,0.655 -binance-futures,BTCUSDT,1582336521764000,1582336521907716,42386591,sell,9665.85,0.039 -binance-futures,BTCUSDT,1582336521764000,1582336521908830,42386592,sell,9665.63,0.589 -binance-futures,BTCUSDT,1582336521764000,1582336522176346,42386593,sell,9665.48,0.947 -binance-futures,BTCUSDT,1582336521764000,1582336522176395,42386594,sell,9665.1,0.25 -binance-futures,BTCUSDT,1582336521764000,1582336522182271,42386595,sell,9665,0.039 -binance-futures,BTCUSDT,1582336521764000,1582336522182301,42386596,sell,9664.95,0.04 -binance-futures,BTCUSDT,1582336521764000,1582336522182310,42386597,sell,9664.66,0.012 -binance-futures,BTCUSDT,1582336521764000,1582336522182319,42386598,sell,9664.17,0.6 -binance-futures,BTCUSDT,1582336521764000,1582336522182331,42386599,sell,9664.09,2 -binance-futures,BTCUSDT,1582336521764000,1582336522182345,42386600,sell,9664.07,1.026 -binance-futures,BTCUSDT,1582336521764000,1582336522182357,42386601,sell,9664,2.417 -binance-futures,BTCUSDT,1582336521764000,1582336522182373,42386602,sell,9663.97,0.58 -binance-futures,BTCUSDT,1582336521764000,1582336522182388,42386603,sell,9663.74,1.028 -binance-futures,BTCUSDT,1582336521764000,1582336522182397,42386604,sell,9663.62,1.348 -binance-futures,BTCUSDT,1582336521764000,1582336522182409,42386605,sell,9663.55,0.08 -binance-futures,BTCUSDT,1582336521764000,1582336522182421,42386606,sell,9663.54,0.002 -binance-futures,BTCUSDT,1582336521764000,1582336522182436,42386607,sell,9663.5,0.402 -binance-futures,BTCUSDT,1582336521764000,1582336522182442,42386608,sell,9663.37,0.04 -binance-futures,BTCUSDT,1582336521764000,1582336522182458,42386609,sell,9663.26,0.15 -binance-futures,BTCUSDT,1582336521764000,1582336522182480,42386610,sell,9663.14,0.08 -binance-futures,BTCUSDT,1582336521764000,1582336522182489,42386611,sell,9663.14,0.08 -binance-futures,BTCUSDT,1582336521764000,1582336522182503,42386612,sell,9663.05,0.16 -binance-futures,BTCUSDT,1582336521764000,1582336522182516,42386613,sell,9663.01,1.348 -binance-futures,BTCUSDT,1582336521764000,1582336522182521,42386614,sell,9663.01,0.5 -binance-futures,BTCUSDT,1582336521764000,1582336522182534,42386615,sell,9663,0.001 -binance-futures,BTCUSDT,1582336521764000,1582336522182540,42386616,sell,9663,0.001 -binance-futures,BTCUSDT,1582336521764000,1582336522182545,42386617,sell,9663,0.69 -binance-futures,BTCUSDT,1582336521764000,1582336522182549,42386618,sell,9663,0.1 -binance-futures,BTCUSDT,1582336521764000,1582336522182554,42386619,sell,9663,0.4 -binance-futures,BTCUSDT,1582336521764000,1582336522182609,42386620,sell,9662.84,0.038 -binance-futures,BTCUSDT,1582336521764000,1582336522182619,42386621,sell,9662.76,0.1 -binance-futures,BTCUSDT,1582336521764000,1582336522182622,42386622,sell,9662.69,0.5 -binance-futures,BTCUSDT,1582336521764000,1582336522182631,42386623,sell,9662.62,1 -binance-futures,BTCUSDT,1582336521764000,1582336522182644,42386624,sell,9662.58,1.348 -binance-futures,BTCUSDT,1582336521764000,1582336522182648,42386625,sell,9662.42,0.5 -binance-futures,BTCUSDT,1582336521764000,1582336522182672,42386626,sell,9662.41,2.185 -binance-futures,BTCUSDT,1582336521764000,1582336522182684,42386627,sell,9662.32,0.003 -binance-futures,BTCUSDT,1582336521764000,1582336522182689,42386628,sell,9662.32,0.011 -binance-futures,BTCUSDT,1582336521764000,1582336522182695,42386629,sell,9662.32,0.01 -binance-futures,BTCUSDT,1582336521764000,1582336522182700,42386630,sell,9662.32,0.004 -binance-futures,BTCUSDT,1582336521764000,1582336522182705,42386631,sell,9662.22,0.009 -binance-futures,BTCUSDT,1582336521764000,1582336522182716,42386632,sell,9662.22,0.004 -binance-futures,BTCUSDT,1582336521764000,1582336522182722,42386633,sell,9662.22,0.007 -binance-futures,BTCUSDT,1582336521764000,1582336522182727,42386634,sell,9662.22,0.071 -binance-futures,BTCUSDT,1582336521764000,1582336522182733,42386635,sell,9662.22,0.004 -binance-futures,BTCUSDT,1582336521764000,1582336522182737,42386636,sell,9662.22,0.001 -binance-futures,BTCUSDT,1582336521764000,1582336522182741,42386637,sell,9662.22,0.006 -binance-futures,BTCUSDT,1582336521764000,1582336522182746,42386638,sell,9662.22,0.003 -binance-futures,BTCUSDT,1582336521764000,1582336522182751,42386639,sell,9662.22,0.017 -binance-futures,BTCUSDT,1582336521764000,1582336522182756,42386640,sell,9662.2,0.072 -binance-futures,BTCUSDT,1582336521851000,1582336522183551,42386641,sell,9667.01,0.001 -binance-futures,BTCUSDT,1582336522737000,1582336522859970,42386642,buy,9664.87,0.031 -binance-futures,BTCUSDT,1582336522737000,1582336522859977,42386643,buy,9664.87,4.935 -binance-futures,BTCUSDT,1582336523579000,1582336523703807,42386644,buy,9664.72,0.84 -binance-futures,BTCUSDT,1582336523697000,1582336523822060,42386645,sell,9664.71,0.021 -binance-futures,BTCUSDT,1582336524073000,1582336524196368,42386646,sell,9664.73,0.03 -binance-futures,BTCUSDT,1582336524776000,1582336524900013,42386647,sell,9664.73,0.001 -binance-futures,BTCUSDT,1582336524776000,1582336524900018,42386648,sell,9664.73,0.015 -binance-futures,BTCUSDT,1582336524796000,1582336524918380,42386649,sell,9664.73,0.03 -binance-futures,BTCUSDT,1582336524932000,1582336525054127,42386650,sell,9664.73,0.4 -binance-futures,BTCUSDT,1582336526206000,1582336526328658,42386651,buy,9664.74,0.052 -binance-futures,BTCUSDT,1582336526206000,1582336526328665,42386652,buy,9665.63,0.078 -binance-futures,BTCUSDT,1582336526206000,1582336526329397,42386653,buy,9666.04,0.902 -binance-futures,BTCUSDT,1582336526289000,1582336526412145,42386654,buy,9665.98,0.031 -binance-futures,BTCUSDT,1582336526289000,1582336526417527,42386655,buy,9665.99,0.031 -binance-futures,BTCUSDT,1582336526289000,1582336526418034,42386656,buy,9666,0.031 -binance-futures,BTCUSDT,1582336526289000,1582336526420786,42386657,buy,9666.04,0.045 -binance-futures,BTCUSDT,1582336527731000,1582336527857695,42386658,buy,9665.46,0.031 -binance-futures,BTCUSDT,1582336527731000,1582336527858530,42386659,buy,9665.47,0.031 -binance-futures,BTCUSDT,1582336527731000,1582336527858539,42386660,buy,9665.48,0.031 -binance-futures,BTCUSDT,1582336527731000,1582336527863405,42386661,buy,9665.5,0.038 -binance-futures,BTCUSDT,1582336527731000,1582336527866727,42386662,buy,9665.55,0.026 -binance-futures,BTCUSDT,1582336527731000,1582336527868401,42386663,buy,9665.55,0.007 -binance-futures,BTCUSDT,1582336527731000,1582336527868420,42386664,buy,9665.65,0.215 -binance-futures,BTCUSDT,1582336528252000,1582336528383977,42386665,buy,9665.47,0.413 -binance-futures,BTCUSDT,1582336528257000,1582336528386391,42386666,buy,9665.47,0.62 -binance-futures,BTCUSDT,1582336530389000,1582336530514366,42386667,buy,9665.25,0.031 -binance-futures,BTCUSDT,1582336530389000,1582336530514370,42386668,buy,9665.25,0.589 -binance-futures,BTCUSDT,1582336530402000,1582336530525473,42386669,buy,9665.21,0.413 -binance-futures,BTCUSDT,1582336531534000,1582336531658172,42386670,buy,9665.14,0.005 -binance-futures,BTCUSDT,1582336532008000,1582336532138348,42386671,sell,9664.41,0.1 -binance-futures,BTCUSDT,1582336532347000,1582336532472264,42386672,sell,9663.02,0.031 -binance-futures,BTCUSDT,1582336532347000,1582336532477934,42386673,sell,9663.01,0.031 -binance-futures,BTCUSDT,1582336532347000,1582336532477947,42386674,sell,9663,0.031 -binance-futures,BTCUSDT,1582336532347000,1582336532481259,42386675,sell,9662.97,0.006 -binance-futures,BTCUSDT,1582336532367000,1582336532491282,42386676,sell,9662.97,0.025 -binance-futures,BTCUSDT,1582336532367000,1582336532491286,42386677,sell,9662.96,0.031 -binance-futures,BTCUSDT,1582336532367000,1582336532494509,42386678,sell,9662.95,0.031 -binance-futures,BTCUSDT,1582336532369000,1582336532498882,42386679,sell,9662.94,0.031 -binance-futures,BTCUSDT,1582336532369000,1582336532502927,42386680,sell,9662.92,0.045 -binance-futures,BTCUSDT,1582336532369000,1582336532502934,42386681,sell,9662.92,0.006 -binance-futures,BTCUSDT,1582336532369000,1582336532502937,42386682,sell,9662.92,0.023 -binance-futures,BTCUSDT,1582336532403000,1582336532529691,42386683,sell,9663.06,0.031 -binance-futures,BTCUSDT,1582336532403000,1582336532533417,42386684,sell,9663.05,0.031 -binance-futures,BTCUSDT,1582336532403000,1582336532534516,42386685,sell,9663.04,0.012 -binance-futures,BTCUSDT,1582336532526000,1582336532651314,42386686,sell,9662.66,0.006 -binance-futures,BTCUSDT,1582336532526000,1582336532651451,42386687,sell,9662.66,0.003 -binance-futures,BTCUSDT,1582336532812000,1582336532939860,42386688,buy,9663.92,0.207 -binance-futures,BTCUSDT,1582336532817000,1582336532941041,42386689,buy,9663.92,0.207 -binance-futures,BTCUSDT,1582336532820000,1582336532945349,42386690,buy,9663.92,0.207 -binance-futures,BTCUSDT,1582336532837000,1582336532961855,42386691,buy,9663.88,0.207 -binance-futures,BTCUSDT,1582336533790000,1582336533910871,42386692,sell,9662.29,0.001 -binance-futures,BTCUSDT,1582336533790000,1582336533913836,42386693,sell,9662.28,0.399 -binance-futures,BTCUSDT,1582336535197000,1582336535319742,42386694,sell,9663.51,0.1 -binance-futures,BTCUSDT,1582336535230000,1582336535355346,42386695,sell,9663.55,0.031 -binance-futures,BTCUSDT,1582336535230000,1582336535358668,42386696,sell,9663.54,0.031 -binance-futures,BTCUSDT,1582336535230000,1582336535358692,42386697,sell,9663.53,0.031 -binance-futures,BTCUSDT,1582336539825000,1582336539951256,42386698,buy,9663.28,0.905 -binance-futures,BTCUSDT,1582336540435000,1582336540560662,42386699,sell,9662.14,1 -binance-futures,BTCUSDT,1582336540435000,1582336540562792,42386700,sell,9662.13,0.008 -binance-futures,BTCUSDT,1582336540435000,1582336540567238,42386701,sell,9662.13,0.005 -binance-futures,BTCUSDT,1582336540435000,1582336540568238,42386702,sell,9662.1,0.005 -binance-futures,BTCUSDT,1582336540435000,1582336540570448,42386703,sell,9662.08,0.37 -binance-futures,BTCUSDT,1582336540435000,1582336540572408,42386704,sell,9662.03,4.264 -binance-futures,BTCUSDT,1582336540435000,1582336540574635,42386705,sell,9662,0.103 -binance-futures,BTCUSDT,1582336540435000,1582336540575967,42386706,sell,9662,1 -binance-futures,BTCUSDT,1582336540435000,1582336540575975,42386707,sell,9662,3.245 -binance-futures,BTCUSDT,1582336540811000,1582336540934271,42386708,sell,9662.01,0.002 -binance-futures,BTCUSDT,1582336540811000,1582336540936236,42386709,sell,9662,0.23 -binance-futures,BTCUSDT,1582336541207000,1582336541331791,42386710,sell,9662,0.334 -binance-futures,BTCUSDT,1582336543608000,1582336543733517,42386711,buy,9661.73,0.031 -binance-futures,BTCUSDT,1582336543608000,1582336543733527,42386712,buy,9661.74,0.031 -binance-futures,BTCUSDT,1582336543608000,1582336543736496,42386713,buy,9661.75,0.031 -binance-futures,BTCUSDT,1582336543608000,1582336543736506,42386714,buy,9661.76,0.026 -binance-futures,BTCUSDT,1582336543763000,1582336543886658,42386715,buy,9661.67,0.031 -binance-futures,BTCUSDT,1582336543763000,1582336543887179,42386716,buy,9661.68,0.031 -binance-futures,BTCUSDT,1582336543763000,1582336543892329,42386717,buy,9661.69,0.031 -binance-futures,BTCUSDT,1582336543763000,1582336543892332,42386718,buy,9661.71,0.007 -binance-futures,BTCUSDT,1582336545808000,1582336545930104,42386719,sell,9661.66,0.003 -binance-futures,BTCUSDT,1582336545891000,1582336546013033,42386720,buy,9661.67,0.005 -binance-futures,BTCUSDT,1582336547036000,1582336547160102,42386721,sell,9661.66,0.017 -binance-futures,BTCUSDT,1582336547036000,1582336547162701,42386722,sell,9661.6,0.014 -binance-futures,BTCUSDT,1582336547036000,1582336547169875,42386723,sell,9661.59,0.1 -binance-futures,BTCUSDT,1582336547036000,1582336547173118,42386724,sell,9661.55,0.04 -binance-futures,BTCUSDT,1582336547036000,1582336547175267,42386725,sell,9661.5,0.001 -binance-futures,BTCUSDT,1582336547036000,1582336547177122,42386726,sell,9661.33,0.8 -binance-futures,BTCUSDT,1582336547036000,1582336547179304,42386727,sell,9661.2,0.047 -binance-futures,BTCUSDT,1582336547036000,1582336547180949,42386728,sell,9661.16,0.04 -binance-futures,BTCUSDT,1582336547036000,1582336547180956,42386729,sell,9661.11,5 -binance-futures,BTCUSDT,1582336547036000,1582336547180964,42386730,sell,9661.03,0.04 -binance-futures,BTCUSDT,1582336547036000,1582336547181501,42386731,sell,9661.03,1.076 -binance-futures,BTCUSDT,1582336547744000,1582336547866836,42386732,sell,9661.48,0.01 -binance-futures,BTCUSDT,1582336548435000,1582336548558360,42386733,sell,9661.48,0.018 -binance-futures,BTCUSDT,1582336549400000,1582336549524608,42386734,sell,9661.48,0.148 -binance-futures,BTCUSDT,1582336550211000,1582336550344593,42386735,sell,9661.48,0.01 -binance-futures,BTCUSDT,1582336550373000,1582336550495035,42386736,buy,9661.49,0.001 -binance-futures,BTCUSDT,1582336551833000,1582336551954832,42386737,sell,9661.48,1.842 -binance-futures,BTCUSDT,1582336551833000,1582336551957006,42386738,sell,9661.48,0.1 -binance-futures,BTCUSDT,1582336551884000,1582336552006197,42386739,buy,9661.43,0.031 -binance-futures,BTCUSDT,1582336551884000,1582336552009243,42386740,buy,9661.44,0.011 -binance-futures,BTCUSDT,1582336552865000,1582336552986122,42386741,buy,9661.13,0.031 -binance-futures,BTCUSDT,1582336552865000,1582336552988299,42386742,buy,9661.14,0.011 -binance-futures,BTCUSDT,1582336553203000,1582336553326256,42386743,sell,9661,0.003 -binance-futures,BTCUSDT,1582336553785000,1582336553909963,42386744,sell,9661,0.005 -binance-futures,BTCUSDT,1582336553785000,1582336553909967,42386745,sell,9661,0.001 -binance-futures,BTCUSDT,1582336553785000,1582336553909972,42386746,sell,9660.85,0.013 -binance-futures,BTCUSDT,1582336553785000,1582336553913657,42386747,sell,9660.83,0.981 -binance-futures,BTCUSDT,1582336554593000,1582336554718129,42386748,buy,9661.47,1 -binance-futures,BTCUSDT,1582336555381000,1582336555507933,42386749,sell,9661.45,0.018 -binance-futures,BTCUSDT,1582336563031000,1582336563153310,42386750,sell,9662.14,0.031 -binance-futures,BTCUSDT,1582336563031000,1582336563153400,42386751,sell,9662.13,0.031 -binance-futures,BTCUSDT,1582336563031000,1582336563158638,42386752,sell,9662.13,0.031 -binance-futures,BTCUSDT,1582336563031000,1582336563158659,42386753,sell,9662.12,0.031 -binance-futures,BTCUSDT,1582336563031000,1582336563165829,42386754,sell,9662.11,0.031 -binance-futures,BTCUSDT,1582336563271000,1582336563390146,42386755,buy,9662.09,0.005 -binance-futures,BTCUSDT,1582336563483000,1582336563604354,42386756,buy,9662.09,0.105 -binance-futures,BTCUSDT,1582336563683000,1582336563803181,42386757,buy,9662.09,0.005 -binance-futures,BTCUSDT,1582336565401000,1582336565521018,42386758,buy,9662.04,0.031 -binance-futures,BTCUSDT,1582336565401000,1582336565528654,42386759,buy,9662.04,2.023 -binance-futures,BTCUSDT,1582336565638000,1582336565756714,42386760,buy,9662.04,0.156 -binance-futures,BTCUSDT,1582336565638000,1582336565756723,42386761,buy,9662.04,0.008 -binance-futures,BTCUSDT,1582336565812000,1582336565933800,42386762,sell,9662.03,0.002 -binance-futures,BTCUSDT,1582336567115000,1582336567238349,42386763,buy,9662.04,0.001 -binance-futures,BTCUSDT,1582336567192000,1582336567314937,42386764,sell,9662.03,1 -binance-futures,BTCUSDT,1582336567192000,1582336567318069,42386765,sell,9662.02,0.086 -binance-futures,BTCUSDT,1582336568654000,1582336568776067,42386766,buy,9662.04,0.76 -binance-futures,BTCUSDT,1582336568669000,1582336568788833,42386767,buy,9662.04,0.72 -binance-futures,BTCUSDT,1582336568670000,1582336568793784,42386768,buy,9662.04,0.67 -binance-futures,BTCUSDT,1582336568672000,1582336568794100,42386769,buy,9662.04,0.67 -binance-futures,BTCUSDT,1582336568680000,1582336568801971,42386770,buy,9662.04,0.68 -binance-futures,BTCUSDT,1582336568719000,1582336568842053,42386771,buy,9662.04,0.71 -binance-futures,BTCUSDT,1582336568719000,1582336568842744,42386772,buy,9662.04,0.182 -binance-futures,BTCUSDT,1582336568719000,1582336568842757,42386773,buy,9662.04,0.488 -binance-futures,BTCUSDT,1582336568729000,1582336568851546,42386774,buy,9662.04,0.195 -binance-futures,BTCUSDT,1582336568729000,1582336568852087,42386775,buy,9662.09,0.485 -binance-futures,BTCUSDT,1582336568741000,1582336568865414,42386776,buy,9662.09,0.245 -binance-futures,BTCUSDT,1582336568799000,1582336568924174,42386777,buy,9663.2,0.01 -binance-futures,BTCUSDT,1582336568801000,1582336568926109,42386778,buy,9663.2,0.72 -binance-futures,BTCUSDT,1582336568832000,1582336568956428,42386779,buy,9663.2,0.44 -binance-futures,BTCUSDT,1582336569168000,1582336569288391,42386780,buy,9663.19,0.006 -binance-futures,BTCUSDT,1582336569168000,1582336569288681,42386781,buy,9663.19,0.021 -binance-futures,BTCUSDT,1582336569168000,1582336569288977,42386782,buy,9663.19,0.046 -binance-futures,BTCUSDT,1582336569168000,1582336569288991,42386783,buy,9663.2,0.267 -binance-futures,BTCUSDT,1582336569209000,1582336569330501,42386784,buy,9663.2,0.01 -binance-futures,BTCUSDT,1582336569715000,1582336569837304,42386785,buy,9663.2,2.229 -binance-futures,BTCUSDT,1582336569899000,1582336570020789,42386786,buy,9663.2,1.404 -binance-futures,BTCUSDT,1582336570804000,1582336570925045,42386787,buy,9663.2,0.788 -binance-futures,BTCUSDT,1582336570804000,1582336570926964,42386788,buy,9663.64,0.586 -binance-futures,BTCUSDT,1582336571114000,1582336571237040,42386789,buy,9663.64,0.1 -binance-futures,BTCUSDT,1582336571592000,1582336571712748,42386790,sell,9663.63,0.072 -binance-futures,BTCUSDT,1582336571592000,1582336571712817,42386791,sell,9663.63,0.226 -binance-futures,BTCUSDT,1582336571592000,1582336571713259,42386792,sell,9663.61,0.452 -binance-futures,BTCUSDT,1582336571966000,1582336572086433,42386793,buy,9663.63,0.001 -binance-futures,BTCUSDT,1582336572740000,1582336572860617,42386794,buy,9663.63,0.002 -binance-futures,BTCUSDT,1582336574866000,1582336574988089,42386795,buy,9663.64,0.001 -binance-futures,BTCUSDT,1582336575733000,1582336575854194,42386796,sell,9663.63,0.009 -binance-futures,BTCUSDT,1582336576846000,1582336576967835,42386797,buy,9662.27,0.491 -binance-futures,BTCUSDT,1582336577651000,1582336577773801,42386798,buy,9662.03,0.001 -binance-futures,BTCUSDT,1582336578643000,1582336578768156,42386799,buy,9662.13,0.005 -binance-futures,BTCUSDT,1582336578667000,1582336578793670,42386800,sell,9662.02,0.232 -binance-futures,BTCUSDT,1582336580565000,1582336580701303,42386801,sell,9662.02,0.005 -binance-futures,BTCUSDT,1582336580872000,1582336580992177,42386802,buy,9662.05,0.001 -binance-futures,BTCUSDT,1582336581708000,1582336581831773,42386803,sell,9662.02,0.1 -binance-futures,BTCUSDT,1582336583516000,1582336583637528,42386804,buy,9662.03,0.001 -binance-futures,BTCUSDT,1582336585095000,1582336585218998,42386805,buy,9662.03,0.005 -binance-futures,BTCUSDT,1582336589539000,1582336589663185,42386806,buy,9662.03,0.01 -binance-futures,BTCUSDT,1582336593438000,1582336593558289,42386807,buy,9662.03,2 -binance-futures,BTCUSDT,1582336593455000,1582336593576449,42386808,buy,9662.03,2 -binance-futures,BTCUSDT,1582336593457000,1582336593576554,42386809,buy,9662.03,1.561 -binance-futures,BTCUSDT,1582336593457000,1582336593576962,42386810,buy,9662.04,0.078 -binance-futures,BTCUSDT,1582336593457000,1582336593581070,42386811,buy,9662.05,0.11 -binance-futures,BTCUSDT,1582336593479000,1582336593616637,42386812,buy,9662.25,0.685 -binance-futures,BTCUSDT,1582336593515000,1582336593641503,42386813,buy,9662.47,2 -binance-futures,BTCUSDT,1582336593517000,1582336593645018,42386814,buy,9662.47,2.484 -binance-futures,BTCUSDT,1582336593587000,1582336593713110,42386815,buy,9663.51,2.014 -binance-futures,BTCUSDT,1582336593587000,1582336593717234,42386816,buy,9663.63,0.291 -binance-futures,BTCUSDT,1582336593587000,1582336593718554,42386817,buy,9663.63,0.002 -binance-futures,BTCUSDT,1582336593587000,1582336593718629,42386818,buy,9663.63,0.642 -binance-futures,BTCUSDT,1582336593587000,1582336593718636,42386819,buy,9663.63,0.642 -binance-futures,BTCUSDT,1582336593587000,1582336593719648,42386820,buy,9663.64,2.191 -binance-futures,BTCUSDT,1582336593619000,1582336593747960,42386821,buy,9664.05,0.1 -binance-futures,BTCUSDT,1582336593619000,1582336593747965,42386822,buy,9664.05,1.9 -binance-futures,BTCUSDT,1582336593646000,1582336593770620,42386823,buy,9664.05,2 -binance-futures,BTCUSDT,1582336593694000,1582336593817506,42386824,buy,9664.05,0.144 -binance-futures,BTCUSDT,1582336595074000,1582336595195973,42386825,sell,9664.87,0.041 -binance-futures,BTCUSDT,1582336595139000,1582336595261137,42386826,buy,9664.88,0.1 -binance-futures,BTCUSDT,1582336595139000,1582336595264978,42386827,buy,9664.88,0.003 -binance-futures,BTCUSDT,1582336600347000,1582336600474122,42386828,buy,9664.49,0.002 -binance-futures,BTCUSDT,1582336600347000,1582336600474126,42386829,buy,9664.49,0.003 -binance-futures,BTCUSDT,1582336600347000,1582336600478978,42386830,buy,9664.5,0.052 -binance-futures,BTCUSDT,1582336600662000,1582336600789827,42386831,buy,9664.54,0.001 -binance-futures,BTCUSDT,1582336600662000,1582336600789833,42386832,buy,9664.55,0.004 -binance-futures,BTCUSDT,1582336602728000,1582336602853899,42386833,sell,9663.38,0.1 -binance-futures,BTCUSDT,1582336603767000,1582336603889077,42386834,buy,9664.05,4.564 -binance-futures,BTCUSDT,1582336603767000,1582336603891521,42386835,buy,9664.4,0.916 -binance-futures,BTCUSDT,1582336603767000,1582336603900915,42386836,buy,9664.79,2 -binance-futures,BTCUSDT,1582336603767000,1582336603904740,42386837,buy,9665.55,0.628 -binance-futures,BTCUSDT,1582336603767000,1582336603904750,42386838,buy,9665.55,0.628 -binance-futures,BTCUSDT,1582336603767000,1582336603904755,42386839,buy,9665.55,0.628 -binance-futures,BTCUSDT,1582336603767000,1582336603904761,42386840,buy,9665.55,0.31 -binance-futures,BTCUSDT,1582336605366000,1582336605489304,42386841,buy,9664.37,0.018 -binance-futures,BTCUSDT,1582336615128000,1582336615253224,42386842,buy,9663.51,0.096 -binance-futures,BTCUSDT,1582336615128000,1582336615253447,42386843,buy,9664.07,0.031 -binance-futures,BTCUSDT,1582336615128000,1582336615258144,42386844,buy,9664.07,1.873 -binance-futures,BTCUSDT,1582336619361000,1582336619486504,42386845,buy,9663.52,0.031 -binance-futures,BTCUSDT,1582336619361000,1582336619486510,42386846,buy,9663.53,0.031 -binance-futures,BTCUSDT,1582336619361000,1582336619488657,42386847,buy,9663.54,0.031 -binance-futures,BTCUSDT,1582336620663000,1582336620785962,42386848,buy,9663.92,0.2 -binance-futures,BTCUSDT,1582336621263000,1582336621389693,42386849,buy,9663.86,0.005 -binance-futures,BTCUSDT,1582336621454000,1582336621577473,42386850,buy,9663.78,0.031 -binance-futures,BTCUSDT,1582336621454000,1582336621577481,42386851,buy,9663.79,0.031 -binance-futures,BTCUSDT,1582336621454000,1582336621581408,42386852,buy,9663.8,0.031 -binance-futures,BTCUSDT,1582336621454000,1582336621583298,42386853,buy,9663.81,0.007 -binance-futures,BTCUSDT,1582336621514000,1582336621639226,42386854,buy,9663.85,0.091 -binance-futures,BTCUSDT,1582336621514000,1582336621645288,42386855,buy,9663.92,0.009 -binance-futures,BTCUSDT,1582336621881000,1582336622006999,42386856,buy,9663.92,0.1 -binance-futures,BTCUSDT,1582336622305000,1582336622430483,42386857,buy,9663.87,0.74 -binance-futures,BTCUSDT,1582336622305000,1582336622430487,42386858,buy,9663.87,0.68 -binance-futures,BTCUSDT,1582336622305000,1582336622430490,42386859,buy,9663.87,0.67 -binance-futures,BTCUSDT,1582336622305000,1582336622430493,42386860,buy,9663.87,0.67 -binance-futures,BTCUSDT,1582336622305000,1582336622430505,42386861,buy,9663.92,0.24 -binance-futures,BTCUSDT,1582336623053000,1582336623176398,42386862,buy,9663.77,0.1 -binance-futures,BTCUSDT,1582336623930000,1582336624053707,42386863,buy,9663.87,0.1 -binance-futures,BTCUSDT,1582336624770000,1582336624893404,42386864,sell,9662.88,0.031 -binance-futures,BTCUSDT,1582336624770000,1582336624895344,42386865,sell,9662.87,0.031 -binance-futures,BTCUSDT,1582336624779000,1582336624906948,42386866,sell,9662.86,0.031 -binance-futures,BTCUSDT,1582336624783000,1582336624912680,42386867,sell,9662.85,0.031 -binance-futures,BTCUSDT,1582336624783000,1582336624915453,42386868,sell,9662.83,0.02 -binance-futures,BTCUSDT,1582336624783000,1582336624919101,42386869,sell,9662.82,0.031 -binance-futures,BTCUSDT,1582336624788000,1582336624919138,42386870,sell,9662.81,0.031 -binance-futures,BTCUSDT,1582336624796000,1582336624923364,42386871,sell,9662.8,0.031 -binance-futures,BTCUSDT,1582336624816000,1582336624939401,42386872,sell,9662.88,0.031 -binance-futures,BTCUSDT,1582336624816000,1582336624939412,42386873,sell,9662.87,0.031 -binance-futures,BTCUSDT,1582336624855000,1582336624983266,42386874,sell,9662.27,0.74 -binance-futures,BTCUSDT,1582336624864000,1582336624987068,42386875,sell,9662.27,0.68 -binance-futures,BTCUSDT,1582336624871000,1582336624993729,42386876,sell,9662.27,0.67 -binance-futures,BTCUSDT,1582336624901000,1582336625024699,42386877,sell,9662.27,0.01 -binance-futures,BTCUSDT,1582336624901000,1582336625024716,42386878,sell,9662.27,0.373 -binance-futures,BTCUSDT,1582336624902000,1582336625025015,42386879,sell,9662.27,0.01 -binance-futures,BTCUSDT,1582336624908000,1582336625032891,42386880,sell,9662.27,0.01 -binance-futures,BTCUSDT,1582336624918000,1582336625040339,42386881,sell,9662.27,0.426 -binance-futures,BTCUSDT,1582336624933000,1582336625057396,42386882,sell,9662.27,0.039 -binance-futures,BTCUSDT,1582336624967000,1582336625090408,42386883,sell,9662.02,0.108 -binance-futures,BTCUSDT,1582336624967000,1582336625090417,42386884,sell,9662.02,0.15 -binance-futures,BTCUSDT,1582336624967000,1582336625092339,42386885,sell,9661.93,1.082 -binance-futures,BTCUSDT,1582336625038000,1582336625167175,42386886,sell,9661.93,0.01 -binance-futures,BTCUSDT,1582336625650000,1582336625774944,42386887,buy,9662.98,0.001 -binance-futures,BTCUSDT,1582336626752000,1582336626872889,42386888,buy,9662.87,0.005 -binance-futures,BTCUSDT,1582336628933000,1582336629062066,42386889,sell,9661.44,0.014 -binance-futures,BTCUSDT,1582336628933000,1582336629062072,42386890,sell,9661.43,1 -binance-futures,BTCUSDT,1582336628963000,1582336629091917,42386891,sell,9661.27,0.002 -binance-futures,BTCUSDT,1582336628997000,1582336629124776,42386892,sell,9660.88,0.039 -binance-futures,BTCUSDT,1582336629038000,1582336629168031,42386893,sell,9660.74,0.005 -binance-futures,BTCUSDT,1582336629038000,1582336629168041,42386894,sell,9660.74,0.017 -binance-futures,BTCUSDT,1582336629038000,1582336629168052,42386895,sell,9660.73,0.648 -binance-futures,BTCUSDT,1582336629082000,1582336629206054,42386896,sell,9660.73,0.01 -binance-futures,BTCUSDT,1582336629345000,1582336629467023,42386897,buy,9660.74,0.256 -binance-futures,BTCUSDT,1582336629399000,1582336629523114,42386898,buy,9660.74,0.05 -binance-futures,BTCUSDT,1582336631443000,1582336631565395,42386899,sell,9660.73,0.033 -binance-futures,BTCUSDT,1582336633530000,1582336633655717,42386900,buy,9661.21,0.065 -binance-futures,BTCUSDT,1582336636472000,1582336636596183,42386901,buy,9661.9,0.005 -binance-futures,BTCUSDT,1582336637661000,1582336637787823,42386902,sell,9661.58,0.111 -binance-futures,BTCUSDT,1582336638406000,1582336638544841,42386903,sell,9661.56,0.031 -binance-futures,BTCUSDT,1582336638406000,1582336638544856,42386904,sell,9661.55,0.031 -binance-futures,BTCUSDT,1582336638406000,1582336638544874,42386905,sell,9661.54,0.031 -binance-futures,BTCUSDT,1582336638406000,1582336638544880,42386906,sell,9661.54,0.022 -binance-futures,BTCUSDT,1582336643596000,1582336643719929,42386907,buy,9662.1,0.005 -binance-futures,BTCUSDT,1582336643676000,1582336643797692,42386908,sell,9661.17,0.012 -binance-futures,BTCUSDT,1582336646014000,1582336646136072,42386909,sell,9661.1,0.001 -binance-futures,BTCUSDT,1582336646014000,1582336646136799,42386910,sell,9661.1,0.1 -binance-futures,BTCUSDT,1582336647921000,1582336648047942,42386911,buy,9662.45,0.035 -binance-futures,BTCUSDT,1582336647921000,1582336648049530,42386912,buy,9662.45,0.004 -binance-futures,BTCUSDT,1582336647921000,1582336648049538,42386913,buy,9662.46,2.051 -binance-futures,BTCUSDT,1582336647921000,1582336648056081,42386914,buy,9662.61,0.863 -binance-futures,BTCUSDT,1582336647921000,1582336648057555,42386915,buy,9662.65,0.1 -binance-futures,BTCUSDT,1582336647921000,1582336648062361,42386916,buy,9662.76,0.684 -binance-futures,BTCUSDT,1582336647921000,1582336648064264,42386917,buy,9663.27,0.1 -binance-futures,BTCUSDT,1582336647921000,1582336648064274,42386918,buy,9663.27,0.16 -binance-futures,BTCUSDT,1582336647921000,1582336648064280,42386919,buy,9663.27,0.2 -binance-futures,BTCUSDT,1582336647921000,1582336648064286,42386920,buy,9663.41,0.683 -binance-futures,BTCUSDT,1582336647921000,1582336648067328,42386921,buy,9663.67,0.903 -binance-futures,BTCUSDT,1582336652052000,1582336652176885,42386922,buy,9661.56,0.001 -binance-futures,BTCUSDT,1582336653665000,1582336653788489,42386923,sell,9660.77,0.023 -binance-futures,BTCUSDT,1582336653665000,1582336653788517,42386924,sell,9660.76,0.056 -binance-futures,BTCUSDT,1582336653665000,1582336653793821,42386925,sell,9660.52,0.04 -binance-futures,BTCUSDT,1582336653665000,1582336653797182,42386926,sell,9660.44,0.012 -binance-futures,BTCUSDT,1582336653665000,1582336653799328,42386927,sell,9660.27,0.047 -binance-futures,BTCUSDT,1582336653665000,1582336653799339,42386928,sell,9660.27,0.003 -binance-futures,BTCUSDT,1582336653665000,1582336653799344,42386929,sell,9660.27,0.004 -binance-futures,BTCUSDT,1582336653665000,1582336653805472,42386930,sell,9660.25,0.2 -binance-futures,BTCUSDT,1582336653665000,1582336653809069,42386931,sell,9660.12,2.683 -binance-futures,BTCUSDT,1582336653851000,1582336653975838,42386932,buy,9661.64,0.091 -binance-futures,BTCUSDT,1582336654550000,1582336654675538,42386933,buy,9661.35,0.012 -binance-futures,BTCUSDT,1582336654550000,1582336654675768,42386934,buy,9661.36,0.031 -binance-futures,BTCUSDT,1582336654550000,1582336654678804,42386935,buy,9661.37,0.031 -binance-futures,BTCUSDT,1582336654550000,1582336654680754,42386936,buy,9661.38,0.031 -binance-futures,BTCUSDT,1582336654550000,1582336654683924,42386937,buy,9661.39,0.031 -binance-futures,BTCUSDT,1582336654550000,1582336654684953,42386938,buy,9661.42,0.018 -binance-futures,BTCUSDT,1582336655766000,1582336655890435,42386939,buy,9661.72,0.001 -binance-futures,BTCUSDT,1582336656050000,1582336656170315,42386940,sell,9660.74,0.026 -binance-futures,BTCUSDT,1582336656050000,1582336656172376,42386941,sell,9660.74,0.001 -binance-futures,BTCUSDT,1582336658578000,1582336658697951,42386942,buy,9660.73,0.2 -binance-futures,BTCUSDT,1582336658677000,1582336658803915,42386943,sell,9660.72,0.005 -binance-futures,BTCUSDT,1582336658833000,1582336658954731,42386944,buy,9660.73,0.005 -binance-futures,BTCUSDT,1582336659763000,1582336659884099,42386945,sell,9660.72,0.1 -binance-futures,BTCUSDT,1582336659763000,1582336659884396,42386946,sell,9660.7,1.752 -binance-futures,BTCUSDT,1582336659922000,1582336660045248,42386947,buy,9660.71,0.031 -binance-futures,BTCUSDT,1582336659922000,1582336660045681,42386948,buy,9660.71,0.019 -binance-futures,BTCUSDT,1582336662633000,1582336662754075,42386949,buy,9660.11,0.008 -binance-futures,BTCUSDT,1582336663684000,1582336663805034,42386950,sell,9660.08,1 -binance-futures,BTCUSDT,1582336665003000,1582336665134589,42386951,sell,9660.01,0.004 -binance-futures,BTCUSDT,1582336665003000,1582336665134596,42386952,sell,9660,0.1 -binance-futures,BTCUSDT,1582336665003000,1582336665134600,42386953,sell,9660,0.001 -binance-futures,BTCUSDT,1582336665003000,1582336665138702,42386954,sell,9660,0.125 -binance-futures,BTCUSDT,1582336665003000,1582336665138709,42386955,sell,9660,0.01 -binance-futures,BTCUSDT,1582336665003000,1582336665138712,42386956,sell,9660,0.02 -binance-futures,BTCUSDT,1582336665003000,1582336665138715,42386957,sell,9660,0.74 -binance-futures,BTCUSDT,1582336665003000,1582336665141237,42386958,sell,9660,1 -binance-futures,BTCUSDT,1582336665003000,1582336665141245,42386959,sell,9660,0.4 -binance-futures,BTCUSDT,1582336665003000,1582336665141250,42386960,buy,9660.02,0.057 -binance-futures,BTCUSDT,1582336665963000,1582336666085944,42386961,buy,9660.01,0.001 -binance-futures,BTCUSDT,1582336666289000,1582336666420633,42386962,sell,9660,0.472 -binance-futures,BTCUSDT,1582336667035000,1582336667156396,42386963,buy,9660.01,0.002 -binance-futures,BTCUSDT,1582336667064000,1582336667185541,42386964,buy,9660.01,0.006 -binance-futures,BTCUSDT,1582336667228000,1582336667354815,42386965,sell,9660,0.02 -binance-futures,BTCUSDT,1582336667228000,1582336667355431,42386966,sell,9660,0.777 -binance-futures,BTCUSDT,1582336667283000,1582336667406669,42386967,sell,9660.01,0.017 -binance-futures,BTCUSDT,1582336667305000,1582336667443848,42386968,buy,9660.19,0.009 -binance-futures,BTCUSDT,1582336667331000,1582336667458664,42386969,buy,9660.15,0.01 -binance-futures,BTCUSDT,1582336667336000,1582336667462271,42386970,sell,9660.01,0.25 -binance-futures,BTCUSDT,1582336667582000,1582336667703404,42386971,buy,9660.36,0.277 -binance-futures,BTCUSDT,1582336667707000,1582336667832775,42386972,sell,9660.41,0.006 -binance-futures,BTCUSDT,1582336669228000,1582336669351221,42386973,sell,9660.72,0.05 -binance-futures,BTCUSDT,1582336671530000,1582336671650261,42386974,sell,9660.72,2 -binance-futures,BTCUSDT,1582336671530000,1582336671654686,42386975,sell,9660.72,2 -binance-futures,BTCUSDT,1582336671548000,1582336671668369,42386976,sell,9660.72,2 -binance-futures,BTCUSDT,1582336671552000,1582336671675055,42386977,sell,9660.72,4 -binance-futures,BTCUSDT,1582336671552000,1582336671675077,42386978,sell,9660.72,0.855 -binance-futures,BTCUSDT,1582336671552000,1582336671675174,42386979,sell,9660.7,0.031 -binance-futures,BTCUSDT,1582336671552000,1582336671680259,42386980,sell,9660.69,0.031 -binance-futures,BTCUSDT,1582336671552000,1582336671683036,42386981,sell,9660.68,0.031 -binance-futures,BTCUSDT,1582336671561000,1582336671686224,42386982,sell,9660.67,0.031 -binance-futures,BTCUSDT,1582336671585000,1582336671708130,42386983,sell,9660.5,0.709 -binance-futures,BTCUSDT,1582336671585000,1582336671712785,42386984,sell,9660.15,0.762 -binance-futures,BTCUSDT,1582336671624000,1582336671746722,42386985,sell,9660,1.591 -binance-futures,BTCUSDT,1582336671624000,1582336671748503,42386986,sell,9660,0.005 -binance-futures,BTCUSDT,1582336671624000,1582336671748510,42386987,sell,9660,0.005 -binance-futures,BTCUSDT,1582336671624000,1582336671750439,42386988,sell,9660,0.005 -binance-futures,BTCUSDT,1582336671624000,1582336671750818,42386989,sell,9660,0.394 -binance-futures,BTCUSDT,1582336671634000,1582336671756306,42386990,sell,9660,0.606 -binance-futures,BTCUSDT,1582336671634000,1582336671756322,42386991,sell,9660,0.2 -binance-futures,BTCUSDT,1582336671634000,1582336671756329,42386992,sell,9660,3 -binance-futures,BTCUSDT,1582336671634000,1582336671756341,42386993,sell,9660,2.753 -binance-futures,BTCUSDT,1582336671657000,1582336671780470,42386994,sell,9660,2 -binance-futures,BTCUSDT,1582336671675000,1582336671796072,42386995,sell,9660,2 -binance-futures,BTCUSDT,1582336671696000,1582336671817432,42386996,sell,9660,2 -binance-futures,BTCUSDT,1582336672020000,1582336672144757,42386997,buy,9660.01,0.05 -binance-futures,BTCUSDT,1582336674693000,1582336674814716,42386998,sell,9660,0.03 -binance-futures,BTCUSDT,1582336674770000,1582336674891061,42386999,sell,9660,0.1 -binance-futures,BTCUSDT,1582336675083000,1582336675204875,42387000,sell,9660,0.05 -binance-futures,BTCUSDT,1582336676970000,1582336677092146,42387001,sell,9660,1.189 -binance-futures,BTCUSDT,1582336677155000,1582336677278513,42387002,buy,9660.01,1 -binance-futures,BTCUSDT,1582336677155000,1582336677278932,42387003,buy,9660.01,0.1 -binance-futures,BTCUSDT,1582336677155000,1582336677278945,42387004,buy,9660.05,0.031 -binance-futures,BTCUSDT,1582336677155000,1582336677285161,42387005,buy,9660.06,0.031 -binance-futures,BTCUSDT,1582336677155000,1582336677286355,42387006,buy,9660.09,1.681 -binance-futures,BTCUSDT,1582336680400000,1582336680524682,42387007,buy,9660.09,0.214 -binance-futures,BTCUSDT,1582336680736000,1582336680860177,42387008,buy,9660.09,0.005 -binance-futures,BTCUSDT,1582336681218000,1582336681350111,42387009,sell,9660.08,0.001 -binance-futures,BTCUSDT,1582336682755000,1582336682879622,42387010,sell,9660.08,0.005 -binance-futures,BTCUSDT,1582336683035000,1582336683156179,42387011,sell,9660.08,0.2 -binance-futures,BTCUSDT,1582336683109000,1582336683231938,42387012,sell,9660.08,0.15 -binance-futures,BTCUSDT,1582336685035000,1582336685159831,42387013,buy,9660.09,0.452 -binance-futures,BTCUSDT,1582336686009000,1582336686131393,42387014,sell,9660.08,0.045 -binance-futures,BTCUSDT,1582336686704000,1582336686827136,42387015,buy,9660.01,0.005 -binance-futures,BTCUSDT,1582336689453000,1582336689576830,42387016,buy,9660.01,0.145 -binance-futures,BTCUSDT,1582336690466000,1582336690587224,42387017,sell,9660,0.01 -binance-futures,BTCUSDT,1582336690753000,1582336690878724,42387018,sell,9660,0.966 -binance-futures,BTCUSDT,1582336690951000,1582336691074188,42387019,sell,9660,0.06 -binance-futures,BTCUSDT,1582336692270000,1582336692395659,42387020,buy,9660.01,0.1 -binance-futures,BTCUSDT,1582336694015000,1582336694137913,42387021,buy,9660.01,0.001 -binance-futures,BTCUSDT,1582336695182000,1582336695304769,42387022,sell,9660,22.495 -binance-futures,BTCUSDT,1582336695182000,1582336695306648,42387023,sell,9660,10 -binance-futures,BTCUSDT,1582336695208000,1582336695329839,42387024,sell,9660,2.862 -binance-futures,BTCUSDT,1582336696193000,1582336696319996,42387025,buy,9660.01,1.844 -binance-futures,BTCUSDT,1582336696193000,1582336696321709,42387026,buy,9660.01,0.2 -binance-futures,BTCUSDT,1582336696193000,1582336696321716,42387027,buy,9660.01,0.16 -binance-futures,BTCUSDT,1582336696193000,1582336696321720,42387028,buy,9660.01,0.1 -binance-futures,BTCUSDT,1582336696193000,1582336696321725,42387029,buy,9660.01,0.683 -binance-futures,BTCUSDT,1582336696193000,1582336696321735,42387030,buy,9660.01,0.944 -binance-futures,BTCUSDT,1582336696193000,1582336696328588,42387031,buy,9660.02,0.031 -binance-futures,BTCUSDT,1582336696193000,1582336696328597,42387032,buy,9660.03,0.031 -binance-futures,BTCUSDT,1582336696193000,1582336696328608,42387033,buy,9660.04,0.031 -binance-futures,BTCUSDT,1582336696193000,1582336696333215,42387034,buy,9660.05,0.031 -binance-futures,BTCUSDT,1582336696193000,1582336696333232,42387035,buy,9660.06,0.031 -binance-futures,BTCUSDT,1582336696193000,1582336696336232,42387036,buy,9660.09,0.874 -binance-futures,BTCUSDT,1582336696193000,1582336696336250,42387037,buy,9660.09,0.1 -binance-futures,BTCUSDT,1582336696193000,1582336696336260,42387038,buy,9660.51,0.5 -binance-futures,BTCUSDT,1582336696193000,1582336696336269,42387039,buy,9660.73,0.557 -binance-futures,BTCUSDT,1582336697881000,1582336698001658,42387040,buy,9660.01,0.001 -binance-futures,BTCUSDT,1582336699537000,1582336699656643,42387041,sell,9660,0.093 -binance-futures,BTCUSDT,1582336699670000,1582336699792351,42387042,sell,9660,2 -binance-futures,BTCUSDT,1582336699673000,1582336699796556,42387043,sell,9660,8 -binance-futures,BTCUSDT,1582336699673000,1582336699796559,42387044,sell,9660,3.392 -binance-futures,BTCUSDT,1582336699673000,1582336699796600,42387045,sell,9660,0.608 -binance-futures,BTCUSDT,1582336699688000,1582336699811514,42387046,sell,9660,4 -binance-futures,BTCUSDT,1582336699691000,1582336699813683,42387047,sell,9660,0.392 -binance-futures,BTCUSDT,1582336699691000,1582336699813690,42387048,sell,9660,1.608 -binance-futures,BTCUSDT,1582336699695000,1582336699818229,42387049,sell,9660,2 -binance-futures,BTCUSDT,1582336699696000,1582336699818901,42387050,sell,9660,2 -binance-futures,BTCUSDT,1582336699696000,1582336699818905,42387051,sell,9660,2 -binance-futures,BTCUSDT,1582336699701000,1582336699824026,42387052,sell,9660,6 -binance-futures,BTCUSDT,1582336699710000,1582336699833407,42387053,sell,9660,2.092 -binance-futures,BTCUSDT,1582336699710000,1582336699833418,42387054,sell,9660,3.479 -binance-futures,BTCUSDT,1582336699726000,1582336699848877,42387055,sell,9660,0.01 -binance-futures,BTCUSDT,1582336699750000,1582336699877196,42387056,sell,9660,0.85 -binance-futures,BTCUSDT,1582336699860000,1582336699987930,42387057,sell,9660,1.915 -binance-futures,BTCUSDT,1582336699921000,1582336700041431,42387058,sell,9660,2.25 -binance-futures,BTCUSDT,1582336699923000,1582336700047931,42387059,sell,9660,0.6 -binance-futures,BTCUSDT,1582336699930000,1582336700050387,42387060,sell,9660,0.196 -binance-futures,BTCUSDT,1582336699930000,1582336700050756,42387061,sell,9660,0.005 -binance-futures,BTCUSDT,1582336699932000,1582336700052679,42387062,sell,9660,0.495 -binance-futures,BTCUSDT,1582336699932000,1582336700052842,42387063,sell,9660,0.072 -binance-futures,BTCUSDT,1582336699932000,1582336700052915,42387064,sell,9660,0.001 -binance-futures,BTCUSDT,1582336699947000,1582336700073346,42387065,sell,9659.98,0.04 -binance-futures,BTCUSDT,1582336699947000,1582336700073352,42387066,sell,9659.98,0.04 -binance-futures,BTCUSDT,1582336699972000,1582336700097000,42387067,sell,9659,0.135 -binance-futures,BTCUSDT,1582336699972000,1582336700103250,42387068,sell,9659,0.01 -binance-futures,BTCUSDT,1582336699972000,1582336700103259,42387069,sell,9659,0.03 -binance-futures,BTCUSDT,1582336699972000,1582336700103264,42387070,sell,9659,0.005 -binance-futures,BTCUSDT,1582336699972000,1582336700103274,42387071,sell,9658.87,0.012 -binance-futures,BTCUSDT,1582336699972000,1582336700105181,42387072,sell,9658.82,0.04 -binance-futures,BTCUSDT,1582336699972000,1582336700105190,42387073,sell,9658.67,0.013 -binance-futures,BTCUSDT,1582336700042000,1582336700169608,42387074,sell,9658.67,0.027 -binance-futures,BTCUSDT,1582336700042000,1582336700174789,42387075,sell,9658.64,0.014 -binance-futures,BTCUSDT,1582336700066000,1582336700192418,42387076,sell,9658.64,0.026 -binance-futures,BTCUSDT,1582336700109000,1582336700235283,42387077,sell,9658.62,0.04 -binance-futures,BTCUSDT,1582336700114000,1582336700244642,42387078,sell,9658.21,0.04 -binance-futures,BTCUSDT,1582336700114000,1582336700251882,42387079,sell,9658.18,0.006 -binance-futures,BTCUSDT,1582336700114000,1582336700251895,42387080,sell,9658.14,0.04 -binance-futures,BTCUSDT,1582336700114000,1582336700253522,42387081,sell,9658.01,0.004 -binance-futures,BTCUSDT,1582336700114000,1582336700257482,42387082,sell,9658,0.01 -binance-futures,BTCUSDT,1582336700114000,1582336700257496,42387083,sell,9658,0.036 -binance-futures,BTCUSDT,1582336700114000,1582336700257501,42387084,sell,9657.8,0.002 -binance-futures,BTCUSDT,1582336700114000,1582336700259071,42387085,sell,9657.8,0.001 -binance-futures,BTCUSDT,1582336700114000,1582336700259078,42387086,sell,9657.8,0.001 -binance-futures,BTCUSDT,1582336700114000,1582336700259082,42387087,sell,9657.8,0.001 -binance-futures,BTCUSDT,1582336700114000,1582336700259087,42387088,sell,9657.74,0.006 -binance-futures,BTCUSDT,1582336700114000,1582336700261642,42387089,sell,9657.72,0.04 -binance-futures,BTCUSDT,1582336700114000,1582336700261647,42387090,sell,9657.12,1.635 -binance-futures,BTCUSDT,1582336700114000,1582336700264816,42387091,sell,9657.12,1 -binance-futures,BTCUSDT,1582336700185000,1582336700320620,42387092,sell,9657.13,0.002 -binance-futures,BTCUSDT,1582336700185000,1582336700323185,42387093,sell,9657.12,0.008 -binance-futures,BTCUSDT,1582336700218000,1582336700352056,42387094,buy,9657.36,0.274 -binance-futures,BTCUSDT,1582336700218000,1582336700354152,42387095,buy,9657.45,4.35 -binance-futures,BTCUSDT,1582336700218000,1582336700356069,42387096,buy,9657.46,0.346 -binance-futures,BTCUSDT,1582336700325000,1582336700452527,42387097,sell,9657.13,0.238 -binance-futures,BTCUSDT,1582336700738000,1582336700863480,42387098,buy,9657.01,0.005 -binance-futures,BTCUSDT,1582336701411000,1582336701534806,42387099,sell,9657,0.015 -binance-futures,BTCUSDT,1582336701411000,1582336701534812,42387100,sell,9656.71,0.005 -binance-futures,BTCUSDT,1582336701411000,1582336701540782,42387101,sell,9656.71,0.001 -binance-futures,BTCUSDT,1582336701411000,1582336701540799,42387102,sell,9655.96,0.04 -binance-futures,BTCUSDT,1582336701411000,1582336701543246,42387103,sell,9655.55,0.04 -binance-futures,BTCUSDT,1582336701411000,1582336701545677,42387104,sell,9655.46,4.419 -binance-futures,BTCUSDT,1582336701411000,1582336701548758,42387105,sell,9655.41,0.047 -binance-futures,BTCUSDT,1582336701411000,1582336701548773,42387106,sell,9655.17,0.007 -binance-futures,BTCUSDT,1582336701411000,1582336701550683,42387107,sell,9655.15,0.446 -binance-futures,BTCUSDT,1582336701583000,1582336701704808,42387108,buy,9656.88,0.031 -binance-futures,BTCUSDT,1582336701583000,1582336701704813,42387109,buy,9656.89,0.031 -binance-futures,BTCUSDT,1582336701583000,1582336701706749,42387110,buy,9656.89,0.32 -binance-futures,BTCUSDT,1582336701630000,1582336701751397,42387111,sell,9655.33,0.049 -binance-futures,BTCUSDT,1582336702087000,1582336702213924,42387112,buy,9656.78,0.001 -binance-futures,BTCUSDT,1582336702164000,1582336702302724,42387113,sell,9655.64,0.009 -binance-futures,BTCUSDT,1582336702585000,1582336702716600,42387114,buy,9656.2,0.4 -binance-futures,BTCUSDT,1582336702923000,1582336703044788,42387115,buy,9655.91,2.05 -binance-futures,BTCUSDT,1582336702958000,1582336703085496,42387116,sell,9655.94,0.05 -binance-futures,BTCUSDT,1582336703160000,1582336703293712,42387117,buy,9656.2,0.1 -binance-futures,BTCUSDT,1582336703195000,1582336703316082,42387118,sell,9656.19,0.1 -binance-futures,BTCUSDT,1582336703219000,1582336703348553,42387119,buy,9656.2,0.001 -binance-futures,BTCUSDT,1582336703219000,1582336703348627,42387120,buy,9656.2,0.004 -binance-futures,BTCUSDT,1582336703475000,1582336703599506,42387121,sell,9656.19,1 -binance-futures,BTCUSDT,1582336703475000,1582336703599662,42387122,sell,9655.32,0.905 -binance-futures,BTCUSDT,1582336703475000,1582336703605890,42387123,sell,9655.11,0.003 -binance-futures,BTCUSDT,1582336703475000,1582336703605896,42387124,sell,9655.11,0.001 -binance-futures,BTCUSDT,1582336703475000,1582336703605904,42387125,sell,9655.1,0.1 -binance-futures,BTCUSDT,1582336703729000,1582336703856061,42387126,sell,9655.12,0.045 -binance-futures,BTCUSDT,1582336703837000,1582336703960946,42387127,sell,9655.12,0.01 -binance-futures,BTCUSDT,1582336704149000,1582336704275369,42387128,sell,9655.11,0.014 -binance-futures,BTCUSDT,1582336704149000,1582336704282517,42387129,sell,9655.1,0.15 -binance-futures,BTCUSDT,1582336704149000,1582336704282540,42387130,sell,9655.07,0.004 -binance-futures,BTCUSDT,1582336704149000,1582336704282543,42387131,sell,9655.07,0.019 -binance-futures,BTCUSDT,1582336704196000,1582336704319533,42387132,sell,9655.07,0.077 -binance-futures,BTCUSDT,1582336704279000,1582336704409205,42387133,sell,9655.07,0.322 -binance-futures,BTCUSDT,1582336704297000,1582336704451066,42387134,sell,9655.07,0.164 -binance-futures,BTCUSDT,1582336704297000,1582336704451074,42387135,sell,9655.07,0.255 -binance-futures,BTCUSDT,1582336704306000,1582336704453455,42387136,sell,9655.07,0.327 -binance-futures,BTCUSDT,1582336704306000,1582336704453460,42387137,sell,9655.06,0.04 -binance-futures,BTCUSDT,1582336704306000,1582336704453863,42387138,sell,9655,0.13 -binance-futures,BTCUSDT,1582336704306000,1582336704454381,42387139,sell,9655,0.011 -binance-futures,BTCUSDT,1582336704353000,1582336704479714,42387140,sell,9655,0.139 -binance-futures,BTCUSDT,1582336704385000,1582336704511124,42387141,sell,9655,0.041 -binance-futures,BTCUSDT,1582336705308000,1582336705432170,42387142,sell,9655,0.002 -binance-futures,BTCUSDT,1582336705524000,1582336705646074,42387143,buy,9655.01,0.25 -binance-futures,BTCUSDT,1582336705701000,1582336705821605,42387144,buy,9655.01,0.011 -binance-futures,BTCUSDT,1582336705707000,1582336705827768,42387145,sell,9655,0.31 -binance-futures,BTCUSDT,1582336705988000,1582336706111816,42387146,buy,9655.01,0.001 -binance-futures,BTCUSDT,1582336706134000,1582336706259551,42387147,sell,9655,0.512 -binance-futures,BTCUSDT,1582336707611000,1582336707735008,42387148,sell,9655,0.028 -binance-futures,BTCUSDT,1582336708603000,1582336708727650,42387149,buy,9655.01,0.897 -binance-futures,BTCUSDT,1582336708820000,1582336708940739,42387150,buy,9655.01,0.2 -binance-futures,BTCUSDT,1582336708888000,1582336709012240,42387151,buy,9655.01,0.001 -binance-futures,BTCUSDT,1582336709118000,1582336709242302,42387152,sell,9655,3.827 -binance-futures,BTCUSDT,1582336709118000,1582336709242313,42387153,sell,9655,0.5 -binance-futures,BTCUSDT,1582336709118000,1582336709242317,42387154,sell,9655,0.673 -binance-futures,BTCUSDT,1582336709307000,1582336709431135,42387155,sell,9655,0.017 -binance-futures,BTCUSDT,1582336709509000,1582336709633998,42387156,buy,9655.01,0.67 -binance-futures,BTCUSDT,1582336709516000,1582336709643384,42387157,buy,9655.01,0.67 -binance-futures,BTCUSDT,1582336709522000,1582336709646157,42387158,buy,9655.01,0.64 -binance-futures,BTCUSDT,1582336709527000,1582336709652351,42387159,buy,9655.01,0.556 -binance-futures,BTCUSDT,1582336709528000,1582336709652358,42387160,buy,9655.01,0.164 -binance-futures,BTCUSDT,1582336709831000,1582336709963736,42387161,buy,9656.21,0.001 -binance-futures,BTCUSDT,1582336710281000,1582336710407868,42387162,sell,9656.2,1 -binance-futures,BTCUSDT,1582336710281000,1582336710409859,42387163,sell,9656.2,2 -binance-futures,BTCUSDT,1582336710281000,1582336710409871,42387164,sell,9656.2,2 -binance-futures,BTCUSDT,1582336710281000,1582336710410402,42387165,sell,9656.2,0.005 -binance-futures,BTCUSDT,1582336710281000,1582336710410454,42387166,sell,9656.19,0.74 -binance-futures,BTCUSDT,1582336710281000,1582336710417208,42387167,sell,9656.15,1 -binance-futures,BTCUSDT,1582336710281000,1582336710418595,42387168,sell,9655.9,0.531 -binance-futures,BTCUSDT,1582336710281000,1582336710418605,42387169,sell,9655.4,0.628 -binance-futures,BTCUSDT,1582336710281000,1582336710421655,42387170,sell,9655.39,0.496 -binance-futures,BTCUSDT,1582336710281000,1582336710421665,42387171,sell,9655.39,0.496 -binance-futures,BTCUSDT,1582336710281000,1582336710421672,42387172,sell,9655.39,0.628 -binance-futures,BTCUSDT,1582336710282000,1582336710421681,42387173,sell,9655.04,0.476 -binance-futures,BTCUSDT,1582336711233000,1582336711359743,42387174,sell,9655.64,0.001 -binance-futures,BTCUSDT,1582336711610000,1582336711736881,42387175,buy,9655.65,0.001 -binance-futures,BTCUSDT,1582336712054000,1582336712177760,42387176,sell,9655.64,0.003 -binance-futures,BTCUSDT,1582336712119000,1582336712242658,42387177,sell,9655.64,0.003 -binance-futures,BTCUSDT,1582336712213000,1582336712335209,42387178,buy,9655.65,0.1 -binance-futures,BTCUSDT,1582336712257000,1582336712386305,42387179,sell,9655.64,0.045 -binance-futures,BTCUSDT,1582336712551000,1582336712672158,42387180,buy,9655.65,0.5 -binance-futures,BTCUSDT,1582336712689000,1582336712811710,42387181,buy,9655.65,0.022 -binance-futures,BTCUSDT,1582336712853000,1582336712973208,42387182,buy,9655.65,0.022 -binance-futures,BTCUSDT,1582336713019000,1582336713142772,42387183,buy,9655.65,0.022 -binance-futures,BTCUSDT,1582336713211000,1582336713330425,42387184,buy,9655.65,0.022 -binance-futures,BTCUSDT,1582336713384000,1582336713506583,42387185,buy,9655.65,0.02 -binance-futures,BTCUSDT,1582336714673000,1582336714797864,42387186,sell,9655.64,0.005 -binance-futures,BTCUSDT,1582336714673000,1582336714801511,42387187,sell,9655.63,0.68 -binance-futures,BTCUSDT,1582336714673000,1582336714806437,42387188,sell,9655.33,0.141 -binance-futures,BTCUSDT,1582336714813000,1582336714938958,42387189,buy,9655.65,0.001 -binance-futures,BTCUSDT,1582336715331000,1582336715453748,42387190,buy,9655.65,0.01 -binance-futures,BTCUSDT,1582336715494000,1582336715615329,42387191,buy,9655.65,0.01 -binance-futures,BTCUSDT,1582336715663000,1582336715788063,42387192,buy,9655.65,0.01 -binance-futures,BTCUSDT,1582336715836000,1582336715956739,42387193,buy,9655.65,0.008 -binance-futures,BTCUSDT,1582336717540000,1582336717666068,42387194,buy,9655.65,0.67 -binance-futures,BTCUSDT,1582336717544000,1582336717673555,42387195,buy,9655.65,0.72 -binance-futures,BTCUSDT,1582336717544000,1582336717673574,42387196,buy,9655.65,0.67 -binance-futures,BTCUSDT,1582336717544000,1582336717675186,42387197,buy,9655.65,0.484 -binance-futures,BTCUSDT,1582336717544000,1582336717675192,42387198,buy,9655.81,0.196 -binance-futures,BTCUSDT,1582336717544000,1582336717676119,42387199,buy,9655.81,0.74 -binance-futures,BTCUSDT,1582336717569000,1582336717694135,42387200,buy,9655.81,2 -binance-futures,BTCUSDT,1582336717571000,1582336717699132,42387201,buy,9655.81,1.284 -binance-futures,BTCUSDT,1582336717596000,1582336717727385,42387202,buy,9656.39,0.1 -binance-futures,BTCUSDT,1582336717596000,1582336717727393,42387203,buy,9656.39,1.9 -binance-futures,BTCUSDT,1582336717598000,1582336717727398,42387204,buy,9656.39,2 -binance-futures,BTCUSDT,1582336717598000,1582336717727408,42387205,buy,9656.39,0.005 -binance-futures,BTCUSDT,1582336717603000,1582336717732717,42387206,buy,9656.39,0.005 -binance-futures,BTCUSDT,1582336717605000,1582336717732720,42387207,sell,9656.39,0.429 -binance-futures,BTCUSDT,1582336717620000,1582336717741177,42387208,buy,9656.77,0.01 -binance-futures,BTCUSDT,1582336717624000,1582336717748694,42387209,buy,9656.77,0.01 -binance-futures,BTCUSDT,1582336717631000,1582336717755272,42387210,buy,9656.77,0.08 -binance-futures,BTCUSDT,1582336717631000,1582336717755391,42387211,buy,9656.78,1.92 -binance-futures,BTCUSDT,1582336717635000,1582336717760654,42387212,buy,9656.78,0.93 -binance-futures,BTCUSDT,1582336717660000,1582336717787915,42387213,buy,9656.89,0.012 -binance-futures,BTCUSDT,1582336717740000,1582336717867708,42387214,buy,9657.48,0.001 -binance-futures,BTCUSDT,1582336717845000,1582336717976171,42387215,sell,9657.47,0.005 -binance-futures,BTCUSDT,1582336718345000,1582336718469514,42387216,buy,9657.48,0.008 -binance-futures,BTCUSDT,1582336719942000,1582336720064973,42387217,sell,9657.47,0.04 -binance-futures,BTCUSDT,1582336720152000,1582336720273398,42387218,buy,9657.48,0.003 -binance-futures,BTCUSDT,1582336720152000,1582336720273406,42387219,buy,9657.48,0.002 -binance-futures,BTCUSDT,1582336720317000,1582336720439394,42387220,buy,9657.48,0.005 -binance-futures,BTCUSDT,1582336720484000,1582336720607518,42387221,buy,9657.48,0.005 -binance-futures,BTCUSDT,1582336720661000,1582336720785165,42387222,buy,9657.48,0.005 -binance-futures,BTCUSDT,1582336720834000,1582336720955660,42387223,buy,9657.48,0.002 -binance-futures,BTCUSDT,1582336721042000,1582336721166724,42387224,buy,9657.48,0.001 -binance-futures,BTCUSDT,1582336721165000,1582336721287255,42387225,sell,9657.47,0.955 -binance-futures,BTCUSDT,1582336721165000,1582336721287519,42387226,sell,9657,0.005 -binance-futures,BTCUSDT,1582336721165000,1582336721292004,42387227,sell,9656.84,0.04 -binance-futures,BTCUSDT,1582336722644000,1582336722769392,42387228,buy,9657.3,0.005 -binance-futures,BTCUSDT,1582336722811000,1582336722932615,42387229,buy,9657.01,0.005 -binance-futures,BTCUSDT,1582336722978000,1582336723103686,42387230,buy,9657.01,0.005 -binance-futures,BTCUSDT,1582336723146000,1582336723265428,42387231,buy,9657.01,0.005 -binance-futures,BTCUSDT,1582336723312000,1582336723433130,42387232,buy,9657.01,0.002 -binance-futures,BTCUSDT,1582336723880000,1582336724003107,42387233,buy,9657.01,0.001 -binance-futures,BTCUSDT,1582336725998000,1582336726122129,42387234,buy,9656.85,0.91 -binance-futures,BTCUSDT,1582336725998000,1582336726125465,42387235,buy,9656.86,0.034 -binance-futures,BTCUSDT,1582336725998000,1582336726125474,42387236,buy,9656.86,0.023 -binance-futures,BTCUSDT,1582336725998000,1582336726125479,42387237,buy,9656.86,0.009 -binance-futures,BTCUSDT,1582336725998000,1582336726125483,42387238,buy,9656.86,1.906 -binance-futures,BTCUSDT,1582336726587000,1582336726709421,42387239,buy,9657,0.001 -binance-futures,BTCUSDT,1582336727170000,1582336727296100,42387240,buy,9657,0.01 -binance-futures,BTCUSDT,1582336727170000,1582336727296854,42387241,buy,9657,0.01 -binance-futures,BTCUSDT,1582336729541000,1582336729662290,42387242,buy,9656.99,0.001 -binance-futures,BTCUSDT,1582336731644000,1582336731765502,42387243,buy,9656.99,0.001 -binance-futures,BTCUSDT,1582336732528000,1582336732652523,42387244,buy,9656.99,0.001 -binance-futures,BTCUSDT,1582336734939000,1582336735056667,42387245,buy,9656.92,0.001 -binance-futures,BTCUSDT,1582336735544000,1582336735669765,42387246,buy,9656.92,0.001 -binance-futures,BTCUSDT,1582336735885000,1582336736007748,42387247,buy,9656.92,0.032 -binance-futures,BTCUSDT,1582336737685000,1582336737810377,42387248,sell,9655.68,0.031 -binance-futures,BTCUSDT,1582336737685000,1582336737815467,42387249,sell,9655.67,0.031 -binance-futures,BTCUSDT,1582336737685000,1582336737820704,42387250,sell,9655.66,0.004 -binance-futures,BTCUSDT,1582336737815000,1582336737939326,42387251,sell,9655.65,0.012 -binance-futures,BTCUSDT,1582336737815000,1582336737942742,42387252,sell,9655.63,0.031 -binance-futures,BTCUSDT,1582336737815000,1582336737943876,42387253,sell,9655.12,0.001 -binance-futures,BTCUSDT,1582336737815000,1582336737945662,42387254,sell,9655.08,1.509 -binance-futures,BTCUSDT,1582336738512000,1582336738637239,42387255,buy,9655.48,0.001 -binance-futures,BTCUSDT,1582336738673000,1582336738797731,42387256,sell,9655.01,0.003 -binance-futures,BTCUSDT,1582336738673000,1582336738797740,42387257,sell,9655.01,0.008 -binance-futures,BTCUSDT,1582336738673000,1582336738797747,42387258,sell,9655,0.659 -binance-futures,BTCUSDT,1582336738756000,1582336738877935,42387259,sell,9655,0.74 -binance-futures,BTCUSDT,1582336738765000,1582336738892787,42387260,sell,9655,0.375 -binance-futures,BTCUSDT,1582336738765000,1582336738892798,42387261,sell,9655,0.305 -binance-futures,BTCUSDT,1582336738769000,1582336738896188,42387262,sell,9655,0.195 -binance-futures,BTCUSDT,1582336738769000,1582336738896207,42387263,sell,9655,0.008 -binance-futures,BTCUSDT,1582336738769000,1582336738896212,42387264,sell,9655,0.044 -binance-futures,BTCUSDT,1582336738769000,1582336738896216,42387265,sell,9655,0.053 -binance-futures,BTCUSDT,1582336738769000,1582336738896220,42387266,sell,9655,0.37 -binance-futures,BTCUSDT,1582336738812000,1582336738935322,42387267,sell,9655,0.705 -binance-futures,BTCUSDT,1582336738812000,1582336738935332,42387268,sell,9655,0.015 -binance-futures,BTCUSDT,1582336738951000,1582336739074845,42387269,sell,9655,0.1 -binance-futures,BTCUSDT,1582336741686000,1582336741812057,42387270,buy,9655.01,0.001 -binance-futures,BTCUSDT,1582336742307000,1582336742431211,42387271,buy,9655.01,0.005 -binance-futures,BTCUSDT,1582336743101000,1582336743224378,42387272,buy,9655.98,0.001 -binance-futures,BTCUSDT,1582336743849000,1582336743974673,42387273,sell,9655.09,0.365 -binance-futures,BTCUSDT,1582336744198000,1582336744334939,42387274,buy,9655.78,0.022 -binance-futures,BTCUSDT,1582336744198000,1582336744334948,42387275,buy,9655.79,1.478 -binance-futures,BTCUSDT,1582336744421000,1582336744545856,42387276,sell,9655.77,0.003 -binance-futures,BTCUSDT,1582336745563000,1582336745684121,42387277,buy,9655.79,0.03 -binance-futures,BTCUSDT,1582336746829000,1582336746953122,42387278,buy,9656.17,0.72 -binance-futures,BTCUSDT,1582336749795000,1582336749916716,42387279,sell,9656.16,0.5 -binance-futures,BTCUSDT,1582336750991000,1582336751113962,42387280,sell,9656.16,0.5 -binance-futures,BTCUSDT,1582336750991000,1582336751113971,42387281,sell,9656.16,0.5 -binance-futures,BTCUSDT,1582336752448000,1582336752573470,42387282,sell,9655,0.125 -binance-futures,BTCUSDT,1582336754642000,1582336754773706,42387283,buy,9656.06,0.68 -binance-futures,BTCUSDT,1582336754938000,1582336755063118,42387284,buy,9656.17,0.684 -binance-futures,BTCUSDT,1582336754938000,1582336755063130,42387285,buy,9656.17,0.078 -binance-futures,BTCUSDT,1582336754964000,1582336755095341,42387286,buy,9656.47,2 -binance-futures,BTCUSDT,1582336754987000,1582336755111036,42387287,buy,9656.47,0.703 -binance-futures,BTCUSDT,1582336755012000,1582336755136616,42387288,buy,9656.68,0.1 -binance-futures,BTCUSDT,1582336755012000,1582336755142544,42387289,buy,9656.69,1.9 -binance-futures,BTCUSDT,1582336755034000,1582336755164257,42387290,buy,9656.69,2 -binance-futures,BTCUSDT,1582336755063000,1582336755187858,42387291,buy,9656.69,0.68 -binance-futures,BTCUSDT,1582336755069000,1582336755193694,42387292,buy,9656.69,0.66 -binance-futures,BTCUSDT,1582336755074000,1582336755198824,42387293,buy,9656.69,0.334 -binance-futures,BTCUSDT,1582336755127000,1582336755252628,42387294,buy,9656.92,0.066 -binance-futures,BTCUSDT,1582336755127000,1582336755252633,42387295,buy,9656.92,0.934 -binance-futures,BTCUSDT,1582336755286000,1582336755414156,42387296,buy,9656.92,2 -binance-futures,BTCUSDT,1582336755325000,1582336755451891,42387297,buy,9656.92,0.25 -binance-futures,BTCUSDT,1582336755333000,1582336755461484,42387298,buy,9656.92,0.057 -binance-futures,BTCUSDT,1582336755336000,1582336755465646,42387299,buy,9656.92,0.627 -binance-futures,BTCUSDT,1582336755336000,1582336755465655,42387300,buy,9657,0.663 -binance-futures,BTCUSDT,1582336756009000,1582336756140678,42387301,buy,9658.48,0.005 -binance-futures,BTCUSDT,1582336756009000,1582336756140690,42387302,buy,9658.49,0.325 -binance-futures,BTCUSDT,1582336756009000,1582336756146361,42387303,sell,9658.47,0.002 -binance-futures,BTCUSDT,1582336759569000,1582336759693579,42387304,buy,9658.49,0.001 -binance-futures,BTCUSDT,1582336760613000,1582336760734137,42387305,buy,9658.49,5.161 -binance-futures,BTCUSDT,1582336760613000,1582336760739066,42387306,buy,9658.49,0.003 -binance-futures,BTCUSDT,1582336760962000,1582336761085482,42387307,buy,9658.49,0.001 -binance-futures,BTCUSDT,1582336762603000,1582336762727244,42387308,buy,9658.49,0.044 -binance-futures,BTCUSDT,1582336763586000,1582336763708915,42387309,buy,9658.49,0.08 -binance-futures,BTCUSDT,1582336763694000,1582336763816382,42387310,sell,9658.48,0.002 -binance-futures,BTCUSDT,1582336764006000,1582336764128709,42387311,sell,9656.64,0.031 -binance-futures,BTCUSDT,1582336764006000,1582336764128716,42387312,sell,9656.63,0.031 -binance-futures,BTCUSDT,1582336764006000,1582336764131623,42387313,sell,9656.62,0.031 -binance-futures,BTCUSDT,1582336765084000,1582336765206669,42387314,buy,9655.73,0.001 -binance-futures,BTCUSDT,1582336766935000,1582336767056046,42387315,buy,9655.66,0.001 -binance-futures,BTCUSDT,1582336767291000,1582336767435739,42387316,buy,9656.68,0.1 -binance-futures,BTCUSDT,1582336768735000,1582336768857787,42387317,buy,9657.45,0.001 -binance-futures,BTCUSDT,1582336771831000,1582336771958231,42387318,buy,9656.09,0.001 -binance-futures,BTCUSDT,1582336774767000,1582336774892942,42387319,buy,9656.52,0.001 -binance-futures,BTCUSDT,1582336777240000,1582336777380047,42387320,buy,9656.4,0.03 -binance-futures,BTCUSDT,1582336777240000,1582336777380056,42387321,buy,9656.41,0.012 -binance-futures,BTCUSDT,1582336777240000,1582336777391874,42387322,buy,9656.42,0.031 -binance-futures,BTCUSDT,1582336777240000,1582336777391883,42387323,buy,9656.43,0.031 -binance-futures,BTCUSDT,1582336777240000,1582336777394632,42387324,buy,9656.44,0.031 -binance-futures,BTCUSDT,1582336777240000,1582336777397210,42387325,buy,9656.47,0.031 -binance-futures,BTCUSDT,1582336777240000,1582336777398519,42387326,buy,9656.48,0.031 -binance-futures,BTCUSDT,1582336777240000,1582336777398527,42387327,buy,9656.48,0.303 -binance-futures,BTCUSDT,1582336777412000,1582336777531672,42387328,buy,9656.51,0.001 -binance-futures,BTCUSDT,1582336777412000,1582336777532194,42387329,buy,9657.41,0.499 -binance-futures,BTCUSDT,1582336777852000,1582336777974712,42387330,buy,9657.28,0.001 -binance-futures,BTCUSDT,1582336780159000,1582336780285518,42387331,buy,9656.9,0.001 -binance-futures,BTCUSDT,1582336780226000,1582336780353400,42387332,buy,9657.47,0.003 -binance-futures,BTCUSDT,1582336780226000,1582336780355629,42387333,buy,9657.47,0.011 -binance-futures,BTCUSDT,1582336781280000,1582336781405389,42387334,buy,9658.31,0.001 -binance-futures,BTCUSDT,1582336783018000,1582336783151370,42387335,buy,9657.29,0.762 -binance-futures,BTCUSDT,1582336783018000,1582336783151377,42387336,buy,9657.37,0.002 -binance-futures,BTCUSDT,1582336783018000,1582336783151385,42387337,buy,9657.38,2.31 -binance-futures,BTCUSDT,1582336783018000,1582336783153028,42387338,buy,9657.4,0.965 -binance-futures,BTCUSDT,1582336784084000,1582336784211744,42387339,sell,9657.18,0.001 -binance-futures,BTCUSDT,1582336784089000,1582336784216018,42387340,buy,9657.37,0.001 -binance-futures,BTCUSDT,1582336784089000,1582336784219194,42387341,buy,9657.47,0.1 -binance-futures,BTCUSDT,1582336784997000,1582336785123069,42387342,buy,9658.06,0.002 -binance-futures,BTCUSDT,1582336786076000,1582336786196871,42387343,sell,9657.15,0.022 -binance-futures,BTCUSDT,1582336786076000,1582336786198841,42387344,sell,9656.89,0.664 -binance-futures,BTCUSDT,1582336786076000,1582336786202128,42387345,sell,9656.49,0.005 -binance-futures,BTCUSDT,1582336786275000,1582336786397016,42387346,sell,9656.46,0.046 -binance-futures,BTCUSDT,1582336786275000,1582336786397043,42387347,sell,9656.46,0.016 -binance-futures,BTCUSDT,1582336787466000,1582336787588183,42387348,sell,9656.46,0.001 -binance-futures,BTCUSDT,1582336787621000,1582336787744186,42387349,buy,9656.47,0.038 -binance-futures,BTCUSDT,1582336789703000,1582336789826066,42387350,buy,9656.47,0.17 -binance-futures,BTCUSDT,1582336790867000,1582336790992008,42387351,sell,9656.46,0.374 -binance-futures,BTCUSDT,1582336793473000,1582336793595669,42387352,sell,9656.46,0.001 -binance-futures,BTCUSDT,1582336794473000,1582336794597743,42387353,sell,9656.46,0.002 -binance-futures,BTCUSDT,1582336795076000,1582336795199798,42387354,sell,9656.46,0.001 -binance-futures,BTCUSDT,1582336796167000,1582336796289989,42387355,sell,9656.01,0.001 -binance-futures,BTCUSDT,1582336796167000,1582336796293367,42387356,sell,9656,0.839 -binance-futures,BTCUSDT,1582336796260000,1582336796410234,42387357,sell,9656,0.01 -binance-futures,BTCUSDT,1582336796384000,1582336796507976,42387358,sell,9656,0.225 -binance-futures,BTCUSDT,1582336796469000,1582336796590719,42387359,sell,9655.81,0.001 -binance-futures,BTCUSDT,1582336797908000,1582336798031032,42387360,sell,9656.05,0.031 -binance-futures,BTCUSDT,1582336797908000,1582336798035119,42387361,sell,9656.04,0.023 -binance-futures,BTCUSDT,1582336800225000,1582336800353802,42387362,buy,9656.31,0.001 -binance-futures,BTCUSDT,1582336800590000,1582336800715181,42387363,buy,9656.28,0.005 -binance-futures,BTCUSDT,1582336800809000,1582336800933953,42387364,buy,9656.3,0.001 -binance-futures,BTCUSDT,1582336800809000,1582336800933962,42387365,buy,9656.32,0.001 -binance-futures,BTCUSDT,1582336800809000,1582336800937444,42387366,buy,9656.32,0.001 -binance-futures,BTCUSDT,1582336800809000,1582336800937451,42387367,buy,9656.33,0.001 -binance-futures,BTCUSDT,1582336800809000,1582336800941811,42387368,buy,9656.46,0.001 -binance-futures,BTCUSDT,1582336800809000,1582336800945323,42387369,buy,9656.47,0.101 -binance-futures,BTCUSDT,1582336800809000,1582336800945330,42387370,buy,9656.69,0.1 -binance-futures,BTCUSDT,1582336800809000,1582336800949529,42387371,buy,9656.98,0.005 -binance-futures,BTCUSDT,1582336800809000,1582336800949540,42387372,buy,9657.47,0.001 -binance-futures,BTCUSDT,1582336800809000,1582336800949549,42387373,buy,9657.75,0.681 -binance-futures,BTCUSDT,1582336800809000,1582336800949554,42387374,buy,9657.75,0.681 -binance-futures,BTCUSDT,1582336800809000,1582336800949558,42387375,buy,9657.75,0.372 -binance-futures,BTCUSDT,1582336801623000,1582336801745540,42387376,sell,9657.49,0.001 -binance-futures,BTCUSDT,1582336802676000,1582336802800554,42387377,sell,9656.49,0.003 -binance-futures,BTCUSDT,1582336803241000,1582336803361075,42387378,buy,9656.69,0.239 -binance-futures,BTCUSDT,1582336804310000,1582336804436048,42387379,buy,9656.67,0.001 -binance-futures,BTCUSDT,1582336804382000,1582336804506015,42387380,sell,9656.8,0.005 -binance-futures,BTCUSDT,1582336804508000,1582336804629221,42387381,buy,9657.43,0.001 -binance-futures,BTCUSDT,1582336804508000,1582336804631790,42387382,buy,9657.47,0.001 -binance-futures,BTCUSDT,1582336804774000,1582336804902557,42387383,sell,9657.51,0.003 -binance-futures,BTCUSDT,1582336804901000,1582336805024745,42387384,sell,9657.72,0.251 -binance-futures,BTCUSDT,1582336805058000,1582336805179093,42387385,sell,9657.79,0.005 -binance-futures,BTCUSDT,1582336807572000,1582336807694276,42387386,buy,9657.8,0.001 -binance-futures,BTCUSDT,1582336807572000,1582336807694283,42387387,buy,9657.8,0.018 -binance-futures,BTCUSDT,1582336807578000,1582336807703080,42387388,sell,9657.79,0.001 -binance-futures,BTCUSDT,1582336807890000,1582336808012668,42387389,sell,9657.79,1 -binance-futures,BTCUSDT,1582336808439000,1582336808566515,42387390,buy,9658.03,0.097 -binance-futures,BTCUSDT,1582336808629000,1582336808754859,42387391,sell,9657.91,0.001 -binance-futures,BTCUSDT,1582336808669000,1582336808794756,42387392,buy,9658.02,2.01 -binance-futures,BTCUSDT,1582336808669000,1582336808798332,42387393,buy,9658.03,1.913 -binance-futures,BTCUSDT,1582336808669000,1582336808801075,42387394,buy,9658.04,0.001 -binance-futures,BTCUSDT,1582336808669000,1582336808801078,42387395,buy,9658.08,0.452 -binance-futures,BTCUSDT,1582336809166000,1582336809292155,42387396,sell,9658.07,0.001 -binance-futures,BTCUSDT,1582336809508000,1582336809632244,42387397,buy,9658.08,0.231 -binance-futures,BTCUSDT,1582336809508000,1582336809632253,42387398,buy,9658.1,0.1 -binance-futures,BTCUSDT,1582336809574000,1582336809708839,42387399,buy,9658.57,0.001 -binance-futures,BTCUSDT,1582336809574000,1582336809708847,42387400,buy,9658.59,0.001 -binance-futures,BTCUSDT,1582336809574000,1582336809708854,42387401,buy,9658.62,0.176 -binance-futures,BTCUSDT,1582336809574000,1582336809715099,42387402,buy,9658.76,0.001 -binance-futures,BTCUSDT,1582336809574000,1582336809715105,42387403,buy,9658.77,0.321 -binance-futures,BTCUSDT,1582336809710000,1582336809831378,42387404,buy,9658.56,0.001 -binance-futures,BTCUSDT,1582336810029000,1582336810151686,42387405,buy,9658.77,0.013 -binance-futures,BTCUSDT,1582336810354000,1582336810476700,42387406,buy,9658.77,0.68 -binance-futures,BTCUSDT,1582336810376000,1582336810499738,42387407,buy,9659.14,0.002 -binance-futures,BTCUSDT,1582336810376000,1582336810500756,42387408,buy,9659.15,1.998 -binance-futures,BTCUSDT,1582336810399000,1582336810525331,42387409,buy,9659.15,1.365 -binance-futures,BTCUSDT,1582336811466000,1582336811588848,42387410,buy,9660.73,0.126 -binance-futures,BTCUSDT,1582336812066000,1582336812190937,42387411,buy,9660.45,0.1 -binance-futures,BTCUSDT,1582336812066000,1582336812190941,42387412,buy,9660.73,0.085 -binance-futures,BTCUSDT,1582336812066000,1582336812193999,42387413,buy,9660.73,0.024 -binance-futures,BTCUSDT,1582336812271000,1582336812394830,42387414,sell,9659.38,0.031 -binance-futures,BTCUSDT,1582336812271000,1582336812394851,42387415,sell,9659.38,0.095 -binance-futures,BTCUSDT,1582336812454000,1582336812580085,42387416,buy,9660.7,0.252 -binance-futures,BTCUSDT,1582336812499000,1582336812620687,42387417,buy,9660.7,0.311 -binance-futures,BTCUSDT,1582336812499000,1582336812620697,42387418,buy,9660.72,0.024 -binance-futures,BTCUSDT,1582336812499000,1582336812623806,42387419,buy,9660.72,0.001 -binance-futures,BTCUSDT,1582336812499000,1582336812625447,42387420,buy,9660.73,0.129 -binance-futures,BTCUSDT,1582336812499000,1582336812625458,42387421,buy,9660.73,0.543 -binance-futures,BTCUSDT,1582336812597000,1582336812719892,42387422,buy,9660.73,0.126 -binance-futures,BTCUSDT,1582336812617000,1582336812738515,42387423,buy,9660.73,0.252 -binance-futures,BTCUSDT,1582336812650000,1582336812774367,42387424,buy,9660.73,0.252 -binance-futures,BTCUSDT,1582336812713000,1582336812836146,42387425,buy,9660.72,0.126 -binance-futures,BTCUSDT,1582336812717000,1582336812846447,42387426,buy,9660.73,0.504 -binance-futures,BTCUSDT,1582336812766000,1582336812888151,42387427,buy,9660.73,0.942 -binance-futures,BTCUSDT,1582336812766000,1582336812891918,42387428,buy,9660.74,0.066 -binance-futures,BTCUSDT,1582336812886000,1582336813007380,42387429,buy,9660.64,0.031 -binance-futures,BTCUSDT,1582336812886000,1582336813011361,42387430,buy,9660.65,0.03 -binance-futures,BTCUSDT,1582336812886000,1582336813011848,42387431,buy,9660.69,0.065 -binance-futures,BTCUSDT,1582336813242000,1582336813369617,42387432,sell,9658.57,0.002 -binance-futures,BTCUSDT,1582336813310000,1582336813432470,42387433,buy,9660.31,0.252 -binance-futures,BTCUSDT,1582336813388000,1582336813517492,42387434,buy,9660.61,0.001 -binance-futures,BTCUSDT,1582336813388000,1582336813517497,42387435,buy,9660.69,0.584 -binance-futures,BTCUSDT,1582336813388000,1582336813517537,42387436,buy,9660.69,0.65 -binance-futures,BTCUSDT,1582336813388000,1582336813517543,42387437,buy,9660.69,0.105 -binance-futures,BTCUSDT,1582336813493000,1582336813616867,42387438,buy,9660.18,0.67 -binance-futures,BTCUSDT,1582336813646000,1582336813765661,42387439,buy,9660.18,1.672 -binance-futures,BTCUSDT,1582336813743000,1582336813864892,42387440,buy,9660.18,0.418 -binance-futures,BTCUSDT,1582336813743000,1582336813864900,42387441,buy,9660.18,0.209 -binance-futures,BTCUSDT,1582336813802000,1582336813923064,42387442,buy,9660.18,0.67 -binance-futures,BTCUSDT,1582336813808000,1582336813929328,42387443,buy,9660.18,0.836 -binance-futures,BTCUSDT,1582336813909000,1582336814032843,42387444,buy,9660.18,0.281 -binance-futures,BTCUSDT,1582336813909000,1582336814037241,42387445,buy,9660.69,0.545 -binance-futures,BTCUSDT,1582336813909000,1582336814037764,42387446,buy,9660.69,0.65 -binance-futures,BTCUSDT,1582336813909000,1582336814039479,42387447,buy,9660.74,0.034 -binance-futures,BTCUSDT,1582336813909000,1582336814040292,42387448,buy,9660.79,0.1 -binance-futures,BTCUSDT,1582336813909000,1582336814041200,42387449,buy,9661.03,0.062 -binance-futures,BTCUSDT,1582336814025000,1582336814145218,42387450,buy,9661.03,0.209 -binance-futures,BTCUSDT,1582336814450000,1582336814573520,42387451,buy,9660.47,0.1 -binance-futures,BTCUSDT,1582336814450000,1582336814574143,42387452,buy,9660.51,0.318 -binance-futures,BTCUSDT,1582336814618000,1582336814742050,42387453,buy,9660.51,0.418 -binance-futures,BTCUSDT,1582336814937000,1582336815059334,42387454,buy,9660.21,0.082 -binance-futures,BTCUSDT,1582336814937000,1582336815062730,42387455,buy,9660.51,0.336 -binance-futures,BTCUSDT,1582336819572000,1582336819691415,42387456,buy,9660.5,0.04 -binance-futures,BTCUSDT,1582336821590000,1582336821716165,42387457,buy,9660.45,0.055 -binance-futures,BTCUSDT,1582336821590000,1582336821716172,42387458,buy,9660.45,0.054 -binance-futures,BTCUSDT,1582336821590000,1582336821716175,42387459,buy,9660.46,0.891 -binance-futures,BTCUSDT,1582336822366000,1582336822487023,42387460,buy,9660.46,0.047 -binance-futures,BTCUSDT,1582336824785000,1582336824907753,42387461,buy,9660.46,0.042 -binance-futures,BTCUSDT,1582336827561000,1582336827683070,42387462,buy,9660.46,1.097 -binance-futures,BTCUSDT,1582336827561000,1582336827684506,42387463,buy,9660.5,0.06 -binance-futures,BTCUSDT,1582336827588000,1582336827709499,42387464,buy,9661.03,0.001 -binance-futures,BTCUSDT,1582336827588000,1582336827711676,42387465,buy,9661.03,1.999 -binance-futures,BTCUSDT,1582336827592000,1582336827717384,42387466,buy,9661.03,2 -binance-futures,BTCUSDT,1582336827596000,1582336827720676,42387467,buy,9661.03,0.648 -binance-futures,BTCUSDT,1582336827615000,1582336827741497,42387468,buy,9661.2,0.047 -binance-futures,BTCUSDT,1582336829426000,1582336829557055,42387469,sell,9663.09,0.031 -binance-futures,BTCUSDT,1582336829426000,1582336829560893,42387470,sell,9663.08,0.031 -binance-futures,BTCUSDT,1582336829426000,1582336829560917,42387471,sell,9663.08,0.74 -binance-futures,BTCUSDT,1582336829426000,1582336829560930,42387472,sell,9663.07,0.031 -binance-futures,BTCUSDT,1582336829426000,1582336829564920,42387473,sell,9663.06,0.031 -binance-futures,BTCUSDT,1582336829426000,1582336829564936,42387474,sell,9663.05,0.031 -binance-futures,BTCUSDT,1582336829426000,1582336829567849,42387475,sell,9663.04,0.031 -binance-futures,BTCUSDT,1582336829426000,1582336829567857,42387476,sell,9663.03,0.031 -binance-futures,BTCUSDT,1582336829426000,1582336829567865,42387477,sell,9663.02,0.031 -binance-futures,BTCUSDT,1582336829426000,1582336829567872,42387478,sell,9663.01,0.031 -binance-futures,BTCUSDT,1582336829469000,1582336829591058,42387479,sell,9662.63,0.928 -binance-futures,BTCUSDT,1582336829506000,1582336829640846,42387480,sell,9662.02,0.031 -binance-futures,BTCUSDT,1582336829506000,1582336829640858,42387481,sell,9662.01,0.031 -binance-futures,BTCUSDT,1582336829506000,1582336829640861,42387482,sell,9662,0.031 -binance-futures,BTCUSDT,1582336829506000,1582336829640871,42387483,sell,9661.93,0.471 -binance-futures,BTCUSDT,1582336829506000,1582336829640874,42387484,sell,9661.93,0.471 -binance-futures,BTCUSDT,1582336830863000,1582336830992180,42387485,buy,9661.32,0.1 -binance-futures,BTCUSDT,1582336830863000,1582336830993240,42387486,buy,9662.74,0.258 -binance-futures,BTCUSDT,1582336831202000,1582336831344491,42387487,sell,9660.01,0.015 -binance-futures,BTCUSDT,1582336831792000,1582336831919353,42387488,buy,9661.97,0.004 -binance-futures,BTCUSDT,1582336831792000,1582336831922736,42387489,buy,9662.47,0.104 -binance-futures,BTCUSDT,1582336831886000,1582336832010662,42387490,sell,9660.1,0.016 -binance-futures,BTCUSDT,1582336834130000,1582336834252149,42387491,sell,9660,0.02 -binance-futures,BTCUSDT,1582336835512000,1582336835633259,42387492,buy,9660.76,0.1 -binance-futures,BTCUSDT,1582336836689000,1582336836814325,42387493,sell,9662,0.166 -binance-futures,BTCUSDT,1582336837621000,1582336837747802,42387494,sell,9662,0.016 -binance-futures,BTCUSDT,1582336844013000,1582336844136603,42387495,buy,9662.01,0.198 -binance-futures,BTCUSDT,1582336844623000,1582336844744672,42387496,buy,9661.69,0.521 -binance-futures,BTCUSDT,1582336844623000,1582336844746513,42387497,buy,9661.69,0.079 -binance-futures,BTCUSDT,1582336845961000,1582336846084149,42387498,sell,9660,0.002 -binance-futures,BTCUSDT,1582336848005000,1582336848125925,42387499,buy,9661.13,0.031 -binance-futures,BTCUSDT,1582336848005000,1582336848127846,42387500,buy,9661.14,0.031 -binance-futures,BTCUSDT,1582336848005000,1582336848129756,42387501,buy,9661.15,0.031 -binance-futures,BTCUSDT,1582336848005000,1582336848134587,42387502,buy,9661.16,0.031 -binance-futures,BTCUSDT,1582336848005000,1582336848134599,42387503,buy,9661.17,0.005 -binance-futures,BTCUSDT,1582336848005000,1582336848134602,42387504,buy,9661.18,0.031 -binance-futures,BTCUSDT,1582336848005000,1582336848140250,42387505,buy,9661.18,0.14 -binance-futures,BTCUSDT,1582336850200000,1582336850356040,42387506,buy,9660.77,0.1 -binance-futures,BTCUSDT,1582336850200000,1582336850357809,42387507,buy,9662.01,0.139 -binance-futures,BTCUSDT,1582336850973000,1582336851097090,42387508,buy,9661.97,0.031 -binance-futures,BTCUSDT,1582336850973000,1582336851097901,42387509,buy,9661.98,0.006 -binance-futures,BTCUSDT,1582336851258000,1582336851386747,42387510,buy,9661.96,0.001 -binance-futures,BTCUSDT,1582336852067000,1582336852190291,42387511,buy,9662.01,0.1 -binance-futures,BTCUSDT,1582336852495000,1582336852619488,42387512,sell,9660.7,0.433 -binance-futures,BTCUSDT,1582336855774000,1582336855897280,42387513,buy,9660.79,0.1 -binance-futures,BTCUSDT,1582336855774000,1582336855898639,42387514,buy,9662.01,0.092 -binance-futures,BTCUSDT,1582336858494000,1582336858621389,42387515,buy,9662.01,0.051 -binance-futures,BTCUSDT,1582336858577000,1582336858701844,42387516,sell,9660.67,0.016 -binance-futures,BTCUSDT,1582336858592000,1582336858715299,42387517,sell,9660.67,0.017 -binance-futures,BTCUSDT,1582336859638000,1582336859761684,42387518,buy,9662.01,0.102 -binance-futures,BTCUSDT,1582336860115000,1582336860237339,42387519,buy,9662.01,0.03 -binance-futures,BTCUSDT,1582336863596000,1582336863720202,42387520,buy,9662.01,0.1 -binance-futures,BTCUSDT,1582336865429000,1582336865551505,42387521,buy,9660.8,0.1 -binance-futures,BTCUSDT,1582336865582000,1582336865704043,42387522,sell,9661.35,0.031 -binance-futures,BTCUSDT,1582336865582000,1582336865704058,42387523,sell,9661.34,0.031 -binance-futures,BTCUSDT,1582336865582000,1582336865707539,42387524,sell,9661.33,0.031 -binance-futures,BTCUSDT,1582336865582000,1582336865710767,42387525,sell,9661.31,0.694 -binance-futures,BTCUSDT,1582336865586000,1582336865712747,42387526,sell,9661.31,0.184 -binance-futures,BTCUSDT,1582336865586000,1582336865714137,42387527,sell,9661.31,0.634 -binance-futures,BTCUSDT,1582336865595000,1582336865721984,42387528,sell,9661.38,0.621 -binance-futures,BTCUSDT,1582336869266000,1582336869388170,42387529,buy,9660.63,0.031 -binance-futures,BTCUSDT,1582336869266000,1582336869389927,42387530,buy,9660.64,0.031 -binance-futures,BTCUSDT,1582336869266000,1582336869392111,42387531,buy,9660.65,0.015 -binance-futures,BTCUSDT,1582336873519000,1582336873642473,42387532,buy,9660.68,0.13 -binance-futures,BTCUSDT,1582336873526000,1582336873649089,42387533,buy,9660.68,0.553 -binance-futures,BTCUSDT,1582336875032000,1582336875160241,42387534,buy,9661.11,1.9 -binance-futures,BTCUSDT,1582336875032000,1582336875160836,42387535,buy,9661.12,0.031 -binance-futures,BTCUSDT,1582336875032000,1582336875167195,42387536,buy,9661.37,0.1 -binance-futures,BTCUSDT,1582336875032000,1582336875169098,42387537,buy,9661.93,0.012 -binance-futures,BTCUSDT,1582336875032000,1582336875170799,42387538,buy,9662.01,0.068 -binance-futures,BTCUSDT,1582336875032000,1582336875172199,42387539,buy,9662.06,0.761 -binance-futures,BTCUSDT,1582336875708000,1582336875831874,42387540,buy,9662.06,0.19 -binance-futures,BTCUSDT,1582336875828000,1582336875952612,42387541,buy,9662.5,0.02 -binance-futures,BTCUSDT,1582336876037000,1582336876160228,42387542,buy,9662.51,3.39 -binance-futures,BTCUSDT,1582336876782000,1582336876908711,42387543,buy,9663.4,0.05 -binance-futures,BTCUSDT,1582336877174000,1582336877298756,42387544,buy,9663.4,0.033 -binance-futures,BTCUSDT,1582336877916000,1582336878037267,42387545,buy,9663.4,0.16 -binance-futures,BTCUSDT,1582336879600000,1582336879726295,42387546,sell,9663.51,0.027 -binance-futures,BTCUSDT,1582336882118000,1582336882240092,42387547,buy,9664.46,0.2 -binance-futures,BTCUSDT,1582336884619000,1582336884743255,42387548,sell,9663.39,0.03 -binance-futures,BTCUSDT,1582336897387000,1582336897511329,42387549,sell,9662.76,0.031 -binance-futures,BTCUSDT,1582336897387000,1582336897511340,42387550,sell,9662.76,0.146 -binance-futures,BTCUSDT,1582336897486000,1582336897608607,42387551,buy,9662.77,0.1 -binance-futures,BTCUSDT,1582336897486000,1582336897612643,42387552,buy,9663.61,1.752 -binance-futures,BTCUSDT,1582336897870000,1582336897995725,42387553,sell,9663.08,0.015 -binance-futures,BTCUSDT,1582336907802000,1582336907922662,42387554,sell,9663.07,0.031 -binance-futures,BTCUSDT,1582336907802000,1582336907922667,42387555,sell,9663.06,0.004 -binance-futures,BTCUSDT,1582336908655000,1582336908776263,42387556,sell,9662.95,0.031 -binance-futures,BTCUSDT,1582336908655000,1582336908777813,42387557,sell,9662.94,0.02 -binance-futures,BTCUSDT,1582336912569000,1582336912693149,42387558,buy,9662.3,0.031 -binance-futures,BTCUSDT,1582336912569000,1582336912694447,42387559,buy,9662.31,0.031 -binance-futures,BTCUSDT,1582336912569000,1582336912696386,42387560,buy,9662.32,0.031 -binance-futures,BTCUSDT,1582336913199000,1582336913322638,42387561,sell,9662.2,0.67 -binance-futures,BTCUSDT,1582336915038000,1582336915158718,42387562,sell,9661.23,0.109 -binance-futures,BTCUSDT,1582336919090000,1582336919212726,42387563,buy,9661.23,0.1 -binance-futures,BTCUSDT,1582336919618000,1582336919742664,42387564,sell,9661.98,0.283 -binance-futures,BTCUSDT,1582336919838000,1582336919957880,42387565,sell,9661.95,0.005 -binance-futures,BTCUSDT,1582336919838000,1582336919958624,42387566,sell,9661.47,0.419 -binance-futures,BTCUSDT,1582336919838000,1582336919961372,42387567,sell,9661.44,0.897 -binance-futures,BTCUSDT,1582336920976000,1582336921097500,42387568,buy,9663.49,0.004 -binance-futures,BTCUSDT,1582336920976000,1582336921098902,42387569,buy,9663.49,0.01 -binance-futures,BTCUSDT,1582336920976000,1582336921099743,42387570,buy,9663.5,0.051 -binance-futures,BTCUSDT,1582336922930000,1582336923049364,42387571,buy,9663.15,0.001 -binance-futures,BTCUSDT,1582336922930000,1582336923051505,42387572,buy,9663.16,0.929 -binance-futures,BTCUSDT,1582336925042000,1582336925162117,42387573,sell,9661.95,0.031 -binance-futures,BTCUSDT,1582336925042000,1582336925163903,42387574,sell,9661.95,0.038 -binance-futures,BTCUSDT,1582336927188000,1582336927311882,42387575,sell,9662.91,0.031 -binance-futures,BTCUSDT,1582336927188000,1582336927312744,42387576,sell,9662.9,0.018 -binance-futures,BTCUSDT,1582336928996000,1582336929116686,42387577,sell,9662.63,0.031 -binance-futures,BTCUSDT,1582336928996000,1582336929117436,42387578,sell,9662.58,0.005 -binance-futures,BTCUSDT,1582336928996000,1582336929119307,42387579,sell,9662.58,0.047 -binance-futures,BTCUSDT,1582336930630000,1582336930751748,42387580,sell,9661.21,1.064 -binance-futures,BTCUSDT,1582336931015000,1582336931134235,42387581,sell,9661.21,0.002 -binance-futures,BTCUSDT,1582336931135000,1582336931258591,42387582,sell,9661.21,1.468 -binance-futures,BTCUSDT,1582336943651000,1582336943776197,42387583,sell,9661.68,0.67 -binance-futures,BTCUSDT,1582336943658000,1582336943785173,42387584,sell,9661.68,0.014 -binance-futures,BTCUSDT,1582336943707000,1582336943830717,42387585,sell,9661.21,0.01 -binance-futures,BTCUSDT,1582336945041000,1582336945165297,42387586,sell,9661.21,0.456 -binance-futures,BTCUSDT,1582336945465000,1582336945586809,42387587,sell,9660.99,0.72 -binance-futures,BTCUSDT,1582336945496000,1582336945618724,42387588,sell,9660.99,0.28 -binance-futures,BTCUSDT,1582336945496000,1582336945621554,42387589,sell,9660.65,0.01 -binance-futures,BTCUSDT,1582336945499000,1582336945624757,42387590,sell,9660.55,1 -binance-futures,BTCUSDT,1582336945523000,1582336945653817,42387591,sell,9660.06,0.013 -binance-futures,BTCUSDT,1582336945523000,1582336945656344,42387592,sell,9660,0.195 -binance-futures,BTCUSDT,1582336945555000,1582336945680114,42387593,sell,9659.81,0.001 -binance-futures,BTCUSDT,1582336945555000,1582336945682238,42387594,sell,9659.8,1.999 -binance-futures,BTCUSDT,1582336945569000,1582336945693725,42387595,sell,9659.8,0.329 -binance-futures,BTCUSDT,1582336946805000,1582336946925398,42387596,sell,9659.33,0.72 -binance-futures,BTCUSDT,1582336946809000,1582336946933337,42387597,sell,9659.33,0.68 -binance-futures,BTCUSDT,1582336946821000,1582336946943905,42387598,sell,9659.33,0.67 -binance-futures,BTCUSDT,1582336946823000,1582336946943922,42387599,sell,9659.33,0.74 -binance-futures,BTCUSDT,1582336946832000,1582336946953500,42387600,sell,9659.33,2 -binance-futures,BTCUSDT,1582336946852000,1582336946974931,42387601,sell,9659.33,0.366 -binance-futures,BTCUSDT,1582336948153000,1582336948275635,42387602,buy,9658.04,0.011 -binance-futures,BTCUSDT,1582336948928000,1582336949052187,42387603,sell,9658.03,1 -binance-futures,BTCUSDT,1582336949213000,1582336949353215,42387604,sell,9658.03,0.391 -binance-futures,BTCUSDT,1582336949498000,1582336949620035,42387605,sell,9658.03,0.456 -binance-futures,BTCUSDT,1582336953286000,1582336953412262,42387606,sell,9658.03,0.621 -binance-futures,BTCUSDT,1582336953292000,1582336953419623,42387607,sell,9658.03,3.935 -binance-futures,BTCUSDT,1582336953292000,1582336953419867,42387608,sell,9658.03,1.035 -binance-futures,BTCUSDT,1582336953599000,1582336953719590,42387609,buy,9658.04,0.02 -binance-futures,BTCUSDT,1582336953599000,1582336953721185,42387610,buy,9658.04,0.1 -binance-futures,BTCUSDT,1582336953599000,1582336953721193,42387611,buy,9658.04,2.09 -binance-futures,BTCUSDT,1582336953599000,1582336953721196,42387612,buy,9658.04,0.1 -binance-futures,BTCUSDT,1582336953599000,1582336953721200,42387613,buy,9658.04,0.04 -binance-futures,BTCUSDT,1582336953599000,1582336953721203,42387614,buy,9658.05,0.451 -binance-futures,BTCUSDT,1582336953599000,1582336953724991,42387615,buy,9659.17,0.023 -binance-futures,BTCUSDT,1582336953599000,1582336953725000,42387616,buy,9659.19,0.032 -binance-futures,BTCUSDT,1582336956859000,1582336956980994,42387617,sell,9658.03,0.076 -binance-futures,BTCUSDT,1582336958338000,1582336958460057,42387618,sell,9658.03,1.227 -binance-futures,BTCUSDT,1582336960897000,1582336961024147,42387619,buy,9658.04,0.031 -binance-futures,BTCUSDT,1582336960897000,1582336961024156,42387620,buy,9658.04,0.069 -binance-futures,BTCUSDT,1582336961881000,1582336962008100,42387621,buy,9658.04,0.1 -binance-futures,BTCUSDT,1582336962761000,1582336962879927,42387622,buy,9658.04,0.029 -binance-futures,BTCUSDT,1582336965092000,1582336965210921,42387623,sell,9658.03,0.621 -binance-futures,BTCUSDT,1582336965094000,1582336965216964,42387624,sell,9658.03,0.847 -binance-futures,BTCUSDT,1582336965094000,1582336965216973,42387625,sell,9658.03,0.188 -binance-futures,BTCUSDT,1582336965109000,1582336965230328,42387626,sell,9658.03,0.522 -binance-futures,BTCUSDT,1582336965109000,1582336965230632,42387627,sell,9658.03,0.67 -binance-futures,BTCUSDT,1582336965109000,1582336965230639,42387628,sell,9658.03,0.1 -binance-futures,BTCUSDT,1582336965109000,1582336965230844,42387629,sell,9657.55,0.427 -binance-futures,BTCUSDT,1582336967992000,1582336968113805,42387630,sell,9656.02,0.476 -binance-futures,BTCUSDT,1582336968265000,1582336968390924,42387631,sell,9656,1 -binance-futures,BTCUSDT,1582336968265000,1582336968390933,42387632,sell,9656,0.075 -binance-futures,BTCUSDT,1582336968290000,1582336968414778,42387633,sell,9655.81,1.966 -binance-futures,BTCUSDT,1582336968315000,1582336968443607,42387634,sell,9655.41,0.047 -binance-futures,BTCUSDT,1582336968315000,1582336968443620,42387635,sell,9655.41,1.953 -binance-futures,BTCUSDT,1582336968315000,1582336968443624,42387636,sell,9655.41,0.011 -binance-futures,BTCUSDT,1582336968340000,1582336968476144,42387637,sell,9655,0.332 -binance-futures,BTCUSDT,1582336968340000,1582336968479343,42387638,sell,9655,0.4 -binance-futures,BTCUSDT,1582336968340000,1582336968479352,42387639,sell,9655,1 -binance-futures,BTCUSDT,1582336968340000,1582336968479357,42387640,sell,9655,0.268 -binance-futures,BTCUSDT,1582336968342000,1582336968479853,42387641,sell,9655,2 -binance-futures,BTCUSDT,1582336968368000,1582336968493941,42387642,sell,9655,2.301 -binance-futures,BTCUSDT,1582336968369000,1582336968494394,42387643,buy,9655.35,0.1 -binance-futures,BTCUSDT,1582336968373000,1582336968501200,42387644,sell,9655,1.161 -binance-futures,BTCUSDT,1582336968399000,1582336968529086,42387645,sell,9654.8,1 -binance-futures,BTCUSDT,1582336968399000,1582336968529095,42387646,sell,9654.8,1 -binance-futures,BTCUSDT,1582336968423000,1582336968543878,42387647,sell,9654.8,2 -binance-futures,BTCUSDT,1582336968428000,1582336968551534,42387648,sell,9654.8,0.384 -binance-futures,BTCUSDT,1582336968428000,1582336968551546,42387649,sell,9654.76,0.038 -binance-futures,BTCUSDT,1582336968657000,1582336968778722,42387650,sell,9654.62,0.012 -binance-futures,BTCUSDT,1582336968657000,1582336968779150,42387651,sell,9654.62,0.444 -binance-futures,BTCUSDT,1582336968730000,1582336968852859,42387652,sell,9654.62,0.166 -binance-futures,BTCUSDT,1582336969390000,1582336969515898,42387653,sell,9654.58,0.04 -binance-futures,BTCUSDT,1582336969390000,1582336969515901,42387654,sell,9654.45,0.047 -binance-futures,BTCUSDT,1582336969958000,1582336970080028,42387655,sell,9654.21,0.2 -binance-futures,BTCUSDT,1582336970453000,1582336970572767,42387656,sell,9654.29,0.16 -binance-futures,BTCUSDT,1582336971057000,1582336971181778,42387657,sell,9654.29,0.997 -binance-futures,BTCUSDT,1582336971057000,1582336971183430,42387658,sell,9654.29,0.1 -binance-futures,BTCUSDT,1582336971057000,1582336971183442,42387659,sell,9654.29,0.126 -binance-futures,BTCUSDT,1582336971057000,1582336971183446,42387660,sell,9654.29,0.617 -binance-futures,BTCUSDT,1582336971057000,1582336971183449,42387661,sell,9654.15,0.852 -binance-futures,BTCUSDT,1582336971057000,1582336971186102,42387662,sell,9654.15,0.031 -binance-futures,BTCUSDT,1582336971057000,1582336971186109,42387663,sell,9654.15,0.069 -binance-futures,BTCUSDT,1582336971057000,1582336971186112,42387664,sell,9654.07,5.09 -binance-futures,BTCUSDT,1582336971057000,1582336971188166,42387665,sell,9654.07,0.018 -binance-futures,BTCUSDT,1582336971057000,1582336971190854,42387666,sell,9654,0.2 -binance-futures,BTCUSDT,1582336971057000,1582336971190863,42387667,sell,9654,0.214 -binance-futures,BTCUSDT,1582336971057000,1582336971192528,42387668,sell,9653.93,1.568 -binance-futures,BTCUSDT,1582336971057000,1582336971192579,42387669,sell,9653.93,0.003 -binance-futures,BTCUSDT,1582336971057000,1582336971193865,42387670,buy,9654.3,0.03 -binance-futures,BTCUSDT,1582336971057000,1582336971193876,42387671,buy,9654.3,0.1 -binance-futures,BTCUSDT,1582336971057000,1582336971194680,42387672,buy,9654.67,0.37 -binance-futures,BTCUSDT,1582336971057000,1582336971194691,42387673,buy,9654.67,0.002 -binance-futures,BTCUSDT,1582336971675000,1582336971796502,42387674,sell,9654,1 -binance-futures,BTCUSDT,1582336971887000,1582336972006292,42387675,buy,9654.17,0.391 -binance-futures,BTCUSDT,1582336971900000,1582336972023266,42387676,sell,9654.16,0.08 -binance-futures,BTCUSDT,1582336971900000,1582336972026501,42387677,sell,9654.16,0.011 -binance-futures,BTCUSDT,1582336973609000,1582336973745550,42387678,sell,9654.12,2.043 -binance-futures,BTCUSDT,1582336973638000,1582336973758813,42387679,sell,9654.12,0.078 -binance-futures,BTCUSDT,1582336974498000,1582336974618851,42387680,sell,9654.32,0.031 -binance-futures,BTCUSDT,1582336974498000,1582336974624810,42387681,sell,9654.31,0.031 -binance-futures,BTCUSDT,1582336974498000,1582336974625047,42387682,sell,9654.3,0.206 -binance-futures,BTCUSDT,1582336974498000,1582336974625053,42387683,sell,9654.3,0.031 -binance-futures,BTCUSDT,1582336974498000,1582336974625697,42387684,sell,9654.3,1.265 -binance-futures,BTCUSDT,1582336976411000,1582336976528332,42387685,sell,9654.19,0.003 -binance-futures,BTCUSDT,1582336976411000,1582336976529418,42387686,sell,9654.12,0.67 -binance-futures,BTCUSDT,1582336976411000,1582336976535630,42387687,sell,9654.12,0.33 -binance-futures,BTCUSDT,1582336976411000,1582336976535641,42387688,sell,9653.94,0.291 -binance-futures,BTCUSDT,1582336976413000,1582336976549862,42387689,sell,9653.94,0.267 -binance-futures,BTCUSDT,1582336976413000,1582336976549867,42387690,sell,9653.94,0.558 -binance-futures,BTCUSDT,1582336976413000,1582336976549872,42387691,sell,9653.94,0.558 -binance-futures,BTCUSDT,1582336976413000,1582336976549876,42387692,sell,9653.92,0.121 -binance-futures,BTCUSDT,1582336976413000,1582336976549891,42387693,sell,9653.69,0.04 -binance-futures,BTCUSDT,1582336976413000,1582336976552539,42387694,sell,9653.66,0.32 -binance-futures,BTCUSDT,1582336976503000,1582336976623455,42387695,buy,9654.09,0.048 -binance-futures,BTCUSDT,1582336976594000,1582336976716753,42387696,sell,9653.44,0.001 -binance-futures,BTCUSDT,1582336978774000,1582336978899261,42387697,sell,9653.52,2 -binance-futures,BTCUSDT,1582336978775000,1582336978899268,42387698,sell,9653.44,0.039 -binance-futures,BTCUSDT,1582336978775000,1582336978901595,42387699,sell,9653.26,0.04 -binance-futures,BTCUSDT,1582336978775000,1582336978905890,42387700,sell,9653.24,0.002 -binance-futures,BTCUSDT,1582336978775000,1582336978907494,42387701,sell,9653.15,0.009 -binance-futures,BTCUSDT,1582336978775000,1582336978909974,42387702,sell,9653.08,0.012 -binance-futures,BTCUSDT,1582336978775000,1582336978912758,42387703,sell,9653.07,3.462 -binance-futures,BTCUSDT,1582336979349000,1582336979471795,42387704,sell,9653.14,0.002 -binance-futures,BTCUSDT,1582336979349000,1582336979473014,42387705,sell,9653.14,0.198 -binance-futures,BTCUSDT,1582336979567000,1582336979688096,42387706,sell,9653.14,0.16 -binance-futures,BTCUSDT,1582336981304000,1582336981425647,42387707,buy,9654.7,0.1 -binance-futures,BTCUSDT,1582336981304000,1582336981431143,42387708,buy,9654.8,0.95 -binance-futures,BTCUSDT,1582336981830000,1582336981954188,42387709,buy,9654.75,0.005 -binance-futures,BTCUSDT,1582336982638000,1582336982759843,42387710,buy,9654.51,0.74 -binance-futures,BTCUSDT,1582336982643000,1582336982764218,42387711,buy,9654.51,0.67 -binance-futures,BTCUSDT,1582336982645000,1582336982765641,42387712,buy,9654.51,0.67 -binance-futures,BTCUSDT,1582336982645000,1582336982765653,42387713,buy,9654.51,0.68 -binance-futures,BTCUSDT,1582336982647000,1582336982772092,42387714,buy,9654.51,0.231 -binance-futures,BTCUSDT,1582336982647000,1582336982772100,42387715,buy,9654.85,0.012 -binance-futures,BTCUSDT,1582336983273000,1582336983406742,42387716,buy,9655.27,0.001 -binance-futures,BTCUSDT,1582336983273000,1582336983407186,42387717,buy,9655.27,0.018 -binance-futures,BTCUSDT,1582336987701000,1582336987820341,42387718,sell,9655.26,0.279 -binance-futures,BTCUSDT,1582336990015000,1582336990137839,42387719,sell,9655.26,0.721 -binance-futures,BTCUSDT,1582336990015000,1582336990139753,42387720,sell,9654.21,4.241 -binance-futures,BTCUSDT,1582336990015000,1582336990142197,42387721,sell,9654.03,0.033 -binance-futures,BTCUSDT,1582336990015000,1582336990142203,42387722,sell,9653.92,0.005 -binance-futures,BTCUSDT,1582336991595000,1582336991718835,42387723,sell,9654.1,0.011 -binance-futures,BTCUSDT,1582336991870000,1582336991997153,42387724,buy,9654.77,0.008 -binance-futures,BTCUSDT,1582336991870000,1582336991997156,42387725,buy,9654.78,0.482 -binance-futures,BTCUSDT,1582336991878000,1582336992001122,42387726,buy,9654.78,0.01 -binance-futures,BTCUSDT,1582336995486000,1582336995612146,42387727,sell,9654.74,0.001 -binance-futures,BTCUSDT,1582336997220000,1582336997353621,42387728,buy,9654.75,0.001 -binance-futures,BTCUSDT,1582336997848000,1582336997965752,42387729,buy,9654.75,1.157 -binance-futures,BTCUSDT,1582336997866000,1582336997985138,42387730,buy,9654.75,0.359 -binance-futures,BTCUSDT,1582336997868000,1582336997985145,42387731,buy,9654.75,0.4 -binance-futures,BTCUSDT,1582336997884000,1582336998004709,42387732,buy,9654.75,0.1 -binance-futures,BTCUSDT,1582336997884000,1582336998004713,42387733,buy,9654.75,0.15 -binance-futures,BTCUSDT,1582336997884000,1582336998004721,42387734,buy,9654.75,0.15 -binance-futures,BTCUSDT,1582336997884000,1582336998004724,42387735,buy,9654.75,0.45 -binance-futures,BTCUSDT,1582336997890000,1582336998010737,42387736,buy,9654.75,0.05 -binance-futures,BTCUSDT,1582336997908000,1582336998029676,42387737,buy,9654.75,0.136 -binance-futures,BTCUSDT,1582336998778000,1582336998899182,42387738,sell,9655.25,0.001 -binance-futures,BTCUSDT,1582336999676000,1582336999798656,42387739,sell,9655.25,0.001 -binance-futures,BTCUSDT,1582337000264000,1582337000385015,42387740,buy,9655.26,0.05 -binance-futures,BTCUSDT,1582337000370000,1582337000490877,42387741,buy,9655.26,0.001 -binance-futures,BTCUSDT,1582337000747000,1582337000865026,42387742,buy,9655.26,0.315 -binance-futures,BTCUSDT,1582337003381000,1582337003503384,42387743,sell,9655.26,2 -binance-futures,BTCUSDT,1582337003439000,1582337003561473,42387744,buy,9655.27,0.001 -binance-futures,BTCUSDT,1582337004139000,1582337004260989,42387745,buy,9655.23,0.031 -binance-futures,BTCUSDT,1582337004139000,1582337004263941,42387746,buy,9655.24,0.031 -binance-futures,BTCUSDT,1582337004139000,1582337004263951,42387747,buy,9655.25,0.001 -binance-futures,BTCUSDT,1582337005750000,1582337005871875,42387748,buy,9655.26,0.031 -binance-futures,BTCUSDT,1582337005750000,1582337005874351,42387749,buy,9655.27,0.031 -binance-futures,BTCUSDT,1582337005750000,1582337005880299,42387750,buy,9655.28,0.188 -binance-futures,BTCUSDT,1582337006088000,1582337006210083,42387751,buy,9655.19,0.001 -binance-futures,BTCUSDT,1582337006728000,1582337006852658,42387752,buy,9655.17,0.031 -binance-futures,BTCUSDT,1582337006728000,1582337006855799,42387753,buy,9655.18,0.014 -binance-futures,BTCUSDT,1582337006825000,1582337006949522,42387754,buy,9655.1,0.031 -binance-futures,BTCUSDT,1582337006825000,1582337006949527,42387755,buy,9655.11,0.031 -binance-futures,BTCUSDT,1582337006825000,1582337006949532,42387756,buy,9655.12,0.031 -binance-futures,BTCUSDT,1582337006825000,1582337006951725,42387757,buy,9655.18,0.017 -binance-futures,BTCUSDT,1582337006825000,1582337006955308,42387758,buy,9655.19,0.031 -binance-futures,BTCUSDT,1582337008450000,1582337008570947,42387759,buy,9655.49,0.539 -binance-futures,BTCUSDT,1582337008450000,1582337008571159,42387760,buy,9655.56,0.461 -binance-futures,BTCUSDT,1582337008514000,1582337008636031,42387761,buy,9655.56,0.017 -binance-futures,BTCUSDT,1582337008717000,1582337008844383,42387762,buy,9655.82,0.001 -binance-futures,BTCUSDT,1582337011427000,1582337011551524,42387763,buy,9655.68,0.001 -binance-futures,BTCUSDT,1582337011879000,1582337011999655,42387764,buy,9655.68,0.099 -binance-futures,BTCUSDT,1582337011879000,1582337012001932,42387765,buy,9655.82,0.682 -binance-futures,BTCUSDT,1582337011879000,1582337012002490,42387766,buy,9655.9,1.286 -binance-futures,BTCUSDT,1582337011968000,1582337012093459,42387767,sell,9655.91,0.1 -binance-futures,BTCUSDT,1582337012365000,1582337012489858,42387768,buy,9656.19,1 -binance-futures,BTCUSDT,1582337012375000,1582337012497822,42387769,buy,9656.19,0.001 -binance-futures,BTCUSDT,1582337013052000,1582337013176964,42387770,sell,9656.09,0.766 -binance-futures,BTCUSDT,1582337014164000,1582337014288856,42387771,buy,9656.12,0.001 -binance-futures,BTCUSDT,1582337016958000,1582337017081258,42387772,buy,9656.14,0.001 -binance-futures,BTCUSDT,1582337019544000,1582337019668045,42387773,buy,9657.02,0.001 -binance-futures,BTCUSDT,1582337020457000,1582337020576168,42387774,buy,9657.02,0.478 -binance-futures,BTCUSDT,1582337020676000,1582337020798619,42387775,buy,9657.02,0.006 -binance-futures,BTCUSDT,1582337020973000,1582337021093723,42387776,sell,9657.01,0.35 -binance-futures,BTCUSDT,1582337021045000,1582337021171327,42387777,buy,9657.02,0.5 -binance-futures,BTCUSDT,1582337022090000,1582337022208292,42387778,buy,9657.08,0.001 -binance-futures,BTCUSDT,1582337023660000,1582337023783525,42387779,buy,9657.08,0.099 -binance-futures,BTCUSDT,1582337023660000,1582337023785528,42387780,buy,9657.08,0.043 -binance-futures,BTCUSDT,1582337024582000,1582337024706879,42387781,buy,9657.83,0.001 -binance-futures,BTCUSDT,1582337027197000,1582337027316166,42387782,buy,9657.78,0.001 -binance-futures,BTCUSDT,1582337029295000,1582337029415395,42387783,buy,9657.04,0.025 -binance-futures,BTCUSDT,1582337029295000,1582337029417642,42387784,buy,9657.05,0.031 -binance-futures,BTCUSDT,1582337029295000,1582337029421492,42387785,buy,9657.06,0.031 -binance-futures,BTCUSDT,1582337029295000,1582337029425100,42387786,buy,9657.07,0.031 -binance-futures,BTCUSDT,1582337029295000,1582337029429183,42387787,buy,9657.09,0.089 -binance-futures,BTCUSDT,1582337029300000,1582337029433042,42387788,buy,9657.09,0.011 -binance-futures,BTCUSDT,1582337029300000,1582337029434216,42387789,buy,9657.43,0.196 -binance-futures,BTCUSDT,1582337029300000,1582337029434228,42387790,buy,9657.43,0.008 -binance-futures,BTCUSDT,1582337029308000,1582337029436295,42387791,buy,9657.43,0.207 -binance-futures,BTCUSDT,1582337029618000,1582337029741097,42387792,sell,9657.51,0.002 -binance-futures,BTCUSDT,1582337030068000,1582337030190191,42387793,buy,9657.83,0.001 -binance-futures,BTCUSDT,1582337033010000,1582337033133321,42387794,buy,9657.61,0.001 -binance-futures,BTCUSDT,1582337033753000,1582337033878720,42387795,sell,9657.6,0.031 -binance-futures,BTCUSDT,1582337033753000,1582337033878725,42387796,sell,9657.59,0.017 -binance-futures,BTCUSDT,1582337035964000,1582337036085111,42387797,buy,9657.61,0.612 -binance-futures,BTCUSDT,1582337036034000,1582337036156260,42387798,buy,9657.61,0.248 -binance-futures,BTCUSDT,1582337036124000,1582337036244468,42387799,buy,9657.74,0.137 -binance-futures,BTCUSDT,1582337036848000,1582337036969834,42387800,buy,9658.1,2.052 -binance-futures,BTCUSDT,1582337036887000,1582337037008746,42387801,buy,9658.23,0.509 -binance-futures,BTCUSDT,1582337037501000,1582337037622611,42387802,sell,9658.52,0.006 -binance-futures,BTCUSDT,1582337037625000,1582337037744974,42387803,buy,9658.58,0.004 -binance-futures,BTCUSDT,1582337037824000,1582337037943802,42387804,buy,9658.46,0.004 -binance-futures,BTCUSDT,1582337037848000,1582337037970473,42387805,buy,9658.46,0.009 -binance-futures,BTCUSDT,1582337038126000,1582337038249833,42387806,buy,9658.38,0.001 -binance-futures,BTCUSDT,1582337038506000,1582337038627355,42387807,sell,9656.35,0.002 -binance-futures,BTCUSDT,1582337039597000,1582337039716684,42387808,buy,9657.78,0.001 -binance-futures,BTCUSDT,1582337040474000,1582337040595765,42387809,buy,9657.79,0.945 -binance-futures,BTCUSDT,1582337041159000,1582337041288421,42387810,sell,9657.63,0.002 -binance-futures,BTCUSDT,1582337041884000,1582337042008532,42387811,buy,9657.59,0.207 -binance-futures,BTCUSDT,1582337041884000,1582337042011017,42387812,buy,9657.59,0.188 -binance-futures,BTCUSDT,1582337041884000,1582337042011546,42387813,buy,9657.59,0.432 -binance-futures,BTCUSDT,1582337041886000,1582337042011553,42387814,buy,9657.59,0.207 -binance-futures,BTCUSDT,1582337041890000,1582337042013547,42387815,buy,9657.59,0.207 -binance-futures,BTCUSDT,1582337042069000,1582337042190388,42387816,buy,9657.59,0.249 -binance-futures,BTCUSDT,1582337042985000,1582337043107768,42387817,buy,9657.64,0.577 -binance-futures,BTCUSDT,1582337042985000,1582337043108847,42387818,buy,9657.64,0.413 -binance-futures,BTCUSDT,1582337043042000,1582337043162779,42387819,buy,9657.64,0.166 -binance-futures,BTCUSDT,1582337044115000,1582337044231334,42387820,buy,9657.64,0.251 -binance-futures,BTCUSDT,1582337044964000,1582337045091404,42387821,buy,9658.37,0.2 -binance-futures,BTCUSDT,1582337045139000,1582337045260961,42387822,buy,9658.37,0.68 -binance-futures,BTCUSDT,1582337046709000,1582337046830282,42387823,sell,9658.36,0.1 -binance-futures,BTCUSDT,1582337046710000,1582337046830515,42387824,sell,9658.36,0.004 -binance-futures,BTCUSDT,1582337046710000,1582337046830523,42387825,sell,9658.36,0.083 -binance-futures,BTCUSDT,1582337046711000,1582337046832956,42387826,sell,9658.36,0.104 -binance-futures,BTCUSDT,1582337047634000,1582337047757469,42387827,buy,9658.37,0.207 -binance-futures,BTCUSDT,1582337047636000,1582337047759294,42387828,buy,9658.37,0.207 -binance-futures,BTCUSDT,1582337048757000,1582337048877045,42387829,buy,9658.36,0.683 -binance-futures,BTCUSDT,1582337048785000,1582337048907860,42387830,buy,9658.79,2 -binance-futures,BTCUSDT,1582337048785000,1582337048911619,42387831,buy,9658.79,1.42 -binance-futures,BTCUSDT,1582337048785000,1582337048911630,42387832,buy,9658.87,0.012 -binance-futures,BTCUSDT,1582337048813000,1582337048942259,42387833,buy,9659.4,0.1 -binance-futures,BTCUSDT,1582337048813000,1582337048942267,42387834,buy,9659.4,1.9 -binance-futures,BTCUSDT,1582337048819000,1582337048946777,42387835,buy,9659,2 -binance-futures,BTCUSDT,1582337048840000,1582337048964837,42387836,buy,9659.04,2 -binance-futures,BTCUSDT,1582337048842000,1582337048967244,42387837,buy,9659.04,1.668 -binance-futures,BTCUSDT,1582337048864000,1582337048988330,42387838,buy,9659.85,2 -binance-futures,BTCUSDT,1582337048866000,1582337048990494,42387839,buy,9659.85,1.02 -binance-futures,BTCUSDT,1582337048917000,1582337049042486,42387840,buy,9660.67,0.047 -binance-futures,BTCUSDT,1582337048917000,1582337049042495,42387841,buy,9660.67,1.953 -binance-futures,BTCUSDT,1582337049129000,1582337049269634,42387842,buy,9660.67,0.227 -binance-futures,BTCUSDT,1582337051176000,1582337051296920,42387843,buy,9660.67,0.64 -binance-futures,BTCUSDT,1582337051196000,1582337051319710,42387844,buy,9660.67,1.181 -binance-futures,BTCUSDT,1582337051196000,1582337051320028,42387845,buy,9660.86,0.012 -binance-futures,BTCUSDT,1582337051219000,1582337051344681,42387846,buy,9661.2,0.047 -binance-futures,BTCUSDT,1582337051219000,1582337051346345,42387847,buy,9661.2,1.953 -binance-futures,BTCUSDT,1582337051256000,1582337051380406,42387848,buy,9661.2,2 -binance-futures,BTCUSDT,1582337052013000,1582337052131725,42387849,buy,9661.2,0.13 -binance-futures,BTCUSDT,1582337056604000,1582337056728000,42387850,buy,9661.61,0.023 -binance-futures,BTCUSDT,1582337056604000,1582337056728018,42387851,buy,9661.61,0.023 -binance-futures,BTCUSDT,1582337056604000,1582337056728144,42387852,buy,9661.71,0.004 -binance-futures,BTCUSDT,1582337056714000,1582337056838052,42387853,buy,9661.71,0.096 -binance-futures,BTCUSDT,1582337056714000,1582337056841967,42387854,buy,9661.89,0.064 -binance-futures,BTCUSDT,1582337061984000,1582337062105846,42387855,buy,9661.31,0.1 -binance-futures,BTCUSDT,1582337062060000,1582337062183296,42387856,buy,9661.61,0.72 -binance-futures,BTCUSDT,1582337062060000,1582337062187487,42387857,buy,9661.61,0.67 -binance-futures,BTCUSDT,1582337062060000,1582337062187496,42387858,buy,9661.61,0.68 -binance-futures,BTCUSDT,1582337062060000,1582337062187501,42387859,buy,9661.62,0.013 -binance-futures,BTCUSDT,1582337062060000,1582337062189421,42387860,buy,9661.63,0.012 -binance-futures,BTCUSDT,1582337062060000,1582337062192350,42387861,buy,9661.64,0.194 -binance-futures,BTCUSDT,1582337062060000,1582337062193759,42387862,buy,9661.68,0.613 -binance-futures,BTCUSDT,1582337062060000,1582337062195266,42387863,buy,9661.68,0.17 -binance-futures,BTCUSDT,1582337064873000,1582337064997518,42387864,buy,9661.19,0.044 -binance-futures,BTCUSDT,1582337064873000,1582337064998293,42387865,buy,9661.64,0.008 -binance-futures,BTCUSDT,1582337064873000,1582337065003478,42387866,buy,9661.64,0.027 -binance-futures,BTCUSDT,1582337066593000,1582337066716286,42387867,buy,9661.97,0.032 -binance-futures,BTCUSDT,1582337067553000,1582337067676076,42387868,sell,9661.21,0.006 -binance-futures,BTCUSDT,1582337068320000,1582337068466069,42387869,buy,9662.08,0.095 -binance-futures,BTCUSDT,1582337068320000,1582337068466081,42387870,buy,9662.1,0.005 -binance-futures,BTCUSDT,1582337070496000,1582337070625874,42387871,buy,9661.21,0.1 -binance-futures,BTCUSDT,1582337070585000,1582337070709559,42387872,buy,9662.1,0.62 -binance-futures,BTCUSDT,1582337070588000,1582337070711168,42387873,buy,9662.1,0.67 -binance-futures,BTCUSDT,1582337071252000,1582337071377724,42387874,buy,9662.44,0.68 -binance-futures,BTCUSDT,1582337073666000,1582337073787268,42387875,sell,9662.79,0.012 -binance-futures,BTCUSDT,1582337075503000,1582337075625620,42387876,sell,9663.58,0.02 -binance-futures,BTCUSDT,1582337075601000,1582337075720661,42387877,buy,9663.6,0.001 -binance-futures,BTCUSDT,1582337076583000,1582337076716028,42387878,buy,9664,0.121 -binance-futures,BTCUSDT,1582337076626000,1582337076753770,42387879,buy,9664.29,0.179 -binance-futures,BTCUSDT,1582337076755000,1582337076878988,42387880,sell,9664.27,0.01 -binance-futures,BTCUSDT,1582337077638000,1582337077758989,42387881,buy,9664.29,0.1 -binance-futures,BTCUSDT,1582337078546000,1582337078667239,42387882,buy,9664.29,0.336 -binance-futures,BTCUSDT,1582337080641000,1582337080764640,42387883,buy,9664.29,0.005 -binance-futures,BTCUSDT,1582337080883000,1582337081004069,42387884,sell,9664.28,0.03 -binance-futures,BTCUSDT,1582337080883000,1582337081004503,42387885,sell,9664.28,0.094 -binance-futures,BTCUSDT,1582337084015000,1582337084137915,42387886,buy,9663.5,0.04 -binance-futures,BTCUSDT,1582337084353000,1582337084476993,42387887,buy,9664.2,1 -binance-futures,BTCUSDT,1582337084353000,1582337084479883,42387888,buy,9664.29,1.386 -binance-futures,BTCUSDT,1582337088280000,1582337088401890,42387889,buy,9663.9,0.003 -binance-futures,BTCUSDT,1582337092928000,1582337093046294,42387890,sell,9662.34,0.005 -binance-futures,BTCUSDT,1582337092928000,1582337093046305,42387891,sell,9661.81,0.433 -binance-futures,BTCUSDT,1582337092928000,1582337093052036,42387892,sell,9661.79,0.001 -binance-futures,BTCUSDT,1582337096535000,1582337096657684,42387893,buy,9663.1,0.001 -binance-futures,BTCUSDT,1582337099426000,1582337099550778,42387894,buy,9663.1,0.001 -binance-futures,BTCUSDT,1582337103111000,1582337103235690,42387895,buy,9663.06,0.001 -binance-futures,BTCUSDT,1582337106114000,1582337106236422,42387896,buy,9663.65,0.001 -binance-futures,BTCUSDT,1582337106575000,1582337106698632,42387897,buy,9663.63,0.006 -binance-futures,BTCUSDT,1582337108680000,1582337108805002,42387898,sell,9663.99,0.004 -binance-futures,BTCUSDT,1582337108727000,1582337108847696,42387899,buy,9664,0.001 -binance-futures,BTCUSDT,1582337112798000,1582337112920874,42387900,buy,9664,0.001 -binance-futures,BTCUSDT,1582337115202000,1582337115331400,42387901,buy,9664,0.001 -binance-futures,BTCUSDT,1582337116700000,1582337116823317,42387902,buy,9664,0.05 -binance-futures,BTCUSDT,1582337118098000,1582337118216940,42387903,buy,9664,0.001 -binance-futures,BTCUSDT,1582337118351000,1582337118470945,42387904,buy,9664,0.629 -binance-futures,BTCUSDT,1582337118351000,1582337118470951,42387905,buy,9664,0.5 -binance-futures,BTCUSDT,1582337118713000,1582337118838080,42387906,buy,9664.66,0.012 -binance-futures,BTCUSDT,1582337118713000,1582337118839969,42387907,buy,9664.95,0.019 -binance-futures,BTCUSDT,1582337119219000,1582337119339401,42387908,buy,9664.95,0.081 -binance-futures,BTCUSDT,1582337119219000,1582337119339411,42387909,buy,9665,0.012 -binance-futures,BTCUSDT,1582337119233000,1582337119353757,42387910,buy,9665,0.088 -binance-futures,BTCUSDT,1582337120174000,1582337120298141,42387911,sell,9666.22,0.031 -binance-futures,BTCUSDT,1582337120174000,1582337120301492,42387912,sell,9666.21,0.011 -binance-futures,BTCUSDT,1582337120272000,1582337120394891,42387913,sell,9666.21,0.002 -binance-futures,BTCUSDT,1582337120505000,1582337120626202,42387914,sell,9666.21,0.018 -binance-futures,BTCUSDT,1582337120505000,1582337120626221,42387915,sell,9665.23,0.102 -binance-futures,BTCUSDT,1582337120603000,1582337120726987,42387916,buy,9666.47,0.003 -binance-futures,BTCUSDT,1582337122818000,1582337122939642,42387917,buy,9666.47,0.001 -binance-futures,BTCUSDT,1582337123775000,1582337123894016,42387918,buy,9666.47,0.017 -binance-futures,BTCUSDT,1582337126195000,1582337126316803,42387919,buy,9666.47,0.026 -binance-futures,BTCUSDT,1582337126195000,1582337126316828,42387920,buy,9666.67,0.012 -binance-futures,BTCUSDT,1582337126195000,1582337126320677,42387921,buy,9666.73,0.1 -binance-futures,BTCUSDT,1582337126195000,1582337126323728,42387922,buy,9666.99,0.047 -binance-futures,BTCUSDT,1582337126195000,1582337126326214,42387923,buy,9667.25,0.215 -binance-futures,BTCUSDT,1582337126541000,1582337126732724,42387924,buy,9667.25,0.565 -binance-futures,BTCUSDT,1582337127939000,1582337128068408,42387925,buy,9667.53,0.004 -binance-futures,BTCUSDT,1582337128844000,1582337128965944,42387926,buy,9667.53,0.426 -binance-futures,BTCUSDT,1582337129187000,1582337129312221,42387927,buy,9667.51,0.4 -binance-futures,BTCUSDT,1582337130557000,1582337130677168,42387928,sell,9666.99,0.1 -binance-futures,BTCUSDT,1582337132549000,1582337132673180,42387929,buy,9668,0.004 -binance-futures,BTCUSDT,1582337132549000,1582337132678233,42387930,buy,9668.26,0.074 -binance-futures,BTCUSDT,1582337132551000,1582337132679127,42387931,buy,9668.26,0.069 -binance-futures,BTCUSDT,1582337133990000,1582337134114125,42387932,buy,9668.33,0.007 -binance-futures,BTCUSDT,1582337133990000,1582337134116736,42387933,buy,9668.34,0.284 -binance-futures,BTCUSDT,1582337133990000,1582337134120535,42387934,buy,9668.37,0.4 -binance-futures,BTCUSDT,1582337133990000,1582337134121889,42387935,buy,9668.37,0.309 -binance-futures,BTCUSDT,1582337137195000,1582337137315604,42387936,buy,9666.86,0.001 -binance-futures,BTCUSDT,1582337138780000,1582337138902938,42387937,sell,9666.85,0.454 -binance-futures,BTCUSDT,1582337138780000,1582337138902946,42387938,sell,9666.82,0.072 -binance-futures,BTCUSDT,1582337140132000,1582337140252072,42387939,buy,9666.74,0.001 -binance-futures,BTCUSDT,1582337147179000,1582337147303226,42387940,buy,9667.54,0.001 -binance-futures,BTCUSDT,1582337147728000,1582337147852031,42387941,sell,9666.87,0.001 -binance-futures,BTCUSDT,1582337147728000,1582337147852384,42387942,sell,9666.84,0.07 From dde3911228c6d3f406d24a89433b59632d10b887 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 11 Oct 2024 10:39:31 +1100 Subject: [PATCH 074/224] Refine large test data functions --- nautilus_trader/test_kit/providers.py | 53 +++++++++++++++++++ .../adapters/tardis/test_loaders.py | 30 ++--------- 2 files changed, 57 insertions(+), 26 deletions(-) diff --git a/nautilus_trader/test_kit/providers.py b/nautilus_trader/test_kit/providers.py index f18678ba6a6d..8770f155c076 100644 --- a/nautilus_trader/test_kit/providers.py +++ b/nautilus_trader/test_kit/providers.py @@ -17,6 +17,7 @@ import pathlib import random from decimal import Decimal +from pathlib import Path from typing import Any import fsspec @@ -25,6 +26,8 @@ import pytz from fsspec.implementations.local import LocalFileSystem +from nautilus_trader import PACKAGE_ROOT +from nautilus_trader.core import nautilus_pyo3 from nautilus_trader.core.correctness import PyCondition from nautilus_trader.core.datetime import dt_to_unix_nanos from nautilus_trader.core.datetime import secs_to_nanos @@ -954,3 +957,53 @@ def generate_trade_ticks( ) for idx, row in df.iterrows() ] + + +def get_test_data_large_path() -> Path: + return (PACKAGE_ROOT / "tests" / "test_data" / "large").resolve() + + +def get_test_data_large_checksums_filepath() -> Path: + return (get_test_data_large_path() / "checksums.json").resolve() + + +def ensure_test_data_exists(filename: str, url: str) -> Path: + filepath = (get_test_data_large_path() / filename).resolve() + checksums_filepath = get_test_data_large_checksums_filepath() + nautilus_pyo3.ensure_file_exists_or_download_http(str(filepath), url, str(checksums_filepath)) + return filepath + + +def ensure_data_exists_tardis_deribit_book_l2() -> Path: + filename = "tardis_deribit_incremental_book_L2_2020-04-01_BTC-PERPETUAL.csv.gz" + base_url = "https://datasets.tardis.dev" + url = f"{base_url}/v1/deribit/incremental_book_L2/2020/04/01/BTC-PERPETUAL.csv.gz" + return ensure_test_data_exists(filename, url) + + +def ensure_data_exists_tardis_binance_snapshot5() -> Path: + filename = "tardis_binance-futures_book_snapshot_5_2020-09-01_BTCUSDT.csv.gz" + base_url = "https://datasets.tardis.dev" + url = f"{base_url}/v1/binance-futures/book_snapshot_5/2020/09/01/BTCUSDT.csv.gz" + return ensure_test_data_exists(filename, url) + + +def ensure_data_exists_tardis_binance_snapshot25() -> Path: + filename = "tardis_binance-futures_book_snapshot_25_2020-09-01_BTCUSDT.csv.gz" + base_url = "https://datasets.tardis.dev" + url = f"{base_url}/v1/binance-futures/book_snapshot_25/2020/09/01/BTCUSDT.csv.gz" + return ensure_test_data_exists(filename, url) + + +def ensure_data_exists_tardis_huobi_quotes() -> Path: + filename = "tardis_huobi-dm-swap_quotes_2020-05-01_BTC-USD.csv.gz" + base_url = "https://datasets.tardis.dev" + url = f"{base_url}/v1/huobi-dm-swap/quotes/2020/05/01/BTC-USD.csv.gz" + return ensure_test_data_exists(filename, url) + + +def ensure_data_exists_tardis_bitmex_trades() -> Path: + filename = "tardis_bitmex_trades_2020-03-01_XBTUSD.csv.gz" + base_url = "https://datasets.tardis.dev" + url = f"{base_url}/v1/bitmex/trades/2020/03/01/XBTUSD.csv.gz" + return ensure_test_data_exists(filename, url) diff --git a/tests/integration_tests/adapters/tardis/test_loaders.py b/tests/integration_tests/adapters/tardis/test_loaders.py index 227d6dce1a78..fc0ef8957eea 100644 --- a/tests/integration_tests/adapters/tardis/test_loaders.py +++ b/tests/integration_tests/adapters/tardis/test_loaders.py @@ -14,7 +14,6 @@ # ------------------------------------------------------------------------------------------------- from nautilus_trader.adapters.tardis.loaders import TardisCSVDataLoader -from nautilus_trader.core import nautilus_pyo3 from nautilus_trader.model.enums import AggressorSide from nautilus_trader.model.enums import BookAction from nautilus_trader.model.enums import OrderSide @@ -22,26 +21,13 @@ from nautilus_trader.model.identifiers import TradeId from nautilus_trader.model.objects import Price from nautilus_trader.model.objects import Quantity -from tests import TEST_DATA_DIR +from nautilus_trader.test_kit.providers import ensure_data_exists_tardis_bitmex_trades +from nautilus_trader.test_kit.providers import ensure_data_exists_tardis_deribit_book_l2 def test_tardis_load_deltas(): # Arrange - filepath = ( - TEST_DATA_DIR - / "large" - / "tardis_deribit_incremental_book_L2_2020-04-01_BTC-PERPETUAL.csv.gz" - ) - checksums = TEST_DATA_DIR / "large" / "checksums.json" - url = ( - "https://datasets.tardis.dev/v1/deribit/incremental_book_L2/2020/04/01/BTC-PERPETUAL.csv.gz" - ) - nautilus_pyo3.ensure_file_exists_or_download_http( - str(filepath.resolve()), - url, - str(checksums.resolve()), - ) - + filepath = ensure_data_exists_tardis_deribit_book_l2() loader = TardisCSVDataLoader(price_precision=1, size_precision=0) # Act @@ -62,15 +48,7 @@ def test_tardis_load_deltas(): def test_tardis_load_trades(): # Arrange - filepath = TEST_DATA_DIR / "large" / "tardis_bitmex_trades_2020-03-01_XBTUSD.csv.gz" - checksums = TEST_DATA_DIR / "large" / "checksums.json" - url = "https://datasets.tardis.dev/v1/bitmex/trades/2020/03/01/XBTUSD.csv.gz" - nautilus_pyo3.ensure_file_exists_or_download_http( - str(filepath.resolve()), - url, - str(checksums.resolve()), - ) - + filepath = ensure_data_exists_tardis_bitmex_trades() loader = TardisCSVDataLoader(price_precision=1, size_precision=0) # Act From b85fbce7f0496a1df0e72d5fc48e711f5e2bbf1f Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 11 Oct 2024 10:47:00 +1100 Subject: [PATCH 075/224] Refine large test data functions --- nautilus_core/adapters/src/tardis/csv.rs | 22 ++++---- nautilus_core/model/tests/test_order_book.rs | 6 +- nautilus_core/test_kit/src/common.rs | 59 +++++++++++++++++++- nautilus_core/test_kit/src/python/files.rs | 2 +- 4 files changed, 71 insertions(+), 18 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/csv.rs b/nautilus_core/adapters/src/tardis/csv.rs index 9591b7768296..0e1af30368c0 100644 --- a/nautilus_core/adapters/src/tardis/csv.rs +++ b/nautilus_core/adapters/src/tardis/csv.rs @@ -460,7 +460,7 @@ pub fn load_trade_ticks>( mod tests { use nautilus_model::{enums::BookAction, identifiers::InstrumentId}; use nautilus_test_kit::{ - common::{get_project_testdata_path, get_testdata_large_checksums_filepath}, + common::{get_test_data_large_checksums_filepath, get_test_data_large_path}, files::ensure_file_exists_or_download_http, }; use rstest::*; @@ -469,8 +469,8 @@ mod tests { #[rstest] pub fn test_read_deltas() { - let testdata = get_project_testdata_path(); - let checksums = get_testdata_large_checksums_filepath(); + let testdata = get_test_data_large_path(); + let checksums = get_test_data_large_checksums_filepath(); let filename = "tardis_deribit_incremental_book_L2_2020-04-01_BTC-PERPETUAL.csv.gz"; let filepath = testdata.join("large").join(filename); let url = "https://datasets.tardis.dev/v1/deribit/incremental_book_L2/2020/04/01/BTC-PERPETUAL.csv.gz"; @@ -495,8 +495,8 @@ mod tests { #[rstest] pub fn test_read_depth10s_from_snapshot5() { - let testdata = get_project_testdata_path(); - let checksums = get_testdata_large_checksums_filepath(); + let testdata = get_test_data_large_path(); + let checksums = get_test_data_large_checksums_filepath(); let filename = "tardis_binance-futures_book_snapshot_5_2020-09-01_BTCUSDT.csv.gz"; let filepath = testdata.join("large").join(filename); let url = "https://datasets.tardis.dev/v1/binance-futures/book_snapshot_5/2020/09/01/BTCUSDT.csv.gz"; @@ -510,8 +510,8 @@ mod tests { #[rstest] pub fn test_read_depth10s_from_snapshot25() { - let testdata = get_project_testdata_path(); - let checksums = get_testdata_large_checksums_filepath(); + let testdata = get_test_data_large_path(); + let checksums = get_test_data_large_checksums_filepath(); let filename = "tardis_binance-futures_book_snapshot_25_2020-09-01_BTCUSDT.csv.gz"; let filepath = testdata.join("large").join(filename); let url = "https://datasets.tardis.dev/v1/binance-futures/book_snapshot_25/2020/09/01/BTCUSDT.csv.gz"; @@ -525,8 +525,8 @@ mod tests { #[rstest] pub fn test_read_quotes() { - let testdata = get_project_testdata_path(); - let checksums = get_testdata_large_checksums_filepath(); + let testdata = get_test_data_large_path(); + let checksums = get_test_data_large_checksums_filepath(); let filename = "tardis_huobi-dm-swap_quotes_2020-05-01_BTC-USD.csv.gz"; let filepath = testdata.join("large").join(filename); let url = "https://datasets.tardis.dev/v1/huobi-dm-swap/quotes/2020/05/01/BTC-USD.csv.gz"; @@ -540,8 +540,8 @@ mod tests { #[rstest] pub fn test_read_trades() { - let testdata = get_project_testdata_path(); - let checksums = get_testdata_large_checksums_filepath(); + let testdata = get_test_data_large_path(); + let checksums = get_test_data_large_checksums_filepath(); let filename = "tardis_bitmex_trades_2020-03-01_XBTUSD.csv.gz"; let filepath = testdata.join("large").join(filename); let url = "https://datasets.tardis.dev/v1/bitmex/trades/2020/03/01/XBTUSD.csv.gz"; diff --git a/nautilus_core/model/tests/test_order_book.rs b/nautilus_core/model/tests/test_order_book.rs index f47f3716c4c5..b03cec6fb7fb 100644 --- a/nautilus_core/model/tests/test_order_book.rs +++ b/nautilus_core/model/tests/test_order_book.rs @@ -17,7 +17,7 @@ use nautilus_adapters::databento::loader::DatabentoDataLoader; use nautilus_model::{enums::BookType, identifiers::InstrumentId, orderbook::book::OrderBook}; use nautilus_test_kit::{ common::{ - get_project_testdata_path, get_testdata_large_checksums_filepath, get_workspace_root_path, + get_test_data_large_checksums_filepath, get_test_data_large_path, get_workspace_root_path, }, files::ensure_file_exists_or_download_http, }; @@ -25,8 +25,8 @@ use rstest::*; #[rstest] pub fn test_order_book_databento_mbo_nasdaq() { - let testdata = get_project_testdata_path(); - let checksums = get_testdata_large_checksums_filepath(); + let testdata = get_test_data_large_path(); + let checksums = get_test_data_large_checksums_filepath(); let filename = "databento_mbo_xnas_itch.csv"; let filepath = testdata.join("large").join(filename); let url = "https://hist.databento.com/v0/dataset/sample/download/xnas.itch/mbo"; diff --git a/nautilus_core/test_kit/src/common.rs b/nautilus_core/test_kit/src/common.rs index 7e8d3e5b5baf..51f6c9938e48 100644 --- a/nautilus_core/test_kit/src/common.rs +++ b/nautilus_core/test_kit/src/common.rs @@ -15,6 +15,8 @@ use std::path::PathBuf; +use crate::files::ensure_file_exists_or_download_http; + #[must_use] pub fn get_workspace_root_path() -> PathBuf { PathBuf::from(env!("CARGO_MANIFEST_DIR")) @@ -32,13 +34,64 @@ pub fn get_project_root_path() -> PathBuf { } #[must_use] -pub fn get_project_testdata_path() -> PathBuf { +pub fn get_test_data_large_path() -> PathBuf { get_project_root_path().join("tests").join("test_data") } #[must_use] -pub fn get_testdata_large_checksums_filepath() -> PathBuf { - get_project_testdata_path() +pub fn get_test_data_large_checksums_filepath() -> PathBuf { + get_test_data_large_path() .join("large") .join("checksums.json") } + +#[must_use] +pub fn ensure_test_data_exists(filename: &str, url: &str) -> PathBuf { + let filepath = get_test_data_large_path() + .join(filename) + .canonicalize() + .unwrap(); + let checksums_filepath = get_test_data_large_checksums_filepath(); + ensure_file_exists_or_download_http(&filepath, url, Some(&checksums_filepath)).unwrap(); + filepath +} + +#[must_use] +pub fn ensure_data_exists_tardis_deribit_book_l2() -> PathBuf { + let filename = "tardis_deribit_incremental_book_L2_2020-04-01_BTC-PERPETUAL.csv.gz"; + let base_url = "https://datasets.tardis.dev"; + let url = format!("{base_url}/v1/deribit/incremental_book_L2/2020/04/01/BTC-PERPETUAL.csv.gz"); + ensure_test_data_exists(filename, &url) +} + +#[must_use] +pub fn ensure_data_exists_tardis_binance_snapshot5() -> PathBuf { + let filename = "tardis_binance-futures_book_snapshot_5_2020-09-01_BTCUSDT.csv.gz"; + let base_url = "https://datasets.tardis.dev"; + let url = format!("{base_url}/v1/binance-futures/book_snapshot_5/2020/09/01/BTCUSDT.csv.gz"); + ensure_test_data_exists(filename, &url) +} + +#[must_use] +pub fn ensure_data_exists_tardis_binance_snapshot25() -> PathBuf { + let filename = "tardis_binance-futures_book_snapshot_25_2020-09-01_BTCUSDT.csv.gz"; + let base_url = "https://datasets.tardis.dev"; + let url = format!("{base_url}/v1/binance-futures/book_snapshot_25/2020/09/01/BTCUSDT.csv.gz"); + ensure_test_data_exists(filename, &url) +} + +#[must_use] +pub fn ensure_data_exists_tardis_huobi_quotes() -> PathBuf { + let filename = "tardis_huobi-dm-swap_quotes_2020-05-01_BTC-USD.csv.gz"; + let base_url = "https://datasets.tardis.dev"; + let url = format!("{base_url}/v1/huobi-dm-swap/quotes/2020/05/01/BTC-USD.csv.gz"); + ensure_test_data_exists(filename, &url) +} + +#[must_use] +pub fn ensure_data_exists_tardis_bitmex_trades() -> PathBuf { + let filename = "tardis_bitmex_trades_2020-03-01_XBTUSD.csv.gz"; + let base_url = "https://datasets.tardis.dev"; + let url = format!("{base_url}/v1/bitmex/trades/2020/03/01/XBTUSD.csv.gz"); + ensure_test_data_exists(filename, &url) +} diff --git a/nautilus_core/test_kit/src/python/files.rs b/nautilus_core/test_kit/src/python/files.rs index 398ef1e9d394..8ce46d5eef52 100644 --- a/nautilus_core/test_kit/src/python/files.rs +++ b/nautilus_core/test_kit/src/python/files.rs @@ -19,7 +19,7 @@ use nautilus_core::python::to_pyruntime_err; use pyo3::prelude::*; use crate::{ - common::get_testdata_large_checksums_filepath, files::ensure_file_exists_or_download_http, + common::get_test_data_large_checksums_filepath, files::ensure_file_exists_or_download_http, }; #[must_use] From f730d590bc429a1630330c921543a3d7fcea3238 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 11 Oct 2024 11:13:42 +1100 Subject: [PATCH 076/224] Continue TardisCSVDataLoader --- nautilus_trader/adapters/tardis/loaders.py | 161 +++++++++++++++++- .../adapters/tardis/test_loaders.py | 52 ++++++ 2 files changed, 211 insertions(+), 2 deletions(-) diff --git a/nautilus_trader/adapters/tardis/loaders.py b/nautilus_trader/adapters/tardis/loaders.py index 903fcb0b46d6..d37f985c36db 100644 --- a/nautilus_trader/adapters/tardis/loaders.py +++ b/nautilus_trader/adapters/tardis/loaders.py @@ -19,6 +19,8 @@ from nautilus_trader.core import nautilus_pyo3 from nautilus_trader.core.nautilus_pyo3 import drop_cvec_pycapsule from nautilus_trader.model.data import OrderBookDelta +from nautilus_trader.model.data import OrderBookDepth10 +from nautilus_trader.model.data import QuoteTick from nautilus_trader.model.data import TradeTick from nautilus_trader.model.data import capsule_to_list @@ -41,6 +43,8 @@ def load_deltas( """ Load order book deltas data from the given `filepath`. + CSV file must be Tardis incremental book L2 format. + Parameters ---------- filepath : PathLike[str] | str @@ -56,6 +60,10 @@ def load_deltas( ------- list[OrderBookDelta] | list[nautilus_pyo3.OrderBookDelta] + References + ---------- + https://docs.tardis.dev/downloadable-csv-files#incremental_book_l2 + """ if isinstance(filepath, Path): filepath = str(filepath.resolve()) @@ -79,6 +87,149 @@ def load_deltas( limit=limit, ) + def load_depth10( + self, + filepath: PathLike[str] | str, + levels: int, + as_legacy_cython: bool = True, + limit: int | None = None, + ) -> list[OrderBookDepth10] | list[nautilus_pyo3.OrderBookDepth10]: + """ + Load order book depth snapshots from the given `filepath`. + + CSV file must be Tardis book snapshot 5 or snapshot 25 format. + + - For snapshot 5, levels beyond 5 will be filled with null orders. + - For snapshot 25, levels beyond 10 are discarded. + + Parameters + ---------- + filepath : PathLike[str] | str + The path for the CSV data file (must be Tardis trades format). + levels : int + The number of levels in the snapshots CSV data (must be either 5 or 25). + as_legacy_cython : bool, True + If data should be converted to 'legacy Cython' objects. + You would typically only set this False if passing the objects + directly to a data catalog for the data to then be written in Nautilus Parquet format. + limit : int, optional + The limit for the number of records to read. + + Returns + ------- + list[OrderBookDepth10] | list[nautilus_pyo3.OrderBookDepth10] + + Raises + ------ + ValueError + If `levels` is not either 5 or 25. + + References + ---------- + https://docs.tardis.dev/downloadable-csv-files#book_snapshot_5 + https://docs.tardis.dev/downloadable-csv-files#book_snapshot_25 + + """ + if isinstance(filepath, Path): + filepath = str(filepath.resolve()) + + match levels: + case 5: + if as_legacy_cython: + capsule = nautilus_pyo3.load_tardis_depth10_from_snapshot5_as_pycapsule( + filepath=str(filepath), + price_precision=self._price_precision, + size_precision=self._size_precision, + limit=limit, + ) + data = capsule_to_list(capsule) + # Drop encapsulated `CVec` as data is now transferred + drop_cvec_pycapsule(capsule) + return data + + return nautilus_pyo3.load_tardis_depth10_from_snapshot5( + filepath=str(filepath), + price_precision=self._price_precision, + size_precision=self._size_precision, + limit=limit, + ) + case 25: + if as_legacy_cython: + capsule = nautilus_pyo3.load_tardis_depth10_from_snapshot25_as_pycapsule( + filepath=str(filepath), + price_precision=self._price_precision, + size_precision=self._size_precision, + limit=limit, + ) + data = capsule_to_list(capsule) + # Drop encapsulated `CVec` as data is now transferred + drop_cvec_pycapsule(capsule) + return data + + return nautilus_pyo3.load_tardis_depth10_from_snapshot25( + filepath=str(filepath), + price_precision=self._price_precision, + size_precision=self._size_precision, + limit=limit, + ) + case _: + raise ValueError( + "invalid `levels`, use either 5 or 25 corresponding to number of levels in the CSV data", + ) + + def load_quotes( + self, + filepath: PathLike[str] | str, + as_legacy_cython: bool = True, + limit: int | None = None, + ) -> list[QuoteTick] | list[nautilus_pyo3.QuoteTick]: + """ + Load quote tick data from the given `filepath`. + + CSV file must be Tardis quotes format. + + Parameters + ---------- + filepath : PathLike[str] | str + The path for the CSV data file. + as_legacy_cython : bool, True + If data should be converted to 'legacy Cython' objects. + You would typically only set this False if passing the objects + directly to a data catalog for the data to then be written in Nautilus Parquet format. + limit : int, optional + The limit for the number of records to read. + + Returns + ------- + list[QuoteTick] | list[nautilus_pyo3.QuoteTick] + + References + ---------- + https://docs.tardis.dev/downloadable-csv-files#quotes + + """ + if isinstance(filepath, Path): + filepath = str(filepath.resolve()) + + if as_legacy_cython: + capsule = nautilus_pyo3.load_tardis_quotes_as_pycapsule( + filepath=str(filepath), + price_precision=self._price_precision, + size_precision=self._size_precision, + limit=limit, + ) + data = capsule_to_list(capsule) + # Drop encapsulated `CVec` as data is now transferred + drop_cvec_pycapsule(capsule) + return data + + return nautilus_pyo3.load_tardis_quotes( + filepath=str(filepath), + price_precision=self._price_precision, + size_precision=self._size_precision, + limit=limit, + ) + def load_trades( self, filepath: PathLike[str] | str, @@ -86,12 +237,14 @@ def load_trades( limit: int | None = None, ) -> list[TradeTick] | list[nautilus_pyo3.TradeTick]: """ - Load trade ticks data from the given `filepath`. + Load trade tick data from the given `filepath`. + + CSV file must be Tardis trades format. Parameters ---------- filepath : PathLike[str] | str - The path for the CSV data file (must be Tardis trades format). + The path for the CSV data file. as_legacy_cython : bool, True If data should be converted to 'legacy Cython' objects. You would typically only set this False if passing the objects @@ -103,6 +256,10 @@ def load_trades( ------- list[TradeTick] | list[nautilus_pyo3.TradeTick] + References + ---------- + https://docs.tardis.dev/downloadable-csv-files#trades + """ if isinstance(filepath, Path): filepath = str(filepath.resolve()) diff --git a/tests/integration_tests/adapters/tardis/test_loaders.py b/tests/integration_tests/adapters/tardis/test_loaders.py index fc0ef8957eea..a52bb5f3fb9f 100644 --- a/tests/integration_tests/adapters/tardis/test_loaders.py +++ b/tests/integration_tests/adapters/tardis/test_loaders.py @@ -21,8 +21,11 @@ from nautilus_trader.model.identifiers import TradeId from nautilus_trader.model.objects import Price from nautilus_trader.model.objects import Quantity +from nautilus_trader.test_kit.providers import ensure_data_exists_tardis_binance_snapshot5 +from nautilus_trader.test_kit.providers import ensure_data_exists_tardis_binance_snapshot25 from nautilus_trader.test_kit.providers import ensure_data_exists_tardis_bitmex_trades from nautilus_trader.test_kit.providers import ensure_data_exists_tardis_deribit_book_l2 +from nautilus_trader.test_kit.providers import ensure_data_exists_tardis_huobi_quotes def test_tardis_load_deltas(): @@ -46,6 +49,55 @@ def test_tardis_load_deltas(): assert deltas[0].ts_init == 1585699200355684000 +def test_tardis_load_depth10_from_snapshot5(): + # Arrange + filepath = ensure_data_exists_tardis_binance_snapshot5() + loader = TardisCSVDataLoader(price_precision=1, size_precision=0) + + # Act + deltas = loader.load_depth10(filepath, levels=5, limit=1_000) + + # Assert + assert len(deltas) == 1_000 + assert deltas[0].instrument_id == InstrumentId.from_str("BTCUSDT.BINANCE") + assert deltas[0].ts_event == 1598918403696000000 + assert deltas[0].ts_init == 1598918403810979000 + + +def test_tardis_load_depth10_from_snapshot25(): + # Arrange + filepath = ensure_data_exists_tardis_binance_snapshot25() + loader = TardisCSVDataLoader(price_precision=1, size_precision=0) + + # Act + deltas = loader.load_depth10(filepath, levels=25, limit=1_000) + + # Assert + assert len(deltas) == 1_000 + assert deltas[0].instrument_id == InstrumentId.from_str("BTCUSDT.BINANCE") + assert deltas[0].ts_event == 1598918403696000000 + assert deltas[0].ts_init == 1598918403810979000 + + +def test_tardis_load_quotes(): + # Arrange + filepath = ensure_data_exists_tardis_huobi_quotes() + loader = TardisCSVDataLoader(price_precision=1, size_precision=0) + + # Act + trades = loader.load_quotes(filepath, limit=1_000) + + # Assert + assert len(trades) == 1_000 + assert trades[0].instrument_id == InstrumentId.from_str("BTC-USD.HUOBI") + assert trades[0].bid_price == Price.from_str("8629.2") + assert trades[0].ask_price == Price.from_str("8629.3") + assert trades[0].bid_size == Quantity.from_str("806") + assert trades[0].ask_size == Quantity.from_str("5494") + assert trades[0].ts_event == 1588291201099000000 + assert trades[0].ts_init == 1588291201234268000 + + def test_tardis_load_trades(): # Arrange filepath = ensure_data_exists_tardis_bitmex_trades() From 02809173ea81323087eef5c84b8c8cabfcc0b7b7 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 11 Oct 2024 11:43:55 +1100 Subject: [PATCH 077/224] Continue TardisCSVDataLoader --- nautilus_core/adapters/src/tardis/csv.rs | 42 +++++-- .../adapters/src/tardis/python/csv.rs | 114 +++++++++++++++--- nautilus_trader/adapters/tardis/loaders.py | 35 +++++- nautilus_trader/core/nautilus_pyo3.pyi | 20 +-- .../adapters/tardis/test_loaders.py | 5 +- 5 files changed, 173 insertions(+), 43 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/csv.rs b/nautilus_core/adapters/src/tardis/csv.rs index 0e1af30368c0..ee4f6bd5ee79 100644 --- a/nautilus_core/adapters/src/tardis/csv.rs +++ b/nautilus_core/adapters/src/tardis/csv.rs @@ -27,7 +27,7 @@ use nautilus_model::{ trade::TradeTick, }, enums::{OrderSide, RecordFlag}, - identifiers::TradeId, + identifiers::{InstrumentId, TradeId}, types::{price::Price, quantity::Quantity}, }; @@ -65,6 +65,7 @@ pub fn load_deltas>( filepath: P, price_precision: u8, size_precision: u8, + instrument_id: Option, limit: Option, ) -> Result, Box> { let mut csv_reader = create_csv_reader(filepath)?; @@ -74,7 +75,10 @@ pub fn load_deltas>( for result in csv_reader.deserialize() { let record: TardisBookUpdateRecord = result?; - let instrument_id = parse_instrument_id(&record.exchange, &record.symbol); + let instrument_id = match &instrument_id { + Some(id) => *id, + None => parse_instrument_id(&record.exchange, &record.symbol), + }; let side = parse_order_side(&record.side); let price = Price::new(record.price, price_precision); let size = Quantity::new(record.amount, size_precision); @@ -150,6 +154,7 @@ pub fn load_depth10_from_snapshot5>( filepath: P, price_precision: u8, size_precision: u8, + instrument_id: Option, limit: Option, ) -> Result, Box> { let mut csv_reader = create_csv_reader(filepath)?; @@ -158,7 +163,10 @@ pub fn load_depth10_from_snapshot5>( for result in csv_reader.deserialize() { let record: TardisOrderBookSnapshot5Record = result?; - let instrument_id = parse_instrument_id(&record.exchange, &record.symbol); + let instrument_id = match &instrument_id { + Some(id) => *id, + None => parse_instrument_id(&record.exchange, &record.symbol), + }; let flags = RecordFlag::F_LAST.value(); let sequence = 0; // Sequence not available let ts_event = parse_timestamp(record.timestamp); @@ -250,6 +258,7 @@ pub fn load_depth10_from_snapshot25>( filepath: P, price_precision: u8, size_precision: u8, + instrument_id: Option, limit: Option, ) -> Result, Box> { let mut csv_reader = create_csv_reader(filepath)?; @@ -258,7 +267,10 @@ pub fn load_depth10_from_snapshot25>( for result in csv_reader.deserialize() { let record: TardisOrderBookSnapshot25Record = result?; - let instrument_id = parse_instrument_id(&record.exchange, &record.symbol); + let instrument_id = match &instrument_id { + Some(id) => *id, + None => parse_instrument_id(&record.exchange, &record.symbol), + }; let flags = RecordFlag::F_LAST.value(); let sequence = 0; // Sequence not available let ts_event = parse_timestamp(record.timestamp); @@ -372,6 +384,7 @@ pub fn load_quote_ticks>( filepath: P, price_precision: u8, size_precision: u8, + instrument_id: Option, limit: Option, ) -> Result, Box> { let mut csv_reader = create_csv_reader(filepath)?; @@ -380,7 +393,10 @@ pub fn load_quote_ticks>( for result in csv_reader.deserialize() { let record: TardisQuoteRecord = result?; - let instrument_id = parse_instrument_id(&record.exchange, &record.symbol); + let instrument_id = match &instrument_id { + Some(id) => *id, + None => parse_instrument_id(&record.exchange, &record.symbol), + }; let bid_price = Price::new(record.bid_price.unwrap_or(0.0), price_precision); let bid_size = Quantity::new(record.bid_amount.unwrap_or(0.0), size_precision); let ask_price = Price::new(record.ask_price.unwrap_or(0.0), price_precision); @@ -415,6 +431,7 @@ pub fn load_trade_ticks>( filepath: P, price_precision: u8, size_precision: u8, + instrument_id: Option, limit: Option, ) -> Result, Box> { let mut csv_reader = create_csv_reader(filepath)?; @@ -423,7 +440,10 @@ pub fn load_trade_ticks>( for result in csv_reader.deserialize() { let record: TardisTradeRecord = result?; - let instrument_id = parse_instrument_id(&record.exchange, &record.symbol); + let instrument_id = match &instrument_id { + Some(id) => *id, + None => parse_instrument_id(&record.exchange, &record.symbol), + }; let price = Price::new(record.price, price_precision); let size = Quantity::new(record.amount, size_precision); let aggressor_side = parse_aggressor_side(&record.side); @@ -476,7 +496,7 @@ mod tests { let url = "https://datasets.tardis.dev/v1/deribit/incremental_book_L2/2020/04/01/BTC-PERPETUAL.csv.gz"; ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); - let deltas = load_deltas(filepath, 1, 0, Some(1_000)).unwrap(); + let deltas = load_deltas(filepath, 1, 0, None, Some(1_000)).unwrap(); assert_eq!(deltas.len(), 1_000); assert_eq!( @@ -502,7 +522,7 @@ mod tests { let url = "https://datasets.tardis.dev/v1/binance-futures/book_snapshot_5/2020/09/01/BTCUSDT.csv.gz"; ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); - let depths = load_depth10_from_snapshot5(filepath, 1, 0, Some(1_000)).unwrap(); + let depths = load_depth10_from_snapshot5(filepath, 1, 0, None, Some(1_000)).unwrap(); assert_eq!(depths.len(), 1_000); // TODO: Assert every field @@ -517,7 +537,7 @@ mod tests { let url = "https://datasets.tardis.dev/v1/binance-futures/book_snapshot_25/2020/09/01/BTCUSDT.csv.gz"; ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); - let depths = load_depth10_from_snapshot25(filepath, 1, 0, Some(1_000)).unwrap(); + let depths = load_depth10_from_snapshot25(filepath, 1, 0, None, Some(1_000)).unwrap(); assert_eq!(depths.len(), 1_000); // TODO: Assert every field @@ -532,7 +552,7 @@ mod tests { let url = "https://datasets.tardis.dev/v1/huobi-dm-swap/quotes/2020/05/01/BTC-USD.csv.gz"; ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); - let quotes = load_quote_ticks(filepath, 1, 0, Some(1_000)).unwrap(); + let quotes = load_quote_ticks(filepath, 1, 0, None, Some(1_000)).unwrap(); assert_eq!(quotes.len(), 1_000); // TODO: Assert every field @@ -547,7 +567,7 @@ mod tests { let url = "https://datasets.tardis.dev/v1/bitmex/trades/2020/03/01/XBTUSD.csv.gz"; ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); - let trades = load_trade_ticks(filepath, 1, 0, Some(1_000)).unwrap(); + let trades = load_trade_ticks(filepath, 1, 0, None, Some(1_000)).unwrap(); assert_eq!(trades.len(), 1_000); // TODO: Assert every field diff --git a/nautilus_core/adapters/src/tardis/python/csv.rs b/nautilus_core/adapters/src/tardis/python/csv.rs index 0633a4ff770e..0a33178bd21d 100644 --- a/nautilus_core/adapters/src/tardis/python/csv.rs +++ b/nautilus_core/adapters/src/tardis/python/csv.rs @@ -16,8 +16,11 @@ use std::path::PathBuf; use nautilus_core::{ffi::cvec::CVec, python::to_pyvalue_err}; -use nautilus_model::data::{ - delta::OrderBookDelta, depth::OrderBookDepth10, quote::QuoteTick, trade::TradeTick, Data, +use nautilus_model::{ + data::{ + delta::OrderBookDelta, depth::OrderBookDepth10, quote::QuoteTick, trade::TradeTick, Data, + }, + identifiers::InstrumentId, }; use pyo3::{prelude::*, types::PyCapsule}; @@ -32,9 +35,17 @@ pub fn py_load_tardis_deltas( filepath: PathBuf, price_precision: u8, size_precision: u8, + instrument_id: Option, limit: Option, ) -> PyResult> { - load_deltas(filepath, price_precision, size_precision, limit).map_err(to_pyvalue_err) + load_deltas( + filepath, + price_precision, + size_precision, + instrument_id, + limit, + ) + .map_err(to_pyvalue_err) } #[must_use] @@ -44,10 +55,17 @@ pub fn py_load_tardis_deltas_as_pycapsule( filepath: PathBuf, price_precision: u8, size_precision: u8, + instrument_id: Option, limit: Option, ) -> PyResult { - let deltas = - load_deltas(filepath, price_precision, size_precision, limit).map_err(to_pyvalue_err)?; + let deltas = load_deltas( + filepath, + price_precision, + size_precision, + instrument_id, + limit, + ) + .map_err(to_pyvalue_err)?; let deltas: Vec = deltas.into_iter().map(Data::Delta).collect(); let cvec: CVec = deltas.into(); @@ -61,10 +79,17 @@ pub fn py_load_tardis_depth10_from_snapshot5( filepath: PathBuf, price_precision: u8, size_precision: u8, + instrument_id: Option, limit: Option, ) -> PyResult> { - load_depth10_from_snapshot5(filepath, price_precision, size_precision, limit) - .map_err(to_pyvalue_err) + load_depth10_from_snapshot5( + filepath, + price_precision, + size_precision, + instrument_id, + limit, + ) + .map_err(to_pyvalue_err) } #[must_use] @@ -74,10 +99,17 @@ pub fn py_load_tardis_depth10_from_snapshot5_as_pycapsule( filepath: PathBuf, price_precision: u8, size_precision: u8, + instrument_id: Option, limit: Option, ) -> PyResult { - let depths = load_depth10_from_snapshot5(filepath, price_precision, size_precision, limit) - .map_err(to_pyvalue_err)?; + let depths = load_depth10_from_snapshot5( + filepath, + price_precision, + size_precision, + instrument_id, + limit, + ) + .map_err(to_pyvalue_err)?; let depths: Vec = depths.into_iter().map(Data::Depth10).collect(); let cvec: CVec = depths.into(); @@ -91,10 +123,17 @@ pub fn py_load_tardis_depth10_from_snapshot25( filepath: PathBuf, price_precision: u8, size_precision: u8, + instrument_id: Option, limit: Option, ) -> PyResult> { - load_depth10_from_snapshot25(filepath, price_precision, size_precision, limit) - .map_err(to_pyvalue_err) + load_depth10_from_snapshot25( + filepath, + price_precision, + size_precision, + instrument_id, + limit, + ) + .map_err(to_pyvalue_err) } #[must_use] @@ -104,10 +143,17 @@ pub fn py_load_tardis_depth10_from_snapshot25_as_pycapsule( filepath: PathBuf, price_precision: u8, size_precision: u8, + instrument_id: Option, limit: Option, ) -> PyResult { - let depths = load_depth10_from_snapshot25(filepath, price_precision, size_precision, limit) - .map_err(to_pyvalue_err)?; + let depths = load_depth10_from_snapshot25( + filepath, + price_precision, + size_precision, + instrument_id, + limit, + ) + .map_err(to_pyvalue_err)?; let depths: Vec = depths.into_iter().map(Data::Depth10).collect(); let cvec: CVec = depths.into(); @@ -121,9 +167,17 @@ pub fn py_load_tardis_quotes( filepath: PathBuf, price_precision: u8, size_precision: u8, + instrument_id: Option, limit: Option, ) -> PyResult> { - load_quote_ticks(filepath, price_precision, size_precision, limit).map_err(to_pyvalue_err) + load_quote_ticks( + filepath, + price_precision, + size_precision, + instrument_id, + limit, + ) + .map_err(to_pyvalue_err) } #[must_use] @@ -133,10 +187,17 @@ pub fn py_load_tardis_quotes_as_pycapsule( filepath: PathBuf, price_precision: u8, size_precision: u8, + instrument_id: Option, limit: Option, ) -> PyResult { - let quotes = load_quote_ticks(filepath, price_precision, size_precision, limit) - .map_err(to_pyvalue_err)?; + let quotes = load_quote_ticks( + filepath, + price_precision, + size_precision, + instrument_id, + limit, + ) + .map_err(to_pyvalue_err)?; let quotes: Vec = quotes.into_iter().map(Data::Quote).collect(); let cvec: CVec = quotes.into(); @@ -150,9 +211,17 @@ pub fn py_load_tardis_trades( filepath: PathBuf, price_precision: u8, size_precision: u8, + instrument_id: Option, limit: Option, ) -> PyResult> { - load_trade_ticks(filepath, price_precision, size_precision, limit).map_err(to_pyvalue_err) + load_trade_ticks( + filepath, + price_precision, + size_precision, + instrument_id, + limit, + ) + .map_err(to_pyvalue_err) } #[must_use] @@ -162,10 +231,17 @@ pub fn py_load_tardis_trades_as_pycapsule( filepath: PathBuf, price_precision: u8, size_precision: u8, + instrument_id: Option, limit: Option, ) -> PyResult { - let trades = load_trade_ticks(filepath, price_precision, size_precision, limit) - .map_err(to_pyvalue_err)?; + let trades = load_trade_ticks( + filepath, + price_precision, + size_precision, + instrument_id, + limit, + ) + .map_err(to_pyvalue_err)?; let trades: Vec = trades.into_iter().map(Data::Trade).collect(); let cvec: CVec = trades.into(); diff --git a/nautilus_trader/adapters/tardis/loaders.py b/nautilus_trader/adapters/tardis/loaders.py index d37f985c36db..50a84183b67f 100644 --- a/nautilus_trader/adapters/tardis/loaders.py +++ b/nautilus_trader/adapters/tardis/loaders.py @@ -23,16 +23,39 @@ from nautilus_trader.model.data import QuoteTick from nautilus_trader.model.data import TradeTick from nautilus_trader.model.data import capsule_to_list +from nautilus_trader.model.identifiers import InstrumentId class TardisCSVDataLoader: """ Provides a means of loading data from CSV files in Tardis format. + + Parameters + ---------- + price_precision : int + The price precision for parsing. + Necessary as implicit precision in the text data may not be consistent. + size_precision : int + The size precision for parsing. + Necessary as implicit precision in the text data may not be consistent. + instrument_id : InstrumentId, optional + The instrument ID to override in the data. + This can be more efficient if the instrument is definitely know (file does not contain + mixed instruments), or to maintain consistent symbology (such as BTCUSDT-PERP.BINANCE). + """ - def __init__(self, price_precision: int, size_precision: int) -> None: + def __init__( + self, + price_precision: int, + size_precision: int, + instrument_id: InstrumentId | None = None, + ) -> None: self._price_precision = price_precision self._size_precision = size_precision + self._instrument_id = ( + nautilus_pyo3.InstrumentId.from_str(instrument_id.value) if instrument_id else None + ) def load_deltas( self, @@ -73,6 +96,7 @@ def load_deltas( filepath=str(filepath), price_precision=self._price_precision, size_precision=self._size_precision, + instrument_id=self._instrument_id, limit=limit, ) data = capsule_to_list(capsule) @@ -84,6 +108,7 @@ def load_deltas( filepath=str(filepath), price_precision=self._price_precision, size_precision=self._size_precision, + instrument_id=self._instrument_id, limit=limit, ) @@ -140,6 +165,7 @@ def load_depth10( filepath=str(filepath), price_precision=self._price_precision, size_precision=self._size_precision, + instrument_id=self._instrument_id, limit=limit, ) data = capsule_to_list(capsule) @@ -151,6 +177,7 @@ def load_depth10( filepath=str(filepath), price_precision=self._price_precision, size_precision=self._size_precision, + instrument_id=self._instrument_id, limit=limit, ) case 25: @@ -159,6 +186,7 @@ def load_depth10( filepath=str(filepath), price_precision=self._price_precision, size_precision=self._size_precision, + instrument_id=self._instrument_id, limit=limit, ) data = capsule_to_list(capsule) @@ -170,6 +198,7 @@ def load_depth10( filepath=str(filepath), price_precision=self._price_precision, size_precision=self._size_precision, + instrument_id=self._instrument_id, limit=limit, ) case _: @@ -216,6 +245,7 @@ def load_quotes( filepath=str(filepath), price_precision=self._price_precision, size_precision=self._size_precision, + instrument_id=self._instrument_id, limit=limit, ) data = capsule_to_list(capsule) @@ -227,6 +257,7 @@ def load_quotes( filepath=str(filepath), price_precision=self._price_precision, size_precision=self._size_precision, + instrument_id=self._instrument_id, limit=limit, ) @@ -269,6 +300,7 @@ def load_trades( filepath=str(filepath), price_precision=self._price_precision, size_precision=self._size_precision, + instrument_id=self._instrument_id, limit=limit, ) data = capsule_to_list(capsule) @@ -280,5 +312,6 @@ def load_trades( filepath=str(filepath), price_precision=self._price_precision, size_precision=self._size_precision, + instrument_id=self._instrument_id, limit=limit, ) diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index 707b6ec1f215..6ed435779bdd 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -3965,16 +3965,16 @@ def ed25519_signature(private_key: bytes, data: str) -> str: ... # Tardis -def load_tardis_deltas(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> list[OrderBookDelta]: ... -def load_tardis_depth10_from_snapshot5(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> list[OrderBookDepth10]: ... # noqa -def load_tardis_depth10_from_snapshot25(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> list[OrderBookDepth10]: ... # noqa -def load_tardis_quotes(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> list[QuoteTick]: ... -def load_tardis_trades(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> list[TradeTick]: ... -def load_tardis_deltas_as_pycapsule(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> object: ... -def load_tardis_depth10_from_snapshot5_as_pycapsule(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> object: ... -def load_tardis_depth10_from_snapshot25_as_pycapsule(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> object: ... # noqa -def load_tardis_quotes_as_pycapsule(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> object: ... -def load_tardis_trades_as_pycapsule(filepath: str, price_precision: int, size_precision: int, limit: int | None = None) -> object: ... +def load_tardis_deltas(filepath: str, price_precision: int, size_precision: int, instrument_id: InstrumentId | None, limit: int | None = None) -> list[OrderBookDelta]: ... # noqa +def load_tardis_depth10_from_snapshot5(filepath: str, price_precision: int, size_precision: int, instrument_id: InstrumentId | None, limit: int | None = None) -> list[OrderBookDepth10]: ... # noqa +def load_tardis_depth10_from_snapshot25(filepath: str, price_precision: int, size_precision: int, instrument_id: InstrumentId | None, limit: int | None = None) -> list[OrderBookDepth10]: ... # noqa +def load_tardis_quotes(filepath: str, price_precision: int, size_precision: int, instrument_id: InstrumentId | None, limit: int | None = None) -> list[QuoteTick]: ... # noqa +def load_tardis_trades(filepath: str, price_precision: int, size_precision: int, instrument_id: InstrumentId | None, limit: int | None = None) -> list[TradeTick]: ... # noqa +def load_tardis_deltas_as_pycapsule(filepath: str, price_precision: int, size_precision: int, instrument_id: InstrumentId | None, limit: int | None = None) -> object: ... # noqa +def load_tardis_depth10_from_snapshot5_as_pycapsule(filepath: str, price_precision: int, size_precision: int, instrument_id: InstrumentId | None, limit: int | None = None) -> object: ... # noqa +def load_tardis_depth10_from_snapshot25_as_pycapsule(filepath: str, price_precision: int, size_precision: int, instrument_id: InstrumentId | None, limit: int | None = None) -> object: ... # noqa +def load_tardis_quotes_as_pycapsule(filepath: str, price_precision: int, size_precision: int, instrument_id: InstrumentId | None, limit: int | None = None) -> object: ... # noqa +def load_tardis_trades_as_pycapsule(filepath: str, price_precision: int, size_precision: int, instrument_id: InstrumentId | None, limit: int | None = None) -> object: ... # noqa # Greeks diff --git a/tests/integration_tests/adapters/tardis/test_loaders.py b/tests/integration_tests/adapters/tardis/test_loaders.py index a52bb5f3fb9f..2b84718e1bb4 100644 --- a/tests/integration_tests/adapters/tardis/test_loaders.py +++ b/tests/integration_tests/adapters/tardis/test_loaders.py @@ -52,14 +52,15 @@ def test_tardis_load_deltas(): def test_tardis_load_depth10_from_snapshot5(): # Arrange filepath = ensure_data_exists_tardis_binance_snapshot5() - loader = TardisCSVDataLoader(price_precision=1, size_precision=0) + instrument_id = InstrumentId.from_str("BTCUSDT-PERP.BINANCE") # Override instrument in data + loader = TardisCSVDataLoader(price_precision=1, size_precision=0, instrument_id=instrument_id) # Act deltas = loader.load_depth10(filepath, levels=5, limit=1_000) # Assert assert len(deltas) == 1_000 - assert deltas[0].instrument_id == InstrumentId.from_str("BTCUSDT.BINANCE") + assert deltas[0].instrument_id == instrument_id assert deltas[0].ts_event == 1598918403696000000 assert deltas[0].ts_init == 1598918403810979000 From da1731aa65be7277e97b41d3a60a043a15d034d7 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 11 Oct 2024 12:02:17 +1100 Subject: [PATCH 078/224] Update docs --- README.md | 91 +++++++++++++++++++------------------ docs/integrations/index.md | 24 +++++----- docs/integrations/tardis.md | 5 ++ 3 files changed, 63 insertions(+), 57 deletions(-) create mode 100644 docs/integrations/tardis.md diff --git a/README.md b/README.md index ff0ee3c73ef1..843b38e968fc 100644 --- a/README.md +++ b/README.md @@ -44,16 +44,16 @@ including FX, Equities, Futures, Options, CFDs, Crypto and Betting - across mult ## Features -- **Fast**: Core is written in Rust with asynchronous networking using [tokio](https://crates.io/crates/tokio) -- **Reliable**: Type safety and thread safety through Rust. Redis-backed performant state persistence -- **Portable**: OS independent, runs on Linux, macOS, and Windows. Deploy using Docker -- **Flexible**: Modular adapters mean any REST, WebSocket, or FIX API can be integrated -- **Advanced**: Time in force `IOC`, `FOK`, `GTD`, `AT_THE_OPEN`, `AT_THE_CLOSE`, advanced order types and conditional triggers. Execution instructions `post-only`, `reduce-only`, and icebergs. Contingency order lists including `OCO`, `OTO` -- **Customizable**: Add user-defined custom components, or assemble entire systems from scratch leveraging the cache and message bus -- **Backtesting**: Run with multiple venues, instruments and strategies simultaneously using historical quote tick, trade tick, bar, order book and custom data with nanosecond resolution -- **Live**: Use identical strategy implementations between backtesting and live deployments -- **Multi-venue**: Multiple venue capabilities facilitate market-making and statistical arbitrage strategies -- **AI Training**: Backtest engine fast enough to be used to train AI trading agents (RL/ES) +- **Fast**: Core is written in Rust with asynchronous networking using [tokio](https://crates.io/crates/tokio). +- **Reliable**: Type safety and thread safety through Rust. Redis-backed performant state persistence. +- **Portable**: OS independent, runs on Linux, macOS, and Windows. Deploy using Docker. +- **Flexible**: Modular adapters mean any REST, WebSocket, or FIX API can be integrated. +- **Advanced**: Time in force `IOC`, `FOK`, `GTD`, `AT_THE_OPEN`, `AT_THE_CLOSE`, advanced order types and conditional triggers. Execution instructions `post-only`, `reduce-only`, and icebergs. Contingency order lists including `OCO`, `OTO`. +- **Customizable**: Add user-defined custom components, or assemble entire systems from scratch leveraging the cache and message bus. +- **Backtesting**: Run with multiple venues, instruments and strategies simultaneously using historical quote tick, trade tick, bar, order book and custom data with nanosecond resolution. +- **Live**: Use identical strategy implementations between backtesting and live deployments. +- **Multi-venue**: Multiple venue capabilities facilitate market-making and statistical arbitrage strategies. +- **AI Training**: Backtest engine fast enough to be used to train AI trading agents (RL/ES). ![Alt text](https://github.com/nautechsystems/nautilus_trader/blob/develop/docs/_images/nautilus-art.png?raw=true "nautilus") @@ -64,10 +64,10 @@ including FX, Equities, Futures, Options, CFDs, Crypto and Betting - across mult ## Why NautilusTrader? -- **Highly performant event-driven Python**: Native binary core components -- **Parity between backtesting and live trading**: Identical strategy code -- **Reduced operational risk**: Risk management functionality, logical correctness and type safety -- **Highly extendable**: Message bus, custom components and actors, custom data, custom adapters +- **Highly performant event-driven Python**: Native binary core components. +- **Parity between backtesting and live trading**: Identical strategy code. +- **Reduced operational risk**: Risk management functionality, logical correctness and type safety. +- **Highly extendable**: Message bus, custom components and actors, custom data, custom adapters. Traditionally, trading strategy research and backtesting might be conducted in Python (or other suitable language) using vectorized methods, with the strategy then needing to be reimplemented in a more event-drive way @@ -136,14 +136,15 @@ The following integrations are currently supported: | [Interactive Brokers](https://www.interactivebrokers.com) | `INTERACTIVE_BROKERS` | Brokerage (multi-venue) | ![status](https://img.shields.io/badge/stable-green) | [Guide](https://nautilustrader.io/docs/latest/integrations/ib.html) | | [OKX](https://okx.com) | `OKX` | Crypto Exchange (CEX) | ![status](https://img.shields.io/badge/building-orange) | [Guide](https://nautilustrader.io/docs/latest/integrations/okx.html) | | [Polymarket](https://polymarket.com) | `POLYMARKET` | Prediction Market (DEX) | ![status](https://img.shields.io/badge/beta-yellow) | [Guide](https://nautilustrader.io/docs/latest/integrations/polymarket.html) | +| [Tardis](https://tardis.dev) | `TARDIS` | Data Provider | ![status](https://img.shields.io/badge/building-orange) | [Guide](https://nautilustrader.io/docs/latest/integrations/tardis.html) | -- **ID**: The default client ID for the integrations adapter clients -- **Type**: The type of integration (often the venue type) +- **ID**: The default client ID for the integrations adapter clients. +- **Type**: The type of integration (often the venue type). ### Status -- `building`: Under construction and likely not in a usable state -- `beta`: Completed to a minimally working state and in a 'beta' testing phase -- `stable`: Stabilized feature set and API, the integration has been tested by both developers and users to a reasonable level (some bugs may still remain) +- `building`: Under construction and likely not in a usable state. +- `beta`: Completed to a minimally working state and in a 'beta' testing phase. +- `stable`: Stabilized feature set and API, the integration has been tested by both developers and users to a reasonable level (some bugs may still remain). See the [Integrations](https://nautilustrader.io/docs/latest/integrations/index.html) documentation for further details. @@ -229,9 +230,9 @@ We strive to document these changes in the release notes on a best-effort basis. We strive to maintain a stable, passing build across all branches. -- `master`: Reflects the source code for the latest released version -- `nightly`: Contains experimental features, merged from the `develop` branch daily or as needed -- `develop`: Very active with frequent commits and may include experimental features +- `master`: Reflects the source code for the latest released version . +- `nightly`: Contains experimental features, merged from the `develop` branch daily or as needed. +- `develop`: Very active with frequent commits and may include experimental features. Our roadmap aims to achieve a stable API for version 2.x (likely post-Rust port). Once we reach this milestone, we will implement a formal release process, including deprecation @@ -241,42 +242,42 @@ periods for any API changes. This approach allows us to maintain a rapid develop A `Makefile` is provided to automate most installation and build tasks for development. It provides the following targets: -- `make install`: Installs in `release` build mode with `main`, `dev` and `test` dependencies then installs the package using poetry (default) -- `make install-debug`: Same as `make install` but with `debug` build mode -- `make install-just-deps`: Installs just the `main`, `dev` and `test` dependencies (does not install package) -- `make install-just-deps-all`: Same as `make install-just-deps` and additionally installs `docs` dependencies -- `make build`: Runs the build script in `release` build mode (default) -- `make build-debug`: Runs the build script in `debug` build mode -- `make build-wheel`: Runs the Poetry build with a wheel format in `release` mode -- `make build-wheel-debug`: Runs the Poetry build with a wheel format in `debug` mode -- `make clean`: **CAUTION** Cleans all non-source artifacts from the repository -- `make docs`: Builds the documentation HTML using Sphinx -- `make pre-commit`: Runs the pre-commit checks over all files -- `make ruff`: Runs ruff over all files using the `pyproject.toml` config -- `make outdated`: Runs commands to show outdated dependencies for both Rust and Python -- `make pytest`: Runs all tests with `pytest` (except performance tests) -- `make pytest-coverage`: Same as `make pytest` and additionally runs with test coverage and produces a report +- `make install`: Installs in `release` build mode with `main`, `dev` and `test` dependencies then installs the package using poetry (default). +- `make install-debug`: Same as `make install` but with `debug` build mode. +- `make install-just-deps`: Installs just the `main`, `dev` and `test` dependencies (does not install package). +- `make install-just-deps-all`: Same as `make install-just-deps` and additionally installs `docs` dependencies. +- `make build`: Runs the build script in `release` build mode (default). +- `make build-debug`: Runs the build script in `debug` build mode. +- `make build-wheel`: Runs the Poetry build with a wheel format in `release` mode. +- `make build-wheel-debug`: Runs the Poetry build with a wheel format in `debug` mode. +- `make clean`: **CAUTION** Cleans all non-source artifacts from the repository. +- `make docs`: Builds the documentation HTML using Sphinx. +- `make pre-commit`: Runs the pre-commit checks over all files. +- `make ruff`: Runs ruff over all files using the `pyproject.toml` config. +- `make outdated`: Runs commands to show outdated dependencies for both Rust and Python. +- `make pytest`: Runs all tests with `pytest` (except performance tests). +- `make pytest-coverage`: Same as `make pytest` and additionally runs with test coverage and produces a report. ## Examples Indicators and strategies can be developed in both Python and Cython. For performance and latency-sensitive applications, we recommend using Cython. Below are some examples: -- [indicator](/nautilus_trader/examples/indicators/ema_python.py) example written in Python -- [indicator](/nautilus_trader/indicators/) examples written in Cython -- [strategy](/nautilus_trader/examples/strategies/) examples written in both Python and Cython -- [backtest](/examples/backtest/) examples using a `BacktestEngine` directly +- [indicator](/nautilus_trader/examples/indicators/ema_python.py) example written in Python. +- [indicator](/nautilus_trader/indicators/) examples written in Cython. +- [strategy](/nautilus_trader/examples/strategies/) examples written in both Python and Cython. +- [backtest](/examples/backtest/) examples using a `BacktestEngine` directly. ## Docker Docker containers are built using the base image `python:3.12-slim` with the following variant tags: -- `nautilus_trader:latest` has the latest release version installed -- `nautilus_trader:nightly` has the head of the `nightly` branch installed +- `nautilus_trader:latest` has the latest release version installed. +- `nautilus_trader:nightly` has the head of the `nightly` branch installed. - `jupyterlab:latest` has the latest release version installed along with `jupyterlab` and an - example backtest notebook with accompanying data + example backtest notebook with accompanying data. - `jupyterlab:nightly` has the head of the `nightly` branch installed along with `jupyterlab` and an - example backtest notebook with accompanying data + example backtest notebook with accompanying data. The container images can be pulled as follows: diff --git a/docs/integrations/index.md b/docs/integrations/index.md index 0d69d2296d2e..9210f24057ac 100644 --- a/docs/integrations/index.md +++ b/docs/integrations/index.md @@ -17,15 +17,16 @@ The following integrations are currently supported: | [Interactive Brokers](https://www.interactivebrokers.com) | `INTERACTIVE_BROKERS` | Brokerage (multi-venue) | ![status](https://img.shields.io/badge/stable-green) | [Guide](integrations/ib.md) | | [OKX](https://okx.com) | `OKX` | Crypto Exchange (CEX) | ![status](https://img.shields.io/badge/building-orange) | [Guide](integrations/okx.md) | | [Polymarket](https://polymarket.com) | `POLYMARKET` | Prediction Market (DEX) | ![status](https://img.shields.io/badge/beta-yellow) | [Guide](integrations/polymarket.md) | +| [Tardis](https://tardis.dev) | `TARDIS` | Data Provider | ![status](https://img.shields.io/badge/building-orange) | [Guide](integrations/tardis.md) | -- **ID**: The default client ID for the integrations adapter clients -- **Type**: The type of integration (often the venue type) +- **ID**: The default client ID for the integrations adapter clients. +- **Type**: The type of integration (often the venue type). ### Status -- `building`: Under construction and likely not in a usable state -- `beta`: Completed to a minimally working state and in a 'beta' testing phase -- `stable`: Stabilized feature set and API, the integration has been tested by both developers and users to a reasonable level (some bugs may still remain) +- `building`: Under construction and likely not in a usable state. +- `beta`: Completed to a minimally working state and in a 'beta' testing phase. +- `stable`: Stabilized feature set and API, the integration has been tested by both developers and users to a reasonable level (some bugs may still remain). ## Implementation goals @@ -42,17 +43,16 @@ strategies, priority will be given to 'standard' functionality: The implementation of each integration aims to meet the following criteria: -- Low-level client components should match the exchange API as closely as possible -- The full range of an exchanges functionality (where applicable to NautilusTrader), should _eventually_ be supported +- Low-level client components should match the exchange API as closely as possible. +- The full range of an exchanges functionality (where applicable to NautilusTrader), should _eventually_ be supported. - Exchange specific data types will be added to support the functionality and return - types which are reasonably expected by a user -- Actions which are unsupported by either the exchange or NautilusTrader, will be explicitly logged as -a warning or error when a user attempts to perform said action + types which are reasonably expected by a user. +- Actions which are unsupported by either the exchange or NautilusTrader, will be explicitly logged as a warning or error when a user attempts to perform said action. ## API unification All integrations must be compatible with the NautilusTrader API at the system boundary, this means there is some normalization and standardization needed. -- All symbols will match the raw/native/local symbol for the exchange, unless there are conflicts (such as Binance using the same symbol for both Spot and Perpetual Futures markets) -- All timestamps will be either normalized to UNIX nanoseconds, or clearly marked as UNIX milliseconds by appending `_ms` to param and property names +- All symbols will match the raw/native/local symbol for the exchange, unless there are conflicts (such as Binance using the same symbol for both Spot and Perpetual Futures markets). +- All timestamps will be either normalized to UNIX nanoseconds, or clearly marked as UNIX milliseconds by appending `_ms` to param and property names. diff --git a/docs/integrations/tardis.md b/docs/integrations/tardis.md new file mode 100644 index 000000000000..479abad8c1c8 --- /dev/null +++ b/docs/integrations/tardis.md @@ -0,0 +1,5 @@ +# Tardis + +:::info +We are currently working on this integration guide. +::: From ff7d07c998be8cc4bd0336ce541bd6270967223d Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 11 Oct 2024 12:28:58 +1100 Subject: [PATCH 079/224] Refine loader tests --- .../adapters/tardis/test_loaders.py | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/tests/integration_tests/adapters/tardis/test_loaders.py b/tests/integration_tests/adapters/tardis/test_loaders.py index 2b84718e1bb4..5b7ae7c8947c 100644 --- a/tests/integration_tests/adapters/tardis/test_loaders.py +++ b/tests/integration_tests/adapters/tardis/test_loaders.py @@ -31,14 +31,19 @@ def test_tardis_load_deltas(): # Arrange filepath = ensure_data_exists_tardis_deribit_book_l2() - loader = TardisCSVDataLoader(price_precision=1, size_precision=0) + instrument_id = InstrumentId.from_str("BTC-PERPETUAL.DERIBIT") # Override instrument in data + loader = TardisCSVDataLoader( + price_precision=1, + size_precision=0, + instrument_id=instrument_id, + ) # Act - deltas = loader.load_deltas(filepath, limit=1_000) + deltas = loader.load_deltas(filepath, limit=100_000) # Assert - assert len(deltas) == 1_000 - assert deltas[0].instrument_id == InstrumentId.from_str("BTC-PERPETUAL.DERIBIT") + assert len(deltas) == 100_000 + assert deltas[0].instrument_id == instrument_id assert deltas[0].action == BookAction.ADD assert deltas[0].order.side == OrderSide.SELL assert deltas[0].order.price == Price.from_str("6421.5") @@ -52,15 +57,14 @@ def test_tardis_load_deltas(): def test_tardis_load_depth10_from_snapshot5(): # Arrange filepath = ensure_data_exists_tardis_binance_snapshot5() - instrument_id = InstrumentId.from_str("BTCUSDT-PERP.BINANCE") # Override instrument in data - loader = TardisCSVDataLoader(price_precision=1, size_precision=0, instrument_id=instrument_id) + loader = TardisCSVDataLoader(price_precision=1, size_precision=0) # Act - deltas = loader.load_depth10(filepath, levels=5, limit=1_000) + deltas = loader.load_depth10(filepath, levels=5, limit=100_000) # Assert - assert len(deltas) == 1_000 - assert deltas[0].instrument_id == instrument_id + assert len(deltas) == 100_000 + assert deltas[0].instrument_id == InstrumentId.from_str("BTCUSDT.BINANCE") assert deltas[0].ts_event == 1598918403696000000 assert deltas[0].ts_init == 1598918403810979000 @@ -68,14 +72,15 @@ def test_tardis_load_depth10_from_snapshot5(): def test_tardis_load_depth10_from_snapshot25(): # Arrange filepath = ensure_data_exists_tardis_binance_snapshot25() - loader = TardisCSVDataLoader(price_precision=1, size_precision=0) + instrument_id = InstrumentId.from_str("BTCUSDT-PERP.BINANCE") # Override instrument in data + loader = TardisCSVDataLoader(price_precision=1, size_precision=0, instrument_id=instrument_id) # Act - deltas = loader.load_depth10(filepath, levels=25, limit=1_000) + deltas = loader.load_depth10(filepath, levels=25, limit=100_000) # Assert - assert len(deltas) == 1_000 - assert deltas[0].instrument_id == InstrumentId.from_str("BTCUSDT.BINANCE") + assert len(deltas) == 100_000 + assert deltas[0].instrument_id == InstrumentId.from_str("BTCUSDT-PERP.BINANCE") assert deltas[0].ts_event == 1598918403696000000 assert deltas[0].ts_init == 1598918403810979000 @@ -86,10 +91,10 @@ def test_tardis_load_quotes(): loader = TardisCSVDataLoader(price_precision=1, size_precision=0) # Act - trades = loader.load_quotes(filepath, limit=1_000) + trades = loader.load_quotes(filepath, limit=100_000) # Assert - assert len(trades) == 1_000 + assert len(trades) == 100_000 assert trades[0].instrument_id == InstrumentId.from_str("BTC-USD.HUOBI") assert trades[0].bid_price == Price.from_str("8629.2") assert trades[0].ask_price == Price.from_str("8629.3") @@ -105,10 +110,10 @@ def test_tardis_load_trades(): loader = TardisCSVDataLoader(price_precision=1, size_precision=0) # Act - trades = loader.load_trades(filepath, limit=1_000) + trades = loader.load_trades(filepath, limit=100_000) # Assert - assert len(trades) == 1_000 + assert len(trades) == 100_000 assert trades[0].instrument_id == InstrumentId.from_str("XBTUSD.BITMEX") assert trades[0].price == Price.from_str("8531.5") assert trades[0].size == Quantity.from_str("2152") From f4216c166631cc7093ab3d4939dbe95cce0b4b53 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 11 Oct 2024 16:48:39 +1100 Subject: [PATCH 080/224] Reorganize dependencies --- nautilus_core/Cargo.lock | 14 +- nautilus_core/Cargo.toml | 7 +- nautilus_core/adapters/Cargo.toml | 16 +- .../adapters/src/tardis/bin/example.rs | 48 +++ nautilus_core/adapters/src/tardis/enums.rs | 128 +++++++ nautilus_core/adapters/src/tardis/machine.rs | 155 +++++++++ nautilus_core/adapters/src/tardis/message.rs | 313 ++++++++++++++---- nautilus_core/adapters/src/tardis/mod.rs | 2 + nautilus_core/adapters/src/tardis/record.rs | 12 +- nautilus_core/common/Cargo.toml | 3 +- nautilus_core/network/Cargo.toml | 7 +- nautilus_core/network/src/tls.rs | 3 +- 12 files changed, 626 insertions(+), 82 deletions(-) create mode 100644 nautilus_core/adapters/src/tardis/bin/example.rs create mode 100644 nautilus_core/adapters/src/tardis/enums.rs create mode 100644 nautilus_core/adapters/src/tardis/machine.rs diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 74c939899c2b..d6adf73942d1 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -827,6 +827,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-targets 0.52.6", ] @@ -2675,6 +2676,7 @@ name = "nautilus-adapters" version = "0.34.0" dependencies = [ "anyhow", + "async-stream", "base64", "chrono", "criterion", @@ -2682,6 +2684,7 @@ dependencies = [ "databento", "fallible-streaming-iterator", "flate2", + "futures-util", "hex", "indexmap", "itoa", @@ -2703,7 +2706,11 @@ dependencies = [ "thiserror", "time", "tokio", + "tokio-tungstenite", "tracing", + "tracing-subscriber", + "tracing-test", + "urlencoding", "ustr", ] @@ -2970,7 +2977,6 @@ dependencies = [ "tokio-tungstenite", "tracing", "tracing-test", - "tungstenite", ] [[package]] @@ -5504,6 +5510,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "ustr" version = "1.0.0" diff --git a/nautilus_core/Cargo.toml b/nautilus_core/Cargo.toml index 720c5502e650..99f45be8fefc 100644 --- a/nautilus_core/Cargo.toml +++ b/nautilus_core/Cargo.toml @@ -30,9 +30,10 @@ documentation = "https://nautilustrader.io/docs" anyhow = "1.0.89" base64 = "0.22.1" bytes = { version = "1.7.2", features = ["serde"] } -chrono = "0.4.38" +chrono = { version = "0.4.38", features = ["serde"] } derive_builder = "0.20.2" futures = "0.3.31" +futures-util = "0.3.31" hex = "0.4.3" indexmap = { version = "2.6.0", features = ["serde"] } itertools = "0.12.1" @@ -54,7 +55,10 @@ strum = { version = "0.26.3", features = ["derive"] } thiserror = "1.0.64" thousands = "0.2.0" tracing = "0.1.40" +# Disable default feature "tracing-log" since it interferes with custom logging +tracing-subscriber = { version = "0.3.18", default-features = false, features = ["smallvec", "fmt", "ansi", "std", "env-filter"] } tokio = { version = "1.40.0", features = ["full"] } +tokio-tungstenite = { version = "0.24.0", features = ["rustls-tls-native-roots"] } ustr = { version = "1.0.0", features = ["serde"] } uuid = { version = "1.10.0", features = ["v4"] } @@ -67,6 +71,7 @@ pretty_assertions = "1.4.1" proptest = "1.5.0" rstest = "0.23.0" tempfile = "3.13.0" +tracing-test = "0.2.5" # build-dependencies cbindgen = "0.27.0" diff --git a/nautilus_core/adapters/Cargo.toml b/nautilus_core/adapters/Cargo.toml index 6f1d0413e00f..7d874d4f408d 100644 --- a/nautilus_core/adapters/Cargo.toml +++ b/nautilus_core/adapters/Cargo.toml @@ -11,9 +11,13 @@ name = "nautilus_adapters" crate-type = ["rlib", "staticlib", "cdylib"] [[bin]] -name = "sandbox" +name = "databento-sandbox" path = "src/databento/bin/sandbox.rs" +[[bin]] +name = "tardis-machine" +path = "src/tardis/bin/example.rs" + [dependencies] nautilus-common = { path = "../common" } nautilus-core = { path = "../core" } @@ -21,6 +25,7 @@ nautilus-model = { path = "../model", features = ["stubs"] } anyhow = { workspace = true } base64 = { workspace = true } chrono = { workspace = true } +futures-util = { workspace = true } hex = { workspace = true } indexmap = { workspace = true } itoa = { workspace = true } @@ -34,20 +39,25 @@ serde = { workspace = true } serde_json = { workspace = true } strum = { workspace = true } tokio = { workspace = true } +tokio-tungstenite = { workspace = true, optional = true } tracing = { workspace = true } +tracing-subscriber = { workspace = true } thiserror = { workspace = true } ustr = { workspace = true } -databento = { version = "0.14.1", optional = true } +async-stream = "0.3.6" csv = "1.3.0" +databento = { version = "0.14.1", optional = true } fallible-streaming-iterator = "0.1.9" flate2 = "1.0.34" pem = "3.0.4" time = "0.3.36" +urlencoding = { version = "2.1.3", optional = true } [dev-dependencies] nautilus-test-kit = { path = "../test_kit" } criterion = { workspace = true } rstest = { workspace = true } +tracing-test = { workspace = true } [features] default = ["databento", "ffi", "python", "tardis"] @@ -70,4 +80,4 @@ python = [ "nautilus-core/python", "nautilus-model/python", ] -tardis = [] +tardis = ["python", "tokio-tungstenite", "urlencoding"] diff --git a/nautilus_core/adapters/src/tardis/bin/example.rs b/nautilus_core/adapters/src/tardis/bin/example.rs new file mode 100644 index 000000000000..d3422d5def3e --- /dev/null +++ b/nautilus_core/adapters/src/tardis/bin/example.rs @@ -0,0 +1,48 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +// use chrono::NaiveDate; +// use futures_util::{pin_mut, StreamExt}; +// use nautilus_adapters::tardis::{ +// enums::Exchange, +// machine::{ReplayNormalizedRequestOptions, TardisClient}, +// }; + +#[tokio::main] +async fn main() { + // tracing_subscriber::fmt() + // .with_max_level(tracing::Level::TRACE) + // .init(); + // + // let client = TardisClient::new(std::env::var("TARDIS_MACHINE_WS_URL").unwrap()); + // + // let stream = client + // .replay_normalized(vec![ReplayNormalizedRequestOptions { + // exchange: Exchange::Bitmex, + // symbols: Some(vec!["XBTUSD".to_string()]), + // from: NaiveDate::from_ymd_opt(2019, 10, 1).unwrap(), + // to: NaiveDate::from_ymd_opt(2019, 10, 2).unwrap(), + // data_types: vec!["book_change".to_string()], + // with_disconnect_messages: Some(true), + // }]) + // .await + // .unwrap(); + // + // pin_mut!(stream); + // + // while let Some(msg) = stream.next().await { + // println!("Received trade bar: {:?}", msg); + // } +} diff --git a/nautilus_core/adapters/src/tardis/enums.rs b/nautilus_core/adapters/src/tardis/enums.rs new file mode 100644 index 000000000000..d3d6719139aa --- /dev/null +++ b/nautilus_core/adapters/src/tardis/enums.rs @@ -0,0 +1,128 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use serde::{Deserialize, Serialize}; + +use super::message::{ + BarMsg, BookChangeMsg, BookSnapshotMsg, DerivativeTickerMsg, DisconnectMsg, TradeMsg, +}; + +/// A Tardis Machine Server message type. +#[allow(missing_docs)] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "snake_case", tag = "type")] +pub enum WsMessage { + Trade(TradeMsg), + BookChange(BookChangeMsg), + BookSnapshot(BookSnapshotMsg), + DerivativeTicker(DerivativeTickerMsg), + Bar(BarMsg), + Disconnect(DisconnectMsg), +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +/// The type of the symbol eg. Spot, Perpetual, Future, Option. +pub enum SymbolType { + Spot, + Perpetual, + Future, + Option, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +/// The type of an option symbol. +pub enum OptionType { + Call, + Put, +} + +/// The aggressor side of the trade. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum TradeSide { + Buy, + Sell, + Unknown, +} + +/// The kind of bar. +#[allow(missing_docs)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum BarKind { + Time, + Volume, + Tick, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +/// Represents a crypto exchange. +/// See for all supported exchanges. +pub enum Exchange { + Bitmex, + Deribit, + BinanceFutures, + BinanceDelivery, + BinanceOptions, + Binance, + Ftx, + OkexFutures, + OkexOptions, + OkexSwap, + Okex, + HuobiDm, + HuobiDmSwap, + HuobiDmLinearSwap, + Huobi, + BitfinexDerivatives, + Bitfinex, + Coinbase, + Cryptofacilities, + Kraken, + Bitstamp, + Gemini, + Poloniex, + Bybit, + BybitSpot, + BybitOptions, + Phemex, + Delta, + FtxUs, + BinanceUs, + GateIoFutures, + GateIo, + Okcoin, + Bitflyer, + Hitbtc, + Coinflex, + BinanceJersey, + BinanceDex, + Upbit, + Ascendex, + Dydx, + Serum, + Mango, + HuobiDmPptions, + StarAtlas, + CryptoCom, + CryptoComDerivatives, + Kucoin, + Bitnomial, + WooX, + BlockchainCom, +} diff --git a/nautilus_core/adapters/src/tardis/machine.rs b/nautilus_core/adapters/src/tardis/machine.rs new file mode 100644 index 000000000000..0b45de9a5084 --- /dev/null +++ b/nautilus_core/adapters/src/tardis/machine.rs @@ -0,0 +1,155 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +#![allow(dead_code)] // Use for initial development + +use chrono::NaiveDate; +use serde::{Deserialize, Serialize}; +use tokio_tungstenite::tungstenite::{self}; + +use super::enums::Exchange; + +/// The options that can be specified for calling Tardis Machine Server's replay-normalized. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ReplayNormalizedRequestOptions { + /// Requested [`Exchange`]. + pub exchange: Exchange, + /// Optional symbols of requested historical data feed. + /// Use /exchanges/:exchange HTTP API to get allowed symbols for requested exchange. + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(default)] + pub symbols: Option>, + /// Replay period start date (UTC) in a ISO 8601 format, e.g., 2019-04-01. + pub from: NaiveDate, + /// Replay period start date (UTC) in a ISO 8601 format, e.g., 2019-04-02. + pub to: NaiveDate, + /// Array of normalized [data types](https://docs.tardis.dev/api/tardis-machine#normalized-data-types) + /// for which real-time data will be provided. + pub data_types: Vec, + /// When set to true, sends also disconnect messages that mark events when real-time WebSocket + /// connection that was used to collect the historical data got disconnected. + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(default)] + pub with_disconnect_messages: Option, +} + +/// The options that can be specified for calling Tardis Machine Server's stream-normalized. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StreamNormalizedRequestOptions { + /// Requested [`Exchange`]. + pub exchange: Exchange, + /// Optional symbols of requested real-time data feed. + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(default)] + pub symbols: Option>, + /// Array of normalized [data types](https://docs.tardis.dev/api/tardis-machine#normalized-data-types) + /// for which real-time data will be provided. + pub data_types: Vec, + /// When set to true, sends disconnect messages anytime underlying exchange real-time WebSocket + /// connection(s) gets disconnected. + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(default)] + pub with_disconnect_messages: Option, + /// Specifies time in milliseconds after which connection to real-time exchanges' WebSocket API + /// is restarted if no message has been received. + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(default, rename = "timeoutIntervalMS")] + pub timeout_interval_ms: Option, +} + +pub type Result = std::result::Result; + +/// The error that could happen while interacting with Tardis Machine Server. +#[derive(Debug, thiserror::Error)] +pub enum Error { + /// An error that could happen when an empty options array was given. + #[error("Options cannot be empty")] + EmptyOptions, + /// An error when failed to connect to Tardis' websocket connection. + #[error("Failed to connect: {0}")] + ConnectFailed(#[from] tungstenite::Error), + /// An error when WS connection to the machine server was rejected. + #[error("Connection rejected: {reason}")] + ConnectRejected { + /// The status code for the initial WS connection. + status: tungstenite::http::StatusCode, + /// The reason why the connection was rejected. + reason: String, + }, + /// An error where the websocket connection was closed unexpectedly by Tardis. + #[error("Connection closed: {reason}")] + ConnectionClosed { + /// The reason why the connection was closed. + reason: String, + }, + /// An error when deserializing the response from Tardis. + #[error("Failed to deserialize message: {0}")] + Deserialization(#[from] serde_json::Error), +} + +/// Provides a client for connecting to a [Tardis Machine Server](https://docs.tardis.dev/api/tardis-machine). +pub struct TardisClient { + url: String, +} + +impl TardisClient { + /// Creates a new [`Client`] instance. + pub fn new(url: impl ToString) -> Self { + Self { + url: url.to_string(), + } + } + + // pub async fn replay_normalized( + // &self, + // options: Vec, + // ) -> Result>> { + // if options.len() == 0 { + // return Err(Error::EmptyOptions); + // } + // + // let options = serde_json::to_string(&options)?; + // let url = format!( + // "{}/ws-replay-normalized?options={}", + // &self.url, + // urlencoding::encode(&options) + // ); + // + // // let url = "ws://localhost:8001/ws-replay" + // let url = "ws://localhost:8001/ws-replay?exchange=bitmex&from=2019-10-01&to=2019-10-02"; + // + // tracing::info!("[replay_normalized] url to tardis {url}"); + // } + // + // pub async fn stream_normalized( + // &self, + // options: Vec, + // ) -> Result>> { + // if options.len() == 0 { + // return Err(Error::EmptyOptions); + // } + // + // let options = serde_json::to_string(&options)?; + // let url = format!( + // "{}/ws-stream-normalized?options={}", + // &self.url, + // urlencoding::encode(&options) + // ); + // + // tracing::info!("[stream_normalized] url to tardis {url}"); + // } +} diff --git a/nautilus_core/adapters/src/tardis/message.rs b/nautilus_core/adapters/src/tardis/message.rs index c58fbc07f092..df361ada20f0 100644 --- a/nautilus_core/adapters/src/tardis/message.rs +++ b/nautilus_core/adapters/src/tardis/message.rs @@ -13,21 +13,14 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- +use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; -/// Represents the type of Tardis WebSocket message. -#[derive(Debug, PartialEq, Deserialize, Serialize)] -#[serde(rename_all = "snake_case")] -pub enum MessageType { - BookChange, - BookSnapshot, - Trade, - Unknown(String), -} +use super::enums::Exchange; /// Represents a single level in the order book (bid or ask). -#[derive(Debug, Deserialize, Serialize)] -pub struct OrderBookLevel { +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct BookLevel { /// The price at this level. pub price: f64, /// The amount at this level. @@ -35,41 +28,33 @@ pub struct OrderBookLevel { } /// Represents a Tardis WebSocket message for book changes. -#[derive(Debug, Deserialize, Serialize)] -#[serde(tag = "type")] +#[derive(Debug, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] -pub struct BookChangeMessage { - /// The type of message (tagged union). - #[serde(rename = "type")] - pub msg_type: MessageType, - /// The instrument symbol as provided by the exchange. +pub struct BookChangeMsg { + /// The symbol as provided by the exchange. pub symbol: String, /// The exchange ID. - pub exchange: String, + pub exchange: Exchange, /// Indicates whether this is an initial order book snapshot. pub is_snapshot: bool, /// Updated bids, with price and amount levels. - pub bids: Vec, + pub bids: Vec, /// Updated asks, with price and amount levels. - pub asks: Vec, + pub asks: Vec, /// The order book update timestamp provided by the exchange (ISO 8601 format). - pub timestamp: String, - /// The local timestamp when the message was received (ISO 8601 format). - pub local_timestamp: String, + pub timestamp: DateTime, + /// The local timestamp when the message was received. + pub local_timestamp: DateTime, } /// Represents a Tardis WebSocket message for book snapshots. -#[derive(Debug, Deserialize, Serialize)] -#[serde(tag = "type")] +#[derive(Debug, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] -pub struct BookSnapshotMessage { - /// The type of message (tagged union). - #[serde(rename = "type")] - pub msg_type: MessageType, - /// The instrument symbol as provided by the exchange. +pub struct BookSnapshotMsg { + /// The symbol as provided by the exchange. pub symbol: String, /// The exchange ID. - pub exchange: String, + pub exchange: Exchange, /// The name of the snapshot, e.g., `book_snapshot_{depth}_{interval}{time_unit}`. pub name: String, /// The requested number of levels (top bids/asks). @@ -77,27 +62,24 @@ pub struct BookSnapshotMessage { /// The requested snapshot interval in milliseconds. pub interval: u32, /// The top bids price-amount levels. - pub bids: Vec, + pub bids: Vec, /// The top asks price-amount levels. - pub asks: Vec, + pub asks: Vec, /// The snapshot timestamp based on the last book change message processed timestamp. - pub timestamp: String, + pub timestamp: DateTime, /// The local timestamp when the message was received. - pub local_timestamp: String, + pub local_timestamp: DateTime, } /// Represents a Tardis WebSocket message for trades. -#[derive(Debug, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize)] #[serde(tag = "type")] #[serde(rename_all = "camelCase")] -pub struct TradeMessage { - /// The type of message (tagged union). - #[serde(rename = "type")] - pub msg_type: MessageType, - /// The instrument symbol as provided by the exchange. +pub struct TradeMsg { + /// The symbol as provided by the exchange. pub symbol: String, /// The exchange ID. - pub exchange: String, + pub exchange: Exchange, /// The trade ID provided by the exchange (optional). pub id: Option, /// The trade price as provided by the exchange. @@ -106,10 +88,87 @@ pub struct TradeMessage { pub amount: f64, /// The liquidity taker side (aggressor) for the trade. pub side: String, - /// The trade timestamp provided by the exchange (ISO 8601 format). - pub timestamp: String, - /// The local timestamp when the message was received (ISO 8601 format). - pub local_timestamp: String, + /// The trade timestamp provided by the exchange. + pub timestamp: DateTime, + /// The local timestamp when the message was received. + pub local_timestamp: DateTime, +} + +/// Derivative instrument ticker info sourced from real-time ticker & instrument channels. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct DerivativeTickerMsg { + /// The symbol as provided by the exchange. + pub symbol: String, + /// The exchange ID. + pub exchange: Exchange, + /// The last instrument price if provided by exchange. + pub last_price: Option, + /// The last open interest if provided by exchange. + pub open_interest: Option, + /// The last funding rate if provided by exchange. + pub funding_rate: Option, + /// The last index price if provided by exchange. + pub index_price: Option, + /// The last mark price if provided by exchange. + pub mark_price: Option, + /// The message timestamp provided by exchange. + pub timestamp: DateTime, + /// The local timestamp when the message was received. + pub local_timestamp: DateTime, +} + +/// Trades data in aggregated form, known as OHLC, candlesticks, klines etc. Not only most common +/// time based aggregation is supported, but volume and tick count based as well. Bars are computed +/// from tick-by-tick raw trade data, if in given interval no trades happened, there is no bar produced. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct BarMsg { + /// The symbol as provided by the exchange. + pub symbol: String, + /// The exchange ID. + pub exchange: Exchange, + /// name with format trade_bar_{interval} + pub name: String, + /// The requested trade bar interval. + pub interval: u64, + /// The open price. + pub open: f64, + /// The high price. + pub high: f64, + /// The low price. + pub low: f64, + /// The close price. + pub close: f64, + /// The total volume traded in given interval. + pub volume: f64, + /// The buy volume traded in given interval. + pub buy_volume: f64, + /// The sell volume traded in given interval. + pub sell_volume: f64, + /// The trades count in given interval. + pub trades: u64, + /// The volume weighted average price. + pub vwap: f64, + /// The timestamp of first trade for given bar. + pub open_timestamp: DateTime, + /// The timestamp of last trade for given bar. + pub close_timestamp: DateTime, + /// The end of interval period timestamp. + pub timestamp: DateTime, + /// The message arrival timestamp that triggered given bar computation. + pub local_timestamp: DateTime, +} + +/// Message that marks events when real-time WebSocket connection that was used to collect the +/// historical data got disconnected. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct DisconnectMsg { + /// The exchange ID. + pub exchange: Exchange, + /// The message arrival timestamp that triggered given bar computation (ISO 8601 format). + pub local_timestamp: DateTime, } //////////////////////////////////////////////////////////////////////////////// @@ -141,19 +200,23 @@ mod tests { } "#; - let message: BookChangeMessage = - serde_json::from_str(json_data).expect("Failed to parse JSON"); + let message: BookChangeMsg = serde_json::from_str(json_data).expect("Failed to parse JSON"); - assert_eq!(message.msg_type, MessageType::BookChange); assert_eq!(message.symbol, "XBTUSD"); - assert_eq!(message.exchange, "bitmex"); + assert_eq!(message.exchange, Exchange::Bitmex); assert_eq!(message.is_snapshot, false); assert!(message.bids.is_empty()); assert_eq!(message.asks.len(), 1); assert_eq!(message.asks[0].price, 7985.0); assert_eq!(message.asks[0].amount, 283318.0); - assert_eq!(message.timestamp, "2019-10-23T11:29:53.469Z"); - assert_eq!(message.local_timestamp, "2019-10-23T11:29:53.469Z"); + assert_eq!( + message.timestamp, + DateTime::parse_from_rfc3339("2019-10-23T11:29:53.469Z").unwrap() + ); + assert_eq!( + message.local_timestamp, + DateTime::parse_from_rfc3339("2019-10-23T11:29:53.469Z").unwrap() + ); } #[rstest] @@ -191,12 +254,11 @@ mod tests { } "#; - let message: BookSnapshotMessage = + let message: BookSnapshotMsg = serde_json::from_str(json_data).expect("Failed to parse JSON"); - assert_eq!(message.msg_type, MessageType::BookSnapshot); assert_eq!(message.symbol, "XBTUSD"); - assert_eq!(message.exchange, "bitmex"); + assert_eq!(message.exchange, Exchange::Bitmex); assert_eq!(message.name, "book_snapshot_2_50ms"); assert_eq!(message.depth, 2); assert_eq!(message.interval, 50); @@ -206,8 +268,14 @@ mod tests { assert_eq!(message.bids[0].amount, 1906067.0); assert_eq!(message.asks[0].price, 7634.0); assert_eq!(message.asks[0].amount, 1467849.0); - assert_eq!(message.timestamp, "2019-10-25T13:39:46.950Z"); - assert_eq!(message.local_timestamp, "2019-10-25T13:39:46.961Z"); + assert_eq!( + message.timestamp, + DateTime::parse_from_rfc3339("2019-10-25T13:39:46.950Z").unwrap(), + ); + assert_eq!( + message.local_timestamp, + DateTime::parse_from_rfc3339("2019-10-25T13:39:46.961Z").unwrap() + ) } #[rstest] @@ -226,11 +294,10 @@ mod tests { } "#; - let message: TradeMessage = serde_json::from_str(json_data).expect("Failed to parse JSON"); + let message: TradeMsg = serde_json::from_str(json_data).expect("Failed to parse JSON"); - assert_eq!(message.msg_type, MessageType::Trade); assert_eq!(message.symbol, "XBTUSD"); - assert_eq!(message.exchange, "bitmex"); + assert_eq!(message.exchange, Exchange::Bitmex); assert_eq!( message.id, Some("282a0445-0e3a-abeb-f403-11003204ea1b".to_string()) @@ -238,7 +305,127 @@ mod tests { assert_eq!(message.price, 7996.0); assert_eq!(message.amount, 50.0); assert_eq!(message.side, "sell"); - assert_eq!(message.timestamp, "2019-10-23T10:32:49.669Z"); - assert_eq!(message.local_timestamp, "2019-10-23T10:32:49.740Z"); + assert_eq!( + message.timestamp, + DateTime::parse_from_rfc3339("2019-10-23T10:32:49.669Z").unwrap() + ); + assert_eq!( + message.local_timestamp, + DateTime::parse_from_rfc3339("2019-10-23T10:32:49.740Z").unwrap() + ); + } + + #[rstest] + fn test_parse_derivative_ticker_message() { + let json_data = r#" + { + "type": "derivative_ticker", + "symbol": "BTC-PERPETUAL", + "exchange": "deribit", + "lastPrice": 7987.5, + "openInterest": 84129491, + "fundingRate": -0.00001568, + "indexPrice": 7989.28, + "markPrice": 7987.56, + "timestamp": "2019-10-23T11:34:29.302Z", + "localTimestamp": "2019-10-23T11:34:29.416Z" + } + "#; + + let message: DerivativeTickerMsg = + serde_json::from_str(json_data).expect("Failed to parse JSON"); + + assert_eq!(message.symbol, "BTC-PERPETUAL"); + assert_eq!(message.exchange, Exchange::Deribit); + assert_eq!(message.last_price, Some(7987.5)); + assert_eq!(message.open_interest, Some(84129491.0)); + assert_eq!(message.funding_rate, Some(-0.00001568)); + assert_eq!(message.index_price, Some(7989.28)); + assert_eq!(message.mark_price, Some(7987.56)); + assert_eq!( + message.timestamp, + DateTime::parse_from_rfc3339("2019-10-23T11:34:29.302Z").unwrap() + ); + assert_eq!( + message.local_timestamp, + DateTime::parse_from_rfc3339("2019-10-23T11:34:29.416Z").unwrap() + ); + } + + #[rstest] + fn test_parse_bar_message() { + let json_data = r#" + { + "type": "trade_bar", + "symbol": "XBTUSD", + "exchange": "bitmex", + "name": "trade_bar_10000ms", + "interval": 10000, + "open": 7623.5, + "high": 7623.5, + "low": 7623, + "close": 7623.5, + "volume": 37034, + "buyVolume": 24244, + "sellVolume": 12790, + "trades": 9, + "vwap": 7623.327320840309, + "openTimestamp": "2019-10-25T13:11:31.574Z", + "closeTimestamp": "2019-10-25T13:11:39.212Z", + "localTimestamp": "2019-10-25T13:11:40.369Z", + "timestamp": "2019-10-25T13:11:40.000Z" + } + "#; + + let message: BarMsg = serde_json::from_str(json_data).expect("Failed to parse JSON"); + + assert_eq!(message.symbol, "XBTUSD"); + assert_eq!(message.exchange, Exchange::Bitmex); + assert_eq!(message.name, "trade_bar_10000ms"); + assert_eq!(message.interval, 10000); + assert_eq!(message.open, 7623.5); + assert_eq!(message.high, 7623.5); + assert_eq!(message.low, 7623.0); + assert_eq!(message.close, 7623.5); + assert_eq!(message.volume, 37034.0); + assert_eq!(message.buy_volume, 24244.0); + assert_eq!(message.sell_volume, 12790.0); + assert_eq!(message.trades, 9); + assert_eq!(message.vwap, 7623.327320840309); + assert_eq!( + message.open_timestamp, + DateTime::parse_from_rfc3339("2019-10-25T13:11:31.574Z").unwrap() + ); + assert_eq!( + message.close_timestamp, + DateTime::parse_from_rfc3339("2019-10-25T13:11:39.212Z").unwrap() + ); + assert_eq!( + message.local_timestamp, + DateTime::parse_from_rfc3339("2019-10-25T13:11:40.369Z").unwrap() + ); + assert_eq!( + message.timestamp, + DateTime::parse_from_rfc3339("2019-10-25T13:11:40.000Z").unwrap() + ); + } + + #[rstest] + fn test_parse_disconnect_message() { + let json_data = r#" + { + "type": "disconnect", + "exchange": "deribit", + "localTimestamp": "2019-10-23T11:34:29.416Z" + } + "#; + + let message: DisconnectMsg = serde_json::from_str(json_data).expect("Failed to parse JSON"); + + assert_eq!(message.exchange, Exchange::Deribit); + assert_eq!( + message.local_timestamp, + DateTime::parse_from_rfc3339("2019-10-23T11:34:29.416Z").unwrap() + ); } } diff --git a/nautilus_core/adapters/src/tardis/mod.rs b/nautilus_core/adapters/src/tardis/mod.rs index 52f7a69fc25d..ff9969f74527 100644 --- a/nautilus_core/adapters/src/tardis/mod.rs +++ b/nautilus_core/adapters/src/tardis/mod.rs @@ -16,6 +16,8 @@ //! The [Tardis](https://tardis.dev) integration adapter. pub mod csv; +pub mod enums; +pub mod machine; pub mod message; pub mod parse; pub mod record; diff --git a/nautilus_core/adapters/src/tardis/record.rs b/nautilus_core/adapters/src/tardis/record.rs index 5fd7171600de..bc6b33df8764 100644 --- a/nautilus_core/adapters/src/tardis/record.rs +++ b/nautilus_core/adapters/src/tardis/record.rs @@ -13,10 +13,10 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- -use serde::Deserialize; +use serde::{Deserialize, Serialize}; /// Represents a Tardis format order book update record. -#[derive(Debug, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct TardisBookUpdateRecord { /// The exchange ID. pub exchange: String, @@ -37,7 +37,7 @@ pub struct TardisBookUpdateRecord { } /// Represents a Tardis format order book 5 level snapshot record. -#[derive(Debug, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct TardisOrderBookSnapshot5Record { /// The exchange ID. pub exchange: String, @@ -90,7 +90,7 @@ pub struct TardisOrderBookSnapshot5Record { } /// Represents a Tardis format order book 25 level snapshot record. -#[derive(Debug, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct TardisOrderBookSnapshot25Record { /// The exchange ID. pub exchange: String, @@ -228,7 +228,7 @@ pub struct TardisOrderBookSnapshot25Record { } /// Represents a Tardis format quote record. -#[derive(Debug, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct TardisQuoteRecord { /// The exchande ID. pub exchange: String, @@ -249,7 +249,7 @@ pub struct TardisQuoteRecord { } /// Represents a Tardis format trade record. -#[derive(Debug, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct TardisTradeRecord { /// The exchande ID. pub exchange: String, diff --git a/nautilus_core/common/Cargo.toml b/nautilus_core/common/Cargo.toml index d24e0e29939f..4462215c6f55 100644 --- a/nautilus_core/common/Cargo.toml +++ b/nautilus_core/common/Cargo.toml @@ -28,9 +28,8 @@ serde = { workspace = true } serde_json = { workspace = true } strum = { workspace = true } tokio = { workspace = true } -# Disable default feature "tracing-log" since it interferes with custom logging -tracing-subscriber = { version = "0.3.18", default-features = false, features = ["smallvec", "fmt", "ansi", "std", "env-filter"] } tracing = { workspace = true } +tracing-subscriber = { workspace = true } ustr = { workspace = true } uuid = { workspace = true } sysinfo = "0.32.0" diff --git a/nautilus_core/network/Cargo.toml b/nautilus_core/network/Cargo.toml index c4f8e166e02e..ae40d50a0e73 100644 --- a/nautilus_core/network/Cargo.toml +++ b/nautilus_core/network/Cargo.toml @@ -15,29 +15,28 @@ nautilus-core = { path = "../core" } anyhow = { workspace = true } bytes = { workspace = true } futures = { workspace = true } +futures-util = { workspace = true } pyo3 = { workspace = true, optional = true } pyo3-asyncio-0-21 = { workspace = true, optional = true } reqwest = { workspace = true } tracing = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true } +tokio-tungstenite = { workspace = true } dashmap = "6.1.0" -futures-util = "0.3.30" http = "1.1.0" hyper = "1.4.1" nonzero_ext = "0.3.0" rustls = { version = "0.23.14", features = ["ring"] } rustls-native-certs = "0.8.0" tokio-rustls = "0.26.0" -tokio-tungstenite = { version = "0.24.0", features = ["rustls-tls-native-roots"] } -tungstenite = "0.24.0" [dev-dependencies] axum = { workspace = true } criterion = { workspace = true } serde_json = { workspace = true } rstest = { workspace = true } -tracing-test = "0.2.5" +tracing-test = { workspace = true } [features] default = ["python"] diff --git a/nautilus_core/network/src/tls.rs b/nautilus_core/network/src/tls.rs index 36fc961a87b8..b4c2e7b53830 100644 --- a/nautilus_core/network/src/tls.rs +++ b/nautilus_core/network/src/tls.rs @@ -30,7 +30,6 @@ use tokio_tungstenite::{ }, MaybeTlsStream, }; -use tungstenite; /// A connector that can be used when establishing connections, allowing to control whether /// `native-tls` or `rustls` is used to create a TLS connection. Or TLS can be disabled with the @@ -149,7 +148,7 @@ where } } -fn domain(request: &tungstenite::handshake::client::Request) -> Result { +fn domain(request: &Request) -> Result { match request.uri().host() { // rustls expects IPv6 addresses without the surrounding [] brackets Some(d) if d.starts_with('[') && d.ends_with(']') => Ok(d[1..d.len() - 1].to_string()), From 43d213569900ccbec8f6859398235a7281d5c444 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 11 Oct 2024 17:08:50 +1100 Subject: [PATCH 081/224] Refine tardis CSV parsing tests --- nautilus_core/adapters/src/tardis/csv.rs | 63 +++++++----------------- nautilus_core/test_kit/src/common.rs | 1 + 2 files changed, 18 insertions(+), 46 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/csv.rs b/nautilus_core/adapters/src/tardis/csv.rs index ee4f6bd5ee79..1692dd303d40 100644 --- a/nautilus_core/adapters/src/tardis/csv.rs +++ b/nautilus_core/adapters/src/tardis/csv.rs @@ -479,9 +479,10 @@ pub fn load_trade_ticks>( #[cfg(test)] mod tests { use nautilus_model::{enums::BookAction, identifiers::InstrumentId}; - use nautilus_test_kit::{ - common::{get_test_data_large_checksums_filepath, get_test_data_large_path}, - files::ensure_file_exists_or_download_http, + use nautilus_test_kit::common::{ + ensure_data_exists_tardis_binance_snapshot25, ensure_data_exists_tardis_binance_snapshot5, + ensure_data_exists_tardis_bitmex_trades, ensure_data_exists_tardis_deribit_book_l2, + ensure_data_exists_tardis_huobi_quotes, }; use rstest::*; @@ -489,13 +490,7 @@ mod tests { #[rstest] pub fn test_read_deltas() { - let testdata = get_test_data_large_path(); - let checksums = get_test_data_large_checksums_filepath(); - let filename = "tardis_deribit_incremental_book_L2_2020-04-01_BTC-PERPETUAL.csv.gz"; - let filepath = testdata.join("large").join(filename); - let url = "https://datasets.tardis.dev/v1/deribit/incremental_book_L2/2020/04/01/BTC-PERPETUAL.csv.gz"; - ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); - + let filepath = ensure_data_exists_tardis_deribit_book_l2(); let deltas = load_deltas(filepath, 1, 0, None, Some(1_000)).unwrap(); assert_eq!(deltas.len(), 1_000); @@ -515,61 +510,37 @@ mod tests { #[rstest] pub fn test_read_depth10s_from_snapshot5() { - let testdata = get_test_data_large_path(); - let checksums = get_test_data_large_checksums_filepath(); - let filename = "tardis_binance-futures_book_snapshot_5_2020-09-01_BTCUSDT.csv.gz"; - let filepath = testdata.join("large").join(filename); - let url = "https://datasets.tardis.dev/v1/binance-futures/book_snapshot_5/2020/09/01/BTCUSDT.csv.gz"; - ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); - - let depths = load_depth10_from_snapshot5(filepath, 1, 0, None, Some(1_000)).unwrap(); + let filepath = ensure_data_exists_tardis_binance_snapshot5(); + let depths = load_depth10_from_snapshot5(filepath, 1, 0, None, Some(100_000)).unwrap(); - assert_eq!(depths.len(), 1_000); + assert_eq!(depths.len(), 100_000); // TODO: Assert every field } #[rstest] pub fn test_read_depth10s_from_snapshot25() { - let testdata = get_test_data_large_path(); - let checksums = get_test_data_large_checksums_filepath(); - let filename = "tardis_binance-futures_book_snapshot_25_2020-09-01_BTCUSDT.csv.gz"; - let filepath = testdata.join("large").join(filename); - let url = "https://datasets.tardis.dev/v1/binance-futures/book_snapshot_25/2020/09/01/BTCUSDT.csv.gz"; - ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); - - let depths = load_depth10_from_snapshot25(filepath, 1, 0, None, Some(1_000)).unwrap(); + let filepath = ensure_data_exists_tardis_binance_snapshot25(); + let depths = load_depth10_from_snapshot25(filepath, 1, 0, None, Some(100_000)).unwrap(); - assert_eq!(depths.len(), 1_000); + assert_eq!(depths.len(), 100_000); // TODO: Assert every field } #[rstest] pub fn test_read_quotes() { - let testdata = get_test_data_large_path(); - let checksums = get_test_data_large_checksums_filepath(); - let filename = "tardis_huobi-dm-swap_quotes_2020-05-01_BTC-USD.csv.gz"; - let filepath = testdata.join("large").join(filename); - let url = "https://datasets.tardis.dev/v1/huobi-dm-swap/quotes/2020/05/01/BTC-USD.csv.gz"; - ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); + let filepath = ensure_data_exists_tardis_huobi_quotes(); + let quotes = load_quote_ticks(filepath, 1, 0, None, Some(100_000)).unwrap(); - let quotes = load_quote_ticks(filepath, 1, 0, None, Some(1_000)).unwrap(); - - assert_eq!(quotes.len(), 1_000); + assert_eq!(quotes.len(), 100_000); // TODO: Assert every field } #[rstest] pub fn test_read_trades() { - let testdata = get_test_data_large_path(); - let checksums = get_test_data_large_checksums_filepath(); - let filename = "tardis_bitmex_trades_2020-03-01_XBTUSD.csv.gz"; - let filepath = testdata.join("large").join(filename); - let url = "https://datasets.tardis.dev/v1/bitmex/trades/2020/03/01/XBTUSD.csv.gz"; - ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); - - let trades = load_trade_ticks(filepath, 1, 0, None, Some(1_000)).unwrap(); + let filepath = ensure_data_exists_tardis_bitmex_trades(); + let trades = load_trade_ticks(filepath, 1, 0, None, Some(100_000)).unwrap(); - assert_eq!(trades.len(), 1_000); + assert_eq!(trades.len(), 100_000); // TODO: Assert every field } } diff --git a/nautilus_core/test_kit/src/common.rs b/nautilus_core/test_kit/src/common.rs index 51f6c9938e48..0411a3deb70e 100644 --- a/nautilus_core/test_kit/src/common.rs +++ b/nautilus_core/test_kit/src/common.rs @@ -48,6 +48,7 @@ pub fn get_test_data_large_checksums_filepath() -> PathBuf { #[must_use] pub fn ensure_test_data_exists(filename: &str, url: &str) -> PathBuf { let filepath = get_test_data_large_path() + .join("large") .join(filename) .canonicalize() .unwrap(); From 2de463e572af46632fba7747881486ba6bfa771f Mon Sep 17 00:00:00 2001 From: Pushkar Mishra Date: Sat, 12 Oct 2024 00:48:59 +0530 Subject: [PATCH 082/224] Add RateLimiter for WebSocket (#1994) --- nautilus_core/network/src/python/websocket.rs | 34 ++++++++++++++++--- nautilus_core/network/src/websocket.rs | 9 +++++ nautilus_trader/core/nautilus_pyo3.pyi | 4 ++- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/nautilus_core/network/src/python/websocket.rs b/nautilus_core/network/src/python/websocket.rs index 598342025aff..4810d5de878f 100644 --- a/nautilus_core/network/src/python/websocket.rs +++ b/nautilus_core/network/src/python/websocket.rs @@ -74,6 +74,8 @@ impl WebSocketClient { post_connection: Option, post_reconnection: Option, post_disconnection: Option, + keyed_quotas: Option>, + default_quota: Option, py: Python<'_>, ) -> PyResult> { pyo3_asyncio_0_21::tokio::future_into_py(py, async move { @@ -82,6 +84,8 @@ impl WebSocketClient { post_connection, post_reconnection, post_disconnection, + keyed_quotas, + default_quota, ) .await .map_err(to_websocket_pyerr) @@ -143,21 +147,41 @@ impl WebSocketClient { }) } - /// Send UTF-8 encoded bytes as text data to the server. + /// Send UTF-8 encoded bytes as text data to the server, respecting rate limits. + /// + /// `data`: The byte data to be sent, which will be converted to a UTF-8 string. + /// `keys`: Optional list of rate limit keys. If provided, the function will wait for rate limits to be met for each key before sending the data. /// /// # Errors + /// - Raises `PyRuntimeError` if unable to send the data. /// - /// - Raises PyRuntimeError if not able to send data. + /// # Example + /// + /// When a request is made the URL should be split into all relevant keys within it. + /// + /// For request /foo/bar, should pass keys ["foo/bar", "foo"] for rate limiting. #[pyo3(name = "send_text")] fn py_send_text<'py>( slf: PyRef<'_, Self>, data: Vec, py: Python<'py>, + keys: Option>, ) -> PyResult> { let data = String::from_utf8(data).map_err(to_pyvalue_err)?; - tracing::trace!("Sending text: {data}"); + let keys = keys.unwrap_or_default(); let writer = slf.writer.clone(); + let rate_limiter = slf.rate_limiter.clone(); pyo3_asyncio_0_21::tokio::future_into_py(py, async move { + let tasks = keys.iter().map(|key| rate_limiter.until_key_ready(key)); + stream::iter(tasks) + .for_each(|key| async move { + key.await; + }) + .await; + + // Log after passing rate limit checks + tracing::trace!("Sending text: {data}"); + let mut guard = writer.lock().await; guard .send(Message::Text(data)) @@ -337,7 +361,7 @@ counter = Counter()", None, None, ); - let client = WebSocketClient::connect(config, None, None, None) + let client = WebSocketClient::connect(config, None, None, None, None, None) .await .unwrap(); @@ -441,7 +465,7 @@ checker = Checker()", Some("heartbeat message".to_string()), None, ); - let client = WebSocketClient::connect(config, None, None, None) + let client = WebSocketClient::connect(config, None, None, None, None, None) .await .unwrap(); diff --git a/nautilus_core/network/src/websocket.rs b/nautilus_core/network/src/websocket.rs index 6f29dde7ff2b..be5ec3d84d92 100644 --- a/nautilus_core/network/src/websocket.rs +++ b/nautilus_core/network/src/websocket.rs @@ -37,6 +37,7 @@ use tokio_tungstenite::{ MaybeTlsStream, WebSocketStream, }; +use crate::ratelimiter::{clock::MonotonicClock, quota::Quota, RateLimiter}; type MessageWriter = SplitSink>, Message>; type SharedMessageWriter = Arc>, Message>>>; @@ -320,6 +321,7 @@ impl Drop for WebSocketClientInner { pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.network") )] pub struct WebSocketClient { + pub(crate) rate_limiter: Arc>, pub(crate) writer: SharedMessageWriter, pub(crate) controller_task: task::JoinHandle<()>, pub(crate) disconnect_mode: Arc, @@ -335,6 +337,8 @@ impl WebSocketClient { post_connection: Option, post_reconnection: Option, post_disconnection: Option, + keyed_quotas: Option>, + default_quota: Option, ) -> Result { tracing::debug!("Connecting"); let inner = WebSocketClientInner::connect_url(config).await?; @@ -347,6 +351,10 @@ impl WebSocketClient { post_reconnection, post_disconnection, ); + let rate_limiter = Arc::new(RateLimiter::new_with_quota( + default_quota, + keyed_quotas.unwrap_or_default(), + )); if let Some(handler) = post_connection { Python::with_gil(|py| match handler.call0(py) { @@ -356,6 +364,7 @@ impl WebSocketClient { }; Ok(Self { + rate_limiter, writer, controller_task, disconnect_mode, diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index 6ed435779bdd..fc3c0b274096 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -2646,11 +2646,13 @@ class WebSocketClient: post_connection: Callable[..., None] | None = None, post_reconnection: Callable[..., None] | None = None, post_disconnection: Callable[..., None] | None = None, + keyed_quotas: list[tuple[str, Quota]] = [], + default_quota: Quota | None = None, ) -> Awaitable[WebSocketClient]: ... def disconnect(self) -> Awaitable[None]: ... def is_alive(self) -> bool: ... def send(self, data: bytes) -> Awaitable[None]: ... - def send_text(self, data: bytes) -> Awaitable[None]: ... + def send_text(self, data: bytes, keys: list[str] | None = None,) -> Awaitable[None]: ... def send_pong(self, data: bytes) -> Awaitable[None]: ... class SocketClient: From 37baef2739d327e8cc59581cf46a99905e43457b Mon Sep 17 00:00:00 2001 From: faysou Date: Fri, 11 Oct 2024 20:20:20 +0100 Subject: [PATCH 083/224] Add in the money probability field to GreeksData (#1995) --- nautilus_trader/core/nautilus_pyo3.pyi | 6 ++++-- nautilus_trader/model/greeks.py | 10 +++++++--- nautilus_trader/risk/greeks.py | 2 ++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index fc3c0b274096..7c26c1a372df 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -4126,7 +4126,8 @@ class GreeksData(Data): gamma: float vega: float theta: float - quantity: int + quantity: float + itm_prob: float def __init__( self, @@ -4145,7 +4146,8 @@ class GreeksData(Data): gamma: float = 0.0, vega: float = 0.0, theta: float = 0.0, - quantity: int = 1, + quantity: float = 0.0, + itm_prob: float = 0.0, ): ... @classmethod diff --git a/nautilus_trader/model/greeks.py b/nautilus_trader/model/greeks.py index fa609cb36cad..f43e83fce250 100644 --- a/nautilus_trader/model/greeks.py +++ b/nautilus_trader/model/greeks.py @@ -43,19 +43,22 @@ class GreeksData(Data): vega: float = 0.0 theta: float = 0.0 - quantity: int = 1 + quantity: float = 0.0 + # in the money probability, P(phi * S_T > phi * K), phi = 1 if is_call else -1 + itm_prob: float = 0.0 def __repr__(self): return ( f"GreeksData(instrument_id={self.instrument_id}, " - f"expiry={self.expiry}, vol={self.vol * 100:.2f}%, price={self.price:.2f}, delta={self.delta:.2f}, " + f"expiry={self.expiry}, itm_prob={self.itm_prob * 100:.2f}%, " + f"vol={self.vol * 100:.2f}%, price={self.price:.2f}, delta={self.delta:.2f}, " f"gamma={self.gamma:.2f}, vega={self.vega:.2f}, theta={self.theta:.2f}, quantity={self.quantity}, " f"ts_event={unix_nanos_to_str(self.ts_event)}, ts_init={unix_nanos_to_str(self.ts_init)})" ) @classmethod def from_delta(cls, instrument_id: InstrumentId, delta: float): - return GreeksData(instrument_id=instrument_id, delta=delta) + return GreeksData(instrument_id=instrument_id, delta=delta, quantity=1.0) def __rmul__(self, quantity): # quantity * greeks return GreeksData( @@ -75,6 +78,7 @@ def __rmul__(self, quantity): # quantity * greeks quantity * self.vega, quantity * self.theta, quantity * self.quantity, + self.itm_prob, ) diff --git a/nautilus_trader/risk/greeks.py b/nautilus_trader/risk/greeks.py index fd023dd2393b..0f7ccf26d750 100644 --- a/nautilus_trader/risk/greeks.py +++ b/nautilus_trader/risk/greeks.py @@ -194,6 +194,8 @@ def compute_greeks(self, instrument_id: InstrumentId, future_price: float, ts_ev greeks.gamma, greeks.vega, greeks.theta, + 1.0, + abs(greeks.delta / multiplier), ) # write greeks to the cache From 2d70ed3d4fe356223654bbad2f58b91e1226a492 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 06:33:18 +1100 Subject: [PATCH 084/224] Update release notes --- RELEASES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/RELEASES.md b/RELEASES.md index 6c636dd476b9..f67b02ca2afa 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -8,6 +8,8 @@ Released on TBD (UTC). - Added support for `bbo-1s` and `bbo-1m` quote schemas for Databento adapter (#1990), thanks @faysou - Added validation for venue `book_type` configuration vs data (prevents an issue where top-of-book data is used when order book data is expected) - Added `compute_effective_deltas` config setting for `PolymarketDataClientConfig`, reducing snapshot size (`False` by default to maintain current behavior) +- Added rate limiter for `WebSocketClient` (#1994), thanks @Pushkarm029 +- Added in the money probability field to GreeksData (#1995), thanks @faysou - Improved usability of `OrderBookDepth10` by filling partial levels with null orders and zero counts - Refined `DatabentoInstrumentProvider` handling of large bulks of instrument definitions (improved parent symbol support) - Standardized Betfair symbology to use hyphens instead of periods (prevents Betfair symbols being treated as composite) From ccac5765aae0357b505d24709055679072c1116f Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 07:19:59 +1100 Subject: [PATCH 085/224] Add rate limiter for WebSocketClient.send --- nautilus_core/network/src/python/websocket.rs | 14 +++++++++++++- nautilus_trader/core/nautilus_pyo3.pyi | 4 ++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/nautilus_core/network/src/python/websocket.rs b/nautilus_core/network/src/python/websocket.rs index 4810d5de878f..5beb36a5245e 100644 --- a/nautilus_core/network/src/python/websocket.rs +++ b/nautilus_core/network/src/python/websocket.rs @@ -135,10 +135,22 @@ impl WebSocketClient { slf: PyRef<'_, Self>, data: Vec, py: Python<'py>, + keys: Option>, ) -> PyResult> { - tracing::trace!("Sending binary: {data:?}"); + let keys = keys.unwrap_or_default(); let writer = slf.writer.clone(); + let rate_limiter = slf.rate_limiter.clone(); pyo3_asyncio_0_21::tokio::future_into_py(py, async move { + let tasks = keys.iter().map(|key| rate_limiter.until_key_ready(key)); + stream::iter(tasks) + .for_each(|key| async move { + key.await; + }) + .await; + + // Log after passing rate limit checks + tracing::trace!("Sending binary: {data:?}"); + let mut guard = writer.lock().await; guard .send(Message::Binary(data)) diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index 7c26c1a372df..4d98a20c907e 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -2651,8 +2651,8 @@ class WebSocketClient: ) -> Awaitable[WebSocketClient]: ... def disconnect(self) -> Awaitable[None]: ... def is_alive(self) -> bool: ... - def send(self, data: bytes) -> Awaitable[None]: ... - def send_text(self, data: bytes, keys: list[str] | None = None,) -> Awaitable[None]: ... + def send(self, data: bytes, keys: list[str] | None = None) -> Awaitable[None]: ... + def send_text(self, data: bytes, keys: list[str] | None = None) -> Awaitable[None]: ... def send_pong(self, data: bytes) -> Awaitable[None]: ... class SocketClient: From 5869cf9e2e427d8d0ac1774c818df95c645a8908 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 07:38:34 +1100 Subject: [PATCH 086/224] Add tip on using make build-debug --- docs/developer_guide/environment_setup.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/developer_guide/environment_setup.md b/docs/developer_guide/environment_setup.md index 66f74dd21a80..ba3547305e15 100644 --- a/docs/developer_guide/environment_setup.md +++ b/docs/developer_guide/environment_setup.md @@ -37,7 +37,7 @@ The following steps are for UNIX-like systems, and only need to be completed onc ## Builds -Following any changes to `.pyx` or `.pxd` files, you can re-compile by running: +Following any changes to `.rs`, `.pyx` or `.pxd` files, you can re-compile by running: poetry run python build.py @@ -45,6 +45,11 @@ or make build +If you're developing and iterating frequently, then compiling in debug mode is often sufficient and *significantly* faster than a fully optimized build. +To compile in debug mode, use: + + make build-debug + ## Services You can use `docker-compose.yml` file located in `.docker` directory From fa09d0f6e53641b6de73a75bdfef957d57b306a5 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 07:40:38 +1100 Subject: [PATCH 087/224] Fix clippy lints --- nautilus_core/adapters/src/tardis/enums.rs | 10 +++++----- nautilus_core/adapters/src/tardis/message.rs | 6 +++--- nautilus_core/adapters/src/tardis/parse.rs | 7 ++++++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/enums.rs b/nautilus_core/adapters/src/tardis/enums.rs index d3d6719139aa..b15a4453c73f 100644 --- a/nautilus_core/adapters/src/tardis/enums.rs +++ b/nautilus_core/adapters/src/tardis/enums.rs @@ -32,7 +32,7 @@ pub enum WsMessage { Disconnect(DisconnectMsg), } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] /// The type of the symbol eg. Spot, Perpetual, Future, Option. pub enum SymbolType { @@ -42,7 +42,7 @@ pub enum SymbolType { Option, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] /// The type of an option symbol. pub enum OptionType { @@ -51,7 +51,7 @@ pub enum OptionType { } /// The aggressor side of the trade. -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] pub enum TradeSide { Buy, @@ -61,7 +61,7 @@ pub enum TradeSide { /// The kind of bar. #[allow(missing_docs)] -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] pub enum BarKind { Time, @@ -69,7 +69,7 @@ pub enum BarKind { Tick, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] /// Represents a crypto exchange. /// See for all supported exchanges. diff --git a/nautilus_core/adapters/src/tardis/message.rs b/nautilus_core/adapters/src/tardis/message.rs index df361ada20f0..5f409e6b9e2d 100644 --- a/nautilus_core/adapters/src/tardis/message.rs +++ b/nautilus_core/adapters/src/tardis/message.rs @@ -128,7 +128,7 @@ pub struct BarMsg { pub symbol: String, /// The exchange ID. pub exchange: Exchange, - /// name with format trade_bar_{interval} + /// name with format `trade_bar`_{interval} pub name: String, /// The requested trade bar interval. pub interval: u64, @@ -204,7 +204,7 @@ mod tests { assert_eq!(message.symbol, "XBTUSD"); assert_eq!(message.exchange, Exchange::Bitmex); - assert_eq!(message.is_snapshot, false); + assert!(!message.is_snapshot); assert!(message.bids.is_empty()); assert_eq!(message.asks.len(), 1); assert_eq!(message.asks[0].price, 7985.0); @@ -275,7 +275,7 @@ mod tests { assert_eq!( message.local_timestamp, DateTime::parse_from_rfc3339("2019-10-25T13:39:46.961Z").unwrap() - ) + ); } #[rstest] diff --git a/nautilus_core/adapters/src/tardis/parse.rs b/nautilus_core/adapters/src/tardis/parse.rs index 4bb0bb28352a..51fc16c6fc81 100644 --- a/nautilus_core/adapters/src/tardis/parse.rs +++ b/nautilus_core/adapters/src/tardis/parse.rs @@ -22,13 +22,15 @@ use nautilus_model::{ }; /// Parse an instrument ID from the given venue and symbol values. +#[must_use] pub fn parse_instrument_id(exchange: &str, symbol: &str) -> InstrumentId { let venue = exchange.split('-').next().unwrap_or(exchange); - InstrumentId::from_str(&format!("{}.{}", symbol, venue).to_uppercase()) + InstrumentId::from_str(&format!("{symbol}.{venue}").to_uppercase()) .expect("Failed to parse `instrument_id`") } /// Parse an order side from the given string. +#[must_use] pub fn parse_order_side(value: &str) -> OrderSide { match value { "bid" => OrderSide::Buy, @@ -38,6 +40,7 @@ pub fn parse_order_side(value: &str) -> OrderSide { } /// Parse an aggressor side from the given string. +#[must_use] pub fn parse_aggressor_side(value: &str) -> AggressorSide { match value { "buy" => AggressorSide::Buyer, @@ -47,11 +50,13 @@ pub fn parse_aggressor_side(value: &str) -> AggressorSide { } /// Parse a Tardis timestamp in UNIX microseconds to UNIX nanoseconds. +#[must_use] pub fn parse_timestamp(value: u64) -> UnixNanos { UnixNanos::from(value * NANOSECONDS_IN_MICROSECOND) } /// Parse book action inferred from the given values. +#[must_use] pub fn parse_book_action(is_snapshot: bool, amount: f64) -> BookAction { if is_snapshot { BookAction::Add From 0302cb79871ef3d424991412c9221d805d6d386e Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 08:04:29 +1100 Subject: [PATCH 088/224] Fix ensure_test_data path resolution --- nautilus_core/test_kit/src/common.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/nautilus_core/test_kit/src/common.rs b/nautilus_core/test_kit/src/common.rs index 0411a3deb70e..d0b72ef679d4 100644 --- a/nautilus_core/test_kit/src/common.rs +++ b/nautilus_core/test_kit/src/common.rs @@ -47,11 +47,7 @@ pub fn get_test_data_large_checksums_filepath() -> PathBuf { #[must_use] pub fn ensure_test_data_exists(filename: &str, url: &str) -> PathBuf { - let filepath = get_test_data_large_path() - .join("large") - .join(filename) - .canonicalize() - .unwrap(); + let filepath = get_test_data_large_path().join("large").join(filename); let checksums_filepath = get_test_data_large_checksums_filepath(); ensure_file_exists_or_download_http(&filepath, url, Some(&checksums_filepath)).unwrap(); filepath From a1e014611d8a00bb6343d72d7909191f6c59bb5f Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 08:07:39 +1100 Subject: [PATCH 089/224] Add Betfair constants --- nautilus_trader/adapters/betfair/constants.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nautilus_trader/adapters/betfair/constants.py b/nautilus_trader/adapters/betfair/constants.py index e09ff2e449b0..4641dc529f29 100644 --- a/nautilus_trader/adapters/betfair/constants.py +++ b/nautilus_trader/adapters/betfair/constants.py @@ -19,11 +19,14 @@ from nautilus_trader.model.enums import BookType from nautilus_trader.model.enums import MarketStatusAction +from nautilus_trader.model.identifiers import ClientId from nautilus_trader.model.identifiers import Venue from nautilus_trader.model.objects import Price -BETFAIR_VENUE: Final[Venue] = Venue("BETFAIR") +BETFAIR: Final[str] = "BETFAIR" +BETFAIR_VENUE: Final[Venue] = Venue(BETFAIR) +BETFAIR_CLIENT_ID: Final[ClientId] = ClientId(BETFAIR) BETFAIR_PRICE_PRECISION: Final[int] = 2 BETFAIR_QUANTITY_PRECISION: Final[int] = 2 BETFAIR_BOOK_TYPE: Final[BookType] = BookType.L2_MBP From ce2f13f914d34c321014248cc6a914a2037f0f90 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 08:08:56 +1100 Subject: [PATCH 090/224] Refine build script --- build.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build.py b/build.py index 7cc26b0828b5..0e06e9be9e18 100644 --- a/build.py +++ b/build.py @@ -375,6 +375,11 @@ def build() -> None: print(f"PYO3_ONLY={PYO3_ONLY}") print(f"CFLAGS={os.environ['CFLAGS']}") if "CFLAGS" in os.environ else None print(f"LDFLAGS={os.environ['LDFLAGS']}") if "LDFLAGS" in os.environ else None + ( + print(f"LD_LIBRARY_PATH={os.environ['LD_LIBRARY_PATH']}") + if "LD_LIBRARY_PATH" in os.environ + else None + ) print("\nStarting build...") ts_start = dt.datetime.now(dt.UTC) From e9f66bcb6cd5e9e4476c0cda00f59e97a1d4ee2f Mon Sep 17 00:00:00 2001 From: David Blom Date: Fri, 11 Oct 2024 23:26:32 +0200 Subject: [PATCH 091/224] Use Rust rate limiter for dYdX websockets (#1996) --- .../adapters/dydx/websocket/client.py | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/nautilus_trader/adapters/dydx/websocket/client.py b/nautilus_trader/adapters/dydx/websocket/client.py index 6f7e8e5f6346..f19c52e6e7f4 100644 --- a/nautilus_trader/adapters/dydx/websocket/client.py +++ b/nautilus_trader/adapters/dydx/websocket/client.py @@ -19,7 +19,6 @@ import asyncio from collections.abc import Awaitable from collections.abc import Callable -from datetime import timedelta from typing import Any import msgspec @@ -28,13 +27,16 @@ from nautilus_trader.adapters.dydx.common.enums import DYDXCandlesResolution from nautilus_trader.common.component import LiveClock from nautilus_trader.common.component import Logger -from nautilus_trader.common.component import Throttler from nautilus_trader.common.enums import LogColor +from nautilus_trader.core.nautilus_pyo3 import Quota from nautilus_trader.core.nautilus_pyo3 import WebSocketClient from nautilus_trader.core.nautilus_pyo3 import WebSocketClientError from nautilus_trader.core.nautilus_pyo3 import WebSocketConfig +SUBSCRIBE_KEY = "subscribe" + + class DYDXWebsocketClient: """ Provide a dYdX streaming WebSocket client. @@ -73,15 +75,7 @@ def __init__( self._client: WebSocketClient | None = None self._is_running = False self._subscriptions: set[tuple[str, str]] = set() - - self._subscribe_throttler = Throttler( - name="dydx_websocket_subscribe_throttler", - limit=subscription_rate_limit_per_second, - interval=timedelta(seconds=1), - clock=self._clock, - output_send=self._send_subscribe_msg, - ) - + self._subscription_rate_limit_per_second = subscription_rate_limit_per_second self._msg_timestamp = self._clock.utc_now() self._msg_timeout_secs: int = 60 self._reconnect_task: asyncio.Task | None = None @@ -137,6 +131,12 @@ async def connect(self) -> None: client = await WebSocketClient.connect( config=config, post_reconnection=self.reconnect, + keyed_quotas=[ + ( + SUBSCRIBE_KEY, + Quota.rate_per_second(self._subscription_rate_limit_per_second), + ), + ], ) self._client = client self._log.info(f"Connected to {self._base_url}", LogColor.BLUE) @@ -251,7 +251,7 @@ async def subscribe_trades(self, symbol: str) -> None: self._subscriptions.add(subscription) msg = {"type": "subscribe", "channel": "v4_trades", "id": symbol} self._log.debug(f"Subscribe to {symbol} trade ticks") - self._subscribe_throttler.send(msg) + await self._send(msg, keys=[SUBSCRIBE_KEY]) async def subscribe_order_book( self, @@ -273,7 +273,7 @@ async def subscribe_order_book( self._subscriptions.add(subscription) msg = {"type": "subscribe", "channel": "v4_orderbook", "id": symbol, "batched": True} self._log.debug(f"Subscribe to {symbol} order book") - self._subscribe_throttler.send(msg) + await self._send(msg, keys=[SUBSCRIBE_KEY]) async def subscribe_klines(self, symbol: str, interval: DYDXCandlesResolution) -> None: """ @@ -290,7 +290,7 @@ async def subscribe_klines(self, symbol: str, interval: DYDXCandlesResolution) - self._subscriptions.add(subscription) msg = {"type": "subscribe", "channel": "v4_candles", "id": f"{symbol}/{interval.value}"} - self._subscribe_throttler.send(msg) + await self._send(msg, keys=[SUBSCRIBE_KEY]) async def subscribe_markets(self) -> None: """ @@ -307,7 +307,7 @@ async def subscribe_markets(self) -> None: self._subscriptions.add((subscription, "")) msg = {"type": "subscribe", "channel": "v4_markets"} - self._subscribe_throttler.send(msg) + await self._send(msg, keys=[SUBSCRIBE_KEY]) async def subscribe_account_update(self, wallet_address: str, subaccount_number: int) -> None: """ @@ -328,7 +328,7 @@ async def subscribe_account_update(self, wallet_address: str, subaccount_number: self._subscriptions.add(subscription) msg = {"type": "subscribe", "channel": channel, "id": channel_id} - self._subscribe_throttler.send(msg) + await self._send(msg, keys=[SUBSCRIBE_KEY]) async def unsubscribe_account_update(self, wallet_address: str, subaccount_number: int) -> None: """ @@ -443,7 +443,7 @@ async def _subscribe_all(self) -> None: def _send_subscribe_msg(self, msg: dict[str, Any]) -> None: self._loop.create_task(self._send(msg)) - async def _send(self, msg: dict[str, Any]) -> None: + async def _send(self, msg: dict[str, Any], keys: list[str] | None = None) -> None: if self._client is None: self._log.error(f"Cannot send message {msg}: not connected") return @@ -451,6 +451,6 @@ async def _send(self, msg: dict[str, Any]) -> None: self._log.debug(f"SENDING: {msg}") try: - await self._client.send_text(msgspec.json.encode(msg)) + await self._client.send_text(msgspec.json.encode(msg), keys=keys) except WebSocketClientError as e: self._log.error(f"Failed to send websocket message: {e}") From 5cb54a589730d9fb3ceaad52b6f61985c0d8ce45 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 08:27:25 +1100 Subject: [PATCH 092/224] Update release notes --- RELEASES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASES.md b/RELEASES.md index f67b02ca2afa..3ac423258cb8 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -18,6 +18,7 @@ Released on TBD (UTC). ### Internal Improvements - Ported `Throttler` to Rust (#1988), thanks @Pushkarm029 and @twitu - Refined `WebSocketClient` to close existing tasks on reconnect (#1986), thanks @davidsblom +- Use Rust rate limiter for dYdX websockets (#1996), thanks @davidsblom - Improved error logs for dYdX websocket subscriptions (#1993), thanks @davidsblom - Standardized log and error message syntax in Rust From e8d4a2afe2d88bbe3206322c8c474bbb529fef80 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 10:15:20 +1100 Subject: [PATCH 093/224] Standardize postgres cache module namespace --- nautilus_core/infrastructure/src/python/mod.rs | 2 +- .../src/python/sql/{cache_database.rs => cache.rs} | 2 +- nautilus_core/infrastructure/src/python/sql/mod.rs | 2 +- .../infrastructure/src/sql/{cache_database.rs => cache.rs} | 0 nautilus_core/infrastructure/src/sql/mod.rs | 2 +- .../infrastructure/tests/test_cache_database_postgres.rs | 2 +- nautilus_core/infrastructure/tests/test_cache_postgres.rs | 2 +- 7 files changed, 6 insertions(+), 6 deletions(-) rename nautilus_core/infrastructure/src/python/sql/{cache_database.rs => cache.rs} (99%) rename nautilus_core/infrastructure/src/sql/{cache_database.rs => cache.rs} (100%) diff --git a/nautilus_core/infrastructure/src/python/mod.rs b/nautilus_core/infrastructure/src/python/mod.rs index 6bf67c7c8340..c9bfd969aa2d 100644 --- a/nautilus_core/infrastructure/src/python/mod.rs +++ b/nautilus_core/infrastructure/src/python/mod.rs @@ -30,6 +30,6 @@ pub fn infrastructure(_: Python<'_>, m: &PyModule) -> PyResult<()> { #[cfg(feature = "redis")] m.add_class::()?; #[cfg(feature = "postgres")] - m.add_class::()?; + m.add_class::()?; Ok(()) } diff --git a/nautilus_core/infrastructure/src/python/sql/cache_database.rs b/nautilus_core/infrastructure/src/python/sql/cache.rs similarity index 99% rename from nautilus_core/infrastructure/src/python/sql/cache_database.rs rename to nautilus_core/infrastructure/src/python/sql/cache.rs index 1ae6859d4219..ee5ce477c20b 100644 --- a/nautilus_core/infrastructure/src/python/sql/cache_database.rs +++ b/nautilus_core/infrastructure/src/python/sql/cache.rs @@ -30,7 +30,7 @@ use nautilus_model::{ }; use pyo3::prelude::*; -use crate::sql::{cache_database::PostgresCacheDatabase, queries::DatabaseQueries}; +use crate::sql::{cache::PostgresCacheDatabase, queries::DatabaseQueries}; #[pymethods] impl PostgresCacheDatabase { diff --git a/nautilus_core/infrastructure/src/python/sql/mod.rs b/nautilus_core/infrastructure/src/python/sql/mod.rs index 454f4be6bd37..5376ebab6999 100644 --- a/nautilus_core/infrastructure/src/python/sql/mod.rs +++ b/nautilus_core/infrastructure/src/python/sql/mod.rs @@ -13,4 +13,4 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- -pub mod cache_database; +pub mod cache; diff --git a/nautilus_core/infrastructure/src/sql/cache_database.rs b/nautilus_core/infrastructure/src/sql/cache.rs similarity index 100% rename from nautilus_core/infrastructure/src/sql/cache_database.rs rename to nautilus_core/infrastructure/src/sql/cache.rs diff --git a/nautilus_core/infrastructure/src/sql/mod.rs b/nautilus_core/infrastructure/src/sql/mod.rs index 736f33b36309..f4842d945229 100644 --- a/nautilus_core/infrastructure/src/sql/mod.rs +++ b/nautilus_core/infrastructure/src/sql/mod.rs @@ -13,7 +13,7 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- -pub mod cache_database; +pub mod cache; pub mod models; pub mod pg; pub mod queries; diff --git a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs index bae8997d91de..6c65be579f2c 100644 --- a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs +++ b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs @@ -20,7 +20,7 @@ mod serial_tests { use bytes::Bytes; use nautilus_common::{cache::database::CacheDatabaseAdapter, testing::wait_until}; - use nautilus_infrastructure::sql::cache_database::get_pg_cache_database; + use nautilus_infrastructure::sql::cache::get_pg_cache_database; use nautilus_model::{ accounts::{any::AccountAny, cash::CashAccount}, data::stubs::{quote_tick_ethusdt_binance, stub_bar, stub_trade_tick_ethusdt_buyer}, diff --git a/nautilus_core/infrastructure/tests/test_cache_postgres.rs b/nautilus_core/infrastructure/tests/test_cache_postgres.rs index a4fbb2b2d032..796573d6f2f9 100644 --- a/nautilus_core/infrastructure/tests/test_cache_postgres.rs +++ b/nautilus_core/infrastructure/tests/test_cache_postgres.rs @@ -26,7 +26,7 @@ mod serial_tests { use std::time::Duration; use nautilus_common::{cache::database::CacheDatabaseAdapter, testing::wait_until}; - use nautilus_infrastructure::sql::cache_database::get_pg_cache_database; + use nautilus_infrastructure::sql::cache::get_pg_cache_database; use nautilus_model::{ accounts::any::AccountAny, enums::{CurrencyType, OrderSide, OrderType}, From 8124c98601c6d08f1944750520a4f3701f7760e5 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 10:34:58 +1100 Subject: [PATCH 094/224] Fix PostgresCacheDatabase type stub --- nautilus_trader/core/nautilus_pyo3.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index 4d98a20c907e..7aa728f2914a 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -2547,7 +2547,7 @@ class PostgresCacheDatabase: def connect( cls, host: str | None = None, - port: str | None = None, + port: int | None = None, username: str | None = None, password: str | None = None, database: str | None = None, From b1a28d40562e3c5b4d4b58cc248387eada0da2a2 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 10:59:20 +1100 Subject: [PATCH 095/224] Refine Nautilus CLI developer guide --- docs/developer_guide/environment_setup.md | 42 ++++++++++++----------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/docs/developer_guide/environment_setup.md b/docs/developer_guide/environment_setup.md index ba3547305e15..a8ee606db72f 100644 --- a/docs/developer_guide/environment_setup.md +++ b/docs/developer_guide/environment_setup.md @@ -71,7 +71,9 @@ Used services are: - `redis`: Redis server - `pgadmin`: PgAdmin4 for database management and administration -> **Note**: Please use this as development environment only. For production, use a proper and more secure setup. +:::info +Please use this as development environment only. For production, use a proper and more secure setup. +::: After the services has been started, you must log in with `psql` cli to create `nautilus` Postgres database. To do that you can run, and type `POSTGRES_PASSWORD` from docker service setup @@ -95,16 +97,17 @@ CREATE DATABASE ## Introduction -The Nautilus CLI is a command-line interface tool designed to interact -with the Nautilus Trader ecosystem. It provides commands for managing the Postgres database and other trading operations. - -> **Note**: The Nautilus CLI command is only supported on UNIX-like systems. +The Nautilus CLI is a command-line interface tool for interacting with the NautilusTrader ecosystem. +It offers commands for managing the PostgreSQL database and handling various trading operations. +:::note +The Nautilus CLI command is only supported on UNIX-like systems. +::: ## Install -You can install nautilus cli command with from Make file target, which will use `cargo install` under the hood. -And this command will install `nautilus` bin executable in your path if Rust `cargo` is properly configured. +You can install the Nautilus CLI using the below Makefile target, which leverages `cargo install` under the hood. +This will place the nautilus binary in your system's PATH, assuming Rust's `cargo` is properly configured. ```bash make install-cli @@ -112,21 +115,20 @@ make install-cli ## Commands -You can run `nautilus --help` to inspect structure of CLI and groups of commands: +You can run `nautilus --help` to view the CLI structure and available command groups: ### Database -These are commands related to the bootstrapping the Postgres database. -For that you work, you need to supply right connection configuration. You can do that through -command line arguments or `.env` file in the root directory or where the commands is being run. +These commands handle bootstrapping the PostgreSQL database. +To use them, you need to provide the correct connection configuration, +either through command-line arguments or a `.env` file located in the root directory or the current working directory. -- `--host` arg or `POSTGRES_HOST` for database host -- `--port` arg or `POSTGRES_PORT` for database port -- `--user` arg or `POSTGRES_USER` for root administrator user to run command with (namely `postgres` root user here) -- `--password` arg or `POSTGRES_PASSWORD` for root administrator password -- `--database` arg or `POSTGRES_DATABASE` for both database **name and new user** that will have privileges of this database - ( if you provided `nautilus` as value, then new user will be created with name `nautilus` that will inherit the password from `POSTGRES_PASSWORD` - and `nautilus` database with be bootstrapped with this user as owner) +- `--host` or `POSTGRES_HOST` for the database host +- `--port` or `POSTGRES_PORT` for the database port +- `--user` or `POSTGRES_USER` for the root administrator (typically the postgres user) +- `--password` or `POSTGRES_PASSWORD` for the root administrator's password +- `--database` or `POSTGRES_DATABASE` for both the database **name and the new user** with privileges to that database + (e.g., if you provide `nautilus` as the value, a new user named nautilus will be created with the password from `POSTGRES_PASSWORD`, and the `nautilus` database will be bootstrapped with this user as the owner). Example of `.env` file @@ -134,11 +136,11 @@ Example of `.env` file POSTGRES_HOST=localhost POSTGRES_PORT=5432 POSTGRES_USERNAME=postgres -POSTGRES_DATABASE=nautilus POSTGRES_PASSWORD=pass +POSTGRES_DATABASE=nautilus ``` List of commands are: 1. `nautilus database init`: Will bootstrap schema, roles and all sql files located in `schema` root directory (like `tables.sql`) -2. `nautilus database drop`: Will drop all tables, role and data in target Postgres database +2. `nautilus database drop`: Will drop all tables, roles and data in target Postgres database From 70c1e896eba378018c6abd6c1fbd8d7a75de2a8b Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 11:07:57 +1100 Subject: [PATCH 096/224] Add macos for build-wheels workflow --- .github/workflows/build-wheels.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index db01b07e21f9..9b7397b41396 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -11,7 +11,7 @@ jobs: fail-fast: false matrix: arch: [x64] - os: [ubuntu-latest] + os: [ubuntu-latest, macos-latest] python-version: ["3.11", "3.12"] name: build - Python ${{ matrix.python-version }} (${{ matrix.arch }} ${{ matrix.os }}) runs-on: ${{ matrix.os }} @@ -34,10 +34,17 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Set up Rust toolchain + - name: Set up Rust toolchain (Linux, Windows) + if: (runner.os == 'Linux') || (runner.os == 'Windows') run: | rustup toolchain add --profile minimal stable --component clippy,rustfmt + - name: Set up Rust toolchain (macOS) + if: runner.os == 'macOS' + run: | + rustup toolchain add --profile minimal stable --component clippy,rustfmt + rustup target add aarch64-apple-darwin + - name: Set up Python environment uses: actions/setup-python@v5 with: From 54cd4df250ef41dd088c0658fd0b0f94d1f385d1 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 11:23:21 +1100 Subject: [PATCH 097/224] Refine download-wheel script --- scripts/download-wheel.sh | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/scripts/download-wheel.sh b/scripts/download-wheel.sh index 95039c9246d4..b3a12dbf089f 100644 --- a/scripts/download-wheel.sh +++ b/scripts/download-wheel.sh @@ -7,6 +7,9 @@ WORKFLOW_NAME="build-wheels.yml" GITHUB_API_URL="https://api.github.com" TOKEN="${GITHUB_TOKEN}" # Assumes you have a GitHub PAT set in the 'GITHUB_TOKEN' env var +# Default value for OS (set to 'linux' if not provided) +OS="${1:-linux}" # Accept OS as a command-line argument (linux, macos, windows) + # Check if TOKEN is set if [[ -z "$TOKEN" ]]; then echo "Error: The 'GITHUB_TOKEN' environment variable is not set. Set it with a GitHub personal access token." @@ -31,11 +34,23 @@ artifacts=$(curl -s -H "Authorization: token $TOKEN" "${GITHUB_API_URL}/repos/${ echo "Artifacts returned by API:" echo "$artifacts" | grep '"name":' -# Try to find the artifact matching the specified Python version -artifact_name=$(echo "$artifacts" | grep "\"name\": \"nautilus_trader-.*-${PYTHON_VERSION}-.*whl\"" | awk -F'"' '{print $4}') +# Set regex pattern for artifacts based on the OS argument +if [[ "$OS" == "linux" ]]; then + artifact_pattern="nautilus_trader-.*-${PYTHON_VERSION}-.*manylinux_.*\.whl" +elif [[ "$OS" == "macos" ]]; then + artifact_pattern="nautilus_trader-.*-${PYTHON_VERSION}-.*macosx_.*\.whl" +elif [[ "$OS" == "windows" ]]; then + artifact_pattern="nautilus_trader-.*-${PYTHON_VERSION}-.*win_amd64.*\.whl" +else + echo "Error: Unsupported OS type. Supported values are: linux, macos, windows." + exit 1 +fi + +# Try to find the artifact matching the specified Python version and OS +artifact_name=$(echo "$artifacts" | grep "\"name\": \"${artifact_pattern}\"" | awk -F'"' '{print $4}') # Debugging: Print the artifact name that we're trying to find -echo "Trying to find artifact with name matching: nautilus_trader-.*-${PYTHON_VERSION}-.*whl" +echo "Trying to find artifact with name matching: $artifact_pattern" echo "Found artifact: $artifact_name" # Fetch the archive_download_url directly from the artifacts response From c1eee9d0bb20aa00f8ebe4120a63ba339015357e Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 11:34:42 +1100 Subject: [PATCH 098/224] Fix build-wheels workflow --- .github/workflows/build-wheels.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index 9b7397b41396..76821c54efb1 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -10,7 +10,6 @@ jobs: strategy: fail-fast: false matrix: - arch: [x64] os: [ubuntu-latest, macos-latest] python-version: ["3.11", "3.12"] name: build - Python ${{ matrix.python-version }} (${{ matrix.arch }} ${{ matrix.os }}) @@ -18,6 +17,7 @@ jobs: steps: - name: Free disk space (Ubuntu) + if: runner.os == 'Linux' uses: jlumbroso/free-disk-space@main with: tool-cache: true @@ -28,7 +28,8 @@ jobs: docker-images: true swap-storage: true - - name: Install runner dependencies + - name: Install runner dependencies (Linux) + if: runner.os == 'Linux' run: sudo apt-get install -y curl clang git libssl-dev make pkg-config - name: Checkout repository From 643f4931162198859de6b3f1ca4f9b81ec6109aa Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 11:36:34 +1100 Subject: [PATCH 099/224] Cleanup build-wheels workflow --- .github/workflows/build-wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index 76821c54efb1..efd6771b56fa 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -12,7 +12,7 @@ jobs: matrix: os: [ubuntu-latest, macos-latest] python-version: ["3.11", "3.12"] - name: build - Python ${{ matrix.python-version }} (${{ matrix.arch }} ${{ matrix.os }}) + name: build - Python ${{ matrix.python-version }} (${{ matrix.os }}) runs-on: ${{ matrix.os }} steps: From d52cea8d3b5f549a03a95763f1a8af9274b3b259 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 17:57:32 +1100 Subject: [PATCH 100/224] Refine build --- .github/workflows/build-wheels.yml | 9 +-------- .github/workflows/build.yml | 10 +++------- .github/workflows/release.yml | 24 ++++-------------------- build.py | 11 ++++------- 4 files changed, 12 insertions(+), 42 deletions(-) diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index efd6771b56fa..19551acb0c4a 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -35,17 +35,10 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Set up Rust toolchain (Linux, Windows) - if: (runner.os == 'Linux') || (runner.os == 'Windows') + - name: Set up Rust toolchain run: | rustup toolchain add --profile minimal stable --component clippy,rustfmt - - name: Set up Rust toolchain (macOS) - if: runner.os == 'macOS' - run: | - rustup toolchain add --profile minimal stable --component clippy,rustfmt - rustup target add aarch64-apple-darwin - - name: Set up Python environment uses: actions/setup-python@v5 with: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b07375572ca9..b3aaa5c33c44 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,13 +11,12 @@ jobs: strategy: fail-fast: false matrix: - arch: [x64] os: [ubuntu-latest] python-version: ["3.11", "3.12"] defaults: run: shell: bash - name: build - Python ${{ matrix.python-version }} (${{ matrix.arch }} ${{ matrix.os }}) + name: build - Python ${{ matrix.python-version }} (${{ matrix.os }}) runs-on: ${{ matrix.os }} env: BUILD_MODE: debug @@ -169,13 +168,12 @@ jobs: strategy: fail-fast: false matrix: - arch: [x64] os: [windows-latest] python-version: ["3.11", "3.12"] defaults: run: shell: bash - name: build - Python ${{ matrix.python-version }} (${{ matrix.arch }} ${{ matrix.os }}) + name: build - Python ${{ matrix.python-version }} (${{ matrix.os }}) runs-on: ${{ matrix.os }} env: BUILD_MODE: debug @@ -272,13 +270,12 @@ jobs: strategy: fail-fast: false matrix: - arch: [arm64] os: [macos-latest] python-version: ["3.11", "3.12"] defaults: run: shell: bash - name: build - Python ${{ matrix.python-version }} (${{ matrix.arch }} ${{ matrix.os }}) + name: build - Python ${{ matrix.python-version }} (${{ matrix.os }}) runs-on: ${{ matrix.os }} env: BUILD_MODE: debug @@ -297,7 +294,6 @@ jobs: - name: Set up Rust toolchain run: | rustup toolchain add --profile minimal stable --component clippy,rustfmt - rustup target add aarch64-apple-darwin - name: Set up Python environment uses: actions/setup-python@v5 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 584e5d4f4060..8e3668b2caa6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,13 +16,12 @@ jobs: strategy: fail-fast: false matrix: - arch: [x64] os: [ubuntu-latest, macos-latest, windows-latest] python-version: ["3.11", "3.12"] defaults: run: shell: bash - name: test-pip-install - Python ${{ matrix.python-version }} (${{ matrix.arch }} ${{ matrix.os }}) + name: test-pip-install - Python ${{ matrix.python-version }} (${{ matrix.os }}) runs-on: ${{ matrix.os }} steps: @@ -51,16 +50,9 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Set up Rust toolchain (Linux, Windows) - if: (runner.os == 'Linux') || (runner.os == 'Windows') - run: | - rustup toolchain add --profile minimal stable --component clippy,rustfmt - - - name: Set up Rust toolchain (macOS) - if: runner.os == 'macOS' + - name: Set up Rust toolchain run: | rustup toolchain add --profile minimal stable --component clippy,rustfmt - rustup target add aarch64-apple-darwin - name: Set up Python environment uses: actions/setup-python@v5 @@ -271,13 +263,12 @@ jobs: strategy: fail-fast: false matrix: - arch: [x64] os: [ubuntu-20.04, ubuntu-latest, macos-latest, windows-latest] python-version: ["3.11", "3.12"] defaults: run: shell: bash - name: publish-wheels - Python ${{ matrix.python-version }} (${{ matrix.arch }} ${{ matrix.os }}) + name: publish-wheels - Python ${{ matrix.python-version }} (${{ matrix.os }}) runs-on: ${{ matrix.os }} env: BUILD_MODE: release @@ -308,16 +299,9 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Set up Rust toolchain (Linux, Windows) - if: (runner.os == 'Linux') || (runner.os == 'Windows') - run: | - rustup toolchain add --profile minimal stable --component clippy,rustfmt - - - name: Set up Rust toolchain (macOS) - if: runner.os == 'macOS' + - name: Set up Rust toolchain run: | rustup toolchain add --profile minimal stable --component clippy,rustfmt - rustup target add aarch64-apple-darwin - name: Set up Python environment uses: actions/setup-python@v5 diff --git a/build.py b/build.py index 0e06e9be9e18..86480cbd7793 100644 --- a/build.py +++ b/build.py @@ -56,11 +56,9 @@ os.environ["LDSHARED"] = "clang -shared" if platform.system() == "Darwin" and platform.machine() == "arm64": - TARGET_DIR = Path.cwd() / "nautilus_core" / "target" / "aarch64-apple-darwin" / BUILD_MODE os.environ["CFLAGS"] = "-arch arm64" os.environ["LDFLAGS"] = "-arch arm64 -w" - if platform.system() == "Windows": # Linker error 1181 # https://docs.microsoft.com/en-US/cpp/error-messages/tool-errors/linker-tools-error-lnk1181?view=msvc-170&viewFallbackFrom=vs-2019 @@ -89,6 +87,8 @@ def _build_rust_libs() -> None: + print("Compiling Rust libraries...") + try: # Build the Rust libraries using Cargo if RUST_TOOLCHAIN not in ("stable", "nightly"): @@ -96,11 +96,6 @@ def _build_rust_libs() -> None: build_options = " --release" if BUILD_MODE == "release" else "" - if platform.system() == "Darwin" and platform.machine() == "arm64": - build_options += " --target aarch64-apple-darwin" - - print("Compiling Rust libraries...") - cmd_args = [ "cargo", "build", @@ -373,6 +368,8 @@ def build() -> None: print(f"PARALLEL_BUILD={PARALLEL_BUILD}") print(f"COPY_TO_SOURCE={COPY_TO_SOURCE}") print(f"PYO3_ONLY={PYO3_ONLY}") + print(f"CC={os.environ['CC']}") if "CC" in os.environ else None + print(f"LDSHARED={os.environ['LDSHARED']}") if "LDSHARED" in os.environ else None print(f"CFLAGS={os.environ['CFLAGS']}") if "CFLAGS" in os.environ else None print(f"LDFLAGS={os.environ['LDFLAGS']}") if "LDFLAGS" in os.environ else None ( From 9bef9ba8e8b5be84cb5ef350950b574933130ad7 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 18:00:36 +1100 Subject: [PATCH 101/224] Make cp312 default for download-wheel --- scripts/download-wheel.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/download-wheel.sh b/scripts/download-wheel.sh index b3a12dbf089f..1b2d03747a2f 100644 --- a/scripts/download-wheel.sh +++ b/scripts/download-wheel.sh @@ -2,7 +2,7 @@ # Set variables REPO="nautechsystems/nautilus_trader" -PYTHON_VERSION="cp311" # Specify Python version (either "cp311" or "cp312") +PYTHON_VERSION="cp312" # Specify Python version (either "cp311" or "cp312") WORKFLOW_NAME="build-wheels.yml" GITHUB_API_URL="https://api.github.com" TOKEN="${GITHUB_TOKEN}" # Assumes you have a GitHub PAT set in the 'GITHUB_TOKEN' env var From 92c9c6c8502537925378b482f1234bc1a9511955 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 18:14:56 +1100 Subject: [PATCH 102/224] Standardize module imports --- nautilus_core/model/src/python/orders/mod.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/nautilus_core/model/src/python/orders/mod.rs b/nautilus_core/model/src/python/orders/mod.rs index 974f50d8d38b..660a993599f1 100644 --- a/nautilus_core/model/src/python/orders/mod.rs +++ b/nautilus_core/model/src/python/orders/mod.rs @@ -27,6 +27,16 @@ use crate::{ }, }; +pub mod limit; +pub mod limit_if_touched; +pub mod market; +pub mod market_if_touched; +pub mod market_to_limit; +pub mod stop_limit; +pub mod stop_market; +pub mod trailing_stop_limit; +pub mod trailing_stop_market; + pub fn convert_pyobject_to_order_any(py: Python, order: PyObject) -> PyResult { let order_type = order.getattr(py, "order_type")?.extract::(py)?; if order_type == OrderType::Limit { @@ -80,13 +90,3 @@ pub fn convert_order_any_to_pyobject(py: Python, order: OrderAny) -> PyResult Date: Sat, 12 Oct 2024 18:15:56 +1100 Subject: [PATCH 103/224] Standardize param name and method ordering --- .../infrastructure/src/python/sql/cache.rs | 4 ++-- nautilus_trader/core/nautilus_pyo3.pyi | 24 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/nautilus_core/infrastructure/src/python/sql/cache.rs b/nautilus_core/infrastructure/src/python/sql/cache.rs index ee5ce477c20b..be39252132d7 100644 --- a/nautilus_core/infrastructure/src/python/sql/cache.rs +++ b/nautilus_core/infrastructure/src/python/sql/cache.rs @@ -149,11 +149,11 @@ impl PostgresCacheDatabase { #[pyo3(name = "load_order")] fn py_load_order( slf: PyRef<'_, Self>, - order_id: ClientOrderId, + client_order_id: ClientOrderId, py: Python<'_>, ) -> PyResult> { get_runtime().block_on(async { - let result = DatabaseQueries::load_order(&slf.pool, &order_id) + let result = DatabaseQueries::load_order(&slf.pool, &client_order_id) .await .unwrap(); match result { diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index 7aa728f2914a..dce8f25a2bc6 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -2552,27 +2552,27 @@ class PostgresCacheDatabase: password: str | None = None, database: str | None = None, ) -> PostgresCacheDatabase: ... + def flush_db(self) -> None: ... def load(self) -> dict[str, str]: ... - def add(self, key: str, value: bytes) -> None: ... - def add_currency(self, currency: Currency) -> None: ... - def add_instrument(self, instrument: object) -> None: ... - def add_order(self, instrument: object) -> None: ... - def add_account(self, account: object) -> None: ... - def update_order(self, order: object) -> None: ... def load_currency(self, code: str) -> Currency | None: ... def load_currencies(self) -> list[Currency]: ... def load_instrument(self, instrument_id: InstrumentId) -> Instrument | None: ... def load_instruments(self) -> list[Instrument]: ... - def load_order(self, order_id: ClientOrderId) -> Order | None: ... + def load_order(self, client_order_id: ClientOrderId) -> Order | None: ... def load_account(self, account_id: AccountId) -> Account | None: ... - def update_account(self, account: Account) -> None: ... - def add_trade(self, trade: TradeTick) -> None: ... def load_trades(self, instrument_id: InstrumentId) -> list[TradeTick]: ... - def add_quote(self, quote: QuoteTick) -> None: ... def load_quotes(self, instrument_id: InstrumentId) -> list[QuoteTick]: ... - def add_bar(self, bar: Bar) -> None: ... def load_bars(self, instrument_id: InstrumentId) -> list[Bar]: ... - def flush_db(self) -> None: ... + def add(self, key: str, value: bytes) -> None: ... + def add_currency(self, currency: Currency) -> None: ... + def add_instrument(self, instrument: object) -> None: ... + def add_order(self, order: object) -> None: ... + def add_account(self, account: object) -> None: ... + def add_trade(self, trade: TradeTick) -> None: ... + def add_quote(self, quote: QuoteTick) -> None: ... + def add_bar(self, bar: Bar) -> None: ... + def update_order(self, order: object) -> None: ... + def update_account(self, account: Account) -> None: ... ################################################################################################### # Network From 77c1194ef68aa2d2c18524fbe8d852a611a27727 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 12 Oct 2024 18:32:22 +1100 Subject: [PATCH 104/224] Standardize client_order_id column naming --- .../infrastructure/src/sql/models/general.rs | 8 +++--- .../infrastructure/src/sql/models/orders.rs | 16 ++++++------ .../infrastructure/src/sql/queries.rs | 26 +++++++++---------- schema/tables.sql | 5 ++-- 4 files changed, 27 insertions(+), 28 deletions(-) diff --git a/nautilus_core/infrastructure/src/sql/models/general.rs b/nautilus_core/infrastructure/src/sql/models/general.rs index 7d2c94f08b1c..9883dbbafa6a 100644 --- a/nautilus_core/infrastructure/src/sql/models/general.rs +++ b/nautilus_core/infrastructure/src/sql/models/general.rs @@ -24,14 +24,14 @@ pub struct GeneralRow { #[derive(Debug)] pub struct OrderEventOrderClientIdCombination { - pub order_id: ClientOrderId, + pub client_order_id: ClientOrderId, pub client_id: ClientId, } impl<'r> FromRow<'r, PgRow> for OrderEventOrderClientIdCombination { fn from_row(row: &'r PgRow) -> Result { - let order_id = row - .try_get::<&str, _>("order_id") + let client_order_id = row + .try_get::<&str, _>("client_order_id") .map(ClientOrderId::from) .unwrap(); let client_id = row @@ -39,7 +39,7 @@ impl<'r> FromRow<'r, PgRow> for OrderEventOrderClientIdCombination { .map(ClientId::from) .unwrap(); Ok(OrderEventOrderClientIdCombination { - order_id, + client_order_id, client_id, }) } diff --git a/nautilus_core/infrastructure/src/sql/models/orders.rs b/nautilus_core/infrastructure/src/sql/models/orders.rs index d9dd34d8a303..d983872ceb6a 100644 --- a/nautilus_core/infrastructure/src/sql/models/orders.rs +++ b/nautilus_core/infrastructure/src/sql/models/orders.rs @@ -114,7 +114,7 @@ impl<'r> FromRow<'r, PgRow> for OrderInitializedModel { fn from_row(row: &'r PgRow) -> Result { let event_id = row.try_get::<&str, _>("id").map(UUID4::from)?; let client_order_id = row - .try_get::<&str, _>("order_id") + .try_get::<&str, _>("client_order_id") .map(ClientOrderId::from)?; let trader_id = row.try_get::<&str, _>("trader_id").map(TraderId::from)?; let strategy_id = row @@ -270,8 +270,8 @@ impl<'r> FromRow<'r, PgRow> for OrderAcceptedModel { let instrument_id = row .try_get::<&str, _>("instrument_id") .map(InstrumentId::from)?; - let order_id = row - .try_get::<&str, _>("order_id") + let client_order_id = row + .try_get::<&str, _>("client_order_id") .map(ClientOrderId::from)?; let venue_order_id = row .try_get::<&str, _>("venue_order_id") @@ -283,7 +283,7 @@ impl<'r> FromRow<'r, PgRow> for OrderAcceptedModel { trader_id, strategy_id, instrument_id, - order_id, + client_order_id, venue_order_id, account_id, event_id, @@ -335,8 +335,8 @@ impl<'r> FromRow<'r, PgRow> for OrderFilledModel { let instrument_id = row .try_get::<&str, _>("instrument_id") .map(InstrumentId::from)?; - let order_id = row - .try_get::<&str, _>("order_id") + let client_order_id = row + .try_get::<&str, _>("client_order_id") .map(ClientOrderId::from)?; let venue_order_id = row .try_get::<&str, _>("venue_order_id") @@ -369,7 +369,7 @@ impl<'r> FromRow<'r, PgRow> for OrderFilledModel { trader_id, strategy_id, instrument_id, - order_id, + client_order_id, venue_order_id, account_id, trade_id, @@ -430,7 +430,7 @@ impl<'r> FromRow<'r, PgRow> for OrderSubmittedModel { .try_get::<&str, _>("instrument_id") .map(InstrumentId::from)?; let client_order_id = row - .try_get::<&str, _>("order_id") + .try_get::<&str, _>("client_order_id") .map(ClientOrderId::from)?; let account_id = row.try_get::<&str, _>("account_id").map(AccountId::from)?; let event_id = row.try_get::<&str, _>("id").map(UUID4::from)?; diff --git a/nautilus_core/infrastructure/src/sql/queries.rs b/nautilus_core/infrastructure/src/sql/queries.rs index afc23ffa1deb..efa066d2a0d1 100644 --- a/nautilus_core/infrastructure/src/sql/queries.rs +++ b/nautilus_core/infrastructure/src/sql/queries.rs @@ -269,12 +269,12 @@ impl DatabaseQueries { pub async fn check_if_order_initialized_exists( pool: &PgPool, - order_id: ClientOrderId, + client_order_id: ClientOrderId, ) -> anyhow::Result { sqlx::query(r#" - SELECT EXISTS(SELECT 1 FROM "order_event" WHERE order_id = $1 AND kind = 'OrderInitialized') + SELECT EXISTS(SELECT 1 FROM "order_event" WHERE client_order_id = $1 AND kind = 'OrderInitialized') "#) - .bind(order_id.to_string()) + .bind(client_order_id.to_string()) .fetch_one(pool) .await .map(|row| row.get(0)) @@ -334,7 +334,7 @@ impl DatabaseQueries { sqlx::query(r#" INSERT INTO "order_event" ( - id, kind, order_id, order_type, order_side, trader_id, client_id, strategy_id, instrument_id, trade_id, currency, quantity, time_in_force, liquidity_side, + id, kind, client_order_id, order_type, order_side, trader_id, client_id, strategy_id, instrument_id, trade_id, currency, quantity, time_in_force, liquidity_side, post_only, reduce_only, quote_quantity, reconciliation, price, last_px, last_qty, trigger_price, trigger_type, limit_offset, trailing_offset, trailing_offset_type, expire_time, display_qty, emulation_trigger, trigger_instrument_id, contingency_type, order_list_id, linked_order_ids, parent_order_id, @@ -347,7 +347,7 @@ impl DatabaseQueries { ON CONFLICT (id) DO UPDATE SET - kind = $2, order_id = $3, order_type = $4, order_side=$5, trader_id = $6, client_id = $7, strategy_id = $8, instrument_id = $9, trade_id = $10, currency = $11, + kind = $2, client_order_id = $3, order_type = $4, order_side=$5, trader_id = $6, client_id = $7, strategy_id = $8, instrument_id = $9, trade_id = $10, currency = $11, quantity = $12, time_in_force = $13, liquidity_side = $14, post_only = $15, reduce_only = $16, quote_quantity = $17, reconciliation = $18, price = $19, last_px = $20, last_qty = $21, trigger_price = $22, trigger_type = $23, limit_offset = $24, trailing_offset = $25, trailing_offset_type = $26, expire_time = $27, display_qty = $28, emulation_trigger = $29, trigger_instrument_id = $30, contingency_type = $31, order_list_id = $32, linked_order_ids = $33, parent_order_id = $34, exec_algorithm_id = $35, @@ -408,10 +408,10 @@ impl DatabaseQueries { pub async fn load_order_events( pool: &PgPool, - order_id: &ClientOrderId, + client_order_id: &ClientOrderId, ) -> anyhow::Result> { - sqlx::query_as::<_, OrderEventAnyModel>(r#"SELECT * FROM "order_event" event WHERE event.order_id = $1 ORDER BY created_at ASC"#) - .bind(order_id.to_string()) + sqlx::query_as::<_, OrderEventAnyModel>(r#"SELECT * FROM "order_event" event WHERE event.client_order_id = $1 ORDER BY created_at ASC"#) + .bind(client_order_id.to_string()) .fetch_all(pool) .await .map(|rows| rows.into_iter().map(|row| row.0).collect()) @@ -420,9 +420,9 @@ impl DatabaseQueries { pub async fn load_order( pool: &PgPool, - order_id: &ClientOrderId, + client_order_id: &ClientOrderId, ) -> anyhow::Result> { - let order_events = DatabaseQueries::load_order_events(pool, order_id).await; + let order_events = DatabaseQueries::load_order_events(pool, client_order_id).await; match order_events { Ok(order_events) => { @@ -440,7 +440,7 @@ impl DatabaseQueries { let mut orders: Vec = Vec::new(); let client_order_ids: Vec = sqlx::query( r#" - SELECT DISTINCT order_id FROM "order_event" + SELECT DISTINCT client_order_id FROM "order_event" "#, ) .fetch_all(pool) @@ -719,7 +719,7 @@ impl DatabaseQueries { let result = sqlx::query_as::<_, OrderEventOrderClientIdCombination>( r#" SELECT DISTINCT - order_id AS "order_id", + client_order_id AS "client_order_id", client_id AS "client_id" FROM "order_event" "#, @@ -728,7 +728,7 @@ impl DatabaseQueries { .await .map_err(|e| anyhow::anyhow!("Failed to load account ids: {e}"))?; for id in result { - map.insert(id.order_id, id.client_id); + map.insert(id.client_order_id, id.client_id); } Ok(map) } diff --git a/schema/tables.sql b/schema/tables.sql index cf29e7f79079..11534b2f1cc2 100644 --- a/schema/tables.sql +++ b/schema/tables.sql @@ -37,7 +37,6 @@ CREATE TABLE IF NOT EXISTS "strategy" ( oms_type TEXT, manage_contingent_orders BOOLEAN, manage_gtd_expiry BOOLEAN - ); CREATE TABLE IF NOT EXISTS "currency" ( @@ -108,7 +107,7 @@ CREATE TABLE IF NOT EXISTS "order_event" ( trader_id TEXT REFERENCES trader(id) ON DELETE CASCADE, strategy_id TEXT NOT NULL, instrument_id TEXT REFERENCES instrument(id) ON DELETE CASCADE, - order_id TEXT DEFAULT NULL, + client_order_id TEXT DEFAULT NULL, client_id TEXT REFERENCES client(id) ON DELETE CASCADE, trade_id TEXT, currency TEXT REFERENCES currency(id), @@ -207,4 +206,4 @@ CREATE TABLE IF NOT EXISTS "bar" ( ts_init TEXT NOT NULL, created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP -); \ No newline at end of file +); From 4e484bac0019e6d4c93bab5e0a92580ddd83e1d7 Mon Sep 17 00:00:00 2001 From: Filip Macek Date: Sat, 12 Oct 2024 12:57:37 +0200 Subject: [PATCH 105/224] Implement orderbook deltas processing for SimulatedExchange (#1997) --- nautilus_core/backtest/src/exchange.rs | 96 ++++++++++++++++++- nautilus_core/backtest/src/matching_engine.rs | 11 +++ 2 files changed, 103 insertions(+), 4 deletions(-) diff --git a/nautilus_core/backtest/src/exchange.rs b/nautilus_core/backtest/src/exchange.rs index 4fec326a1a69..3e6b39fc148c 100644 --- a/nautilus_core/backtest/src/exchange.rs +++ b/nautilus_core/backtest/src/exchange.rs @@ -29,8 +29,13 @@ use nautilus_execution::{client::ExecutionClient, messages::TradingCommand}; use nautilus_model::{ accounts::any::AccountAny, data::{ - bar::Bar, delta::OrderBookDelta, deltas::OrderBookDeltas, quote::QuoteTick, - status::InstrumentStatus, trade::TradeTick, Data, + bar::Bar, + delta::OrderBookDelta, + deltas::{OrderBookDeltas, OrderBookDeltas_API}, + quote::QuoteTick, + status::InstrumentStatus, + trade::TradeTick, + Data, }, enums::{AccountType, BookType, OmsType}, identifiers::{InstrumentId, Venue}, @@ -346,8 +351,32 @@ impl SimulatedExchange { } } - pub fn process_order_book_deltas(&mut self, _deltas: OrderBookDeltas) { - todo!("process order book deltas") + pub fn process_order_book_deltas(&mut self, deltas: OrderBookDeltas) { + for module in &self.modules { + module.pre_process(Data::Deltas(OrderBookDeltas_API::new(deltas.clone()))); + } + + if !self.matching_engines.contains_key(&deltas.instrument_id) { + let instrument = { + let cache = self.cache.as_ref().borrow(); + cache.instrument(&deltas.instrument_id).cloned() + }; + + if let Some(instrument) = instrument { + self.add_instrument(instrument).unwrap(); + } else { + panic!( + "No matching engine found for instrument {}", + deltas.instrument_id + ); + } + } + + if let Some(matching_engine) = self.matching_engines.get_mut(&deltas.instrument_id) { + matching_engine.process_order_book_deltas(&deltas); + } else { + panic!("Matching engine should be initialized"); + } } pub fn process_quote_tick(&mut self, quote: &QuoteTick) { @@ -468,6 +497,7 @@ mod tests { data::{ bar::{Bar, BarType}, delta::OrderBookDelta, + deltas::OrderBookDeltas, order::BookOrder, quote::QuoteTick, trade::TradeTick, @@ -725,4 +755,62 @@ mod tests { let best_ask_price = exchange.best_ask_price(crypto_perpetual_ethusdt.id); assert_eq!(best_ask_price, Some(Price::from("1001.00"))); } + + #[rstest] + fn test_exchange_process_orderbook_deltas(crypto_perpetual_ethusdt: CryptoPerpetual) { + let mut exchange: SimulatedExchange = + get_exchange(Venue::new("BINANCE"), AccountType::Margin, BookType::L2_MBP); + let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); + + // register instrument + exchange.add_instrument(instrument).unwrap(); + + // create two sell order book deltas with same timestamps and higher sequence + let delta_sell_1 = OrderBookDelta::new( + crypto_perpetual_ethusdt.id, + BookAction::Add, + BookOrder::new( + OrderSide::Sell, + Price::from("1000.00"), + Quantity::from(3), + 1, + ), + 0, + 0, + UnixNanos::from(1), + UnixNanos::from(1), + ); + let delta_sell_2 = OrderBookDelta::new( + crypto_perpetual_ethusdt.id, + BookAction::Add, + BookOrder::new( + OrderSide::Sell, + Price::from("1001.00"), + Quantity::from(1), + 1, + ), + 0, + 1, + UnixNanos::from(1), + UnixNanos::from(1), + ); + let orderbook_deltas = OrderBookDeltas::new( + crypto_perpetual_ethusdt.id, + vec![delta_sell_1, delta_sell_2], + ); + + // process both deltas + exchange.process_order_book_deltas(orderbook_deltas); + + let book = exchange.get_book(crypto_perpetual_ethusdt.id).unwrap(); + assert_eq!(book.count, 2); + assert_eq!(book.sequence, 1); + assert_eq!(book.ts_last, UnixNanos::from(1)); + let best_bid_price = exchange.best_bid_price(crypto_perpetual_ethusdt.id); + // no bid orders in orderbook deltas + assert_eq!(best_bid_price, None); + let best_ask_price = exchange.best_ask_price(crypto_perpetual_ethusdt.id); + // best ask price is the first order in orderbook deltas + assert_eq!(best_ask_price, Some(Price::from("1000.00"))); + } } diff --git a/nautilus_core/backtest/src/matching_engine.rs b/nautilus_core/backtest/src/matching_engine.rs index 6f7798d18083..be2d138d9597 100644 --- a/nautilus_core/backtest/src/matching_engine.rs +++ b/nautilus_core/backtest/src/matching_engine.rs @@ -29,6 +29,7 @@ use nautilus_model::{ data::{ bar::{Bar, BarType}, delta::OrderBookDelta, + deltas::OrderBookDeltas, quote::QuoteTick, trade::TradeTick, }, @@ -269,6 +270,16 @@ impl OrderMatchingEngine { self.iterate(delta.ts_event); } + pub fn process_order_book_deltas(&mut self, deltas: &OrderBookDeltas) { + log::debug!("Processing {deltas}"); + + if self.book_type == BookType::L2_MBP || self.book_type == BookType::L3_MBO { + self.book.apply_deltas(deltas); + } + + self.iterate(deltas.ts_event); + } + pub fn process_quote_tick(&mut self, quote: &QuoteTick) { log::debug!("Processing {quote}"); From 990dbeda934326c49ce063c01f7726f34ba0e2bf Mon Sep 17 00:00:00 2001 From: Filip Macek Date: Sat, 12 Oct 2024 21:37:49 +0200 Subject: [PATCH 106/224] Update bid and ask in matching engine iteration (#1998) --- nautilus_core/backtest/src/matching_engine.rs | 87 ++++++++++++++++++- nautilus_core/execution/src/matching_core.rs | 10 +++ 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/nautilus_core/backtest/src/matching_engine.rs b/nautilus_core/backtest/src/matching_engine.rs index be2d138d9597..76ab8d5beae9 100644 --- a/nautilus_core/backtest/src/matching_engine.rs +++ b/nautilus_core/backtest/src/matching_engine.rs @@ -766,6 +766,16 @@ impl OrderMatchingEngine { pub fn iterate(&mut self, timestamp_ns: UnixNanos) { self.clock.set_time(timestamp_ns); + // check for updates in orderbook and set bid and ask + // in order matching core and iterate + if self.book.has_bid() { + self.core.set_bid_raw(self.book.best_bid_price().unwrap()); + } + if self.book.has_ask() { + self.core.set_ask_raw(self.book.best_ask_price().unwrap()); + } + self.core.iterate(); + self.core.bid = self.book.best_bid_price(); self.core.ask = self.book.best_ask_price(); @@ -1147,7 +1157,10 @@ mod tests { }; use nautilus_core::{nanos::UnixNanos, time::AtomicTime}; use nautilus_model::{ - enums::{AccountType, BookType, ContingencyType, OmsType, OrderSide, OrderType}, + data::{delta::OrderBookDelta, order::BookOrder}, + enums::{ + AccountType, BookAction, BookType, ContingencyType, OmsType, OrderSide, OrderType, + }, events::order::{ rejected::OrderRejectedBuilder, OrderEventAny, OrderEventType, OrderRejected, }, @@ -1248,6 +1261,29 @@ mod tests { ) } + fn get_order_matching_engine_l2( + instrument: InstrumentAny, + msgbus: Rc>, + cache: Option>>, + account_type: Option, + config: Option, + ) -> OrderMatchingEngine { + let cache = cache.unwrap_or(Rc::new(RefCell::new(Cache::default()))); + let config = config.unwrap_or_default(); + OrderMatchingEngine::new( + instrument, + 1, + FillModel::default(), + BookType::L2_MBP, + OmsType::Netting, + account_type.unwrap_or(AccountType::Cash), + &ATOMIC_TIME, + msgbus, + cache, + config, + ) + } + fn get_order_event_handler_messages( event_handler: ShareableMessageHandler, ) -> Vec { @@ -1774,4 +1810,53 @@ mod tests { Ustr::from("No market for ESZ1.GLBX") ); } + + #[rstest] + fn test_matching_core_bid_ask_initialized( + msgbus: MessageBus, + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, + instrument_es: InstrumentAny, + ) { + let mut engine_l2 = get_order_matching_engine_l2( + instrument_es.clone(), + Rc::new(RefCell::new(msgbus)), + None, + None, + None, + ); + // create bid and ask orderbook delta and check if + // bid and ask are initialized in order matching core + let orderbook_delta_buy = OrderBookDelta::new( + instrument_es.id(), + BookAction::Add, + BookOrder::new(OrderSide::Buy, Price::from("100"), Quantity::from("1"), 0), + 0, + 0, + UnixNanos::from(0), + UnixNanos::from(0), + ); + let orderbook_delta_sell = OrderBookDelta::new( + instrument_es.id(), + BookAction::Add, + BookOrder::new(OrderSide::Sell, Price::from("101"), Quantity::from("1"), 1), + 0, + 1, + UnixNanos::from(1), + UnixNanos::from(1), + ); + + engine_l2.process_order_book_delta(&orderbook_delta_buy); + assert_eq!(engine_l2.core.bid, Some(Price::from("100"))); + assert!(engine_l2.core.is_bid_initialized); + assert_eq!(engine_l2.core.ask, None); + assert!(!engine_l2.core.is_ask_initialized); + + engine_l2.process_order_book_delta(&orderbook_delta_sell); + assert_eq!(engine_l2.core.bid, Some(Price::from("100"))); + assert!(engine_l2.core.is_bid_initialized); + assert_eq!(engine_l2.core.ask, Some(Price::from("101"))); + assert!(engine_l2.core.is_ask_initialized); + } } diff --git a/nautilus_core/execution/src/matching_core.rs b/nautilus_core/execution/src/matching_core.rs index 61ce088db1ea..d1093e63893f 100644 --- a/nautilus_core/execution/src/matching_core.rs +++ b/nautilus_core/execution/src/matching_core.rs @@ -114,6 +114,16 @@ impl OrderMatchingCore { self.is_last_initialized = true; } + pub fn set_bid_raw(&mut self, bid: Price) { + self.bid = Some(bid); + self.is_bid_initialized = true; + } + + pub fn set_ask_raw(&mut self, ask: Price) { + self.ask = Some(ask); + self.is_ask_initialized = true; + } + pub fn reset(&mut self) { self.bid = None; self.ask = None; From 33f5a2a7a6846af5dd62250ebfa81672ee68be62 Mon Sep 17 00:00:00 2001 From: David Blom Date: Sat, 12 Oct 2024 21:43:04 +0200 Subject: [PATCH 107/224] Add docs and fix rate limiting for websockets of dYdX (#1999) --- .../adapters/dydx/websocket/client.py | 138 ++++++++++++++---- 1 file changed, 112 insertions(+), 26 deletions(-) diff --git a/nautilus_trader/adapters/dydx/websocket/client.py b/nautilus_trader/adapters/dydx/websocket/client.py index f19c52e6e7f4..e88ed8714583 100644 --- a/nautilus_trader/adapters/dydx/websocket/client.py +++ b/nautilus_trader/adapters/dydx/websocket/client.py @@ -34,9 +34,6 @@ from nautilus_trader.core.nautilus_pyo3 import WebSocketConfig -SUBSCRIBE_KEY = "subscribe" - - class DYDXWebsocketClient: """ Provide a dYdX streaming WebSocket client. @@ -51,7 +48,10 @@ class DYDXWebsocketClient: The callback handler for message events. handler_reconnect : Callable[..., Awaitable[None]], optional The callback handler to be called on reconnect. - + loop : asyncio.AbstractEventLoop + The event loop for the client. + subscription_rate_limit_per_second : int, default 2 + The maximum number of subscription message to send to the venue. """ def __init__( @@ -105,13 +105,28 @@ def is_disconnected(self) -> bool: @property def subscriptions(self) -> set[tuple[str, str]]: """ - Return the list of subscriptions. + Return the set of subscriptions. + + Returns + ------- + set[tuple[str, str]] + Set of subscriptions. """ return self._subscriptions def has_subscription(self, item: tuple[str, str]) -> bool: """ Return true if the connection is already subscribed to this topic. + + Parameters + ---------- + item : tuple[str, str] + Topic name. + + Returns + ------- + bool + Whether the client is already subscribed to this topic. """ return item in self._subscriptions @@ -131,12 +146,7 @@ async def connect(self) -> None: client = await WebSocketClient.connect( config=config, post_reconnection=self.reconnect, - keyed_quotas=[ - ( - SUBSCRIBE_KEY, - Quota.rate_per_second(self._subscription_rate_limit_per_second), - ), - ], + default_quota=Quota.rate_per_second(self._subscription_rate_limit_per_second), ) self._client = client self._log.info(f"Connected to {self._base_url}", LogColor.BLUE) @@ -147,10 +157,26 @@ async def connect(self) -> None: self._reconnect_task = self._loop.create_task(self._reconnect_guard()) def _msg_handler(self, raw: bytes) -> None: + """ + Handle pushed websocket messages. + + Parameters + ---------- + raw : bytes + The received message in bytes. + """ self._msg_timestamp = self._clock.utc_now() self._handler(raw) def _handle_ping(self, raw: bytes) -> None: + """ + Handle ping messages by returning a pong message. + + Parameters + ---------- + raw : bytes + The received ping in bytes. + """ self._loop.create_task(self.send_pong(raw)) async def send_pong(self, raw: bytes) -> None: @@ -238,6 +264,11 @@ async def disconnect(self) -> None: async def subscribe_trades(self, symbol: str) -> None: """ Subscribe to trades messages. + + Parameters + ---------- + symbol : str + Symbol of the instrument to subscribe to. """ if self._client is None: self._log.warning("Cannot subscribe to trades: not connected") @@ -251,7 +282,7 @@ async def subscribe_trades(self, symbol: str) -> None: self._subscriptions.add(subscription) msg = {"type": "subscribe", "channel": "v4_trades", "id": symbol} self._log.debug(f"Subscribe to {symbol} trade ticks") - await self._send(msg, keys=[SUBSCRIBE_KEY]) + await self._send(msg) async def subscribe_order_book( self, @@ -259,7 +290,15 @@ async def subscribe_order_book( bypass_subscription_validation: bool = False, ) -> None: """ - Subscribe to trades messages. + Subscribe to order book messages. + + Parameters + ---------- + symbol : str + Symbol of the instrument to subscribe to. + bypass_subscription_validation : bool, default False + Whether to bypass the subscription validation step before sending the + subscribe message to the venue. """ if self._client is None: self._log.warning("Cannot subscribe to order book: not connected") @@ -273,11 +312,18 @@ async def subscribe_order_book( self._subscriptions.add(subscription) msg = {"type": "subscribe", "channel": "v4_orderbook", "id": symbol, "batched": True} self._log.debug(f"Subscribe to {symbol} order book") - await self._send(msg, keys=[SUBSCRIBE_KEY]) + await self._send(msg) async def subscribe_klines(self, symbol: str, interval: DYDXCandlesResolution) -> None: """ Subscribe to klines. + + Parameters + ---------- + symbol : str + Symbol of the instrument to subscribe to bars. + interval : DYDXCandlesResolution + Specify the interval between candle updates (for example 1MIN). """ if self._client is None: self._log.warning("Cannot subscribe to klines: not connected") @@ -290,7 +336,7 @@ async def subscribe_klines(self, symbol: str, interval: DYDXCandlesResolution) - self._subscriptions.add(subscription) msg = {"type": "subscribe", "channel": "v4_candles", "id": f"{symbol}/{interval.value}"} - await self._send(msg, keys=[SUBSCRIBE_KEY]) + await self._send(msg) async def subscribe_markets(self) -> None: """ @@ -307,12 +353,20 @@ async def subscribe_markets(self) -> None: self._subscriptions.add((subscription, "")) msg = {"type": "subscribe", "channel": "v4_markets"} - await self._send(msg, keys=[SUBSCRIBE_KEY]) + await self._send(msg) async def subscribe_account_update(self, wallet_address: str, subaccount_number: int) -> None: """ Subscribe to realtime information about orders, fills, transfers, perpetual positions, and perpetual assets for a subaccount. + + Parameters + ---------- + wallet_address : str + The dYdX wallet address. + subaccount_number : int + The subaccount number. + The venue creates subaccount 0 by default. """ if self._client is None: self._log.warning("Cannot subscribe: not connected") @@ -328,11 +382,19 @@ async def subscribe_account_update(self, wallet_address: str, subaccount_number: self._subscriptions.add(subscription) msg = {"type": "subscribe", "channel": channel, "id": channel_id} - await self._send(msg, keys=[SUBSCRIBE_KEY]) + await self._send(msg) async def unsubscribe_account_update(self, wallet_address: str, subaccount_number: int) -> None: """ - Unsubscribe from account messages. + Unsubscribe from account updates. + + Parameters + ---------- + wallet_address : str + The dYdX wallet address. + subaccount_number : int + The subaccount number. + The venue creates subaccount 0 by default. """ if self._client is None: self._log.warning("Cannot unsubscribe: not connected") @@ -352,7 +414,12 @@ async def unsubscribe_account_update(self, wallet_address: str, subaccount_numbe async def unsubscribe_trades(self, symbol: str) -> None: """ - Unsubscribe to trades messages. + Unsubscribe from trades messages. + + Parameters + ---------- + symbol : str + Symbol of the instrument to unsubscribe from. """ if self._client is None: self._log.warning("Cannot unsubscribe: not connected") @@ -369,7 +436,14 @@ async def unsubscribe_trades(self, symbol: str) -> None: async def unsubscribe_order_book(self, symbol: str, remove_subscription: bool = True) -> None: """ - Unsubscribe to trades messages. + Unsubscribe from order book messages. + + Parameters + ---------- + symbol : str + Symbol of the instrument to unsubscribe from. + remove_subscription : bool, optional default True + Whether to remove the symbol from the list of subscriptions for order book updates. """ if self._client is None: self._log.warning("Cannot unsubscribe: not connected") @@ -388,7 +462,14 @@ async def unsubscribe_order_book(self, symbol: str, remove_subscription: bool = async def unsubscribe_klines(self, symbol: str, interval: DYDXCandlesResolution) -> None: """ - Unsubscribe to trades messages. + Unsubscribe from bar messages. + + Parameters + ---------- + symbol : str + Symbol of the instrument to unsubscribe from bars. + interval : DYDXCandlesResolution + Specify the interval between candle updates (for example 1MIN). """ if self._client is None: self._log.warning("Cannot unsubscribe: not connected") @@ -405,7 +486,7 @@ async def unsubscribe_klines(self, symbol: str, interval: DYDXCandlesResolution) async def unsubscribe_markets(self) -> None: """ - Unsubscribe from instrument updates. + Unsubscribe from market updates. """ if self._client is None: self._log.warning("Cannot unsubscribe: not connected") @@ -440,10 +521,15 @@ async def _subscribe_all(self) -> None: await self._send(msg) - def _send_subscribe_msg(self, msg: dict[str, Any]) -> None: - self._loop.create_task(self._send(msg)) + async def _send(self, msg: dict[str, Any]) -> None: + """ + Send a message to the venue. - async def _send(self, msg: dict[str, Any], keys: list[str] | None = None) -> None: + Parameters + ---------- + msg : dict[str, Any] + Dictionary to serialize as JSON message and send + """ if self._client is None: self._log.error(f"Cannot send message {msg}: not connected") return @@ -451,6 +537,6 @@ async def _send(self, msg: dict[str, Any], keys: list[str] | None = None) -> Non self._log.debug(f"SENDING: {msg}") try: - await self._client.send_text(msgspec.json.encode(msg), keys=keys) + await self._client.send_text(msgspec.json.encode(msg)) except WebSocketClientError as e: self._log.error(f"Failed to send websocket message: {e}") From fa671716c1509d94ae4d6a7ab49605d8541f39bc Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 06:46:43 +1100 Subject: [PATCH 108/224] Update release notes --- RELEASES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/RELEASES.md b/RELEASES.md index 3ac423258cb8..fa05c86b66c6 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -18,9 +18,10 @@ Released on TBD (UTC). ### Internal Improvements - Ported `Throttler` to Rust (#1988), thanks @Pushkarm029 and @twitu - Refined `WebSocketClient` to close existing tasks on reconnect (#1986), thanks @davidsblom -- Use Rust rate limiter for dYdX websockets (#1996), thanks @davidsblom +- Use Rust rate limiter for dYdX websockets (#1996, #1999), thanks @davidsblom - Improved error logs for dYdX websocket subscriptions (#1993), thanks @davidsblom - Standardized log and error message syntax in Rust +- Continue porting `SimulatedExchange` to Rust (#1997, #1998), thanks @filipmacek ### Breaking Changes - Removed legacy `TardisQuoteDataLoader` (now redundant with new Rust implemented loader) From 48e0c50b02d3caea57246c3fb7fa1470563143ce Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 06:55:54 +1100 Subject: [PATCH 109/224] Run docformatter over codebase --- nautilus_trader/adapters/dydx/websocket/client.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/nautilus_trader/adapters/dydx/websocket/client.py b/nautilus_trader/adapters/dydx/websocket/client.py index e88ed8714583..afa5b3fbb036 100644 --- a/nautilus_trader/adapters/dydx/websocket/client.py +++ b/nautilus_trader/adapters/dydx/websocket/client.py @@ -52,6 +52,7 @@ class DYDXWebsocketClient: The event loop for the client. subscription_rate_limit_per_second : int, default 2 The maximum number of subscription message to send to the venue. + """ def __init__( @@ -111,6 +112,7 @@ def subscriptions(self) -> set[tuple[str, str]]: ------- set[tuple[str, str]] Set of subscriptions. + """ return self._subscriptions @@ -127,6 +129,7 @@ def has_subscription(self, item: tuple[str, str]) -> bool: ------- bool Whether the client is already subscribed to this topic. + """ return item in self._subscriptions @@ -164,6 +167,7 @@ def _msg_handler(self, raw: bytes) -> None: ---------- raw : bytes The received message in bytes. + """ self._msg_timestamp = self._clock.utc_now() self._handler(raw) @@ -176,6 +180,7 @@ def _handle_ping(self, raw: bytes) -> None: ---------- raw : bytes The received ping in bytes. + """ self._loop.create_task(self.send_pong(raw)) @@ -269,6 +274,7 @@ async def subscribe_trades(self, symbol: str) -> None: ---------- symbol : str Symbol of the instrument to subscribe to. + """ if self._client is None: self._log.warning("Cannot subscribe to trades: not connected") @@ -299,6 +305,7 @@ async def subscribe_order_book( bypass_subscription_validation : bool, default False Whether to bypass the subscription validation step before sending the subscribe message to the venue. + """ if self._client is None: self._log.warning("Cannot subscribe to order book: not connected") @@ -324,6 +331,7 @@ async def subscribe_klines(self, symbol: str, interval: DYDXCandlesResolution) - Symbol of the instrument to subscribe to bars. interval : DYDXCandlesResolution Specify the interval between candle updates (for example 1MIN). + """ if self._client is None: self._log.warning("Cannot subscribe to klines: not connected") @@ -367,6 +375,7 @@ async def subscribe_account_update(self, wallet_address: str, subaccount_number: subaccount_number : int The subaccount number. The venue creates subaccount 0 by default. + """ if self._client is None: self._log.warning("Cannot subscribe: not connected") @@ -395,6 +404,7 @@ async def unsubscribe_account_update(self, wallet_address: str, subaccount_numbe subaccount_number : int The subaccount number. The venue creates subaccount 0 by default. + """ if self._client is None: self._log.warning("Cannot unsubscribe: not connected") @@ -420,6 +430,7 @@ async def unsubscribe_trades(self, symbol: str) -> None: ---------- symbol : str Symbol of the instrument to unsubscribe from. + """ if self._client is None: self._log.warning("Cannot unsubscribe: not connected") @@ -444,6 +455,7 @@ async def unsubscribe_order_book(self, symbol: str, remove_subscription: bool = Symbol of the instrument to unsubscribe from. remove_subscription : bool, optional default True Whether to remove the symbol from the list of subscriptions for order book updates. + """ if self._client is None: self._log.warning("Cannot unsubscribe: not connected") @@ -470,6 +482,7 @@ async def unsubscribe_klines(self, symbol: str, interval: DYDXCandlesResolution) Symbol of the instrument to unsubscribe from bars. interval : DYDXCandlesResolution Specify the interval between candle updates (for example 1MIN). + """ if self._client is None: self._log.warning("Cannot unsubscribe: not connected") @@ -529,6 +542,7 @@ async def _send(self, msg: dict[str, Any]) -> None: ---------- msg : dict[str, Any] Dictionary to serialize as JSON message and send + """ if self._client is None: self._log.error(f"Cannot send message {msg}: not connected") From 3965a2dd8bc833f34f755d2945538f4850775ae4 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 07:21:17 +1100 Subject: [PATCH 110/224] Refine book_type vs data low-level validation --- nautilus_trader/backtest/engine.pyx | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/nautilus_trader/backtest/engine.pyx b/nautilus_trader/backtest/engine.pyx index f22fb59e5c42..4e65b5d66082 100644 --- a/nautilus_trader/backtest/engine.pyx +++ b/nautilus_trader/backtest/engine.pyx @@ -582,14 +582,14 @@ cdef class BacktestEngine: bint sort = True, ) -> None: """ - Add the given custom data to the backtest engine. + Add the given `data` to the backtest engine. Parameters ---------- data : list[Data] The data to add. client_id : ClientId, optional - The data client ID to associate with custom data. + The client ID to associate with the data. validate : bool, default True If `data` should be validated (recommended when adding data directly to the engine). @@ -608,7 +608,7 @@ cdef class BacktestEngine: ValueError If `data` elements do not have an `instrument_id` and `client_id` is ``None``. TypeError - If `data` is a type provided by Rust pyo3 (cannot add directly to engine yet). + If `data` is a Rust PyO3 data type (cannot add directly to engine yet). Warnings -------- @@ -625,14 +625,13 @@ cdef class BacktestEngine: if isinstance(data[0], NAUTILUS_PYO3_DATA_TYPES): raise TypeError( f"Cannot add data of type `{type(data[0]).__name__}` from pyo3 directly to engine. " - "This will supported in a future release.", + "This will be supported in a future release.", ) cdef str data_added_str = "data" - first = data[0] - if validate: + first = data[0] if hasattr(first, "instrument_id"): Condition.is_true( first.instrument_id in self.kernel.cache.instrument_ids(), @@ -641,6 +640,7 @@ cdef class BacktestEngine: ) # Check client has been registered self._add_market_data_client_if_not_exists(first.instrument_id.venue) + self._has_data.add(first.instrument_id) data_added_str = f"{first.instrument_id} {type(first).__name__}" elif isinstance(first, Bar): Condition.is_true( @@ -654,6 +654,7 @@ cdef class BacktestEngine: "bar_type.aggregation_source", "required source", ) + self._has_data.add(first.bar_type.instrument_id) data_added_str = f"{first.bar_type} {type(first).__name__}" else: Condition.not_none(client_id, "client_id") @@ -662,19 +663,15 @@ cdef class BacktestEngine: if isinstance(first, CustomData): data_added_str = f"{type(first.data).__name__} " + if type(first) in BOOK_DATA_TYPES: + self._has_book_data.add(first.instrument_id) + # Add data self._data.extend(data) if sort: self._data = sorted(self._data, key=lambda x: x.ts_init) - if hasattr(first, "instrument_id"): - self._has_data.add(first.instrument_id) - elif isinstance(first, Bar): - self._has_data.add(first.bar_type.instrument_id) - - if type(first) in BOOK_DATA_TYPES: - self._has_book_data.add(first.instrument_id) self._log.info( f"Added {len(data):_} {data_added_str} element{'' if len(data) == 1 else 's'}", From 257c309d703d6321be174e7b29a73e80716a69a6 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 08:01:25 +1100 Subject: [PATCH 111/224] Always process order book data --- nautilus_trader/backtest/matching_engine.pyx | 13 ++++--------- .../adapters/betfair/test_betfair_backtest.py | 4 ++-- tests/unit_tests/persistence/test_streaming.py | 12 ++++++------ 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/nautilus_trader/backtest/matching_engine.pyx b/nautilus_trader/backtest/matching_engine.pyx index eca9c5840cc0..ebe0ea282aa8 100644 --- a/nautilus_trader/backtest/matching_engine.pyx +++ b/nautilus_trader/backtest/matching_engine.pyx @@ -15,9 +15,6 @@ import uuid - -# from nautilus_trader.backtest.auction import default_auction_match - from cpython.datetime cimport timedelta from libc.stdint cimport uint64_t @@ -375,8 +372,7 @@ cdef class OrderMatchingEngine: if is_logging_initialized(): self._log.debug(f"Processing {repr(delta)}") - if self.book_type in (BookType.L2_MBP, BookType.L3_MBO): - self._book.apply_delta(delta) + self._book.apply_delta(delta) # TODO: WIP to introduce flags # if data.flags == TimeInForce.GTC: @@ -405,8 +401,7 @@ cdef class OrderMatchingEngine: if is_logging_initialized(): self._log.debug(f"Processing {repr(deltas)}") - if self.book_type in (BookType.L2_MBP, BookType.L3_MBO): - self._book.apply_deltas(deltas) + self._book.apply_deltas(deltas) # TODO: WIP to introduce flags # if data.flags == TimeInForce.GTC: @@ -424,7 +419,7 @@ cdef class OrderMatchingEngine: """ Process the exchanges market for the given quote tick. - Market dynamics are simulated by auctioning open orders. + The internal order book will only be updated if the venue `book_type` is 'L1_MBP'. Parameters ---------- @@ -446,7 +441,7 @@ cdef class OrderMatchingEngine: """ Process the exchanges market for the given trade tick. - Market dynamics are simulated by auctioning open orders. + The internal order book will only be updated if the venue `book_type` is 'L1_MBP'. Parameters ---------- diff --git a/tests/integration_tests/adapters/betfair/test_betfair_backtest.py b/tests/integration_tests/adapters/betfair/test_betfair_backtest.py index 892e0b308049..9939a770eb1e 100644 --- a/tests/integration_tests/adapters/betfair/test_betfair_backtest.py +++ b/tests/integration_tests/adapters/betfair/test_betfair_backtest.py @@ -94,6 +94,6 @@ def test_betfair_backtest(): account = engine.trader.generate_account_report(BETFAIR_VENUE) fills = engine.trader.generate_order_fills_report() positions = engine.trader.generate_positions_report() - assert account.iloc[-1]["total"] == "1630955.72" - assert len(fills) == 1223 + assert account.iloc[-1]["total"] == "80962.97" + assert len(fills) == 981 assert len(positions) == 2 diff --git a/tests/unit_tests/persistence/test_streaming.py b/tests/unit_tests/persistence/test_streaming.py index 8cdc77a16c06..20ee61bca9d8 100644 --- a/tests/unit_tests/persistence/test_streaming.py +++ b/tests/unit_tests/persistence/test_streaming.py @@ -83,12 +83,12 @@ def test_feather_writer(self, catalog_betfair: ParquetDataCatalog) -> None: "ComponentStateChanged": 27, "OrderAccepted": 189, "OrderBookDelta": 1307, - "OrderCanceled": 79, + "OrderCanceled": 100, "OrderDenied": 3, - "OrderFilled": 112, + "OrderFilled": 91, "OrderInitialized": 193, "OrderSubmitted": 190, - "PositionChanged": 108, + "PositionChanged": 87, "PositionClosed": 3, "PositionOpened": 3, "TradeTick": 179, @@ -422,12 +422,12 @@ def test_read_backtest( "ComponentStateChanged": 27, "OrderAccepted": 189, "OrderBookDelta": 1307, - "OrderCanceled": 79, + "OrderCanceled": 100, "OrderDenied": 3, - "OrderFilled": 112, + "OrderFilled": 91, "OrderInitialized": 193, "OrderSubmitted": 190, - "PositionChanged": 108, + "PositionChanged": 87, "PositionClosed": 3, "PositionOpened": 3, "TradeTick": 179, From db078722db8d7d47c27c107bd00a2f57a174570b Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 08:19:03 +1100 Subject: [PATCH 112/224] Improve backtesting docs --- docs/concepts/advanced/actors.md | 2 +- docs/concepts/backtesting.md | 95 +++++++++++++------ docs/concepts/live.md | 2 +- .../backtest_binance_orderbook.ipynb | 2 +- docs/tutorials/backtest_fx_bars.ipynb | 2 +- docs/tutorials/databento_data_catalog.ipynb | 2 +- 6 files changed, 69 insertions(+), 36 deletions(-) diff --git a/docs/concepts/advanced/actors.md b/docs/concepts/advanced/actors.md index ed6f5294596d..73ea5f79e516 100644 --- a/docs/concepts/advanced/actors.md +++ b/docs/concepts/advanced/actors.md @@ -1,7 +1,7 @@ # Actors :::info -We are currently working on this article. +We are currently working on this guide. ::: The `Strategy` class actually inherits from `Actor`, and additionally provides order management diff --git a/docs/concepts/backtesting.md b/docs/concepts/backtesting.md index aa33ec33bb98..e7e70806a682 100644 --- a/docs/concepts/backtesting.md +++ b/docs/concepts/backtesting.md @@ -1,54 +1,87 @@ # Backtesting :::info -We are currently working on this article. +We are currently working on this guide. ::: Backtesting with NautilusTrader is a methodical simulation process that replicates trading activities using a specific system implementation. This system is composed of various components -including [Actors](advanced/actors.md), [Strategies](strategies.md), [Execution Algorithms](execution.md), +including the built-in engines, `Cache`, `MessageBus`, `Portfolio`, [Actors](advanced/actors.md), [Strategies](strategies.md), [Execution Algorithms](execution.md), and other user-defined modules. The entire trading simulation is predicated on a stream of historical data processed by a `BacktestEngine`. Once this data stream is exhausted, the engine concludes its operation, producing detailed results and performance metrics for in-depth analysis. -It's paramount to recognize that NautilusTrader offers two distinct API levels for setting up and -conducting backtests: **high-level** and **low-level**. +It's important to recognize that NautilusTrader offers two distinct API levels for setting up and conducting backtests: + +- **High-level API**: Uses a `BacktestNode` and configuration objects (`BacktestEngine`s are used internally). +- **Low-level API**: Uses a `BacktestEngine` directly with more "manual" setup. ## Choosing an API level -Consider the **low-level** API when: +Consider using the **low-level** API when: -- The entirety of your data stream can be comfortably accommodated within available memory -- You choose to avoid storing data in the Nautilus-specific Parquet format -- Or, you have a specific need/preference for retaining raw data in its innate format, such as CSV, Binary, etc -- You seek granular control over the `BacktestEngine`, enabling functionalities such as re-running backtests on identical data while interchanging components (like actors or strategies) or tweaking parameter settings +- Your entire data stream can be processed within the available machine resources (e.g., RAM). +- You prefer not to store data in the Nautilus-specific Parquet format. +- You have a specific need or preference to retain raw data in its original format (e.g., CSV, binary, etc.). +- You require fine-grained control over the `BacktestEngine`, such as the ability to re-run backtests on identical datasets while swapping out components (e.g., actors or strategies) or adjusting parameter configurations. -Consider the **high-level** API when: +Consider using the **high-level** API when: -- Your data stream's size exceeds available memory, necessitating streaming data in batches -- You want to harness the performance capabilities and convenience of the `ParquetDataCatalog` and persist your data in the Nautilus-specific Parquet format -- You value the flexibility and advanced functionalities offered by passing configuration objects, which can define diverse backtest runs across many engines at once +- Your data stream exceeds available memory, requiring streaming data in batches. +- You want to leverage the performance and convenience of the `ParquetDataCatalog` for storing data in the Nautilus-specific Parquet format. +- You value the flexibility and functionality of passing configuration objects to define and manage multiple backtest runs across various engines simultaneously. ## Low-level API -The low-level API revolves around a single `BacktestEngine`, with inputs initialized and added 'manually' via a Python script. -An instantiated `BacktestEngine` can accept: -- Lists of `Data` objects which will be automatically sorted into monotonic order by `ts_init` -- Multiple venues (manually initialized and added) -- Multiple actors (manually initialized and added) -- Multiple execution algorithms (manually initialized and added) +The low-level API centers around a `BacktestEngine`, where inputs are initialized and added manually via a Python script. +An instantiated `BacktestEngine` can accept the following: + +- Lists of `Data` objects, which are automatically sorted into monotonic order based on `ts_init`. +- Multiple venues, manually initialized. +- Multiple actors, manually initialized and added. +- Multiple execution algorithms, manually initialized and added. + +This approach offers detailed control over the backtesting process, allowing you to manually configure each component. ## High-level API -The high-level API revolves around a single `BacktestNode`, which will orchestrate the management -of individual `BacktestEngine`s, each defined by a `BacktestRunConfig`. -Multiple configurations can be bundled into a list and fed to the node to be run. - -Each of these `BacktestRunConfig` objects in turn is made up of: -- A list of `BacktestDataConfig` objects -- A list of `BacktestVenueConfig` objects -- A list of `ImportableActorConfig` objects -- A list of `ImportableStrategyConfig` objects -- A list of `ImportableExecAlgorithmConfig` objects -- An optional `ImportableControllerConfig` object -- An optional `BacktestEngineConfig` object (otherwise will be the default) +The high-level API centers around a `BacktestNode`, which orchestrates the management of multiple `BacktestEngine` instances, +each defined by a `BacktestRunConfig`. Multiple configurations can be bundled into a list and processed by the node in one run. + +Each `BacktestRunConfig` object consists of the following: + +- A list of `BacktestDataConfig` objects. +- A list of `BacktestVenueConfig` objects. +- A list of `ImportableActorConfig` objects. +- A list of `ImportableStrategyConfig` objects. +- A list of `ImportableExecAlgorithmConfig` objects. +- An optional `ImportableControllerConfig` object. +- An optional `BacktestEngineConfig` object, with a default configuration if not specified. + +## Data + +Data provided for backtesting drives the execution flow. Since a variety of data types can be used, +it's crucial that your venue configurations align with the data being provided for backtesting. +Mismatches between data and configuration can lead to unexpected behavior during execution. + +## Venues + +When initializing a venue for backtesting, you must specify its internal order `book_type` for execution processing from the following options: + +- `L1_MBP`: Level 1 market-by-price (default). Only the top level of the order book is maintained. +- `L2_MBP`: Level 2 market-by-price. Order book depth is maintained, with a single order aggregated per price level. +- `L3_MBO`: Level 3 market-by-order. Order book depth is maintained, with all individual orders tracked as provided by the data. + +:::note +The granularity of the data must match the specified order `book_type`. Nautilus cannot generate higher granularity data (L2 or L3) from lower-level data such as quotes, trades, or bars. +::: + +:::warning +If you specify `L2_MBP` or `L3_MBO` as the venue’s `book_type`, all non-order book data (such as quotes, trades, and bars) will be ignored for execution processing. +This may cause orders to appear as though they are never filled. We are actively working on improved validation logic to prevent configuration and data mismatches. +::: + +:::warning +When providing Level 2 or higher order book data, ensure that the `book_type` is updated to reflect the data's granularity. +Failing to do so will result in data aggregation: L2 data will be reduced to a single order per level, and L1 data will reflect only top-of-book levels. +::: diff --git a/docs/concepts/live.md b/docs/concepts/live.md index ae0bac4e2a84..24239e072324 100644 --- a/docs/concepts/live.md +++ b/docs/concepts/live.md @@ -1,7 +1,7 @@ # Live trading :::info -We are currently working on this article. +We are currently working on this guide. ::: Live trading in NautilusTrader enables traders to deploy their backtested strategies in a real-time diff --git a/docs/tutorials/backtest_binance_orderbook.ipynb b/docs/tutorials/backtest_binance_orderbook.ipynb index c7f6af95aeab..8ce6395b2c0a 100644 --- a/docs/tutorials/backtest_binance_orderbook.ipynb +++ b/docs/tutorials/backtest_binance_orderbook.ipynb @@ -12,7 +12,7 @@ "[View source on GitHub](https://github.com/nautechsystems/nautilus_trader/blob/develop/docs/tutorials/backtest_binance_orderbook.ipynb).\n", "\n", ":::info\n", - "We are currently working on this article.\n", + "We are currently working on this tutorial.\n", ":::" ] }, diff --git a/docs/tutorials/backtest_fx_bars.ipynb b/docs/tutorials/backtest_fx_bars.ipynb index 93f7e45b6482..a0afa364489c 100644 --- a/docs/tutorials/backtest_fx_bars.ipynb +++ b/docs/tutorials/backtest_fx_bars.ipynb @@ -12,7 +12,7 @@ "[View source on GitHub](https://github.com/nautechsystems/nautilus_trader/blob/develop/docs/tutorials/backtest_fx_bars.ipynb).\n", "\n", ":::info\n", - "We are currently working on this article.\n", + "We are currently working on this tutorial.\n", ":::" ] }, diff --git a/docs/tutorials/databento_data_catalog.ipynb b/docs/tutorials/databento_data_catalog.ipynb index 28601a16e640..959a3e5193a0 100644 --- a/docs/tutorials/databento_data_catalog.ipynb +++ b/docs/tutorials/databento_data_catalog.ipynb @@ -12,7 +12,7 @@ "[View source on GitHub](https://github.com/nautechsystems/nautilus_trader/blob/develop/docs/tutorials/databento_data_catalog.ipynb).\n", "\n", ":::info\n", - "We are currently working on this article.\n", + "We are currently working on this tutorial.\n", ":::" ] }, From 5b009d9a041391531537681e2881b5e64954be1d Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 08:41:49 +1100 Subject: [PATCH 113/224] Standardize adapter constants --- nautilus_trader/adapters/betfair/constants.py | 1 + .../adapters/binance/common/constants.py | 3 ++- .../adapters/bybit/common/constants.py | 3 ++- .../adapters/dydx/common/constants.py | 4 +++- .../adapters/interactive_brokers/common.py | 5 ++++- .../adapters/okx/common/constants.py | 3 ++- nautilus_trader/adapters/tardis/constants.py | 22 +++++++++++++++++++ 7 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 nautilus_trader/adapters/tardis/constants.py diff --git a/nautilus_trader/adapters/betfair/constants.py b/nautilus_trader/adapters/betfair/constants.py index 4641dc529f29..0db07a4fac1a 100644 --- a/nautilus_trader/adapters/betfair/constants.py +++ b/nautilus_trader/adapters/betfair/constants.py @@ -27,6 +27,7 @@ BETFAIR: Final[str] = "BETFAIR" BETFAIR_VENUE: Final[Venue] = Venue(BETFAIR) BETFAIR_CLIENT_ID: Final[ClientId] = ClientId(BETFAIR) + BETFAIR_PRICE_PRECISION: Final[int] = 2 BETFAIR_QUANTITY_PRECISION: Final[int] = 2 BETFAIR_BOOK_TYPE: Final[BookType] = BookType.L2_MBP diff --git a/nautilus_trader/adapters/binance/common/constants.py b/nautilus_trader/adapters/binance/common/constants.py index dbeecb4869f0..0f0b4473ef14 100644 --- a/nautilus_trader/adapters/binance/common/constants.py +++ b/nautilus_trader/adapters/binance/common/constants.py @@ -20,7 +20,8 @@ from nautilus_trader.model.identifiers import Venue -BINANCE_VENUE: Final[Venue] = Venue("BINANCE") +BINANCE: Final[str] = "BINANCE" +BINANCE_VENUE: Final[Venue] = Venue(BINANCE) BINANCE_MIN_CALLBACK_RATE: Final[Decimal] = Decimal("0.1") BINANCE_MAX_CALLBACK_RATE: Final[Decimal] = Decimal("10.0") diff --git a/nautilus_trader/adapters/bybit/common/constants.py b/nautilus_trader/adapters/bybit/common/constants.py index df5046a9a4b9..80a284b27c19 100644 --- a/nautilus_trader/adapters/bybit/common/constants.py +++ b/nautilus_trader/adapters/bybit/common/constants.py @@ -19,7 +19,8 @@ from nautilus_trader.model.identifiers import Venue -BYBIT_VENUE: Final[Venue] = Venue("BYBIT") +BYBIT: Final[str] = "BYBIT" +BYBIT_VENUE: Final[Venue] = Venue(BYBIT) BYBIT_ALL_PRODUCTS: Final[list[BybitProductType]] = [ BybitProductType.SPOT, diff --git a/nautilus_trader/adapters/dydx/common/constants.py b/nautilus_trader/adapters/dydx/common/constants.py index 705aee4542cc..f5fc0af738fe 100644 --- a/nautilus_trader/adapters/dydx/common/constants.py +++ b/nautilus_trader/adapters/dydx/common/constants.py @@ -21,7 +21,9 @@ from nautilus_trader.model.identifiers import Venue -DYDX_VENUE: Final[Venue] = Venue("DYDX") +DYDX: Final[str] = "DYDX" +DYDX_VENUE: Final[Venue] = Venue(DYDX) + FEE_SCALING: Final[int] = 1_000_000 DEFAULT_CURRENCY: Final[str] = "USDC" diff --git a/nautilus_trader/adapters/interactive_brokers/common.py b/nautilus_trader/adapters/interactive_brokers/common.py index 24b477edd3c8..6364142e4783 100644 --- a/nautilus_trader/adapters/interactive_brokers/common.py +++ b/nautilus_trader/adapters/interactive_brokers/common.py @@ -20,10 +20,13 @@ from ibapi.tag_value import TagValue from nautilus_trader.config import NautilusConfig +from nautilus_trader.model.identifiers import ClientId from nautilus_trader.model.identifiers import Venue -IB_VENUE: Final[Venue] = Venue("INTERACTIVE_BROKERS") +IB: Final[str] = "INTERACTIVE_BROKERS" +IB_VENUE: Final[Venue] = Venue(IB) +IB_CLIENT_ID: Final[ClientId] = ClientId(IB) class ContractId(int): diff --git a/nautilus_trader/adapters/okx/common/constants.py b/nautilus_trader/adapters/okx/common/constants.py index 437c9500d67e..21e73d68b576 100644 --- a/nautilus_trader/adapters/okx/common/constants.py +++ b/nautilus_trader/adapters/okx/common/constants.py @@ -18,4 +18,5 @@ from nautilus_trader.model.identifiers import Venue -OKX_VENUE: Final[Venue] = Venue("OKX") +OKX: Final[str] = "OKX" +OKX_VENUE: Final[Venue] = Venue(OKX) diff --git a/nautilus_trader/adapters/tardis/constants.py b/nautilus_trader/adapters/tardis/constants.py new file mode 100644 index 000000000000..dd3945cc555a --- /dev/null +++ b/nautilus_trader/adapters/tardis/constants.py @@ -0,0 +1,22 @@ +# ------------------------------------------------------------------------------------------------- +# Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +# https://nautechsystems.io +# +# Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +# You may not use this file except in compliance with the License. +# You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ------------------------------------------------------------------------------------------------- + +from typing import Final + +from nautilus_trader.model.identifiers import ClientId + + +TARDIS: Final[str] = "TARDIS" +TARDIS_CLIENT_ID: Final[ClientId] = ClientId(TARDIS) From 08224b079b1b9cf5af3cbad4fc81ec7803855af3 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 08:54:54 +1100 Subject: [PATCH 114/224] Group public fields --- nautilus_core/common/src/throttler/inner.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nautilus_core/common/src/throttler/inner.rs b/nautilus_core/common/src/throttler/inner.rs index 48583d131a12..4f9f6939c649 100644 --- a/nautilus_core/common/src/throttler/inner.rs +++ b/nautilus_core/common/src/throttler/inner.rs @@ -37,10 +37,10 @@ pub struct InnerThrottler { pub buffer: VecDeque, /// The timestamps of the sent messages. pub timestamps: VecDeque, - /// The interval between messages in nanoseconds. - interval: u64, /// The clock used to keep track of time. pub clock: Rc>, + /// The interval between messages in nanoseconds. + interval: u64, /// The name of the timer. timer_name: String, /// The callback to send a message. @@ -54,7 +54,7 @@ where T: Debug, { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("InnerThrottler") + f.debug_struct(stringify!(InnerThrottler)) .field("recv_count", &self.recv_count) .field("sent_count", &self.sent_count) .field("is_limiting", &self.is_limiting) @@ -84,8 +84,8 @@ impl InnerThrottler { limit, buffer: VecDeque::new(), timestamps: VecDeque::with_capacity(limit), - interval, clock, + interval, timer_name, output_send, output_drop, From cef49bb9577344f63e046d6248e9639440465d7f Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 09:32:30 +1100 Subject: [PATCH 115/224] Continue bar aggregation in Rust --- nautilus_core/data/src/aggregation.rs | 266 +++++++++++++------------- 1 file changed, 128 insertions(+), 138 deletions(-) diff --git a/nautilus_core/data/src/aggregation.rs b/nautilus_core/data/src/aggregation.rs index f7dc0e97f75a..a23da1d8fa59 100644 --- a/nautilus_core/data/src/aggregation.rs +++ b/nautilus_core/data/src/aggregation.rs @@ -49,7 +49,6 @@ pub trait BarAggregator { /// Updates the aggregator with the given quote. fn handle_quote(&mut self, quote: QuoteTick) { let spec = self.bar_type().spec(); - self.update( quote.extract_price(spec.price_type), quote.extract_size(spec.price_type), @@ -220,14 +219,20 @@ impl BarBuilder { } /// Provides a means of aggregating specified bar types and sending to a registered handler. -pub struct BarAggregatorCore { +pub struct BarAggregatorCore +where + H: FnMut(Bar), +{ bar_type: BarType, builder: BarBuilder, - handler: fn(Bar), + handler: H, await_partial: bool, } -impl BarAggregatorCore { +impl BarAggregatorCore +where + H: FnMut(Bar), +{ /// Creates a new [`BarAggregatorCore`] instance. /// /// # Panics @@ -238,7 +243,7 @@ impl BarAggregatorCore { pub fn new( instrument: &InstrumentAny, bar_type: BarType, - handler: fn(Bar), + handler: H, await_partial: bool, ) -> Self { Self { @@ -277,11 +282,17 @@ impl BarAggregatorCore { /// /// When received tick count reaches the step threshold of the bar /// specification, then a bar is created and sent to the handler. -pub struct TickBarAggregator { - core: BarAggregatorCore, +pub struct TickBarAggregator +where + H: FnMut(Bar), +{ + core: BarAggregatorCore, } -impl TickBarAggregator { +impl TickBarAggregator +where + H: FnMut(Bar), +{ /// Creates a new [`TickBarAggregator`] instance. /// /// # Panics @@ -292,7 +303,7 @@ impl TickBarAggregator { pub fn new( instrument: &InstrumentAny, bar_type: BarType, - handler: fn(Bar), + handler: H, await_partial: bool, ) -> Self { Self { @@ -301,7 +312,10 @@ impl TickBarAggregator { } } -impl BarAggregator for TickBarAggregator { +impl BarAggregator for TickBarAggregator +where + H: FnMut(Bar), +{ fn bar_type(&self) -> BarType { self.core.bar_type } @@ -318,11 +332,17 @@ impl BarAggregator for TickBarAggregator { } /// Provides a means of building volume bars aggregated from quote and trade ticks. -pub struct VolumeBarAggregator { - core: BarAggregatorCore, +pub struct VolumeBarAggregator +where + H: FnMut(Bar), +{ + core: BarAggregatorCore, } -impl VolumeBarAggregator { +impl VolumeBarAggregator +where + H: FnMut(Bar), +{ /// Creates a new [`VolumeBarAggregator`] instance. /// /// # Panics @@ -333,7 +353,7 @@ impl VolumeBarAggregator { pub fn new( instrument: &InstrumentAny, bar_type: BarType, - handler: fn(Bar), + handler: H, await_partial: bool, ) -> Self { Self { @@ -342,7 +362,10 @@ impl VolumeBarAggregator { } } -impl BarAggregator for VolumeBarAggregator { +impl BarAggregator for VolumeBarAggregator +where + H: FnMut(Bar), +{ fn bar_type(&self) -> BarType { self.core.bar_type } @@ -382,12 +405,18 @@ impl BarAggregator for VolumeBarAggregator { /// /// When received value reaches the step threshold of the bar /// specification, then a bar is created and sent to the handler. -pub struct ValueBarAggregator { - core: BarAggregatorCore, +pub struct ValueBarAggregator +where + H: FnMut(Bar), +{ + core: BarAggregatorCore, cum_value: f64, } -impl ValueBarAggregator { +impl ValueBarAggregator +where + H: FnMut(Bar), +{ /// Creates a new [`ValueBarAggregator`] instance. /// /// # Panics @@ -398,7 +427,7 @@ impl ValueBarAggregator { pub fn new( instrument: &InstrumentAny, bar_type: BarType, - handler: fn(Bar), + handler: H, await_partial: bool, ) -> Self { Self { @@ -414,7 +443,10 @@ impl ValueBarAggregator { } } -impl BarAggregator for ValueBarAggregator { +impl BarAggregator for ValueBarAggregator +where + H: FnMut(Bar), +{ fn bar_type(&self) -> BarType { self.core.bar_type } @@ -448,11 +480,12 @@ impl BarAggregator for ValueBarAggregator { /// Provides a means of building time bars aggregated from quote and trade ticks. /// /// At each aggregation time interval, a bar is created and sent to the handler. -pub struct TimeBarAggregator +pub struct TimeBarAggregator where C: Clock, + H: FnMut(Bar), { - core: BarAggregatorCore, + core: BarAggregatorCore, clock: C, build_with_no_updates: bool, timestamp_on_close: bool, @@ -468,27 +501,28 @@ where } #[derive(Clone)] -pub struct NewBarCallback { - aggregator: Rc>>, +pub struct NewBarCallback { + aggregator: Rc>>, } -impl NewBarCallback { - pub const fn new(aggregator: Rc>>) -> Self { +impl NewBarCallback { + pub const fn new(aggregator: Rc>>) -> Self { Self { aggregator } } } -impl From> for TimeEventCallback { - fn from(value: NewBarCallback) -> Self { +impl From> for TimeEventCallback { + fn from(value: NewBarCallback) -> Self { Self::Rust(Rc::new(move |event: TimeEvent| { value.aggregator.borrow_mut().build_bar(event); })) } } -impl TimeBarAggregator +impl TimeBarAggregator where C: Clock + 'static, + H: FnMut(Bar) + 'static, { /// Creates a new [`TimeBarAggregator`] instance. /// @@ -501,7 +535,7 @@ where pub fn new( instrument: &InstrumentAny, bar_type: BarType, - handler: fn(Bar), + handler: H, await_partial: bool, clock: C, build_with_no_updates: bool, @@ -526,7 +560,7 @@ where } /// Starts the time bar aggregator. - pub fn start(&mut self, callback: NewBarCallback) -> anyhow::Result<()> { + pub fn start(&mut self, callback: NewBarCallback) -> anyhow::Result<()> { let now = self.clock.utc_now(); let start_time = get_time_bar_start(now, &self.bar_type()); let start_time_ns = UnixNanos::from(start_time.timestamp_nanos_opt().unwrap() as u64); @@ -576,9 +610,10 @@ where } } -impl BarAggregator for TimeBarAggregator +impl BarAggregator for TimeBarAggregator where C: Clock, + H: FnMut(Bar), { fn bar_type(&self) -> BarType { self.core.bar_type @@ -611,6 +646,8 @@ where //////////////////////////////////////////////////////////////////////////////// #[cfg(test)] mod tests { + use std::sync::{Arc, Mutex}; + use nautilus_model::{ data::bar::{BarSpecification, BarType}, enums::{AggregationSource, BarAggregation, PriceType}, @@ -882,110 +919,63 @@ mod tests { assert_eq!(bar.volume, Quantity::new(3.0, 0)); } - // #[rstest] - // fn test_tick_bar_aggregator_handle_quote_tick_when_count_below_threshold_updates( - // equity_aapl: Equity, - // ) { - // let instrument = InstrumentAny::Equity(equity_aapl); - // let bar_spec = BarSpecification::new(3, BarAggregation::Tick, PriceType::Mid); - // let bar_type = BarType::new(instrument.id(), bar_spec, AggregationSource::Internal); - // let handler = Arc::new(Mutex::new(Vec::new())); - // let mut aggregator = TickBarAggregator::new(&instrument, bar_type, Arc::clone(&handler)); - // - // let tick = QuoteTick::new( - // instrument.id(), - // Price::new(1.00001, 8), - // Price::new(1.00004, 8), - // Quantity::new(1.0, 0), - // Quantity::new(1.0, 0), - // UnixNanos::from(0), - // UnixNanos::from(0), - // ); - // - // aggregator.handle_quote_tick(tick); - // - // let handler_guard = handler.lock().unwrap(); - // assert_eq!(handler_guard.len(), 0); - // } - - // - // #[rstest] - // fn test_tick_bar_aggregator_handle_trade_tick_when_count_below_threshold_updates( - // equity_aapl: Equity, - // ) { - // let instrument = InstrumentAny::Equity(equity_aapl); - // let bar_spec = BarSpecification::new(3, BarAggregation::Tick, PriceType::Last); - // let bar_type = BarType::new(instrument.id(), bar_spec, AggregationSource::Internal); - // let handler = Arc::new(Mutex::new(Vec::new())); - // let mut aggregator = TickBarAggregator::new(&instrument, bar_type, Arc::clone(&handler)); - // - // let tick = TradeTick::new( - // instrument.id(), - // Price::new(1.00001, 8), - // Quantity::new(1.0, 0), - // AggressorSide::Buyer, - // TradeId::new("123456"), - // UnixNanos::from(0), - // UnixNanos::from(0), - // ); - // - // aggregator.handle_trade_tick(tick); - // - // let handler_guard = handler.lock().unwrap(); - // assert_eq!(handler_guard.len(), 0); - // } - // - // #[rstest] - // fn test_tick_bar_aggregator_handle_quote_tick_when_count_at_threshold_sends_bar_to_handler( - // equity_aapl: Equity, - // ) { - // let instrument = InstrumentAny::Equity(equity_aapl); - // let bar_spec = BarSpecification::new(3, BarAggregation::Tick, PriceType::Mid); - // let bar_type = BarType::new(instrument.id(), bar_spec, AggregationSource::Internal); - // let handler = Arc::new(Mutex::new(Vec::new())); - // let mut aggregator = TickBarAggregator::new(&instrument, bar_type, Arc::clone(&handler)); - // - // let tick1 = QuoteTick::new( - // instrument.id(), - // Price::new(1.00001, 8), - // Price::new(1.00004, 8), - // Quantity::new(1.0, 0), - // Quantity::new(1.0, 0), - // UnixNanos::from(0), - // UnixNanos::from(0), - // ); - // - // let tick2 = QuoteTick::new( - // instrument.id(), - // Price::new(1.00002, 8), - // Price::new(1.00005, 8), - // Quantity::new(1.0, 0), - // Quantity::new(1.0, 0), - // UnixNanos::from(0), - // UnixNanos::from(0), - // ); - // - // let tick3 = QuoteTick::new( - // instrument.id(), - // Price::new(1.00000, 8), - // Price::new(1.00003, 8), - // Quantity::new(1.0, 0), - // Quantity::new(1.0, 0), - // UnixNanos::from(0), - // UnixNanos::from(0), - // ); - // - // aggregator.handle_quote_tick(tick1); - // aggregator.handle_quote_tick(tick2); - // aggregator.handle_quote_tick(tick3); - // - // let handler_guard = handler.lock().unwrap(); - // assert_eq!(handler_guard.len(), 1); - // let bar = &handler_guard[0]; - // assert_eq!(bar.open, Price::new(1.000025, 8)); - // assert_eq!(bar.high, Price::new(1.000035, 8)); - // assert_eq!(bar.low, Price::new(1.000015, 8)); - // assert_eq!(bar.close, Price::new(1.000015, 8)); - // assert_eq!(bar.volume, Quantity::new(3.0, 0)); - // } + #[rstest] + fn test_tick_bar_aggregator_handle_trade_when_step_count_below_threshold(equity_aapl: Equity) { + let instrument = InstrumentAny::Equity(equity_aapl); + let bar_spec = BarSpecification::new(3, BarAggregation::Tick, PriceType::Last); + let bar_type = BarType::new(instrument.id(), bar_spec, AggregationSource::Internal); + let handler = Arc::new(Mutex::new(Vec::new())); + let handler_clone = Arc::clone(&handler); + + let mut aggregator = TickBarAggregator::new( + &instrument, + bar_type, + move |bar: Bar| { + let mut handler_guard = handler_clone.lock().unwrap(); + handler_guard.push(bar); + }, + false, + ); + + let trade = TradeTick::default(); + aggregator.handle_trade(trade); + + let handler_guard = handler.lock().unwrap(); + assert_eq!(handler_guard.len(), 0); + } + + #[rstest] + fn test_tick_bar_aggregator_handle_trade_when_step_count_reached(equity_aapl: Equity) { + let instrument = InstrumentAny::Equity(equity_aapl); + let bar_spec = BarSpecification::new(3, BarAggregation::Tick, PriceType::Last); + let bar_type = BarType::new(instrument.id(), bar_spec, AggregationSource::Internal); + let handler = Arc::new(Mutex::new(Vec::new())); + let handler_clone = Arc::clone(&handler); + + let mut aggregator = TickBarAggregator::new( + &instrument, + bar_type, + move |bar: Bar| { + let mut handler_guard = handler_clone.lock().unwrap(); + handler_guard.push(bar); + }, + false, + ); + + let trade = TradeTick::default(); + aggregator.handle_trade(trade); + aggregator.handle_trade(trade); + aggregator.handle_trade(trade); + + let handler_guard = handler.lock().unwrap(); + let bar = handler_guard.first().unwrap(); + assert_eq!(handler_guard.len(), 1); + assert_eq!(bar.open, trade.price); + assert_eq!(bar.high, trade.price); + assert_eq!(bar.low, trade.price); + assert_eq!(bar.close, trade.price); + assert_eq!(bar.volume, Quantity::from(300000)); + assert_eq!(bar.ts_event, trade.ts_event); + assert_eq!(bar.ts_init, trade.ts_init); + } } From 5f265d44df507d99e6cde7961593da787efb894e Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 09:41:27 +1100 Subject: [PATCH 116/224] Standardize quote and trade variable naming --- .../tests/test_cache_database_postgres.rs | 6 +-- nautilus_core/model/src/data/quote.rs | 40 +++++++++---------- nautilus_core/model/src/data/stubs.rs | 4 +- nautilus_core/model/src/data/trade.rs | 18 ++++----- nautilus_core/model/src/python/data/quote.rs | 14 +++---- nautilus_core/model/src/python/data/status.rs | 2 +- nautilus_core/model/src/python/data/trade.rs | 14 +++---- 7 files changed, 49 insertions(+), 49 deletions(-) diff --git a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs index 6c65be579f2c..cd27673feea7 100644 --- a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs +++ b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs @@ -23,7 +23,7 @@ mod serial_tests { use nautilus_infrastructure::sql::cache::get_pg_cache_database; use nautilus_model::{ accounts::{any::AccountAny, cash::CashAccount}, - data::stubs::{quote_tick_ethusdt_binance, stub_bar, stub_trade_tick_ethusdt_buyer}, + data::stubs::{quote_ethusdt_binance, stub_bar, stub_trade_ethusdt_buyer}, enums::{CurrencyType, OrderSide, OrderStatus, OrderType}, events::account::stubs::cash_account_state_million_usd, identifiers::{ @@ -395,7 +395,7 @@ mod serial_tests { pg_cache.add_currency(&instrument.quote_currency()).unwrap(); pg_cache.add_instrument(&instrument).unwrap(); // add trade tick - let trade_tick = stub_trade_tick_ethusdt_buyer(); + let trade_tick = stub_trade_ethusdt_buyer(); pg_cache.add_trade(&trade_tick).unwrap(); wait_until( || { @@ -423,7 +423,7 @@ mod serial_tests { pg_cache.add_currency(&instrument.quote_currency()).unwrap(); pg_cache.add_instrument(&instrument).unwrap(); // add quote tick - let quote_tick = quote_tick_ethusdt_binance(); + let quote_tick = quote_ethusdt_binance(); pg_cache.add_quote("e_tick).unwrap(); wait_until( || { diff --git a/nautilus_core/model/src/data/quote.rs b/nautilus_core/model/src/data/quote.rs index 2188aadbded5..a9c0c0f968c3 100644 --- a/nautilus_core/model/src/data/quote.rs +++ b/nautilus_core/model/src/data/quote.rs @@ -13,7 +13,7 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- -//! A `QuoteTick` data type representing a top-of-book quote state. +//! A `QuoteTick` data type representing a top-of-book state. use std::{ cmp, @@ -219,15 +219,15 @@ mod tests { use rstest::rstest; use crate::{ - data::{quote::QuoteTick, stubs::quote_tick_ethusdt_binance}, + data::{quote::QuoteTick, stubs::quote_ethusdt_binance}, enums::PriceType, }; #[rstest] - fn test_to_string(quote_tick_ethusdt_binance: QuoteTick) { - let tick = quote_tick_ethusdt_binance; + fn test_to_string(quote_ethusdt_binance: QuoteTick) { + let quote = quote_ethusdt_binance; assert_eq!( - tick.to_string(), + quote.to_string(), "ETHUSDT-PERP.BINANCE,10000.0000,10001.0000,1.00000000,1.00000000,0" ); } @@ -239,38 +239,38 @@ mod tests { fn test_extract_price( #[case] input: PriceType, #[case] expected: i64, - quote_tick_ethusdt_binance: QuoteTick, + quote_ethusdt_binance: QuoteTick, ) { - let tick = quote_tick_ethusdt_binance; - let result = tick.extract_price(input).raw; + let quote = quote_ethusdt_binance; + let result = quote.extract_price(input).raw; assert_eq!(result, expected); } #[rstest] - fn test_from_pyobject(quote_tick_ethusdt_binance: QuoteTick) { + fn test_from_pyobject(quote_ethusdt_binance: QuoteTick) { pyo3::prepare_freethreaded_python(); - let tick = quote_tick_ethusdt_binance; + let quote = quote_ethusdt_binance; Python::with_gil(|py| { - let tick_pyobject = tick.into_py(py); + let tick_pyobject = quote.into_py(py); let parsed_tick = QuoteTick::from_pyobject(tick_pyobject.bind(py)).unwrap(); - assert_eq!(parsed_tick, tick); + assert_eq!(parsed_tick, quote); }); } #[rstest] - fn test_json_serialization(quote_tick_ethusdt_binance: QuoteTick) { - let tick = quote_tick_ethusdt_binance; - let serialized = tick.as_json_bytes().unwrap(); + fn test_json_serialization(quote_ethusdt_binance: QuoteTick) { + let quote = quote_ethusdt_binance; + let serialized = quote.as_json_bytes().unwrap(); let deserialized = QuoteTick::from_json_bytes(serialized.as_ref()).unwrap(); - assert_eq!(deserialized, tick); + assert_eq!(deserialized, quote); } #[rstest] - fn test_msgpack_serialization(quote_tick_ethusdt_binance: QuoteTick) { - let tick = quote_tick_ethusdt_binance; - let serialized = tick.as_msgpack_bytes().unwrap(); + fn test_msgpack_serialization(quote_ethusdt_binance: QuoteTick) { + let quote = quote_ethusdt_binance; + let serialized = quote.as_msgpack_bytes().unwrap(); let deserialized = QuoteTick::from_msgpack_bytes(serialized.as_ref()).unwrap(); - assert_eq!(deserialized, tick); + assert_eq!(deserialized, quote); } } diff --git a/nautilus_core/model/src/data/stubs.rs b/nautilus_core/model/src/data/stubs.rs index 542e66c81e7a..9b1fd0387cf3 100644 --- a/nautilus_core/model/src/data/stubs.rs +++ b/nautilus_core/model/src/data/stubs.rs @@ -287,7 +287,7 @@ pub fn stub_book_order() -> BookOrder { } #[fixture] -pub fn quote_tick_ethusdt_binance() -> QuoteTick { +pub fn quote_ethusdt_binance() -> QuoteTick { QuoteTick { instrument_id: InstrumentId::from("ETHUSDT-PERP.BINANCE"), bid_price: Price::from("10000.0000"), @@ -300,7 +300,7 @@ pub fn quote_tick_ethusdt_binance() -> QuoteTick { } #[fixture] -pub fn stub_trade_tick_ethusdt_buyer() -> TradeTick { +pub fn stub_trade_ethusdt_buyer() -> TradeTick { TradeTick { instrument_id: InstrumentId::from("ETHUSDT-PERP.BINANCE"), price: Price::from("10000.0000"), diff --git a/nautilus_core/model/src/data/trade.rs b/nautilus_core/model/src/data/trade.rs index cd436e23e147..627825bded42 100644 --- a/nautilus_core/model/src/data/trade.rs +++ b/nautilus_core/model/src/data/trade.rs @@ -143,13 +143,13 @@ mod tests { use rstest::rstest; use crate::{ - data::{stubs::stub_trade_tick_ethusdt_buyer, trade::TradeTick}, + data::{stubs::stub_trade_ethusdt_buyer, trade::TradeTick}, enums::AggressorSide, }; #[rstest] - fn test_to_string(stub_trade_tick_ethusdt_buyer: TradeTick) { - let trade = stub_trade_tick_ethusdt_buyer; + fn test_to_string(stub_trade_ethusdt_buyer: TradeTick) { + let trade = stub_trade_ethusdt_buyer; assert_eq!( trade.to_string(), "ETHUSDT-PERP.BINANCE,10000.0000,1.00000000,BUYER,123456789,0" @@ -175,9 +175,9 @@ mod tests { } #[rstest] - fn test_from_pyobject(stub_trade_tick_ethusdt_buyer: TradeTick) { + fn test_from_pyobject(stub_trade_ethusdt_buyer: TradeTick) { pyo3::prepare_freethreaded_python(); - let trade = stub_trade_tick_ethusdt_buyer; + let trade = stub_trade_ethusdt_buyer; Python::with_gil(|py| { let tick_pyobject = trade.into_py(py); @@ -187,16 +187,16 @@ mod tests { } #[rstest] - fn test_json_serialization(stub_trade_tick_ethusdt_buyer: TradeTick) { - let trade = stub_trade_tick_ethusdt_buyer; + fn test_json_serialization(stub_trade_ethusdt_buyer: TradeTick) { + let trade = stub_trade_ethusdt_buyer; let serialized = trade.as_json_bytes().unwrap(); let deserialized = TradeTick::from_json_bytes(serialized.as_ref()).unwrap(); assert_eq!(deserialized, trade); } #[rstest] - fn test_msgpack_serialization(stub_trade_tick_ethusdt_buyer: TradeTick) { - let trade = stub_trade_tick_ethusdt_buyer; + fn test_msgpack_serialization(stub_trade_ethusdt_buyer: TradeTick) { + let trade = stub_trade_ethusdt_buyer; let serialized = trade.as_msgpack_bytes().unwrap(); let deserialized = TradeTick::from_msgpack_bytes(serialized.as_ref()).unwrap(); assert_eq!(deserialized, trade); diff --git a/nautilus_core/model/src/python/data/quote.rs b/nautilus_core/model/src/python/data/quote.rs index 52333e9417b5..9c41f0eefb5f 100644 --- a/nautilus_core/model/src/python/data/quote.rs +++ b/nautilus_core/model/src/python/data/quote.rs @@ -389,12 +389,12 @@ mod tests { use pyo3::{IntoPy, Python}; use rstest::rstest; - use crate::data::{quote::QuoteTick, stubs::quote_tick_ethusdt_binance}; + use crate::data::{quote::QuoteTick, stubs::quote_ethusdt_binance}; #[rstest] - fn test_as_dict(quote_tick_ethusdt_binance: QuoteTick) { + fn test_as_dict(quote_ethusdt_binance: QuoteTick) { pyo3::prepare_freethreaded_python(); - let quote = quote_tick_ethusdt_binance; + let quote = quote_ethusdt_binance; Python::with_gil(|py| { let dict_string = quote.py_as_dict(py).unwrap().to_string(); @@ -404,9 +404,9 @@ mod tests { } #[rstest] - fn test_from_dict(quote_tick_ethusdt_binance: QuoteTick) { + fn test_from_dict(quote_ethusdt_binance: QuoteTick) { pyo3::prepare_freethreaded_python(); - let quote = quote_tick_ethusdt_binance; + let quote = quote_ethusdt_binance; Python::with_gil(|py| { let dict = quote.py_as_dict(py).unwrap(); @@ -416,9 +416,9 @@ mod tests { } #[rstest] - fn test_from_pyobject(quote_tick_ethusdt_binance: QuoteTick) { + fn test_from_pyobject(quote_ethusdt_binance: QuoteTick) { pyo3::prepare_freethreaded_python(); - let quote = quote_tick_ethusdt_binance; + let quote = quote_ethusdt_binance; Python::with_gil(|py| { let tick_pyobject = quote.into_py(py); diff --git a/nautilus_core/model/src/python/data/status.rs b/nautilus_core/model/src/python/data/status.rs index d20de9173f04..88ed8f057740 100644 --- a/nautilus_core/model/src/python/data/status.rs +++ b/nautilus_core/model/src/python/data/status.rs @@ -280,7 +280,7 @@ mod tests { use crate::data::{ quote::QuoteTick, status::InstrumentStatus, - stubs::{quote_tick_ethusdt_binance, stub_instrument_status}, + stubs::{quote_ethusdt_binance, stub_instrument_status}, }; #[rstest] diff --git a/nautilus_core/model/src/python/data/trade.rs b/nautilus_core/model/src/python/data/trade.rs index 79677d62aa31..fd743bff8aa2 100644 --- a/nautilus_core/model/src/python/data/trade.rs +++ b/nautilus_core/model/src/python/data/trade.rs @@ -338,12 +338,12 @@ mod tests { use pyo3::{IntoPy, Python}; use rstest::rstest; - use crate::data::{stubs::stub_trade_tick_ethusdt_buyer, trade::TradeTick}; + use crate::data::{stubs::stub_trade_ethusdt_buyer, trade::TradeTick}; #[rstest] - fn test_as_dict(stub_trade_tick_ethusdt_buyer: TradeTick) { + fn test_as_dict(stub_trade_ethusdt_buyer: TradeTick) { pyo3::prepare_freethreaded_python(); - let trade = stub_trade_tick_ethusdt_buyer; + let trade = stub_trade_ethusdt_buyer; Python::with_gil(|py| { let dict_string = trade.py_as_dict(py).unwrap().to_string(); @@ -353,9 +353,9 @@ mod tests { } #[rstest] - fn test_from_dict(stub_trade_tick_ethusdt_buyer: TradeTick) { + fn test_from_dict(stub_trade_ethusdt_buyer: TradeTick) { pyo3::prepare_freethreaded_python(); - let trade = stub_trade_tick_ethusdt_buyer; + let trade = stub_trade_ethusdt_buyer; Python::with_gil(|py| { let dict = trade.py_as_dict(py).unwrap(); @@ -365,9 +365,9 @@ mod tests { } #[rstest] - fn test_from_pyobject(stub_trade_tick_ethusdt_buyer: TradeTick) { + fn test_from_pyobject(stub_trade_ethusdt_buyer: TradeTick) { pyo3::prepare_freethreaded_python(); - let trade = stub_trade_tick_ethusdt_buyer; + let trade = stub_trade_ethusdt_buyer; Python::with_gil(|py| { let tick_pyobject = trade.into_py(py); From f663dad59aeb869023c87675f6f979a2016b77ec Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 15:35:33 +1100 Subject: [PATCH 117/224] Improve canceled task handling --- nautilus_trader/adapters/betfair/execution.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_trader/adapters/betfair/execution.py b/nautilus_trader/adapters/betfair/execution.py index 53c357fe700b..72622578c37b 100644 --- a/nautilus_trader/adapters/betfair/execution.py +++ b/nautilus_trader/adapters/betfair/execution.py @@ -235,8 +235,8 @@ async def update_account_state(): try: await update_account_state() await asyncio.sleep(self.request_account_state_period) - except Exception: - self._log.error(f"account_state_updates: {traceback.format_exc()}") + except asyncio.CancelledError: + self._log.debug("Canceled task 'account_state_updates'") async def request_account_state(self) -> AccountState: account_details = await self._client.get_account_details() From d565eaca3f109d63566ff89ca7fcb47b92d56614 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 15:50:25 +1100 Subject: [PATCH 118/224] Cleanup Betfair clients --- nautilus_trader/adapters/betfair/data.py | 38 ++++++++++++------- nautilus_trader/adapters/betfair/execution.py | 8 ++-- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/nautilus_trader/adapters/betfair/data.py b/nautilus_trader/adapters/betfair/data.py index 2496443fca18..3353374658e1 100644 --- a/nautilus_trader/adapters/betfair/data.py +++ b/nautilus_trader/adapters/betfair/data.py @@ -76,7 +76,7 @@ def __init__( clock: LiveClock, instrument_provider: BetfairInstrumentProvider, account_currency: Currency, - ): + ) -> None: super().__init__( loop=loop, client_id=ClientId(BETFAIR_VENUE.value), @@ -104,7 +104,7 @@ def __init__( def instrument_provider(self) -> BetfairInstrumentProvider: return self._instrument_provider - async def _connect(self): + async def _connect(self) -> None: self._log.info("Connecting to BetfairHttpClient...") await self._client.connect() self._log.info("BetfairClient login successful", LogColor.GREEN) @@ -137,12 +137,12 @@ async def _connect(self): ) self.subscription_status = SubscriptionStatus.SUBSCRIBED - async def _post_connect_heartbeat(self): + async def _post_connect_heartbeat(self) -> None: for _ in range(3): await self._stream.send(msgspec.json.encode({"op": "heartbeat"})) await asyncio.sleep(5) - async def _disconnect(self): + async def _disconnect(self) -> None: # Close socket self._log.info("Closing streaming socket") await self._stream.disconnect() @@ -151,14 +151,14 @@ async def _disconnect(self): self._log.info("Closing BetfairClient") await self._client.disconnect() - def _reset(self): + def _reset(self) -> None: if self.is_connected: self._log.error("Cannot reset a connected data client") return self._subscribed_instrument_ids = set() - def _dispose(self): + def _dispose(self) -> None: if self.is_connected: self._log.error("Cannot dispose a connected data client") return @@ -204,21 +204,21 @@ async def _subscribe_order_book_deltas( f"Added market_id {instrument.market_id} for {instrument_id.symbol} data", ) - async def delayed_subscribe(self, delay=0): + async def delayed_subscribe(self, delay=0) -> None: self._log.debug(f"Scheduling subscribe for delay={delay}") await asyncio.sleep(delay) self._log.info(f"Sending subscribe for market_ids {self._subscribed_market_ids}") await self._stream.send_subscription_message(market_ids=list(self._subscribed_market_ids)) self._log.info(f"Added market_ids {self._subscribed_market_ids} for data") - async def _subscribe_ticker(self, instrument_id: InstrumentId) -> None: - pass # Subscribed as part of orderbook + async def _subscribe_instrument(self, instrument_id: InstrumentId) -> None: + self._log.info("Skipping subscribe_instrument, Betfair subscribes as part of orderbook") - async def _subscribe_trade_ticks(self, instrument_id: InstrumentId) -> None: - pass # Subscribed as part of orderbook + async def _subscribe_quote_ticks(self, instrument_id: InstrumentId) -> None: + self._log.info("Skipping subscribe_quote_ticks, Betfair subscribes as part of orderbook") - async def _subscribe_instrument(self, instrument_id: InstrumentId) -> None: - self._log.debug("Skipping subscribe_instrument, betfair subscribes as part of orderbook") + async def _subscribe_trade_ticks(self, instrument_id: InstrumentId) -> None: + self._log.info("Skipping subscribe_trade_ticks, Betfair subscribes as part of orderbook") async def _subscribe_instruments(self) -> None: for instrument in self._instrument_provider.list_all(): @@ -241,7 +241,17 @@ async def _unsubscribe_order_book_deltas(self, instrument_id: InstrumentId) -> N # subscription message - when we have a use case self._log.warning("Betfair does not support unsubscribing from instruments") + async def _unsubscribe_instrument(self, instrument_id: InstrumentId) -> None: + self._log.info("Skipping unsubscribe_instrument, not applicable for Betfair") + + async def _unsubscribe_quote_ticks(self, instrument_id: InstrumentId) -> None: + self._log.info("Skipping unsubscribe_quote_ticks, not applicable for Betfair") + + async def _unsubscribe_trade_ticks(self, instrument_id: InstrumentId) -> None: + self._log.info("Skipping unsubscribe_trade_ticks, not applicable for Betfair") + # -- STREAMS ---------------------------------------------------------------------------------- + def on_market_update(self, raw: bytes) -> None: """ Handle an update from the data stream socket. @@ -285,6 +295,6 @@ def _handle_status_message(self, update: Status) -> None: else: self._log.info("Attempting reconnect") if self._stream.is_connected: - self._log.info("stream connected, disconnecting.") + self._log.info("Stream connected, disconnecting") self.create_task(self._stream.disconnect()) self.create_task(self._connect()) diff --git a/nautilus_trader/adapters/betfair/execution.py b/nautilus_trader/adapters/betfair/execution.py index 72622578c37b..231a340d01d3 100644 --- a/nautilus_trader/adapters/betfair/execution.py +++ b/nautilus_trader/adapters/betfair/execution.py @@ -168,7 +168,7 @@ def instrument_provider(self) -> BetfairInstrumentProvider: async def _connect(self) -> None: self._log.info("Connecting to BetfairHttpClient...") await self._client.connect() - self._log.info("BetfairHttpClient login successful.", LogColor.GREEN) + self._log.info("BetfairHttpClient login successful", LogColor.GREEN) # Connections and start-up checks self._log.debug( @@ -202,7 +202,7 @@ async def _disconnect(self) -> None: async def on_api_exception(self, error: BetfairError) -> None: if "INVALID_SESSION_INFORMATION" in error.args[0] or "NO_SESSION" in error.args[0]: if self._reconnect_in_progress: - self._log.info("Reconnect already in progress.") + self._log.info("Reconnect already in progress") return # Avoid multiple reconnection attempts when multiple INVALID_SESSION_INFORMATION errors @@ -212,7 +212,7 @@ async def on_api_exception(self, error: BetfairError) -> None: try: # Session is invalid, need to reconnect - self._log.warning("Invalid session error, reconnecting..") + self._log.warning("Invalid session error, reconnecting...") await self._disconnect() await self._connect() self._log.info("Reconnected.") @@ -390,7 +390,7 @@ async def generate_position_status_reports( start: pd.Timestamp | None = None, end: pd.Timestamp | None = None, ) -> list[PositionStatusReport]: - self._log.warning("Cannot generate `PositionStatusReports`: not yet implemented") + self._log.info("Skipping generate_position_status_reports, not implemented for Betfair") return [] From 5fa78f72d6279b9f468a6a2f30e211e4751a63ce Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 16:05:26 +1100 Subject: [PATCH 119/224] Update dependencies --- nautilus_core/Cargo.lock | 36 ++-- poetry.lock | 423 ++++++++++++++++++++------------------- pyproject.toml | 2 +- 3 files changed, 233 insertions(+), 228 deletions(-) diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index d6adf73942d1..f36cce6c7bcb 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -787,9 +787,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.28" +version = "1.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" dependencies = [ "jobserver", "libc", @@ -2400,9 +2400,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.71" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb94a0ffd3f3ee755c20f7d8752f45cac88605a4dcf808abcff72873296ec7b" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -5616,9 +5616,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.94" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef073ced962d62984fb38a36e5fdc1a2b23c9e0e1fa0689bb97afa4202ef6887" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -5627,9 +5627,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.94" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4bfab14ef75323f4eb75fa52ee0a3fb59611977fd3240da19b2cf36ff85030e" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", @@ -5642,9 +5642,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65471f79c1022ffa5291d33520cbbb53b7687b01c2f8e83b57d102eed7ed479d" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -5654,9 +5654,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.94" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7bec9830f60924d9ceb3ef99d55c155be8afa76954edffbb5936ff4509474e7" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5664,9 +5664,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.94" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c74f6e152a76a2ad448e223b0fc0b6b5747649c3d769cc6bf45737bf97d0ed6" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", @@ -5677,9 +5677,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.94" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a42f6c679374623f295a8623adfe63d9284091245c3504bde47c17a3ce2777d9" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-streams" @@ -5696,9 +5696,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.71" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44188d185b5bdcae1052d08bcbcf9091a5524038d4572cc4f4f2bb9d5554ddd9" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/poetry.lock b/poetry.lock index 5bdd619b25df..9ecf1dc83937 100644 --- a/poetry.lock +++ b/poetry.lock @@ -13,102 +13,102 @@ files = [ [[package]] name = "aiohttp" -version = "3.10.9" +version = "3.10.10" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8b3fb28a9ac8f2558760d8e637dbf27aef1e8b7f1d221e8669a1074d1a266bb2"}, - {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91aa966858593f64c8a65cdefa3d6dc8fe3c2768b159da84c1ddbbb2c01ab4ef"}, - {file = "aiohttp-3.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63649309da83277f06a15bbdc2a54fbe75efb92caa2c25bb57ca37762789c746"}, - {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3e7fabedb3fe06933f47f1538df7b3a8d78e13d7167195f51ca47ee12690373"}, - {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c070430fda1a550a1c3a4c2d7281d3b8cfc0c6715f616e40e3332201a253067"}, - {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:51d0a4901b27272ae54e42067bc4b9a90e619a690b4dc43ea5950eb3070afc32"}, - {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fec5fac7aea6c060f317f07494961236434928e6f4374e170ef50b3001e14581"}, - {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:172ad884bb61ad31ed7beed8be776eb17e7fb423f1c1be836d5cb357a096bf12"}, - {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d646fdd74c25bbdd4a055414f0fe32896c400f38ffbdfc78c68e62812a9e0257"}, - {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e86260b76786c28acf0b5fe31c8dca4c2add95098c709b11e8c35b424ebd4f5b"}, - {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d7cafc11d70fdd8801abfc2ff276744ae4cb39d8060b6b542c7e44e5f2cfc2"}, - {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fc262c3df78c8ff6020c782d9ce02e4bcffe4900ad71c0ecdad59943cba54442"}, - {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:482c85cf3d429844396d939b22bc2a03849cb9ad33344689ad1c85697bcba33a"}, - {file = "aiohttp-3.10.9-cp310-cp310-win32.whl", hash = "sha256:aeebd3061f6f1747c011e1d0b0b5f04f9f54ad1a2ca183e687e7277bef2e0da2"}, - {file = "aiohttp-3.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:fa430b871220dc62572cef9c69b41e0d70fcb9d486a4a207a5de4c1f25d82593"}, - {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:16e6a51d8bc96b77f04a6764b4ad03eeef43baa32014fce71e882bd71302c7e4"}, - {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8bd9125dd0cc8ebd84bff2be64b10fdba7dc6fd7be431b5eaf67723557de3a31"}, - {file = "aiohttp-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dcf354661f54e6a49193d0b5653a1b011ba856e0b7a76bda2c33e4c6892f34ea"}, - {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42775de0ca04f90c10c5c46291535ec08e9bcc4756f1b48f02a0657febe89b10"}, - {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d1e4185c5d7187684d41ebb50c9aeaaaa06ca1875f4c57593071b0409d2444"}, - {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2695c61cf53a5d4345a43d689f37fc0f6d3a2dc520660aec27ec0f06288d1f9"}, - {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a3f063b41cc06e8d0b3fcbbfc9c05b7420f41287e0cd4f75ce0a1f3d80729e6"}, - {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d37f4718002863b82c6f391c8efd4d3a817da37030a29e2682a94d2716209de"}, - {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2746d8994ebca1bdc55a1e998feff4e94222da709623bb18f6e5cfec8ec01baf"}, - {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6f3c6648aa123bcd73d6f26607d59967b607b0da8ffcc27d418a4b59f4c98c7c"}, - {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:558b3d223fd631ad134d89adea876e7fdb4c93c849ef195049c063ada82b7d08"}, - {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4e6cb75f8ddd9c2132d00bc03c9716add57f4beff1263463724f6398b813e7eb"}, - {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:608cecd8d58d285bfd52dbca5b6251ca8d6ea567022c8a0eaae03c2589cd9af9"}, - {file = "aiohttp-3.10.9-cp311-cp311-win32.whl", hash = "sha256:36d4fba838be5f083f5490ddd281813b44d69685db910907636bc5dca6322316"}, - {file = "aiohttp-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:8be1a65487bdfc285bd5e9baf3208c2132ca92a9b4020e9f27df1b16fab998a9"}, - {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4fd16b30567c5b8e167923be6e027eeae0f20cf2b8a26b98a25115f28ad48ee0"}, - {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:40ff5b7660f903dc587ed36ef08a88d46840182d9d4b5694e7607877ced698a1"}, - {file = "aiohttp-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4edc3fd701e2b9a0d605a7b23d3de4ad23137d23fc0dbab726aa71d92f11aaaf"}, - {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e525b69ee8a92c146ae5b4da9ecd15e518df4d40003b01b454ad694a27f498b5"}, - {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5002a02c17fcfd796d20bac719981d2fca9c006aac0797eb8f430a58e9d12431"}, - {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4ceeae2fb8cabdd1b71c82bfdd39662473d3433ec95b962200e9e752fb70d0"}, - {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6e395c3d1f773cf0651cd3559e25182eb0c03a2777b53b4575d8adc1149c6e9"}, - {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbdb8def5268f3f9cd753a265756f49228a20ed14a480d151df727808b4531dd"}, - {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f82ace0ec57c94aaf5b0e118d4366cff5889097412c75aa14b4fd5fc0c44ee3e"}, - {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6ebdc3b3714afe1b134b3bbeb5f745eed3ecbcff92ab25d80e4ef299e83a5465"}, - {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f9ca09414003c0e96a735daa1f071f7d7ed06962ef4fa29ceb6c80d06696d900"}, - {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1298b854fd31d0567cbb916091be9d3278168064fca88e70b8468875ef9ff7e7"}, - {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:60ad5b8a7452c0f5645c73d4dad7490afd6119d453d302cd5b72b678a85d6044"}, - {file = "aiohttp-3.10.9-cp312-cp312-win32.whl", hash = "sha256:1a0ee6c0d590c917f1b9629371fce5f3d3f22c317aa96fbdcce3260754d7ea21"}, - {file = "aiohttp-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:c46131c6112b534b178d4e002abe450a0a29840b61413ac25243f1291613806a"}, - {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2bd9f3eac515c16c4360a6a00c38119333901b8590fe93c3257a9b536026594d"}, - {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8cc0d13b4e3b1362d424ce3f4e8c79e1f7247a00d792823ffd640878abf28e56"}, - {file = "aiohttp-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba1a599255ad6a41022e261e31bc2f6f9355a419575b391f9655c4d9e5df5ff5"}, - {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:776e9f3c9b377fcf097c4a04b241b15691e6662d850168642ff976780609303c"}, - {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8debb45545ad95b58cc16c3c1cc19ad82cffcb106db12b437885dbee265f0ab5"}, - {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2555e4949c8d8782f18ef20e9d39730d2656e218a6f1a21a4c4c0b56546a02e"}, - {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c54dc329cd44f7f7883a9f4baaefe686e8b9662e2c6c184ea15cceee587d8d69"}, - {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e709d6ac598c5416f879bb1bae3fd751366120ac3fa235a01de763537385d036"}, - {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:17c272cfe7b07a5bb0c6ad3f234e0c336fb53f3bf17840f66bd77b5815ab3d16"}, - {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0c21c82df33b264216abffff9f8370f303dab65d8eee3767efbbd2734363f677"}, - {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9331dd34145ff105177855017920dde140b447049cd62bb589de320fd6ddd582"}, - {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ac3196952c673822ebed8871cf8802e17254fff2a2ed4835d9c045d9b88c5ec7"}, - {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2c33fa6e10bb7ed262e3ff03cc69d52869514f16558db0626a7c5c61dde3c29f"}, - {file = "aiohttp-3.10.9-cp313-cp313-win32.whl", hash = "sha256:a14e4b672c257a6b94fe934ee62666bacbc8e45b7876f9dd9502d0f0fe69db16"}, - {file = "aiohttp-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:a35ed3d03910785f7d9d6f5381f0c24002b2b888b298e6f941b2fc94c5055fcd"}, - {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f392ef50e22c31fa49b5a46af7f983fa3f118f3eccb8522063bee8bfa6755f8"}, - {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d1f5c9169e26db6a61276008582d945405b8316aae2bb198220466e68114a0f5"}, - {file = "aiohttp-3.10.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8d9d10d10ec27c0d46ddaecc3c5598c4db9ce4e6398ca872cdde0525765caa2f"}, - {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d97273a52d7f89a75b11ec386f786d3da7723d7efae3034b4dda79f6f093edc1"}, - {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d271f770b52e32236d945911b2082f9318e90ff835d45224fa9e28374303f729"}, - {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7003f33f5f7da1eb02f0446b0f8d2ccf57d253ca6c2e7a5732d25889da82b517"}, - {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6e00c8a92e7663ed2be6fcc08a2997ff06ce73c8080cd0df10cc0321a3168d7"}, - {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a61df62966ce6507aafab24e124e0c3a1cfbe23c59732987fc0fd0d71daa0b88"}, - {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:60555211a006d26e1a389222e3fab8cd379f28e0fbf7472ee55b16c6c529e3a6"}, - {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d15a29424e96fad56dc2f3abed10a89c50c099f97d2416520c7a543e8fddf066"}, - {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:a19caae0d670771ea7854ca30df76f676eb47e0fd9b2ee4392d44708f272122d"}, - {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:99f9678bf0e2b1b695e8028fedac24ab6770937932eda695815d5a6618c37e04"}, - {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2914caa46054f3b5ff910468d686742ff8cff54b8a67319d75f5d5945fd0a13d"}, - {file = "aiohttp-3.10.9-cp38-cp38-win32.whl", hash = "sha256:0bc059ecbce835630e635879f5f480a742e130d9821fbe3d2f76610a6698ee25"}, - {file = "aiohttp-3.10.9-cp38-cp38-win_amd64.whl", hash = "sha256:e883b61b75ca6efc2541fcd52a5c8ccfe288b24d97e20ac08fdf343b8ac672ea"}, - {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fcd546782d03181b0b1d20b43d612429a90a68779659ba8045114b867971ab71"}, - {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:85711eec2d875cd88c7eb40e734c4ca6d9ae477d6f26bd2b5bb4f7f60e41b156"}, - {file = "aiohttp-3.10.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:02d1d6610588bcd743fae827bd6f2e47e0d09b346f230824b4c6fb85c6065f9c"}, - {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3668d0c2a4d23fb136a753eba42caa2c0abbd3d9c5c87ee150a716a16c6deec1"}, - {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7c071235a47d407b0e93aa6262b49422dbe48d7d8566e1158fecc91043dd948"}, - {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac74e794e3aee92ae8f571bfeaa103a141e409863a100ab63a253b1c53b707eb"}, - {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bbf94d4a0447705b7775417ca8bb8086cc5482023a6e17cdc8f96d0b1b5aba6"}, - {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb0b2d5d51f96b6cc19e6ab46a7b684be23240426ae951dcdac9639ab111b45e"}, - {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e83dfefb4f7d285c2d6a07a22268344a97d61579b3e0dce482a5be0251d672ab"}, - {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f0a44bb40b6aaa4fb9a5c1ee07880570ecda2065433a96ccff409c9c20c1624a"}, - {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c2b627d3c8982691b06d89d31093cee158c30629fdfebe705a91814d49b554f8"}, - {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:03690541e4cc866eef79626cfa1ef4dd729c5c1408600c8cb9e12e1137eed6ab"}, - {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad3675c126f2a95bde637d162f8231cff6bc0bc9fbe31bd78075f9ff7921e322"}, - {file = "aiohttp-3.10.9-cp39-cp39-win32.whl", hash = "sha256:1321658f12b6caffafdc35cfba6c882cb014af86bef4e78c125e7e794dfb927b"}, - {file = "aiohttp-3.10.9-cp39-cp39-win_amd64.whl", hash = "sha256:9fdf5c839bf95fc67be5794c780419edb0dbef776edcfc6c2e5e2ffd5ee755fa"}, - {file = "aiohttp-3.10.9.tar.gz", hash = "sha256:143b0026a9dab07a05ad2dd9e46aa859bffdd6348ddc5967b42161168c24f857"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68"}, + {file = "aiohttp-3.10.10-cp310-cp310-win32.whl", hash = "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257"}, + {file = "aiohttp-3.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a"}, + {file = "aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94"}, + {file = "aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205"}, + {file = "aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628"}, + {file = "aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b"}, + {file = "aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8"}, + {file = "aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b"}, + {file = "aiohttp-3.10.10-cp38-cp38-win32.whl", hash = "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c"}, + {file = "aiohttp-3.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91"}, + {file = "aiohttp-3.10.10-cp39-cp39-win32.whl", hash = "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983"}, + {file = "aiohttp-3.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23"}, + {file = "aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a"}, ] [package.dependencies] @@ -2654,19 +2654,18 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] [[package]] name = "py-clob-client" -version = "0.17.5" +version = "0.18.0" description = "Python client for the Polymarket CLOB" optional = true python-versions = ">=3.9.10" files = [ - {file = "py_clob_client-0.17.5-py3-none-any.whl", hash = "sha256:9c23e75011e9b22aa13ac9d641bdbdb650db188dc2fd179f84db108c9514554f"}, - {file = "py_clob_client-0.17.5.tar.gz", hash = "sha256:bd0d8974d69a8db2dd50b63d40d5f2ff9aad3c2fe4c090d07951e845df782d8a"}, + {file = "py_clob_client-0.18.0.tar.gz", hash = "sha256:a9b982cce2b89341345025a3b966344e47b810dc2b93ff834b478b076a5668ed"}, ] [package.dependencies] eth-account = ">=0.13.0" eth-utils = ">=4.1.1" -poly-eip712-structs = ">=0.0.1" +poly_eip712_structs = ">=0.0.1" py-order-utils = ">=0.3.2" python-dotenv = "*" requests = "*" @@ -3205,29 +3204,29 @@ files = [ [[package]] name = "pywin32" -version = "307" +version = "308" description = "Python for Window Extensions" optional = true python-versions = "*" files = [ - {file = "pywin32-307-cp310-cp310-win32.whl", hash = "sha256:f8f25d893c1e1ce2d685ef6d0a481e87c6f510d0f3f117932781f412e0eba31b"}, - {file = "pywin32-307-cp310-cp310-win_amd64.whl", hash = "sha256:36e650c5e5e6b29b5d317385b02d20803ddbac5d1031e1f88d20d76676dd103d"}, - {file = "pywin32-307-cp310-cp310-win_arm64.whl", hash = "sha256:0c12d61e0274e0c62acee79e3e503c312426ddd0e8d4899c626cddc1cafe0ff4"}, - {file = "pywin32-307-cp311-cp311-win32.whl", hash = "sha256:fec5d27cc893178fab299de911b8e4d12c5954e1baf83e8a664311e56a272b75"}, - {file = "pywin32-307-cp311-cp311-win_amd64.whl", hash = "sha256:987a86971753ed7fdd52a7fb5747aba955b2c7fbbc3d8b76ec850358c1cc28c3"}, - {file = "pywin32-307-cp311-cp311-win_arm64.whl", hash = "sha256:fd436897c186a2e693cd0437386ed79f989f4d13d6f353f8787ecbb0ae719398"}, - {file = "pywin32-307-cp312-cp312-win32.whl", hash = "sha256:07649ec6b01712f36debf39fc94f3d696a46579e852f60157a729ac039df0815"}, - {file = "pywin32-307-cp312-cp312-win_amd64.whl", hash = "sha256:00d047992bb5dcf79f8b9b7c81f72e0130f9fe4b22df613f755ab1cc021d8347"}, - {file = "pywin32-307-cp312-cp312-win_arm64.whl", hash = "sha256:b53658acbfc6a8241d72cc09e9d1d666be4e6c99376bc59e26cdb6223c4554d2"}, - {file = "pywin32-307-cp313-cp313-win32.whl", hash = "sha256:ea4d56e48dc1ab2aa0a5e3c0741ad6e926529510516db7a3b6981a1ae74405e5"}, - {file = "pywin32-307-cp313-cp313-win_amd64.whl", hash = "sha256:576d09813eaf4c8168d0bfd66fb7cb3b15a61041cf41598c2db4a4583bf832d2"}, - {file = "pywin32-307-cp313-cp313-win_arm64.whl", hash = "sha256:b30c9bdbffda6a260beb2919f918daced23d32c79109412c2085cbc513338a0a"}, - {file = "pywin32-307-cp37-cp37m-win32.whl", hash = "sha256:5101472f5180c647d4525a0ed289ec723a26231550dbfd369ec19d5faf60e511"}, - {file = "pywin32-307-cp37-cp37m-win_amd64.whl", hash = "sha256:05de55a7c110478dc4b202230e98af5e0720855360d2b31a44bb4e296d795fba"}, - {file = "pywin32-307-cp38-cp38-win32.whl", hash = "sha256:13d059fb7f10792542082f5731d5d3d9645320fc38814759313e5ee97c3fac01"}, - {file = "pywin32-307-cp38-cp38-win_amd64.whl", hash = "sha256:7e0b2f93769d450a98ac7a31a087e07b126b6d571e8b4386a5762eb85325270b"}, - {file = "pywin32-307-cp39-cp39-win32.whl", hash = "sha256:55ee87f2f8c294e72ad9d4261ca423022310a6e79fb314a8ca76ab3f493854c6"}, - {file = "pywin32-307-cp39-cp39-win_amd64.whl", hash = "sha256:e9d5202922e74985b037c9ef46778335c102b74b95cec70f629453dbe7235d87"}, + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, ] [[package]] @@ -3897,103 +3896,109 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "yarl" -version = "1.14.0" +version = "1.15.1" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ - {file = "yarl-1.14.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1bfc25aa6a7c99cf86564210f79a0b7d4484159c67e01232b116e445b3036547"}, - {file = "yarl-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0cf21f46a15d445417de8fc89f2568852cf57fe8ca1ab3d19ddb24d45c0383ae"}, - {file = "yarl-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1dda53508df0de87b6e6b0a52d6718ff6c62a5aca8f5552748404963df639269"}, - {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:587c3cc59bc148a9b1c07a019346eda2549bc9f468acd2f9824d185749acf0a6"}, - {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3007a5b75cb50140708420fe688c393e71139324df599434633019314ceb8b59"}, - {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06ff23462398333c78b6f4f8d3d70410d657a471c2c5bbe6086133be43fc8f1a"}, - {file = "yarl-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689a99a42ee4583fcb0d3a67a0204664aa1539684aed72bdafcbd505197a91c4"}, - {file = "yarl-1.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0547ab1e9345dc468cac8368d88ea4c5bd473ebc1d8d755347d7401982b5dd8"}, - {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:742aef0a99844faaac200564ea6f5e08facb285d37ea18bd1a5acf2771f3255a"}, - {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:176110bff341b6730f64a1eb3a7070e12b373cf1c910a9337e7c3240497db76f"}, - {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:46a9772a1efa93f9cd170ad33101c1817c77e0e9914d4fe33e2da299d7cf0f9b"}, - {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ee2c68e4f2dd1b1c15b849ba1c96fac105fca6ffdb7c1e8be51da6fabbdeafb9"}, - {file = "yarl-1.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:047b258e00b99091b6f90355521f026238c63bd76dcf996d93527bb13320eefd"}, - {file = "yarl-1.14.0-cp310-cp310-win32.whl", hash = "sha256:0aa92e3e30a04f9462a25077db689c4ac5ea9ab6cc68a2e563881b987d42f16d"}, - {file = "yarl-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:d9baec588f015d0ee564057aa7574313c53a530662ffad930b7886becc85abdf"}, - {file = "yarl-1.14.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:07f9eaf57719d6721ab15805d85f4b01a5b509a0868d7320134371bcb652152d"}, - {file = "yarl-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c14b504a74e58e2deb0378b3eca10f3d076635c100f45b113c18c770b4a47a50"}, - {file = "yarl-1.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16a682a127930f3fc4e42583becca6049e1d7214bcad23520c590edd741d2114"}, - {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73bedd2be05f48af19f0f2e9e1353921ce0c83f4a1c9e8556ecdcf1f1eae4892"}, - {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3ab950f8814f3b7b5e3eebc117986f817ec933676f68f0a6c5b2137dd7c9c69"}, - {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b693c63e7e64b524f54aa4888403c680342d1ad0d97be1707c531584d6aeeb4f"}, - {file = "yarl-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85cb3e40eaa98489f1e2e8b29f5ad02ee1ee40d6ce6b88d50cf0f205de1d9d2c"}, - {file = "yarl-1.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f24f08b6c9b9818fd80612c97857d28f9779f0d1211653ece9844fc7b414df2"}, - {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:29a84a46ec3ebae7a1c024c055612b11e9363a8a23238b3e905552d77a2bc51b"}, - {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5cd5dad8366e0168e0fd23d10705a603790484a6dbb9eb272b33673b8f2cce72"}, - {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a152751af7ef7b5d5fa6d215756e508dd05eb07d0cf2ba51f3e740076aa74373"}, - {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:3d569f877ed9a708e4c71a2d13d2940cb0791da309f70bd970ac1a5c088a0a92"}, - {file = "yarl-1.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6a615cad11ec3428020fb3c5a88d85ce1b5c69fd66e9fcb91a7daa5e855325dd"}, - {file = "yarl-1.14.0-cp311-cp311-win32.whl", hash = "sha256:bab03192091681d54e8225c53f270b0517637915d9297028409a2a5114ff4634"}, - {file = "yarl-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:985623575e5c4ea763056ffe0e2d63836f771a8c294b3de06d09480538316b13"}, - {file = "yarl-1.14.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fc2c80bc87fba076e6cbb926216c27fba274dae7100a7b9a0983b53132dd99f2"}, - {file = "yarl-1.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:55c144d363ad4626ca744556c049c94e2b95096041ac87098bb363dcc8635e8d"}, - {file = "yarl-1.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b03384eed107dbeb5f625a99dc3a7de8be04fc8480c9ad42fccbc73434170b20"}, - {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f72a0d746d38cb299b79ce3d4d60ba0892c84bbc905d0d49c13df5bace1b65f8"}, - {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8648180b34faaea4aa5b5ca7e871d9eb1277033fa439693855cf0ea9195f85f1"}, - {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9557c9322aaa33174d285b0c1961fb32499d65ad1866155b7845edc876c3c835"}, - {file = "yarl-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f50eb3837012a937a2b649ec872b66ba9541ad9d6f103ddcafb8231cfcafd22"}, - {file = "yarl-1.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8892fa575ac9b1b25fae7b221bc4792a273877b9b56a99ee2d8d03eeb3dbb1d2"}, - {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6a2c5c5bb2556dfbfffffc2bcfb9c235fd2b566d5006dfb2a37afc7e3278a07"}, - {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ab3abc0b78a5dfaa4795a6afbe7b282b6aa88d81cf8c1bb5e394993d7cae3457"}, - {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:47eede5d11d669ab3759b63afb70d28d5328c14744b8edba3323e27dc52d298d"}, - {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fe4d2536c827f508348d7b40c08767e8c7071614250927233bf0c92170451c0a"}, - {file = "yarl-1.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0fd7b941dd1b00b5f0acb97455fea2c4b7aac2dd31ea43fb9d155e9bc7b78664"}, - {file = "yarl-1.14.0-cp312-cp312-win32.whl", hash = "sha256:99ff3744f5fe48288be6bc402533b38e89749623a43208e1d57091fc96b783b9"}, - {file = "yarl-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:1ca3894e9e9f72da93544f64988d9c052254a338a9f855165f37f51edb6591de"}, - {file = "yarl-1.14.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5d02d700705d67e09e1f57681f758f0b9d4412eeb70b2eb8d96ca6200b486db3"}, - {file = "yarl-1.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:30600ba5db60f7c0820ef38a2568bb7379e1418ecc947a0f76fd8b2ff4257a97"}, - {file = "yarl-1.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e85d86527baebb41a214cc3b45c17177177d900a2ad5783dbe6f291642d4906f"}, - {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37001e5d4621cef710c8dc1429ca04e189e572f128ab12312eab4e04cf007132"}, - {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4f4547944d4f5cfcdc03f3f097d6f05bbbc915eaaf80a2ee120d0e756de377d"}, - {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75ff4c819757f9bdb35de049a509814d6ce851fe26f06eb95a392a5640052482"}, - {file = "yarl-1.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68ac1a09392ed6e3fd14be880d39b951d7b981fd135416db7d18a6208c536561"}, - {file = "yarl-1.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96952f642ac69075e44c7d0284528938fdff39422a1d90d3e45ce40b72e5e2d9"}, - {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a56fbe3d7f3bce1d060ea18d2413a2ca9ca814eea7cedc4d247b5f338d54844e"}, - {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7e2637d75e92763d1322cb5041573279ec43a80c0f7fbbd2d64f5aee98447b17"}, - {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9abe80ae2c9d37c17599557b712e6515f4100a80efb2cda15f5f070306477cd2"}, - {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:217a782020b875538eebf3948fac3a7f9bbbd0fd9bf8538f7c2ad7489e80f4e8"}, - {file = "yarl-1.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9cfef3f14f75bf6aba73a76caf61f9d00865912a04a4393c468a7ce0981b519"}, - {file = "yarl-1.14.0-cp313-cp313-win32.whl", hash = "sha256:d8361c7d04e6a264481f0b802e395f647cd3f8bbe27acfa7c12049efea675bd1"}, - {file = "yarl-1.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:bc24f968b82455f336b79bf37dbb243b7d76cd40897489888d663d4e028f5069"}, - {file = "yarl-1.14.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:91d875f75fabf76b3018c5f196bf3d308ed2b49ddcb46c1576d6b075754a1393"}, - {file = "yarl-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4009def9be3a7e5175db20aa2d7307ecd00bbf50f7f0f989300710eee1d0b0b9"}, - {file = "yarl-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:582cedde49603f139be572252a318b30dc41039bc0b8165f070f279e5d12187f"}, - {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbd9ff43a04f8ffe8a959a944c2dca10d22f5f99fc6a459f49c3ebfb409309d9"}, - {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9f805e37ed16cc212fdc538a608422d7517e7faf539bedea4fe69425bc55d76"}, - {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:95e16e9eaa2d7f5d87421b8fe694dd71606aa61d74b824c8d17fc85cc51983d1"}, - {file = "yarl-1.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:816d24f584edefcc5ca63428f0b38fee00b39fe64e3c5e558f895a18983efe96"}, - {file = "yarl-1.14.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd2660c01367eb3ef081b8fa0a5da7fe767f9427aa82023a961a5f28f0d4af6c"}, - {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:94b2bb9bcfd5be9d27004ea4398fb640373dd0c1a9e219084f42c08f77a720ab"}, - {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c2089a9afef887664115f7fa6d3c0edd6454adaca5488dba836ca91f60401075"}, - {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:2192f718db4a8509f63dd6d950f143279211fa7e6a2c612edc17d85bf043d36e"}, - {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:8385ab36bf812e9d37cf7613999a87715f27ef67a53f0687d28c44b819df7cb0"}, - {file = "yarl-1.14.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b4c1ecba93e7826dc71ddba75fb7740cdb52e7bd0be9f03136b83f54e6a1f511"}, - {file = "yarl-1.14.0-cp38-cp38-win32.whl", hash = "sha256:e749af6c912a7bb441d105c50c1a3da720474e8acb91c89350080dd600228f0e"}, - {file = "yarl-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:147e36331f6f63e08a14640acf12369e041e0751bb70d9362df68c2d9dcf0c87"}, - {file = "yarl-1.14.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a9f917966d27f7ce30039fe8d900f913c5304134096554fd9bea0774bcda6d1"}, - {file = "yarl-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a2f8fb7f944bcdfecd4e8d855f84c703804a594da5123dd206f75036e536d4d"}, - {file = "yarl-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f4e475f29a9122f908d0f1f706e1f2fc3656536ffd21014ff8a6f2e1b14d1d8"}, - {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8089d4634d8fa2b1806ce44fefa4979b1ab2c12c0bc7ef3dfa45c8a374811348"}, - {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b16f6c75cffc2dc0616ea295abb0e1967601bd1fb1e0af6a1de1c6c887f3439"}, - {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498b3c55087b9d762636bca9b45f60d37e51d24341786dc01b81253f9552a607"}, - {file = "yarl-1.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3f8bfc1db82589ef965ed234b87de30d140db8b6dc50ada9e33951ccd8ec07a"}, - {file = "yarl-1.14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:625f207b1799e95e7c823f42f473c1e9dbfb6192bd56bba8695656d92be4535f"}, - {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:781e2495e408a81e4eaeedeb41ba32b63b1980dddf8b60dbbeff6036bcd35049"}, - {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:659603d26d40dd4463200df9bfbc339fbfaed3fe32e5c432fe1dc2b5d4aa94b4"}, - {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4e0d45ebf975634468682c8bec021618b3ad52c37619e5c938f8f831fa1ac5c0"}, - {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a2e4725a08cb2b4794db09e350c86dee18202bb8286527210e13a1514dc9a59a"}, - {file = "yarl-1.14.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:19268b4fec1d7760134f2de46ef2608c2920134fb1fa61e451f679e41356dc55"}, - {file = "yarl-1.14.0-cp39-cp39-win32.whl", hash = "sha256:337912bcdcf193ade64b9aae5a4017a0a1950caf8ca140362e361543c6773f21"}, - {file = "yarl-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:b6d0147574ce2e7b812c989e50fa72bbc5338045411a836bd066ce5fc8ac0bce"}, - {file = "yarl-1.14.0-py3-none-any.whl", hash = "sha256:c8ed4034f0765f8861620c1f2f2364d2e58520ea288497084dae880424fc0d9f"}, - {file = "yarl-1.14.0.tar.gz", hash = "sha256:88c7d9d58aab0724b979ab5617330acb1c7030b79379c8138c1c8c94e121d1b3"}, + {file = "yarl-1.15.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7d94d8a3927516c10be9958caa72a4148d9c99fc4de3442fa00873870d58d430"}, + {file = "yarl-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fa0c603f007bf3f54bcd7f011f46134995a129a8f0c8e70f0ad8330228ff02d7"}, + {file = "yarl-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:069de3a78672043e84b37078dbc250c5fff1b16ee1b584de5d684d402cc51703"}, + {file = "yarl-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70b34ba1be6d0726efdc0da9c477e5363132d2ac97d0951926b6046a7c24c70e"}, + {file = "yarl-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31397f4ea5700dfcb1b3ce6fdb24407ea874494fd546926f13a7449999180b67"}, + {file = "yarl-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef6b02ebc4b05c9d5575ae6120af173421f1bc653452967c8ae47f6e820d2f75"}, + {file = "yarl-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd735297b9e9afba34bf05a3580e80e4145031d319723777e58f169d7ef553bb"}, + {file = "yarl-1.15.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:566669cfcf4f89f9e8dafc06a81472122cd2b8c00cca24a2c662cb5c7fbe9edf"}, + {file = "yarl-1.15.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6e75b66019709dce95a4a7b47fe3b072f1d7eb8bd0c323e5e62332c84a05aa50"}, + {file = "yarl-1.15.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cda340ed6afd475d4e58d8f34d3f08a4dda956cde86930f51827972ed4e98f3d"}, + {file = "yarl-1.15.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e5c0b30bdc6668d3a1c9ecebae4dc22fd90b02c7ea68f7907db315fd81853f06"}, + {file = "yarl-1.15.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:699ce4edbc471bf39ffdb2060c643f1750a7ccb4b7a34a45dccb389c0ec4996b"}, + {file = "yarl-1.15.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ab5140fd448ce090c73b651bedbbf26de42317466f70210648480e2d63fedf04"}, + {file = "yarl-1.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0c4a3d28a0888bdc8529824e73afa8e5362c79ef2a68bec53fd040cb2ad84e39"}, + {file = "yarl-1.15.1-cp310-cp310-win32.whl", hash = "sha256:dab310e5fa1ec359bf105d03f2e1227ade8952b78961ccd1b17f9f9acb3f49ae"}, + {file = "yarl-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bc9f6a7b0ede16fd2ed6bbdf89e78377b1f00f0e48806c5356c4d3174ae5906"}, + {file = "yarl-1.15.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dfeba6be776409230aebf12bd01539097459886c925ae20fac2c3b736ba0284a"}, + {file = "yarl-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2aa01bb3f91a64aa1d42db9b704674f6ed7c19d2a296f1e3bd25ade9e97dbeb9"}, + {file = "yarl-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ecf1511b7db6a09681765c70952503418468deff5d8c34100f44c8318755836"}, + {file = "yarl-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03344b592468257494a253b35f7b67c243397286dd0ae6be03af35eb34333139"}, + {file = "yarl-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dda10d4525517e32dc33c5fe98c5b877b9807ce0ecd8acef93c09f1406b4fe4"}, + {file = "yarl-1.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:889993b2bc2f04308d4ebe12424fecccc22062aa06c61771d3e9302527a0bdec"}, + {file = "yarl-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027bbf2e616ed072ee5f9344240c8d908c3c5a8c30cea31e8fa9899b42a6a51b"}, + {file = "yarl-1.15.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3044230cd78f236f6b9c6e06cb7d618dd1cffebfb97600fb98e0a562f0f456ef"}, + {file = "yarl-1.15.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e5b1e400252498d3de94b19197039422539c62f081c21f3b785e184cdd041a85"}, + {file = "yarl-1.15.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c1b1dc71d6b4d6ab785e1f7a916960eb094be6300bc92e515d7a04709b2fad6b"}, + {file = "yarl-1.15.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1a6e972ee42b2c868985db62dd592629594c47279579372a64d7666b6d14683d"}, + {file = "yarl-1.15.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6ce6768a192aa3af22a9b58d1b07226e9313b3e6e179bdb8de215d99a6baef86"}, + {file = "yarl-1.15.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:45d986f872258bcd4f417b474e1c35e8bba14d69fb124432c417bd256adde38b"}, + {file = "yarl-1.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e9dec42480ee079581faafb05fa55731ec80693310a6775e8adbf83edc52fd24"}, + {file = "yarl-1.15.1-cp311-cp311-win32.whl", hash = "sha256:2c8c4ea31d28f47d7af24f44e5a2090ec4245ac3f3e34ce55ab1188d92e98a71"}, + {file = "yarl-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:b5f27f515f69dea928cc16577844762226893098426ba54223fc62c70af5863a"}, + {file = "yarl-1.15.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b169b0edb76e72b46373fcc1b4b9820a3680639f92ad506c2b7de9450546bea6"}, + {file = "yarl-1.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7e3b2e7518d6789b577793912b0037f36fdcff28a73a1f5c1affc34759852b4f"}, + {file = "yarl-1.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:04cb3e3a0f0fbf2a9614c88fef811c0f10449415a1ff532f437aec9bcc6b9da5"}, + {file = "yarl-1.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46091072123e7295b0f4a88c6c24f0386b3e45e54efddd141069d5e16e372ce6"}, + {file = "yarl-1.15.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:839f1056ceca5b2019174f8c15ba131c3eebece241b228d46a469760953e8049"}, + {file = "yarl-1.15.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7b85ad874cf6eaad545f2bd838b3782db30cecb9364ade0214b9a7e9462d051"}, + {file = "yarl-1.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d60326a87fcd9c1b1ccc18344b036ecdaa5e92c52c163560759df50fc0d39f6"}, + {file = "yarl-1.15.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:974fa4829a09fa0d7a6375d40f39ad9265904d7c1754e2b9dc302ceedc54388d"}, + {file = "yarl-1.15.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:41037ae2992cc3b0fa088ffe609e3c2f066284f9329035f26e853230e8f7ae13"}, + {file = "yarl-1.15.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f313ce3a41c8c280f90ec0770dc2bd464a8b24f5c785daa70f71654b1334295b"}, + {file = "yarl-1.15.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bd9c7873f26065a0ff3189c5002fb5c8e41d3e49741e0e903a11f12be27c841b"}, + {file = "yarl-1.15.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e9672cdc71bb44d45240b8447793efb83a76a046000dafb6e2ac827db9dfbdda"}, + {file = "yarl-1.15.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d7251c8185c49c17270d756da2c97de5c076790d64450a56c4814b3a40f3807f"}, + {file = "yarl-1.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b7177ba5c965a436bb97d4db0841302075eb9fa77a6a806aa44975c5ff619fb"}, + {file = "yarl-1.15.1-cp312-cp312-win32.whl", hash = "sha256:35921994c4d23d3679d3999ca0fdd05b27e33363bc80e1c24681c9ba108eb874"}, + {file = "yarl-1.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:28a865a4a06b90ea6ca985a530b7d95c795b4c63062f759fe88de90ae5f66198"}, + {file = "yarl-1.15.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2206775a9a2831c044ecc0863cb63e4e8cf5f8d4fce0fc3c900e5a51e9d57e87"}, + {file = "yarl-1.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:af1741bedd1b3a1100635a30c2fa5850bc95e5647be3d221e28684b66d16f655"}, + {file = "yarl-1.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2969fba35b5cd0418f343c363a3ae6c5dc847e3c2861a4ac857d004882a805d4"}, + {file = "yarl-1.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4510ae890f55a685d7d8b55cf80f6a35799fbe682b8546a0aed67565f86793ce"}, + {file = "yarl-1.15.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ea3ca97a5aa00943604f93919bc0741769b900dd3217d02f9d29274371fd758"}, + {file = "yarl-1.15.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a976eeaea67b1d53dce91174968f077ae7f3a0a05ede80a099bc584ea748bdd"}, + {file = "yarl-1.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc5fbe7629e454d3c4a621c8416e9a1956d7f2523296142d46edc17d7d54901e"}, + {file = "yarl-1.15.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d7c2224b6e8f40b39a61643212e5d974172394aae0244a9840f62aed4452ee4"}, + {file = "yarl-1.15.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a3e237e19fca6b4aa18e6bc7702d27c4e9460f1d0f3a792cdf4aefdc10d52411"}, + {file = "yarl-1.15.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:cd5857354c53d023fd97d06fb01b6c0f176cfc73ae03460a1812455095e214d6"}, + {file = "yarl-1.15.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:72d312f74665006911c4de95e1633c6e9e4b1f003ef4f76d4b36e01cfa7ed820"}, + {file = "yarl-1.15.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d8e5a1ee05b5d742accc42512a1d6a8c59f6906db1dd298d98e1a6ab98470373"}, + {file = "yarl-1.15.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2ce9052e9f4196e44221e3d3d51cdcfa3b1afea05afbd896cefdd233e9606d08"}, + {file = "yarl-1.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d2376327a557661424599278fbf3a1bcb96b90c8316743ba3d9ad831e794e11a"}, + {file = "yarl-1.15.1-cp313-cp313-win32.whl", hash = "sha256:e328110c15b4d2dbb00861feaa7e0ce5aebfc355406e0f6d9e46adcb5abe9a55"}, + {file = "yarl-1.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:5268b43abf47053dc0bbff72d78f69192dbe453fee9517036fc0a0cc84f341d7"}, + {file = "yarl-1.15.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ee09963524b5327e2bfe3dfecd19d0403d2b1afbd11a49a00d4d379c1551406e"}, + {file = "yarl-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cbe2765f54e5940c705c8c1c125f12c84f7bd486f7925bcb7abc6740b97fdd5c"}, + {file = "yarl-1.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a86cb224d1f31ed4c6ba79188b571d517fdc730c6edcf6baf6e71805d88f183f"}, + {file = "yarl-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b28dc68741c2eda94ac2ce9fb16c73aa9b90c0c0cdf99cf8a7c86dec94dc5de2"}, + {file = "yarl-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49db3c1a5e11241c1de2133efaa87a28ae9ac20583ad1ec16737761d9d8324a0"}, + {file = "yarl-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce3ed94298b3e6a5dad8b86633ba70564411f459ce5d0e4bf57e973ef3fc158"}, + {file = "yarl-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41b2be15daf51cd8d50f54d2277f17ac6e6fed198f105956a48d8240f10b154b"}, + {file = "yarl-1.15.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007531e85ca8d9fc35819709a52a6f0d133deecc3e2247f0e2b8350de36a3356"}, + {file = "yarl-1.15.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d6b646d8eae5fb38b9401daac98e40335228306305d491f52914b161f6cf319c"}, + {file = "yarl-1.15.1-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:c551571a5941093b86c0c05fdf136fafbe4308b83cd4fc77d92b21c6726f7c13"}, + {file = "yarl-1.15.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a6dd351c2f38c8168b6860338f4c30e9c160a0fb474dcbedf2224c63a86a7512"}, + {file = "yarl-1.15.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:759f18151f785888344ec1f28d5a2bd61ca2ccb80d04b65ab9548d524b1b9acb"}, + {file = "yarl-1.15.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:860fc2726e32b4ac3b0a44535853a9b1ea14975a8c4207609f2883dcfcbd5ecc"}, + {file = "yarl-1.15.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3c5782135b3a762e265b11dbb13df878d1a331ef498866036f743786adf70371"}, + {file = "yarl-1.15.1-cp38-cp38-win32.whl", hash = "sha256:f9a3a53622f0e905a7f3557b770d48e737b8a38141c81eecbcc947fac164d1f9"}, + {file = "yarl-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:d25da5fc7a2993e1d9818e4dfdc67c95c771678e0d3499a1d67e42bfa75890ba"}, + {file = "yarl-1.15.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6f3595518f4e8b97c0a2d01030e27937d22f2506a1503282b8965ae1dcd0dec6"}, + {file = "yarl-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c261d807048b9e17b0a3c413d4926c34b5563c6b94f95c17daff6053901d0ab0"}, + {file = "yarl-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f1cd16833ff1d6250350794c3df1be2ce0960fa64740699dfa688769aa1c6a89"}, + {file = "yarl-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e3959cfba2bb48a0d8b83f370452b400710dd0900f9fdad0ce9e913e6d65b8f"}, + {file = "yarl-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87593714a38a4a51efc967b0477c72f55a08ed6b801bfcf68656e68f233047c7"}, + {file = "yarl-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1181f8912e0d1bb31cae5ab630d350ad2e79aab4196faea3669c3599e05af44b"}, + {file = "yarl-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46448214e3b7099ab8cfba576b71b7742ce13a1cec7824eebe7a71fc8903b304"}, + {file = "yarl-1.15.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d44ec44b4771544b815cff0efa05f6d58e9f87e9b05aa15d13739111ae53df1e"}, + {file = "yarl-1.15.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa72a0e5037c2c91d1b945ff20698c01a7897b10ab93c0979b8543e2ad0b1d76"}, + {file = "yarl-1.15.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:bd756524c387478f0788937dfbe132d01663e783e1424f7d3a72df552521c995"}, + {file = "yarl-1.15.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6c3968e4ec6b44af29562824c7973c12c22041b2dc080613a7c41c7c09901579"}, + {file = "yarl-1.15.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:59aaa919f9898352cd3bf32d3a1bfc7d2aa399f83dd91b1915eaa684e27553b7"}, + {file = "yarl-1.15.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:65a41d40b34391aeb3b973410ed0ed86b3023e5371dce6e7ff1c57af5794391d"}, + {file = "yarl-1.15.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:54eef7907bb868e20ddcf4078e9a106e2c56a84ba31611038d28b9934ccb2a2c"}, + {file = "yarl-1.15.1-cp39-cp39-win32.whl", hash = "sha256:60c8b36f7ed73aeaa2948f27f9a8a905c23bf62e291b7b9fc53348b4789b180c"}, + {file = "yarl-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:b79a4df7029446ae8062f74c093a2f6c305f65b3ec89fa8ce3e064c0eeb36f3f"}, + {file = "yarl-1.15.1-py3-none-any.whl", hash = "sha256:ac28421ab71ec2d50eb7dff76a64ef81de92fb9738a81de2500b031b6f5f6038"}, + {file = "yarl-1.15.1.tar.gz", hash = "sha256:02e1c9e36528de270c22c06aac6a5a1de8cc870fafefb5e90e5b35cb8985d0b2"}, ] [package.dependencies] @@ -4011,4 +4016,4 @@ polymarket = ["py-clob-client"] [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.13" -content-hash = "f9423d4361fbc964d995c27e3dfea9458e95ec8fca231d13123484ead28da2c2" +content-hash = "a325c6e59c500a5433e66e99aa4f5251c92939e23958e12e1423bc0dabf38b2b" diff --git a/pyproject.toml b/pyproject.toml index 315450381575..f786625799bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,7 +74,7 @@ bech32 = {version = "^1.2.0", optional = true} ecdsa = {version = "^0.19.0", optional = true} bip-utils = {version = "^2.9.3", optional = true} pycryptodome = {version = "^3.20.0", optional = true} -py-clob-client = {version = "^0.17.5", optional = true} +py-clob-client = {version = "^0.18.0", optional = true} [tool.poetry.extras] betfair = ["betfair_parser"] From ad24b710b98e074314c7e3b1532067bc750c2bd1 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 17:11:25 +1100 Subject: [PATCH 120/224] Refine Polymarket book snapshot parsing --- nautilus_trader/adapters/polymarket/data.py | 6 +----- .../adapters/polymarket/schemas/book.py | 4 +++- .../resources/http_responses/book.json | 3 ++- .../polymarket/resources/ws_messages/book.json | 3 ++- .../adapters/polymarket/test_parsing.py | 18 +++++------------- 5 files changed, 13 insertions(+), 21 deletions(-) diff --git a/nautilus_trader/adapters/polymarket/data.py b/nautilus_trader/adapters/polymarket/data.py index 4997d4a83c41..69aa4a583baa 100644 --- a/nautilus_trader/adapters/polymarket/data.py +++ b/nautilus_trader/adapters/polymarket/data.py @@ -397,11 +397,7 @@ def _handle_book_snapshot( ws_message: PolymarketBookSnapshot, ) -> None: now_ns = self._clock.timestamp_ns() - deltas = ws_message.parse_to_snapshot( - instrument=instrument, - ts_event=now_ns, - ts_init=now_ns, - ) + deltas = ws_message.parse_to_snapshot(instrument=instrument, ts_init=now_ns) self._handle_deltas(instrument, deltas) diff --git a/nautilus_trader/adapters/polymarket/schemas/book.py b/nautilus_trader/adapters/polymarket/schemas/book.py index ac2116398bfd..a364d75f5f91 100644 --- a/nautilus_trader/adapters/polymarket/schemas/book.py +++ b/nautilus_trader/adapters/polymarket/schemas/book.py @@ -43,13 +43,15 @@ class PolymarketBookSnapshot(msgspec.Struct, tag="book", tag_field="event_type", hash: str bids: list[PolymarketBookLevel] asks: list[PolymarketBookLevel] + timestamp: str def parse_to_snapshot( self, instrument: BinaryOption, - ts_event: int, ts_init: int, ) -> OrderBookDeltas: + ts_event = millis_to_nanos(float(self.timestamp)) + deltas: list[OrderBookDelta] = [] # Add initial clear diff --git a/tests/integration_tests/adapters/polymarket/resources/http_responses/book.json b/tests/integration_tests/adapters/polymarket/resources/http_responses/book.json index ac8405a43ebf..cd88c8649cb3 100644 --- a/tests/integration_tests/adapters/polymarket/resources/http_responses/book.json +++ b/tests/integration_tests/adapters/polymarket/resources/http_responses/book.json @@ -53,5 +53,6 @@ "size": "705" } ], - "hash": "2fc4a3d6a98bc164e057589bcb74981852b87412" + "hash": "2fc4a3d6a98bc164e057589bcb74981852b87412", + "timestamp": "1728799418260" } diff --git a/tests/integration_tests/adapters/polymarket/resources/ws_messages/book.json b/tests/integration_tests/adapters/polymarket/resources/ws_messages/book.json index 8d2d386054f8..07aa26c48763 100644 --- a/tests/integration_tests/adapters/polymarket/resources/ws_messages/book.json +++ b/tests/integration_tests/adapters/polymarket/resources/ws_messages/book.json @@ -654,5 +654,6 @@ ], "event_type": "book", "hash": "655a38d4977427b086c25b985993691b753ed166", - "market": "0xdd22472e552920b8438158ea7238bfadfa4f736aa4cee91a6b86c39ead110917" + "market": "0xdd22472e552920b8438158ea7238bfadfa4f736aa4cee91a6b86c39ead110917", + "timestamp": "1728799418260" } diff --git a/tests/integration_tests/adapters/polymarket/test_parsing.py b/tests/integration_tests/adapters/polymarket/test_parsing.py index 4e218f1039d1..f93f5f71acb1 100644 --- a/tests/integration_tests/adapters/polymarket/test_parsing.py +++ b/tests/integration_tests/adapters/polymarket/test_parsing.py @@ -74,16 +74,14 @@ def test_parse_order_book_snapshots() -> None: instrument = TestInstrumentProvider.binary_option() # Act - snapshot = ws_message.parse_to_snapshot( - instrument=instrument, - ts_event=1, - ts_init=2, - ) + snapshot = ws_message.parse_to_snapshot(instrument=instrument, ts_init=1728799418260000001) # Assert assert isinstance(snapshot, OrderBookDeltas) assert len(snapshot.deltas) == 13 assert snapshot.is_snapshot + assert snapshot.ts_event == 1728799418260000000 + assert snapshot.ts_init == 1728799418260000001 def test_parse_order_book_delta() -> None: @@ -99,10 +97,7 @@ def test_parse_order_book_delta() -> None: instrument = TestInstrumentProvider.binary_option() # Act - delta = ws_message.parse_to_delta( - instrument=instrument, - ts_init=2, - ) + delta = ws_message.parse_to_delta(instrument=instrument, ts_init=2) # Assert assert isinstance(delta, OrderBookDelta) @@ -159,10 +154,7 @@ def test_parse_trade_tick() -> None: instrument = TestInstrumentProvider.binary_option() # Act - trade = ws_message.parse_to_trade_tick( - instrument=instrument, - ts_init=2, - ) + trade = ws_message.parse_to_trade_tick(instrument=instrument, ts_init=2) # Assert assert isinstance(trade, TradeTick) From 25be0a15820687ae08c13f368103b38d787d1762 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 17:56:12 +1100 Subject: [PATCH 121/224] Cleanup actor fields --- nautilus_trader/common/actor.pxd | 6 +++--- nautilus_trader/common/actor.pyx | 14 ++++++-------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/nautilus_trader/common/actor.pxd b/nautilus_trader/common/actor.pxd index f1f01f7a0888..79e08646ccea 100644 --- a/nautilus_trader/common/actor.pxd +++ b/nautilus_trader/common/actor.pxd @@ -52,14 +52,14 @@ from nautilus_trader.portfolio.base cimport PortfolioFacade cdef class Actor(Component): cdef object _executor cdef set[type] _warning_events - cdef dict[str, type] _signal_classes cdef dict[UUID4, object] _pending_requests + cdef set[type] _pyo3_conversion_types + cdef dict[InstrumentId, list[GreeksData]] _future_greeks + cdef dict[str, type] _signal_classes cdef list[Indicator] _indicators cdef dict[InstrumentId, list[Indicator]] _indicators_for_quotes cdef dict[InstrumentId, list[Indicator]] _indicators_for_trades cdef dict[BarType, list[Indicator]] _indicators_for_bars - cdef dict[InstrumentId, list[GreeksData]] _future_greeks - cdef set[type] _pyo3_conversion_types cdef readonly PortfolioFacade portfolio """The read-only portfolio for the actor.\n\n:returns: `PortfolioFacade`""" diff --git a/nautilus_trader/common/actor.pyx b/nautilus_trader/common/actor.pyx index 894527b779ac..6b06ed14286f 100644 --- a/nautilus_trader/common/actor.pyx +++ b/nautilus_trader/common/actor.pyx @@ -116,8 +116,10 @@ cdef class Actor(Component): ) self._warning_events: set[type] = set() - self._signal_classes: dict[str, type] = {} self._pending_requests: dict[UUID4, Callable[[UUID4], None] | None] = {} + self._pyo3_conversion_types = set() + self._future_greeks: dict[InstrumentId, list[GreeksData]] = {} + self._signal_classes: dict[str, type] = {} # Indicators self._indicators: list[Indicator] = [] @@ -125,10 +127,6 @@ cdef class Actor(Component): self._indicators_for_trades: dict[InstrumentId, list[Indicator]] = {} self._indicators_for_bars: dict[BarType, list[Indicator]] = {} - self._pyo3_conversion_types = set() - - self._future_greeks: dict[InstrumentId, list[GreeksData]] = {} - # Configuration self.config = config @@ -1823,7 +1821,7 @@ cdef class Actor(Component): ---------- name : str The name of the signal being published. - The signal name is case-insensitive and will be capitalized + The signal name will be converted to title case, with each word capitalized (e.g., 'example' becomes 'SignalExample'). value : object The signal data to publish. @@ -2888,11 +2886,11 @@ cdef class Actor(Component): """ from nautilus_trader.risk.greeks import greeks_key - # option case, to avoid querying definition + # Option case, to avoid querying definition if ' ' in instrument_id.symbol.value: return GreeksData.from_bytes(self.cache.get(greeks_key(instrument_id))) - # future case + # Future case if instrument_id not in self._future_greeks: future_definition = self.cache.instrument(instrument_id) self._future_greeks[instrument_id] = GreeksData.from_delta(instrument_id, int(future_definition.multiplier)) From 8a7571c7aece3696cb7a45d851eae570c2cb2a3a Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 18:48:04 +1100 Subject: [PATCH 122/224] Add generic Signal type for cache database --- nautilus_core/common/src/cache/database.rs | 6 +++ nautilus_core/common/src/lib.rs | 1 + nautilus_core/common/src/signal.rs | 54 +++++++++++++++++++ .../infrastructure/src/redis/cache.rs | 9 ++++ nautilus_core/infrastructure/src/sql/cache.rs | 39 +++++++++++++- .../infrastructure/src/sql/models/types.rs | 16 ++++++ .../infrastructure/src/sql/queries.rs | 44 +++++++++++++++ .../tests/test_cache_database_postgres.rs | 39 +++++++++++++- schema/tables.sql | 11 ++++ 9 files changed, 217 insertions(+), 2 deletions(-) create mode 100644 nautilus_core/common/src/signal.rs diff --git a/nautilus_core/common/src/cache/database.rs b/nautilus_core/common/src/cache/database.rs index aebdc84b871c..e2cbe9ccc8c8 100644 --- a/nautilus_core/common/src/cache/database.rs +++ b/nautilus_core/common/src/cache/database.rs @@ -38,6 +38,8 @@ use nautilus_model::{ }; use ustr::Ustr; +use crate::signal::Signal; + pub trait CacheDatabaseAdapter { fn close(&mut self) -> anyhow::Result<()>; @@ -116,6 +118,10 @@ pub trait CacheDatabaseAdapter { fn load_bars(&mut self, instrument_id: &InstrumentId) -> anyhow::Result>; + fn add_signal(&mut self, signal: &Signal) -> anyhow::Result<()>; + + fn load_signals(&mut self, data_type: &str, metadata: &str) -> anyhow::Result>; + fn index_venue_order_id( &mut self, client_order_id: ClientOrderId, diff --git a/nautilus_core/common/src/lib.rs b/nautilus_core/common/src/lib.rs index 9c6710d6f1f7..21d90418fc34 100644 --- a/nautilus_core/common/src/lib.rs +++ b/nautilus_core/common/src/lib.rs @@ -39,6 +39,7 @@ pub mod logging; pub mod messages; pub mod msgbus; pub mod runtime; +pub mod signal; pub mod testing; pub mod throttler; pub mod timer; diff --git a/nautilus_core/common/src/signal.rs b/nautilus_core/common/src/signal.rs new file mode 100644 index 000000000000..a086d2f04486 --- /dev/null +++ b/nautilus_core/common/src/signal.rs @@ -0,0 +1,54 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use std::fmt::Debug; + +use nautilus_core::nanos::UnixNanos; +use serde::{Deserialize, Serialize}; +use ustr::Ustr; + +/// Represents a generic signal. +#[repr(C)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[cfg_attr( + feature = "python", + pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.common") +)] +pub struct Signal { + pub data_type: Ustr, + pub metadata: Ustr, + pub value: String, + pub ts_event: UnixNanos, + pub ts_init: UnixNanos, +} + +impl Signal { + /// Creates a new [`Signal`] instance. + pub fn new( + data_type: Ustr, + metadata: Ustr, + value: String, + ts_event: UnixNanos, + ts_init: UnixNanos, + ) -> Self { + Self { + data_type, + metadata, + value, + ts_event, + ts_init, + } + } +} diff --git a/nautilus_core/infrastructure/src/redis/cache.rs b/nautilus_core/infrastructure/src/redis/cache.rs index 475260864fde..f2dfd78ff8c7 100644 --- a/nautilus_core/infrastructure/src/redis/cache.rs +++ b/nautilus_core/infrastructure/src/redis/cache.rs @@ -24,6 +24,7 @@ use nautilus_common::{ cache::{database::CacheDatabaseAdapter, CacheConfig}, enums::SerializationEncoding, runtime::get_runtime, + signal::Signal, }; use nautilus_core::{correctness::check_slice_not_empty, nanos::UnixNanos, uuid::UUID4}; use nautilus_model::{ @@ -892,6 +893,14 @@ impl CacheDatabaseAdapter for RedisCacheDatabaseAdapter { anyhow::bail!("Saving market data for Redis cache adapter not supported") } + fn add_signal(&mut self, signal: &Signal) -> anyhow::Result<()> { + anyhow::bail!("Saving signals for Redis cache adapter not supported") + } + + fn load_signals(&mut self, data_type: &str, metadata: &str) -> anyhow::Result> { + anyhow::bail!("Loading signals from Redis cache adapter not supported") + } + fn load_bars(&mut self, instrument_id: &InstrumentId) -> anyhow::Result> { anyhow::bail!("Loading market data for Redis cache adapter not supported") } diff --git a/nautilus_core/infrastructure/src/sql/cache.rs b/nautilus_core/infrastructure/src/sql/cache.rs index d291b6da2937..31913d26c2c0 100644 --- a/nautilus_core/infrastructure/src/sql/cache.rs +++ b/nautilus_core/infrastructure/src/sql/cache.rs @@ -19,7 +19,7 @@ use std::{ }; use bytes::Bytes; -use nautilus_common::cache::database::CacheDatabaseAdapter; +use nautilus_common::{cache::database::CacheDatabaseAdapter, signal::Signal}; use nautilus_core::nanos::UnixNanos; use nautilus_model::{ accounts::any::AccountAny, @@ -70,6 +70,7 @@ pub enum DatabaseQuery { AddTrade(TradeTick), AddQuote(QuoteTick), AddBar(Bar), + AddSignal(Signal), } fn get_buffer_interval() -> Duration { @@ -228,6 +229,9 @@ async fn drain_buffer(pool: &PgPool, buffer: &mut VecDeque) { DatabaseQuery::AddBar(bar) => { DatabaseQueries::add_bar(pool, &bar).await.unwrap(); } + DatabaseQuery::AddSignal(signal) => { + DatabaseQueries::add_signal(pool, &signal).await.unwrap(); + } } } } @@ -767,6 +771,39 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { Ok(rx.recv()?) } + fn add_signal(&mut self, signal: &Signal) -> anyhow::Result<()> { + let query = DatabaseQuery::AddSignal(signal.to_owned()); + self.tx.send(query).map_err(|e| { + anyhow::anyhow!("Failed to send query add_signal to database message handler: {e}") + }) + } + + fn load_signals(&mut self, data_type: &str, metadata: &str) -> anyhow::Result> { + let pool = self.pool.clone(); + let data_type = data_type.to_owned(); + let metadata = metadata.to_owned(); + let (tx, rx) = std::sync::mpsc::channel(); + tokio::spawn(async move { + let result = DatabaseQueries::load_signals(&pool, &data_type, &metadata).await; + match result { + Ok(signals) => { + if let Err(e) = tx.send(signals) { + log::error!("Failed to send signals for data_type {data_type} and metadata {metadata}: {e:?}"); + } + } + Err(e) => { + log::error!("Failed to load signals for data_type {data_type} and metadata {metadata}: {e:?}"); + if let Err(e) = tx.send(Vec::new()) { + log::error!( + "Failed to send empty signals for data_type {data_type} and metadata {metadata}: {e:?}" + ); + } + } + } + }); + Ok(rx.recv()?) + } + fn index_venue_order_id( &mut self, client_order_id: ClientOrderId, diff --git a/nautilus_core/infrastructure/src/sql/models/types.rs b/nautilus_core/infrastructure/src/sql/models/types.rs index e108b4a6f58b..bb0855a3b24c 100644 --- a/nautilus_core/infrastructure/src/sql/models/types.rs +++ b/nautilus_core/infrastructure/src/sql/models/types.rs @@ -13,12 +13,16 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- +use nautilus_common::signal::Signal; +use nautilus_core::nanos::UnixNanos; use nautilus_model::types::currency::Currency; use sqlx::{postgres::PgRow, FromRow, Row}; +use ustr::Ustr; use crate::sql::models::enums::CurrencyTypeModel; pub struct CurrencyModel(pub Currency); +pub struct SignalModel(pub Signal); impl<'r> FromRow<'r, PgRow> for CurrencyModel { fn from_row(row: &'r PgRow) -> Result { @@ -37,3 +41,15 @@ impl<'r> FromRow<'r, PgRow> for CurrencyModel { Ok(CurrencyModel(currency)) } } + +impl<'r> FromRow<'r, PgRow> for SignalModel { + fn from_row(row: &'r PgRow) -> Result { + let data_type = row.try_get::<&str, _>("data_type").map(Ustr::from)?; + let metadata = row.try_get::<&str, _>("metadata").map(Ustr::from)?; + let value = row.try_get::("value")?; + let ts_event = row.try_get::<&str, _>("ts_event").map(UnixNanos::from)?; + let ts_init = row.try_get::<&str, _>("ts_init").map(UnixNanos::from)?; + let signal = Signal::new(data_type, metadata, value, ts_event, ts_init); + Ok(SignalModel(signal)) + } +} diff --git a/nautilus_core/infrastructure/src/sql/queries.rs b/nautilus_core/infrastructure/src/sql/queries.rs index efa066d2a0d1..685c1e628381 100644 --- a/nautilus_core/infrastructure/src/sql/queries.rs +++ b/nautilus_core/infrastructure/src/sql/queries.rs @@ -15,6 +15,7 @@ use std::collections::HashMap; +use nautilus_common::signal::Signal; use nautilus_model::{ accounts::{any::AccountAny, base::Account}, data::{bar::Bar, quote::QuoteTick, trade::TradeTick}, @@ -32,6 +33,7 @@ use nautilus_model::{ }; use sqlx::{PgPool, Row}; +use super::models::types::SignalModel; use crate::sql::models::{ accounts::AccountEventModel, data::{BarModel, QuoteTickModel, TradeTickModel}, @@ -732,4 +734,46 @@ impl DatabaseQueries { } Ok(map) } + + pub async fn add_signal(pool: &PgPool, signal: &Signal) -> anyhow::Result<()> { + sqlx::query( + r#" + INSERT INTO "signal" ( + data_type, metadata, value, ts_event, ts_init, created_at, updated_at + ) VALUES ( + $1, $2, $3, $4, $5, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP + ) + ON CONFLICT (id) + DO UPDATE + SET + data_type = $1, metadata = $2, value = $3, ts_event = $4, ts_init = $5, + updated_at = CURRENT_TIMESTAMP + "#, + ) + .bind(signal.data_type.to_string()) + .bind(signal.metadata.to_string()) + .bind(signal.value.to_string()) + .bind(signal.ts_event.to_string()) + .bind(signal.ts_init.to_string()) + .execute(pool) + .await + .map(|_| ()) + .map_err(|e| anyhow::anyhow!("Failed to insert into signal table: {e}")) + } + + pub async fn load_signals( + pool: &PgPool, + data_type: &str, + metadata: &str, + ) -> anyhow::Result> { + sqlx::query_as::<_, SignalModel>( + r#"SELECT * FROM "signal" WHERE data_type = $1 AND metadata = $2 ORDER BY ts_event ASC"#, + ) + .bind(data_type) + .bind(metadata) + .fetch_all(pool) + .await + .map(|rows| rows.into_iter().map(|row| row.0).collect()) + .map_err(|e| anyhow::anyhow!("Failed to load signals: {e}")) + } } diff --git a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs index cd27673feea7..3caa65924771 100644 --- a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs +++ b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs @@ -19,7 +19,10 @@ mod serial_tests { use std::{collections::HashSet, time::Duration}; use bytes::Bytes; - use nautilus_common::{cache::database::CacheDatabaseAdapter, testing::wait_until}; + use nautilus_common::{ + cache::database::CacheDatabaseAdapter, signal::Signal, testing::wait_until, + }; + use nautilus_core::nanos::UnixNanos; use nautilus_infrastructure::sql::cache::get_pg_cache_database; use nautilus_model::{ accounts::{any::AccountAny, cash::CashAccount}, @@ -495,4 +498,38 @@ mod serial_tests { let instruments = pg_cache.load_instruments().unwrap(); assert_eq!(instruments.len(), 0); } + + #[tokio::test(flavor = "multi_thread")] + async fn test_postgres_cache_database_add_signal() { + let mut pg_cache = get_pg_cache_database().await.unwrap(); + // Add signal + let data_type = Ustr::from("SignalExample"); + let metadata = Ustr::from("{}"); + let value = "0.0".to_string(); + let signal = Signal::new( + data_type, + metadata, + value, + UnixNanos::from(1), + UnixNanos::from(2), + ); + pg_cache.add_signal(&signal).unwrap(); + + wait_until( + || { + pg_cache + .load_signals(data_type.as_str(), metadata.as_str()) + .unwrap() + .len() + == 1 + }, + Duration::from_secs(2), + ); + + let signals = pg_cache + .load_signals(data_type.as_str(), metadata.as_str()) + .unwrap(); + assert_eq!(signals.len(), 1); + assert_eq!(signals[0], signal); + } } diff --git a/schema/tables.sql b/schema/tables.sql index 11534b2f1cc2..3a9e3bb232b4 100644 --- a/schema/tables.sql +++ b/schema/tables.sql @@ -207,3 +207,14 @@ CREATE TABLE IF NOT EXISTS "bar" ( created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP ); + +CREATE TABLE IF NOT EXISTS "signal" ( + id BIGSERIAL PRIMARY KEY NOT NULL, + data_type TEXT NOT NULL, + metadata TEXT NOT NULL, + value TEXT NOT NULL, + ts_event TEXT NOT NULL, + ts_init TEXT NOT NULL, + created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP +); From 50a02d87808c7a4fb55fd6328947dcb764bdce0f Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 13 Oct 2024 21:43:55 +1100 Subject: [PATCH 123/224] Add Python interface for Signal --- .../infrastructure/src/python/sql/cache.rs | 32 +++++++++++++++---- .../cache/postgres/transformers.py | 14 ++++++++ nautilus_trader/core/nautilus_pyo3.pyi | 12 +++++++ .../test_cache_database_postgres.py | 18 +++++++++++ 4 files changed, 70 insertions(+), 6 deletions(-) diff --git a/nautilus_core/infrastructure/src/python/sql/cache.rs b/nautilus_core/infrastructure/src/python/sql/cache.rs index be39252132d7..69fedef1759e 100644 --- a/nautilus_core/infrastructure/src/python/sql/cache.rs +++ b/nautilus_core/infrastructure/src/python/sql/cache.rs @@ -16,7 +16,9 @@ use std::collections::HashMap; use bytes::Bytes; -use nautilus_common::{cache::database::CacheDatabaseAdapter, runtime::get_runtime}; +use nautilus_common::{ + cache::database::CacheDatabaseAdapter, runtime::get_runtime, signal::Signal, +}; use nautilus_core::python::to_pyruntime_err; use nautilus_model::{ data::{bar::Bar, quote::QuoteTick, trade::TradeTick}, @@ -49,6 +51,13 @@ impl PostgresCacheDatabase { result.map_err(to_pyruntime_err) } + #[pyo3(name = "flush_db")] + fn py_flush_db(slf: PyRef<'_, Self>) -> PyResult<()> { + get_runtime() + .block_on(async { DatabaseQueries::truncate(&slf.pool).await }) + .map_err(to_pyruntime_err) + } + #[pyo3(name = "load")] fn py_load(slf: PyRef<'_, Self>) -> PyResult>> { get_runtime() @@ -281,10 +290,21 @@ impl PostgresCacheDatabase { }) } - #[pyo3(name = "flush_db")] - fn py_flush_db(slf: PyRef<'_, Self>) -> PyResult<()> { - get_runtime() - .block_on(async { DatabaseQueries::truncate(&slf.pool).await }) - .map_err(to_pyruntime_err) + #[pyo3(name = "add_signal")] + fn py_add_signal(mut slf: PyRefMut<'_, Self>, signal: Signal) -> PyResult<()> { + slf.add_signal(&signal).map_err(to_pyruntime_err) + } + + #[pyo3(name = "load_signals")] + fn py_load_signals( + slf: PyRef<'_, Self>, + data_type: &str, + metadata: &str, + ) -> PyResult> { + get_runtime().block_on(async { + DatabaseQueries::load_signals(&slf.pool, data_type, metadata) + .await + .map_err(to_pyruntime_err) + }) } } diff --git a/nautilus_trader/cache/postgres/transformers.py b/nautilus_trader/cache/postgres/transformers.py index 49e9bebf6d8e..3b4284d7eae3 100644 --- a/nautilus_trader/cache/postgres/transformers.py +++ b/nautilus_trader/cache/postgres/transformers.py @@ -17,6 +17,7 @@ from nautilus_trader.accounting.accounts.cash import CashAccount from nautilus_trader.accounting.accounts.margin import MarginAccount from nautilus_trader.core import nautilus_pyo3 +from nautilus_trader.core.data import Data from nautilus_trader.model.data import Bar from nautilus_trader.model.data import QuoteTick from nautilus_trader.model.data import TradeTick @@ -336,3 +337,16 @@ def transform_quote_tick_to_pyo3(quote: QuoteTick): def transform_bar_to_pyo3(bar: Bar): bar_dict = Bar.to_dict(bar) return nautilus_pyo3.Bar.from_dict(bar_dict) + + +################################################################################ +# Signals +################################################################################ +def transform_signal_to_pyo3(signal: Data, metadata: str): + return nautilus_pyo3.Signal( + signal.__class__.__name__, + metadata, + signal.value, + signal.ts_event, + signal.ts_init, + ) diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index dce8f25a2bc6..39ce89ae21d9 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -250,6 +250,16 @@ class MessageBus: def is_registered(self, endpoint: str) -> bool: ... def deregister(self, endpoint: str) -> None: ... +class Signal: + def __init__( + self, + data_type: str, + metadata: str, + value: str, + ts_event: int, + ts_init: int, + ) -> None: ... + ################################################################################################### # Model ################################################################################################### @@ -2563,6 +2573,7 @@ class PostgresCacheDatabase: def load_trades(self, instrument_id: InstrumentId) -> list[TradeTick]: ... def load_quotes(self, instrument_id: InstrumentId) -> list[QuoteTick]: ... def load_bars(self, instrument_id: InstrumentId) -> list[Bar]: ... + def load_signals(self, data_type: str, metadata: str) -> list[Signal]: ... def add(self, key: str, value: bytes) -> None: ... def add_currency(self, currency: Currency) -> None: ... def add_instrument(self, instrument: object) -> None: ... @@ -2571,6 +2582,7 @@ class PostgresCacheDatabase: def add_trade(self, trade: TradeTick) -> None: ... def add_quote(self, quote: QuoteTick) -> None: ... def add_bar(self, bar: Bar) -> None: ... + def add_signal(self, signal: Signal) -> None: ... def update_order(self, order: object) -> None: ... def update_account(self, account: Account) -> None: ... diff --git a/tests/integration_tests/infrastructure/test_cache_database_postgres.py b/tests/integration_tests/infrastructure/test_cache_database_postgres.py index fccc684e6905..ca320227a622 100644 --- a/tests/integration_tests/infrastructure/test_cache_database_postgres.py +++ b/tests/integration_tests/infrastructure/test_cache_database_postgres.py @@ -20,6 +20,7 @@ import pytest from nautilus_trader.cache.postgres.adapter import CachePostgresAdapter +from nautilus_trader.cache.postgres.transformers import transform_signal_to_pyo3 from nautilus_trader.common.component import MessageBus from nautilus_trader.common.component import TestClock from nautilus_trader.core.nautilus_pyo3 import AggressorSide @@ -41,6 +42,7 @@ from nautilus_trader.model.objects import Money from nautilus_trader.model.objects import Price from nautilus_trader.model.objects import Quantity +from nautilus_trader.persistence.writer import generate_signal_class from nautilus_trader.portfolio.portfolio import Portfolio from nautilus_trader.test_kit.functions import eventually from nautilus_trader.test_kit.providers import TestInstrumentProvider @@ -604,3 +606,19 @@ async def test_add_and_load_bars(self): assert target_bar.volume == bar.volume assert target_bar.ts_init == bar.ts_init assert target_bar.ts_event == bar.ts_event + + @pytest.mark.skip(reason="test on linux") # TODO + @pytest.mark.asyncio + async def test_add_and_load_signals(self): + signal_cls = generate_signal_class("example", value_type=str) + signal = signal_cls(value="{}", ts_event=1, ts_init=2) + + data_type = signal.__name__ + metadata = "a=1,b=2" + signal_pyo3 = transform_signal_to_pyo3(signal, metadata) + self.database.add_signal(signal_pyo3) + + await eventually(lambda: len(self.database.load_signals(data_type, metadata))) + + signals = self.database.load_signals(data_type, metadata) + assert len(signals) == 1 From 439275deb1139442ab72d9fe38874abe45dcb9a3 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 14 Oct 2024 10:03:01 +1100 Subject: [PATCH 124/224] Fix and refine signals for postgres --- nautilus_core/common/src/cache/database.rs | 2 +- nautilus_core/common/src/python/mod.rs | 2 + nautilus_core/common/src/python/signal.rs | 63 +++++++++++++++++++ nautilus_core/common/src/signal.rs | 14 +---- .../infrastructure/src/python/sql/cache.rs | 8 +-- .../infrastructure/src/redis/cache.rs | 2 +- nautilus_core/infrastructure/src/sql/cache.rs | 15 ++--- .../infrastructure/src/sql/models/types.rs | 5 +- .../infrastructure/src/sql/queries.rs | 20 +++--- .../tests/test_cache_database_postgres.rs | 23 ++----- nautilus_trader/cache/postgres/adapter.py | 11 ++++ .../cache/postgres/transformers.py | 11 +++- nautilus_trader/core/nautilus_pyo3.pyi | 13 +++- schema/tables.sql | 3 +- .../test_cache_database_postgres.py | 13 ++-- 15 files changed, 127 insertions(+), 78 deletions(-) create mode 100644 nautilus_core/common/src/python/signal.rs diff --git a/nautilus_core/common/src/cache/database.rs b/nautilus_core/common/src/cache/database.rs index e2cbe9ccc8c8..cf84797089fb 100644 --- a/nautilus_core/common/src/cache/database.rs +++ b/nautilus_core/common/src/cache/database.rs @@ -120,7 +120,7 @@ pub trait CacheDatabaseAdapter { fn add_signal(&mut self, signal: &Signal) -> anyhow::Result<()>; - fn load_signals(&mut self, data_type: &str, metadata: &str) -> anyhow::Result>; + fn load_signals(&mut self, name: &str) -> anyhow::Result>; fn index_venue_order_id( &mut self, diff --git a/nautilus_core/common/src/python/mod.rs b/nautilus_core/common/src/python/mod.rs index 2f0e96846950..7b41d2bf5e7a 100644 --- a/nautilus_core/common/src/python/mod.rs +++ b/nautilus_core/common/src/python/mod.rs @@ -22,6 +22,7 @@ pub mod enums; pub mod handler; pub mod logging; pub mod msgbus; +pub mod signal; pub mod timer; pub mod versioning; @@ -30,6 +31,7 @@ use pyo3::prelude::*; /// Loaded as nautilus_pyo3.common #[pymodule] pub fn common(_: Python<'_>, m: &PyModule) -> PyResult<()> { + m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; diff --git a/nautilus_core/common/src/python/signal.rs b/nautilus_core/common/src/python/signal.rs new file mode 100644 index 000000000000..067acb557f71 --- /dev/null +++ b/nautilus_core/common/src/python/signal.rs @@ -0,0 +1,63 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use std::{collections::HashMap, ops::Deref}; + +use nautilus_core::{nanos::UnixNanos, time::AtomicTime}; +use pyo3::{ + prelude::*, + types::{PyString, PyTuple}, +}; +use ustr::Ustr; + +use super::timer::TimeEventHandler_Py; +use crate::signal::Signal; + +#[pymethods] +impl Signal { + #[new] + fn py_new(name: &str, value: String, ts_event: u64, ts_init: u64) -> Self { + Self::new( + Ustr::from(name), + value, + UnixNanos::from(ts_event), + UnixNanos::from(ts_init), + ) + } + + #[getter] + #[pyo3(name = "name")] + fn py_name(&self) -> &str { + self.name.as_str() + } + + #[getter] + #[pyo3(name = "value")] + fn py_value(&self) -> &str { + self.value.as_str() + } + + #[getter] + #[pyo3(name = "ts_event")] + fn py_ts_event(&self) -> u64 { + self.ts_event.as_u64() + } + + #[getter] + #[pyo3(name = "ts_init")] + fn py_ts_init(&self) -> u64 { + self.ts_init.as_u64() + } +} diff --git a/nautilus_core/common/src/signal.rs b/nautilus_core/common/src/signal.rs index a086d2f04486..c9dc81716b2b 100644 --- a/nautilus_core/common/src/signal.rs +++ b/nautilus_core/common/src/signal.rs @@ -27,8 +27,7 @@ use ustr::Ustr; pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.common") )] pub struct Signal { - pub data_type: Ustr, - pub metadata: Ustr, + pub name: Ustr, pub value: String, pub ts_event: UnixNanos, pub ts_init: UnixNanos, @@ -36,16 +35,9 @@ pub struct Signal { impl Signal { /// Creates a new [`Signal`] instance. - pub fn new( - data_type: Ustr, - metadata: Ustr, - value: String, - ts_event: UnixNanos, - ts_init: UnixNanos, - ) -> Self { + pub fn new(name: Ustr, value: String, ts_event: UnixNanos, ts_init: UnixNanos) -> Self { Self { - data_type, - metadata, + name, value, ts_event, ts_init, diff --git a/nautilus_core/infrastructure/src/python/sql/cache.rs b/nautilus_core/infrastructure/src/python/sql/cache.rs index 69fedef1759e..322c969e0f67 100644 --- a/nautilus_core/infrastructure/src/python/sql/cache.rs +++ b/nautilus_core/infrastructure/src/python/sql/cache.rs @@ -296,13 +296,9 @@ impl PostgresCacheDatabase { } #[pyo3(name = "load_signals")] - fn py_load_signals( - slf: PyRef<'_, Self>, - data_type: &str, - metadata: &str, - ) -> PyResult> { + fn py_load_signals(slf: PyRef<'_, Self>, name: &str) -> PyResult> { get_runtime().block_on(async { - DatabaseQueries::load_signals(&slf.pool, data_type, metadata) + DatabaseQueries::load_signals(&slf.pool, name) .await .map_err(to_pyruntime_err) }) diff --git a/nautilus_core/infrastructure/src/redis/cache.rs b/nautilus_core/infrastructure/src/redis/cache.rs index f2dfd78ff8c7..a99aead3f593 100644 --- a/nautilus_core/infrastructure/src/redis/cache.rs +++ b/nautilus_core/infrastructure/src/redis/cache.rs @@ -897,7 +897,7 @@ impl CacheDatabaseAdapter for RedisCacheDatabaseAdapter { anyhow::bail!("Saving signals for Redis cache adapter not supported") } - fn load_signals(&mut self, data_type: &str, metadata: &str) -> anyhow::Result> { + fn load_signals(&mut self, name: &str) -> anyhow::Result> { anyhow::bail!("Loading signals from Redis cache adapter not supported") } diff --git a/nautilus_core/infrastructure/src/sql/cache.rs b/nautilus_core/infrastructure/src/sql/cache.rs index 31913d26c2c0..9c1da9870e6b 100644 --- a/nautilus_core/infrastructure/src/sql/cache.rs +++ b/nautilus_core/infrastructure/src/sql/cache.rs @@ -778,25 +778,22 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { }) } - fn load_signals(&mut self, data_type: &str, metadata: &str) -> anyhow::Result> { + fn load_signals(&mut self, name: &str) -> anyhow::Result> { let pool = self.pool.clone(); - let data_type = data_type.to_owned(); - let metadata = metadata.to_owned(); + let name = name.to_owned(); let (tx, rx) = std::sync::mpsc::channel(); tokio::spawn(async move { - let result = DatabaseQueries::load_signals(&pool, &data_type, &metadata).await; + let result = DatabaseQueries::load_signals(&pool, &name).await; match result { Ok(signals) => { if let Err(e) = tx.send(signals) { - log::error!("Failed to send signals for data_type {data_type} and metadata {metadata}: {e:?}"); + log::error!("Failed to send signals for '{name}': {e:?}"); } } Err(e) => { - log::error!("Failed to load signals for data_type {data_type} and metadata {metadata}: {e:?}"); + log::error!("Failed to load signals for '{name}': {e:?}"); if let Err(e) = tx.send(Vec::new()) { - log::error!( - "Failed to send empty signals for data_type {data_type} and metadata {metadata}: {e:?}" - ); + log::error!("Failed to send empty signals for '{name}': {e:?}"); } } } diff --git a/nautilus_core/infrastructure/src/sql/models/types.rs b/nautilus_core/infrastructure/src/sql/models/types.rs index bb0855a3b24c..4936d1060aa9 100644 --- a/nautilus_core/infrastructure/src/sql/models/types.rs +++ b/nautilus_core/infrastructure/src/sql/models/types.rs @@ -44,12 +44,11 @@ impl<'r> FromRow<'r, PgRow> for CurrencyModel { impl<'r> FromRow<'r, PgRow> for SignalModel { fn from_row(row: &'r PgRow) -> Result { - let data_type = row.try_get::<&str, _>("data_type").map(Ustr::from)?; - let metadata = row.try_get::<&str, _>("metadata").map(Ustr::from)?; + let name = row.try_get::<&str, _>("name").map(Ustr::from)?; let value = row.try_get::("value")?; let ts_event = row.try_get::<&str, _>("ts_event").map(UnixNanos::from)?; let ts_init = row.try_get::<&str, _>("ts_init").map(UnixNanos::from)?; - let signal = Signal::new(data_type, metadata, value, ts_event, ts_init); + let signal = Signal::new(name, value, ts_event, ts_init); Ok(SignalModel(signal)) } } diff --git a/nautilus_core/infrastructure/src/sql/queries.rs b/nautilus_core/infrastructure/src/sql/queries.rs index 685c1e628381..52b917538f24 100644 --- a/nautilus_core/infrastructure/src/sql/queries.rs +++ b/nautilus_core/infrastructure/src/sql/queries.rs @@ -739,19 +739,18 @@ impl DatabaseQueries { sqlx::query( r#" INSERT INTO "signal" ( - data_type, metadata, value, ts_event, ts_init, created_at, updated_at + name, value, ts_event, ts_init, created_at, updated_at ) VALUES ( - $1, $2, $3, $4, $5, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP + $1, $2, $3, $4, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP ) ON CONFLICT (id) DO UPDATE SET - data_type = $1, metadata = $2, value = $3, ts_event = $4, ts_init = $5, + name = $1, value = $2, ts_event = $3, ts_init = $4, updated_at = CURRENT_TIMESTAMP "#, ) - .bind(signal.data_type.to_string()) - .bind(signal.metadata.to_string()) + .bind(signal.name.to_string()) .bind(signal.value.to_string()) .bind(signal.ts_event.to_string()) .bind(signal.ts_init.to_string()) @@ -761,16 +760,11 @@ impl DatabaseQueries { .map_err(|e| anyhow::anyhow!("Failed to insert into signal table: {e}")) } - pub async fn load_signals( - pool: &PgPool, - data_type: &str, - metadata: &str, - ) -> anyhow::Result> { + pub async fn load_signals(pool: &PgPool, name: &str) -> anyhow::Result> { sqlx::query_as::<_, SignalModel>( - r#"SELECT * FROM "signal" WHERE data_type = $1 AND metadata = $2 ORDER BY ts_event ASC"#, + r#"SELECT * FROM "signal" WHERE name = $1 ORDER BY ts_init ASC"#, ) - .bind(data_type) - .bind(metadata) + .bind(name) .fetch_all(pool) .await .map(|rows| rows.into_iter().map(|row| row.0).collect()) diff --git a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs index 3caa65924771..3b8add8d6a73 100644 --- a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs +++ b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs @@ -503,32 +503,17 @@ mod serial_tests { async fn test_postgres_cache_database_add_signal() { let mut pg_cache = get_pg_cache_database().await.unwrap(); // Add signal - let data_type = Ustr::from("SignalExample"); - let metadata = Ustr::from("{}"); + let name = Ustr::from("SignalExample"); let value = "0.0".to_string(); - let signal = Signal::new( - data_type, - metadata, - value, - UnixNanos::from(1), - UnixNanos::from(2), - ); + let signal = Signal::new(name, value, UnixNanos::from(1), UnixNanos::from(2)); pg_cache.add_signal(&signal).unwrap(); wait_until( - || { - pg_cache - .load_signals(data_type.as_str(), metadata.as_str()) - .unwrap() - .len() - == 1 - }, + || pg_cache.load_signals(name.as_str()).unwrap().len() == 1, Duration::from_secs(2), ); - let signals = pg_cache - .load_signals(data_type.as_str(), metadata.as_str()) - .unwrap(); + let signals = pg_cache.load_signals(name.as_str()).unwrap(); assert_eq!(signals.len(), 1); assert_eq!(signals[0], signal); } diff --git a/nautilus_trader/cache/postgres/adapter.py b/nautilus_trader/cache/postgres/adapter.py index f7f5d1875427..4fdb59fd40ba 100644 --- a/nautilus_trader/cache/postgres/adapter.py +++ b/nautilus_trader/cache/postgres/adapter.py @@ -26,9 +26,12 @@ from nautilus_trader.cache.postgres.transformers import transform_order_from_pyo3 from nautilus_trader.cache.postgres.transformers import transform_order_to_pyo3 from nautilus_trader.cache.postgres.transformers import transform_quote_tick_to_pyo3 +from nautilus_trader.cache.postgres.transformers import transform_signal_from_pyo3 +from nautilus_trader.cache.postgres.transformers import transform_signal_to_pyo3 from nautilus_trader.cache.postgres.transformers import transform_trade_tick_from_pyo3 from nautilus_trader.cache.postgres.transformers import transform_trade_tick_to_pyo3 from nautilus_trader.core import nautilus_pyo3 +from nautilus_trader.core.data import Data from nautilus_trader.core.nautilus_pyo3 import PostgresCacheDatabase from nautilus_trader.model.data import Bar from nautilus_trader.model.data import QuoteTick @@ -145,3 +148,11 @@ def load_bars(self, instrument_id: InstrumentId): instrument_id_pyo3 = nautilus_pyo3.InstrumentId.from_str(str(instrument_id)) bars = self._backing.load_bars(instrument_id_pyo3) return [Bar.from_pyo3(bar_pyo3) for bar_pyo3 in bars] + + def add_signal(self, signal: Data): + signal_pyo3 = transform_signal_to_pyo3(signal) + self._backing.add_signal(signal_pyo3) + + def load_signals(self, data_cls: type, name: str): + signals_pyo3 = self._backing.load_signals(name) + return [transform_signal_from_pyo3(data_cls, s) for s in signals_pyo3] diff --git a/nautilus_trader/cache/postgres/transformers.py b/nautilus_trader/cache/postgres/transformers.py index 3b4284d7eae3..2de3dcabe7db 100644 --- a/nautilus_trader/cache/postgres/transformers.py +++ b/nautilus_trader/cache/postgres/transformers.py @@ -342,11 +342,18 @@ def transform_bar_to_pyo3(bar: Bar): ################################################################################ # Signals ################################################################################ -def transform_signal_to_pyo3(signal: Data, metadata: str): +def transform_signal_to_pyo3(signal: Data) -> nautilus_pyo3.Signal: return nautilus_pyo3.Signal( signal.__class__.__name__, - metadata, signal.value, signal.ts_event, signal.ts_init, ) + + +def transform_signal_from_pyo3(signal_cls: type, signal_pyo3: nautilus_pyo3.Signal) -> object: + return signal_cls( + signal_pyo3.value, + signal_pyo3.ts_event, + signal_pyo3.ts_init, + ) diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index 39ce89ae21d9..83d3bed9d57e 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -253,12 +253,19 @@ class MessageBus: class Signal: def __init__( self, - data_type: str, - metadata: str, + name: str, value: str, ts_event: int, ts_init: int, ) -> None: ... + @property + def name(self) -> str: ... + @property + def value(self) -> str: ... + @property + def ts_event(self) -> int: ... + @property + def ts_init(self) -> int: ... ################################################################################################### # Model @@ -2573,7 +2580,7 @@ class PostgresCacheDatabase: def load_trades(self, instrument_id: InstrumentId) -> list[TradeTick]: ... def load_quotes(self, instrument_id: InstrumentId) -> list[QuoteTick]: ... def load_bars(self, instrument_id: InstrumentId) -> list[Bar]: ... - def load_signals(self, data_type: str, metadata: str) -> list[Signal]: ... + def load_signals(self, name: str) -> list[Signal]: ... def add(self, key: str, value: bytes) -> None: ... def add_currency(self, currency: Currency) -> None: ... def add_instrument(self, instrument: object) -> None: ... diff --git a/schema/tables.sql b/schema/tables.sql index 3a9e3bb232b4..6b48c0e7336e 100644 --- a/schema/tables.sql +++ b/schema/tables.sql @@ -210,8 +210,7 @@ CREATE TABLE IF NOT EXISTS "bar" ( CREATE TABLE IF NOT EXISTS "signal" ( id BIGSERIAL PRIMARY KEY NOT NULL, - data_type TEXT NOT NULL, - metadata TEXT NOT NULL, + name TEXT NOT NULL, value TEXT NOT NULL, ts_event TEXT NOT NULL, ts_init TEXT NOT NULL, diff --git a/tests/integration_tests/infrastructure/test_cache_database_postgres.py b/tests/integration_tests/infrastructure/test_cache_database_postgres.py index ca320227a622..3419ecb4886d 100644 --- a/tests/integration_tests/infrastructure/test_cache_database_postgres.py +++ b/tests/integration_tests/infrastructure/test_cache_database_postgres.py @@ -20,7 +20,6 @@ import pytest from nautilus_trader.cache.postgres.adapter import CachePostgresAdapter -from nautilus_trader.cache.postgres.transformers import transform_signal_to_pyo3 from nautilus_trader.common.component import MessageBus from nautilus_trader.common.component import TestClock from nautilus_trader.core.nautilus_pyo3 import AggressorSide @@ -607,18 +606,16 @@ async def test_add_and_load_bars(self): assert target_bar.ts_init == bar.ts_init assert target_bar.ts_event == bar.ts_event - @pytest.mark.skip(reason="test on linux") # TODO @pytest.mark.asyncio async def test_add_and_load_signals(self): signal_cls = generate_signal_class("example", value_type=str) signal = signal_cls(value="{}", ts_event=1, ts_init=2) + signal_name = signal.__class__.__name__ + assert signal_name == "SignalExample" - data_type = signal.__name__ - metadata = "a=1,b=2" - signal_pyo3 = transform_signal_to_pyo3(signal, metadata) - self.database.add_signal(signal_pyo3) + self.database.add_signal(signal) - await eventually(lambda: len(self.database.load_signals(data_type, metadata))) + await eventually(lambda: len(self.database.load_signals(signal_cls, signal_name)) > 0) - signals = self.database.load_signals(data_type, metadata) + signals = self.database.load_signals(signal_cls, signal_name) assert len(signals) == 1 From 9a44f8ee476597867a76f188362c78981af03cdd Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 14 Oct 2024 11:09:28 +1100 Subject: [PATCH 125/224] Refine custom signal handling --- RELEASES.md | 2 + docs/concepts/advanced/custom_data.md | 5 +- docs/concepts/strategies.md | 1 + .../cache/postgres/transformers.py | 2 +- nautilus_trader/common/actor.pxd | 2 + nautilus_trader/common/actor.pyx | 49 +++++- nautilus_trader/common/signal.py | 111 +++++++++++++ nautilus_trader/core/inspect.py | 2 + nautilus_trader/persistence/writer.py | 94 ----------- nautilus_trader/test_kit/mocks/actors.py | 9 + nautilus_trader/test_kit/mocks/strategies.py | 9 + .../test_cache_database_postgres.py | 6 +- tests/unit_tests/common/test_actor.py | 157 +++++++++--------- .../unit_tests/persistence/test_streaming.py | 2 +- 14 files changed, 268 insertions(+), 183 deletions(-) create mode 100644 nautilus_trader/common/signal.py diff --git a/RELEASES.md b/RELEASES.md index fa05c86b66c6..83acb60c7e0f 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -10,6 +10,7 @@ Released on TBD (UTC). - Added `compute_effective_deltas` config setting for `PolymarketDataClientConfig`, reducing snapshot size (`False` by default to maintain current behavior) - Added rate limiter for `WebSocketClient` (#1994), thanks @Pushkarm029 - Added in the money probability field to GreeksData (#1995), thanks @faysou +- Added `on_signal(signal)` handler for custom signal data - Improved usability of `OrderBookDepth10` by filling partial levels with null orders and zero counts - Refined `DatabentoInstrumentProvider` handling of large bulks of instrument definitions (improved parent symbol support) - Standardized Betfair symbology to use hyphens instead of periods (prevents Betfair symbols being treated as composite) @@ -26,6 +27,7 @@ Released on TBD (UTC). ### Breaking Changes - Removed legacy `TardisQuoteDataLoader` (now redundant with new Rust implemented loader) - Removed legacy `TardisTradeDataLoader` (now redundant with new Rust implemented loader) +- Custom signals are now passed to `on_signal(signal)` instead of `on_data(data)` ### Fixes - Fixed `SocketClient` TLS implementation diff --git a/docs/concepts/advanced/custom_data.md b/docs/concepts/advanced/custom_data.md index 694a958c5340..7b84d0ef852a 100644 --- a/docs/concepts/advanced/custom_data.md +++ b/docs/concepts/advanced/custom_data.md @@ -111,9 +111,8 @@ A signal is an automatically generated custom data identified by a name containi self.publish_signal("signal_name", value, ts_event) self.subscribe_signal("signal_name") -def on_data(self, data): - if data.is_signal("signal_name"): - print("Signal", data) +def on_signal(self, signal): + print("Signal", data) ``` ## Option Greeks example diff --git a/docs/concepts/strategies.md b/docs/concepts/strategies.md index f17549f9b25e..95161900c0e9 100644 --- a/docs/concepts/strategies.md +++ b/docs/concepts/strategies.md @@ -110,6 +110,7 @@ def on_instrument_status(self, data: InstrumentStatus) -> None: def on_instrument_close(self, data: InstrumentClose) -> None: def on_historical_data(self, data: Data) -> None: def on_data(self, data: Data) -> None: # Custom data passed to this handler +def on_signal(self, signal: Data) -> None: # Custom signals passed to this handler ``` #### Order management diff --git a/nautilus_trader/cache/postgres/transformers.py b/nautilus_trader/cache/postgres/transformers.py index 2de3dcabe7db..b6b0abb2909b 100644 --- a/nautilus_trader/cache/postgres/transformers.py +++ b/nautilus_trader/cache/postgres/transformers.py @@ -345,7 +345,7 @@ def transform_bar_to_pyo3(bar: Bar): def transform_signal_to_pyo3(signal: Data) -> nautilus_pyo3.Signal: return nautilus_pyo3.Signal( signal.__class__.__name__, - signal.value, + str(signal.value), # PyO3 expects a `String` for this parameter signal.ts_event, signal.ts_init, ) diff --git a/nautilus_trader/common/actor.pxd b/nautilus_trader/common/actor.pxd index 79e08646ccea..c95a4914820b 100644 --- a/nautilus_trader/common/actor.pxd +++ b/nautilus_trader/common/actor.pxd @@ -96,6 +96,7 @@ cdef class Actor(Component): cpdef void on_trade_tick(self, TradeTick tick) cpdef void on_bar(self, Bar bar) cpdef void on_data(self, data) + cpdef void on_signal(self, signal) cpdef void on_historical_data(self, data) cpdef void on_event(self, Event event) @@ -247,6 +248,7 @@ cdef class Actor(Component): cpdef void handle_bar(self, Bar bar) cpdef void handle_bars(self, list bars) cpdef void handle_data(self, Data data) + cpdef void handle_signal(self, Data signal) cpdef void handle_instrument_status(self, InstrumentStatus data) cpdef void handle_instrument_close(self, InstrumentClose data) cpdef void handle_historical_data(self, data) diff --git a/nautilus_trader/common/actor.pyx b/nautilus_trader/common/actor.pyx index 6b06ed14286f..ffe63e26d2fc 100644 --- a/nautilus_trader/common/actor.pyx +++ b/nautilus_trader/common/actor.pyx @@ -33,6 +33,7 @@ from nautilus_trader.common.config import ActorConfig from nautilus_trader.common.config import ImportableActorConfig from nautilus_trader.common.executor import ActorExecutor from nautilus_trader.common.executor import TaskId +from nautilus_trader.common.signal import generate_signal_class from nautilus_trader.model.greeks import GreeksData from nautilus_trader.model.greeks import PortfolioGreeks @@ -448,6 +449,26 @@ cdef class Actor(Component): """ # Optionally override in subclass + cpdef void on_signal(self, signal): + """ + Actions to be performed when running and receives signal data. + + Parameters + ---------- + signal : Data + The signal received. + + Warnings + -------- + System method (not intended to be called by user code). + + Notes + ----- + This refers to a data signal, not an operating system signal (such as SIGTERM, SIGKILL, etc.). + + """ + # Optionally override in subclass + cpdef void on_historical_data(self, data): """ Actions to be performed when running and receives historical data. @@ -1830,7 +1851,6 @@ cdef class Actor(Component): If ``None`` then will timestamp current time. """ - from nautilus_trader.persistence.writer import generate_signal_class Condition.not_none(name, "name") Condition.not_none(value, "value") Condition.is_in(type(value), (int, float, str), "value", "int, float, str") @@ -1868,7 +1888,7 @@ cdef class Actor(Component): self._msgbus.subscribe( topic=f"data.{topic}", - handler=self.handle_data, + handler=self.handle_signal, ) # -- REQUESTS ------------------------------------------------------------------------------------- @@ -2756,6 +2776,31 @@ cdef class Actor(Component): self._log.exception(f"Error on handling {repr(data)}", e) raise + cpdef void handle_signal(self, Data signal): + """ + Handle the given signal. + + If state is ``RUNNING`` then passes to `on_signal`. + + Parameters + ---------- + signal : Data + The signal received. + + Warnings + -------- + System method (not intended to be called by user code). + + """ + Condition.not_none(signal, "signal") + + if self._fsm.state == ComponentState.RUNNING: + try: + self.on_signal(signal) + except Exception as e: + self._log.exception(f"Error on handling {repr(signal)}", e) + raise + cpdef void handle_historical_data(self, data): """ Handle the given historical data. diff --git a/nautilus_trader/common/signal.py b/nautilus_trader/common/signal.py new file mode 100644 index 000000000000..296cb1a8208f --- /dev/null +++ b/nautilus_trader/common/signal.py @@ -0,0 +1,111 @@ +# ------------------------------------------------------------------------------------------------- +# Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +# https://nautechsystems.io +# +# Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +# You may not use this file except in compliance with the License. +# You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ------------------------------------------------------------------------------------------------- + +import pyarrow as pa + +from nautilus_trader.core.data import Data +from nautilus_trader.serialization.arrow.serializer import register_arrow + + +def generate_signal_class(name: str, value_type: type) -> type: + """ + Dynamically create a Data subclass for this signal. + + Parameters + ---------- + name : str + The name of the signal data. + value_type : type + The type for the signal data value. + + Returns + ------- + SignalData + + """ + + class SignalData(Data): + """ + Represents generic signal data. + """ + + def __init__(self, value: object, ts_event: int, ts_init: int) -> None: + self.value = value + self._ts_event = ts_event + self._ts_init = ts_init + + @property + def ts_event(self) -> int: + """ + UNIX timestamp (nanoseconds) when the data event occurred. + + Returns + ------- + int + + """ + return self._ts_event + + @property + def ts_init(self) -> int: + """ + UNIX timestamp (nanoseconds) when the object was initialized. + + Returns + ------- + int + + """ + return self._ts_init + + SignalData.__name__ = f"Signal{name.title()}" + + # Parquet serialization + def serialize_signal(data: SignalData) -> pa.RecordBatch: + return pa.RecordBatch.from_pylist( + [ + { + "ts_init": data.ts_init, + "ts_event": data.ts_event, + "value": data.value, + }, + ], + schema=schema, + ) + + def deserialize_signal(table: pa.Table) -> list[SignalData]: + return [SignalData(**d) for d in table.to_pylist()] + + schema = pa.schema( + { + "ts_event": pa.uint64(), + "ts_init": pa.uint64(), + "value": { + int: pa.int64(), + float: pa.float64(), + str: pa.string(), + bool: pa.bool_(), + bytes: pa.binary(), + }[value_type], + }, + ) + register_arrow( + data_cls=SignalData, + encoder=serialize_signal, + decoder=deserialize_signal, + schema=schema, + ) + + return SignalData diff --git a/nautilus_trader/core/inspect.py b/nautilus_trader/core/inspect.py index eaf8caea2c3e..0f787caefdb4 100644 --- a/nautilus_trader/core/inspect.py +++ b/nautilus_trader/core/inspect.py @@ -29,6 +29,8 @@ def is_nautilus_class(cls: type) -> bool: if cls.__module__.startswith("nautilus_trader.model"): return True if cls.__module__.startswith("nautilus_trader.common"): + if cls.__name__.startswith("Signal"): + return False # Custom user signal return True if cls.__module__.startswith("nautilus_trader.test_kit"): return False diff --git a/nautilus_trader/persistence/writer.py b/nautilus_trader/persistence/writer.py index 81c1d0a2245e..6e7988f11159 100644 --- a/nautilus_trader/persistence/writer.py +++ b/nautilus_trader/persistence/writer.py @@ -29,7 +29,6 @@ from nautilus_trader.common.component import Clock from nautilus_trader.common.component import Logger from nautilus_trader.core.correctness import PyCondition -from nautilus_trader.core.data import Data from nautilus_trader.model.data import Bar from nautilus_trader.model.data import CustomData from nautilus_trader.model.data import OrderBookDelta @@ -40,7 +39,6 @@ from nautilus_trader.persistence.funcs import urisafe_instrument_id from nautilus_trader.serialization.arrow.serializer import ArrowSerializer from nautilus_trader.serialization.arrow.serializer import list_schemas -from nautilus_trader.serialization.arrow.serializer import register_arrow class RotationMode(Enum): @@ -494,95 +492,3 @@ def is_closed(self) -> bool: """ return all(self._files[table_name].closed for table_name in self._files) - - -def generate_signal_class(name: str, value_type: type) -> type: - """ - Dynamically create a Data subclass for this signal. - - Parameters - ---------- - name : str - The name of the signal data. - value_type : type - The type for the signal data value. - - Returns - ------- - SignalData - - """ - - class SignalData(Data): - """ - Represents generic signal data. - """ - - def __init__(self, value: Any, ts_event: int, ts_init: int) -> None: - self.value = value - self._ts_event = ts_event - self._ts_init = ts_init - - @property - def ts_event(self) -> int: - """ - UNIX timestamp (nanoseconds) when the data event occurred. - - Returns - ------- - int - - """ - return self._ts_event - - @property - def ts_init(self) -> int: - """ - UNIX timestamp (nanoseconds) when the object was initialized. - - Returns - ------- - int - - """ - return self._ts_init - - SignalData.__name__ = f"Signal{name.title()}" - - # Parquet serialization - def serialize_signal(data: SignalData) -> pa.RecordBatch: - return pa.RecordBatch.from_pylist( - [ - { - "ts_init": data.ts_init, - "ts_event": data.ts_event, - "value": data.value, - }, - ], - schema=schema, - ) - - def deserialize_signal(table: pa.Table) -> list[SignalData]: - return [SignalData(**d) for d in table.to_pylist()] - - schema = pa.schema( - { - "ts_event": pa.uint64(), - "ts_init": pa.uint64(), - "value": { - int: pa.int64(), - float: pa.float64(), - str: pa.string(), - bool: pa.bool_(), - bytes: pa.binary(), - }[value_type], - }, - ) - register_arrow( - data_cls=SignalData, - encoder=serialize_signal, - decoder=deserialize_signal, - schema=schema, - ) - - return SignalData diff --git a/nautilus_trader/test_kit/mocks/actors.py b/nautilus_trader/test_kit/mocks/actors.py index 1b1e8660bb04..636bae0a48bf 100644 --- a/nautilus_trader/test_kit/mocks/actors.py +++ b/nautilus_trader/test_kit/mocks/actors.py @@ -122,6 +122,12 @@ def on_data(self, data: Data) -> None: self.calls.append(current_frame.f_code.co_name) self.store.append(data) + def on_signal(self, signal: Data) -> None: + current_frame = inspect.currentframe() + if current_frame: + self.calls.append(current_frame.f_code.co_name) + self.store.append(signal) + def on_strategy_data(self, data: Data) -> None: current_frame = inspect.currentframe() if current_frame: @@ -190,5 +196,8 @@ def on_bar(self, bar: Bar) -> None: def on_data(self, data: Data) -> None: raise RuntimeError(f"{self} BOOM!") + def on_signal(self, signal: Data) -> None: + raise RuntimeError(f"{self} BOOM!") + def on_event(self, event: Event) -> None: raise RuntimeError(f"{self} BOOM!") diff --git a/nautilus_trader/test_kit/mocks/strategies.py b/nautilus_trader/test_kit/mocks/strategies.py index f70dc3ce4da1..49e1415d5fef 100644 --- a/nautilus_trader/test_kit/mocks/strategies.py +++ b/nautilus_trader/test_kit/mocks/strategies.py @@ -111,6 +111,12 @@ def on_data(self, data) -> None: self.calls.append(current_frame.f_code.co_name) self.store.append(data) + def on_signal(self, signal) -> None: + current_frame = inspect.currentframe() + assert current_frame # Type checking + self.calls.append(current_frame.f_code.co_name) + self.store.append(signal) + def on_strategy_data(self, data) -> None: current_frame = inspect.currentframe() assert current_frame # Type checking @@ -211,5 +217,8 @@ def on_bar(self, bar) -> None: def on_data(self, data) -> None: raise RuntimeError(f"{self} BOOM!") + def on_signal(self, data) -> None: + raise RuntimeError(f"{self} BOOM!") + def on_event(self, event) -> None: raise RuntimeError(f"{self} BOOM!") diff --git a/tests/integration_tests/infrastructure/test_cache_database_postgres.py b/tests/integration_tests/infrastructure/test_cache_database_postgres.py index 3419ecb4886d..6266586cf2af 100644 --- a/tests/integration_tests/infrastructure/test_cache_database_postgres.py +++ b/tests/integration_tests/infrastructure/test_cache_database_postgres.py @@ -22,6 +22,7 @@ from nautilus_trader.cache.postgres.adapter import CachePostgresAdapter from nautilus_trader.common.component import MessageBus from nautilus_trader.common.component import TestClock +from nautilus_trader.common.signal import generate_signal_class from nautilus_trader.core.nautilus_pyo3 import AggressorSide from nautilus_trader.core.uuid import UUID4 from nautilus_trader.model.data import Bar @@ -41,7 +42,6 @@ from nautilus_trader.model.objects import Money from nautilus_trader.model.objects import Price from nautilus_trader.model.objects import Quantity -from nautilus_trader.persistence.writer import generate_signal_class from nautilus_trader.portfolio.portfolio import Portfolio from nautilus_trader.test_kit.functions import eventually from nautilus_trader.test_kit.providers import TestInstrumentProvider @@ -608,8 +608,8 @@ async def test_add_and_load_bars(self): @pytest.mark.asyncio async def test_add_and_load_signals(self): - signal_cls = generate_signal_class("example", value_type=str) - signal = signal_cls(value="{}", ts_event=1, ts_init=2) + signal_cls = generate_signal_class("example", value_type=float) + signal = signal_cls(value=1.0, ts_event=1, ts_init=2) signal_name = signal.__class__.__name__ assert signal_name == "SignalExample" diff --git a/tests/unit_tests/common/test_actor.py b/tests/unit_tests/common/test_actor.py index 9f23186facbd..e8ac2eec52b9 100644 --- a/tests/unit_tests/common/test_actor.py +++ b/tests/unit_tests/common/test_actor.py @@ -23,6 +23,7 @@ from nautilus_trader.common.component import TestClock from nautilus_trader.common.enums import ComponentState from nautilus_trader.common.executor import TaskId +from nautilus_trader.common.signal import generate_signal_class from nautilus_trader.config import ActorConfig from nautilus_trader.config import ImportableActorConfig from nautilus_trader.core.data import Data @@ -181,12 +182,9 @@ def test_register_warning_event(self) -> None: clock=self.clock, ) - # Act + # Act, Assert (exception not raised) actor.register_warning_event(OrderDenied) - # Assert - assert True # Exception not raised - def test_deregister_warning_event(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -199,12 +197,9 @@ def test_deregister_warning_event(self) -> None: actor.register_warning_event(OrderDenied) - # Act + # Act, Assert (exception not raised) actor.deregister_warning_event(OrderDenied) - # Assert - assert True # Exception not raised - def test_handle_event(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -217,12 +212,9 @@ def test_handle_event(self) -> None: event = TestEventStubs.cash_account_state() - # Act + # Act, Assert (exception not raised) actor.handle_event(event) - # Assert - assert True # Exception not raised - def test_on_start_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -233,12 +225,9 @@ def test_on_start_when_not_overridden_does_nothing(self) -> None: clock=self.clock, ) - # Act + # Act, Assert (exception not raised) actor.on_start() - # Assert - assert True # Exception not raised - def test_on_stop_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -249,12 +238,9 @@ def test_on_stop_when_not_overridden_does_nothing(self) -> None: clock=self.clock, ) - # Act + # Act, Assert (exception not raised) actor.on_stop() - # Assert - assert True # Exception not raised - def test_on_resume_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -265,12 +251,9 @@ def test_on_resume_when_not_overridden_does_nothing(self) -> None: clock=self.clock, ) - # Act + # Act, Assert (exception not raised) actor.on_resume() - # Assert - assert True # Exception not raised - def test_on_reset_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -281,12 +264,9 @@ def test_on_reset_when_not_overridden_does_nothing(self) -> None: clock=self.clock, ) - # Act + # Act, Assert (exception not raised) actor.on_reset() - # Assert - assert True # Exception not raised - def test_on_dispose_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -297,12 +277,9 @@ def test_on_dispose_when_not_overridden_does_nothing(self) -> None: clock=self.clock, ) - # Act + # Act, Assert (exception not raised) actor.on_dispose() - # Assert - assert True # Exception not raised - def test_on_degrade_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -313,12 +290,9 @@ def test_on_degrade_when_not_overridden_does_nothing(self) -> None: clock=self.clock, ) - # Act + # Act, Assert (exception not raised) actor.on_degrade() - # Assert - assert True # Exception not raised - def test_on_fault_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -329,12 +303,9 @@ def test_on_fault_when_not_overridden_does_nothing(self) -> None: clock=self.clock, ) - # Act + # Act, Assert (exception not raised) actor.on_fault() - # Assert - assert True # Exception not raised - def test_on_instrument_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -345,12 +316,9 @@ def test_on_instrument_when_not_overridden_does_nothing(self) -> None: clock=self.clock, ) - # Act + # Act, Assert (exception not raised) actor.on_instrument(TestInstrumentProvider.btcusdt_binance()) - # Assert - assert True # Exception not raised - def test_on_order_book_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -361,12 +329,9 @@ def test_on_order_book_when_not_overridden_does_nothing(self) -> None: clock=self.clock, ) - # Act + # Act, Assert (exception not raised) actor.on_order_book(TestDataStubs.order_book()) - # Assert - assert True # Exception not raised - def test_on_order_book_delta_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -377,12 +342,9 @@ def test_on_order_book_delta_when_not_overridden_does_nothing(self) -> None: clock=self.clock, ) - # Act + # Act, Assert (exception not raised) actor.on_order_book_deltas(TestDataStubs.order_book_snapshot()) - # Assert - assert True # Exception not raised - def test_on_instrument_status_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -393,12 +355,9 @@ def test_on_instrument_status_when_not_overridden_does_nothing(self) -> None: clock=self.clock, ) - # Act + # Act, Assert (exception not raised) actor.on_instrument_status(TestDataStubs.instrument_status()) - # Assert - assert True # Exception not raised - def test_on_event_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -409,12 +368,9 @@ def test_on_event_when_not_overridden_does_nothing(self) -> None: clock=self.clock, ) - # Act + # Act, Assert (exception not raised) actor.on_event(TestEventStubs.cash_account_state()) - # Assert - assert True # Exception not raised - def test_on_quote_tick_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -427,12 +383,9 @@ def test_on_quote_tick_when_not_overridden_does_nothing(self) -> None: tick = TestDataStubs.quote_tick() - # Act + # Act, Assert (exception not raised) actor.on_quote_tick(tick) - # Assert - assert True # Exception not raised - def test_on_trade_tick_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -445,12 +398,9 @@ def test_on_trade_tick_when_not_overridden_does_nothing(self) -> None: tick = TestDataStubs.trade_tick() - # Act + # Act, Assert (exception not raised) actor.on_trade_tick(tick) - # Assert - assert True # Exception not raised - def test_on_bar_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -463,12 +413,9 @@ def test_on_bar_when_not_overridden_does_nothing(self) -> None: bar = TestDataStubs.bar_5decimal() - # Act + # Act, Assert (exception not raised) actor.on_bar(bar) - # Assert - assert True # Exception not raised - def test_on_historical_data_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -481,12 +428,9 @@ def test_on_historical_data_when_not_overridden_does_nothing(self) -> None: bar = TestDataStubs.bar_5decimal() - # Act + # Act, Assert (exception not raised) actor.on_historical_data(bar) - # Assert - assert True # Exception not raised - def test_on_data_when_not_overridden_does_nothing(self) -> None: # Arrange actor = Actor(config=ActorConfig(component_id=self.component_id)) @@ -505,11 +449,24 @@ def test_on_data_when_not_overridden_does_nothing(self) -> None: ts_init=0, ) - # Act + # Act, Assert (exception not raised) actor.on_data(news_event) - # Assert - assert True # Exception not raised + def test_on_signal_when_not_overridden_does_nothing(self) -> None: + # Arrange + actor = Actor(config=ActorConfig(component_id=self.component_id)) + actor.register_base( + portfolio=self.portfolio, + msgbus=self.msgbus, + cache=self.cache, + clock=self.clock, + ) + + signal_cls = generate_signal_class("example", value_type=float) + signal = signal_cls(1.0, 0, 0) + + # Act, Assert (exception not raised) + actor.on_signal(signal) def test_start_when_invalid_state_does_not_start(self) -> None: # Arrange @@ -1274,6 +1231,48 @@ def test_handle_data_when_running_sends_to_on_data(self) -> None: assert actor.calls == ["on_start", "on_data"] assert actor.store[0] == data + def test_handle_signal_when_not_running_does_not_send_to_on_signal(self) -> None: + # Arrange + actor = MockActor() + actor.register_base( + portfolio=self.portfolio, + msgbus=self.msgbus, + cache=self.cache, + clock=self.clock, + ) + + signal_cls = generate_signal_class("example", value_type=float) + signal = signal_cls(1.0, 0, 0) + + # Act + actor.handle_signal(signal) + + # Assert + assert actor.calls == [] + assert actor.store == [] + + def test_handle_signal_when_running_sends_to_on_signal(self) -> None: + # Arrange + actor = MockActor() + actor.register_base( + portfolio=self.portfolio, + msgbus=self.msgbus, + cache=self.cache, + clock=self.clock, + ) + + actor.start() + + signal_cls = generate_signal_class("example", value_type=float) + signal = signal_cls(1.0, 0, 0) + + # Act + actor.handle_signal(signal) + + # Assert + assert actor.calls == ["on_start", "on_signal"] + assert actor.store[0] == signal + def test_add_synthetic_instrument_when_already_exists(self) -> None: # Arrange actor = MockActor() diff --git a/tests/unit_tests/persistence/test_streaming.py b/tests/unit_tests/persistence/test_streaming.py index 20ee61bca9d8..e6d0daa1491b 100644 --- a/tests/unit_tests/persistence/test_streaming.py +++ b/tests/unit_tests/persistence/test_streaming.py @@ -18,6 +18,7 @@ from nautilus_trader.backtest.node import BacktestNode from nautilus_trader.backtest.results import BacktestResult +from nautilus_trader.common.signal import generate_signal_class from nautilus_trader.config import BacktestDataConfig from nautilus_trader.config import BacktestEngineConfig from nautilus_trader.config import BacktestRunConfig @@ -31,7 +32,6 @@ from nautilus_trader.model.data import TradeTick from nautilus_trader.model.identifiers import InstrumentId from nautilus_trader.persistence.catalog.parquet import ParquetDataCatalog -from nautilus_trader.persistence.writer import generate_signal_class from nautilus_trader.test_kit.mocks.data import NewsEventData from nautilus_trader.test_kit.stubs.persistence import TestPersistenceStubs from tests.integration_tests.adapters.betfair.test_kit import BetfairTestStubs From 43fe1f1a1b9058d26d752408159ada4f3d78dad7 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 14 Oct 2024 12:05:24 +1100 Subject: [PATCH 126/224] Add DataType and CustomData for pyo3 --- nautilus_core/Cargo.lock | 1 + nautilus_core/Cargo.toml | 2 +- nautilus_core/common/src/custom.rs | 46 ++++++++++++++++ nautilus_core/common/src/lib.rs | 1 + nautilus_core/common/src/python/custom.rs | 64 ++++++++++++++++++++++ nautilus_core/common/src/python/mod.rs | 2 + nautilus_core/common/src/signal.rs | 2 + nautilus_core/model/src/data/mod.rs | 7 ++- nautilus_core/model/src/python/data/mod.rs | 29 +++++++++- nautilus_core/model/src/python/mod.rs | 1 + nautilus_trader/core/nautilus_pyo3.pyi | 26 +++++++++ 11 files changed, 178 insertions(+), 3 deletions(-) create mode 100644 nautilus_core/common/src/custom.rs create mode 100644 nautilus_core/common/src/python/custom.rs diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index f36cce6c7bcb..2e12aa01087c 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -3718,6 +3718,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5e00b96a521718e08e03b1a622f01c8a8deb50719335de3f60b3b3950f069d8" dependencies = [ "cfg-if", + "indexmap", "indoc", "libc", "memoffset", diff --git a/nautilus_core/Cargo.toml b/nautilus_core/Cargo.toml index 99f45be8fefc..643b6124d4df 100644 --- a/nautilus_core/Cargo.toml +++ b/nautilus_core/Cargo.toml @@ -40,7 +40,7 @@ itertools = "0.12.1" itoa = "1.0.11" once_cell = "1.20.2" log = { version = "0.4.22", features = ["std", "kv_unstable", "serde", "release_max_level_debug"] } -pyo3 = { version = "0.21.2", features = ["rust_decimal"] } +pyo3 = { version = "0.21.2", features = ["rust_decimal", "indexmap"] } pyo3-asyncio-0-21 = { version = "0.21.0", features = ["tokio-runtime", "tokio", "attributes"] } rand = "0.8.5" reqwest = { version = "0.12.8", features = ["blocking"] } diff --git a/nautilus_core/common/src/custom.rs b/nautilus_core/common/src/custom.rs new file mode 100644 index 000000000000..eb27aea809b3 --- /dev/null +++ b/nautilus_core/common/src/custom.rs @@ -0,0 +1,46 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +//! A user custom data type. + +use nautilus_core::nanos::UnixNanos; +use nautilus_model::data::DataType; +use serde::{Deserialize, Serialize}; + +/// Represents a custom data. +#[repr(C)] +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[cfg_attr( + feature = "python", + pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.common") +)] +pub struct CustomData { + pub data_type: DataType, + pub data: String, // Flexible for now + pub ts_event: UnixNanos, + pub ts_init: UnixNanos, +} + +impl CustomData { + /// Creates a new [`CustomData`] instance. + pub fn new(data_type: DataType, data: String, ts_event: UnixNanos, ts_init: UnixNanos) -> Self { + Self { + data_type, + data, + ts_event, + ts_init, + } + } +} diff --git a/nautilus_core/common/src/lib.rs b/nautilus_core/common/src/lib.rs index 21d90418fc34..632170d8dc33 100644 --- a/nautilus_core/common/src/lib.rs +++ b/nautilus_core/common/src/lib.rs @@ -32,6 +32,7 @@ pub mod actor; pub mod cache; pub mod clock; pub mod component; +pub mod custom; pub mod enums; pub mod factories; pub mod generators; diff --git a/nautilus_core/common/src/python/custom.rs b/nautilus_core/common/src/python/custom.rs new file mode 100644 index 000000000000..dc7e723957da --- /dev/null +++ b/nautilus_core/common/src/python/custom.rs @@ -0,0 +1,64 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use std::{collections::HashMap, ops::Deref}; + +use nautilus_core::{nanos::UnixNanos, time::AtomicTime}; +use nautilus_model::data::DataType; +use pyo3::{ + prelude::*, + types::{PyString, PyTuple}, +}; +use ustr::Ustr; + +use super::timer::TimeEventHandler_Py; +use crate::custom::CustomData; + +#[pymethods] +impl CustomData { + #[new] + fn py_new(data_type: DataType, data: String, ts_event: u64, ts_init: u64) -> Self { + Self::new( + data_type, + data, + UnixNanos::from(ts_event), + UnixNanos::from(ts_init), + ) + } + + #[getter] + #[pyo3(name = "data_type")] + fn py_data_type(&self) -> DataType { + self.data_type.clone() + } + + #[getter] + #[pyo3(name = "data")] + fn py_data(&self) -> &str { + self.data.as_str() + } + + #[getter] + #[pyo3(name = "ts_event")] + fn py_ts_event(&self) -> u64 { + self.ts_event.as_u64() + } + + #[getter] + #[pyo3(name = "ts_init")] + fn py_ts_init(&self) -> u64 { + self.ts_init.as_u64() + } +} diff --git a/nautilus_core/common/src/python/mod.rs b/nautilus_core/common/src/python/mod.rs index 7b41d2bf5e7a..1dfbdd9d1134 100644 --- a/nautilus_core/common/src/python/mod.rs +++ b/nautilus_core/common/src/python/mod.rs @@ -18,6 +18,7 @@ #![allow(warnings)] // non-local `impl` definition, temporary allow until pyo3 upgrade pub mod clock; +pub mod custom; pub mod enums; pub mod handler; pub mod logging; @@ -31,6 +32,7 @@ use pyo3::prelude::*; /// Loaded as nautilus_pyo3.common #[pymodule] pub fn common(_: Python<'_>, m: &PyModule) -> PyResult<()> { + m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; diff --git a/nautilus_core/common/src/signal.rs b/nautilus_core/common/src/signal.rs index c9dc81716b2b..f49eaa84d100 100644 --- a/nautilus_core/common/src/signal.rs +++ b/nautilus_core/common/src/signal.rs @@ -13,6 +13,8 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- +//! A user signal type. + use std::fmt::Debug; use nautilus_core::nanos::UnixNanos; diff --git a/nautilus_core/model/src/data/mod.rs b/nautilus_core/model/src/data/mod.rs index d0a9ea978063..93ea7c61a2bd 100644 --- a/nautilus_core/model/src/data/mod.rs +++ b/nautilus_core/model/src/data/mod.rs @@ -37,6 +37,7 @@ use std::{ use bar::BarType; use indexmap::IndexMap; use nautilus_core::nanos::UnixNanos; +use serde::{Deserialize, Serialize}; use self::{ bar::Bar, delta::OrderBookDelta, deltas::OrderBookDeltas_API, depth::OrderBookDepth10, @@ -146,7 +147,11 @@ pub extern "C" fn data_clone(data: &Data) -> Data { } /// Represents a data type including metadata. -#[derive(Clone)] +#[derive(Clone, Serialize, Deserialize)] +#[cfg_attr( + feature = "python", + pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.model") +)] pub struct DataType { type_name: String, metadata: Option>, diff --git a/nautilus_core/model/src/python/data/mod.rs b/nautilus_core/model/src/python/data/mod.rs index 6015a56cfc2d..88728c1e6b3d 100644 --- a/nautilus_core/model/src/python/data/mod.rs +++ b/nautilus_core/model/src/python/data/mod.rs @@ -25,11 +25,38 @@ pub mod quote; pub mod status; pub mod trade; +use indexmap::IndexMap; #[cfg(feature = "ffi")] use nautilus_core::ffi::cvec::CVec; use pyo3::{prelude::*, types::PyCapsule}; -use crate::data::Data; +use crate::data::{Data, DataType}; + +#[pymethods] +impl DataType { + #[new] + fn py_new(type_name: &str, metadata: Option>) -> Self { + Self::new(type_name, metadata) + } + + #[getter] + #[pyo3(name = "type_name")] + fn py_type_name(&self) -> &str { + self.type_name() + } + + #[getter] + #[pyo3(name = "metadata")] + fn py_metadata(&self) -> Option> { + self.metadata().cloned() + } + + #[getter] + #[pyo3(name = "topic")] + fn py_topic(&self) -> &str { + self.topic() + } +} /// Creates a Python `PyCapsule` object containing a Rust `Data` instance. /// diff --git a/nautilus_core/model/src/python/mod.rs b/nautilus_core/model/src/python/mod.rs index 9c9a3cd99216..855384de32dc 100644 --- a/nautilus_core/model/src/python/mod.rs +++ b/nautilus_core/model/src/python/mod.rs @@ -37,6 +37,7 @@ pub mod types; pub fn model(_: Python<'_>, m: &PyModule) -> PyResult<()> { // Data m.add_function(wrap_pyfunction!(data::drop_cvec_pycapsule, m)?)?; + m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index 83d3bed9d57e..15afef33d31c 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -267,10 +267,36 @@ class Signal: @property def ts_init(self) -> int: ... +class CustomData: + def __init__( + self, + data_type: DataType, + data: str, + ts_event: int, + ts_init: int, + ) -> None: ... + @property + def data_type(self) -> DataType: ... + @property + def data(self) -> str: ... + @property + def ts_event(self) -> int: ... + @property + def ts_init(self) -> int: ... + ################################################################################################### # Model ################################################################################################### +class DataType: + def __init__(self, type_name: str, metadata: dict[str, str] | None = None) -> None: ... + @property + def type_name(self) -> str: ... + @property + def metadata(self) -> dict[str, str] | None: ... + @property + def topic(self) -> str: ... + # Accounting class Position: From 52fe70a470af231ab27722f9fe1a4625cd564152 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 14 Oct 2024 13:29:02 +1100 Subject: [PATCH 127/224] Add custom data handling for postgres --- nautilus_core/Cargo.lock | 1 + nautilus_core/common/src/cache/database.rs | 8 ++- nautilus_core/common/src/custom.rs | 11 +++- nautilus_core/common/src/python/custom.rs | 10 +-- nautilus_core/infrastructure/Cargo.toml | 1 + .../infrastructure/src/python/sql/cache.rs | 18 +++++- .../infrastructure/src/redis/cache.rs | 15 ++++- nautilus_core/infrastructure/src/sql/cache.rs | 38 +++++++++++- .../infrastructure/src/sql/models/types.rs | 24 +++++++- .../infrastructure/src/sql/queries.rs | 61 ++++++++++++++++++- .../tests/test_cache_database_postgres.rs | 35 ++++++++++- nautilus_core/model/src/data/mod.rs | 9 +++ nautilus_trader/cache/postgres/adapter.py | 14 +++++ .../cache/postgres/transformers.py | 38 +++++++++++- nautilus_trader/core/nautilus_pyo3.pyi | 6 +- schema/tables.sql | 11 ++++ .../test_cache_database_postgres.py | 25 ++++++++ 17 files changed, 298 insertions(+), 27 deletions(-) diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 2e12aa01087c..770b8ec7decf 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -2899,6 +2899,7 @@ dependencies = [ "chrono", "derive_builder", "futures", + "indexmap", "log", "nautilus-common", "nautilus-core", diff --git a/nautilus_core/common/src/cache/database.rs b/nautilus_core/common/src/cache/database.rs index cf84797089fb..a667e7d5234b 100644 --- a/nautilus_core/common/src/cache/database.rs +++ b/nautilus_core/common/src/cache/database.rs @@ -25,7 +25,7 @@ use bytes::Bytes; use nautilus_core::nanos::UnixNanos; use nautilus_model::{ accounts::any::AccountAny, - data::{bar::Bar, quote::QuoteTick, trade::TradeTick}, + data::{bar::Bar, quote::QuoteTick, trade::TradeTick, DataType}, identifiers::{ AccountId, ClientId, ClientOrderId, ComponentId, InstrumentId, PositionId, StrategyId, VenueOrderId, @@ -38,7 +38,7 @@ use nautilus_model::{ }; use ustr::Ustr; -use crate::signal::Signal; +use crate::{custom::CustomData, signal::Signal}; pub trait CacheDatabaseAdapter { fn close(&mut self) -> anyhow::Result<()>; @@ -122,6 +122,10 @@ pub trait CacheDatabaseAdapter { fn load_signals(&mut self, name: &str) -> anyhow::Result>; + fn add_custom_data(&mut self, data: &CustomData) -> anyhow::Result<()>; + + fn load_custom_data(&mut self, data_type: &DataType) -> anyhow::Result>; + fn index_venue_order_id( &mut self, client_order_id: ClientOrderId, diff --git a/nautilus_core/common/src/custom.rs b/nautilus_core/common/src/custom.rs index eb27aea809b3..df373b6c19c8 100644 --- a/nautilus_core/common/src/custom.rs +++ b/nautilus_core/common/src/custom.rs @@ -28,17 +28,22 @@ use serde::{Deserialize, Serialize}; )] pub struct CustomData { pub data_type: DataType, - pub data: String, // Flexible for now + pub value: String, // Flexible for now pub ts_event: UnixNanos, pub ts_init: UnixNanos, } impl CustomData { /// Creates a new [`CustomData`] instance. - pub fn new(data_type: DataType, data: String, ts_event: UnixNanos, ts_init: UnixNanos) -> Self { + pub fn new( + data_type: DataType, + value: String, + ts_event: UnixNanos, + ts_init: UnixNanos, + ) -> Self { Self { data_type, - data, + value, ts_event, ts_init, } diff --git a/nautilus_core/common/src/python/custom.rs b/nautilus_core/common/src/python/custom.rs index dc7e723957da..7adc73da4510 100644 --- a/nautilus_core/common/src/python/custom.rs +++ b/nautilus_core/common/src/python/custom.rs @@ -29,10 +29,10 @@ use crate::custom::CustomData; #[pymethods] impl CustomData { #[new] - fn py_new(data_type: DataType, data: String, ts_event: u64, ts_init: u64) -> Self { + fn py_new(data_type: DataType, value: String, ts_event: u64, ts_init: u64) -> Self { Self::new( data_type, - data, + value, UnixNanos::from(ts_event), UnixNanos::from(ts_init), ) @@ -45,9 +45,9 @@ impl CustomData { } #[getter] - #[pyo3(name = "data")] - fn py_data(&self) -> &str { - self.data.as_str() + #[pyo3(name = "value")] + fn py_value(&self) -> &str { + self.value.as_str() } #[getter] diff --git a/nautilus_core/infrastructure/Cargo.toml b/nautilus_core/infrastructure/Cargo.toml index 9028d5d3208b..437ce1df9ccc 100644 --- a/nautilus_core/infrastructure/Cargo.toml +++ b/nautilus_core/infrastructure/Cargo.toml @@ -19,6 +19,7 @@ bytes = { workspace = true } chrono = { workspace = true } derive_builder = { workspace = true } futures = { workspace = true } +indexmap = { workspace = true } pyo3 = { workspace = true, optional = true } pyo3-asyncio-0-21 = { workspace = true, optional = true } log = { workspace = true } # Required until Cython gone diff --git a/nautilus_core/infrastructure/src/python/sql/cache.rs b/nautilus_core/infrastructure/src/python/sql/cache.rs index 322c969e0f67..09a1c2523fde 100644 --- a/nautilus_core/infrastructure/src/python/sql/cache.rs +++ b/nautilus_core/infrastructure/src/python/sql/cache.rs @@ -17,11 +17,11 @@ use std::collections::HashMap; use bytes::Bytes; use nautilus_common::{ - cache::database::CacheDatabaseAdapter, runtime::get_runtime, signal::Signal, + cache::database::CacheDatabaseAdapter, custom::CustomData, runtime::get_runtime, signal::Signal, }; use nautilus_core::python::to_pyruntime_err; use nautilus_model::{ - data::{bar::Bar, quote::QuoteTick, trade::TradeTick}, + data::{bar::Bar, quote::QuoteTick, trade::TradeTick, DataType}, identifiers::{AccountId, ClientId, ClientOrderId, InstrumentId}, python::{ account::{convert_account_any_to_pyobject, convert_pyobject_to_account_any}, @@ -303,4 +303,18 @@ impl PostgresCacheDatabase { .map_err(to_pyruntime_err) }) } + + #[pyo3(name = "add_custom_data")] + fn py_add_custom_data(mut slf: PyRefMut<'_, Self>, data: CustomData) -> PyResult<()> { + slf.add_custom_data(&data).map_err(to_pyruntime_err) + } + + #[pyo3(name = "load_custom_data")] + fn py_load_custom_data(slf: PyRef<'_, Self>, data_type: DataType) -> PyResult> { + get_runtime().block_on(async { + DatabaseQueries::load_custom_data(&slf.pool, &data_type) + .await + .map_err(to_pyruntime_err) + }) + } } diff --git a/nautilus_core/infrastructure/src/redis/cache.rs b/nautilus_core/infrastructure/src/redis/cache.rs index a99aead3f593..7e565cce1bff 100644 --- a/nautilus_core/infrastructure/src/redis/cache.rs +++ b/nautilus_core/infrastructure/src/redis/cache.rs @@ -22,6 +22,7 @@ use std::{ use bytes::Bytes; use nautilus_common::{ cache::{database::CacheDatabaseAdapter, CacheConfig}, + custom::CustomData, enums::SerializationEncoding, runtime::get_runtime, signal::Signal, @@ -29,7 +30,7 @@ use nautilus_common::{ use nautilus_core::{correctness::check_slice_not_empty, nanos::UnixNanos, uuid::UUID4}; use nautilus_model::{ accounts::any::AccountAny, - data::{bar::Bar, quote::QuoteTick, trade::TradeTick}, + data::{bar::Bar, quote::QuoteTick, trade::TradeTick, DataType}, identifiers::{ AccountId, ClientId, ClientOrderId, ComponentId, InstrumentId, PositionId, StrategyId, TraderId, VenueOrderId, @@ -893,6 +894,10 @@ impl CacheDatabaseAdapter for RedisCacheDatabaseAdapter { anyhow::bail!("Saving market data for Redis cache adapter not supported") } + fn load_bars(&mut self, instrument_id: &InstrumentId) -> anyhow::Result> { + anyhow::bail!("Loading market data for Redis cache adapter not supported") + } + fn add_signal(&mut self, signal: &Signal) -> anyhow::Result<()> { anyhow::bail!("Saving signals for Redis cache adapter not supported") } @@ -901,8 +906,12 @@ impl CacheDatabaseAdapter for RedisCacheDatabaseAdapter { anyhow::bail!("Loading signals from Redis cache adapter not supported") } - fn load_bars(&mut self, instrument_id: &InstrumentId) -> anyhow::Result> { - anyhow::bail!("Loading market data for Redis cache adapter not supported") + fn add_custom_data(&mut self, data: &CustomData) -> anyhow::Result<()> { + anyhow::bail!("Saving custom data for Redis cache adapter not supported") + } + + fn load_custom_data(&mut self, data_type: &DataType) -> anyhow::Result> { + anyhow::bail!("Loading custom data from Redis cache adapter not supported") } fn index_venue_order_id( diff --git a/nautilus_core/infrastructure/src/sql/cache.rs b/nautilus_core/infrastructure/src/sql/cache.rs index 9c1da9870e6b..662909a6c91c 100644 --- a/nautilus_core/infrastructure/src/sql/cache.rs +++ b/nautilus_core/infrastructure/src/sql/cache.rs @@ -19,11 +19,11 @@ use std::{ }; use bytes::Bytes; -use nautilus_common::{cache::database::CacheDatabaseAdapter, signal::Signal}; +use nautilus_common::{cache::database::CacheDatabaseAdapter, custom::CustomData, signal::Signal}; use nautilus_core::nanos::UnixNanos; use nautilus_model::{ accounts::any::AccountAny, - data::{bar::Bar, quote::QuoteTick, trade::TradeTick}, + data::{bar::Bar, quote::QuoteTick, trade::TradeTick, DataType}, identifiers::{ AccountId, ClientId, ClientOrderId, ComponentId, InstrumentId, PositionId, StrategyId, VenueOrderId, @@ -71,6 +71,7 @@ pub enum DatabaseQuery { AddQuote(QuoteTick), AddBar(Bar), AddSignal(Signal), + AddCustom(CustomData), } fn get_buffer_interval() -> Duration { @@ -232,6 +233,9 @@ async fn drain_buffer(pool: &PgPool, buffer: &mut VecDeque) { DatabaseQuery::AddSignal(signal) => { DatabaseQueries::add_signal(pool, &signal).await.unwrap(); } + DatabaseQuery::AddCustom(data) => { + DatabaseQueries::add_custom_data(pool, &data).await.unwrap(); + } } } } @@ -801,6 +805,36 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { Ok(rx.recv()?) } + fn add_custom_data(&mut self, data: &CustomData) -> anyhow::Result<()> { + let query = DatabaseQuery::AddCustom(data.to_owned()); + self.tx.send(query).map_err(|e| { + anyhow::anyhow!("Failed to send query add_signal to database message handler: {e}") + }) + } + + fn load_custom_data(&mut self, data_type: &DataType) -> anyhow::Result> { + let pool = self.pool.clone(); + let data_type = data_type.to_owned(); + let (tx, rx) = std::sync::mpsc::channel(); + tokio::spawn(async move { + let result = DatabaseQueries::load_custom_data(&pool, &data_type).await; + match result { + Ok(signals) => { + if let Err(e) = tx.send(signals) { + log::error!("Failed to send custom data for '{data_type}': {e:?}"); + } + } + Err(e) => { + log::error!("Failed to load custom data for '{data_type}': {e:?}"); + if let Err(e) = tx.send(Vec::new()) { + log::error!("Failed to send empty custom data for '{data_type}': {e:?}"); + } + } + } + }); + Ok(rx.recv()?) + } + fn index_venue_order_id( &mut self, client_order_id: ClientOrderId, diff --git a/nautilus_core/infrastructure/src/sql/models/types.rs b/nautilus_core/infrastructure/src/sql/models/types.rs index 4936d1060aa9..7d1463a1abbb 100644 --- a/nautilus_core/infrastructure/src/sql/models/types.rs +++ b/nautilus_core/infrastructure/src/sql/models/types.rs @@ -13,9 +13,10 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- -use nautilus_common::signal::Signal; +use indexmap::IndexMap; +use nautilus_common::{custom::CustomData, signal::Signal}; use nautilus_core::nanos::UnixNanos; -use nautilus_model::types::currency::Currency; +use nautilus_model::{data::DataType, types::currency::Currency}; use sqlx::{postgres::PgRow, FromRow, Row}; use ustr::Ustr; @@ -23,6 +24,7 @@ use crate::sql::models::enums::CurrencyTypeModel; pub struct CurrencyModel(pub Currency); pub struct SignalModel(pub Signal); +pub struct CustomDataModel(pub CustomData); impl<'r> FromRow<'r, PgRow> for CurrencyModel { fn from_row(row: &'r PgRow) -> Result { @@ -52,3 +54,21 @@ impl<'r> FromRow<'r, PgRow> for SignalModel { Ok(SignalModel(signal)) } } + +impl<'r> FromRow<'r, PgRow> for CustomDataModel { + fn from_row(row: &'r PgRow) -> Result { + let type_name = row.try_get::<&str, _>("data_type")?; + let metadata_json: Option = + row.try_get::, _>("metadata")?; + let metadata: Option> = match metadata_json { + Some(json_value) => serde_json::from_value(json_value).unwrap_or(None), // Handle deserialization + None => None, + }; + let data_type = DataType::new(type_name, metadata); + let value = row.try_get::("value")?; + let ts_event = row.try_get::<&str, _>("ts_event").map(UnixNanos::from)?; + let ts_init = row.try_get::<&str, _>("ts_init").map(UnixNanos::from)?; + let custom = CustomData::new(data_type, value, ts_event, ts_init); + Ok(CustomDataModel(custom)) + } +} diff --git a/nautilus_core/infrastructure/src/sql/queries.rs b/nautilus_core/infrastructure/src/sql/queries.rs index 52b917538f24..68fff8a1ad7d 100644 --- a/nautilus_core/infrastructure/src/sql/queries.rs +++ b/nautilus_core/infrastructure/src/sql/queries.rs @@ -15,10 +15,10 @@ use std::collections::HashMap; -use nautilus_common::signal::Signal; +use nautilus_common::{custom::CustomData, signal::Signal}; use nautilus_model::{ accounts::{any::AccountAny, base::Account}, - data::{bar::Bar, quote::QuoteTick, trade::TradeTick}, + data::{bar::Bar, quote::QuoteTick, trade::TradeTick, DataType}, events::{ account::state::AccountState, order::{OrderEvent, OrderEventAny}, @@ -31,9 +31,10 @@ use nautilus_model::{ currency::Currency, }, }; +use serde_json::Value; use sqlx::{PgPool, Row}; -use super::models::types::SignalModel; +use super::models::types::{CustomDataModel, SignalModel}; use crate::sql::models::{ accounts::AccountEventModel, data::{BarModel, QuoteTickModel, TradeTickModel}, @@ -770,4 +771,58 @@ impl DatabaseQueries { .map(|rows| rows.into_iter().map(|row| row.0).collect()) .map_err(|e| anyhow::anyhow!("Failed to load signals: {e}")) } + + pub async fn add_custom_data(pool: &PgPool, data: &CustomData) -> anyhow::Result<()> { + sqlx::query( + r#" + INSERT INTO "custom" ( + data_type, metadata, value, ts_event, ts_init, created_at, updated_at + ) VALUES ( + $1, $2, $3, $4, $5, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP + ) + ON CONFLICT (id) + DO UPDATE + SET + data_type = $1, metadata = $2, value = $3, ts_event = $4, ts_init = $5, + updated_at = CURRENT_TIMESTAMP + "#, + ) + .bind(data.data_type.type_name().to_string()) + .bind( + data.data_type + .metadata() + .as_ref() + .map_or(Ok(Value::Null), serde_json::to_value)?, + ) + .bind(data.value.clone()) + .bind(data.ts_event.to_string()) + .bind(data.ts_init.to_string()) + .execute(pool) + .await + .map(|_| ()) + .map_err(|e| anyhow::anyhow!("Failed to insert into custom table: {e}")) + } + + pub async fn load_custom_data( + pool: &PgPool, + data_type: &DataType, + ) -> anyhow::Result> { + // TODO: This metadata JSON could be more efficient at some point + let metadata_json = data_type + .metadata() + .as_ref() + .map_or(Ok(serde_json::Value::Null), |metadata| { + serde_json::to_value(metadata) + })?; + + sqlx::query_as::<_, CustomDataModel>( + r#"SELECT * FROM "custom" WHERE data_type = $1 AND metadata = $2 ORDER BY ts_init ASC"#, + ) + .bind(data_type.type_name()) + .bind(metadata_json) + .fetch_all(pool) + .await + .map(|rows| rows.into_iter().map(|row| row.0).collect()) + .map_err(|e| anyhow::anyhow!("Failed to load custom data: {e}")) + } } diff --git a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs index 3b8add8d6a73..bfc9d74e461e 100644 --- a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs +++ b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs @@ -19,14 +19,19 @@ mod serial_tests { use std::{collections::HashSet, time::Duration}; use bytes::Bytes; + use indexmap::indexmap; use nautilus_common::{ - cache::database::CacheDatabaseAdapter, signal::Signal, testing::wait_until, + cache::database::CacheDatabaseAdapter, custom::CustomData, signal::Signal, + testing::wait_until, }; use nautilus_core::nanos::UnixNanos; use nautilus_infrastructure::sql::cache::get_pg_cache_database; use nautilus_model::{ accounts::{any::AccountAny, cash::CashAccount}, - data::stubs::{quote_ethusdt_binance, stub_bar, stub_trade_ethusdt_buyer}, + data::{ + stubs::{quote_ethusdt_binance, stub_bar, stub_trade_ethusdt_buyer}, + DataType, + }, enums::{CurrencyType, OrderSide, OrderStatus, OrderType}, events::account::stubs::cash_account_state_million_usd, identifiers::{ @@ -517,4 +522,30 @@ mod serial_tests { assert_eq!(signals.len(), 1); assert_eq!(signals[0], signal); } + + #[tokio::test(flavor = "multi_thread")] + async fn test_postgres_cache_database_add_custom_data() { + let mut pg_cache = get_pg_cache_database().await.unwrap(); + // Add custom data + let metadata = + indexmap! {"a".to_string() => "1".to_string(), "b".to_string() => "2".to_string()}; + let data_type = DataType::new("Theo", Some(metadata)); + let data = CustomData::new( + data_type.clone(), + "hello-world".to_string(), + UnixNanos::default(), + UnixNanos::default(), + ); + + pg_cache.add_custom_data(&data).unwrap(); + + wait_until( + || pg_cache.load_custom_data(&data_type).unwrap().len() == 1, + Duration::from_secs(2), + ); + + let datas = pg_cache.load_custom_data(&data_type).unwrap(); + assert_eq!(datas.len(), 1); + assert_eq!(datas[0], data); + } } diff --git a/nautilus_core/model/src/data/mod.rs b/nautilus_core/model/src/data/mod.rs index 93ea7c61a2bd..9c9b98b285a0 100644 --- a/nautilus_core/model/src/data/mod.rs +++ b/nautilus_core/model/src/data/mod.rs @@ -38,6 +38,7 @@ use bar::BarType; use indexmap::IndexMap; use nautilus_core::nanos::UnixNanos; use serde::{Deserialize, Serialize}; +use serde_json::to_string; use self::{ bar::Bar, delta::OrderBookDelta, deltas::OrderBookDeltas_API, depth::OrderBookDepth10, @@ -196,6 +197,14 @@ impl DataType { self.metadata.as_ref() } + /// Returns a string representation of the metadata. + pub fn metadata_str(&self) -> String { + self.metadata + .as_ref() + .map(|metadata| to_string(metadata).unwrap_or_default()) + .unwrap_or_else(|| "null".to_string()) + } + /// Returns the messaging topic for the data type. pub fn topic(&self) -> &str { self.topic.as_str() diff --git a/nautilus_trader/cache/postgres/adapter.py b/nautilus_trader/cache/postgres/adapter.py index 4fdb59fd40ba..f00ec9c0807d 100644 --- a/nautilus_trader/cache/postgres/adapter.py +++ b/nautilus_trader/cache/postgres/adapter.py @@ -21,6 +21,9 @@ from nautilus_trader.cache.postgres.transformers import transform_bar_to_pyo3 from nautilus_trader.cache.postgres.transformers import transform_currency_from_pyo3 from nautilus_trader.cache.postgres.transformers import transform_currency_to_pyo3 +from nautilus_trader.cache.postgres.transformers import transform_custom_data_from_pyo3 +from nautilus_trader.cache.postgres.transformers import transform_custom_data_to_pyo3 +from nautilus_trader.cache.postgres.transformers import transform_data_type_to_pyo3 from nautilus_trader.cache.postgres.transformers import transform_instrument_from_pyo3 from nautilus_trader.cache.postgres.transformers import transform_instrument_to_pyo3 from nautilus_trader.cache.postgres.transformers import transform_order_from_pyo3 @@ -34,6 +37,8 @@ from nautilus_trader.core.data import Data from nautilus_trader.core.nautilus_pyo3 import PostgresCacheDatabase from nautilus_trader.model.data import Bar +from nautilus_trader.model.data import CustomData +from nautilus_trader.model.data import DataType from nautilus_trader.model.data import QuoteTick from nautilus_trader.model.data import TradeTick from nautilus_trader.model.identifiers import AccountId @@ -156,3 +161,12 @@ def add_signal(self, signal: Data): def load_signals(self, data_cls: type, name: str): signals_pyo3 = self._backing.load_signals(name) return [transform_signal_from_pyo3(data_cls, s) for s in signals_pyo3] + + def add_custom_data(self, data: CustomData): + data_pyo3 = transform_custom_data_to_pyo3(data) + self._backing.add_custom_data(data_pyo3) + + def load_custom_data(self, data_type: DataType): + data_type_pyo3 = transform_data_type_to_pyo3(data_type) + data_pyo3 = self._backing.load_custom_data(data_type_pyo3) + return [transform_custom_data_from_pyo3(d) for d in data_pyo3] diff --git a/nautilus_trader/cache/postgres/transformers.py b/nautilus_trader/cache/postgres/transformers.py index b6b0abb2909b..f4859a81a026 100644 --- a/nautilus_trader/cache/postgres/transformers.py +++ b/nautilus_trader/cache/postgres/transformers.py @@ -19,6 +19,8 @@ from nautilus_trader.core import nautilus_pyo3 from nautilus_trader.core.data import Data from nautilus_trader.model.data import Bar +from nautilus_trader.model.data import CustomData +from nautilus_trader.model.data import DataType from nautilus_trader.model.data import QuoteTick from nautilus_trader.model.data import TradeTick from nautilus_trader.model.enums import CurrencyType @@ -340,7 +342,7 @@ def transform_bar_to_pyo3(bar: Bar): ################################################################################ -# Signals +# Custom ################################################################################ def transform_signal_to_pyo3(signal: Data) -> nautilus_pyo3.Signal: return nautilus_pyo3.Signal( @@ -357,3 +359,37 @@ def transform_signal_from_pyo3(signal_cls: type, signal_pyo3: nautilus_pyo3.Sign signal_pyo3.ts_event, signal_pyo3.ts_init, ) + + +def transform_data_type_to_pyo3(data_type: DataType) -> nautilus_pyo3.DataType: + data_cls = data_type.type + fully_qualified_name = data_cls.__module__ + ":" + data_cls.__qualname__ + return nautilus_pyo3.DataType( + fully_qualified_name, + data_type.metadata, # PyO3 expects a `String` for this parameter + ) + + +def transform_data_type_from_pyo3(data_type_pyo3: nautilus_pyo3.DataType) -> DataType: + module_name, type_name = data_type_pyo3.type_name.rsplit(":", 1) + data_cls = getattr(module_name, type_name) + return DataType( + data_cls, + data_type_pyo3.metadata, + ) + + +def transform_custom_data_to_pyo3(data: CustomData) -> nautilus_pyo3.CustomData: + data_type_pyo3 = transform_data_type_to_pyo3(data.data_type) + return nautilus_pyo3.CustomData( + data_type_pyo3, + value=str(data.data), + ts_event=data.ts_event, + ts_init=data.ts_init, + ) + + +def transform_custom_data_from_pyo3(data: nautilus_pyo3.CustomData) -> CustomData: + data_type = transform_data_type_from_pyo3(data.data_type) + data = Data(data.value, data.ts_event, data.ts_init) + return CustomData(data_type, data) diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index 15afef33d31c..157713799bc8 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -271,14 +271,14 @@ class CustomData: def __init__( self, data_type: DataType, - data: str, + value: str, ts_event: int, ts_init: int, ) -> None: ... @property def data_type(self) -> DataType: ... @property - def data(self) -> str: ... + def value(self) -> str: ... @property def ts_event(self) -> int: ... @property @@ -2607,6 +2607,7 @@ class PostgresCacheDatabase: def load_quotes(self, instrument_id: InstrumentId) -> list[QuoteTick]: ... def load_bars(self, instrument_id: InstrumentId) -> list[Bar]: ... def load_signals(self, name: str) -> list[Signal]: ... + def load_custom_data(self, data_type: DataType) -> list[CustomData]: ... def add(self, key: str, value: bytes) -> None: ... def add_currency(self, currency: Currency) -> None: ... def add_instrument(self, instrument: object) -> None: ... @@ -2616,6 +2617,7 @@ class PostgresCacheDatabase: def add_quote(self, quote: QuoteTick) -> None: ... def add_bar(self, bar: Bar) -> None: ... def add_signal(self, signal: Signal) -> None: ... + def add_custom_data(self, data: CustomData) -> None: ... def update_order(self, order: object) -> None: ... def update_account(self, account: Account) -> None: ... diff --git a/schema/tables.sql b/schema/tables.sql index 6b48c0e7336e..5b166aeb342f 100644 --- a/schema/tables.sql +++ b/schema/tables.sql @@ -217,3 +217,14 @@ CREATE TABLE IF NOT EXISTS "signal" ( created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP ); + +CREATE TABLE IF NOT EXISTS "custom" ( + id BIGSERIAL PRIMARY KEY NOT NULL, + data_type TEXT NOT NULL, + metadata JSONB NOT NULL, + value TEXT NOT NULL, + ts_event TEXT NOT NULL, + ts_init TEXT NOT NULL, + created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP +); diff --git a/tests/integration_tests/infrastructure/test_cache_database_postgres.py b/tests/integration_tests/infrastructure/test_cache_database_postgres.py index 6266586cf2af..ead254f63055 100644 --- a/tests/integration_tests/infrastructure/test_cache_database_postgres.py +++ b/tests/integration_tests/infrastructure/test_cache_database_postgres.py @@ -29,6 +29,8 @@ from nautilus_trader.model.data import BarAggregation from nautilus_trader.model.data import BarSpecification from nautilus_trader.model.data import BarType +from nautilus_trader.model.data import CustomData +from nautilus_trader.model.data import DataType from nautilus_trader.model.data import QuoteTick from nautilus_trader.model.data import TradeTick from nautilus_trader.model.enums import CurrencyType @@ -50,6 +52,8 @@ from nautilus_trader.test_kit.stubs.events import TestEventStubs from nautilus_trader.test_kit.stubs.execution import TestExecStubs from nautilus_trader.test_kit.stubs.identifiers import TestIdStubs +from nautilus_trader.trading.filters import NewsEvent +from nautilus_trader.trading.filters import NewsImpact from nautilus_trader.trading.strategy import Strategy @@ -619,3 +623,24 @@ async def test_add_and_load_signals(self): signals = self.database.load_signals(signal_cls, signal_name) assert len(signals) == 1 + + @pytest.mark.asyncio + async def test_add_and_load_custom_data(self): + metadata = {"a": "1", "b": "2"} + data_type = DataType(NewsEvent, metadata) + event = NewsEvent( + impact=NewsImpact.LOW, + name="something-happened", + currency="USD", + ts_event=1, + ts_init=2, + ) + data = CustomData(data_type, event) + + self.database.add_custom_data(data) + + # TODO: WIP - loading needs more work + # await eventually(lambda: len(self.database.load_custom_data(data_type)) > 0) + # + # signals = self.database.load_custom_data(data_type) + # assert len(signals) == 1 From 51419c7942e656260790f9e8d9230e8daa1cfdb4 Mon Sep 17 00:00:00 2001 From: Pushkar Mishra Date: Mon, 14 Oct 2024 12:45:11 +0530 Subject: [PATCH 128/224] Refine RateLimiter for WebSocketClient (#2000) --- nautilus_core/common/src/signal.rs | 1 + nautilus_core/network/src/python/websocket.rs | 8 +- nautilus_core/network/src/ratelimiter/mod.rs | 109 +++++++++++++++--- nautilus_core/network/src/websocket.rs | 7 +- 4 files changed, 103 insertions(+), 22 deletions(-) diff --git a/nautilus_core/common/src/signal.rs b/nautilus_core/common/src/signal.rs index f49eaa84d100..a5146420a116 100644 --- a/nautilus_core/common/src/signal.rs +++ b/nautilus_core/common/src/signal.rs @@ -37,6 +37,7 @@ pub struct Signal { impl Signal { /// Creates a new [`Signal`] instance. + #[must_use] pub fn new(name: Ustr, value: String, ts_event: UnixNanos, ts_init: UnixNanos) -> Self { Self { name, diff --git a/nautilus_core/network/src/python/websocket.rs b/nautilus_core/network/src/python/websocket.rs index 5beb36a5245e..81fe09ace709 100644 --- a/nautilus_core/network/src/python/websocket.rs +++ b/nautilus_core/network/src/python/websocket.rs @@ -68,13 +68,13 @@ impl WebSocketClient { /// /// - Throws an Exception if it is unable to make websocket connection #[staticmethod] - #[pyo3(name = "connect")] + #[pyo3(name = "connect", signature = (config, post_connection= None, post_reconnection= None, post_disconnection= None, keyed_quotas = Vec::new(),default_quota = None))] fn py_connect( config: WebSocketConfig, post_connection: Option, post_reconnection: Option, post_disconnection: Option, - keyed_quotas: Option>, + keyed_quotas: Vec<(String, Quota)>, default_quota: Option, py: Python<'_>, ) -> PyResult> { @@ -373,7 +373,7 @@ counter = Counter()", None, None, ); - let client = WebSocketClient::connect(config, None, None, None, None, None) + let client = WebSocketClient::connect(config, None, None, None, Vec::new(), None) .await .unwrap(); @@ -477,7 +477,7 @@ checker = Checker()", Some("heartbeat message".to_string()), None, ); - let client = WebSocketClient::connect(config, None, None, None, None, None) + let client = WebSocketClient::connect(config, None, None, None, Vec::new(), None) .await .unwrap(); diff --git a/nautilus_core/network/src/ratelimiter/mod.rs b/nautilus_core/network/src/ratelimiter/mod.rs index bd8be2472bf2..724087ee8b8b 100644 --- a/nautilus_core/network/src/ratelimiter/mod.rs +++ b/nautilus_core/network/src/ratelimiter/mod.rs @@ -226,25 +226,108 @@ mod tests { #[test] fn test_default_quota() { let mock_limiter = initialize_mock_rate_limiter(); - // check base quota is exceeded - assert!(mock_limiter.check_key(&"lmao".to_string()).is_ok()); - assert!(mock_limiter.check_key(&"lmao".to_string()).is_ok()); - assert!(mock_limiter.check_key(&"lmao".to_string()).is_err()); - // increment clock and check base quota is passed + // Check base quota is not exceeded + assert!(mock_limiter.check_key(&"default".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"default".to_string()).is_ok()); + + // Check base quota is exceeded + assert!(mock_limiter.check_key(&"default".to_string()).is_err()); + + // Increment clock and check base quota is reset mock_limiter.advance_clock(Duration::from_secs(1)); - assert!(mock_limiter.check_key(&"lmao".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"default".to_string()).is_ok()); + } + + #[test] + fn test_custom_key_quota() { + let mock_limiter = initialize_mock_rate_limiter(); + + // Add new key quota pair + mock_limiter.add_quota_for_key( + "custom".to_string(), + Quota::per_second(NonZeroU32::new(1).unwrap()), + ); + + // Check custom quota + assert!(mock_limiter.check_key(&"custom".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"custom".to_string()).is_err()); + + // Check that default quota still applies to other keys + assert!(mock_limiter.check_key(&"default".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"default".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"default".to_string()).is_err()); + } + + #[test] + fn test_multiple_keys() { + let mock_limiter = initialize_mock_rate_limiter(); - // add new key quota pair mock_limiter.add_quota_for_key( - "yeet".to_string(), + "key1".to_string(), Quota::per_second(NonZeroU32::new(1).unwrap()), ); + mock_limiter.add_quota_for_key( + "key2".to_string(), + Quota::per_second(NonZeroU32::new(3).unwrap()), + ); - // check base quota and key quota to exceed - assert!(mock_limiter.check_key(&"lmao".to_string()).is_ok()); - assert!(mock_limiter.check_key(&"lmao".to_string()).is_err()); - assert!(mock_limiter.check_key(&"yeet".to_string()).is_ok()); - assert!(mock_limiter.check_key(&"yeet".to_string()).is_err()); + // Test key1 + assert!(mock_limiter.check_key(&"key1".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"key1".to_string()).is_err()); + + // Test key2 + assert!(mock_limiter.check_key(&"key2".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"key2".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"key2".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"key2".to_string()).is_err()); + } + + #[test] + fn test_quota_reset() { + let mock_limiter = initialize_mock_rate_limiter(); + + // Exhaust quota + assert!(mock_limiter.check_key(&"reset".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"reset".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"reset".to_string()).is_err()); + + // Advance clock by less than a second + mock_limiter.advance_clock(Duration::from_millis(499)); + assert!(mock_limiter.check_key(&"reset".to_string()).is_err()); + + // Advance clock to reset + mock_limiter.advance_clock(Duration::from_millis(501)); + assert!(mock_limiter.check_key(&"reset".to_string()).is_ok()); + } + + #[test] + fn test_different_quotas() { + let mock_limiter = initialize_mock_rate_limiter(); + + mock_limiter.add_quota_for_key( + "per_second".to_string(), + Quota::per_second(NonZeroU32::new(2).unwrap()), + ); + mock_limiter.add_quota_for_key( + "per_minute".to_string(), + Quota::per_minute(NonZeroU32::new(3).unwrap()), + ); + + // Test per_second quota + assert!(mock_limiter.check_key(&"per_second".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"per_second".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"per_second".to_string()).is_err()); + + // Test per_minute quota + assert!(mock_limiter.check_key(&"per_minute".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"per_minute".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"per_minute".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"per_minute".to_string()).is_err()); + + // Advance clock and check reset + mock_limiter.advance_clock(Duration::from_secs(1)); + assert!(mock_limiter.check_key(&"per_second".to_string()).is_ok()); + assert!(mock_limiter.check_key(&"per_minute".to_string()).is_err()); } } diff --git a/nautilus_core/network/src/websocket.rs b/nautilus_core/network/src/websocket.rs index be5ec3d84d92..03a3921780b9 100644 --- a/nautilus_core/network/src/websocket.rs +++ b/nautilus_core/network/src/websocket.rs @@ -337,7 +337,7 @@ impl WebSocketClient { post_connection: Option, post_reconnection: Option, post_disconnection: Option, - keyed_quotas: Option>, + keyed_quotas: Vec<(String, Quota)>, default_quota: Option, ) -> Result { tracing::debug!("Connecting"); @@ -351,10 +351,7 @@ impl WebSocketClient { post_reconnection, post_disconnection, ); - let rate_limiter = Arc::new(RateLimiter::new_with_quota( - default_quota, - keyed_quotas.unwrap_or_default(), - )); + let rate_limiter = Arc::new(RateLimiter::new_with_quota(default_quota, keyed_quotas)); if let Some(handler) = post_connection { Python::with_gil(|py| match handler.call0(py) { From 6b2cedadb58e9bd5a585d1a2f6e5f1a52619991b Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 14 Oct 2024 18:20:08 +1100 Subject: [PATCH 129/224] Update dependencies --- nautilus_core/Cargo.lock | 8 +- nautilus_core/model/Cargo.toml | 2 +- poetry.lock | 326 ++++++++++++++++----------------- pyproject.toml | 2 +- 4 files changed, 169 insertions(+), 169 deletions(-) diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 770b8ec7decf..6d1ec1085847 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -383,9 +383,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "998282f8f49ccd6116b0ed8a4de0fbd3151697920e7c7533416d6e25e76434a7" +checksum = "e26a9844c659a2a293d239c7910b752f8487fe122c6c8bd1659bf85a6507c302" dependencies = [ "bzip2", "flate2", @@ -1747,9 +1747,9 @@ dependencies = [ [[package]] name = "evalexpr" -version = "11.3.0" +version = "11.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b41cb9dd076076058a4523f009c900c582279536d0b2e45a29aa930e083cc5" +checksum = "b6aff27af350e7b53e82aac3e5ab6389abd8f280640ac034508dff0608c4c7e5" [[package]] name = "event-listener" diff --git a/nautilus_core/model/Cargo.toml b/nautilus_core/model/Cargo.toml index 03f48bd1517a..a84c6c482eb7 100644 --- a/nautilus_core/model/Cargo.toml +++ b/nautilus_core/model/Cargo.toml @@ -27,7 +27,7 @@ strum = { workspace = true } thiserror = { workspace = true } thousands = { workspace = true } ustr = { workspace = true } -evalexpr = "11.3.0" +evalexpr = "11.3.1" implied-vol = { version = "1.0.0", features = ["normal-distribution"] } tabled = "0.16.0" diff --git a/poetry.lock b/poetry.lock index 9ecf1dc83937..6592f3ffbf56 100644 --- a/poetry.lock +++ b/poetry.lock @@ -927,73 +927,73 @@ files = [ [[package]] name = "coverage" -version = "7.6.2" +version = "7.6.3" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" files = [ - {file = "coverage-7.6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9df1950fb92d49970cce38100d7e7293c84ed3606eaa16ea0b6bc27175bb667"}, - {file = "coverage-7.6.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:24500f4b0e03aab60ce575c85365beab64b44d4db837021e08339f61d1fbfe52"}, - {file = "coverage-7.6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a663b180b6669c400b4630a24cc776f23a992d38ce7ae72ede2a397ce6b0f170"}, - {file = "coverage-7.6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfde025e2793a22efe8c21f807d276bd1d6a4bcc5ba6f19dbdfc4e7a12160909"}, - {file = "coverage-7.6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:087932079c065d7b8ebadd3a0160656c55954144af6439886c8bcf78bbbcde7f"}, - {file = "coverage-7.6.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9c6b0c1cafd96213a0327cf680acb39f70e452caf8e9a25aeb05316db9c07f89"}, - {file = "coverage-7.6.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6e85830eed5b5263ffa0c62428e43cb844296f3b4461f09e4bdb0d44ec190bc2"}, - {file = "coverage-7.6.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:62ab4231c01e156ece1b3a187c87173f31cbeee83a5e1f6dff17f288dca93345"}, - {file = "coverage-7.6.2-cp310-cp310-win32.whl", hash = "sha256:7b80fbb0da3aebde102a37ef0138aeedff45997e22f8962e5f16ae1742852676"}, - {file = "coverage-7.6.2-cp310-cp310-win_amd64.whl", hash = "sha256:d20c3d1f31f14d6962a4e2f549c21d31e670b90f777ef4171be540fb7fb70f02"}, - {file = "coverage-7.6.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bb21bac7783c1bf6f4bbe68b1e0ff0d20e7e7732cfb7995bc8d96e23aa90fc7b"}, - {file = "coverage-7.6.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a7b2e437fbd8fae5bc7716b9c7ff97aecc95f0b4d56e4ca08b3c8d8adcaadb84"}, - {file = "coverage-7.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:536f77f2bf5797983652d1d55f1a7272a29afcc89e3ae51caa99b2db4e89d658"}, - {file = "coverage-7.6.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f361296ca7054f0936b02525646b2731b32c8074ba6defab524b79b2b7eeac72"}, - {file = "coverage-7.6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7926d8d034e06b479797c199747dd774d5e86179f2ce44294423327a88d66ca7"}, - {file = "coverage-7.6.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0bbae11c138585c89fb4e991faefb174a80112e1a7557d507aaa07675c62e66b"}, - {file = "coverage-7.6.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fcad7d5d2bbfeae1026b395036a8aa5abf67e8038ae7e6a25c7d0f88b10a8e6a"}, - {file = "coverage-7.6.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f01e53575f27097d75d42de33b1b289c74b16891ce576d767ad8c48d17aeb5e0"}, - {file = "coverage-7.6.2-cp311-cp311-win32.whl", hash = "sha256:7781f4f70c9b0b39e1b129b10c7d43a4e0c91f90c60435e6da8288efc2b73438"}, - {file = "coverage-7.6.2-cp311-cp311-win_amd64.whl", hash = "sha256:9bcd51eeca35a80e76dc5794a9dd7cb04b97f0e8af620d54711793bfc1fbba4b"}, - {file = "coverage-7.6.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ebc94fadbd4a3f4215993326a6a00e47d79889391f5659bf310f55fe5d9f581c"}, - {file = "coverage-7.6.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9681516288e3dcf0aa7c26231178cc0be6cac9705cac06709f2353c5b406cfea"}, - {file = "coverage-7.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d9c5d13927d77af4fbe453953810db766f75401e764727e73a6ee4f82527b3e"}, - {file = "coverage-7.6.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b92f9ca04b3e719d69b02dc4a69debb795af84cb7afd09c5eb5d54b4a1ae2191"}, - {file = "coverage-7.6.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ff2ef83d6d0b527b5c9dad73819b24a2f76fdddcfd6c4e7a4d7e73ecb0656b4"}, - {file = "coverage-7.6.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:47ccb6e99a3031ffbbd6e7cc041e70770b4fe405370c66a54dbf26a500ded80b"}, - {file = "coverage-7.6.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a867d26f06bcd047ef716175b2696b315cb7571ccb951006d61ca80bbc356e9e"}, - {file = "coverage-7.6.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cdfcf2e914e2ba653101157458afd0ad92a16731eeba9a611b5cbb3e7124e74b"}, - {file = "coverage-7.6.2-cp312-cp312-win32.whl", hash = "sha256:f9035695dadfb397bee9eeaf1dc7fbeda483bf7664a7397a629846800ce6e276"}, - {file = "coverage-7.6.2-cp312-cp312-win_amd64.whl", hash = "sha256:5ed69befa9a9fc796fe015a7040c9398722d6b97df73a6b608e9e275fa0932b0"}, - {file = "coverage-7.6.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eea60c79d36a8f39475b1af887663bc3ae4f31289cd216f514ce18d5938df40"}, - {file = "coverage-7.6.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa68a6cdbe1bc6793a9dbfc38302c11599bbe1837392ae9b1d238b9ef3dafcf1"}, - {file = "coverage-7.6.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ec528ae69f0a139690fad6deac8a7d33629fa61ccce693fdd07ddf7e9931fba"}, - {file = "coverage-7.6.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed5ac02126f74d190fa2cc14a9eb2a5d9837d5863920fa472b02eb1595cdc925"}, - {file = "coverage-7.6.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21c0ea0d4db8a36b275cb6fb2437a3715697a4ba3cb7b918d3525cc75f726304"}, - {file = "coverage-7.6.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:35a51598f29b2a19e26d0908bd196f771a9b1c5d9a07bf20be0adf28f1ad4f77"}, - {file = "coverage-7.6.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c9192925acc33e146864b8cf037e2ed32a91fdf7644ae875f5d46cd2ef086a5f"}, - {file = "coverage-7.6.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf4eeecc9e10f5403ec06138978235af79c9a79af494eb6b1d60a50b49ed2869"}, - {file = "coverage-7.6.2-cp313-cp313-win32.whl", hash = "sha256:e4ee15b267d2dad3e8759ca441ad450c334f3733304c55210c2a44516e8d5530"}, - {file = "coverage-7.6.2-cp313-cp313-win_amd64.whl", hash = "sha256:c71965d1ced48bf97aab79fad56df82c566b4c498ffc09c2094605727c4b7e36"}, - {file = "coverage-7.6.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7571e8bbecc6ac066256f9de40365ff833553e2e0c0c004f4482facb131820ef"}, - {file = "coverage-7.6.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:078a87519057dacb5d77e333f740708ec2a8f768655f1db07f8dfd28d7a005f0"}, - {file = "coverage-7.6.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5e92e3e84a8718d2de36cd8387459cba9a4508337b8c5f450ce42b87a9e760"}, - {file = "coverage-7.6.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebabdf1c76593a09ee18c1a06cd3022919861365219ea3aca0247ededf6facd6"}, - {file = "coverage-7.6.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12179eb0575b8900912711688e45474f04ab3934aaa7b624dea7b3c511ecc90f"}, - {file = "coverage-7.6.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:39d3b964abfe1519b9d313ab28abf1d02faea26cd14b27f5283849bf59479ff5"}, - {file = "coverage-7.6.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:84c4315577f7cd511d6250ffd0f695c825efe729f4205c0340f7004eda51191f"}, - {file = "coverage-7.6.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ff797320dcbff57caa6b2301c3913784a010e13b1f6cf4ab3f563f3c5e7919db"}, - {file = "coverage-7.6.2-cp313-cp313t-win32.whl", hash = "sha256:2b636a301e53964550e2f3094484fa5a96e699db318d65398cfba438c5c92171"}, - {file = "coverage-7.6.2-cp313-cp313t-win_amd64.whl", hash = "sha256:d03a060ac1a08e10589c27d509bbdb35b65f2d7f3f8d81cf2fa199877c7bc58a"}, - {file = "coverage-7.6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c37faddc8acd826cfc5e2392531aba734b229741d3daec7f4c777a8f0d4993e5"}, - {file = "coverage-7.6.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab31fdd643f162c467cfe6a86e9cb5f1965b632e5e65c072d90854ff486d02cf"}, - {file = "coverage-7.6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97df87e1a20deb75ac7d920c812e9326096aa00a9a4b6d07679b4f1f14b06c90"}, - {file = "coverage-7.6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:343056c5e0737487a5291f5691f4dfeb25b3e3c8699b4d36b92bb0e586219d14"}, - {file = "coverage-7.6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4ef1c56b47b6b9024b939d503ab487231df1f722065a48f4fc61832130b90e"}, - {file = "coverage-7.6.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fca4a92c8a7a73dee6946471bce6d1443d94155694b893b79e19ca2a540d86e"}, - {file = "coverage-7.6.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69f251804e052fc46d29d0e7348cdc5fcbfc4861dc4a1ebedef7e78d241ad39e"}, - {file = "coverage-7.6.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e8ea055b3ea046c0f66217af65bc193bbbeca1c8661dc5fd42698db5795d2627"}, - {file = "coverage-7.6.2-cp39-cp39-win32.whl", hash = "sha256:6c2ba1e0c24d8fae8f2cf0aeb2fc0a2a7f69b6d20bd8d3749fd6b36ecef5edf0"}, - {file = "coverage-7.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:2186369a654a15628e9c1c9921409a6b3eda833e4b91f3ca2a7d9f77abb4987c"}, - {file = "coverage-7.6.2-pp39.pp310-none-any.whl", hash = "sha256:667952739daafe9616db19fbedbdb87917eee253ac4f31d70c7587f7ab531b4e"}, - {file = "coverage-7.6.2.tar.gz", hash = "sha256:a5f81e68aa62bc0cfca04f7b19eaa8f9c826b53fc82ab9e2121976dc74f131f3"}, + {file = "coverage-7.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6da42bbcec130b188169107ecb6ee7bd7b4c849d24c9370a0c884cf728d8e976"}, + {file = "coverage-7.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c222958f59b0ae091f4535851cbb24eb57fc0baea07ba675af718fb5302dddb2"}, + {file = "coverage-7.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab84a8b698ad5a6c365b08061920138e7a7dd9a04b6feb09ba1bfae68346ce6d"}, + {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70a6756ce66cd6fe8486c775b30889f0dc4cb20c157aa8c35b45fd7868255c5c"}, + {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c2e6fa98032fec8282f6b27e3f3986c6e05702828380618776ad794e938f53a"}, + {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:921fbe13492caf6a69528f09d5d7c7d518c8d0e7b9f6701b7719715f29a71e6e"}, + {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6d99198203f0b9cb0b5d1c0393859555bc26b548223a769baf7e321a627ed4fc"}, + {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:87cd2e29067ea397a47e352efb13f976eb1b03e18c999270bb50589323294c6e"}, + {file = "coverage-7.6.3-cp310-cp310-win32.whl", hash = "sha256:a3328c3e64ea4ab12b85999eb0779e6139295bbf5485f69d42cf794309e3d007"}, + {file = "coverage-7.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:bca4c8abc50d38f9773c1ec80d43f3768df2e8576807d1656016b9d3eeaa96fd"}, + {file = "coverage-7.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c51ef82302386d686feea1c44dbeef744585da16fcf97deea2a8d6c1556f519b"}, + {file = "coverage-7.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0ca37993206402c6c35dc717f90d4c8f53568a8b80f0bf1a1b2b334f4d488fba"}, + {file = "coverage-7.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c77326300b839c44c3e5a8fe26c15b7e87b2f32dfd2fc9fee1d13604347c9b38"}, + {file = "coverage-7.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e484e479860e00da1f005cd19d1c5d4a813324e5951319ac3f3eefb497cc549"}, + {file = "coverage-7.6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c6c0f4d53ef603397fc894a895b960ecd7d44c727df42a8d500031716d4e8d2"}, + {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:37be7b5ea3ff5b7c4a9db16074dc94523b5f10dd1f3b362a827af66a55198175"}, + {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:43b32a06c47539fe275106b376658638b418c7cfdfff0e0259fbf877e845f14b"}, + {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee77c7bef0724165e795b6b7bf9c4c22a9b8468a6bdb9c6b4281293c6b22a90f"}, + {file = "coverage-7.6.3-cp311-cp311-win32.whl", hash = "sha256:43517e1f6b19f610a93d8227e47790722c8bf7422e46b365e0469fc3d3563d97"}, + {file = "coverage-7.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:04f2189716e85ec9192df307f7c255f90e78b6e9863a03223c3b998d24a3c6c6"}, + {file = "coverage-7.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27bd5f18d8f2879e45724b0ce74f61811639a846ff0e5c0395b7818fae87aec6"}, + {file = "coverage-7.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d546cfa78844b8b9c1c0533de1851569a13f87449897bbc95d698d1d3cb2a30f"}, + {file = "coverage-7.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9975442f2e7a5cfcf87299c26b5a45266ab0696348420049b9b94b2ad3d40234"}, + {file = "coverage-7.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:583049c63106c0555e3ae3931edab5669668bbef84c15861421b94e121878d3f"}, + {file = "coverage-7.6.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2341a78ae3a5ed454d524206a3fcb3cec408c2a0c7c2752cd78b606a2ff15af4"}, + {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a4fb91d5f72b7e06a14ff4ae5be625a81cd7e5f869d7a54578fc271d08d58ae3"}, + {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e279f3db904e3b55f520f11f983cc8dc8a4ce9b65f11692d4718ed021ec58b83"}, + {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa23ce39661a3e90eea5f99ec59b763b7d655c2cada10729ed920a38bfc2b167"}, + {file = "coverage-7.6.3-cp312-cp312-win32.whl", hash = "sha256:52ac29cc72ee7e25ace7807249638f94c9b6a862c56b1df015d2b2e388e51dbd"}, + {file = "coverage-7.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:40e8b1983080439d4802d80b951f4a93d991ef3261f69e81095a66f86cf3c3c6"}, + {file = "coverage-7.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9134032f5aa445ae591c2ba6991d10136a1f533b1d2fa8f8c21126468c5025c6"}, + {file = "coverage-7.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:99670790f21a96665a35849990b1df447993880bb6463a0a1d757897f30da929"}, + {file = "coverage-7.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc7d6b380ca76f5e817ac9eef0c3686e7834c8346bef30b041a4ad286449990"}, + {file = "coverage-7.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7b26757b22faf88fcf232f5f0e62f6e0fd9e22a8a5d0d5016888cdfe1f6c1c4"}, + {file = "coverage-7.6.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c59d6a4a4633fad297f943c03d0d2569867bd5372eb5684befdff8df8522e39"}, + {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f263b18692f8ed52c8de7f40a0751e79015983dbd77b16906e5b310a39d3ca21"}, + {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:79644f68a6ff23b251cae1c82b01a0b51bc40c8468ca9585c6c4b1aeee570e0b"}, + {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71967c35828c9ff94e8c7d405469a1fb68257f686bca7c1ed85ed34e7c2529c4"}, + {file = "coverage-7.6.3-cp313-cp313-win32.whl", hash = "sha256:e266af4da2c1a4cbc6135a570c64577fd3e6eb204607eaff99d8e9b710003c6f"}, + {file = "coverage-7.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:ea52bd218d4ba260399a8ae4bb6b577d82adfc4518b93566ce1fddd4a49d1dce"}, + {file = "coverage-7.6.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8d4c6ea0f498c7c79111033a290d060c517853a7bcb2f46516f591dab628ddd3"}, + {file = "coverage-7.6.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:331b200ad03dbaa44151d74daeb7da2cf382db424ab923574f6ecca7d3b30de3"}, + {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54356a76b67cf8a3085818026bb556545ebb8353951923b88292556dfa9f812d"}, + {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebec65f5068e7df2d49466aab9128510c4867e532e07cb6960075b27658dca38"}, + {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d33a785ea8354c480515e781554d3be582a86297e41ccbea627a5c632647f2cd"}, + {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f7ddb920106bbbbcaf2a274d56f46956bf56ecbde210d88061824a95bdd94e92"}, + {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:70d24936ca6c15a3bbc91ee9c7fc661132c6f4c9d42a23b31b6686c05073bde5"}, + {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c30e42ea11badb147f0d2e387115b15e2bd8205a5ad70d6ad79cf37f6ac08c91"}, + {file = "coverage-7.6.3-cp313-cp313t-win32.whl", hash = "sha256:365defc257c687ce3e7d275f39738dcd230777424117a6c76043459db131dd43"}, + {file = "coverage-7.6.3-cp313-cp313t-win_amd64.whl", hash = "sha256:23bb63ae3f4c645d2d82fa22697364b0046fbafb6261b258a58587441c5f7bd0"}, + {file = "coverage-7.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:da29ceabe3025a1e5a5aeeb331c5b1af686daab4ff0fb4f83df18b1180ea83e2"}, + {file = "coverage-7.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df8c05a0f574d480947cba11b947dc41b1265d721c3777881da2fb8d3a1ddfba"}, + {file = "coverage-7.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec1e3b40b82236d100d259854840555469fad4db64f669ab817279eb95cd535c"}, + {file = "coverage-7.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4adeb878a374126f1e5cf03b87f66279f479e01af0e9a654cf6d1509af46c40"}, + {file = "coverage-7.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43d6a66e33b1455b98fc7312b124296dad97a2e191c80320587234a77b1b736e"}, + {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1990b1f4e2c402beb317840030bb9f1b6a363f86e14e21b4212e618acdfce7f6"}, + {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:12f9515d875859faedb4144fd38694a761cd2a61ef9603bf887b13956d0bbfbb"}, + {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:99ded130555c021d99729fabd4ddb91a6f4cc0707df4b1daf912c7850c373b13"}, + {file = "coverage-7.6.3-cp39-cp39-win32.whl", hash = "sha256:c3a79f56dee9136084cf84a6c7c4341427ef36e05ae6415bf7d787c96ff5eaa3"}, + {file = "coverage-7.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:aac7501ae73d4a02f4b7ac8fcb9dc55342ca98ffb9ed9f2dfb8a25d53eda0e4d"}, + {file = "coverage-7.6.3-pp39.pp310-none-any.whl", hash = "sha256:b9853509b4bf57ba7b1f99b9d866c422c9c5248799ab20e652bbb8a184a38181"}, + {file = "coverage-7.6.3.tar.gz", hash = "sha256:bb7d5fe92bd0dc235f63ebe9f8c6e0884f7360f88f3411bfed1350c872ef2054"}, ] [package.extras] @@ -3896,109 +3896,109 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "yarl" -version = "1.15.1" +version = "1.15.2" description = "Yet another URL library" optional = false python-versions = ">=3.8" files = [ - {file = "yarl-1.15.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7d94d8a3927516c10be9958caa72a4148d9c99fc4de3442fa00873870d58d430"}, - {file = "yarl-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fa0c603f007bf3f54bcd7f011f46134995a129a8f0c8e70f0ad8330228ff02d7"}, - {file = "yarl-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:069de3a78672043e84b37078dbc250c5fff1b16ee1b584de5d684d402cc51703"}, - {file = "yarl-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70b34ba1be6d0726efdc0da9c477e5363132d2ac97d0951926b6046a7c24c70e"}, - {file = "yarl-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31397f4ea5700dfcb1b3ce6fdb24407ea874494fd546926f13a7449999180b67"}, - {file = "yarl-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef6b02ebc4b05c9d5575ae6120af173421f1bc653452967c8ae47f6e820d2f75"}, - {file = "yarl-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd735297b9e9afba34bf05a3580e80e4145031d319723777e58f169d7ef553bb"}, - {file = "yarl-1.15.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:566669cfcf4f89f9e8dafc06a81472122cd2b8c00cca24a2c662cb5c7fbe9edf"}, - {file = "yarl-1.15.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6e75b66019709dce95a4a7b47fe3b072f1d7eb8bd0c323e5e62332c84a05aa50"}, - {file = "yarl-1.15.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cda340ed6afd475d4e58d8f34d3f08a4dda956cde86930f51827972ed4e98f3d"}, - {file = "yarl-1.15.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e5c0b30bdc6668d3a1c9ecebae4dc22fd90b02c7ea68f7907db315fd81853f06"}, - {file = "yarl-1.15.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:699ce4edbc471bf39ffdb2060c643f1750a7ccb4b7a34a45dccb389c0ec4996b"}, - {file = "yarl-1.15.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ab5140fd448ce090c73b651bedbbf26de42317466f70210648480e2d63fedf04"}, - {file = "yarl-1.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0c4a3d28a0888bdc8529824e73afa8e5362c79ef2a68bec53fd040cb2ad84e39"}, - {file = "yarl-1.15.1-cp310-cp310-win32.whl", hash = "sha256:dab310e5fa1ec359bf105d03f2e1227ade8952b78961ccd1b17f9f9acb3f49ae"}, - {file = "yarl-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:1bc9f6a7b0ede16fd2ed6bbdf89e78377b1f00f0e48806c5356c4d3174ae5906"}, - {file = "yarl-1.15.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dfeba6be776409230aebf12bd01539097459886c925ae20fac2c3b736ba0284a"}, - {file = "yarl-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2aa01bb3f91a64aa1d42db9b704674f6ed7c19d2a296f1e3bd25ade9e97dbeb9"}, - {file = "yarl-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ecf1511b7db6a09681765c70952503418468deff5d8c34100f44c8318755836"}, - {file = "yarl-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03344b592468257494a253b35f7b67c243397286dd0ae6be03af35eb34333139"}, - {file = "yarl-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dda10d4525517e32dc33c5fe98c5b877b9807ce0ecd8acef93c09f1406b4fe4"}, - {file = "yarl-1.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:889993b2bc2f04308d4ebe12424fecccc22062aa06c61771d3e9302527a0bdec"}, - {file = "yarl-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:027bbf2e616ed072ee5f9344240c8d908c3c5a8c30cea31e8fa9899b42a6a51b"}, - {file = "yarl-1.15.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3044230cd78f236f6b9c6e06cb7d618dd1cffebfb97600fb98e0a562f0f456ef"}, - {file = "yarl-1.15.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e5b1e400252498d3de94b19197039422539c62f081c21f3b785e184cdd041a85"}, - {file = "yarl-1.15.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c1b1dc71d6b4d6ab785e1f7a916960eb094be6300bc92e515d7a04709b2fad6b"}, - {file = "yarl-1.15.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1a6e972ee42b2c868985db62dd592629594c47279579372a64d7666b6d14683d"}, - {file = "yarl-1.15.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6ce6768a192aa3af22a9b58d1b07226e9313b3e6e179bdb8de215d99a6baef86"}, - {file = "yarl-1.15.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:45d986f872258bcd4f417b474e1c35e8bba14d69fb124432c417bd256adde38b"}, - {file = "yarl-1.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e9dec42480ee079581faafb05fa55731ec80693310a6775e8adbf83edc52fd24"}, - {file = "yarl-1.15.1-cp311-cp311-win32.whl", hash = "sha256:2c8c4ea31d28f47d7af24f44e5a2090ec4245ac3f3e34ce55ab1188d92e98a71"}, - {file = "yarl-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:b5f27f515f69dea928cc16577844762226893098426ba54223fc62c70af5863a"}, - {file = "yarl-1.15.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b169b0edb76e72b46373fcc1b4b9820a3680639f92ad506c2b7de9450546bea6"}, - {file = "yarl-1.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7e3b2e7518d6789b577793912b0037f36fdcff28a73a1f5c1affc34759852b4f"}, - {file = "yarl-1.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:04cb3e3a0f0fbf2a9614c88fef811c0f10449415a1ff532f437aec9bcc6b9da5"}, - {file = "yarl-1.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46091072123e7295b0f4a88c6c24f0386b3e45e54efddd141069d5e16e372ce6"}, - {file = "yarl-1.15.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:839f1056ceca5b2019174f8c15ba131c3eebece241b228d46a469760953e8049"}, - {file = "yarl-1.15.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7b85ad874cf6eaad545f2bd838b3782db30cecb9364ade0214b9a7e9462d051"}, - {file = "yarl-1.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d60326a87fcd9c1b1ccc18344b036ecdaa5e92c52c163560759df50fc0d39f6"}, - {file = "yarl-1.15.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:974fa4829a09fa0d7a6375d40f39ad9265904d7c1754e2b9dc302ceedc54388d"}, - {file = "yarl-1.15.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:41037ae2992cc3b0fa088ffe609e3c2f066284f9329035f26e853230e8f7ae13"}, - {file = "yarl-1.15.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f313ce3a41c8c280f90ec0770dc2bd464a8b24f5c785daa70f71654b1334295b"}, - {file = "yarl-1.15.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bd9c7873f26065a0ff3189c5002fb5c8e41d3e49741e0e903a11f12be27c841b"}, - {file = "yarl-1.15.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e9672cdc71bb44d45240b8447793efb83a76a046000dafb6e2ac827db9dfbdda"}, - {file = "yarl-1.15.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d7251c8185c49c17270d756da2c97de5c076790d64450a56c4814b3a40f3807f"}, - {file = "yarl-1.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b7177ba5c965a436bb97d4db0841302075eb9fa77a6a806aa44975c5ff619fb"}, - {file = "yarl-1.15.1-cp312-cp312-win32.whl", hash = "sha256:35921994c4d23d3679d3999ca0fdd05b27e33363bc80e1c24681c9ba108eb874"}, - {file = "yarl-1.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:28a865a4a06b90ea6ca985a530b7d95c795b4c63062f759fe88de90ae5f66198"}, - {file = "yarl-1.15.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2206775a9a2831c044ecc0863cb63e4e8cf5f8d4fce0fc3c900e5a51e9d57e87"}, - {file = "yarl-1.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:af1741bedd1b3a1100635a30c2fa5850bc95e5647be3d221e28684b66d16f655"}, - {file = "yarl-1.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2969fba35b5cd0418f343c363a3ae6c5dc847e3c2861a4ac857d004882a805d4"}, - {file = "yarl-1.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4510ae890f55a685d7d8b55cf80f6a35799fbe682b8546a0aed67565f86793ce"}, - {file = "yarl-1.15.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ea3ca97a5aa00943604f93919bc0741769b900dd3217d02f9d29274371fd758"}, - {file = "yarl-1.15.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a976eeaea67b1d53dce91174968f077ae7f3a0a05ede80a099bc584ea748bdd"}, - {file = "yarl-1.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc5fbe7629e454d3c4a621c8416e9a1956d7f2523296142d46edc17d7d54901e"}, - {file = "yarl-1.15.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d7c2224b6e8f40b39a61643212e5d974172394aae0244a9840f62aed4452ee4"}, - {file = "yarl-1.15.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a3e237e19fca6b4aa18e6bc7702d27c4e9460f1d0f3a792cdf4aefdc10d52411"}, - {file = "yarl-1.15.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:cd5857354c53d023fd97d06fb01b6c0f176cfc73ae03460a1812455095e214d6"}, - {file = "yarl-1.15.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:72d312f74665006911c4de95e1633c6e9e4b1f003ef4f76d4b36e01cfa7ed820"}, - {file = "yarl-1.15.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d8e5a1ee05b5d742accc42512a1d6a8c59f6906db1dd298d98e1a6ab98470373"}, - {file = "yarl-1.15.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2ce9052e9f4196e44221e3d3d51cdcfa3b1afea05afbd896cefdd233e9606d08"}, - {file = "yarl-1.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d2376327a557661424599278fbf3a1bcb96b90c8316743ba3d9ad831e794e11a"}, - {file = "yarl-1.15.1-cp313-cp313-win32.whl", hash = "sha256:e328110c15b4d2dbb00861feaa7e0ce5aebfc355406e0f6d9e46adcb5abe9a55"}, - {file = "yarl-1.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:5268b43abf47053dc0bbff72d78f69192dbe453fee9517036fc0a0cc84f341d7"}, - {file = "yarl-1.15.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ee09963524b5327e2bfe3dfecd19d0403d2b1afbd11a49a00d4d379c1551406e"}, - {file = "yarl-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cbe2765f54e5940c705c8c1c125f12c84f7bd486f7925bcb7abc6740b97fdd5c"}, - {file = "yarl-1.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a86cb224d1f31ed4c6ba79188b571d517fdc730c6edcf6baf6e71805d88f183f"}, - {file = "yarl-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b28dc68741c2eda94ac2ce9fb16c73aa9b90c0c0cdf99cf8a7c86dec94dc5de2"}, - {file = "yarl-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49db3c1a5e11241c1de2133efaa87a28ae9ac20583ad1ec16737761d9d8324a0"}, - {file = "yarl-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce3ed94298b3e6a5dad8b86633ba70564411f459ce5d0e4bf57e973ef3fc158"}, - {file = "yarl-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41b2be15daf51cd8d50f54d2277f17ac6e6fed198f105956a48d8240f10b154b"}, - {file = "yarl-1.15.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007531e85ca8d9fc35819709a52a6f0d133deecc3e2247f0e2b8350de36a3356"}, - {file = "yarl-1.15.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d6b646d8eae5fb38b9401daac98e40335228306305d491f52914b161f6cf319c"}, - {file = "yarl-1.15.1-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:c551571a5941093b86c0c05fdf136fafbe4308b83cd4fc77d92b21c6726f7c13"}, - {file = "yarl-1.15.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a6dd351c2f38c8168b6860338f4c30e9c160a0fb474dcbedf2224c63a86a7512"}, - {file = "yarl-1.15.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:759f18151f785888344ec1f28d5a2bd61ca2ccb80d04b65ab9548d524b1b9acb"}, - {file = "yarl-1.15.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:860fc2726e32b4ac3b0a44535853a9b1ea14975a8c4207609f2883dcfcbd5ecc"}, - {file = "yarl-1.15.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3c5782135b3a762e265b11dbb13df878d1a331ef498866036f743786adf70371"}, - {file = "yarl-1.15.1-cp38-cp38-win32.whl", hash = "sha256:f9a3a53622f0e905a7f3557b770d48e737b8a38141c81eecbcc947fac164d1f9"}, - {file = "yarl-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:d25da5fc7a2993e1d9818e4dfdc67c95c771678e0d3499a1d67e42bfa75890ba"}, - {file = "yarl-1.15.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6f3595518f4e8b97c0a2d01030e27937d22f2506a1503282b8965ae1dcd0dec6"}, - {file = "yarl-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c261d807048b9e17b0a3c413d4926c34b5563c6b94f95c17daff6053901d0ab0"}, - {file = "yarl-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f1cd16833ff1d6250350794c3df1be2ce0960fa64740699dfa688769aa1c6a89"}, - {file = "yarl-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e3959cfba2bb48a0d8b83f370452b400710dd0900f9fdad0ce9e913e6d65b8f"}, - {file = "yarl-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87593714a38a4a51efc967b0477c72f55a08ed6b801bfcf68656e68f233047c7"}, - {file = "yarl-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1181f8912e0d1bb31cae5ab630d350ad2e79aab4196faea3669c3599e05af44b"}, - {file = "yarl-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46448214e3b7099ab8cfba576b71b7742ce13a1cec7824eebe7a71fc8903b304"}, - {file = "yarl-1.15.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d44ec44b4771544b815cff0efa05f6d58e9f87e9b05aa15d13739111ae53df1e"}, - {file = "yarl-1.15.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa72a0e5037c2c91d1b945ff20698c01a7897b10ab93c0979b8543e2ad0b1d76"}, - {file = "yarl-1.15.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:bd756524c387478f0788937dfbe132d01663e783e1424f7d3a72df552521c995"}, - {file = "yarl-1.15.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6c3968e4ec6b44af29562824c7973c12c22041b2dc080613a7c41c7c09901579"}, - {file = "yarl-1.15.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:59aaa919f9898352cd3bf32d3a1bfc7d2aa399f83dd91b1915eaa684e27553b7"}, - {file = "yarl-1.15.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:65a41d40b34391aeb3b973410ed0ed86b3023e5371dce6e7ff1c57af5794391d"}, - {file = "yarl-1.15.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:54eef7907bb868e20ddcf4078e9a106e2c56a84ba31611038d28b9934ccb2a2c"}, - {file = "yarl-1.15.1-cp39-cp39-win32.whl", hash = "sha256:60c8b36f7ed73aeaa2948f27f9a8a905c23bf62e291b7b9fc53348b4789b180c"}, - {file = "yarl-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:b79a4df7029446ae8062f74c093a2f6c305f65b3ec89fa8ce3e064c0eeb36f3f"}, - {file = "yarl-1.15.1-py3-none-any.whl", hash = "sha256:ac28421ab71ec2d50eb7dff76a64ef81de92fb9738a81de2500b031b6f5f6038"}, - {file = "yarl-1.15.1.tar.gz", hash = "sha256:02e1c9e36528de270c22c06aac6a5a1de8cc870fafefb5e90e5b35cb8985d0b2"}, + {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e4ee8b8639070ff246ad3649294336b06db37a94bdea0d09ea491603e0be73b8"}, + {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a7cf963a357c5f00cb55b1955df8bbe68d2f2f65de065160a1c26b85a1e44172"}, + {file = "yarl-1.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:43ebdcc120e2ca679dba01a779333a8ea76b50547b55e812b8b92818d604662c"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3433da95b51a75692dcf6cc8117a31410447c75a9a8187888f02ad45c0a86c50"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38d0124fa992dbacd0c48b1b755d3ee0a9f924f427f95b0ef376556a24debf01"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ded1b1803151dd0f20a8945508786d57c2f97a50289b16f2629f85433e546d47"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace4cad790f3bf872c082366c9edd7f8f8f77afe3992b134cfc810332206884f"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c77494a2f2282d9bbbbcab7c227a4d1b4bb829875c96251f66fb5f3bae4fb053"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b7f227ca6db5a9fda0a2b935a2ea34a7267589ffc63c8045f0e4edb8d8dcf956"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:31561a5b4d8dbef1559b3600b045607cf804bae040f64b5f5bca77da38084a8a"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3e52474256a7db9dcf3c5f4ca0b300fdea6c21cca0148c8891d03a025649d935"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1af74a9529a1137c67c887ed9cde62cff53aa4d84a3adbec329f9ec47a3936"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:15c87339490100c63472a76d87fe7097a0835c705eb5ae79fd96e343473629ed"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:74abb8709ea54cc483c4fb57fb17bb66f8e0f04438cff6ded322074dbd17c7ec"}, + {file = "yarl-1.15.2-cp310-cp310-win32.whl", hash = "sha256:ffd591e22b22f9cb48e472529db6a47203c41c2c5911ff0a52e85723196c0d75"}, + {file = "yarl-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:1695497bb2a02a6de60064c9f077a4ae9c25c73624e0d43e3aa9d16d983073c2"}, + {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9fcda20b2de7042cc35cf911702fa3d8311bd40055a14446c1e62403684afdc5"}, + {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0545de8c688fbbf3088f9e8b801157923be4bf8e7b03e97c2ecd4dfa39e48e0e"}, + {file = "yarl-1.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbda058a9a68bec347962595f50546a8a4a34fd7b0654a7b9697917dc2bf810d"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ac2bc069f4a458634c26b101c2341b18da85cb96afe0015990507efec2e417"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd126498171f752dd85737ab1544329a4520c53eed3997f9b08aefbafb1cc53b"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3db817b4e95eb05c362e3b45dafe7144b18603e1211f4a5b36eb9522ecc62bcf"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:076b1ed2ac819933895b1a000904f62d615fe4533a5cf3e052ff9a1da560575c"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f8cfd847e6b9ecf9f2f2531c8427035f291ec286c0a4944b0a9fce58c6446046"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:32b66be100ac5739065496c74c4b7f3015cef792c3174982809274d7e51b3e04"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:34a2d76a1984cac04ff8b1bfc939ec9dc0914821264d4a9c8fd0ed6aa8d4cfd2"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0afad2cd484908f472c8fe2e8ef499facee54a0a6978be0e0cff67b1254fd747"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c68e820879ff39992c7f148113b46efcd6ec765a4865581f2902b3c43a5f4bbb"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:98f68df80ec6ca3015186b2677c208c096d646ef37bbf8b49764ab4a38183931"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56ec1eacd0a5d35b8a29f468659c47f4fe61b2cab948ca756c39b7617f0aa5"}, + {file = "yarl-1.15.2-cp311-cp311-win32.whl", hash = "sha256:eedc3f247ee7b3808ea07205f3e7d7879bc19ad3e6222195cd5fbf9988853e4d"}, + {file = "yarl-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:0ccaa1bc98751fbfcf53dc8dfdb90d96e98838010fc254180dd6707a6e8bb179"}, + {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:82d5161e8cb8f36ec778fd7ac4d740415d84030f5b9ef8fe4da54784a1f46c94"}, + {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa2bea05ff0a8fb4d8124498e00e02398f06d23cdadd0fe027d84a3f7afde31e"}, + {file = "yarl-1.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99e12d2bf587b44deb74e0d6170fec37adb489964dbca656ec41a7cd8f2ff178"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:243fbbbf003754fe41b5bdf10ce1e7f80bcc70732b5b54222c124d6b4c2ab31c"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:856b7f1a7b98a8c31823285786bd566cf06226ac4f38b3ef462f593c608a9bd6"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:553dad9af802a9ad1a6525e7528152a015b85fb8dbf764ebfc755c695f488367"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30c3ff305f6e06650a761c4393666f77384f1cc6c5c0251965d6bfa5fbc88f7f"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:353665775be69bbfc6d54c8d134bfc533e332149faeddd631b0bc79df0897f46"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f4fe99ce44128c71233d0d72152db31ca119711dfc5f2c82385ad611d8d7f897"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9c1e3ff4b89cdd2e1a24c214f141e848b9e0451f08d7d4963cb4108d4d798f1f"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:711bdfae4e699a6d4f371137cbe9e740dc958530cb920eb6f43ff9551e17cfbc"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4388c72174868884f76affcdd3656544c426407e0043c89b684d22fb265e04a5"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f0e1844ad47c7bd5d6fa784f1d4accc5f4168b48999303a868fe0f8597bde715"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5cafb02cf097a82d74403f7e0b6b9df3ffbfe8edf9415ea816314711764a27b"}, + {file = "yarl-1.15.2-cp312-cp312-win32.whl", hash = "sha256:156ececdf636143f508770bf8a3a0498de64da5abd890c7dbb42ca9e3b6c05b8"}, + {file = "yarl-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:435aca062444a7f0c884861d2e3ea79883bd1cd19d0a381928b69ae1b85bc51d"}, + {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:416f2e3beaeae81e2f7a45dc711258be5bdc79c940a9a270b266c0bec038fb84"}, + {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:173563f3696124372831007e3d4b9821746964a95968628f7075d9231ac6bb33"}, + {file = "yarl-1.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9ce2e0f6123a60bd1a7f5ae3b2c49b240c12c132847f17aa990b841a417598a2"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaea112aed589131f73d50d570a6864728bd7c0c66ef6c9154ed7b59f24da611"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4ca3b9f370f218cc2a0309542cab8d0acdfd66667e7c37d04d617012485f904"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23ec1d3c31882b2a8a69c801ef58ebf7bae2553211ebbddf04235be275a38548"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75119badf45f7183e10e348edff5a76a94dc19ba9287d94001ff05e81475967b"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78e6fdc976ec966b99e4daa3812fac0274cc28cd2b24b0d92462e2e5ef90d368"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8657d3f37f781d987037f9cc20bbc8b40425fa14380c87da0cb8dfce7c92d0fb"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:93bed8a8084544c6efe8856c362af08a23e959340c87a95687fdbe9c9f280c8b"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:69d5856d526802cbda768d3e6246cd0d77450fa2a4bc2ea0ea14f0d972c2894b"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ccad2800dfdff34392448c4bf834be124f10a5bc102f254521d931c1c53c455a"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a880372e2e5dbb9258a4e8ff43f13888039abb9dd6d515f28611c54361bc5644"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c998d0558805860503bc3a595994895ca0f7835e00668dadc673bbf7f5fbfcbe"}, + {file = "yarl-1.15.2-cp313-cp313-win32.whl", hash = "sha256:533a28754e7f7439f217550a497bb026c54072dbe16402b183fdbca2431935a9"}, + {file = "yarl-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:5838f2b79dc8f96fdc44077c9e4e2e33d7089b10788464609df788eb97d03aad"}, + {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fbbb63bed5fcd70cd3dd23a087cd78e4675fb5a2963b8af53f945cbbca79ae16"}, + {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2e93b88ecc8f74074012e18d679fb2e9c746f2a56f79cd5e2b1afcf2a8a786b"}, + {file = "yarl-1.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af8ff8d7dc07ce873f643de6dfbcd45dc3db2c87462e5c387267197f59e6d776"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66f629632220a4e7858b58e4857927dd01a850a4cef2fb4044c8662787165cf7"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:833547179c31f9bec39b49601d282d6f0ea1633620701288934c5f66d88c3e50"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2aa738e0282be54eede1e3f36b81f1e46aee7ec7602aa563e81e0e8d7b67963f"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a13a07532e8e1c4a5a3afff0ca4553da23409fad65def1b71186fb867eeae8d"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c45817e3e6972109d1a2c65091504a537e257bc3c885b4e78a95baa96df6a3f8"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:670eb11325ed3a6209339974b276811867defe52f4188fe18dc49855774fa9cf"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:d417a4f6943112fae3924bae2af7112562285848d9bcee737fc4ff7cbd450e6c"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bc8936d06cd53fddd4892677d65e98af514c8d78c79864f418bbf78a4a2edde4"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:954dde77c404084c2544e572f342aef384240b3e434e06cecc71597e95fd1ce7"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5bc0df728e4def5e15a754521e8882ba5a5121bd6b5a3a0ff7efda5d6558ab3d"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b71862a652f50babab4a43a487f157d26b464b1dedbcc0afda02fd64f3809d04"}, + {file = "yarl-1.15.2-cp38-cp38-win32.whl", hash = "sha256:63eab904f8630aed5a68f2d0aeab565dcfc595dc1bf0b91b71d9ddd43dea3aea"}, + {file = "yarl-1.15.2-cp38-cp38-win_amd64.whl", hash = "sha256:2cf441c4b6e538ba0d2591574f95d3fdd33f1efafa864faa077d9636ecc0c4e9"}, + {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a32d58f4b521bb98b2c0aa9da407f8bd57ca81f34362bcb090e4a79e9924fefc"}, + {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:766dcc00b943c089349d4060b935c76281f6be225e39994c2ccec3a2a36ad627"}, + {file = "yarl-1.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bed1b5dbf90bad3bfc19439258c97873eab453c71d8b6869c136346acfe497e7"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed20a4bdc635f36cb19e630bfc644181dd075839b6fc84cac51c0f381ac472e2"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d538df442c0d9665664ab6dd5fccd0110fa3b364914f9c85b3ef9b7b2e157980"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c6cf1d92edf936ceedc7afa61b07e9d78a27b15244aa46bbcd534c7458ee1b"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce44217ad99ffad8027d2fde0269ae368c86db66ea0571c62a000798d69401fb"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47a6000a7e833ebfe5886b56a31cb2ff12120b1efd4578a6fcc38df16cc77bd"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e52f77a0cd246086afde8815039f3e16f8d2be51786c0a39b57104c563c5cbb0"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:f9ca0e6ce7774dc7830dc0cc4bb6b3eec769db667f230e7c770a628c1aa5681b"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:136f9db0f53c0206db38b8cd0c985c78ded5fd596c9a86ce5c0b92afb91c3a19"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:173866d9f7409c0fb514cf6e78952e65816600cb888c68b37b41147349fe0057"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:6e840553c9c494a35e449a987ca2c4f8372668ee954a03a9a9685075228e5036"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:458c0c65802d816a6b955cf3603186de79e8fdb46d4f19abaec4ef0a906f50a7"}, + {file = "yarl-1.15.2-cp39-cp39-win32.whl", hash = "sha256:5b48388ded01f6f2429a8c55012bdbd1c2a0c3735b3e73e221649e524c34a58d"}, + {file = "yarl-1.15.2-cp39-cp39-win_amd64.whl", hash = "sha256:81dadafb3aa124f86dc267a2168f71bbd2bfb163663661ab0038f6e4b8edb810"}, + {file = "yarl-1.15.2-py3-none-any.whl", hash = "sha256:0d3105efab7c5c091609abacad33afff33bdff0035bece164c98bcf5a85ef90a"}, + {file = "yarl-1.15.2.tar.gz", hash = "sha256:a39c36f4218a5bb668b4f06874d676d35a035ee668e6e7e3538835c703634b84"}, ] [package.dependencies] @@ -4016,4 +4016,4 @@ polymarket = ["py-clob-client"] [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.13" -content-hash = "a325c6e59c500a5433e66e99aa4f5251c92939e23958e12e1423bc0dabf38b2b" +content-hash = "42b23b2496fce2868e3dce2bb5d8a853b77b64662a1e4e45124493b674ffb18e" diff --git a/pyproject.toml b/pyproject.toml index f786625799bf..c6c3125af835 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,7 +101,7 @@ types-toml = "^0.10.2" optional = true [tool.poetry.group.test.dependencies] -coverage = "^7.6.2" +coverage = "^7.6.3" pytest = "^7.4.4" pytest-aiohttp = "^1.0.5" pytest-asyncio = "==0.21.1" # Pinned due Cython: cannot set '__pytest_asyncio_scoped_event_loop' attribute of immutable type From 25320d39b0a4483ab67c7ead522733ebf6d17d5c Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 14 Oct 2024 18:20:25 +1100 Subject: [PATCH 130/224] Update release notes --- RELEASES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASES.md b/RELEASES.md index 83acb60c7e0f..284f78acdcab 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -18,6 +18,7 @@ Released on TBD (UTC). ### Internal Improvements - Ported `Throttler` to Rust (#1988), thanks @Pushkarm029 and @twitu +- Refined `RateLimiter` for `WebSocketClient` and add tests (#2000), thanks @Pushkarm029 - Refined `WebSocketClient` to close existing tasks on reconnect (#1986), thanks @davidsblom - Use Rust rate limiter for dYdX websockets (#1996, #1999), thanks @davidsblom - Improved error logs for dYdX websocket subscriptions (#1993), thanks @davidsblom From 078d18855d2dc43d155eae94f2d79a5c8015f3b1 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 14 Oct 2024 18:28:04 +1100 Subject: [PATCH 131/224] Refine log message --- nautilus_core/network/src/websocket.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_core/network/src/websocket.rs b/nautilus_core/network/src/websocket.rs index 03a3921780b9..1161f030dc83 100644 --- a/nautilus_core/network/src/websocket.rs +++ b/nautilus_core/network/src/websocket.rs @@ -83,7 +83,7 @@ impl WebSocketClientInner { /// Create an inner websocket client. pub async fn connect_url(config: WebSocketConfig) -> Result { if CryptoProvider::get_default().is_none() { - tracing::debug!("Installing `aws_lc_rs` cryptographic provider"); + tracing::debug!("Installing aws_lc_rs cryptographic provider"); // An error can occur on install if there is a race condition with another component match aws_lc_rs::default_provider().install_default() { Ok(_) => tracing::debug!("Cryptographic provider installed successfully"), From 6657e8a0c428769e12b9ec42e636cf95345fe015 Mon Sep 17 00:00:00 2001 From: Filip Macek Date: Mon, 14 Oct 2024 11:27:44 +0200 Subject: [PATCH 132/224] Fix check for OmsType in OrderMatchingEngine (#2003) --- nautilus_trader/backtest/matching_engine.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_trader/backtest/matching_engine.pyx b/nautilus_trader/backtest/matching_engine.pyx index ebe0ea282aa8..c95ecdac4e41 100644 --- a/nautilus_trader/backtest/matching_engine.pyx +++ b/nautilus_trader/backtest/matching_engine.pyx @@ -1996,7 +1996,7 @@ cdef class OrderMatchingEngine: cdef PositionId _get_position_id(self, Order order, bint generate=True): cdef PositionId position_id - if OmsType.HEDGING: + if self.oms_type == OmsType.HEDGING: position_id = self.cache.position_id(order.client_order_id) if position_id is not None: return position_id From 9864cb28197bb4841078eb929ec26bc5e1241d14 Mon Sep 17 00:00:00 2001 From: Filip Macek Date: Mon, 14 Oct 2024 11:28:26 +0200 Subject: [PATCH 133/224] Implement instrument status processing for SimulatedExchange (#2001) --- nautilus_core/backtest/src/exchange.rs | 60 ++++++++++++++++++- nautilus_core/backtest/src/matching_engine.rs | 28 ++++++++- 2 files changed, 84 insertions(+), 4 deletions(-) diff --git a/nautilus_core/backtest/src/exchange.rs b/nautilus_core/backtest/src/exchange.rs index 3e6b39fc148c..563beb0963e6 100644 --- a/nautilus_core/backtest/src/exchange.rs +++ b/nautilus_core/backtest/src/exchange.rs @@ -463,8 +463,30 @@ impl SimulatedExchange { } } - pub fn process_instrument_status(&mut self, _status: InstrumentStatus) { - todo!("process instrument status") + pub fn process_instrument_status(&mut self, status: InstrumentStatus) { + // TODO add module preprocessing + + if !self.matching_engines.contains_key(&status.instrument_id) { + let instrument = { + let cache = self.cache.as_ref().borrow(); + cache.instrument(&status.instrument_id).cloned() + }; + + if let Some(instrument) = instrument { + self.add_instrument(instrument).unwrap(); + } else { + panic!( + "No matching engine found for instrument {}", + status.instrument_id + ); + } + } + + if let Some(matching_engine) = self.matching_engines.get_mut(&status.instrument_id) { + matching_engine.process_status(status.action) + } else { + panic!("Matching engine should be initialized"); + } } pub fn process(&mut self, _ts_now: UnixNanos) { @@ -500,9 +522,13 @@ mod tests { deltas::OrderBookDeltas, order::BookOrder, quote::QuoteTick, + status::InstrumentStatus, trade::TradeTick, }, - enums::{AccountType, AggressorSide, BookAction, BookType, OmsType, OrderSide}, + enums::{ + AccountType, AggressorSide, BookAction, BookType, MarketStatus, MarketStatusAction, + OmsType, OrderSide, + }, identifiers::{TradeId, Venue}, instruments::{ any::InstrumentAny, crypto_perpetual::CryptoPerpetual, stubs::crypto_perpetual_ethusdt, @@ -813,4 +839,32 @@ mod tests { // best ask price is the first order in orderbook deltas assert_eq!(best_ask_price, Some(Price::from("1000.00"))); } + + fn test_exchange_process_instrument_status(crypto_perpetual_ethusdt: CryptoPerpetual) { + let mut exchange: SimulatedExchange = + get_exchange(Venue::new("BINANCE"), AccountType::Margin, BookType::L2_MBP); + let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); + + // register instrument + exchange.add_instrument(instrument).unwrap(); + + let instrument_status = InstrumentStatus::new( + crypto_perpetual_ethusdt.id, + MarketStatusAction::Close, // close the market + UnixNanos::from(1), + UnixNanos::from(1), + None, + None, + None, + None, + None, + ); + + exchange.process_instrument_status(instrument_status); + + let matching_engine = exchange + .get_matching_engine(crypto_perpetual_ethusdt.id) + .unwrap(); + assert_eq!(matching_engine.market_status, MarketStatus::Closed); + } } diff --git a/nautilus_core/backtest/src/matching_engine.rs b/nautilus_core/backtest/src/matching_engine.rs index 76ab8d5beae9..381fce410250 100644 --- a/nautilus_core/backtest/src/matching_engine.rs +++ b/nautilus_core/backtest/src/matching_engine.rs @@ -35,7 +35,7 @@ use nautilus_model::{ }, enums::{ AccountType, AggregationSource, AggressorSide, BookType, ContingencyType, LiquiditySide, - MarketStatus, OmsType, OrderSide, OrderStatus, OrderType, PriceType, + MarketStatus, MarketStatusAction, OmsType, OrderSide, OrderStatus, OrderType, PriceType, }, events::order::{ OrderAccepted, OrderCancelRejected, OrderCanceled, OrderEventAny, OrderExpired, @@ -485,6 +485,32 @@ impl OrderMatchingEngine { self.iterate(trade.ts_event); } + pub fn process_status(&mut self, action: MarketStatusAction) { + log::debug!("Processing {action}"); + + // check if market is closed and market opens with + // trading or pre-open status + if self.market_status == MarketStatus::Closed + && (action == MarketStatusAction::Trading || action == MarketStatusAction::PreOpen) + { + self.market_status = MarketStatus::Open; + } + // check if market is open and market pauses + if self.market_status == MarketStatus::Open && action == MarketStatusAction::Pause { + self.market_status = MarketStatus::Paused; + } + // check if market is open and market suspends + if self.market_status == MarketStatus::Open && action == MarketStatusAction::Suspend { + self.market_status = MarketStatus::Suspended; + } + // check if market is open and we halt or close + if self.market_status == MarketStatus::Open + && (action == MarketStatusAction::Halt || action == MarketStatusAction::Close) + { + self.market_status = MarketStatus::Closed; + } + } + // -- TRADING COMMANDS ------------------------------------------------------------------------ #[allow(clippy::needless_return)] From b2db3e0ba87e0e49acae4e960e92e32852ae3619 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 14 Oct 2024 20:30:57 +1100 Subject: [PATCH 134/224] Update release notes --- RELEASES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/RELEASES.md b/RELEASES.md index 284f78acdcab..b013146e239f 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -23,7 +23,7 @@ Released on TBD (UTC). - Use Rust rate limiter for dYdX websockets (#1996, #1999), thanks @davidsblom - Improved error logs for dYdX websocket subscriptions (#1993), thanks @davidsblom - Standardized log and error message syntax in Rust -- Continue porting `SimulatedExchange` to Rust (#1997, #1998), thanks @filipmacek +- Continue porting `SimulatedExchange` to Rust (#1997, #1998, #2001), thanks @filipmacek ### Breaking Changes - Removed legacy `TardisQuoteDataLoader` (now redundant with new Rust implemented loader) @@ -35,6 +35,7 @@ Released on TBD (UTC). - Fixed `WebSocketClient` error handling on writer close, thanks for reporting @davidsblom - Fixed resubscribing to orderbook in batched mode for dYdX (#1985), thanks @davidsblom - Fixed Betfair tests related to symbology (#1988), thanks @limx0 +- Fixed check for `OmsType` in `OrderMatchingEngine` position ID processing (#2003), thanks @filipmacek --- From 786c77357f336a2359bb0bb477aecfc7580c0b1f Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 15 Oct 2024 07:17:24 +1100 Subject: [PATCH 135/224] Refine custom data handling for postgres --- nautilus_core/common/src/custom.rs | 10 +++------- nautilus_core/common/src/python/custom.rs | 9 +++++---- nautilus_core/infrastructure/src/sql/models/types.rs | 3 ++- nautilus_core/infrastructure/src/sql/queries.rs | 5 ++--- .../tests/test_cache_database_postgres.rs | 8 ++++++-- nautilus_trader/cache/postgres/transformers.py | 4 +++- nautilus_trader/core/nautilus_pyo3.pyi | 2 +- schema/tables.sql | 2 +- .../infrastructure/test_cache_database_postgres.py | 1 + 9 files changed, 24 insertions(+), 20 deletions(-) diff --git a/nautilus_core/common/src/custom.rs b/nautilus_core/common/src/custom.rs index df373b6c19c8..073e75cd1761 100644 --- a/nautilus_core/common/src/custom.rs +++ b/nautilus_core/common/src/custom.rs @@ -15,6 +15,7 @@ //! A user custom data type. +use bytes::Bytes; use nautilus_core::nanos::UnixNanos; use nautilus_model::data::DataType; use serde::{Deserialize, Serialize}; @@ -28,19 +29,14 @@ use serde::{Deserialize, Serialize}; )] pub struct CustomData { pub data_type: DataType, - pub value: String, // Flexible for now + pub value: Bytes, pub ts_event: UnixNanos, pub ts_init: UnixNanos, } impl CustomData { /// Creates a new [`CustomData`] instance. - pub fn new( - data_type: DataType, - value: String, - ts_event: UnixNanos, - ts_init: UnixNanos, - ) -> Self { + pub fn new(data_type: DataType, value: Bytes, ts_event: UnixNanos, ts_init: UnixNanos) -> Self { Self { data_type, value, diff --git a/nautilus_core/common/src/python/custom.rs b/nautilus_core/common/src/python/custom.rs index 7adc73da4510..ed39d7fe0031 100644 --- a/nautilus_core/common/src/python/custom.rs +++ b/nautilus_core/common/src/python/custom.rs @@ -15,6 +15,7 @@ use std::{collections::HashMap, ops::Deref}; +use bytes::Bytes; use nautilus_core::{nanos::UnixNanos, time::AtomicTime}; use nautilus_model::data::DataType; use pyo3::{ @@ -29,10 +30,10 @@ use crate::custom::CustomData; #[pymethods] impl CustomData { #[new] - fn py_new(data_type: DataType, value: String, ts_event: u64, ts_init: u64) -> Self { + fn py_new(data_type: DataType, value: Vec, ts_event: u64, ts_init: u64) -> Self { Self::new( data_type, - value, + Bytes::from(value), UnixNanos::from(ts_event), UnixNanos::from(ts_init), ) @@ -46,8 +47,8 @@ impl CustomData { #[getter] #[pyo3(name = "value")] - fn py_value(&self) -> &str { - self.value.as_str() + fn py_value(&self) -> Vec { + self.value.to_vec() } #[getter] diff --git a/nautilus_core/infrastructure/src/sql/models/types.rs b/nautilus_core/infrastructure/src/sql/models/types.rs index 7d1463a1abbb..c5e78bcc9d73 100644 --- a/nautilus_core/infrastructure/src/sql/models/types.rs +++ b/nautilus_core/infrastructure/src/sql/models/types.rs @@ -13,6 +13,7 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- +use bytes::Bytes; use indexmap::IndexMap; use nautilus_common::{custom::CustomData, signal::Signal}; use nautilus_core::nanos::UnixNanos; @@ -65,7 +66,7 @@ impl<'r> FromRow<'r, PgRow> for CustomDataModel { None => None, }; let data_type = DataType::new(type_name, metadata); - let value = row.try_get::("value")?; + let value = row.try_get::, _>("value").map(Bytes::from)?; let ts_event = row.try_get::<&str, _>("ts_event").map(UnixNanos::from)?; let ts_init = row.try_get::<&str, _>("ts_init").map(UnixNanos::from)?; let custom = CustomData::new(data_type, value, ts_event, ts_init); diff --git a/nautilus_core/infrastructure/src/sql/queries.rs b/nautilus_core/infrastructure/src/sql/queries.rs index 68fff8a1ad7d..090abe8d13b2 100644 --- a/nautilus_core/infrastructure/src/sql/queries.rs +++ b/nautilus_core/infrastructure/src/sql/queries.rs @@ -31,7 +31,6 @@ use nautilus_model::{ currency::Currency, }, }; -use serde_json::Value; use sqlx::{PgPool, Row}; use super::models::types::{CustomDataModel, SignalModel}; @@ -792,9 +791,9 @@ impl DatabaseQueries { data.data_type .metadata() .as_ref() - .map_or(Ok(Value::Null), serde_json::to_value)?, + .map_or_else(|| Ok(serde_json::Value::Null), serde_json::to_value)?, ) - .bind(data.value.clone()) + .bind(data.value.to_vec()) .bind(data.ts_event.to_string()) .bind(data.ts_init.to_string()) .execute(pool) diff --git a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs index bfc9d74e461e..2beaafb2fe5a 100644 --- a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs +++ b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs @@ -529,10 +529,14 @@ mod serial_tests { // Add custom data let metadata = indexmap! {"a".to_string() => "1".to_string(), "b".to_string() => "2".to_string()}; - let data_type = DataType::new("Theo", Some(metadata)); + let data_type = DataType::new("TestData", Some(metadata)); + let json_stub_value = r#"{"a":"1","b":"2"}"#; + let json_value: serde_json::Value = serde_json::from_str(json_stub_value).unwrap(); + let serialized_bytes = serde_json::to_vec(&json_value).unwrap(); + let data = CustomData::new( data_type.clone(), - "hello-world".to_string(), + Bytes::from(serialized_bytes), UnixNanos::default(), UnixNanos::default(), ); diff --git a/nautilus_trader/cache/postgres/transformers.py b/nautilus_trader/cache/postgres/transformers.py index f4859a81a026..48040a1d21cb 100644 --- a/nautilus_trader/cache/postgres/transformers.py +++ b/nautilus_trader/cache/postgres/transformers.py @@ -13,6 +13,8 @@ # limitations under the License. # ------------------------------------------------------------------------------------------------- +import msgspec + from nautilus_trader.accounting.accounts.base import Account from nautilus_trader.accounting.accounts.cash import CashAccount from nautilus_trader.accounting.accounts.margin import MarginAccount @@ -383,7 +385,7 @@ def transform_custom_data_to_pyo3(data: CustomData) -> nautilus_pyo3.CustomData: data_type_pyo3 = transform_data_type_to_pyo3(data.data_type) return nautilus_pyo3.CustomData( data_type_pyo3, - value=str(data.data), + value=msgspec.json.encode(data.data.to_dict()), ts_event=data.ts_event, ts_init=data.ts_init, ) diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index 157713799bc8..53f95ec00c22 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -271,7 +271,7 @@ class CustomData: def __init__( self, data_type: DataType, - value: str, + value: bytes, ts_event: int, ts_init: int, ) -> None: ... diff --git a/schema/tables.sql b/schema/tables.sql index 5b166aeb342f..14ba88eb9ed0 100644 --- a/schema/tables.sql +++ b/schema/tables.sql @@ -222,7 +222,7 @@ CREATE TABLE IF NOT EXISTS "custom" ( id BIGSERIAL PRIMARY KEY NOT NULL, data_type TEXT NOT NULL, metadata JSONB NOT NULL, - value TEXT NOT NULL, + value BYTEA NOT NULL, ts_event TEXT NOT NULL, ts_init TEXT NOT NULL, created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, diff --git a/tests/integration_tests/infrastructure/test_cache_database_postgres.py b/tests/integration_tests/infrastructure/test_cache_database_postgres.py index ead254f63055..5c1ec2a0b7e9 100644 --- a/tests/integration_tests/infrastructure/test_cache_database_postgres.py +++ b/tests/integration_tests/infrastructure/test_cache_database_postgres.py @@ -624,6 +624,7 @@ async def test_add_and_load_signals(self): signals = self.database.load_signals(signal_cls, signal_name) assert len(signals) == 1 + @pytest.mark.skip(reason="WIP") @pytest.mark.asyncio async def test_add_and_load_custom_data(self): metadata = {"a": "1", "b": "2"} From 952e38b12a647a05b3813c23686ab15716d11703 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 15 Oct 2024 16:53:23 +1100 Subject: [PATCH 136/224] Continue TardisCSVDataLoader testing --- nautilus_core/adapters/src/tardis/csv.rs | 25 +++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/csv.rs b/nautilus_core/adapters/src/tardis/csv.rs index 1692dd303d40..6514d29572d6 100644 --- a/nautilus_core/adapters/src/tardis/csv.rs +++ b/nautilus_core/adapters/src/tardis/csv.rs @@ -188,7 +188,7 @@ pub fn load_depth10_from_snapshot5>( 2 => record.bids_2_price, 3 => record.bids_3_price, 4 => record.bids_4_price, - _ => None, // Unreachable, but for safety + _ => panic!("Invalid level for snapshot5 -> depth10 parsing"), }, match i { 0 => record.bids_0_amount, @@ -196,7 +196,7 @@ pub fn load_depth10_from_snapshot5>( 2 => record.bids_2_amount, 3 => record.bids_3_amount, 4 => record.bids_4_amount, - _ => None, // Unreachable, but for safety + _ => panic!("Invalid level for snapshot5 -> depth10 parsing"), }, price_precision, size_precision, @@ -298,7 +298,7 @@ pub fn load_depth10_from_snapshot25>( 7 => record.bids_7_price, 8 => record.bids_8_price, 9 => record.bids_9_price, - _ => None, // Unreachable, but for safety + _ => panic!("Invalid level for snapshot25 -> depth10 parsing"), }, match i { 0 => record.bids_0_amount, @@ -311,7 +311,7 @@ pub fn load_depth10_from_snapshot25>( 7 => record.bids_7_amount, 8 => record.bids_8_amount, 9 => record.bids_9_amount, - _ => None, // Unreachable, but for safety + _ => panic!("Invalid level for snapshot25 -> depth10 parsing"), }, price_precision, size_precision, @@ -333,7 +333,7 @@ pub fn load_depth10_from_snapshot25>( 7 => record.asks_7_price, 8 => record.asks_8_price, 9 => record.asks_9_price, - _ => None, // Unreachable, but for safety + _ => panic!("Invalid level for snapshot25 -> depth10 parsing"), }, match i { 0 => record.asks_0_amount, @@ -346,7 +346,7 @@ pub fn load_depth10_from_snapshot25>( 7 => record.asks_7_amount, 8 => record.asks_8_amount, 9 => record.asks_9_amount, - _ => None, // Unreachable, but for safety + _ => panic!("Invalid level for snapshot25 -> depth10 parsing"), }, price_precision, size_precision, @@ -523,7 +523,18 @@ mod tests { let depths = load_depth10_from_snapshot25(filepath, 1, 0, None, Some(100_000)).unwrap(); assert_eq!(depths.len(), 100_000); - // TODO: Assert every field + assert_eq!( + depths[0].instrument_id, + InstrumentId::from("BTCUSDT.BINANCE") + ); + assert_eq!(depths[0].bids.len(), 10); + assert_eq!(depths[0].asks.len(), 10); + assert_eq!(depths[0].bid_counts.len(), 10); + assert_eq!(depths[0].ask_counts.len(), 10); + assert_eq!(depths[0].flags, 128); + assert_eq!(depths[0].ts_event, 1598918403696000000); + assert_eq!(depths[0].ts_init, 1598918403810979000); + assert_eq!(depths[0].bids[0].price, Price::from("0")); // TODO: This should not be zero } #[rstest] From d069c06e6aa8b413844efe45f224d1c0f00b7733 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 15 Oct 2024 18:24:28 +1100 Subject: [PATCH 137/224] Standardize Postgres adapter method ordering --- .../infrastructure/src/python/sql/cache.rs | 214 +++++++++--------- nautilus_core/infrastructure/src/sql/cache.rs | 22 +- nautilus_trader/cache/cache.pxd | 2 +- nautilus_trader/cache/cache.pyx | 34 +-- nautilus_trader/cache/postgres/adapter.py | 100 ++++---- .../cache/postgres/transformers.py | 2 - 6 files changed, 186 insertions(+), 188 deletions(-) diff --git a/nautilus_core/infrastructure/src/python/sql/cache.rs b/nautilus_core/infrastructure/src/python/sql/cache.rs index 09a1c2523fde..9f45c5a6f5b8 100644 --- a/nautilus_core/infrastructure/src/python/sql/cache.rs +++ b/nautilus_core/infrastructure/src/python/sql/cache.rs @@ -79,16 +79,6 @@ impl PostgresCacheDatabase { result.map_err(to_pyruntime_err) } - #[pyo3(name = "add")] - fn py_add(mut slf: PyRefMut<'_, Self>, key: String, value: Vec) -> PyResult<()> { - slf.add(key, Bytes::from(value)).map_err(to_pyruntime_err) - } - - #[pyo3(name = "add_currency")] - fn py_add_currency(mut slf: PyRefMut<'_, Self>, currency: Currency) -> PyResult<()> { - slf.add_currency(¤cy).map_err(to_pyruntime_err) - } - #[pyo3(name = "load_instrument")] fn py_load_instrument( slf: PyRef<'_, Self>, @@ -122,39 +112,6 @@ impl PostgresCacheDatabase { }) } - #[pyo3(name = "add_instrument")] - fn py_add_instrument( - mut slf: PyRefMut<'_, Self>, - instrument: PyObject, - py: Python<'_>, - ) -> PyResult<()> { - let instrument_any = pyobject_to_instrument_any(py, instrument)?; - slf.add_instrument(&instrument_any) - .map_err(to_pyruntime_err) - } - - #[pyo3(name = "add_order")] - fn py_add_order( - mut slf: PyRefMut<'_, Self>, - order: PyObject, - client_id: Option, - py: Python<'_>, - ) -> PyResult<()> { - let order_any = convert_pyobject_to_order_any(py, order)?; - slf.add_order(&order_any, client_id) - .map_err(to_pyruntime_err) - } - - #[pyo3(name = "update_order")] - fn py_update_order( - mut slf: PyRefMut<'_, Self>, - order: PyObject, - py: Python<'_>, - ) -> PyResult<()> { - let order_any = convert_pyobject_to_order_any(py, order)?; - slf.update_order(&order_any).map_err(to_pyruntime_err) - } - #[pyo3(name = "load_order")] fn py_load_order( slf: PyRef<'_, Self>, @@ -175,16 +132,6 @@ impl PostgresCacheDatabase { }) } - #[pyo3(name = "add_account")] - fn py_add_account( - mut slf: PyRefMut<'_, Self>, - account: PyObject, - py: Python<'_>, - ) -> PyResult<()> { - let account_any = convert_pyobject_to_account_any(py, account)?; - slf.add_account(&account_any).map_err(to_pyruntime_err) - } - #[pyo3(name = "load_account")] fn py_load_account( slf: PyRef<'_, Self>, @@ -205,72 +152,44 @@ impl PostgresCacheDatabase { }) } - #[pyo3(name = "update_account")] - fn py_update_account( - mut slf: PyRefMut<'_, Self>, - order: PyObject, - py: Python<'_>, - ) -> PyResult<()> { - let order_any = convert_pyobject_to_account_any(py, order)?; - slf.update_account(&order_any).map_err(to_pyruntime_err) - } - - #[pyo3(name = "add_trade")] - fn py_add_trade(mut slf: PyRefMut<'_, Self>, trade: PyObject, py: Python<'_>) -> PyResult<()> { - let trade = trade.extract::(py)?; - slf.add_trade(&trade).map_err(to_pyruntime_err) - } - - #[pyo3(name = "load_trades")] - fn py_load_trades( + #[pyo3(name = "load_quotes")] + fn py_load_quotes( slf: PyRef<'_, Self>, instrument_id: InstrumentId, py: Python<'_>, ) -> PyResult> { get_runtime().block_on(async { - let result = DatabaseQueries::load_trades(&slf.pool, &instrument_id) + let result = DatabaseQueries::load_quotes(&slf.pool, &instrument_id) .await .unwrap(); - let mut trades = Vec::new(); - for trade in result { - let py_object = trade.into_py(py); - trades.push(py_object); + let mut quotes = Vec::new(); + for quote in result { + let py_object = quote.into_py(py); + quotes.push(py_object); } - Ok(trades) + Ok(quotes) }) } - #[pyo3(name = "add_quote")] - fn py_add_quote(mut slf: PyRefMut<'_, Self>, quote: PyObject, py: Python<'_>) -> PyResult<()> { - let quote = quote.extract::(py)?; - slf.add_quote("e).map_err(to_pyruntime_err) - } - - #[pyo3(name = "load_quotes")] - fn py_load_quotes( + #[pyo3(name = "load_trades")] + fn py_load_trades( slf: PyRef<'_, Self>, instrument_id: InstrumentId, py: Python<'_>, ) -> PyResult> { get_runtime().block_on(async { - let result = DatabaseQueries::load_quotes(&slf.pool, &instrument_id) + let result = DatabaseQueries::load_trades(&slf.pool, &instrument_id) .await .unwrap(); - let mut quotes = Vec::new(); - for quote in result { - let py_object = quote.into_py(py); - quotes.push(py_object); + let mut trades = Vec::new(); + for trade in result { + let py_object = trade.into_py(py); + trades.push(py_object); } - Ok(quotes) + Ok(trades) }) } - #[pyo3(name = "add_bar")] - fn py_add_bar(mut slf: PyRefMut<'_, Self>, bar: PyObject, py: Python<'_>) -> PyResult<()> { - let bar = bar.extract::(py)?; - slf.add_bar(&bar).map_err(to_pyruntime_err) - } - #[pyo3(name = "load_bars")] fn py_load_bars( slf: PyRef<'_, Self>, @@ -290,11 +209,6 @@ impl PostgresCacheDatabase { }) } - #[pyo3(name = "add_signal")] - fn py_add_signal(mut slf: PyRefMut<'_, Self>, signal: Signal) -> PyResult<()> { - slf.add_signal(&signal).map_err(to_pyruntime_err) - } - #[pyo3(name = "load_signals")] fn py_load_signals(slf: PyRef<'_, Self>, name: &str) -> PyResult> { get_runtime().block_on(async { @@ -304,11 +218,6 @@ impl PostgresCacheDatabase { }) } - #[pyo3(name = "add_custom_data")] - fn py_add_custom_data(mut slf: PyRefMut<'_, Self>, data: CustomData) -> PyResult<()> { - slf.add_custom_data(&data).map_err(to_pyruntime_err) - } - #[pyo3(name = "load_custom_data")] fn py_load_custom_data(slf: PyRef<'_, Self>, data_type: DataType) -> PyResult> { get_runtime().block_on(async { @@ -317,4 +226,95 @@ impl PostgresCacheDatabase { .map_err(to_pyruntime_err) }) } + + #[pyo3(name = "add")] + fn py_add(mut slf: PyRefMut<'_, Self>, key: String, value: Vec) -> PyResult<()> { + slf.add(key, Bytes::from(value)).map_err(to_pyruntime_err) + } + + #[pyo3(name = "add_currency")] + fn py_add_currency(mut slf: PyRefMut<'_, Self>, currency: Currency) -> PyResult<()> { + slf.add_currency(¤cy).map_err(to_pyruntime_err) + } + + #[pyo3(name = "add_instrument")] + fn py_add_instrument( + mut slf: PyRefMut<'_, Self>, + instrument: PyObject, + py: Python<'_>, + ) -> PyResult<()> { + let instrument_any = pyobject_to_instrument_any(py, instrument)?; + slf.add_instrument(&instrument_any) + .map_err(to_pyruntime_err) + } + + #[pyo3(name = "add_order")] + fn py_add_order( + mut slf: PyRefMut<'_, Self>, + order: PyObject, + client_id: Option, + py: Python<'_>, + ) -> PyResult<()> { + let order_any = convert_pyobject_to_order_any(py, order)?; + slf.add_order(&order_any, client_id) + .map_err(to_pyruntime_err) + } + + #[pyo3(name = "add_account")] + fn py_add_account( + mut slf: PyRefMut<'_, Self>, + account: PyObject, + py: Python<'_>, + ) -> PyResult<()> { + let account_any = convert_pyobject_to_account_any(py, account)?; + slf.add_account(&account_any).map_err(to_pyruntime_err) + } + + #[pyo3(name = "add_quote")] + fn py_add_quote(mut slf: PyRefMut<'_, Self>, quote: PyObject, py: Python<'_>) -> PyResult<()> { + let quote = quote.extract::(py)?; + slf.add_quote("e).map_err(to_pyruntime_err) + } + + #[pyo3(name = "add_trade")] + fn py_add_trade(mut slf: PyRefMut<'_, Self>, trade: PyObject, py: Python<'_>) -> PyResult<()> { + let trade = trade.extract::(py)?; + slf.add_trade(&trade).map_err(to_pyruntime_err) + } + + #[pyo3(name = "add_bar")] + fn py_add_bar(mut slf: PyRefMut<'_, Self>, bar: PyObject, py: Python<'_>) -> PyResult<()> { + let bar = bar.extract::(py)?; + slf.add_bar(&bar).map_err(to_pyruntime_err) + } + + #[pyo3(name = "add_signal")] + fn py_add_signal(mut slf: PyRefMut<'_, Self>, signal: Signal) -> PyResult<()> { + slf.add_signal(&signal).map_err(to_pyruntime_err) + } + + #[pyo3(name = "add_custom_data")] + fn py_add_custom_data(mut slf: PyRefMut<'_, Self>, data: CustomData) -> PyResult<()> { + slf.add_custom_data(&data).map_err(to_pyruntime_err) + } + + #[pyo3(name = "update_order")] + fn py_update_order( + mut slf: PyRefMut<'_, Self>, + order: PyObject, + py: Python<'_>, + ) -> PyResult<()> { + let order_any = convert_pyobject_to_order_any(py, order)?; + slf.update_order(&order_any).map_err(to_pyruntime_err) + } + + #[pyo3(name = "update_account")] + fn py_update_account( + mut slf: PyRefMut<'_, Self>, + order: PyObject, + py: Python<'_>, + ) -> PyResult<()> { + let order_any = convert_pyobject_to_account_any(py, order)?; + slf.update_account(&order_any).map_err(to_pyruntime_err) + } } diff --git a/nautilus_core/infrastructure/src/sql/cache.rs b/nautilus_core/infrastructure/src/sql/cache.rs index 662909a6c91c..fd00f16c9493 100644 --- a/nautilus_core/infrastructure/src/sql/cache.rs +++ b/nautilus_core/infrastructure/src/sql/cache.rs @@ -67,11 +67,11 @@ pub enum DatabaseQuery { AddInstrument(InstrumentAny), AddOrder(OrderAny, Option, bool), AddAccount(AccountAny, bool), - AddTrade(TradeTick), - AddQuote(QuoteTick), - AddBar(Bar), AddSignal(Signal), AddCustom(CustomData), + AddQuote(QuoteTick), + AddTrade(TradeTick), + AddBar(Bar), } fn get_buffer_interval() -> Duration { @@ -221,21 +221,21 @@ async fn drain_buffer(pool: &PgPool, buffer: &mut VecDeque) { .unwrap() } }, - DatabaseQuery::AddTrade(trade) => { - DatabaseQueries::add_trade(pool, &trade).await.unwrap(); + DatabaseQuery::AddSignal(signal) => { + DatabaseQueries::add_signal(pool, &signal).await.unwrap(); + } + DatabaseQuery::AddCustom(data) => { + DatabaseQueries::add_custom_data(pool, &data).await.unwrap(); } DatabaseQuery::AddQuote(quote) => { DatabaseQueries::add_quote(pool, "e).await.unwrap(); } + DatabaseQuery::AddTrade(trade) => { + DatabaseQueries::add_trade(pool, &trade).await.unwrap(); + } DatabaseQuery::AddBar(bar) => { DatabaseQueries::add_bar(pool, &bar).await.unwrap(); } - DatabaseQuery::AddSignal(signal) => { - DatabaseQueries::add_signal(pool, &signal).await.unwrap(); - } - DatabaseQuery::AddCustom(data) => { - DatabaseQueries::add_custom_data(pool, &data).await.unwrap(); - } } } } diff --git a/nautilus_trader/cache/cache.pxd b/nautilus_trader/cache/cache.pxd index 7fb411c0066c..9c9934727382 100644 --- a/nautilus_trader/cache/cache.pxd +++ b/nautilus_trader/cache/cache.pxd @@ -174,8 +174,8 @@ cdef class Cache(CacheFacade): cpdef void update_order_pending_cancel_local(self, Order order) cpdef void update_position(self, Position position) cpdef void update_actor(self, Actor actor) - cpdef void delete_actor(self, Actor actor) cpdef void update_strategy(self, Strategy strategy) + cpdef void delete_actor(self, Actor actor) cpdef void delete_strategy(self, Strategy strategy) cpdef void heartbeat(self, datetime timestamp) diff --git a/nautilus_trader/cache/cache.pyx b/nautilus_trader/cache/cache.pyx index 806502081821..28dd818a2a45 100644 --- a/nautilus_trader/cache/cache.pyx +++ b/nautilus_trader/cache/cache.pyx @@ -1905,6 +1905,23 @@ cdef class Cache(CacheFacade): if self._database is not None: self._database.update_actor(actor) + cpdef void update_strategy(self, Strategy strategy): + """ + Update the given strategy state in the cache. + + Parameters + ---------- + strategy : Strategy + The strategy to update. + """ + Condition.not_none(strategy, "strategy") + + self._index_strategies.add(strategy.id) + + # Update database + if self._database is not None: + self._database.update_strategy(strategy) + cpdef void delete_actor(self, Actor actor): """ Delete the given actor from the cache. @@ -1930,23 +1947,6 @@ cdef class Cache(CacheFacade): self._database.delete_actor(actor.id) self._log.debug(f"Deleted Actor(id={actor.id.value})") - cpdef void update_strategy(self, Strategy strategy): - """ - Update the given strategy state in the cache. - - Parameters - ---------- - strategy : Strategy - The strategy to update. - """ - Condition.not_none(strategy, "strategy") - - self._index_strategies.add(strategy.id) - - # Update database - if self._database is not None: - self._database.update_strategy(strategy) - cpdef void delete_strategy(self, Strategy strategy): """ Delete the given strategy from the cache. diff --git a/nautilus_trader/cache/postgres/adapter.py b/nautilus_trader/cache/postgres/adapter.py index f00ec9c0807d..1928fd690953 100644 --- a/nautilus_trader/cache/postgres/adapter.py +++ b/nautilus_trader/cache/postgres/adapter.py @@ -54,7 +54,7 @@ class CachePostgresAdapter(CacheDatabaseFacade): def __init__( self, config: CacheConfig | None = None, - ): + ) -> None: if config: config = CacheConfig() super().__init__(config) @@ -67,13 +67,6 @@ def load(self): data = self._backing.load() return {key: bytes(value) for key, value in data.items()} - def add(self, key: str, value: bytes): - self._backing.add(key, value) - - def add_currency(self, currency: Currency): - currency_pyo3 = transform_currency_to_pyo3(currency) - self._backing.add_currency(currency_pyo3) - def load_currencies(self) -> dict[str, Currency]: currencies = self._backing.load_currencies() return {currency.code: transform_currency_from_pyo3(currency) for currency in currencies} @@ -84,23 +77,11 @@ def load_currency(self, code: str) -> Currency | None: return transform_currency_from_pyo3(currency_pyo3) return None - def add_instrument(self, instrument: Instrument): - instrument_pyo3 = transform_instrument_to_pyo3(instrument) - self._backing.add_instrument(instrument_pyo3) - def load_instrument(self, instrument_id: InstrumentId) -> Instrument: instrument_id_pyo3 = nautilus_pyo3.InstrumentId.from_str(str(instrument_id)) instrument_pyo3 = self._backing.load_instrument(instrument_id_pyo3) return transform_instrument_from_pyo3(instrument_pyo3) - def add_order(self, order: Order): - order_pyo3 = transform_order_to_pyo3(order) - self._backing.add_order(order_pyo3) - - def update_order(self, order: Order): - order_pyo3 = transform_order_to_pyo3(order) - self._backing.update_order(order_pyo3) - def load_order(self, client_order_id: ClientOrderId): order_id_pyo3 = nautilus_pyo3.ClientOrderId.from_str(str(client_order_id)) order_pyo3 = self._backing.load_order(order_id_pyo3) @@ -112,10 +93,6 @@ def load_orders(self): orders = self._backing.load_orders() return [transform_order_from_pyo3(order) for order in orders] - def add_account(self, account: Account): - account_pyo3 = transform_account_to_pyo3(account) - self._backing.add_account(account_pyo3) - def load_account(self, account_id: AccountId): account_id_pyo3 = nautilus_pyo3.AccountId.from_str(str(account_id)) account_pyo3 = self._backing.load_account(account_id_pyo3) @@ -123,50 +100,73 @@ def load_account(self, account_id: AccountId): return transform_account_from_pyo3(account_pyo3) return None - def update_account(self, account: Account): - account_pyo3 = transform_account_to_pyo3(account) - self._backing.update_account(account_pyo3) - - def add_trade(self, trade: TradeTick): - trade_pyo3 = transform_trade_tick_to_pyo3(trade) - self._backing.add_trade(trade_pyo3) - - def load_trades(self, instrument_id: InstrumentId) -> list[TradeTick]: - instrument_id_pyo3 = nautilus_pyo3.InstrumentId.from_str(str(instrument_id)) - trades = self._backing.load_trades(instrument_id_pyo3) - return [transform_trade_tick_from_pyo3(trade) for trade in trades] + def load_signals(self, data_cls: type, name: str): + signals_pyo3 = self._backing.load_signals(name) + return [transform_signal_from_pyo3(data_cls, s) for s in signals_pyo3] - def add_quote(self, quote: QuoteTick): - quote_pyo3 = transform_quote_tick_to_pyo3(quote) - self._backing.add_quote(quote_pyo3) + def load_custom_data(self, data_type: DataType): + data_type_pyo3 = transform_data_type_to_pyo3(data_type) + data_pyo3 = self._backing.load_custom_data(data_type_pyo3) + return [transform_custom_data_from_pyo3(d) for d in data_pyo3] def load_quotes(self, instrument_id: InstrumentId) -> list[QuoteTick]: instrument_id_pyo3 = nautilus_pyo3.InstrumentId.from_str(str(instrument_id)) quotes = self._backing.load_quotes(instrument_id_pyo3) return [QuoteTick.from_pyo3(quote_pyo3) for quote_pyo3 in quotes] - def add_bar(self, bar: Bar): - bar_pyo3 = transform_bar_to_pyo3(bar) - self._backing.add_bar(bar_pyo3) + def load_trades(self, instrument_id: InstrumentId) -> list[TradeTick]: + instrument_id_pyo3 = nautilus_pyo3.InstrumentId.from_str(str(instrument_id)) + trades = self._backing.load_trades(instrument_id_pyo3) + return [transform_trade_tick_from_pyo3(trade) for trade in trades] def load_bars(self, instrument_id: InstrumentId): instrument_id_pyo3 = nautilus_pyo3.InstrumentId.from_str(str(instrument_id)) bars = self._backing.load_bars(instrument_id_pyo3) return [Bar.from_pyo3(bar_pyo3) for bar_pyo3 in bars] + def add(self, key: str, value: bytes): + self._backing.add(key, value) + + def add_currency(self, currency: Currency): + currency_pyo3 = transform_currency_to_pyo3(currency) + self._backing.add_currency(currency_pyo3) + + def add_instrument(self, instrument: Instrument): + instrument_pyo3 = transform_instrument_to_pyo3(instrument) + self._backing.add_instrument(instrument_pyo3) + + def add_order(self, order: Order): + order_pyo3 = transform_order_to_pyo3(order) + self._backing.add_order(order_pyo3) + + def add_account(self, account: Account): + account_pyo3 = transform_account_to_pyo3(account) + self._backing.add_account(account_pyo3) + def add_signal(self, signal: Data): signal_pyo3 = transform_signal_to_pyo3(signal) self._backing.add_signal(signal_pyo3) - def load_signals(self, data_cls: type, name: str): - signals_pyo3 = self._backing.load_signals(name) - return [transform_signal_from_pyo3(data_cls, s) for s in signals_pyo3] - def add_custom_data(self, data: CustomData): data_pyo3 = transform_custom_data_to_pyo3(data) self._backing.add_custom_data(data_pyo3) - def load_custom_data(self, data_type: DataType): - data_type_pyo3 = transform_data_type_to_pyo3(data_type) - data_pyo3 = self._backing.load_custom_data(data_type_pyo3) - return [transform_custom_data_from_pyo3(d) for d in data_pyo3] + def add_quote(self, quote: QuoteTick): + quote_pyo3 = transform_quote_tick_to_pyo3(quote) + self._backing.add_quote(quote_pyo3) + + def add_trade(self, trade: TradeTick): + trade_pyo3 = transform_trade_tick_to_pyo3(trade) + self._backing.add_trade(trade_pyo3) + + def add_bar(self, bar: Bar): + bar_pyo3 = transform_bar_to_pyo3(bar) + self._backing.add_bar(bar_pyo3) + + def update_order(self, order: Order): + order_pyo3 = transform_order_to_pyo3(order) + self._backing.update_order(order_pyo3) + + def update_account(self, account: Account): + account_pyo3 = transform_account_to_pyo3(account) + self._backing.update_account(account_pyo3) diff --git a/nautilus_trader/cache/postgres/transformers.py b/nautilus_trader/cache/postgres/transformers.py index 48040a1d21cb..2395fe83158e 100644 --- a/nautilus_trader/cache/postgres/transformers.py +++ b/nautilus_trader/cache/postgres/transformers.py @@ -82,8 +82,6 @@ def transform_currency_to_pyo3(currency: Currency) -> nautilus_pyo3.Currency: ################################################################################ # Instruments ################################################################################ - - def transform_instrument_to_pyo3(instrument: Instrument): if isinstance(instrument, CryptoFuture): return nautilus_pyo3.CryptoFuture.from_dict(CryptoFuture.to_dict(instrument)) From 44638776f59b120751d2a908c7865cdeead5429b Mon Sep 17 00:00:00 2001 From: Filip Macek Date: Tue, 15 Oct 2024 12:37:53 +0200 Subject: [PATCH 138/224] Refine test data getters in Rust (#2004) --- nautilus_core/Cargo.lock | 1 + nautilus_core/model/tests/test_order_book.rs | 10 +-- nautilus_core/persistence/Cargo.toml | 1 + .../persistence/tests/test_catalog.rs | 61 ++++++++++--------- nautilus_core/test_kit/src/common.rs | 25 ++++++-- 5 files changed, 60 insertions(+), 38 deletions(-) diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 6d1ec1085847..06dfe891e297 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -2994,6 +2994,7 @@ dependencies = [ "log", "nautilus-core", "nautilus-model", + "nautilus-test-kit", "procfs", "pyo3", "quickcheck", diff --git a/nautilus_core/model/tests/test_order_book.rs b/nautilus_core/model/tests/test_order_book.rs index b03cec6fb7fb..61227954ea06 100644 --- a/nautilus_core/model/tests/test_order_book.rs +++ b/nautilus_core/model/tests/test_order_book.rs @@ -13,11 +13,13 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- +use std::path::Path; + use nautilus_adapters::databento::loader::DatabentoDataLoader; use nautilus_model::{enums::BookType, identifiers::InstrumentId, orderbook::book::OrderBook}; use nautilus_test_kit::{ common::{ - get_test_data_large_checksums_filepath, get_test_data_large_path, get_workspace_root_path, + get_test_data_file_path, get_test_data_large_checksums_filepath, get_workspace_root_path, }, files::ensure_file_exists_or_download_http, }; @@ -25,12 +27,12 @@ use rstest::*; #[rstest] pub fn test_order_book_databento_mbo_nasdaq() { - let testdata = get_test_data_large_path(); let checksums = get_test_data_large_checksums_filepath(); let filename = "databento_mbo_xnas_itch.csv"; - let filepath = testdata.join("large").join(filename); + let file_path = get_test_data_file_path(format!("large/{}", filename).as_str()); let url = "https://hist.databento.com/v0/dataset/sample/download/xnas.itch/mbo"; - ensure_file_exists_or_download_http(&filepath, url, Some(&checksums)).unwrap(); + ensure_file_exists_or_download_http(Path::new(file_path.as_str()), url, Some(&checksums)) + .unwrap(); let instrument_id = InstrumentId::from("AAPL.XNAS"); let mut _book = OrderBook::new(instrument_id, BookType::L3_MBO); diff --git a/nautilus_core/persistence/Cargo.toml b/nautilus_core/persistence/Cargo.toml index 9f787c0868d5..19ae32228ec5 100644 --- a/nautilus_core/persistence/Cargo.toml +++ b/nautilus_core/persistence/Cargo.toml @@ -26,6 +26,7 @@ datafusion = { version = "41.0.0", default-features = false, features = ["compre dotenv = "0.15.0" [dev-dependencies] +nautilus-test-kit = { path = "../test_kit" } criterion = { workspace = true } rstest = { workspace = true } quickcheck = "1" diff --git a/nautilus_core/persistence/tests/test_catalog.rs b/nautilus_core/persistence/tests/test_catalog.rs index 83e9cf5948bc..cd8a13b7a955 100644 --- a/nautilus_core/persistence/tests/test_catalog.rs +++ b/nautilus_core/persistence/tests/test_catalog.rs @@ -24,6 +24,7 @@ use nautilus_persistence::{ backend::session::{DataBackendSession, DataQueryResult, QueryResult}, python::backend::session::NautilusDataType, }; +use nautilus_test_kit::common::get_test_data_file_path; #[cfg(target_os = "linux")] use procfs::{self, process::Process}; use pyo3::{types::PyCapsule, IntoPy, Py, PyAny, Python}; @@ -68,7 +69,7 @@ fn catalog_query_mem_leak_test() { mem_leak_test( pyo3::prepare_freethreaded_python, |_args| { - let file_path = "../../tests/test_data/nautilus/quotes.parquet"; + let file_path = get_test_data_file_path("nautilus/quotes.parquet"); let expected_length = 9500; let catalog = DataBackendSession::new(1_000_000); Python::with_gil(|py| { @@ -77,7 +78,11 @@ fn catalog_query_mem_leak_test() { .call_method1( py, "add_file", - (NautilusDataType::QuoteTick, "order_book_deltas", file_path), + ( + NautilusDataType::QuoteTick, + "order_book_deltas", + file_path.as_str(), + ), ) .unwrap(); let result = pycatalog.call_method0(py, "to_query_result").unwrap(); @@ -106,11 +111,11 @@ fn catalog_query_mem_leak_test() { #[rstest] fn test_quote_tick_cvec_interface() { - let file_path = "../../tests/test_data/nautilus/quotes.parquet"; + let file_path = get_test_data_file_path("nautilus/quotes.parquet"); let expected_length = 9500; let mut catalog = DataBackendSession::new(1000); catalog - .add_file::("quote_005", file_path, None) + .add_file::("quote_005", file_path.as_str(), None) .unwrap(); let query_result: QueryResult = catalog.get_query_result(); let query_result = DataQueryResult::new(query_result, catalog.chunk_size); @@ -138,7 +143,7 @@ fn test_quote_tick_cvec_interface() { fn test_quote_tick_python_control_flow() { pyo3::prepare_freethreaded_python(); - let file_path = "../../tests/test_data/nautilus/quotes.parquet"; + let file_path = get_test_data_file_path("nautilus/quotes.parquet"); let expected_length = 9500; let catalog = DataBackendSession::new(1_000_000); Python::with_gil(|py| { @@ -147,7 +152,11 @@ fn test_quote_tick_python_control_flow() { .call_method1( py, "add_file", - (NautilusDataType::QuoteTick, "order_book_deltas", file_path), + ( + NautilusDataType::QuoteTick, + "order_book_deltas", + file_path.as_str(), + ), ) .unwrap(); let result = pycatalog.call_method0(py, "to_query_result").unwrap(); @@ -173,12 +182,12 @@ fn test_quote_tick_python_control_flow() { #[rstest] fn test_order_book_delta_query() { let expected_length = 1077; - let file_path = "../../tests/test_data/nautilus/deltas.parquet"; + let file_path = get_test_data_file_path("nautilus/deltas.parquet"); let mut catalog = DataBackendSession::new(1_000); catalog .add_file::( "delta_001", - file_path, + file_path.as_str(), Some("SELECT * FROM delta_001 ORDER BY ts_init"), ) .unwrap(); @@ -193,7 +202,7 @@ fn test_order_book_delta_query() { fn test_order_book_delta_query_py() { pyo3::prepare_freethreaded_python(); - let file_path = "../../tests/test_data/nautilus/deltas.parquet"; + let file_path = get_test_data_file_path("nautilus/deltas.parquet"); let catalog = DataBackendSession::new(2_000); Python::with_gil(|py| { let pycatalog: Py = catalog.into_py(py); @@ -204,7 +213,7 @@ fn test_order_book_delta_query_py() { ( NautilusDataType::OrderBookDelta, "order_book_deltas", - file_path, + file_path.as_str(), ), ) .unwrap(); @@ -219,10 +228,10 @@ fn test_order_book_delta_query_py() { #[rstest] fn test_quote_tick_query() { let expected_length = 9_500; - let file_path = "../../tests/test_data/nautilus/quotes.parquet"; + let file_path = get_test_data_file_path("nautilus/quotes.parquet"); let mut catalog = DataBackendSession::new(10_000); catalog - .add_file::("quote_005", file_path, None) + .add_file::("quote_005", file_path.as_str(), None) .unwrap(); let query_result: QueryResult = catalog.get_query_result(); let ticks: Vec = query_result.collect(); @@ -239,12 +248,12 @@ fn test_quote_tick_query() { #[rstest] fn test_quote_tick_query_with_filter() { - let file_path = "../../tests/test_data/nautilus/quotes-3-groups-filter-query.parquet"; + let file_path = get_test_data_file_path("nautilus/quotes-3-groups-filter-query.parquet"); let mut catalog = DataBackendSession::new(10); catalog .add_file::( "quote_005", - file_path, + file_path.as_str(), Some("SELECT * FROM quote_005 WHERE ts_init >= 1701388832486000000 ORDER BY ts_init"), ) .unwrap(); @@ -257,19 +266,13 @@ fn test_quote_tick_query_with_filter() { fn test_quote_tick_multiple_query() { let expected_length = 9_600; let mut catalog = DataBackendSession::new(5_000); + let file_path_quotes = get_test_data_file_path("nautilus/quotes.parquet"); + let file_path_trades = get_test_data_file_path("nautilus/trades.parquet"); catalog - .add_file::( - "quote_tick", - "../../tests/test_data/nautilus/quotes.parquet", - None, - ) + .add_file::("quote_tick", file_path_quotes.as_str(), None) .unwrap(); catalog - .add_file::( - "quote_tick_2", - "../../tests/test_data/nautilus/trades.parquet", - None, - ) + .add_file::("quote_tick_2", file_path_trades.as_str(), None) .unwrap(); let query_result: QueryResult = catalog.get_query_result(); let ticks: Vec = query_result.collect(); @@ -281,10 +284,10 @@ fn test_quote_tick_multiple_query() { #[rstest] fn test_trade_tick_query() { let expected_length = 100; - let file_path = "../../tests/test_data/nautilus/trades.parquet"; + let file_path = get_test_data_file_path("nautilus/trades.parquet"); let mut catalog = DataBackendSession::new(10_000); catalog - .add_file::("trade_001", file_path, None) + .add_file::("trade_001", file_path.as_str(), None) .unwrap(); let query_result: QueryResult = catalog.get_query_result(); let ticks: Vec = query_result.collect(); @@ -302,9 +305,11 @@ fn test_trade_tick_query() { #[rstest] fn test_bar_query() { let expected_length = 10; - let file_path = "../../tests/test_data/nautilus/bars.parquet"; + let file_path = get_test_data_file_path("nautilus/bars.parquet"); let mut catalog = DataBackendSession::new(10_000); - catalog.add_file::("bar_001", file_path, None).unwrap(); + catalog + .add_file::("bar_001", file_path.as_str(), None) + .unwrap(); let query_result: QueryResult = catalog.get_query_result(); let ticks: Vec = query_result.collect(); diff --git a/nautilus_core/test_kit/src/common.rs b/nautilus_core/test_kit/src/common.rs index d0b72ef679d4..f1e5c91faf37 100644 --- a/nautilus_core/test_kit/src/common.rs +++ b/nautilus_core/test_kit/src/common.rs @@ -34,20 +34,33 @@ pub fn get_project_root_path() -> PathBuf { } #[must_use] -pub fn get_test_data_large_path() -> PathBuf { - get_project_root_path().join("tests").join("test_data") +pub fn get_test_data_path() -> PathBuf { + if let Ok(test_data_root_path) = std::env::var("TEST_DATA_ROOT_PATH") { + get_project_root_path() + .join(test_data_root_path) + .join("test_data") + } else { + get_project_root_path().join("tests").join("test_data") + } +} + +#[must_use] +pub fn get_test_data_file_path(path: &str) -> String { + get_test_data_path() + .join(path) + .to_str() + .unwrap() + .to_string() } #[must_use] pub fn get_test_data_large_checksums_filepath() -> PathBuf { - get_test_data_large_path() - .join("large") - .join("checksums.json") + get_test_data_path().join("large").join("checksums.json") } #[must_use] pub fn ensure_test_data_exists(filename: &str, url: &str) -> PathBuf { - let filepath = get_test_data_large_path().join("large").join(filename); + let filepath = get_test_data_path().join("large").join(filename); let checksums_filepath = get_test_data_large_checksums_filepath(); ensure_file_exists_or_download_http(&filepath, url, Some(&checksums_filepath)).unwrap(); filepath From 0649a374bb20c5fc7c0b842aa1ff9e8483e9330e Mon Sep 17 00:00:00 2001 From: Pushkar Mishra Date: Wed, 16 Oct 2024 01:53:30 +0530 Subject: [PATCH 139/224] Fix TardisCSVDataLoader for snapshot5 and snapshot25 (#2005) --- nautilus_core/adapters/src/tardis/csv.rs | 72 +++++++++++++++---- .../adapters/tardis/test_loaders.py | 28 ++++++++ 2 files changed, 87 insertions(+), 13 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/csv.rs b/nautilus_core/adapters/src/tardis/csv.rs index 6514d29572d6..558c221e073b 100644 --- a/nautilus_core/adapters/src/tardis/csv.rs +++ b/nautilus_core/adapters/src/tardis/csv.rs @@ -15,7 +15,7 @@ use std::{error::Error, fs::File, io::BufReader, path::Path}; -use csv::{Reader, ReaderBuilder}; +use csv::{Reader, ReaderBuilder, StringRecord}; use flate2::read::GzDecoder; use nautilus_core::nanos::UnixNanos; use nautilus_model::{ @@ -160,9 +160,9 @@ pub fn load_depth10_from_snapshot5>( let mut csv_reader = create_csv_reader(filepath)?; let mut depths: Vec = Vec::new(); - for result in csv_reader.deserialize() { - let record: TardisOrderBookSnapshot5Record = result?; - + let mut raw_record = StringRecord::new(); + while csv_reader.read_record(&mut raw_record)? { + let record: TardisOrderBookSnapshot5Record = raw_record.deserialize(None)?; let instrument_id = match &instrument_id { Some(id) => *id, None => parse_instrument_id(&record.exchange, &record.symbol), @@ -264,8 +264,9 @@ pub fn load_depth10_from_snapshot25>( let mut csv_reader = create_csv_reader(filepath)?; let mut depths: Vec = Vec::new(); - for result in csv_reader.deserialize() { - let record: TardisOrderBookSnapshot25Record = result?; + let mut raw_record = StringRecord::new(); + while csv_reader.read_record(&mut raw_record)? { + let record: TardisOrderBookSnapshot25Record = raw_record.deserialize(None)?; let instrument_id = match &instrument_id { Some(id) => *id, @@ -478,7 +479,10 @@ pub fn load_trade_ticks>( //////////////////////////////////////////////////////////////////////////////// #[cfg(test)] mod tests { - use nautilus_model::{enums::BookAction, identifiers::InstrumentId}; + use nautilus_model::{ + enums::{AggressorSide, BookAction}, + identifiers::InstrumentId, + }; use nautilus_test_kit::common::{ ensure_data_exists_tardis_binance_snapshot25, ensure_data_exists_tardis_binance_snapshot5, ensure_data_exists_tardis_bitmex_trades, ensure_data_exists_tardis_deribit_book_l2, @@ -514,7 +518,26 @@ mod tests { let depths = load_depth10_from_snapshot5(filepath, 1, 0, None, Some(100_000)).unwrap(); assert_eq!(depths.len(), 100_000); - // TODO: Assert every field + assert_eq!( + depths[0].instrument_id, + InstrumentId::from("BTCUSDT.BINANCE") + ); + assert_eq!(depths[0].bids.len(), 10); + assert_eq!(depths[0].bids[0].price, Price::from("11657.1")); + assert_eq!(depths[0].bids[0].size, Quantity::from("11")); + assert_eq!(depths[0].bids[0].side, OrderSide::Buy); + assert_eq!(depths[0].bids[0].order_id, 0); + assert_eq!(depths[0].asks.len(), 10); + assert_eq!(depths[0].asks[0].price, Price::from("11657.1")); + assert_eq!(depths[0].asks[0].size, Quantity::from("2")); + assert_eq!(depths[0].asks[0].side, OrderSide::Sell); + assert_eq!(depths[0].asks[0].order_id, 0); + assert_eq!(depths[0].bid_counts[0], 1); + assert_eq!(depths[0].ask_counts[0], 1); + assert_eq!(depths[0].flags, 128); + assert_eq!(depths[0].ts_event, 1598918403696000000); + assert_eq!(depths[0].ts_init, 1598918403810979000); + assert_eq!(depths[0].sequence, 0); } #[rstest] @@ -528,13 +551,21 @@ mod tests { InstrumentId::from("BTCUSDT.BINANCE") ); assert_eq!(depths[0].bids.len(), 10); + assert_eq!(depths[0].bids[0].price, Price::from("11657.1")); + assert_eq!(depths[0].bids[0].size, Quantity::from("11")); + assert_eq!(depths[0].bids[0].side, OrderSide::Buy); + assert_eq!(depths[0].bids[0].order_id, 0); assert_eq!(depths[0].asks.len(), 10); - assert_eq!(depths[0].bid_counts.len(), 10); - assert_eq!(depths[0].ask_counts.len(), 10); + assert_eq!(depths[0].asks[0].price, Price::from("11657.1")); + assert_eq!(depths[0].asks[0].size, Quantity::from("2")); + assert_eq!(depths[0].asks[0].side, OrderSide::Sell); + assert_eq!(depths[0].asks[0].order_id, 0); + assert_eq!(depths[0].bid_counts[0], 1); + assert_eq!(depths[0].ask_counts[0], 1); assert_eq!(depths[0].flags, 128); assert_eq!(depths[0].ts_event, 1598918403696000000); assert_eq!(depths[0].ts_init, 1598918403810979000); - assert_eq!(depths[0].bids[0].price, Price::from("0")); // TODO: This should not be zero + assert_eq!(depths[0].sequence, 0); } #[rstest] @@ -543,7 +574,13 @@ mod tests { let quotes = load_quote_ticks(filepath, 1, 0, None, Some(100_000)).unwrap(); assert_eq!(quotes.len(), 100_000); - // TODO: Assert every field + assert_eq!(quotes[0].instrument_id, InstrumentId::from("BTC-USD.HUOBI")); + assert_eq!(quotes[0].bid_price, Price::from("8629.2")); + assert_eq!(quotes[0].bid_size, Quantity::from("806")); + assert_eq!(quotes[0].ask_price, Price::from("8629.3")); + assert_eq!(quotes[0].ask_size, Quantity::from("5494")); + assert_eq!(quotes[0].ts_event, 1588291201099000000); + assert_eq!(quotes[0].ts_init, 1588291201234268000); } #[rstest] @@ -552,6 +589,15 @@ mod tests { let trades = load_trade_ticks(filepath, 1, 0, None, Some(100_000)).unwrap(); assert_eq!(trades.len(), 100_000); - // TODO: Assert every field + assert_eq!(trades[0].instrument_id, InstrumentId::from("XBTUSD.BITMEX")); + assert_eq!(trades[0].price, Price::from("8531.5")); + assert_eq!(trades[0].size, Quantity::from("2152")); + assert_eq!(trades[0].aggressor_side, AggressorSide::Seller); + assert_eq!( + trades[0].trade_id, + TradeId::new("ccc3c1fa-212c-e8b0-1706-9b9c4f3d5ecf") + ); + assert_eq!(trades[0].ts_event, 1583020803145000000); + assert_eq!(trades[0].ts_init, 1583020803307160000); } } diff --git a/tests/integration_tests/adapters/tardis/test_loaders.py b/tests/integration_tests/adapters/tardis/test_loaders.py index 5b7ae7c8947c..8b5d57e54d43 100644 --- a/tests/integration_tests/adapters/tardis/test_loaders.py +++ b/tests/integration_tests/adapters/tardis/test_loaders.py @@ -65,8 +65,22 @@ def test_tardis_load_depth10_from_snapshot5(): # Assert assert len(deltas) == 100_000 assert deltas[0].instrument_id == InstrumentId.from_str("BTCUSDT.BINANCE") + assert len(deltas[0].bids) == 10 + assert deltas[0].bids[0].price == Price.from_str("11657.1") + assert deltas[0].bids[0].size == Quantity.from_str("11") + assert deltas[0].bids[0].side == OrderSide.BUY + assert deltas[0].bids[0].order_id == 0 + assert len(deltas[0].asks) == 10 + assert deltas[0].asks[0].price == Price.from_str("11657.1") + assert deltas[0].asks[0].size == Quantity.from_str("2") + assert deltas[0].asks[0].side == OrderSide.SELL + assert deltas[0].asks[0].order_id == 0 + assert deltas[0].bid_counts[0] == 1 + assert deltas[0].ask_counts[0] == 1 + assert deltas[0].flags == 128 assert deltas[0].ts_event == 1598918403696000000 assert deltas[0].ts_init == 1598918403810979000 + assert deltas[0].sequence == 0 def test_tardis_load_depth10_from_snapshot25(): @@ -81,8 +95,22 @@ def test_tardis_load_depth10_from_snapshot25(): # Assert assert len(deltas) == 100_000 assert deltas[0].instrument_id == InstrumentId.from_str("BTCUSDT-PERP.BINANCE") + assert len(deltas[0].bids) == 10 + assert deltas[0].bids[0].price == Price.from_str("11657.1") + assert deltas[0].bids[0].size == Quantity.from_str("11") + assert deltas[0].bids[0].side == OrderSide.BUY + assert deltas[0].bids[0].order_id == 0 + assert len(deltas[0].asks) == 10 + assert deltas[0].asks[0].price == Price.from_str("11657.1") + assert deltas[0].asks[0].size == Quantity.from_str("2") + assert deltas[0].asks[0].side == OrderSide.SELL + assert deltas[0].asks[0].order_id == 0 + assert deltas[0].bid_counts[0] == 1 + assert deltas[0].ask_counts[0] == 1 + assert deltas[0].flags == 128 assert deltas[0].ts_event == 1598918403696000000 assert deltas[0].ts_init == 1598918403810979000 + assert deltas[0].sequence == 0 def test_tardis_load_quotes(): From 5b4f40c9dcbf72e7a4ff3a287592d6bbe3cdcfc3 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 16 Oct 2024 07:31:26 +1100 Subject: [PATCH 140/224] Fix type stub for OrderBookDepth10 --- nautilus_trader/core/nautilus_pyo3.pyi | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index 53f95ec00c22..4aaa44b5a06f 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -679,6 +679,10 @@ class OrderBookDepth10: @property def ask_counts(self) -> list[int]: ... @property + def flags(self) -> int: ... + @property + def sequence(self) -> int: ... + @property def ts_event(self) -> int: ... @property def ts_init(self) -> int: ... From 7cc37cad7e2e7b3f6447d0b09b8ebec2e2d745ed Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 16 Oct 2024 07:32:38 +1100 Subject: [PATCH 141/224] Update release notes --- RELEASES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASES.md b/RELEASES.md index b013146e239f..b93827ebcb83 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -36,6 +36,7 @@ Released on TBD (UTC). - Fixed resubscribing to orderbook in batched mode for dYdX (#1985), thanks @davidsblom - Fixed Betfair tests related to symbology (#1988), thanks @limx0 - Fixed check for `OmsType` in `OrderMatchingEngine` position ID processing (#2003), thanks @filipmacek +- Fixed `TardisCSVDataLoader` snapshot5 and snapshot25 parsing (#2005), thanks @Pushkarm029 --- From 8cb5f050ba0eb30bbea2811ecf459fca080c1d1d Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 16 Oct 2024 08:21:58 +1100 Subject: [PATCH 142/224] Continue order interface for postgres --- nautilus_core/common/src/cache/database.rs | 3 +- nautilus_core/common/src/cache/mod.rs | 2 +- .../infrastructure/src/python/sql/cache.rs | 7 +-- .../infrastructure/src/redis/cache.rs | 3 +- nautilus_core/infrastructure/src/sql/cache.rs | 15 ++++-- .../tests/test_cache_database_postgres.rs | 6 +-- nautilus_core/model/src/events/order/any.rs | 50 ++++++++++++++++++- nautilus_core/model/src/orders/any.rs | 15 ++++++ nautilus_trader/cache/postgres/adapter.py | 5 +- 9 files changed, 89 insertions(+), 17 deletions(-) diff --git a/nautilus_core/common/src/cache/database.rs b/nautilus_core/common/src/cache/database.rs index a667e7d5234b..7dc96a60ea6c 100644 --- a/nautilus_core/common/src/cache/database.rs +++ b/nautilus_core/common/src/cache/database.rs @@ -26,6 +26,7 @@ use nautilus_core::nanos::UnixNanos; use nautilus_model::{ accounts::any::AccountAny, data::{bar::Bar, quote::QuoteTick, trade::TradeTick, DataType}, + events::order::OrderEventAny, identifiers::{ AccountId, ClientId, ClientOrderId, ComponentId, InstrumentId, PositionId, StrategyId, VenueOrderId, @@ -144,7 +145,7 @@ pub trait CacheDatabaseAdapter { fn update_account(&mut self, account: &AccountAny) -> anyhow::Result<()>; - fn update_order(&mut self, order: &OrderAny) -> anyhow::Result<()>; + fn update_order(&mut self, order_event: &OrderEventAny) -> anyhow::Result<()>; fn update_position(&mut self, position: &Position) -> anyhow::Result<()>; diff --git a/nautilus_core/common/src/cache/mod.rs b/nautilus_core/common/src/cache/mod.rs index a64876489034..ad7b33b8b081 100644 --- a/nautilus_core/common/src/cache/mod.rs +++ b/nautilus_core/common/src/cache/mod.rs @@ -1472,7 +1472,7 @@ impl Cache { } if let Some(database) = &mut self.database { - database.update_order(order)?; + database.update_order(order.last_event())?; // TODO: Implement order snapshots // if self.snapshot_orders { // database.snapshot_order_state(order)?; diff --git a/nautilus_core/infrastructure/src/python/sql/cache.rs b/nautilus_core/infrastructure/src/python/sql/cache.rs index 9f45c5a6f5b8..fe7cf303eb34 100644 --- a/nautilus_core/infrastructure/src/python/sql/cache.rs +++ b/nautilus_core/infrastructure/src/python/sql/cache.rs @@ -25,6 +25,7 @@ use nautilus_model::{ identifiers::{AccountId, ClientId, ClientOrderId, InstrumentId}, python::{ account::{convert_account_any_to_pyobject, convert_pyobject_to_account_any}, + events::order::pyobject_to_order_event, instruments::{instrument_any_to_pyobject, pyobject_to_instrument_any}, orders::{convert_order_any_to_pyobject, convert_pyobject_to_order_any}, }, @@ -301,11 +302,11 @@ impl PostgresCacheDatabase { #[pyo3(name = "update_order")] fn py_update_order( mut slf: PyRefMut<'_, Self>, - order: PyObject, + order_event: PyObject, py: Python<'_>, ) -> PyResult<()> { - let order_any = convert_pyobject_to_order_any(py, order)?; - slf.update_order(&order_any).map_err(to_pyruntime_err) + let event = pyobject_to_order_event(py, order_event)?; + slf.update_order(&event).map_err(to_pyruntime_err) } #[pyo3(name = "update_account")] diff --git a/nautilus_core/infrastructure/src/redis/cache.rs b/nautilus_core/infrastructure/src/redis/cache.rs index 7e565cce1bff..80037f333a9c 100644 --- a/nautilus_core/infrastructure/src/redis/cache.rs +++ b/nautilus_core/infrastructure/src/redis/cache.rs @@ -31,6 +31,7 @@ use nautilus_core::{correctness::check_slice_not_empty, nanos::UnixNanos, uuid:: use nautilus_model::{ accounts::any::AccountAny, data::{bar::Bar, quote::QuoteTick, trade::TradeTick, DataType}, + events::order::OrderEventAny, identifiers::{ AccountId, ClientId, ClientOrderId, ComponentId, InstrumentId, PositionId, StrategyId, TraderId, VenueOrderId, @@ -942,7 +943,7 @@ impl CacheDatabaseAdapter for RedisCacheDatabaseAdapter { todo!() } - fn update_order(&mut self, order: &OrderAny) -> anyhow::Result<()> { + fn update_order(&mut self, order_event: &OrderEventAny) -> anyhow::Result<()> { todo!() } diff --git a/nautilus_core/infrastructure/src/sql/cache.rs b/nautilus_core/infrastructure/src/sql/cache.rs index fd00f16c9493..af02005ae58d 100644 --- a/nautilus_core/infrastructure/src/sql/cache.rs +++ b/nautilus_core/infrastructure/src/sql/cache.rs @@ -24,6 +24,7 @@ use nautilus_core::nanos::UnixNanos; use nautilus_model::{ accounts::any::AccountAny, data::{bar::Bar, quote::QuoteTick, trade::TradeTick, DataType}, + events::order::OrderEventAny, identifiers::{ AccountId, ClientId, ClientOrderId, ComponentId, InstrumentId, PositionId, StrategyId, VenueOrderId, @@ -72,6 +73,7 @@ pub enum DatabaseQuery { AddQuote(QuoteTick), AddTrade(TradeTick), AddBar(Bar), + UpdateOrder(OrderEventAny), } fn get_buffer_interval() -> Duration { @@ -236,6 +238,11 @@ async fn drain_buffer(pool: &PgPool, buffer: &mut VecDeque) { DatabaseQuery::AddBar(bar) => { DatabaseQueries::add_bar(pool, &bar).await.unwrap(); } + DatabaseQuery::UpdateOrder(event) => { + DatabaseQueries::add_order_event(pool, event.into_boxed(), None) + .await + .unwrap(); + } } } } @@ -272,7 +279,7 @@ impl PostgresCacheDatabase { loop { if last_drain.elapsed() >= buffer_interval && !buffer.is_empty() { - // drain buffer + // Drain buffer drain_buffer(&pool, &mut buffer).await; last_drain = Instant::now(); } else { @@ -284,7 +291,7 @@ impl PostgresCacheDatabase { } } } - // rain any remaining message + // Drain any remaining message if !buffer.is_empty() { drain_buffer(&pool, &mut buffer).await; } @@ -866,8 +873,8 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { }) } - fn update_order(&mut self, order: &OrderAny) -> anyhow::Result<()> { - let query = DatabaseQuery::AddOrder(order.clone(), None, true); + fn update_order(&mut self, event: &OrderEventAny) -> anyhow::Result<()> { + let query = DatabaseQuery::UpdateOrder(event.clone()); self.tx.send(query).map_err(|e| { anyhow::anyhow!("Failed to send query add_order to database message handler: {e}") }) diff --git a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs index 2beaafb2fe5a..6a22a226dd8e 100644 --- a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs +++ b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs @@ -319,12 +319,12 @@ mod serial_tests { pg_cache.add_order(&market_order, None).unwrap(); let submitted = TestOrderEventStubs::order_submitted(&market_order, account); market_order.apply(submitted).unwrap(); - pg_cache.update_order(&market_order).unwrap(); + pg_cache.update_order(&market_order.last_event()).unwrap(); let accepted = TestOrderEventStubs::order_accepted(&market_order, account, VenueOrderId::new("001")); market_order.apply(accepted).unwrap(); - pg_cache.update_order(&market_order).unwrap(); + pg_cache.update_order(&market_order.last_event()).unwrap(); let filled = TestOrderEventStubs::order_filled( &market_order, @@ -339,7 +339,7 @@ mod serial_tests { Some(AccountId::new("SIM-001")), ); market_order.apply(filled).unwrap(); - pg_cache.update_order(&market_order).unwrap(); + pg_cache.update_order(&market_order.last_event()).unwrap(); wait_until( || { let result = pg_cache diff --git a/nautilus_core/model/src/events/order/any.rs b/nautilus_core/model/src/events/order/any.rs index 310ac96a7608..59e02cd07850 100644 --- a/nautilus_core/model/src/events/order/any.rs +++ b/nautilus_core/model/src/events/order/any.rs @@ -18,7 +18,7 @@ use serde::{Deserialize, Serialize}; use strum::Display; use ustr::Ustr; -use super::OrderEventType; +use super::{OrderEvent, OrderEventType}; use crate::{ events::order::{ OrderAccepted, OrderCancelRejected, OrderCanceled, OrderDenied, OrderEmulated, @@ -26,7 +26,7 @@ use crate::{ OrderPendingUpdate, OrderRejected, OrderReleased, OrderSubmitted, OrderTriggered, OrderUpdated, }, - identifiers::{ClientOrderId, StrategyId}, + identifiers::{ClientOrderId, StrategyId, TraderId}, }; /// Wraps an `OrderEvent` allowing polymorphism. @@ -52,6 +52,29 @@ pub enum OrderEventAny { } impl OrderEventAny { + #[must_use] + pub fn into_boxed(self) -> Box { + match self { + OrderEventAny::Initialized(event) => Box::new(event), + OrderEventAny::Denied(event) => Box::new(event), + OrderEventAny::Emulated(event) => Box::new(event), + OrderEventAny::Released(event) => Box::new(event), + OrderEventAny::Submitted(event) => Box::new(event), + OrderEventAny::Accepted(event) => Box::new(event), + OrderEventAny::Rejected(event) => Box::new(event), + OrderEventAny::Canceled(event) => Box::new(event), + OrderEventAny::Expired(event) => Box::new(event), + OrderEventAny::Triggered(event) => Box::new(event), + OrderEventAny::PendingUpdate(event) => Box::new(event), + OrderEventAny::PendingCancel(event) => Box::new(event), + OrderEventAny::ModifyRejected(event) => Box::new(event), + OrderEventAny::CancelRejected(event) => Box::new(event), + OrderEventAny::Updated(event) => Box::new(event), + OrderEventAny::PartiallyFilled(event) => Box::new(event), + OrderEventAny::Filled(event) => Box::new(event), + } + } + #[must_use] pub fn event_type(&self) -> OrderEventType { match self { @@ -75,6 +98,29 @@ impl OrderEventAny { } } + #[must_use] + pub fn trader_id(&self) -> TraderId { + match self { + Self::Initialized(event) => event.trader_id, + Self::Denied(event) => event.trader_id, + Self::Emulated(event) => event.trader_id, + Self::Released(event) => event.trader_id, + Self::Submitted(event) => event.trader_id, + Self::Accepted(event) => event.trader_id, + Self::Rejected(event) => event.trader_id, + Self::Canceled(event) => event.trader_id, + Self::Expired(event) => event.trader_id, + Self::Triggered(event) => event.trader_id, + Self::PendingUpdate(event) => event.trader_id, + Self::PendingCancel(event) => event.trader_id, + Self::ModifyRejected(event) => event.trader_id, + Self::CancelRejected(event) => event.trader_id, + Self::Updated(event) => event.trader_id, + Self::PartiallyFilled(event) => event.trader_id, + Self::Filled(event) => event.trader_id, + } + } + #[must_use] pub fn client_order_id(&self) -> ClientOrderId { match self { diff --git a/nautilus_core/model/src/orders/any.rs b/nautilus_core/model/src/orders/any.rs index 8c9167f51dbb..84d4f9bac645 100644 --- a/nautilus_core/model/src/orders/any.rs +++ b/nautilus_core/model/src/orders/any.rs @@ -141,6 +141,21 @@ impl OrderAny { } } + #[must_use] + pub fn last_event(&self) -> &OrderEventAny { + match self { + Self::Limit(order) => order.last_event(), + Self::LimitIfTouched(order) => order.last_event(), + Self::Market(order) => order.last_event(), + Self::MarketIfTouched(order) => order.last_event(), + Self::MarketToLimit(order) => order.last_event(), + Self::StopLimit(order) => order.last_event(), + Self::StopMarket(order) => order.last_event(), + Self::TrailingStopLimit(order) => order.last_event(), + Self::TrailingStopMarket(order) => order.last_event(), + } + } + #[must_use] pub fn trader_id(&self) -> TraderId { match self { diff --git a/nautilus_trader/cache/postgres/adapter.py b/nautilus_trader/cache/postgres/adapter.py index 1928fd690953..241566cdd36a 100644 --- a/nautilus_trader/cache/postgres/adapter.py +++ b/nautilus_trader/cache/postgres/adapter.py @@ -26,6 +26,7 @@ from nautilus_trader.cache.postgres.transformers import transform_data_type_to_pyo3 from nautilus_trader.cache.postgres.transformers import transform_instrument_from_pyo3 from nautilus_trader.cache.postgres.transformers import transform_instrument_to_pyo3 +from nautilus_trader.cache.postgres.transformers import transform_order_event_to_pyo3 from nautilus_trader.cache.postgres.transformers import transform_order_from_pyo3 from nautilus_trader.cache.postgres.transformers import transform_order_to_pyo3 from nautilus_trader.cache.postgres.transformers import transform_quote_tick_to_pyo3 @@ -164,8 +165,8 @@ def add_bar(self, bar: Bar): self._backing.add_bar(bar_pyo3) def update_order(self, order: Order): - order_pyo3 = transform_order_to_pyo3(order) - self._backing.update_order(order_pyo3) + order_event_pyo3 = transform_order_event_to_pyo3(order.last_event) + self._backing.update_order(order_event_pyo3) def update_account(self, account: Account): account_pyo3 = transform_account_to_pyo3(account) From 7c3f1f43df22a8b6239d327b38746aee4c9883ab Mon Sep 17 00:00:00 2001 From: Filip Macek Date: Wed, 16 Oct 2024 08:57:53 +0200 Subject: [PATCH 143/224] Implement get_venue_position_id in OrderMatchingEngine (#2006) --- nautilus_core/backtest/src/matching_engine.rs | 62 ++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/nautilus_core/backtest/src/matching_engine.rs b/nautilus_core/backtest/src/matching_engine.rs index 381fce410250..36f04f411a13 100644 --- a/nautilus_core/backtest/src/matching_engine.rs +++ b/nautilus_core/backtest/src/matching_engine.rs @@ -909,6 +909,21 @@ impl OrderMatchingEngine { TradeId::from(trade_id.as_str()) } + fn generate_venue_position_id(&mut self) -> Option { + if !self.config.use_position_ids { + return None; + } + + self.position_count += 1; + if self.config.use_random_ids { + Some(PositionId::new(UUID4::new().to_string().as_str())) + } else { + Some(PositionId::new( + format!("{}-{}-{}", self.venue, self.raw_id, self.position_count).as_str(), + )) + } + } + // -- EVENT HANDLING ----------------------------------------------------- fn accept_order(&mut self, order: &OrderAny) { @@ -1190,9 +1205,10 @@ mod tests { events::order::{ rejected::OrderRejectedBuilder, OrderEventAny, OrderEventType, OrderRejected, }, - identifiers::{AccountId, ClientOrderId}, + identifiers::{AccountId, ClientOrderId, PositionId}, instruments::{ any::InstrumentAny, + crypto_perpetual::CryptoPerpetual, equity::Equity, stubs::{futures_contract_es, *}, }, @@ -1885,4 +1901,48 @@ mod tests { assert_eq!(engine_l2.core.ask, Some(Price::from("101"))); assert!(engine_l2.core.is_ask_initialized); } + + #[rstest] + fn test_generate_venue_position_id( + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, + crypto_perpetual_ethusdt: CryptoPerpetual, + ) { + let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); + // create two order matching engines with different configs + // one with and other without position ids + let config_no_position_id = OrderMatchingEngineConfig { + use_position_ids: false, + ..OrderMatchingEngineConfig::default() + }; + let mut engine_no_position_id = get_order_matching_engine_l2( + instrument.clone(), + Rc::new(RefCell::new(MessageBus::default())), + None, + None, + Some(config_no_position_id), + ); + + let config_with_position_id = OrderMatchingEngineConfig { + use_position_ids: true, + ..OrderMatchingEngineConfig::default() + }; + let mut engine_with_position_id = get_order_matching_engine_l2( + instrument, + Rc::new(RefCell::new(MessageBus::default())), + None, + None, + Some(config_with_position_id), + ); + + // engine which doesnt have position id should return None + assert_eq!(engine_no_position_id.generate_venue_position_id(), None); + + // engine which has position id should return position id in incrementing order + let position_id_1 = engine_with_position_id.generate_venue_position_id(); + let position_id_2 = engine_with_position_id.generate_venue_position_id(); + assert_eq!(position_id_1, Some(PositionId::new("BINANCE-1-1"))); + assert_eq!(position_id_2, Some(PositionId::new("BINANCE-1-2"))); + } } From fb91ddc26766ef343e344e82775f2485e4d1a270 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 16 Oct 2024 17:40:53 +1100 Subject: [PATCH 144/224] Update dependencies and pre-commit --- .pre-commit-config.yaml | 29 +- nautilus_core/Cargo.lock | 24 +- nautilus_core/Cargo.toml | 2 +- nautilus_core/network/Cargo.toml | 2 +- nautilus_trader/adapters/dydx/http/client.py | 4 +- .../adapters/okx/schemas/public/instrument.py | 18 +- poetry.lock | 535 +++++++++--------- pyproject.toml | 2 +- 8 files changed, 299 insertions(+), 317 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 942d231e3375..3eb99cf412a7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -97,23 +97,22 @@ repos: entry: "isort" args: ["--settings-file", "pyproject.toml"] - # Disable until updated for pre-commit v4.x - # - repo: https://github.com/PyCQA/docformatter - # rev: v1.7.5 - # hooks: - # - id: docformatter - # additional_dependencies: [tomli] - # args: [ - # "--black", - # "--make-summary-multi-line", - # "--pre-summary-newline", - # "--blank", - # "--recursive", - # "--in-place", - # ] + - repo: https://github.com/PyCQA/docformatter + rev: 06907d0267368b49b9180eed423fae5697c1e909 + hooks: + - id: docformatter + additional_dependencies: [tomli] + args: [ + "--black", + "--make-summary-multi-line", + "--pre-summary-newline", + "--blank", + "--recursive", + "--in-place", + ] - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.11.2 + rev: v1.12.0 hooks: - id: mypy args: [ diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 06dfe891e297..4d713ded0e8c 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -2176,9 +2176,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ "bytes", "futures-channel", @@ -3256,9 +3256,9 @@ checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "7b8cefcf97f41316955f9294cd61f639bdcfa9f2f230faac6cb896aa8ab64704" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -3288,9 +3288,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -4280,9 +4280,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" @@ -4298,9 +4298,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "rusty-fork" @@ -5546,9 +5546,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom", ] diff --git a/nautilus_core/Cargo.toml b/nautilus_core/Cargo.toml index 643b6124d4df..2c3211e8b2e9 100644 --- a/nautilus_core/Cargo.toml +++ b/nautilus_core/Cargo.toml @@ -60,7 +60,7 @@ tracing-subscriber = { version = "0.3.18", default-features = false, features = tokio = { version = "1.40.0", features = ["full"] } tokio-tungstenite = { version = "0.24.0", features = ["rustls-tls-native-roots"] } ustr = { version = "1.0.0", features = ["serde"] } -uuid = { version = "1.10.0", features = ["v4"] } +uuid = { version = "1.11.0", features = ["v4"] } # dev-dependencies axum = "0.7.7" diff --git a/nautilus_core/network/Cargo.toml b/nautilus_core/network/Cargo.toml index ae40d50a0e73..e52ecbe0c0f1 100644 --- a/nautilus_core/network/Cargo.toml +++ b/nautilus_core/network/Cargo.toml @@ -25,7 +25,7 @@ tokio = { workspace = true } tokio-tungstenite = { workspace = true } dashmap = "6.1.0" http = "1.1.0" -hyper = "1.4.1" +hyper = "1.5.0" nonzero_ext = "0.3.0" rustls = { version = "0.23.14", features = ["ring"] } rustls-native-certs = "0.8.0" diff --git a/nautilus_trader/adapters/dydx/http/client.py b/nautilus_trader/adapters/dydx/http/client.py index d880e40cafca..23a2933f94d1 100644 --- a/nautilus_trader/adapters/dydx/http/client.py +++ b/nautilus_trader/adapters/dydx/http/client.py @@ -140,14 +140,14 @@ async def send_request( if BAD_REQUEST_ERROR_CODE <= response.status < INTERNAL_SERVER_ERROR_CODE: raise DYDXError( status=response.status, - message=msgspec.json.decode(response.body) if response.body else None, + message=msgspec.json.decode(response.body) if response.body else str(None), headers=response.headers, ) if response.status >= INTERNAL_SERVER_ERROR_CODE: raise DYDXError( status=response.status, - message=msgspec.json.decode(response.body) if response.body else None, + message=msgspec.json.decode(response.body) if response.body else str(None), headers=response.headers, ) diff --git a/nautilus_trader/adapters/okx/schemas/public/instrument.py b/nautilus_trader/adapters/okx/schemas/public/instrument.py index d55e1f54ca00..3207f7ed67c0 100644 --- a/nautilus_trader/adapters/okx/schemas/public/instrument.py +++ b/nautilus_trader/adapters/okx/schemas/public/instrument.py @@ -108,12 +108,9 @@ def parse_to_instrument( # NOTE: truncate all float strings to precision 9 (max in nautilus) # NOTE: can use instrument.info (dict[str, Any]) to get raw API data - price_increment = ( - Price.from_str(f"{self._clip_prc(self.tickSz):.9f}") if self.tickSz else None - ) - size_increment = ( - Quantity.from_str(f"{self._clip_qty(self.lotSz):.9f}") if self.lotSz else None - ) + # TODO: Fix for correct precisions + price_increment = Price.from_str(f"{self._clip_prc(self.tickSz):.9f}") + size_increment = Quantity.from_str(f"{self._clip_qty(self.lotSz):.9f}") # Get max_quantity as the min of all possible max sizes max_quantity = None @@ -199,12 +196,9 @@ def parse_to_instrument( # NOTE: truncate all float strings to precision 9 (max in nautilus) # NOTE: can use instrument.info (dict[str, Any]) to get raw API data - price_increment = ( - Price.from_str(f"{self._clip_prc(self.tickSz):.9f}") if self.tickSz else None - ) - size_increment = ( - Quantity.from_str(f"{self._clip_qty(self.lotSz):.9f}") if self.lotSz else None - ) + # TODO: Fix for correct precisions + price_increment = Price.from_str(f"{self._clip_prc(self.tickSz):.9f}") + size_increment = Quantity.from_str(f"{self._clip_qty(self.lotSz):.9f}") # Get max_quantity as the min of all possible max sizes max_quantity = None diff --git a/poetry.lock b/poetry.lock index 6592f3ffbf56..679f36f760da 100644 --- a/poetry.lock +++ b/poetry.lock @@ -270,148 +270,148 @@ develop = ["coverage (>=5.3)", "flake8 (>=3.8)", "isort (>=5.8)", "mypy (>=0.900 [[package]] name = "bitarray" -version = "2.9.3" +version = "3.0.0" description = "efficient arrays of booleans -- C extension" optional = true python-versions = "*" files = [ - {file = "bitarray-2.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2cf5f5400636c7dda797fd681795ce63932458620fe8c40955890380acba9f62"}, - {file = "bitarray-2.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3487b4718ffa5942fab777835ee36085f8dda7ec4bd0b28433efb117f84852b6"}, - {file = "bitarray-2.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10f44b1e4994035408bea54d7bf0aec79744cad709706bedf28091a48bb7f1a4"}, - {file = "bitarray-2.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb5c16f97c65add6535748a9c98c70e7ca79759c38a2eb990127fef72f76111a"}, - {file = "bitarray-2.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:13dbfc42971ba84e9c4ba070f720df6570285a3f89187f07ef422efcb611c19f"}, - {file = "bitarray-2.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c28076acfbe7f9a5494d7ae98094a6e209c390c340938845f294818ebf5e4d3"}, - {file = "bitarray-2.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7cdd21835936d9a66477836ca23b2cb63295142cb9d9158883e2c0f1f8f6bd"}, - {file = "bitarray-2.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f60887ab3a46e507fa6f8544d8d4b0748da48718591dfe3fe80c62bdea60f10"}, - {file = "bitarray-2.9.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f75e1abd4a37cba3002521d3f5e2b50ef4f4a74342207cad3f52468411d5d8ba"}, - {file = "bitarray-2.9.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dc63da9695383c048b83f5ab77eab35a55bbb2e77c7b6e762eba219929b45b84"}, - {file = "bitarray-2.9.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6fe5a57b859d9bc9c2fd27c78c4b7b83158faf984202de6fb44618caeebfff10"}, - {file = "bitarray-2.9.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1fe5a37bd9441a5ecc2f6e71b43df7176fa376a542ef97484310b8b46a45649a"}, - {file = "bitarray-2.9.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8a16e42c169ca818d6a15b5dd5acd5d2a26af0fa0588e1036e0e58d01f8387d4"}, - {file = "bitarray-2.9.3-cp310-cp310-win32.whl", hash = "sha256:5e6b5e7940af3474ffaa930cd1ce8215181cbe864d6b5ddb67a15d3c15e935cd"}, - {file = "bitarray-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:c63dbb99ef2ab1281871678624f9c9a5f1682b826e668ce559275ec488b3fa8b"}, - {file = "bitarray-2.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:49fb93b488d180f5c84b79fe687c585a84bf0295ff035d63e09ee24ce1da0558"}, - {file = "bitarray-2.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c2944fb83bbc2aa7f29a713bc4f8c1318e54fa0d06a72bedd350a3fb4a4b91d8"}, - {file = "bitarray-2.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3612d9d3788dc62f1922c917b1539f1cdf02cecc9faef8ae213a8b36093136ca"}, - {file = "bitarray-2.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90a9300cdb7c99b1e692bb790cba8acecee1a345a83e58e28c94a0d87c522237"}, - {file = "bitarray-2.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1211ed66acbbb221fd7554abf4206a384d79e6192d5cb95325c5c361bbb52a74"}, - {file = "bitarray-2.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67757279386accf93eba76b8f97b5acf1664a3e350cbea5f300f53490f8764fd"}, - {file = "bitarray-2.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64e19c6a99c32f460c2613f797f77aa37d8e298891d00ea5355158cce80e11ec"}, - {file = "bitarray-2.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72734bd3775f43c5a75385730abb9f84fee6c627eb14f579de4be478f1615c8c"}, - {file = "bitarray-2.9.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a92703471b5d3316c7481bc1852f620f42f7a1b62be27f39d13694827635786f"}, - {file = "bitarray-2.9.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d5d77c81300ca430d4b195ccfbb629d6858258f541b6e96c6b11ec1563cd2681"}, - {file = "bitarray-2.9.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3ba8a29c0d091c952ced1607ce715f5e0524899f24333a493807d00f5938463d"}, - {file = "bitarray-2.9.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:418171d035b191dbe5e86cd2bfb5c3e1ae7d947edc22857a897d1c7251674ae5"}, - {file = "bitarray-2.9.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e0bd272eba256183be2a17488f9cb096d2e6d3435ecf2e28c1e0857c6d20749"}, - {file = "bitarray-2.9.3-cp311-cp311-win32.whl", hash = "sha256:cc3fd2b0637a619cf13e122bbcf4729ae214d5f25623675597e67c25f9edfe61"}, - {file = "bitarray-2.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:e1fc2a81a585dbe5e367682156e6350d908a56e2ffd6ca651b0af01994db596f"}, - {file = "bitarray-2.9.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dc47be026f76f1728af00dc7140cec8483fe2f0c476bbf2a59ef47865e00ff96"}, - {file = "bitarray-2.9.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:82b091742ff511cdb06f90af0d2c22e7af3dbff9b8212e2e0d88dfef6a8570b3"}, - {file = "bitarray-2.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d5edb4302a0e3a3d1d0eeb891de3c615d4cb7a446fb41c21eecdcfb29400a6f"}, - {file = "bitarray-2.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4786c5525069c19820549dd2f42d33632bc42959ad167138bd8ee5024b922b"}, - {file = "bitarray-2.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bfe2de2b4df61ccb9244871a0fdf1fff83be0c1bd7187048c3cf7f81c5fe631"}, - {file = "bitarray-2.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:31e4f69538f95d2934587d957eea0d283162322dd1af29e57122b20b8cd60f92"}, - {file = "bitarray-2.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca44908b2bc08d8995770018638d62626706864f9c599b7818225a12f3dbc2c"}, - {file = "bitarray-2.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:279f8de5d251ee521e365df29c927d9b5732f1ed4f373d2dbbd278fcbad94ff5"}, - {file = "bitarray-2.9.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49bb631b38431c09ecd534d56ef04264397d24d18c4ee6653c84e14ae09d92d"}, - {file = "bitarray-2.9.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:192bffc93ee9a5b6c833c98d1dcc81f5633ddd726b85e18341387d0c1d51f691"}, - {file = "bitarray-2.9.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c516cec28c6511df51d87033f40ec420324a2247469b0c989d344f4d27ea37d2"}, - {file = "bitarray-2.9.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:66241cb9a1c1db294f46cd440141e57e8242874e38f3f61877f72d92ae14768a"}, - {file = "bitarray-2.9.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab1f0e7631110c89bea7b605c0c35832333eb9cc97e5de05d71c76d42a1858c9"}, - {file = "bitarray-2.9.3-cp312-cp312-win32.whl", hash = "sha256:42aa5bee6fe8ad3385eaf5c6585016bbc38a7b75efb52ce5c6f8e00e05237dfa"}, - {file = "bitarray-2.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:dc3fd647d845b94fac3652390866f921f914a17f3807a031c826f68dae3f43e3"}, - {file = "bitarray-2.9.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fcfcc1989e3e021a282624017b7fb754210f5332e933b1c3ebc79643727b6551"}, - {file = "bitarray-2.9.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:71b1e229a706798a9e106ca7b03d4c63455deb40b18c92950ec073a05a8f8285"}, - {file = "bitarray-2.9.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4bb49556d3d505d24c942a4206ad4d0d40e89fa3016a7ea6edc994d5c08d4a8e"}, - {file = "bitarray-2.9.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4466aa1e533a59d5f7fd37219d154ec3f2ba73fce3d8a2e11080ec475bc15fb"}, - {file = "bitarray-2.9.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a9b75adc0fd0bf278bea89dc3d679d74e10d2df98d3d074b7f3d36f323138818"}, - {file = "bitarray-2.9.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:701582bbbeac372b1cd8a3c9daf6c2336dc2d22e14373a6271d788bc4f2b6edc"}, - {file = "bitarray-2.9.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ea1f119668bbdbd68008031491515e84441e505163918819994b28f295f762c"}, - {file = "bitarray-2.9.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f400bc18a70bfdb073532c3054ecd78a0e64f96ff7b6140adde5b122580ec2b"}, - {file = "bitarray-2.9.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aacff5656fb3e15cede7d02903da2634d376aa928d7a81ec8df19b0724d7972a"}, - {file = "bitarray-2.9.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8a2ae42a14cbf766d4478d7101da6359b0648dd813e60eb3486ac56ad2f5add3"}, - {file = "bitarray-2.9.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:616698edb547d10f0b960cb9f2e8629c55a420dd4c2b1ab46706f49a1815621d"}, - {file = "bitarray-2.9.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f277c50ba184929dfeed39b6cf9468e3446093521b0aeb52bd54a21ca08f5473"}, - {file = "bitarray-2.9.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:661237739b385c90d8837d5e96b06de093cc6e610236977e198f88f5a979686e"}, - {file = "bitarray-2.9.3-cp313-cp313-win32.whl", hash = "sha256:68acec6c19d798051f178a1197b76f891985f683f95a4b12811b68e58b080f5a"}, - {file = "bitarray-2.9.3-cp313-cp313-win_amd64.whl", hash = "sha256:3055720afdcfd7e8f630fa16db7bed7e55c9d0a1f4756195e3b250e203f3b436"}, - {file = "bitarray-2.9.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:72bf17d0e7d8a4f645655a07999d23e42472cbf2100b8dad7ce26586075241d7"}, - {file = "bitarray-2.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cfd332b5f1ad8c4dc3cc79ecef33c19b42d8d8e6a39fd5c9ecb5855be0b9723"}, - {file = "bitarray-2.9.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5b466ef1e48f25621c9d27e95deb5e33b8656827ed8aa530b972de73870bd1f"}, - {file = "bitarray-2.9.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:938cf26fdaf4d0adfac82d830c025523c5d36ddead0470b735286028231c1784"}, - {file = "bitarray-2.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0f766669e768ef9a2b23ecfa710b38b6a48da3f91755113c79320b207ae255d"}, - {file = "bitarray-2.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b6337c0c64044f35ddfb241143244aac707a68f34ae31a71dad115f773ccc8b"}, - {file = "bitarray-2.9.3-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:731b59540167f8b2b20f69f487ecee2339fc4657059906a16cb51acac17f89c3"}, - {file = "bitarray-2.9.3-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:4feed0539a9d6432361fc4d3820eea3a81fa631d542f166cf8430aad81a971da"}, - {file = "bitarray-2.9.3-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:eb65c96a42e73f35175ec738d67992ffdf054c20abee3933cfcfa2343fa1187d"}, - {file = "bitarray-2.9.3-cp36-cp36m-musllinux_1_2_s390x.whl", hash = "sha256:4f40ceac94d182de6135759d81289683ff3e4cf0da709bc5826a7fe00d754114"}, - {file = "bitarray-2.9.3-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:5b29f7844080a281635a231a37e99f0bd6f567af6cf19f4f6d212137f99a9cdf"}, - {file = "bitarray-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:947cf522a3b339b73114d12417fd848fa01303dbaa7883ced4c87688dba5637c"}, - {file = "bitarray-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:ea794ea60d514d68777a87a74106110db7a4bbc2c46720e67010e3071afefb95"}, - {file = "bitarray-2.9.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c7bc7cb79dcac8bdce23b305e671c06eaeffb012fa065b8c33bc51df7e1733f0"}, - {file = "bitarray-2.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6380ad0f929ad9220abadd1c9b7234271c4b6ea9c753a88611d489e93a8f2e"}, - {file = "bitarray-2.9.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05f4e2451e2ad450b41ede8440e52c1fd798e81027e1dc2256292ec0787d3bf1"}, - {file = "bitarray-2.9.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7267885c98138f3707c710d5b08eedef150a3e5112c760cfe1200f3366fd7064"}, - {file = "bitarray-2.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:976957423cb41df8fe0eb811dbb53d8c5ab1ca3beec7a3ca7ff679be44a72714"}, - {file = "bitarray-2.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0ec5141a69f73ed6ff17ea7344d5cc166e087095bfe3661dbb42b519e76aa16"}, - {file = "bitarray-2.9.3-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:218a1b7c0652a3c1020f903ded0f9768c3719fb6d43a6e9d346e985292992d35"}, - {file = "bitarray-2.9.3-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:cf0c9ebf2df280794244e1e12ed626357506ddaa2f0d6f69efe493ae7bbf4bf7"}, - {file = "bitarray-2.9.3-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:c450a04a7e091b57d4c0bd1531648522cd0ef26913ad0e5dea0432ea29b0e5c1"}, - {file = "bitarray-2.9.3-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:a212eb89a50e32ef4969387e44a7410447dc59587615e3966d090edc338a1b85"}, - {file = "bitarray-2.9.3-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:4269232026212ee6b73379b88a578107a6b36a6182307a49d5509686c7495261"}, - {file = "bitarray-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:8a0fb358e6a43f216c3fb0871e2ac14c16563aec363c23bc2fbbb18f6201285d"}, - {file = "bitarray-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:a8368774cdc737eec8fce6f28d0abc095fbc0edccf8fab8d29fddc264b68def9"}, - {file = "bitarray-2.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7d0724a4fef6ded914075a3385ea2d05afdeed567902f83490ed4e7e7e75d9bf"}, - {file = "bitarray-2.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0e11b37c6dff6f41ebc49914628824ceb8c8d6ebd0fda2ebe3c0fe0c63e8621e"}, - {file = "bitarray-2.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:085f4081d72c7468f82f722a9f113e03a1f7a4c132ef4c2a4e680c5d78b7db00"}, - {file = "bitarray-2.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b530b5fbed2900634fbc43f546e384abd72ad9c49795ff5bd6a93cac1aa9c4d8"}, - {file = "bitarray-2.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09ff88e4385967571146fb0d270442de39393d44198f4d108f3350cfd6486f0b"}, - {file = "bitarray-2.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344bb212ddf87db4976a6711d274660a5d887da4fd3faafcdaa092152f85a6d"}, - {file = "bitarray-2.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc569c96b990f92fd5946d5b50501fee48b01a116a286d1de7961ebd9c6f06f3"}, - {file = "bitarray-2.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2fbbe7938ef8a7abe3e8519fa0578b51d2787f7171d3144e7d373551b5851fd"}, - {file = "bitarray-2.9.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0b5912fab904507b47217509b01aa903d7f98b6e725e490a7f01661f4d9a4fa7"}, - {file = "bitarray-2.9.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:0c836ccfca9cf60927256738ef234dfe500565492eff269610cdd1bca56801d0"}, - {file = "bitarray-2.9.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:af0e4441ebf51c18fc450962f1e201c96f444d63b17cc8dcf7c0b05111bd4486"}, - {file = "bitarray-2.9.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:9e9b57175fb6fe76d7ddd0647e06a25f6e23f4b54b5febf337c5a840ab37dc3b"}, - {file = "bitarray-2.9.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:7f7de81721ae9492926bd067007ac974692182bb83fc8f0ba330a67f37a018bd"}, - {file = "bitarray-2.9.3-cp38-cp38-win32.whl", hash = "sha256:4beafb6b6e344385480df6611fdebfcb3579bbb40636ce1ddf5e72fb744e095f"}, - {file = "bitarray-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:d8eaeca98900bd6f06a29cdef57999813a67d314f661d14901d71e04f4cf9f00"}, - {file = "bitarray-2.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:413965d9d384aef90e58b959f4a39f1d5060b145c26080297b7b4cf23cf38faa"}, - {file = "bitarray-2.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2fbb56f2bb89c3a15304a6c0ea56013dc340a98337d9bbd7fc5c21451dc05f8c"}, - {file = "bitarray-2.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8a84f39f7885627711473872d8fc58fc7a0a1e4ecd9ddf42daf9a3643432742"}, - {file = "bitarray-2.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45147a9c8580e857c1344d15bd49d2b4387777bd582a2ede11be2ba740653f28"}, - {file = "bitarray-2.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed255423dc60c6b2d5c0d90c13dea2962a31929767fdf1c525ab3210269e75c5"}, - {file = "bitarray-2.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4f5bd02671ea5c4ad52bbfe0e8e8197b6e8fa85dec1e93a4a05448c19354cc65"}, - {file = "bitarray-2.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1c99c58f044549c93fb6d4cda22678deccaed19845eaa2e6917b5b7ca058f2d"}, - {file = "bitarray-2.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:921ee87681e32e17d1849e11c96eb6a8a7edaa1269dd26831013daf8546bde05"}, - {file = "bitarray-2.9.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2ed97d8ec40c4658d9f9aa8f26cb473f44fa1dbccba3fa3fbe4a102e38c6a8d7"}, - {file = "bitarray-2.9.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9d7f7db37edb9c50c9aad6a18f2e87dd7dc5ff2a33406821804a03263fedb2ca"}, - {file = "bitarray-2.9.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:292f726cdb9efc744ed0a1d7453c44151526648148a28d9a2495cc7c7b2c62a8"}, - {file = "bitarray-2.9.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2cc94784238782a9376f307b1aa9a85ce77b6eded9f82d2fe062db7fdb02c645"}, - {file = "bitarray-2.9.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5051436b1d318f6ce0df3b2f8a60bfa66a54c1d9e8719d6cb6b448140e7061f2"}, - {file = "bitarray-2.9.3-cp39-cp39-win32.whl", hash = "sha256:a3d436c686ce59fd0b93438ed2c0e1d3e1716e56bce64b874d05b9f49f1ca5d1"}, - {file = "bitarray-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:f168fc45664266a560f2cb28a327041b7f69d4a7faad8ab89e0a1dd7c270a70d"}, - {file = "bitarray-2.9.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ae36787299cff41f212aee33cfe1defee13979a41552665a412b6ca3fa8f7eb8"}, - {file = "bitarray-2.9.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42afe48abb8eeb386d93e7f1165ace1dd027f136a8a31edd2b20bc57a0c071d7"}, - {file = "bitarray-2.9.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451ceecdb86bb95ae101b0d65c8c4524d692ae3666662fef8c89877ce17748c5"}, - {file = "bitarray-2.9.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4d67d3e3de2aede737b12cd75a84963700c941b77b579c14bd05517e05d7a9f"}, - {file = "bitarray-2.9.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2406d13ded84049b4238815a5821e44d6f58ba00fbb6b705b6ef8ccd88be8f03"}, - {file = "bitarray-2.9.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0db944fc2a048020fc940841ef46c0295b045d45a5a582cba69f78962a49a384"}, - {file = "bitarray-2.9.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25c603f141171a7d108773d5136d14e572c473e4cdb3fb464c39c8a138522eb2"}, - {file = "bitarray-2.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86c06b02705305cab0914d209caa24effda81316e2f2555a71a9aa399b75c5a5"}, - {file = "bitarray-2.9.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ddda45b24a802eaaca8f794e6267ff2b62de5fe7b900b76d6f662d95192bebf"}, - {file = "bitarray-2.9.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:81490623950d04870c6dd4d7e6df2eb68dd04eca8bec327895ebee8bbe0cc3c7"}, - {file = "bitarray-2.9.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a9e69ac6a514cc574891c24a50847022dac2fef8c3f4df530f92820a07337755"}, - {file = "bitarray-2.9.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:545c695ee69d26b41351ced4c76244d8b6225669fc0af3652ff8ed5a6b28325d"}, - {file = "bitarray-2.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbb2e6daabd2a64d091ac7460b0c5c5f9268199ae9a8ce32737cf5273987f1fa"}, - {file = "bitarray-2.9.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a969e5cf63144b944ee8d0a0739f53ef1ae54725b5e01258d690a8995d880526"}, - {file = "bitarray-2.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:73bbb9301ac9000f869c51db2cc5fcc6541985d3fcdcfe6e02f90c9e672a00be"}, - {file = "bitarray-2.9.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c07e346926488a85a48542d898f4168f3587ec42379fef0d18be301e08a3f27"}, - {file = "bitarray-2.9.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a26d8a14cd8ee496306f2afac34833502dd1ae826355af309333b6f252b23fe"}, - {file = "bitarray-2.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cef148ed37c892395ca182d6a235524165a9f765f4283d0a1ced891e7c43c67a"}, - {file = "bitarray-2.9.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94f35a8f0c8a50ee98a8bef9a070d0b68ecf623f20a2148cc039aba5557346a6"}, - {file = "bitarray-2.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b03207460daae828e2743874c84264e8d96a8c6156490279092b624cd5d2de08"}, - {file = "bitarray-2.9.3.tar.gz", hash = "sha256:9eff55cf189b0c37ba97156a00d640eb7392db58a8049be6f26ff2712b93fa89"}, + {file = "bitarray-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ddbf71a97ad1d6252e6e93d2d703b624d0a5b77c153b12f9ea87d83e1250e0c"}, + {file = "bitarray-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0e7f24a0b01e6e6a0191c50b06ca8edfdec1988d9d2b264d669d2487f4f4680"}, + {file = "bitarray-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:150b7b29c36d9f1a24779aea723fdfc73d1c1c161dc0ea14990da27d4e947092"}, + {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8330912be6cb8e2fbfe8eb69f82dee139d605730cadf8d50882103af9ac83bb4"}, + {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e56ba8be5f17dee0ffa6d6ce85251e062ded2faa3cbd2558659c671e6c3bf96d"}, + {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffd94b4803811c738e504a4b499fb2f848b2f7412d71e6b517508217c1d7929d"}, + {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0255bd05ec7165e512c115423a5255a3f301417973d20a80fc5bfc3f3640bcb"}, + {file = "bitarray-3.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe606e728842389943a939258809dc5db2de831b1d2e0118515059e87f7bbc1a"}, + {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e89ea59a3ed86a6eb150d016ed28b1bedf892802d0ed32b5659d3199440f3ced"}, + {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cf0cc2e91dd38122dec2e6541efa99aafb0a62e118179218181eff720b4b8153"}, + {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:2d9fe3ee51afeb909b68f97e14c6539ace3f4faa99b21012e610bbe7315c388d"}, + {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:37be5482b9df3105bad00fdf7dc65244e449b130867c3879c9db1db7d72e508b"}, + {file = "bitarray-3.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0027b8f3bb2bba914c79115e96a59b9924aafa1a578223a7c4f0a7242d349842"}, + {file = "bitarray-3.0.0-cp310-cp310-win32.whl", hash = "sha256:628f93e9c2c23930bd1cfe21c634d6c84ec30f45f23e69aefe1fcd262186d7bb"}, + {file = "bitarray-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:0b655c3110e315219e266b2732609fddb0857bc69593de29f3c2ba74b7d3f51a"}, + {file = "bitarray-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:44c3e78b60070389b824d5a654afa1c893df723153c81904088d4922c3cfb6ac"}, + {file = "bitarray-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:545d36332de81e4742a845a80df89530ff193213a50b4cbef937ed5a44c0e5e5"}, + {file = "bitarray-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a9eb510cde3fa78c2e302bece510bf5ed494ec40e6b082dec753d6e22d5d1b1"}, + {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e3727ab63dfb6bde00b281934e2212bb7529ea3006c0031a556a84d2268bea5"}, + {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2055206ed653bee0b56628f6a4d248d53e5660228d355bbec0014bdfa27050ae"}, + {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:147542299f458bdb177f798726e5f7d39ab8491de4182c3c6d9885ed275a3c2b"}, + {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f761184b93092077c7f6b7dad7bd4e671c1620404a76620da7872ceb576a94"}, + {file = "bitarray-3.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e008b7b4ce6c7f7a54b250c45c28d4243cc2a3bbfd5298fa7dac92afda229842"}, + {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dfea514e665af278b2e1d4deb542de1cd4f77413bee83dd15ae16175976ea8d5"}, + {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:66d6134b7bb737b88f1d16478ad0927c571387f6054f4afa5557825a4c1b78e2"}, + {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3cd565253889940b4ec4768d24f101d9fe111cad4606fdb203ea16f9797cf9ed"}, + {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4800c91a14656789d2e67d9513359e23e8a534c8ee1482bb9b517a4cfc845200"}, + {file = "bitarray-3.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c2945e0390d1329c585c584c6b6d78be017d9c6a1288f9c92006fe907f69cc28"}, + {file = "bitarray-3.0.0-cp311-cp311-win32.whl", hash = "sha256:c23286abba0cb509733c6ce8f4013cd951672c332b2e184dbefbd7331cd234c8"}, + {file = "bitarray-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:ca79f02a98cbda1472449d440592a2fe2ad96fe55515a0447fa8864a38017cf8"}, + {file = "bitarray-3.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:184972c96e1c7e691be60c3792ca1a51dd22b7f25d96ebea502fe3c9b554f25d"}, + {file = "bitarray-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:787db8da5e9e29be712f7a6bce153c7bc8697ccc2c38633e347bb9c82475d5c9"}, + {file = "bitarray-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2da91ab3633c66999c2a352f0ca9ae064f553e5fc0eca231d28e7e305b83e942"}, + {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7edb83089acbf2c86c8002b96599071931dc4ea5e1513e08306f6f7df879a48b"}, + {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996d1b83eb904589f40974538223eaed1ab0f62be8a5105c280b9bd849e685c4"}, + {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4817d73d995bd2b977d9cde6050be8d407791cf1f84c8047fa0bea88c1b815bc"}, + {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d47bc4ff9b0e1624d613563c6fa7b80aebe7863c56c3df5ab238bb7134e8755"}, + {file = "bitarray-3.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aca0a9cd376beaccd9f504961de83e776dd209c2de5a4c78dc87a78edf61839b"}, + {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:572a61fba7e3a710a8324771322fba8488d134034d349dcd036a7aef74723a80"}, + {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a817ad70c1aff217530576b4f037dd9b539eb2926603354fcac605d824082ad1"}, + {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:2ac67b658fa5426503e9581a3fb44a26a3b346c1abd17105735f07db572195b3"}, + {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:12f19ede03e685c5c588ab5ed63167999295ffab5e1126c5fe97d12c0718c18f"}, + {file = "bitarray-3.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcef31b062f756ba7eebcd7890c5d5de84b9d64ee877325257bcc9782288564a"}, + {file = "bitarray-3.0.0-cp312-cp312-win32.whl", hash = "sha256:656db7bdf1d81ec3b57b3cad7ec7276765964bcfd0eb81c5d1331f385298169c"}, + {file = "bitarray-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f785af6b7cb07a9b1e5db0dea9ef9e3e8bb3d74874a0a61303eab9c16acc1999"}, + {file = "bitarray-3.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7cb885c043000924554fe2124d13084c8fdae03aec52c4086915cd4cb87fe8be"}, + {file = "bitarray-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7814c9924a0b30ecd401f02f082d8697fc5a5be3f8d407efa6e34531ff3c306a"}, + {file = "bitarray-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bcf524a087b143ba736aebbb054bb399d49e77cf7c04ed24c728e411adc82bfa"}, + {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1d5abf1d6d910599ac16afdd9a0ed3e24f3b46af57f3070cf2792f236f36e0b"}, + {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9929051feeaf8d948cc0b1c9ce57748079a941a1a15c89f6014edf18adaade84"}, + {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96cf0898f8060b2d3ae491762ae871b071212ded97ff9e1e3a5229e9fefe544c"}, + {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab37da66a8736ad5a75a58034180e92c41e864da0152b84e71fcc253a2f69cd4"}, + {file = "bitarray-3.0.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeb79e476d19b91fd6a3439853e4e5ba1b3b475920fa40d62bde719c8af786f"}, + {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f75fc0198c955d840b836059bd43e0993edbf119923029ca60c4fc017cefa54a"}, + {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f12cc7c7638074918cdcc7491aff897df921b092ffd877227892d2686e98f876"}, + {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dbe1084935b942fab206e609fa1ed3f46ad1f2612fb4833e177e9b2a5e006c96"}, + {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ac06dd72ee1e1b6e312504d06f75220b5894af1fb58f0c20643698f5122aea76"}, + {file = "bitarray-3.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00f9a88c56e373009ac3c73c55205cfbd9683fbd247e2f9a64bae3da78795252"}, + {file = "bitarray-3.0.0-cp313-cp313-win32.whl", hash = "sha256:9c6e52005e91803eb4e08c0a08a481fb55ddce97f926bae1f6fa61b3396b5b61"}, + {file = "bitarray-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:cb98d5b6eac4b2cf2a5a69f60a9c499844b8bea207059e9fc45c752436e6bb49"}, + {file = "bitarray-3.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:eb27c01b747649afd7e1c342961680893df6d8d81f832a6f04d8c8e03a8a54cc"}, + {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4683bff52f5a0fd523fb5d3138161ef87611e63968e1fcb6cf4b0c6a86970fe0"}, + {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb7302dbcfcb676f0b66f15891f091d0233c4fc23e1d4b9dc9b9e958156e347f"}, + {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:153d7c416a70951dcfa73487af05d2f49c632e95602f1620cd9a651fa2033695"}, + {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251cd5bd47f542893b2b61860eded54f34920ea47fd5bff038d85e7a2f7ae99b"}, + {file = "bitarray-3.0.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fa4b4d9fa90124b33b251ef74e44e737021f253dc7a9174e1b39f097451f7ca"}, + {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:18abdce7ab5d2104437c39670821cba0b32fdb9b2da9e6d17a4ff295362bd9dc"}, + {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:2855cc01ee370f7e6e3ec97eebe44b1453c83fb35080313145e2c8c3c5243afb"}, + {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:0cecaf2981c9cd2054547f651537b4f4939f9fe225d3fc2b77324b597c124e40"}, + {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_s390x.whl", hash = "sha256:22b00f65193fafb13aa644e16012c8b49e7d5cbb6bb72825105ff89aadaa01e3"}, + {file = "bitarray-3.0.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:20f30373f0af9cb583e4122348cefde93c82865dbcbccc4997108b3d575ece84"}, + {file = "bitarray-3.0.0-cp36-cp36m-win32.whl", hash = "sha256:aef404d5400d95c6ec86664df9924bde667c8865f8e33c9b7bd79823d53b3e5d"}, + {file = "bitarray-3.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ec5b0f2d13da53e0975ac15ecbe8badb463bdb0bebaa09457f4df3320421915c"}, + {file = "bitarray-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:041c889e69c847b8a96346650e50f728b747ae176889199c49a3f31ae1de0e23"}, + {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc83ea003dd75e9ade3291ef0585577dd5524aec0c8c99305c0aaa2a7570d6db"}, + {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c33129b49196aa7965ac0f16fcde7b6ad8614b606caf01669a0277cef1afe1d"}, + {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ef5c787c8263c082a73219a69eb60a500e157a4ac69d1b8515ad836b0e71fb4"}, + {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e15c94d79810c5ab90ddf4d943f71f14332890417be896ca253f21fa3d78d2b1"}, + {file = "bitarray-3.0.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cd021ada988e73d649289cee00428b75564c46d55fbdcb0e3402e504b0ae5ea"}, + {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7f1c24be7519f16a47b7e2ad1a1ef73023d34d8cbe1a3a59b185fc14baabb132"}, + {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:000df24c183011b5d27c23d79970f49b6762e5bb5aacd25da9c3e9695c693222"}, + {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:42bf1b222c698b467097f58b9f59dc850dfa694dde4e08237407a6a103757aa3"}, + {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:648e7ce794928e8d11343b5da8ecc5b910af75a82ea1a4264d5d0a55c3785faa"}, + {file = "bitarray-3.0.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:f536fc4d1a683025f9caef0bebeafd60384054579ffe0825bb9bd8c59f8c55b8"}, + {file = "bitarray-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:a754c1464e7b946b1cac7300c582c6fba7d66e535cd1dab76d998ad285ac5a37"}, + {file = "bitarray-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e91d46d12781a14ccb8b284566b14933de4e3b29f8bc5e1c17de7a2001ad3b5b"}, + {file = "bitarray-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:904c1d5e3bd24f0c0d37a582d2461312033c91436a6a4f3bdeeceb4bea4a899d"}, + {file = "bitarray-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:47ccf9887bd595d4a0536f2310f0dcf89e17ab83b8befa7dc8727b8017120fda"}, + {file = "bitarray-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:71ad0139c95c9acf4fb62e203b428f9906157b15eecf3f30dc10b55919225896"}, + {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e002ac1073ac70e323a7a4bfa9ab95e7e1a85c79160799e265563f342b1557"}, + {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:acc07211a59e2f245e9a06f28fa374d094fb0e71cf5366eef52abbb826ddc81e"}, + {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98a4070ddafabddaee70b2aa7cc6286cf73c37984169ab03af1782da2351059a"}, + {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7d09ef06ba57bea646144c29764bf6b870fb3c5558ca098191e07b6a1d40bf7"}, + {file = "bitarray-3.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce249ed981f428a8b61538ca82d3875847733d579dd40084ab8246549160f8a4"}, + {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ea40e98d751ed4b255db4a88fe8fb743374183f78470b9e9305aab186bf28ede"}, + {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:928b8b6dfcd015e1a81334cfdac02815da2a2407854492a80cf8a3a922b04052"}, + {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:fbb645477595ce2a0fbb678d1cfd08d3b896e5d56196d40fb9e114eeab9382b3"}, + {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:dc1937a0ff2671797d35243db4b596329842480d125a65e9fe964bcffaf16dfc"}, + {file = "bitarray-3.0.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a4f49ac31734fe654a68e2515c0da7f5bbdf2d52755ba09a42ac406f1f08c9d0"}, + {file = "bitarray-3.0.0-cp38-cp38-win32.whl", hash = "sha256:6d2a2ce73f9897268f58857ad6893a1a6680c5a6b28f79d21c7d33285a5ae646"}, + {file = "bitarray-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:b1047999f1797c3ea7b7c85261649249c243308dcf3632840d076d18fa72f142"}, + {file = "bitarray-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:39b38a3d45dac39d528c87b700b81dfd5e8dc8e9e1a102503336310ef837c3fd"}, + {file = "bitarray-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0e104f9399144fab6a892d379ba1bb4275e56272eb465059beef52a77b4e5ce6"}, + {file = "bitarray-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0879f839ec8f079fa60c3255966c2e1aa7196699a234d4e5b7898fbc321901b5"}, + {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9502c2230d59a4ace2fddfd770dad8e8b414cbd99517e7e56c55c20997c28b8d"}, + {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57d5ef854f8ec434f2ffd9ddcefc25a10848393fe2976e2be2c8c773cf5fef42"}, + {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a3c36b2fcfebe15ad1c10a90c1d52a42bebe960adcbce340fef867203028fbe7"}, + {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66a33a537e781eac3a352397ce6b07eedf3a8380ef4a804f8844f3f45e335544"}, + {file = "bitarray-3.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa54c7e1da8cf4be0aab941ea284ec64033ede5d6de3fd47d75e77cafe986e9d"}, + {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a667ea05ba1ea81b722682276dbef1d36990f8908cf51e570099fd505a89f931"}, + {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d756bfeb62ca4fe65d2af7a39249d442c05070c047d03729ad6cd4c2e9b0f0bd"}, + {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c9e9fef0754867d88e948ce8351c9fd7e507d8514e0f242fd67c907b9cdf98b3"}, + {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:67a0b56dd02f2713f6f52cacb3f251afd67c94c5f0748026d307d87a81a8e15c"}, + {file = "bitarray-3.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d8c36ddc1923bcc4c11b9994c54eaae25034812a42400b7b8a86fe6d242166a2"}, + {file = "bitarray-3.0.0-cp39-cp39-win32.whl", hash = "sha256:1414a7102a3c4986f241480544f5c99f5d32258fb9b85c9c04e84e48c490ab35"}, + {file = "bitarray-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:8c9733d2ff9b7838ac04bf1048baea153174753e6a47312be14c83c6a395424b"}, + {file = "bitarray-3.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fef4e3b3f2084b4dae3e5316b44cda72587dcc81f68b4eb2dbda1b8d15261b61"}, + {file = "bitarray-3.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e9eee03f187cef1e54a4545124109ee0afc84398628b4b32ebb4852b4a66393"}, + {file = "bitarray-3.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb5702dd667f4bb10fed056ffdc4ddaae8193a52cd74cb2cdb54e71f4ef2dd1"}, + {file = "bitarray-3.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:666e44b0458bb2894b64264a29f2cc7b5b2cbcc4c5e9cedfe1fdbde37a8e329a"}, + {file = "bitarray-3.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c756a92cf1c1abf01e56a4cc40cb89f0ff9147f2a0be5b557ec436a23ff464d8"}, + {file = "bitarray-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7e51e7f8289bf6bb631e1ef2a8f5e9ca287985ff518fe666abbdfdb6a848cb26"}, + {file = "bitarray-3.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fa5d8e4b28388b337face6ce4029be73585651a44866901513df44be9a491ab"}, + {file = "bitarray-3.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3963b80a68aedcd722a9978d261ae53cb9bb6a8129cc29790f0f10ce5aca287a"}, + {file = "bitarray-3.0.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b555006a7dea53f6bebc616a4d0249cecbf8f1fadf77860120a2e5dbdc2f167"}, + {file = "bitarray-3.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:4ac2027ca650a7302864ed2528220d6cc6921501b383e9917afc7a2424a1e36d"}, + {file = "bitarray-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bf90aba4cff9e72e24ecdefe33bad608f147a23fa5c97790a5bab0e72fe62b6d"}, + {file = "bitarray-3.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a199e6d7c3bad5ba9d0e4dc00dde70ee7d111c9dfc521247fa646ef59fa57e"}, + {file = "bitarray-3.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43b6c7c4f4a7b80e86e24a76f4c6b9b67d03229ea16d7d403520616535c32196"}, + {file = "bitarray-3.0.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fc13da3518f14825b239374734fce93c1a9299ed7b558c3ec1d659ec7e4c70"}, + {file = "bitarray-3.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:369b6d457af94af901d632c7e625ca6caf0a7484110fc91c6290ce26bc4f1478"}, + {file = "bitarray-3.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ee040ad3b7dfa05e459713099f16373c1f2a6f68b43cb0575a66718e7a5daef4"}, + {file = "bitarray-3.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dad7ba2af80f9ec1dd988c3aca7992408ec0d0b4c215b65d353d95ab0070b10"}, + {file = "bitarray-3.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4839d3b64af51e4b8bb4a602563b98b9faeb34fd6c00ed23d7834e40a9d080fc"}, + {file = "bitarray-3.0.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f71f24b58e75a889b9915e3197865302467f13e7390efdea5b6afc7424b3a2ea"}, + {file = "bitarray-3.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bcf0150ae0bcc4aa97bdfcb231b37bad1a59083c1b5012643b266012bf420e68"}, + {file = "bitarray-3.0.0.tar.gz", hash = "sha256:a2083dc20f0d828a7cdf7a16b20dae56aab0f43dc4f347a3b3039f6577992b03"}, ] [[package]] @@ -1419,13 +1419,13 @@ test = ["eth-hash[pycryptodome]", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-typing" -version = "5.0.0" +version = "5.0.1" description = "eth-typing: Common type annotations for ethereum python packages" optional = true python-versions = "<4,>=3.8" files = [ - {file = "eth_typing-5.0.0-py3-none-any.whl", hash = "sha256:c7ebc8595e7b65175bb4b4176c2b548ab21b13329f2058e84d4f8c289ba9f577"}, - {file = "eth_typing-5.0.0.tar.gz", hash = "sha256:87ce7cee75665c09d2dcff8de1b496609d5e32fcd2e2b1d8fc0370c29eedcdc0"}, + {file = "eth_typing-5.0.1-py3-none-any.whl", hash = "sha256:f30d1af16aac598f216748a952eeb64fbcb6e73efa691d2de31148138afe96de"}, + {file = "eth_typing-5.0.1.tar.gz", hash = "sha256:83debf88c9df286db43bb7374974681ebcc9f048fac81be2548dbc549a3203c0"}, ] [package.dependencies] @@ -2110,38 +2110,43 @@ files = [ [[package]] name = "mypy" -version = "1.11.2" +version = "1.12.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a"}, - {file = "mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef"}, - {file = "mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383"}, - {file = "mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8"}, - {file = "mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7"}, - {file = "mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385"}, - {file = "mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca"}, - {file = "mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104"}, - {file = "mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4"}, - {file = "mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6"}, - {file = "mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318"}, - {file = "mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36"}, - {file = "mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987"}, - {file = "mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca"}, - {file = "mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70"}, - {file = "mypy-1.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:37c7fa6121c1cdfcaac97ce3d3b5588e847aa79b580c1e922bb5d5d2902df19b"}, - {file = "mypy-1.11.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8a53bc3ffbd161b5b2a4fff2f0f1e23a33b0168f1c0778ec70e1a3d66deb86"}, - {file = "mypy-1.11.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ff93107f01968ed834f4256bc1fc4475e2fecf6c661260066a985b52741ddce"}, - {file = "mypy-1.11.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:edb91dded4df17eae4537668b23f0ff6baf3707683734b6a818d5b9d0c0c31a1"}, - {file = "mypy-1.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:ee23de8530d99b6db0573c4ef4bd8f39a2a6f9b60655bf7a1357e585a3486f2b"}, - {file = "mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6"}, - {file = "mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70"}, - {file = "mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d"}, - {file = "mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d"}, - {file = "mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24"}, - {file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"}, - {file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"}, + {file = "mypy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4397081e620dc4dc18e2f124d5e1d2c288194c2c08df6bdb1db31c38cd1fe1ed"}, + {file = "mypy-1.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:684a9c508a283f324804fea3f0effeb7858eb03f85c4402a967d187f64562469"}, + {file = "mypy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cabe4cda2fa5eca7ac94854c6c37039324baaa428ecbf4de4567279e9810f9e"}, + {file = "mypy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:060a07b10e999ac9e7fa249ce2bdcfa9183ca2b70756f3bce9df7a92f78a3c0a"}, + {file = "mypy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:0eff042d7257f39ba4ca06641d110ca7d2ad98c9c1fb52200fe6b1c865d360ff"}, + {file = "mypy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b86de37a0da945f6d48cf110d5206c5ed514b1ca2614d7ad652d4bf099c7de7"}, + {file = "mypy-1.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20c7c5ce0c1be0b0aea628374e6cf68b420bcc772d85c3c974f675b88e3e6e57"}, + {file = "mypy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a64ee25f05fc2d3d8474985c58042b6759100a475f8237da1f4faf7fcd7e6309"}, + {file = "mypy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:faca7ab947c9f457a08dcb8d9a8664fd438080e002b0fa3e41b0535335edcf7f"}, + {file = "mypy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:5bc81701d52cc8767005fdd2a08c19980de9ec61a25dbd2a937dfb1338a826f9"}, + {file = "mypy-1.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8462655b6694feb1c99e433ea905d46c478041a8b8f0c33f1dab00ae881b2164"}, + {file = "mypy-1.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:923ea66d282d8af9e0f9c21ffc6653643abb95b658c3a8a32dca1eff09c06475"}, + {file = "mypy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ebf9e796521f99d61864ed89d1fb2926d9ab6a5fab421e457cd9c7e4dd65aa9"}, + {file = "mypy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e478601cc3e3fa9d6734d255a59c7a2e5c2934da4378f3dd1e3411ea8a248642"}, + {file = "mypy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:c72861b7139a4f738344faa0e150834467521a3fba42dc98264e5aa9507dd601"}, + {file = "mypy-1.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52b9e1492e47e1790360a43755fa04101a7ac72287b1a53ce817f35899ba0521"}, + {file = "mypy-1.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:48d3e37dd7d9403e38fa86c46191de72705166d40b8c9f91a3de77350daa0893"}, + {file = "mypy-1.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f106db5ccb60681b622ac768455743ee0e6a857724d648c9629a9bd2ac3f721"}, + {file = "mypy-1.12.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:233e11b3f73ee1f10efada2e6da0f555b2f3a5316e9d8a4a1224acc10e7181d3"}, + {file = "mypy-1.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:4ae8959c21abcf9d73aa6c74a313c45c0b5a188752bf37dace564e29f06e9c1b"}, + {file = "mypy-1.12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eafc1b7319b40ddabdc3db8d7d48e76cfc65bbeeafaa525a4e0fa6b76175467f"}, + {file = "mypy-1.12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9b9ce1ad8daeb049c0b55fdb753d7414260bad8952645367e70ac91aec90e07e"}, + {file = "mypy-1.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfe012b50e1491d439172c43ccb50db66d23fab714d500b57ed52526a1020bb7"}, + {file = "mypy-1.12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c40658d4fa1ab27cb53d9e2f1066345596af2f8fe4827defc398a09c7c9519b"}, + {file = "mypy-1.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:dee78a8b9746c30c1e617ccb1307b351ded57f0de0d287ca6276378d770006c0"}, + {file = "mypy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b5df6c8a8224f6b86746bda716bbe4dbe0ce89fd67b1fa4661e11bfe38e8ec8"}, + {file = "mypy-1.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5feee5c74eb9749e91b77f60b30771563327329e29218d95bedbe1257e2fe4b0"}, + {file = "mypy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:77278e8c6ffe2abfba6db4125de55f1024de9a323be13d20e4f73b8ed3402bd1"}, + {file = "mypy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dcfb754dea911039ac12434d1950d69a2f05acd4d56f7935ed402be09fad145e"}, + {file = "mypy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:06de0498798527451ffb60f68db0d368bd2bae2bbfb5237eae616d4330cc87aa"}, + {file = "mypy-1.12.0-py3-none-any.whl", hash = "sha256:fd313226af375d52e1e36c383f39bf3836e1f192801116b31b090dfcd3ec5266"}, + {file = "mypy-1.12.0.tar.gz", hash = "sha256:65a22d87e757ccd95cbbf6f7e181e6caa87128255eb2b6be901bb71b26d8a99d"}, ] [package.dependencies] @@ -3728,13 +3733,13 @@ files = [ [[package]] name = "types-requests" -version = "2.32.0.20240914" +version = "2.32.0.20241016" description = "Typing stubs for requests" optional = false python-versions = ">=3.8" files = [ - {file = "types-requests-2.32.0.20240914.tar.gz", hash = "sha256:2850e178db3919d9bf809e434eef65ba49d0e7e33ac92d588f4a5e295fffd405"}, - {file = "types_requests-2.32.0.20240914-py3-none-any.whl", hash = "sha256:59c2f673eb55f32a99b2894faf6020e1a9f4a402ad0f192bfee0b64469054310"}, + {file = "types-requests-2.32.0.20241016.tar.gz", hash = "sha256:0d9cad2f27515d0e3e3da7134a1b6f28fb97129d86b867f24d9c726452634d95"}, + {file = "types_requests-2.32.0.20241016-py3-none-any.whl", hash = "sha256:4195d62d6d3e043a4eaaf08ff8a62184584d2e8684e9d2aa178c7915a7da3747"}, ] [package.dependencies] @@ -3896,109 +3901,93 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "yarl" -version = "1.15.2" +version = "1.15.3" description = "Yet another URL library" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e4ee8b8639070ff246ad3649294336b06db37a94bdea0d09ea491603e0be73b8"}, - {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a7cf963a357c5f00cb55b1955df8bbe68d2f2f65de065160a1c26b85a1e44172"}, - {file = "yarl-1.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:43ebdcc120e2ca679dba01a779333a8ea76b50547b55e812b8b92818d604662c"}, - {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3433da95b51a75692dcf6cc8117a31410447c75a9a8187888f02ad45c0a86c50"}, - {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38d0124fa992dbacd0c48b1b755d3ee0a9f924f427f95b0ef376556a24debf01"}, - {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ded1b1803151dd0f20a8945508786d57c2f97a50289b16f2629f85433e546d47"}, - {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace4cad790f3bf872c082366c9edd7f8f8f77afe3992b134cfc810332206884f"}, - {file = "yarl-1.15.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c77494a2f2282d9bbbbcab7c227a4d1b4bb829875c96251f66fb5f3bae4fb053"}, - {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b7f227ca6db5a9fda0a2b935a2ea34a7267589ffc63c8045f0e4edb8d8dcf956"}, - {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:31561a5b4d8dbef1559b3600b045607cf804bae040f64b5f5bca77da38084a8a"}, - {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3e52474256a7db9dcf3c5f4ca0b300fdea6c21cca0148c8891d03a025649d935"}, - {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1af74a9529a1137c67c887ed9cde62cff53aa4d84a3adbec329f9ec47a3936"}, - {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:15c87339490100c63472a76d87fe7097a0835c705eb5ae79fd96e343473629ed"}, - {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:74abb8709ea54cc483c4fb57fb17bb66f8e0f04438cff6ded322074dbd17c7ec"}, - {file = "yarl-1.15.2-cp310-cp310-win32.whl", hash = "sha256:ffd591e22b22f9cb48e472529db6a47203c41c2c5911ff0a52e85723196c0d75"}, - {file = "yarl-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:1695497bb2a02a6de60064c9f077a4ae9c25c73624e0d43e3aa9d16d983073c2"}, - {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9fcda20b2de7042cc35cf911702fa3d8311bd40055a14446c1e62403684afdc5"}, - {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0545de8c688fbbf3088f9e8b801157923be4bf8e7b03e97c2ecd4dfa39e48e0e"}, - {file = "yarl-1.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbda058a9a68bec347962595f50546a8a4a34fd7b0654a7b9697917dc2bf810d"}, - {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ac2bc069f4a458634c26b101c2341b18da85cb96afe0015990507efec2e417"}, - {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd126498171f752dd85737ab1544329a4520c53eed3997f9b08aefbafb1cc53b"}, - {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3db817b4e95eb05c362e3b45dafe7144b18603e1211f4a5b36eb9522ecc62bcf"}, - {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:076b1ed2ac819933895b1a000904f62d615fe4533a5cf3e052ff9a1da560575c"}, - {file = "yarl-1.15.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f8cfd847e6b9ecf9f2f2531c8427035f291ec286c0a4944b0a9fce58c6446046"}, - {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:32b66be100ac5739065496c74c4b7f3015cef792c3174982809274d7e51b3e04"}, - {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:34a2d76a1984cac04ff8b1bfc939ec9dc0914821264d4a9c8fd0ed6aa8d4cfd2"}, - {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0afad2cd484908f472c8fe2e8ef499facee54a0a6978be0e0cff67b1254fd747"}, - {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c68e820879ff39992c7f148113b46efcd6ec765a4865581f2902b3c43a5f4bbb"}, - {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:98f68df80ec6ca3015186b2677c208c096d646ef37bbf8b49764ab4a38183931"}, - {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56ec1eacd0a5d35b8a29f468659c47f4fe61b2cab948ca756c39b7617f0aa5"}, - {file = "yarl-1.15.2-cp311-cp311-win32.whl", hash = "sha256:eedc3f247ee7b3808ea07205f3e7d7879bc19ad3e6222195cd5fbf9988853e4d"}, - {file = "yarl-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:0ccaa1bc98751fbfcf53dc8dfdb90d96e98838010fc254180dd6707a6e8bb179"}, - {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:82d5161e8cb8f36ec778fd7ac4d740415d84030f5b9ef8fe4da54784a1f46c94"}, - {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa2bea05ff0a8fb4d8124498e00e02398f06d23cdadd0fe027d84a3f7afde31e"}, - {file = "yarl-1.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99e12d2bf587b44deb74e0d6170fec37adb489964dbca656ec41a7cd8f2ff178"}, - {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:243fbbbf003754fe41b5bdf10ce1e7f80bcc70732b5b54222c124d6b4c2ab31c"}, - {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:856b7f1a7b98a8c31823285786bd566cf06226ac4f38b3ef462f593c608a9bd6"}, - {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:553dad9af802a9ad1a6525e7528152a015b85fb8dbf764ebfc755c695f488367"}, - {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30c3ff305f6e06650a761c4393666f77384f1cc6c5c0251965d6bfa5fbc88f7f"}, - {file = "yarl-1.15.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:353665775be69bbfc6d54c8d134bfc533e332149faeddd631b0bc79df0897f46"}, - {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f4fe99ce44128c71233d0d72152db31ca119711dfc5f2c82385ad611d8d7f897"}, - {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9c1e3ff4b89cdd2e1a24c214f141e848b9e0451f08d7d4963cb4108d4d798f1f"}, - {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:711bdfae4e699a6d4f371137cbe9e740dc958530cb920eb6f43ff9551e17cfbc"}, - {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4388c72174868884f76affcdd3656544c426407e0043c89b684d22fb265e04a5"}, - {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f0e1844ad47c7bd5d6fa784f1d4accc5f4168b48999303a868fe0f8597bde715"}, - {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5cafb02cf097a82d74403f7e0b6b9df3ffbfe8edf9415ea816314711764a27b"}, - {file = "yarl-1.15.2-cp312-cp312-win32.whl", hash = "sha256:156ececdf636143f508770bf8a3a0498de64da5abd890c7dbb42ca9e3b6c05b8"}, - {file = "yarl-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:435aca062444a7f0c884861d2e3ea79883bd1cd19d0a381928b69ae1b85bc51d"}, - {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:416f2e3beaeae81e2f7a45dc711258be5bdc79c940a9a270b266c0bec038fb84"}, - {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:173563f3696124372831007e3d4b9821746964a95968628f7075d9231ac6bb33"}, - {file = "yarl-1.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9ce2e0f6123a60bd1a7f5ae3b2c49b240c12c132847f17aa990b841a417598a2"}, - {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaea112aed589131f73d50d570a6864728bd7c0c66ef6c9154ed7b59f24da611"}, - {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4ca3b9f370f218cc2a0309542cab8d0acdfd66667e7c37d04d617012485f904"}, - {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23ec1d3c31882b2a8a69c801ef58ebf7bae2553211ebbddf04235be275a38548"}, - {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75119badf45f7183e10e348edff5a76a94dc19ba9287d94001ff05e81475967b"}, - {file = "yarl-1.15.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78e6fdc976ec966b99e4daa3812fac0274cc28cd2b24b0d92462e2e5ef90d368"}, - {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8657d3f37f781d987037f9cc20bbc8b40425fa14380c87da0cb8dfce7c92d0fb"}, - {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:93bed8a8084544c6efe8856c362af08a23e959340c87a95687fdbe9c9f280c8b"}, - {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:69d5856d526802cbda768d3e6246cd0d77450fa2a4bc2ea0ea14f0d972c2894b"}, - {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ccad2800dfdff34392448c4bf834be124f10a5bc102f254521d931c1c53c455a"}, - {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a880372e2e5dbb9258a4e8ff43f13888039abb9dd6d515f28611c54361bc5644"}, - {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c998d0558805860503bc3a595994895ca0f7835e00668dadc673bbf7f5fbfcbe"}, - {file = "yarl-1.15.2-cp313-cp313-win32.whl", hash = "sha256:533a28754e7f7439f217550a497bb026c54072dbe16402b183fdbca2431935a9"}, - {file = "yarl-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:5838f2b79dc8f96fdc44077c9e4e2e33d7089b10788464609df788eb97d03aad"}, - {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fbbb63bed5fcd70cd3dd23a087cd78e4675fb5a2963b8af53f945cbbca79ae16"}, - {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2e93b88ecc8f74074012e18d679fb2e9c746f2a56f79cd5e2b1afcf2a8a786b"}, - {file = "yarl-1.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af8ff8d7dc07ce873f643de6dfbcd45dc3db2c87462e5c387267197f59e6d776"}, - {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66f629632220a4e7858b58e4857927dd01a850a4cef2fb4044c8662787165cf7"}, - {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:833547179c31f9bec39b49601d282d6f0ea1633620701288934c5f66d88c3e50"}, - {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2aa738e0282be54eede1e3f36b81f1e46aee7ec7602aa563e81e0e8d7b67963f"}, - {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a13a07532e8e1c4a5a3afff0ca4553da23409fad65def1b71186fb867eeae8d"}, - {file = "yarl-1.15.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c45817e3e6972109d1a2c65091504a537e257bc3c885b4e78a95baa96df6a3f8"}, - {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:670eb11325ed3a6209339974b276811867defe52f4188fe18dc49855774fa9cf"}, - {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:d417a4f6943112fae3924bae2af7112562285848d9bcee737fc4ff7cbd450e6c"}, - {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bc8936d06cd53fddd4892677d65e98af514c8d78c79864f418bbf78a4a2edde4"}, - {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:954dde77c404084c2544e572f342aef384240b3e434e06cecc71597e95fd1ce7"}, - {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5bc0df728e4def5e15a754521e8882ba5a5121bd6b5a3a0ff7efda5d6558ab3d"}, - {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b71862a652f50babab4a43a487f157d26b464b1dedbcc0afda02fd64f3809d04"}, - {file = "yarl-1.15.2-cp38-cp38-win32.whl", hash = "sha256:63eab904f8630aed5a68f2d0aeab565dcfc595dc1bf0b91b71d9ddd43dea3aea"}, - {file = "yarl-1.15.2-cp38-cp38-win_amd64.whl", hash = "sha256:2cf441c4b6e538ba0d2591574f95d3fdd33f1efafa864faa077d9636ecc0c4e9"}, - {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a32d58f4b521bb98b2c0aa9da407f8bd57ca81f34362bcb090e4a79e9924fefc"}, - {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:766dcc00b943c089349d4060b935c76281f6be225e39994c2ccec3a2a36ad627"}, - {file = "yarl-1.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bed1b5dbf90bad3bfc19439258c97873eab453c71d8b6869c136346acfe497e7"}, - {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed20a4bdc635f36cb19e630bfc644181dd075839b6fc84cac51c0f381ac472e2"}, - {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d538df442c0d9665664ab6dd5fccd0110fa3b364914f9c85b3ef9b7b2e157980"}, - {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c6cf1d92edf936ceedc7afa61b07e9d78a27b15244aa46bbcd534c7458ee1b"}, - {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce44217ad99ffad8027d2fde0269ae368c86db66ea0571c62a000798d69401fb"}, - {file = "yarl-1.15.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47a6000a7e833ebfe5886b56a31cb2ff12120b1efd4578a6fcc38df16cc77bd"}, - {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e52f77a0cd246086afde8815039f3e16f8d2be51786c0a39b57104c563c5cbb0"}, - {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:f9ca0e6ce7774dc7830dc0cc4bb6b3eec769db667f230e7c770a628c1aa5681b"}, - {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:136f9db0f53c0206db38b8cd0c985c78ded5fd596c9a86ce5c0b92afb91c3a19"}, - {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:173866d9f7409c0fb514cf6e78952e65816600cb888c68b37b41147349fe0057"}, - {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:6e840553c9c494a35e449a987ca2c4f8372668ee954a03a9a9685075228e5036"}, - {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:458c0c65802d816a6b955cf3603186de79e8fdb46d4f19abaec4ef0a906f50a7"}, - {file = "yarl-1.15.2-cp39-cp39-win32.whl", hash = "sha256:5b48388ded01f6f2429a8c55012bdbd1c2a0c3735b3e73e221649e524c34a58d"}, - {file = "yarl-1.15.2-cp39-cp39-win_amd64.whl", hash = "sha256:81dadafb3aa124f86dc267a2168f71bbd2bfb163663661ab0038f6e4b8edb810"}, - {file = "yarl-1.15.2-py3-none-any.whl", hash = "sha256:0d3105efab7c5c091609abacad33afff33bdff0035bece164c98bcf5a85ef90a"}, - {file = "yarl-1.15.2.tar.gz", hash = "sha256:a39c36f4218a5bb668b4f06874d676d35a035ee668e6e7e3538835c703634b84"}, + {file = "yarl-1.15.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:14d6f07b7b4b3b8fba521904db58442281730b44318d6abb9908de79e2a4e4f4"}, + {file = "yarl-1.15.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eacd9de9b5b8262818a2e1f88efbd8d523abc8453de238c5d2f6a91fa85032dd"}, + {file = "yarl-1.15.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a63ed17af784da3de39b82adfd4f8404ad5ee2ec8f616b063f37da3e64e0521"}, + {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b55cc82ba92c07af6ba619dcf70cc89f7b9626adefb87d251f80f2e77419f1da"}, + {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63ba82841ce315e4b5dc8b9345062638c74b1864d38172d0a0403e5a083b0950"}, + {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59dce412b2515de05ab2eb6aef19ad7f70857ad436cd65fc4276df007106fb42"}, + {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e337737b8c9d837e5b4d9e906cc57ed7a639e16e515c8094509b17f556fdb642"}, + {file = "yarl-1.15.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2128315cdc517a45ceb72ec17b256a7940eeb4843c66834c203e7d6580c83405"}, + {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69c2d111e67a818e702ba957da8c8e62de916f5c1b3da043f744084c63f12d46"}, + {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d2a70e8bec768be7423d8d465858a3646b34257a20cc02fd92612f1b14931f50"}, + {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:efe758958a7bffce68d91ade238df72667e1f18966ed7b1d3d390eead51a8903"}, + {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b765f19e23c29b68e4f8bbadd36f1da2333ba983d8da2d6518e5f0a7eb2579c2"}, + {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:df494e5a79f2ef8f81f966f787e515760e639c6319a321c16198b379c256a157"}, + {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:68b27a7d9fb0f145de608da2e45e37fd2397b00266f10487e557f769afa2842d"}, + {file = "yarl-1.15.3-cp310-cp310-win32.whl", hash = "sha256:6d1aba1f644d6e5e16edada31938c11b6c9c97e3bf065742a2c7740d38af0c19"}, + {file = "yarl-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:925e72fc7a4222a5bf6d288876d5afacc8f833b49c4cca85f65089131ba25afa"}, + {file = "yarl-1.15.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dbd4808a209b175b5ebbac24c4798dd7511c5ee522a16f2f0eac78c717dfcdfc"}, + {file = "yarl-1.15.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:20f8bdaf667386cea1a8f49cb69a85f90346656d750d3c1278be1dbc76601065"}, + {file = "yarl-1.15.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:adeac55335669a189189373c93d131ebfc2de3ec04f0d3aa7dff6661f83b89b6"}, + {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:690d8f702945506b58c9c5834d586e8fd819b845fe6239ab16ebc64a92a6fd3d"}, + {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df7784a29b9689341c17d06d826e3b52ee59d6b6916177e4db0477be7aad5f72"}, + {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12c80ec2af97ff3e433699bcabc787ef34e7c08ec038a6e6a25fb81d7bb83607"}, + {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39533b927c665bcff7da80bf299218e4af12f3e2be27e9c456e29547bcefd631"}, + {file = "yarl-1.15.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db32a5c2912db45e73f80107d178e30f5c48cf596762b3c60ddfebdd655385f0"}, + {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bde319602111e9acca3c4f87f4205b38ba6166004bf108de47553633f9a580fc"}, + {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:493760c4ced954582db83c4760166992c016e1777ebc0f3ef1bb5eb60b2b5924"}, + {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d9cd73f7bff5079d87c2622aa418a75d5d3cdc944d3edb905c5dfc3235466eb0"}, + {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e924040582499f7514ec64691031504e6224b5ae7224216208fc2c94f8b13c89"}, + {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1c3e9ae98719fe180751b093d02dbcc33b78a37e861d0f2c9571720bd31555db"}, + {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f2911cae6dd012adaaf51494dad4cafb4284ad1f3b588df6ea3e3017e053750"}, + {file = "yarl-1.15.3-cp311-cp311-win32.whl", hash = "sha256:acdfe626607a245aedca35b211f9305a9e7a33349da525bf4ef3caaec8ef51cd"}, + {file = "yarl-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:0ace3927502a9f90a868d62c66623703cf5096dcb586187266e9b964d8dd6c81"}, + {file = "yarl-1.15.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:decf9d76191bfe34835f1abd3fa8ebe8a9cd7e16300a5c7e82b18c0812bb22a2"}, + {file = "yarl-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ce65ed7ad7b6cbca06b0c011b170bd2b0bc56b0a740540e2713e5ac12d7b9b2e"}, + {file = "yarl-1.15.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3cf2b50352df8775591869aaa22c52b64d60376ba99c0802b42778fedc90b775"}, + {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32e8ebf0080ddd38ec05f8be940a3719e5fe1ab8bb6d2b3f6f8b89c9e34149aa"}, + {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05183fd49244517cb11c208d0ae128f2e8a85ddb7caf22ad8b0ffcdf5481fcb6"}, + {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:46653b5fd29e63ffe63335da343829a2b00bb43b0bd9bb21240d3b42629629e2"}, + {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6316af233610b9868eda92cf68c016750cbf50085ac6c51faa17905ddd25605"}, + {file = "yarl-1.15.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5685ebc333c95b75be3a0a83a81b82b6411beee9585eaeb9e2e588ae8df23848"}, + {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6da6f6c6ee5595658f21bb9d1ecd702f7a7f22f224ac063dfb595624aec4a2e0"}, + {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:45c05b87a8494d9820ea1ac82118fd2f1d795d868e94766fe8ff670377bf6280"}, + {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:04f930fcc940f96b8b29110c56882bcff8703f87a7b9354d3acf60ffded5a23d"}, + {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8df77742b403e71c5d62d22d150e6e35efd6096a15f2c7419815911c62225100"}, + {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f785d83ece0998e4ce4fadda22fa6c1ecc40e10f41617013a8726d2e9af0d98f"}, + {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7794aade99be0d48b69bd5942acddfeff0de3d09c724d9abe4f19736708ef18f"}, + {file = "yarl-1.15.3-cp312-cp312-win32.whl", hash = "sha256:a3a98d70c667c957c7cd0b153d4cb5e45d43f5e2e23de73be6f7b5c883c01f72"}, + {file = "yarl-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:90257bc627897a2c1d562efcd6a6b18887e9dacae795cad2367e8e16df47d966"}, + {file = "yarl-1.15.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f94d8adfdec402ff97cecc243b310c01d571362ca87bcf8def8e15cb3aaac3ee"}, + {file = "yarl-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0328f798052a33803a77d0868c7f802e952127092c1738fc9e7bfcaac7207c5"}, + {file = "yarl-1.15.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f5f0a0691e39c2e7b5c0f23e6765fa6cb162dce99d9ab1897fdd0f7a4a38b6fb"}, + {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370f646d3654e196ddbf772a2d737fe4e1dd738267015b73ff6267ca592fd9d6"}, + {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3487c57bc8f17f2586ae7fd0e77f65cd298d45b64d15f604bbb29f4cce0e7961"}, + {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef67989d480358482830dc3bc232709804f46a61e7e9841d3f0b1c13a4735b3b"}, + {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5ab6c64921802176f56c36aa67c5e6a8baf9557ec1662cb41ecdb5580b67eb9"}, + {file = "yarl-1.15.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb474a06023d01ead9c072b2580c22b2691aa1cabdcc19c3171ab1fa6d8496e3"}, + {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92f9a45230d3aa8568c1d692ab27bf505a32dfe3b404721458fc374f411e8bd2"}, + {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:24cad94cf2f46cc8e4b9cd44e4e8a84483536a6c54554960b02b10b5724ab122"}, + {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:380f30073cbd9b740891bb56f44ee31f870e8721269b618ccc9913400936d9f6"}, + {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:353306ba6f0218af1aefe4b9c8b3a0b81b209bc75d79357dac6aca70a7b09d6a"}, + {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fe03cea925d884b8f1157a7037df2f5b6a6478a64b78ee600832d8a9f044c83e"}, + {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5c4cc1a438ac52562427330e33891f50a78ffd38d335abc64f93f201c83bdc82"}, + {file = "yarl-1.15.3-cp313-cp313-win32.whl", hash = "sha256:956975a3a1ce1f4537be22278d6a283b8bc74d77671f7f6469ab1e800f4e9b02"}, + {file = "yarl-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:2e61b72cf15922a7a665299a6b6825bd9901d67ec3b9d3cf9b256dc1667c9bb1"}, + {file = "yarl-1.15.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:270fef2b335e60c91ee835c524445e2248af841c8b72f48769ed6c02fbff5873"}, + {file = "yarl-1.15.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:59b77f0682e1917be197fc8229530f0c6fb3ef8e242d8256ba091a3a1c0ef7e6"}, + {file = "yarl-1.15.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cc4b999718287073dccd3acb0ef1593961bd7923af08991cb3c94080db503935"}, + {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9b251d3f90e125ff0d1f76257329a9190fa1bfd2157344c875580bff6dedc62"}, + {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ccb4667e0c0a25815efbfe251d24b56624449a319d4bb497074dd49444fb306"}, + {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac26e43b56dbafb30256906bc763cc1f22e05825ae1ced4c6afbd0e6584f18de"}, + {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2207491555af5dbbee4c3179a76766f7bc1ecff858f420ea96f2e105ca42c4dd"}, + {file = "yarl-1.15.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14effa29db6113be065a594e13a0f45afb9c1e374fd22b4bc3a4eff0725184b2"}, + {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:19077525cd36c797cae19262e15f2881da33c602fb35d075ff0e4263b51b8b88"}, + {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:d80c019083506886df098b7bb0d844e19db7e226736829ef49f892ed0a070fa5"}, + {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c24debeec87908a864a2b4cb700f863db9441cabacdb22dc448c5d38b55c6f62"}, + {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:1c49fe426c45520b4b8a48544d3a9a58194f39c1b57d92451883f847c299a137"}, + {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:66ddcd7ee3264bc937860f4780290d60f6472ca0484c214fe805116a831121e8"}, + {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2a5cbbb06559757f091f9e71d3f76c27d4dfe0652cc3f17ccce398b8377bfda4"}, + {file = "yarl-1.15.3-cp39-cp39-win32.whl", hash = "sha256:d798de0b50efb66583fc096bcdaa852ed6ea3485a4eb610d6a634f8010d932f4"}, + {file = "yarl-1.15.3-cp39-cp39-win_amd64.whl", hash = "sha256:8f0b33fd088e93ba5f7f6dd55226630e7b78212752479c8fcc6abbd143b9c1ce"}, + {file = "yarl-1.15.3-py3-none-any.whl", hash = "sha256:a1d49ed6f4b812dde88e937d4c2bd3f13d72c23ef7de1e17a63b7cacef4b5691"}, + {file = "yarl-1.15.3.tar.gz", hash = "sha256:fbcff47f8ba82467f203037f7a30decf5c724211b224682f7236edb0dcbb5b95"}, ] [package.dependencies] @@ -4016,4 +4005,4 @@ polymarket = ["py-clob-client"] [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.13" -content-hash = "42b23b2496fce2868e3dce2bb5d8a853b77b64662a1e4e45124493b674ffb18e" +content-hash = "9697b3111271da15a1ee1673c1dde78cb0a22288dc32cd83b676e456668ede39" diff --git a/pyproject.toml b/pyproject.toml index c6c3125af835..01936e75d50f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -89,7 +89,7 @@ optional = true [tool.poetry.group.dev.dependencies] black = "^24.10.0" docformatter = "^1.7.5" -mypy = "^1.11.2" +mypy = "^1.12.0" pandas-stubs = "^2.2.2" pre-commit = "^4.0.1" ruff = "^0.6.9" From 1d63ec4a66a85ea870fb3c6c8e26487bfed9d181 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 16 Oct 2024 18:28:12 +1100 Subject: [PATCH 145/224] Fix TradingNode signal logging --- nautilus_trader/live/node.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_trader/live/node.py b/nautilus_trader/live/node.py index 2d00c854eb0e..e9e5a8724212 100644 --- a/nautilus_trader/live/node.py +++ b/nautilus_trader/live/node.py @@ -465,5 +465,5 @@ def dispose(self) -> None: self.kernel.logger.info("DISPOSED") def _loop_sig_handler(self, sig: signal.Signals) -> None: - self.kernel.logger.warning(f"Received {sig!s}, shutting down") + self.kernel.logger.warning(f"Received {sig!r}, shutting down") self.stop() From f877e75224f3797b72fff86747c7187011d6cc39 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 16 Oct 2024 18:30:51 +1100 Subject: [PATCH 146/224] Fix Binance client venue assignment --- nautilus_trader/adapters/binance/data.py | 3 +-- nautilus_trader/adapters/binance/execution.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/nautilus_trader/adapters/binance/data.py b/nautilus_trader/adapters/binance/data.py index b9694deb622a..8b3c4a3b9ad7 100644 --- a/nautilus_trader/adapters/binance/data.py +++ b/nautilus_trader/adapters/binance/data.py @@ -71,7 +71,6 @@ from nautilus_trader.model.identifiers import InstrumentId from nautilus_trader.model.identifiers import Symbol from nautilus_trader.model.identifiers import TradeId -from nautilus_trader.model.identifiers import Venue from nautilus_trader.model.instruments import Instrument from nautilus_trader.model.objects import Quantity @@ -131,7 +130,7 @@ def __init__( super().__init__( loop=loop, client_id=ClientId(name or BINANCE_VENUE.value), - venue=Venue(name or BINANCE_VENUE.value), + venue=BINANCE_VENUE, msgbus=msgbus, cache=cache, clock=clock, diff --git a/nautilus_trader/adapters/binance/execution.py b/nautilus_trader/adapters/binance/execution.py index f496cb53e5db..255e3f6919c5 100644 --- a/nautilus_trader/adapters/binance/execution.py +++ b/nautilus_trader/adapters/binance/execution.py @@ -74,7 +74,6 @@ from nautilus_trader.model.identifiers import InstrumentId from nautilus_trader.model.identifiers import PositionId from nautilus_trader.model.identifiers import Symbol -from nautilus_trader.model.identifiers import Venue from nautilus_trader.model.identifiers import VenueOrderId from nautilus_trader.model.objects import Price from nautilus_trader.model.objects import Quantity @@ -148,7 +147,7 @@ def __init__( super().__init__( loop=loop, client_id=ClientId(name or BINANCE_VENUE.value), - venue=Venue(name or BINANCE_VENUE.value), + venue=BINANCE_VENUE, oms_type=OmsType.HEDGING if account_type.is_futures else OmsType.NETTING, instrument_provider=instrument_provider, account_type=AccountType.CASH if account_type.is_spot else AccountType.MARGIN, From 70b08e36e87892b7f8a5f7e6b7ffc7bdf6168ee4 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 16 Oct 2024 18:35:09 +1100 Subject: [PATCH 147/224] Add Binance Spot and Futures example --- RELEASES.md | 1 + .../binance_spot_and_futures_market_maker.py | 181 ++++++++++++++++++ .../strategies/volatility_market_maker.py | 41 ++-- 3 files changed, 206 insertions(+), 17 deletions(-) create mode 100644 examples/live/binance/binance_spot_and_futures_market_maker.py diff --git a/RELEASES.md b/RELEASES.md index b93827ebcb83..121c6b9dc353 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -37,6 +37,7 @@ Released on TBD (UTC). - Fixed Betfair tests related to symbology (#1988), thanks @limx0 - Fixed check for `OmsType` in `OrderMatchingEngine` position ID processing (#2003), thanks @filipmacek - Fixed `TardisCSVDataLoader` snapshot5 and snapshot25 parsing (#2005), thanks @Pushkarm029 +- Fixed Binance clients venue assignment, we should use the `client_id` params (which match the custom client `name`) to communicate with the clients, and use the same `'BINANCE'` venue identifiers --- diff --git a/examples/live/binance/binance_spot_and_futures_market_maker.py b/examples/live/binance/binance_spot_and_futures_market_maker.py new file mode 100644 index 000000000000..19fb1ccd1c29 --- /dev/null +++ b/examples/live/binance/binance_spot_and_futures_market_maker.py @@ -0,0 +1,181 @@ +#!/usr/bin/env python3 +# ------------------------------------------------------------------------------------------------- +# Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +# https://nautechsystems.io +# +# Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +# You may not use this file except in compliance with the License. +# You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ------------------------------------------------------------------------------------------------- + +from decimal import Decimal + +from nautilus_trader.adapters.binance.common.enums import BinanceAccountType +from nautilus_trader.adapters.binance.config import BinanceDataClientConfig +from nautilus_trader.adapters.binance.config import BinanceExecClientConfig +from nautilus_trader.adapters.binance.factories import BinanceLiveDataClientFactory +from nautilus_trader.adapters.binance.factories import BinanceLiveExecClientFactory +from nautilus_trader.cache.config import CacheConfig +from nautilus_trader.config import InstrumentProviderConfig +from nautilus_trader.config import LiveExecEngineConfig +from nautilus_trader.config import LoggingConfig +from nautilus_trader.config import TradingNodeConfig +from nautilus_trader.examples.strategies.volatility_market_maker import VolatilityMarketMaker +from nautilus_trader.examples.strategies.volatility_market_maker import VolatilityMarketMakerConfig +from nautilus_trader.live.node import TradingNode +from nautilus_trader.model.data import BarType +from nautilus_trader.model.identifiers import ClientId +from nautilus_trader.model.identifiers import InstrumentId +from nautilus_trader.model.identifiers import TraderId + + +# *** THIS IS A TEST STRATEGY WITH NO ALPHA ADVANTAGE WHATSOEVER. *** +# *** IT IS NOT INTENDED TO BE USED TO TRADE LIVE WITH REAL MONEY. *** + + +# Configure the trading node +config_node = TradingNodeConfig( + trader_id=TraderId("TESTER-001"), + logging=LoggingConfig( + log_level="DEBUG", + # log_level_file="DEBUG", + # log_file_format="json", + use_pyo3=True, + ), + # data_engine=LiveDataEngineConfig(debug=True), + exec_engine=LiveExecEngineConfig( + reconciliation=True, + # snapshot_orders=True, + # snapshot_positions=True, + # snapshot_positions_interval_secs=5.0, + ), + cache=CacheConfig( + # database=DatabaseConfig(), + timestamps_as_iso8601=True, + buffer_interval_ms=100, + flush_on_start=False, + ), + # message_bus=MessageBusConfig( + # database=DatabaseConfig(), + # encoding="json", + # timestamps_as_iso8601=True, + # buffer_interval_ms=100, + # streams_prefix="quoters", + # use_instance_id=False, + # types_filter=[QuoteTick], + # autotrim_mins=30, + # heartbeat_interval_secs=1, + # ), + # streaming=StreamingConfig(catalog_path="catalog"), + data_clients={ + "BINANCE_SPOT": BinanceDataClientConfig( + # venue=Venue("BINANCE-SPOT"), + api_key=None, # 'BINANCE_API_KEY' env var + api_secret=None, # 'BINANCE_API_SECRET' env var + account_type=BinanceAccountType.SPOT, + base_url_http=None, # Override with custom endpoint + base_url_ws=None, # Override with custom endpoint + us=False, # If client is for Binance US + testnet=False, # If client uses the testnet + instrument_provider=InstrumentProviderConfig(load_all=True), + ), + "BINANCE_FUTURES": BinanceDataClientConfig( + # venue=Venue("BINANCE-FUTURES"), + api_key=None, # 'BINANCE_API_KEY' env var + api_secret=None, # 'BINANCE_API_SECRET' env var + account_type=BinanceAccountType.USDT_FUTURE, + base_url_http=None, # Override with custom endpoint + base_url_ws=None, # Override with custom endpoint + us=False, # If client is for Binance US + testnet=True, # If client uses the testnet + instrument_provider=InstrumentProviderConfig(load_all=True), + ), + }, + exec_clients={ + "BINANCE_SPOT": BinanceExecClientConfig( + # venue=Venue("BINANCE-SPOT"), + api_key=None, # 'BINANCE_API_KEY' env var + api_secret=None, # 'BINANCE_API_SECRET' env var + account_type=BinanceAccountType.SPOT, + base_url_http=None, # Override with custom endpoint + base_url_ws=None, # Override with custom endpoint + us=False, # If client is for Binance US + testnet=False, # If client uses the testnet + instrument_provider=InstrumentProviderConfig(load_all=True), + max_retries=3, + retry_delay=1.0, + ), + "BINANCE_FUTURES": BinanceExecClientConfig( + # venue=Venue("BINANCE-FUTURES"), + api_key=None, # 'BINANCE_API_KEY' env var + api_secret=None, # 'BINANCE_API_SECRET' env var + account_type=BinanceAccountType.USDT_FUTURE, + base_url_http=None, # Override with custom endpoint + base_url_ws=None, # Override with custom endpoint + us=False, # If client is for Binance US + testnet=True, # If client uses the testnet + instrument_provider=InstrumentProviderConfig(load_all=True), + max_retries=3, + retry_delay=1.0, + ), + }, + timeout_connection=30.0, + timeout_reconciliation=10.0, + timeout_portfolio=10.0, + timeout_disconnection=10.0, + timeout_post_stop=5.0, +) + +# Instantiate the node with a configuration +node = TradingNode(config=config_node) + +# Configure your strategies +spot_symbol = "ETHUSDT" +strat_config_spot = VolatilityMarketMakerConfig( + instrument_id=InstrumentId.from_str(f"{spot_symbol}.BINANCE"), + external_order_claims=[InstrumentId.from_str(f"{spot_symbol}.BINANCE")], + bar_type=BarType.from_str(f"{spot_symbol}.BINANCE-1-MINUTE-LAST-INTERNAL"), + atr_period=20, + atr_multiple=6.0, + trade_size=Decimal("0.010"), + client_id=ClientId("BINANCE_SPOT"), +) + +futures_symbol = "ETHUSDT-PERP" +strat_config_futures = VolatilityMarketMakerConfig( + instrument_id=InstrumentId.from_str(f"{futures_symbol}.BINANCE"), + external_order_claims=[InstrumentId.from_str(f"{futures_symbol}.BINANCE")], + bar_type=BarType.from_str(f"{futures_symbol}.BINANCE-1-MINUTE-LAST-EXTERNAL"), + atr_period=20, + atr_multiple=6.0, + trade_size=Decimal("0.010"), + client_id=ClientId("BINANCE_FUTURES"), +) + +# Instantiate your strategy +strategy_spot = VolatilityMarketMaker(config=strat_config_spot) +strategy_futures = VolatilityMarketMaker(config=strat_config_futures) + +# Add your strategies and modules +node.trader.add_strategies([strategy_spot, strategy_futures]) + +# Register your client factories with the node (can take user-defined factories) +node.add_data_client_factory("BINANCE_SPOT", BinanceLiveDataClientFactory) +node.add_exec_client_factory("BINANCE_SPOT", BinanceLiveExecClientFactory) +node.add_data_client_factory("BINANCE_FUTURES", BinanceLiveDataClientFactory) +node.add_exec_client_factory("BINANCE_FUTURES", BinanceLiveExecClientFactory) +node.build() + + +# Stop and dispose of the node with SIGINT/CTRL+C +if __name__ == "__main__": + try: + node.run() + finally: + node.dispose() diff --git a/nautilus_trader/examples/strategies/volatility_market_maker.py b/nautilus_trader/examples/strategies/volatility_market_maker.py index 584783ca4373..630f10b9852b 100644 --- a/nautilus_trader/examples/strategies/volatility_market_maker.py +++ b/nautilus_trader/examples/strategies/volatility_market_maker.py @@ -34,6 +34,7 @@ from nautilus_trader.model.enums import TimeInForce from nautilus_trader.model.enums import TriggerType from nautilus_trader.model.events import OrderFilled +from nautilus_trader.model.identifiers import ClientId from nautilus_trader.model.identifiers import InstrumentId from nautilus_trader.model.instruments import Instrument from nautilus_trader.model.orders import LimitOrder @@ -66,6 +67,9 @@ class VolatilityMarketMakerConfig(StrategyConfig, frozen=True): emulation_trigger : str, default 'NO_TRIGGER' The emulation trigger for submitting emulated orders. If ``None`` then orders will not be emulated. + client_id : ClientId, optional + The custom client ID for data and execution. + For example if you have multiple clients for Binance you might use 'BINANCE-SPOT'. """ @@ -75,6 +79,7 @@ class VolatilityMarketMakerConfig(StrategyConfig, frozen=True): atr_multiple: PositiveFloat trade_size: Decimal emulation_trigger: str = "NO_TRIGGER" + client_id: ClientId | None = None class VolatilityMarketMaker(Strategy): @@ -102,6 +107,7 @@ def __init__(self, config: VolatilityMarketMakerConfig) -> None: self.emulation_trigger = TriggerType[config.emulation_trigger] self.instrument: Instrument | None = None # Initialized in on_start + self.client_id = config.client_id # Create the indicators for the strategy self.atr = AverageTrueRange(config.atr_period) @@ -124,17 +130,18 @@ def on_start(self) -> None: self.register_indicator_for_bars(self.bar_type, self.atr) # Get historical data - self.request_bars(self.bar_type) + self.request_bars(self.bar_type, client_id=self.client_id) # Subscribe to live data - self.subscribe_bars(self.bar_type) - self.subscribe_quote_ticks(self.instrument_id) - self.subscribe_trade_ticks(self.instrument_id) - # self.subscribe_order_book_deltas(self.instrument_id) # For debugging + self.subscribe_bars(self.bar_type, client_id=self.client_id) + self.subscribe_quote_ticks(self.instrument_id, client_id=self.client_id) + self.subscribe_trade_ticks(self.instrument_id, client_id=self.client_id) + # self.subscribe_order_book_deltas(self.instrument_id, client_id=self.client_id) # For debugging # self.subscribe_order_book_at_interval( # self.instrument_id, # depth=20, # interval_ms=1000, + # client_id=self.client_id, # ) # For debugging # self.subscribe_data( @@ -142,7 +149,7 @@ def on_start(self) -> None: # BinanceTicker, # metadata={"instrument_id": self.instrument.id}, # ), - # client_id=ClientId("BINANCE"), + # client_id=self.client_id, # ) # self.subscribe_data( @@ -305,7 +312,7 @@ def create_buy_order(self, last: QuoteTick) -> None: ) self.buy_order = order - self.submit_order(order) + self.submit_order(order, client_id=self.client_id) # order_list = self.order_factory.create_list([order]) # self.submit_order_list(order_list) @@ -331,9 +338,9 @@ def create_sell_order(self, last: QuoteTick) -> None: ) self.sell_order = order - self.submit_order(order) + self.submit_order(order, client_id=self.client_id) # order_list = self.order_factory.create_list([order]) - # self.submit_order_list(order_list) + # self.submit_order_list(order_list, client_id=self.client_id) def on_event(self, event: Event) -> None: """ @@ -364,19 +371,19 @@ def on_stop(self) -> None: """ Actions to be performed when the strategy is stopped. """ - self.cancel_all_orders(self.instrument_id) - self.close_all_positions(self.instrument_id) + self.cancel_all_orders(self.instrument_id, client_id=self.client_id) + self.close_all_positions(self.instrument_id, client_id=self.client_id) # open_orders = self.cache.orders_open(instrument_id=self.instrument_id) # if open_orders: - # self.cancel_orders(open_orders) + # self.cancel_orders(open_orders, client_id=self.client_id) # Unsubscribe from data - self.unsubscribe_bars(self.bar_type) - self.unsubscribe_quote_ticks(self.instrument_id) - self.unsubscribe_trade_ticks(self.instrument_id) - # self.unsubscribe_order_book_deltas(self.instrument_id) # For debugging - # self.unsubscribe_order_book_at_interval(self.instrument_id) # For debugging + self.unsubscribe_bars(self.bar_type, client_id=self.client_id) + self.unsubscribe_quote_ticks(self.instrument_id, client_id=self.client_id) + self.unsubscribe_trade_ticks(self.instrument_id, client_id=self.client_id) + # self.unsubscribe_order_book_deltas(self.instrument_id, client_id=self.client_id) # For debugging + # self.unsubscribe_order_book_at_interval(self.instrument_id, client_id=self.client_id) # For debugging def on_reset(self) -> None: """ From 1a67f611d7475f6058a47bff7f2041d9def540ea Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 16 Oct 2024 18:44:26 +1100 Subject: [PATCH 148/224] Cleanup example script --- .../live/binance/binance_spot_and_futures_market_maker.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/examples/live/binance/binance_spot_and_futures_market_maker.py b/examples/live/binance/binance_spot_and_futures_market_maker.py index 19fb1ccd1c29..6fc892b959e0 100644 --- a/examples/live/binance/binance_spot_and_futures_market_maker.py +++ b/examples/live/binance/binance_spot_and_futures_market_maker.py @@ -75,7 +75,6 @@ # streaming=StreamingConfig(catalog_path="catalog"), data_clients={ "BINANCE_SPOT": BinanceDataClientConfig( - # venue=Venue("BINANCE-SPOT"), api_key=None, # 'BINANCE_API_KEY' env var api_secret=None, # 'BINANCE_API_SECRET' env var account_type=BinanceAccountType.SPOT, @@ -86,7 +85,6 @@ instrument_provider=InstrumentProviderConfig(load_all=True), ), "BINANCE_FUTURES": BinanceDataClientConfig( - # venue=Venue("BINANCE-FUTURES"), api_key=None, # 'BINANCE_API_KEY' env var api_secret=None, # 'BINANCE_API_SECRET' env var account_type=BinanceAccountType.USDT_FUTURE, @@ -99,7 +97,6 @@ }, exec_clients={ "BINANCE_SPOT": BinanceExecClientConfig( - # venue=Venue("BINANCE-SPOT"), api_key=None, # 'BINANCE_API_KEY' env var api_secret=None, # 'BINANCE_API_SECRET' env var account_type=BinanceAccountType.SPOT, @@ -112,7 +109,6 @@ retry_delay=1.0, ), "BINANCE_FUTURES": BinanceExecClientConfig( - # venue=Venue("BINANCE-FUTURES"), api_key=None, # 'BINANCE_API_KEY' env var api_secret=None, # 'BINANCE_API_SECRET' env var account_type=BinanceAccountType.USDT_FUTURE, @@ -158,7 +154,7 @@ client_id=ClientId("BINANCE_FUTURES"), ) -# Instantiate your strategy +# Instantiate your strategies strategy_spot = VolatilityMarketMaker(config=strat_config_spot) strategy_futures = VolatilityMarketMaker(config=strat_config_futures) From bccea52b3c3a25c6a76c1a65e6d8f86c45db5ed3 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 16 Oct 2024 20:07:17 +1100 Subject: [PATCH 149/224] Implement PostgresCacheDatabase close method --- .../infrastructure/src/python/sql/cache.rs | 5 +++ nautilus_core/infrastructure/src/sql/cache.rs | 37 +++++++++++++++---- .../tests/test_cache_postgres.rs | 9 +++-- .../cache/postgres/transformers.py | 7 +++- nautilus_trader/core/nautilus_pyo3.pyi | 1 + 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/nautilus_core/infrastructure/src/python/sql/cache.rs b/nautilus_core/infrastructure/src/python/sql/cache.rs index fe7cf303eb34..b6c7ac37ccfa 100644 --- a/nautilus_core/infrastructure/src/python/sql/cache.rs +++ b/nautilus_core/infrastructure/src/python/sql/cache.rs @@ -52,6 +52,11 @@ impl PostgresCacheDatabase { result.map_err(to_pyruntime_err) } + #[pyo3(name = "close")] + fn py_close(&mut self) -> PyResult<()> { + self.close().map_err(to_pyruntime_err) + } + #[pyo3(name = "flush_db")] fn py_flush_db(slf: PyRef<'_, Self>) -> PyResult<()> { get_runtime() diff --git a/nautilus_core/infrastructure/src/sql/cache.rs b/nautilus_core/infrastructure/src/sql/cache.rs index af02005ae58d..f1050978ab88 100644 --- a/nautilus_core/infrastructure/src/sql/cache.rs +++ b/nautilus_core/infrastructure/src/sql/cache.rs @@ -19,7 +19,9 @@ use std::{ }; use bytes::Bytes; -use nautilus_common::{cache::database::CacheDatabaseAdapter, custom::CustomData, signal::Signal}; +use nautilus_common::{ + cache::database::CacheDatabaseAdapter, custom::CustomData, runtime::get_runtime, signal::Signal, +}; use nautilus_core::nanos::UnixNanos; use nautilus_model::{ accounts::any::AccountAny, @@ -50,7 +52,7 @@ use crate::sql::{ queries::DatabaseQueries, }; -#[derive(Debug, Clone)] +#[derive(Debug)] #[cfg_attr( feature = "python", pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.infrastructure") @@ -58,11 +60,13 @@ use crate::sql::{ pub struct PostgresCacheDatabase { pub pool: PgPool, tx: UnboundedSender, + handle: tokio::task::JoinHandle<()>, } #[allow(clippy::large_enum_variant)] #[derive(Debug, Clone)] pub enum DatabaseQuery { + Close, Add(String, Vec), AddCurrency(Currency), AddInstrument(InstrumentAny), @@ -83,6 +87,7 @@ fn get_buffer_interval() -> Duration { async fn drain_buffer(pool: &PgPool, buffer: &mut VecDeque) { for cmd in buffer.drain(..) { match cmd { + DatabaseQuery::Close => {} DatabaseQuery::Add(key, value) => { DatabaseQueries::add(pool, key, value).await.unwrap(); } @@ -259,11 +264,12 @@ impl PostgresCacheDatabase { get_postgres_connect_options(host, port, username, password, database).unwrap(); let pool = connect_pg(pg_connect_options.clone().into()).await.unwrap(); let (tx, rx) = unbounded_channel::(); - // spawn a thread to handle messages - let _join_handle = tokio::spawn(async move { + + // Spawn a task to handle messages + let handle = tokio::spawn(async move { PostgresCacheDatabase::handle_message(rx, pg_connect_options.clone().into()).await; }); - Ok(PostgresCacheDatabase { pool, tx }) + Ok(PostgresCacheDatabase { pool, tx, handle }) } async fn handle_message( @@ -285,12 +291,16 @@ impl PostgresCacheDatabase { } else { // Continue to receive and handle messages until channel is hung up match rx.try_recv() { - Ok(msg) => buffer.push_back(msg), + Ok(msg) => match msg { + DatabaseQuery::Close => break, + _ => buffer.push_back(msg), + }, Err(TryRecvError::Empty) => sleep(recv_interval).await, Err(TryRecvError::Disconnected) => break, } } } + // Drain any remaining message if !buffer.is_empty() { drain_buffer(&pool, &mut buffer).await; @@ -337,6 +347,19 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { log::error!("Failed to send close result: {e:?}"); } }); + + // Cancel message handling task + self.tx.send(DatabaseQuery::Close); + + log::debug!("Awaiting task 'cache-write'"); // Naming tasks will soon be stablized + tokio::task::block_in_place(|| { + if let Err(e) = get_runtime().block_on(&mut self.handle) { + log::error!("Error awaiting task 'cache-write': {e:?}"); + } + }); + + log::debug!("Closed"); + Ok(rx.recv()?) } @@ -876,7 +899,7 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { fn update_order(&mut self, event: &OrderEventAny) -> anyhow::Result<()> { let query = DatabaseQuery::UpdateOrder(event.clone()); self.tx.send(query).map_err(|e| { - anyhow::anyhow!("Failed to send query add_order to database message handler: {e}") + anyhow::anyhow!("Failed to send query update_order to database message handler: {e}") }) } diff --git a/nautilus_core/infrastructure/tests/test_cache_postgres.rs b/nautilus_core/infrastructure/tests/test_cache_postgres.rs index 796573d6f2f9..8dc389e3419f 100644 --- a/nautilus_core/infrastructure/tests/test_cache_postgres.rs +++ b/nautilus_core/infrastructure/tests/test_cache_postgres.rs @@ -45,7 +45,7 @@ mod serial_tests { #[tokio::test(flavor = "multi_thread")] async fn test_cache_instruments() { let mut database = get_pg_cache_database().await.unwrap(); - let mut cache = get_cache(Some(Box::new(database.clone()))); + let mut cache = get_cache(Some(Box::new(get_pg_cache_database().await.unwrap()))); let eth = Currency::new("ETH", 2, 0, "ETH", CurrencyType::Crypto); let usdt = Currency::new("USDT", 2, 0, "USDT", CurrencyType::Crypto); let crypto_perpetual = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt()); @@ -70,12 +70,13 @@ mod serial_tests { assert_eq!(cached_instrument_ids, vec![&crypto_perpetual.id()]); let target_instrument = cache.instrument(&crypto_perpetual.id()); assert_eq!(target_instrument.unwrap(), &crypto_perpetual); + database.close().unwrap(); } #[tokio::test(flavor = "multi_thread")] async fn test_cache_orders() { let mut database = get_pg_cache_database().await.unwrap(); - let mut cache = get_cache(Some(Box::new(database.clone()))); + let mut cache = get_cache(Some(Box::new(get_pg_cache_database().await.unwrap()))); let instrument = currency_pair_ethusdt(); let market_order = OrderTestBuilder::new(OrderType::Market) .instrument_id(instrument.id()) @@ -110,12 +111,13 @@ mod serial_tests { assert_eq!(cached_order_ids.len(), 1); let target_order = cache.order(&market_order.client_order_id()); assert_eq!(target_order.unwrap(), &market_order); + database.close().unwrap(); } #[tokio::test(flavor = "multi_thread")] async fn test_cache_accounts() { let mut database = get_pg_cache_database().await.unwrap(); - let mut cache = get_cache(Some(Box::new(database.clone()))); + let mut cache = get_cache(Some(Box::new(get_pg_cache_database().await.unwrap()))); let account = AccountAny::default(); let last_event = account.last_event().unwrap(); if last_event.base_currency.is_some() { @@ -140,5 +142,6 @@ mod serial_tests { assert_eq!(cached_accounts.len(), 1); let target_account_for_venue = cache.account_for_venue(&account.id().get_issuer()); assert_eq!(*target_account_for_venue.unwrap(), account); + database.close().unwrap(); } } diff --git a/nautilus_trader/cache/postgres/transformers.py b/nautilus_trader/cache/postgres/transformers.py index 2395fe83158e..14649cae0954 100644 --- a/nautilus_trader/cache/postgres/transformers.py +++ b/nautilus_trader/cache/postgres/transformers.py @@ -42,6 +42,7 @@ from nautilus_trader.model.events import OrderTriggered from nautilus_trader.model.events import OrderUpdated from nautilus_trader.model.events.account import AccountState +from nautilus_trader.model.instruments import BinaryOption from nautilus_trader.model.instruments import CryptoFuture from nautilus_trader.model.instruments import CryptoPerpetual from nautilus_trader.model.instruments import CurrencyPair @@ -100,10 +101,12 @@ def transform_instrument_to_pyo3(instrument: Instrument): raise ValueError(f"Unknown instrument type: {instrument}") -def transform_instrument_from_pyo3(instrument_pyo3) -> Instrument | None: +def transform_instrument_from_pyo3(instrument_pyo3) -> Instrument | None: # noqa: C901 if instrument_pyo3 is None: return None - if isinstance(instrument_pyo3, nautilus_pyo3.CryptoFuture): + if isinstance(instrument_pyo3, nautilus_pyo3.BinaryOption): + return BinaryOption.from_pyo3(instrument_pyo3) + elif isinstance(instrument_pyo3, nautilus_pyo3.CryptoFuture): return CryptoFuture.from_pyo3(instrument_pyo3) elif isinstance(instrument_pyo3, nautilus_pyo3.CryptoPerpetual): return CryptoPerpetual.from_pyo3(instrument_pyo3) diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index 4aaa44b5a06f..084c73c804de 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -2599,6 +2599,7 @@ class PostgresCacheDatabase: password: str | None = None, database: str | None = None, ) -> PostgresCacheDatabase: ... + def close(self) -> None: ... def flush_db(self) -> None: ... def load(self) -> dict[str, str]: ... def load_currency(self, code: str) -> Currency | None: ... From 992720ea3b5f7b60fce27fb8c8a629d11eb244f7 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 16 Oct 2024 21:58:52 +1100 Subject: [PATCH 150/224] Add BettingInstrument in Rust Initial struct and InstrumentAny implementation. --- nautilus_core/infrastructure/src/sql/cache.rs | 5 + nautilus_core/model/src/instruments/any.rs | 30 +- .../model/src/instruments/betting.rs | 405 ++++++++++++++++++ nautilus_core/model/src/instruments/mod.rs | 1 + 4 files changed, 437 insertions(+), 4 deletions(-) create mode 100644 nautilus_core/model/src/instruments/betting.rs diff --git a/nautilus_core/infrastructure/src/sql/cache.rs b/nautilus_core/infrastructure/src/sql/cache.rs index f1050978ab88..5c8c24507054 100644 --- a/nautilus_core/infrastructure/src/sql/cache.rs +++ b/nautilus_core/infrastructure/src/sql/cache.rs @@ -95,6 +95,11 @@ async fn drain_buffer(pool: &PgPool, buffer: &mut VecDeque) { DatabaseQueries::add_currency(pool, currency).await.unwrap(); } DatabaseQuery::AddInstrument(instrument_any) => match instrument_any { + InstrumentAny::Betting(instrument) => { + DatabaseQueries::add_instrument(pool, "BETTING", Box::new(instrument)) + .await + .unwrap() + } InstrumentAny::BinaryOption(instrument) => { DatabaseQueries::add_instrument(pool, "BINARY_OPTION", Box::new(instrument)) .await diff --git a/nautilus_core/model/src/instruments/any.rs b/nautilus_core/model/src/instruments/any.rs index 59d4118324a6..0331a2ae6812 100644 --- a/nautilus_core/model/src/instruments/any.rs +++ b/nautilus_core/model/src/instruments/any.rs @@ -17,10 +17,10 @@ use nautilus_core::nanos::UnixNanos; use rust_decimal::Decimal; use super::{ - binary_option::BinaryOption, crypto_future::CryptoFuture, crypto_perpetual::CryptoPerpetual, - currency_pair::CurrencyPair, equity::Equity, futures_contract::FuturesContract, - futures_spread::FuturesSpread, options_contract::OptionsContract, - options_spread::OptionsSpread, Instrument, + betting::BettingInstrument, binary_option::BinaryOption, crypto_future::CryptoFuture, + crypto_perpetual::CryptoPerpetual, currency_pair::CurrencyPair, equity::Equity, + futures_contract::FuturesContract, futures_spread::FuturesSpread, + options_contract::OptionsContract, options_spread::OptionsSpread, Instrument, }; use crate::{ enums::InstrumentClass, @@ -30,6 +30,7 @@ use crate::{ #[derive(Clone, Debug)] pub enum InstrumentAny { + Betting(BettingInstrument), BinaryOption(BinaryOption), CryptoFuture(CryptoFuture), CryptoPerpetual(CryptoPerpetual), @@ -46,6 +47,7 @@ impl InstrumentAny { #[must_use] pub fn into_instrument(self) -> Box { match self { + Self::Betting(inst) => Box::new(inst), Self::BinaryOption(inst) => Box::new(inst), Self::CryptoFuture(inst) => Box::new(inst), Self::CryptoPerpetual(inst) => Box::new(inst), @@ -61,6 +63,7 @@ impl InstrumentAny { #[must_use] pub fn id(&self) -> InstrumentId { match self { + Self::Betting(inst) => inst.id, Self::BinaryOption(inst) => inst.id, Self::CryptoFuture(inst) => inst.id, Self::CryptoPerpetual(inst) => inst.id, @@ -76,6 +79,7 @@ impl InstrumentAny { #[must_use] pub fn base_currency(&self) -> Option { match self { + Self::Betting(inst) => inst.base_currency(), Self::BinaryOption(inst) => inst.base_currency(), Self::CryptoFuture(inst) => inst.base_currency(), Self::CryptoPerpetual(inst) => inst.base_currency(), @@ -91,6 +95,7 @@ impl InstrumentAny { #[must_use] pub fn quote_currency(&self) -> Currency { match self { + Self::Betting(inst) => inst.quote_currency(), Self::BinaryOption(inst) => inst.quote_currency(), Self::CryptoFuture(inst) => inst.quote_currency(), Self::CryptoPerpetual(inst) => inst.quote_currency(), @@ -106,6 +111,7 @@ impl InstrumentAny { #[must_use] pub fn settlement_currency(&self) -> Currency { match self { + Self::Betting(inst) => inst.settlement_currency(), Self::BinaryOption(inst) => inst.settlement_currency(), Self::CryptoFuture(inst) => inst.settlement_currency(), Self::CryptoPerpetual(inst) => inst.settlement_currency(), @@ -121,6 +127,7 @@ impl InstrumentAny { #[must_use] pub fn is_inverse(&self) -> bool { match self { + Self::Betting(inst) => inst.is_inverse(), Self::BinaryOption(inst) => inst.is_inverse(), Self::CryptoFuture(inst) => inst.is_inverse(), Self::CryptoPerpetual(inst) => inst.is_inverse(), @@ -136,6 +143,7 @@ impl InstrumentAny { #[must_use] pub fn price_precision(&self) -> u8 { match self { + Self::Betting(inst) => inst.price_precision(), Self::BinaryOption(inst) => inst.price_precision(), Self::CryptoFuture(inst) => inst.price_precision(), Self::CryptoPerpetual(inst) => inst.price_precision(), @@ -151,6 +159,7 @@ impl InstrumentAny { #[must_use] pub fn size_precision(&self) -> u8 { match self { + Self::Betting(inst) => inst.size_precision(), Self::BinaryOption(inst) => inst.size_precision(), Self::CryptoFuture(inst) => inst.size_precision(), Self::CryptoPerpetual(inst) => inst.size_precision(), @@ -166,6 +175,7 @@ impl InstrumentAny { #[must_use] pub fn price_increment(&self) -> Price { match self { + Self::Betting(inst) => inst.price_increment(), Self::BinaryOption(inst) => inst.price_increment(), Self::CryptoFuture(inst) => inst.price_increment(), Self::CryptoPerpetual(inst) => inst.price_increment(), @@ -181,6 +191,7 @@ impl InstrumentAny { #[must_use] pub fn size_increment(&self) -> Quantity { match self { + Self::Betting(inst) => inst.size_increment(), Self::BinaryOption(inst) => inst.size_increment(), Self::CryptoFuture(inst) => inst.size_increment(), Self::CryptoPerpetual(inst) => inst.size_increment(), @@ -196,6 +207,7 @@ impl InstrumentAny { #[must_use] pub fn multiplier(&self) -> Quantity { match self { + Self::Betting(inst) => inst.multiplier(), Self::BinaryOption(inst) => inst.multiplier(), Self::CryptoFuture(inst) => inst.multiplier(), Self::CryptoPerpetual(inst) => inst.multiplier(), @@ -211,6 +223,7 @@ impl InstrumentAny { #[must_use] pub fn instrument_class(&self) -> InstrumentClass { match self { + Self::Betting(inst) => inst.instrument_class(), Self::BinaryOption(inst) => inst.instrument_class(), Self::CryptoFuture(inst) => inst.instrument_class(), Self::CryptoPerpetual(inst) => inst.instrument_class(), @@ -226,6 +239,7 @@ impl InstrumentAny { #[must_use] pub fn activation_ns(&self) -> Option { match self { + Self::Betting(inst) => inst.activation_ns(), Self::BinaryOption(inst) => inst.activation_ns(), Self::CryptoFuture(inst) => inst.activation_ns(), Self::CryptoPerpetual(inst) => inst.activation_ns(), @@ -241,6 +255,7 @@ impl InstrumentAny { #[must_use] pub fn expiration_ns(&self) -> Option { match self { + Self::Betting(inst) => inst.expiration_ns(), Self::BinaryOption(inst) => inst.expiration_ns(), Self::CryptoFuture(inst) => inst.expiration_ns(), Self::CryptoPerpetual(inst) => inst.expiration_ns(), @@ -255,6 +270,7 @@ impl InstrumentAny { pub fn make_price(&self, value: f64) -> Price { match self { + Self::Betting(inst) => inst.make_price(value), Self::BinaryOption(inst) => inst.make_price(value), Self::CryptoFuture(inst) => inst.make_price(value), Self::CryptoPerpetual(inst) => inst.make_price(value), @@ -269,6 +285,7 @@ impl InstrumentAny { pub fn make_qty(&self, value: f64) -> Quantity { match self { + Self::Betting(inst) => inst.make_qty(value), Self::BinaryOption(inst) => inst.make_qty(value), Self::CryptoFuture(inst) => inst.make_qty(value), Self::CryptoPerpetual(inst) => inst.make_qty(value), @@ -289,6 +306,9 @@ impl InstrumentAny { use_quote_for_inverse: Option, ) -> Money { match self { + Self::Betting(inst) => { + inst.calculate_notional_value(quantity, price, use_quote_for_inverse) + } Self::BinaryOption(inst) => { inst.calculate_notional_value(quantity, price, use_quote_for_inverse) } @@ -323,6 +343,7 @@ impl InstrumentAny { #[must_use] pub fn maker_fee(&self) -> Decimal { match self { + Self::Betting(inst) => inst.maker_fee(), Self::BinaryOption(inst) => inst.maker_fee(), Self::CryptoFuture(inst) => inst.maker_fee(), Self::CryptoPerpetual(inst) => inst.maker_fee(), @@ -339,6 +360,7 @@ impl InstrumentAny { #[must_use] pub fn taker_fee(&self) -> Decimal { match self { + Self::Betting(inst) => inst.taker_fee(), Self::BinaryOption(inst) => inst.taker_fee(), Self::CryptoFuture(inst) => inst.taker_fee(), Self::CryptoPerpetual(inst) => inst.taker_fee(), diff --git a/nautilus_core/model/src/instruments/betting.rs b/nautilus_core/model/src/instruments/betting.rs new file mode 100644 index 000000000000..d804142b991b --- /dev/null +++ b/nautilus_core/model/src/instruments/betting.rs @@ -0,0 +1,405 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use std::hash::{Hash, Hasher}; + +use nautilus_core::{ + correctness::{check_equal_u8, check_positive_i64, check_positive_u64, FAILED}, + nanos::UnixNanos, +}; +use rust_decimal::Decimal; +use serde::{Deserialize, Serialize}; +use ustr::Ustr; + +use super::{any::InstrumentAny, Instrument}; +use crate::{ + enums::{AssetClass, InstrumentClass, OptionKind}, + identifiers::{InstrumentId, Symbol}, + types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, +}; + +/// Represents a generic sports betting instrument. +#[repr(C)] +#[derive(Clone, Debug, Serialize, Deserialize)] +#[cfg_attr( + feature = "python", + pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.model") +)] +#[cfg_attr(feature = "trivial_copy", derive(Copy))] +pub struct BettingInstrument { + pub id: InstrumentId, + pub raw_symbol: Symbol, + pub event_type_id: u64, + pub event_type_name: Ustr, + pub competition_id: Ustr, + pub competition_name: Ustr, + pub event_id: u64, + pub event_name: Ustr, + pub event_country_code: Ustr, + pub event_open_date: UnixNanos, + pub betting_type: Ustr, + pub market_id: Ustr, + pub market_name: Ustr, + pub market_start_time: UnixNanos, + pub market_type: Ustr, + pub selection_id: u64, + pub selection_name: Ustr, + pub selection_handicap: f64, + pub currency: Currency, + pub price_precision: u8, + pub size_precision: u8, + pub price_increment: Price, + pub size_increment: Quantity, + pub maker_fee: Decimal, + pub taker_fee: Decimal, + pub margin_init: Decimal, + pub margin_maint: Decimal, + pub max_quantity: Option, + pub min_quantity: Option, + pub max_notional: Option, + pub min_notional: Option, + pub max_price: Option, + pub min_price: Option, + pub ts_event: UnixNanos, + pub ts_init: UnixNanos, +} + +impl BettingInstrument { + /// Creates a new [`BettingInstrument`] instance with correctness checking. + /// + /// # Notes + /// + /// PyO3 requires a `Result` type for proper error handling and stacktrace printing in Python. + #[allow(clippy::too_many_arguments)] + pub fn new_checked( + id: InstrumentId, + raw_symbol: Symbol, + event_type_id: u64, + event_type_name: Ustr, + competition_id: Ustr, + competition_name: Ustr, + event_id: u64, + event_name: Ustr, + event_country_code: Ustr, + event_open_date: UnixNanos, + betting_type: Ustr, + market_id: Ustr, + market_name: Ustr, + market_start_time: UnixNanos, + market_type: Ustr, + selection_id: u64, + selection_name: Ustr, + selection_handicap: f64, + currency: Currency, + price_precision: u8, + size_precision: u8, + price_increment: Price, + size_increment: Quantity, + maker_fee: Decimal, + taker_fee: Decimal, + margin_init: Decimal, + margin_maint: Decimal, + max_quantity: Option, + min_quantity: Option, + max_notional: Option, + min_notional: Option, + max_price: Option, + min_price: Option, + ts_event: UnixNanos, + ts_init: UnixNanos, + ) -> anyhow::Result { + check_equal_u8( + price_precision, + price_increment.precision, + stringify!(price_precision), + stringify!(price_increment.precision), + )?; + check_equal_u8( + size_precision, + size_increment.precision, + stringify!(size_precision), + stringify!(size_increment.precision), + )?; + check_positive_i64(price_increment.raw, stringify!(price_increment.raw))?; + check_positive_u64(size_increment.raw, stringify!(size_increment.raw))?; + + Ok(Self { + id, + raw_symbol, + event_type_id, + event_type_name, + competition_id, + competition_name, + event_id, + event_name, + event_country_code, + event_open_date, + betting_type, + market_id, + market_name, + market_start_time, + market_type, + selection_id, + selection_name, + selection_handicap, + currency, + price_precision, + size_precision, + price_increment, + size_increment, + maker_fee, + taker_fee, + margin_init, + margin_maint, + max_quantity, + min_quantity, + max_notional, + min_notional, + max_price, + min_price, + ts_event, + ts_init, + }) + } + + #[allow(clippy::too_many_arguments)] + pub fn new( + id: InstrumentId, + raw_symbol: Symbol, + event_type_id: u64, + event_type_name: Ustr, + competition_id: Ustr, + competition_name: Ustr, + event_id: u64, + event_name: Ustr, + event_country_code: Ustr, + event_open_date: UnixNanos, + betting_type: Ustr, + market_id: Ustr, + market_name: Ustr, + market_start_time: UnixNanos, + market_type: Ustr, + selection_id: u64, + selection_name: Ustr, + selection_handicap: f64, + currency: Currency, + price_precision: u8, + size_precision: u8, + price_increment: Price, + size_increment: Quantity, + maker_fee: Decimal, + taker_fee: Decimal, + margin_init: Decimal, + margin_maint: Decimal, + max_quantity: Option, + min_quantity: Option, + max_notional: Option, + min_notional: Option, + max_price: Option, + min_price: Option, + ts_event: UnixNanos, + ts_init: UnixNanos, + ) -> Self { + Self::new_checked( + id, + raw_symbol, + event_type_id, + event_type_name, + competition_id, + competition_name, + event_id, + event_name, + event_country_code, + event_open_date, + betting_type, + market_id, + market_name, + market_start_time, + market_type, + selection_id, + selection_name, + selection_handicap, + currency, + price_precision, + size_precision, + price_increment, + size_increment, + maker_fee, + taker_fee, + margin_init, + margin_maint, + max_quantity, + min_quantity, + max_notional, + min_notional, + max_price, + min_price, + ts_event, + ts_init, + ) + .expect(FAILED) + } +} + +impl PartialEq for BettingInstrument { + fn eq(&self, other: &Self) -> bool { + self.id == other.id + } +} + +impl Eq for BettingInstrument {} + +impl Hash for BettingInstrument { + fn hash(&self, state: &mut H) { + self.id.hash(state); + } +} + +impl Instrument for BettingInstrument { + fn into_any(self) -> InstrumentAny { + InstrumentAny::Betting(self) + } + + fn id(&self) -> InstrumentId { + self.id + } + + fn raw_symbol(&self) -> Symbol { + self.raw_symbol + } + + fn asset_class(&self) -> AssetClass { + AssetClass::Alternative + } + + fn instrument_class(&self) -> InstrumentClass { + InstrumentClass::SportsBetting + } + + fn underlying(&self) -> Option { + None + } + + fn quote_currency(&self) -> Currency { + self.currency + } + + fn base_currency(&self) -> Option { + None + } + + fn settlement_currency(&self) -> Currency { + self.currency + } + + fn isin(&self) -> Option { + None + } + + fn exchange(&self) -> Option { + None + } + + fn option_kind(&self) -> Option { + None + } + + fn is_inverse(&self) -> bool { + false + } + + fn price_precision(&self) -> u8 { + self.price_precision + } + + fn size_precision(&self) -> u8 { + self.size_precision + } + + fn price_increment(&self) -> Price { + self.price_increment + } + + fn size_increment(&self) -> Quantity { + self.size_increment + } + + fn multiplier(&self) -> Quantity { + Quantity::from(1) + } + + fn lot_size(&self) -> Option { + Some(Quantity::from(1)) + } + + fn max_quantity(&self) -> Option { + self.max_quantity + } + + fn min_quantity(&self) -> Option { + self.min_quantity + } + + fn max_price(&self) -> Option { + self.max_price + } + + fn min_price(&self) -> Option { + self.min_price + } + + fn ts_event(&self) -> UnixNanos { + self.ts_event + } + + fn ts_init(&self) -> UnixNanos { + self.ts_init + } + + fn strike_price(&self) -> Option { + None + } + + fn activation_ns(&self) -> Option { + Some(self.market_start_time) + } + + fn expiration_ns(&self) -> Option { + None + } + + fn max_notional(&self) -> Option { + self.max_notional + } + + fn min_notional(&self) -> Option { + self.min_notional + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Tests +//////////////////////////////////////////////////////////////////////////////// +#[cfg(test)] +mod tests { + // TODO: WIP + // use crate::instruments::{betting::BettingInstrument, stubs::*}; + // + // #[rstest] + // fn test_betting_instrument(betting: BettingInstrument) { + // let betting = betting.clone(); + // assert_eq!(betting, cloned); + // } +} diff --git a/nautilus_core/model/src/instruments/mod.rs b/nautilus_core/model/src/instruments/mod.rs index d2c2958222b2..c6e4c0d0527b 100644 --- a/nautilus_core/model/src/instruments/mod.rs +++ b/nautilus_core/model/src/instruments/mod.rs @@ -16,6 +16,7 @@ //! Instrument definitions for the trading domain model. pub mod any; +pub mod betting; pub mod binary_option; pub mod crypto_future; pub mod crypto_perpetual; From 7d100bb1f2d9872807b4ada8993bc4f430d74545 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Wed, 16 Oct 2024 22:04:05 +1100 Subject: [PATCH 151/224] Fix clippy lints --- nautilus_core/backtest/src/exchange.rs | 2 +- nautilus_core/common/src/custom.rs | 7 ++++++- nautilus_core/common/src/signal.rs | 2 +- .../infrastructure/tests/test_cache_database_postgres.rs | 6 +++--- nautilus_core/model/tests/test_order_book.rs | 2 +- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/nautilus_core/backtest/src/exchange.rs b/nautilus_core/backtest/src/exchange.rs index 563beb0963e6..a61f04912fcc 100644 --- a/nautilus_core/backtest/src/exchange.rs +++ b/nautilus_core/backtest/src/exchange.rs @@ -483,7 +483,7 @@ impl SimulatedExchange { } if let Some(matching_engine) = self.matching_engines.get_mut(&status.instrument_id) { - matching_engine.process_status(status.action) + matching_engine.process_status(status.action); } else { panic!("Matching engine should be initialized"); } diff --git a/nautilus_core/common/src/custom.rs b/nautilus_core/common/src/custom.rs index 073e75cd1761..d50664f475c6 100644 --- a/nautilus_core/common/src/custom.rs +++ b/nautilus_core/common/src/custom.rs @@ -36,7 +36,12 @@ pub struct CustomData { impl CustomData { /// Creates a new [`CustomData`] instance. - pub fn new(data_type: DataType, value: Bytes, ts_event: UnixNanos, ts_init: UnixNanos) -> Self { + pub const fn new( + data_type: DataType, + value: Bytes, + ts_event: UnixNanos, + ts_init: UnixNanos, + ) -> Self { Self { data_type, value, diff --git a/nautilus_core/common/src/signal.rs b/nautilus_core/common/src/signal.rs index a5146420a116..72b8e32ef7f3 100644 --- a/nautilus_core/common/src/signal.rs +++ b/nautilus_core/common/src/signal.rs @@ -38,7 +38,7 @@ pub struct Signal { impl Signal { /// Creates a new [`Signal`] instance. #[must_use] - pub fn new(name: Ustr, value: String, ts_event: UnixNanos, ts_init: UnixNanos) -> Self { + pub const fn new(name: Ustr, value: String, ts_event: UnixNanos, ts_init: UnixNanos) -> Self { Self { name, value, diff --git a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs index 6a22a226dd8e..fd471f9fe5fb 100644 --- a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs +++ b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs @@ -319,12 +319,12 @@ mod serial_tests { pg_cache.add_order(&market_order, None).unwrap(); let submitted = TestOrderEventStubs::order_submitted(&market_order, account); market_order.apply(submitted).unwrap(); - pg_cache.update_order(&market_order.last_event()).unwrap(); + pg_cache.update_order(market_order.last_event()).unwrap(); let accepted = TestOrderEventStubs::order_accepted(&market_order, account, VenueOrderId::new("001")); market_order.apply(accepted).unwrap(); - pg_cache.update_order(&market_order.last_event()).unwrap(); + pg_cache.update_order(market_order.last_event()).unwrap(); let filled = TestOrderEventStubs::order_filled( &market_order, @@ -339,7 +339,7 @@ mod serial_tests { Some(AccountId::new("SIM-001")), ); market_order.apply(filled).unwrap(); - pg_cache.update_order(&market_order.last_event()).unwrap(); + pg_cache.update_order(market_order.last_event()).unwrap(); wait_until( || { let result = pg_cache diff --git a/nautilus_core/model/tests/test_order_book.rs b/nautilus_core/model/tests/test_order_book.rs index 61227954ea06..d77eed304d63 100644 --- a/nautilus_core/model/tests/test_order_book.rs +++ b/nautilus_core/model/tests/test_order_book.rs @@ -29,7 +29,7 @@ use rstest::*; pub fn test_order_book_databento_mbo_nasdaq() { let checksums = get_test_data_large_checksums_filepath(); let filename = "databento_mbo_xnas_itch.csv"; - let file_path = get_test_data_file_path(format!("large/{}", filename).as_str()); + let file_path = get_test_data_file_path(format!("large/{filename}").as_str()); let url = "https://hist.databento.com/v0/dataset/sample/download/xnas.itch/mbo"; ensure_file_exists_or_download_http(Path::new(file_path.as_str()), url, Some(&checksums)) .unwrap(); From f2392e43a1f74916c466505b726ce8d6baa0df74 Mon Sep 17 00:00:00 2001 From: Filip Macek Date: Wed, 16 Oct 2024 22:17:07 +0200 Subject: [PATCH 152/224] Implement position getter for hedging Oms in OrderMatchingEngine (#2007) --- nautilus_core/backtest/src/matching_engine.rs | 133 +++++++++++++++++- nautilus_core/common/src/cache/mod.rs | 2 +- 2 files changed, 130 insertions(+), 5 deletions(-) diff --git a/nautilus_core/backtest/src/matching_engine.rs b/nautilus_core/backtest/src/matching_engine.rs index 36f04f411a13..e1878875b8e7 100644 --- a/nautilus_core/backtest/src/matching_engine.rs +++ b/nautilus_core/backtest/src/matching_engine.rs @@ -909,6 +909,26 @@ impl OrderMatchingEngine { TradeId::from(trade_id.as_str()) } + fn get_position_id(&mut self, order: &OrderAny, generate: Option) -> Option { + let generate = generate.unwrap_or(true); + if self.oms_type == OmsType::Hedging { + { + let cache = self.cache.as_ref().borrow(); + let position_id_result = cache.position_id(&order.client_order_id()); + if let Some(position_id) = position_id_result { + return Some(position_id.to_owned()); + } + } + if generate { + self.generate_venue_position_id() + } else { + panic!("Position id should be generated. Hedging Oms type order matching engine doesnt exists in cache.") + } + } else { + todo!("Netting OMS position getter") + } + } + fn generate_venue_position_id(&mut self) -> Option { if !self.config.use_position_ids { return None; @@ -1196,16 +1216,18 @@ mod tests { MessageBus, }, }; - use nautilus_core::{nanos::UnixNanos, time::AtomicTime}; + use nautilus_core::{nanos::UnixNanos, time::AtomicTime, uuid::UUID4}; use nautilus_model::{ data::{delta::OrderBookDelta, order::BookOrder}, enums::{ - AccountType, BookAction, BookType, ContingencyType, OmsType, OrderSide, OrderType, + AccountType, BookAction, BookType, ContingencyType, LiquiditySide, OmsType, OrderSide, + OrderType, }, events::order::{ - rejected::OrderRejectedBuilder, OrderEventAny, OrderEventType, OrderRejected, + rejected::OrderRejectedBuilder, OrderEventAny, OrderEventType, OrderFilled, + OrderRejected, }, - identifiers::{AccountId, ClientOrderId, PositionId}, + identifiers::{AccountId, ClientOrderId, PositionId, TradeId, VenueOrderId}, instruments::{ any::InstrumentAny, crypto_perpetual::CryptoPerpetual, @@ -1213,6 +1235,7 @@ mod tests { stubs::{futures_contract_es, *}, }, orders::{builder::OrderTestBuilder, stubs::TestOrderStubs}, + position::Position, types::{price::Price, quantity::Quantity}, }; use rstest::{fixture, rstest}; @@ -1945,4 +1968,106 @@ mod tests { assert_eq!(position_id_1, Some(PositionId::new("BINANCE-1-1"))); assert_eq!(position_id_2, Some(PositionId::new("BINANCE-1-2"))); } + + #[rstest] + fn test_get_position_id_hedging_with_existing_position( + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, + crypto_perpetual_ethusdt: CryptoPerpetual, + ) { + let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); + let cache = Rc::new(RefCell::new(Cache::default())); + + // create oms type hedging engine + let mut engine = OrderMatchingEngine::new( + instrument.clone(), + 1, + FillModel::default(), + BookType::L1_MBP, + OmsType::Hedging, + AccountType::Cash, + &ATOMIC_TIME, + Rc::new(RefCell::new(MessageBus::default())), + cache, + OrderMatchingEngineConfig::default(), + ); + + // create position, order and order filled event + let order = OrderTestBuilder::new(OrderType::Market) + .instrument_id(instrument.id().clone()) + .side(OrderSide::Buy) + .quantity(Quantity::from("1")) + .build(); + let order_filled = OrderFilled::new( + order.trader_id(), + order.strategy_id(), + order.instrument_id(), + order.client_order_id(), + VenueOrderId::new("BINANCE-1"), + account_id, + TradeId::new("1"), + order.order_side(), + order.order_type(), + Quantity::from("1"), + Price::from("1000"), + instrument.quote_currency(), + LiquiditySide::Taker, + UUID4::new(), + UnixNanos::default(), + UnixNanos::default(), + false, + Some(PositionId::new("P-1")), + None, + ); + let position = Position::new(&instrument, order_filled); + + // add position to cache + engine + .cache + .borrow_mut() + .add_position(position.clone(), engine.oms_type) + .unwrap(); + + let position_id = engine.get_position_id(&order, None); + assert_eq!(position_id, Some(position.id)); + } + + #[rstest] + fn test_get_position_id_hedging_with_generated_position( + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, + crypto_perpetual_ethusdt: CryptoPerpetual, + ) { + let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); + let cache = Rc::new(RefCell::new(Cache::default())); + + // use order matching config with position ids + let config_with_position_id = OrderMatchingEngineConfig { + use_position_ids: true, + ..OrderMatchingEngineConfig::default() + }; + // create oms type hedging engine + let mut engine = OrderMatchingEngine::new( + instrument.clone(), + 1, + FillModel::default(), + BookType::L1_MBP, + OmsType::Hedging, + AccountType::Cash, + &ATOMIC_TIME, + Rc::new(RefCell::new(MessageBus::default())), + cache, + config_with_position_id, + ); + let order = OrderTestBuilder::new(OrderType::Market) + .instrument_id(instrument.id().clone()) + .side(OrderSide::Buy) + .quantity(Quantity::from("1")) + .build(); + + let position_id = engine.get_position_id(&order, None); + assert_eq!(position_id, Some(PositionId::new("BINANCE-1-1"))); + } } diff --git a/nautilus_core/common/src/cache/mod.rs b/nautilus_core/common/src/cache/mod.rs index ad7b33b8b081..34b02e008e0d 100644 --- a/nautilus_core/common/src/cache/mod.rs +++ b/nautilus_core/common/src/cache/mod.rs @@ -1343,7 +1343,7 @@ impl Cache { } /// Indexes the given `position_id` with the other given IDs. - pub fn add_position_id( + fn add_position_id( &mut self, position_id: &PositionId, venue: &Venue, From 708e3dff2a6d0e7a69a8b36d30ad34b0032f2705 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 17 Oct 2024 07:26:10 +1100 Subject: [PATCH 153/224] Refine OrderMatchingEngine --- nautilus_core/Cargo.lock | 1 + nautilus_core/backtest/Cargo.toml | 1 + nautilus_core/backtest/src/matching_engine.rs | 95 +++++++++---------- 3 files changed, 48 insertions(+), 49 deletions(-) diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 4d713ded0e8c..713a833a8ece 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -2754,6 +2754,7 @@ dependencies = [ "rust_decimal", "tempfile", "ustr", + "uuid", ] [[package]] diff --git a/nautilus_core/backtest/Cargo.toml b/nautilus_core/backtest/Cargo.toml index d0dac5f3f6fa..cf083bdbf323 100644 --- a/nautilus_core/backtest/Cargo.toml +++ b/nautilus_core/backtest/Cargo.toml @@ -23,6 +23,7 @@ pyo3 = { workspace = true, optional = true } ustr = { workspace = true } rust_decimal = { workspace = true } rand = { workspace = true } +uuid = { workspace = true } rand_chacha = { version = "0.3.1"} [dev-dependencies] diff --git a/nautilus_core/backtest/src/matching_engine.rs b/nautilus_core/backtest/src/matching_engine.rs index e1878875b8e7..818cd4241320 100644 --- a/nautilus_core/backtest/src/matching_engine.rs +++ b/nautilus_core/backtest/src/matching_engine.rs @@ -56,6 +56,7 @@ use nautilus_model::{ types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, }; use ustr::Ustr; +use uuid::Uuid; use crate::models::fill::FillModel; @@ -245,7 +246,7 @@ impl OrderMatchingEngine { #[must_use] pub fn get_open_orders(&self) -> Vec { - // get orders from both open bid orders and open ask orders + // Get orders from both open bid orders and open ask orders let mut orders = Vec::new(); orders.extend_from_slice(self.core.get_orders_bid()); orders.extend_from_slice(self.core.get_orders_ask()); @@ -293,14 +294,13 @@ impl OrderMatchingEngine { pub fn process_bar(&mut self, bar: &Bar) { log::debug!("Processing {bar}"); - // check if configured for bar execution - // can only process an L1 book with bars + // Check if configured for bar execution can only process an L1 book with bars if !self.config.bar_execution || self.book_type != BookType::L1_MBP { return; } let bar_type = bar.bar_type; - // do not process internally aggregated bars + // Do not process internally aggregated bars if bar_type.aggregation_source() == AggregationSource::Internal { return; } @@ -347,9 +347,8 @@ impl OrderMatchingEngine { } fn process_trade_ticks_from_bar(&mut self, bar: &Bar) { - // split the bar into 4 trade ticks with quarter volume + // Split the bar into 4 trade ticks with quarter volume let size = Quantity::new(bar.volume.as_f64() / 4.0, bar.volume.precision); - let aggressor_side = if !self.core.is_last_initialized || bar.open > self.core.last.unwrap() { AggressorSide::Buyer @@ -357,7 +356,7 @@ impl OrderMatchingEngine { AggressorSide::Seller }; - // create reusable trade tick + // Create reusable trade tick let mut trade_tick = TradeTick::new( bar.instrument_id(), bar.open, @@ -368,16 +367,16 @@ impl OrderMatchingEngine { bar.ts_event, ); - // open - // check if not initialized, if it is, it will be updated by the close or last + // Open + // Check if not initialized, if it is, it will be updated by the close or last if !self.core.is_last_initialized { self.book.update_trade_tick(&trade_tick).unwrap(); self.iterate(trade_tick.ts_init); self.core.set_last_raw(trade_tick.price); } - // high - // check if higher than last + // High + // Check if higher than last if self.core.last.is_some_and(|last| bar.high > last) { trade_tick.price = bar.high; trade_tick.aggressor_side = AggressorSide::Buyer; @@ -389,9 +388,9 @@ impl OrderMatchingEngine { self.core.set_last_raw(trade_tick.price); } - // low - // check if lower than last - // assumption: market traded down, aggressor hitting the bid(setting aggressor to seller) + // Low + // Check if lower than last + // Assumption: market traded down, aggressor hitting the bid(setting aggressor to seller) if self.core.last.is_some_and(|last| bar.low < last) { trade_tick.price = bar.low; trade_tick.aggressor_side = AggressorSide::Seller; @@ -403,10 +402,10 @@ impl OrderMatchingEngine { self.core.set_last_raw(trade_tick.price); } - // close - // check if not the same as last - // assumption: if close price is higher then last, aggressor is buyer - // assumption: if close price is lower then last, aggressor is seller + // Close + // Check if not the same as last + // Assumption: if close price is higher then last, aggressor is buyer + // Assumption: if close price is lower then last, aggressor is seller if self.core.last.is_some_and(|last| bar.close != last) { trade_tick.price = bar.close; trade_tick.aggressor_side = if bar.close > self.core.last.unwrap() { @@ -424,7 +423,7 @@ impl OrderMatchingEngine { } fn process_quote_ticks_from_bar(&mut self, bar: &Bar) { - // wait for next bar + // Wait for next bar if self.last_bar_bid.is_none() || self.last_bar_ask.is_none() || self.last_bar_bid.unwrap().ts_event != self.last_bar_ask.unwrap().ts_event @@ -436,7 +435,7 @@ impl OrderMatchingEngine { let bid_size = Quantity::new(bid_bar.volume.as_f64() / 4.0, bar.volume.precision); let ask_size = Quantity::new(ask_bar.volume.as_f64() / 4.0, bar.volume.precision); - // create reusable quote tick + // Create reusable quote tick let mut quote_tick = QuoteTick::new( self.book.instrument_id, bid_bar.open, @@ -447,29 +446,29 @@ impl OrderMatchingEngine { bid_bar.ts_init, ); - // open + // Open self.book.update_quote_tick("e_tick).unwrap(); self.iterate(quote_tick.ts_init); - // high + // High quote_tick.bid_price = bid_bar.high; quote_tick.ask_price = ask_bar.high; self.book.update_quote_tick("e_tick).unwrap(); self.iterate(quote_tick.ts_init); - // low + // Low quote_tick.bid_price = bid_bar.low; quote_tick.ask_price = ask_bar.low; self.book.update_quote_tick("e_tick).unwrap(); self.iterate(quote_tick.ts_init); - // close + // Close quote_tick.bid_price = bid_bar.close; quote_tick.ask_price = ask_bar.close; self.book.update_quote_tick("e_tick).unwrap(); self.iterate(quote_tick.ts_init); - // reset last bars + // Reset last bars self.last_bar_bid = None; self.last_bar_ask = None; } @@ -488,22 +487,21 @@ impl OrderMatchingEngine { pub fn process_status(&mut self, action: MarketStatusAction) { log::debug!("Processing {action}"); - // check if market is closed and market opens with - // trading or pre-open status + // Check if market is closed and market opens with trading or pre-open status if self.market_status == MarketStatus::Closed && (action == MarketStatusAction::Trading || action == MarketStatusAction::PreOpen) { self.market_status = MarketStatus::Open; } - // check if market is open and market pauses + // Check if market is open and market pauses if self.market_status == MarketStatus::Open && action == MarketStatusAction::Pause { self.market_status = MarketStatus::Paused; } - // check if market is open and market suspends + // Check if market is open and market suspends if self.market_status == MarketStatus::Open && action == MarketStatusAction::Suspend { self.market_status = MarketStatus::Suspended; } - // check if market is open and we halt or close + // Check if market is open and we halt or close if self.market_status == MarketStatus::Open && (action == MarketStatusAction::Halt || action == MarketStatusAction::Close) { @@ -515,7 +513,7 @@ impl OrderMatchingEngine { #[allow(clippy::needless_return)] pub fn process_order(&mut self, order: &OrderAny, account_id: AccountId) { - // enter the scope where you will borrow a cache + // Enter the scope where you will borrow a cache { let cache_borrow = self.cache.as_ref().borrow(); @@ -792,8 +790,7 @@ impl OrderMatchingEngine { pub fn iterate(&mut self, timestamp_ns: UnixNanos) { self.clock.set_time(timestamp_ns); - // check for updates in orderbook and set bid and ask - // in order matching core and iterate + // Check for updates in orderbook and set bid and ask in order matching core and iterate if self.book.has_bid() { self.core.set_bid_raw(self.book.best_bid_price().unwrap()); } @@ -902,7 +899,7 @@ impl OrderMatchingEngine { fn generate_trade_id(&mut self) -> TradeId { self.execution_count += 1; let trade_id = if self.config.use_random_ids { - UUID4::new().to_string() + Uuid::new_v4().to_string() } else { format!("{}-{}-{}", self.venue, self.raw_id, self.execution_count) }; @@ -936,7 +933,7 @@ impl OrderMatchingEngine { self.position_count += 1; if self.config.use_random_ids { - Some(PositionId::new(UUID4::new().to_string().as_str())) + Some(PositionId::new(&Uuid::new_v4().to_string())) } else { Some(PositionId::new( format!("{}-{}-{}", self.venue, self.raw_id, self.position_count).as_str(), @@ -1271,7 +1268,7 @@ mod tests { get_message_saving_handler::(Some(Ustr::from("ExecEngine.process"))) } - // for valid es futures contract currently active + // For valid ES futures contract currently active #[fixture] fn instrument_es() -> InstrumentAny { let activation = UnixNanos::from( @@ -1722,8 +1719,8 @@ mod tests { // Make it Accepted let accepted_stop_order = TestOrderStubs::make_accepted_order(&stop_order); - // 1. save entry order in the cache as it will be loaded by the matching engine - // 2. send the stop loss order which has parent of entry order + // 1. Save entry order in the cache as it will be loaded by the matching engine + // 2. Send the stop loss order which has parent of entry order cache .as_ref() .borrow_mut() @@ -1800,8 +1797,8 @@ mod tests { // Make take profit order Accepted let accepted_take_profit = TestOrderStubs::make_accepted_order(&take_profit_order); - // 1. save stop loss order in cache which is rejected and closed is set to true - // 2. send the take profit order which has linked the stop loss order + // 1. Save stop loss order in cache which is rejected and closed is set to true + // 2. Send the take profit order which has linked the stop loss order cache .as_ref() .borrow_mut() @@ -1891,7 +1888,7 @@ mod tests { None, None, ); - // create bid and ask orderbook delta and check if + // Create bid and ask orderbook delta and check if // bid and ask are initialized in order matching core let orderbook_delta_buy = OrderBookDelta::new( instrument_es.id(), @@ -1933,7 +1930,7 @@ mod tests { crypto_perpetual_ethusdt: CryptoPerpetual, ) { let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); - // create two order matching engines with different configs + // Create two order matching engines with different configs // one with and other without position ids let config_no_position_id = OrderMatchingEngineConfig { use_position_ids: false, @@ -1959,10 +1956,10 @@ mod tests { Some(config_with_position_id), ); - // engine which doesnt have position id should return None + // Engine which doesnt have position id should return None assert_eq!(engine_no_position_id.generate_venue_position_id(), None); - // engine which has position id should return position id in incrementing order + // Engine which has position id should return position id in incrementing order let position_id_1 = engine_with_position_id.generate_venue_position_id(); let position_id_2 = engine_with_position_id.generate_venue_position_id(); assert_eq!(position_id_1, Some(PositionId::new("BINANCE-1-1"))); @@ -1979,7 +1976,7 @@ mod tests { let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); let cache = Rc::new(RefCell::new(Cache::default())); - // create oms type hedging engine + // Create oms type hedging engine let mut engine = OrderMatchingEngine::new( instrument.clone(), 1, @@ -1993,7 +1990,7 @@ mod tests { OrderMatchingEngineConfig::default(), ); - // create position, order and order filled event + // Create position, order and order filled event let order = OrderTestBuilder::new(OrderType::Market) .instrument_id(instrument.id().clone()) .side(OrderSide::Buy) @@ -2022,7 +2019,7 @@ mod tests { ); let position = Position::new(&instrument, order_filled); - // add position to cache + // Add position to cache engine .cache .borrow_mut() @@ -2043,12 +2040,12 @@ mod tests { let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); let cache = Rc::new(RefCell::new(Cache::default())); - // use order matching config with position ids + // Use order matching config with position ids let config_with_position_id = OrderMatchingEngineConfig { use_position_ids: true, ..OrderMatchingEngineConfig::default() }; - // create oms type hedging engine + // Create oms type hedging engine let mut engine = OrderMatchingEngine::new( instrument.clone(), 1, From 2ffeaa2d3ac80100f6701f99979a42c30fd3880b Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 17 Oct 2024 18:09:31 +1100 Subject: [PATCH 154/224] Update release notes --- RELEASES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASES.md b/RELEASES.md index 121c6b9dc353..d7e250fe8077 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -23,7 +23,7 @@ Released on TBD (UTC). - Use Rust rate limiter for dYdX websockets (#1996, #1999), thanks @davidsblom - Improved error logs for dYdX websocket subscriptions (#1993), thanks @davidsblom - Standardized log and error message syntax in Rust -- Continue porting `SimulatedExchange` to Rust (#1997, #1998, #2001), thanks @filipmacek +- Continue porting `SimulatedExchange` to Rust (#1997, #1998, #2001, #2003, #2004, #2006, #2007), thanks @filipmacek ### Breaking Changes - Removed legacy `TardisQuoteDataLoader` (now redundant with new Rust implemented loader) From dd0789a8f2bba2b81c2889e19f500fd4937dcc38 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 17 Oct 2024 19:12:38 +1100 Subject: [PATCH 155/224] Add BettingInstrument in Rust --- RELEASES.md | 3 +- .../model/src/instruments/betting.rs | 20 +- .../model/src/python/instruments/betting.rs | 408 ++++++++++++++++++ .../model/src/python/instruments/mod.rs | 1 + nautilus_core/model/src/python/mod.rs | 1 + nautilus_trader/core/nautilus_pyo3.pyi | 58 +++ 6 files changed, 475 insertions(+), 16 deletions(-) create mode 100644 nautilus_core/model/src/python/instruments/betting.rs diff --git a/RELEASES.md b/RELEASES.md index d7e250fe8077..e2ad03c6a348 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -18,12 +18,13 @@ Released on TBD (UTC). ### Internal Improvements - Ported `Throttler` to Rust (#1988), thanks @Pushkarm029 and @twitu +- Ported `BettingInstrument` to Rust - Refined `RateLimiter` for `WebSocketClient` and add tests (#2000), thanks @Pushkarm029 - Refined `WebSocketClient` to close existing tasks on reconnect (#1986), thanks @davidsblom - Use Rust rate limiter for dYdX websockets (#1996, #1999), thanks @davidsblom - Improved error logs for dYdX websocket subscriptions (#1993), thanks @davidsblom - Standardized log and error message syntax in Rust -- Continue porting `SimulatedExchange` to Rust (#1997, #1998, #2001, #2003, #2004, #2006, #2007), thanks @filipmacek +- Continue porting `SimulatedExchange` to Rust (#1997, #1998, #2001, #2003, #2004, #2006, #2007, #2009), thanks @filipmacek ### Breaking Changes - Removed legacy `TardisQuoteDataLoader` (now redundant with new Rust implemented loader) diff --git a/nautilus_core/model/src/instruments/betting.rs b/nautilus_core/model/src/instruments/betting.rs index d804142b991b..177108064711 100644 --- a/nautilus_core/model/src/instruments/betting.rs +++ b/nautilus_core/model/src/instruments/betting.rs @@ -52,8 +52,8 @@ pub struct BettingInstrument { pub betting_type: Ustr, pub market_id: Ustr, pub market_name: Ustr, - pub market_start_time: UnixNanos, pub market_type: Ustr, + pub market_start_time: UnixNanos, pub selection_id: u64, pub selection_name: Ustr, pub selection_handicap: f64, @@ -64,8 +64,6 @@ pub struct BettingInstrument { pub size_increment: Quantity, pub maker_fee: Decimal, pub taker_fee: Decimal, - pub margin_init: Decimal, - pub margin_maint: Decimal, pub max_quantity: Option, pub min_quantity: Option, pub max_notional: Option, @@ -97,8 +95,8 @@ impl BettingInstrument { betting_type: Ustr, market_id: Ustr, market_name: Ustr, - market_start_time: UnixNanos, market_type: Ustr, + market_start_time: UnixNanos, selection_id: u64, selection_name: Ustr, selection_handicap: f64, @@ -109,8 +107,6 @@ impl BettingInstrument { size_increment: Quantity, maker_fee: Decimal, taker_fee: Decimal, - margin_init: Decimal, - margin_maint: Decimal, max_quantity: Option, min_quantity: Option, max_notional: Option, @@ -149,8 +145,8 @@ impl BettingInstrument { betting_type, market_id, market_name, - market_start_time, market_type, + market_start_time, selection_id, selection_name, selection_handicap, @@ -161,8 +157,6 @@ impl BettingInstrument { size_increment, maker_fee, taker_fee, - margin_init, - margin_maint, max_quantity, min_quantity, max_notional, @@ -189,8 +183,8 @@ impl BettingInstrument { betting_type: Ustr, market_id: Ustr, market_name: Ustr, - market_start_time: UnixNanos, market_type: Ustr, + market_start_time: UnixNanos, selection_id: u64, selection_name: Ustr, selection_handicap: f64, @@ -201,8 +195,6 @@ impl BettingInstrument { size_increment: Quantity, maker_fee: Decimal, taker_fee: Decimal, - margin_init: Decimal, - margin_maint: Decimal, max_quantity: Option, min_quantity: Option, max_notional: Option, @@ -226,8 +218,8 @@ impl BettingInstrument { betting_type, market_id, market_name, - market_start_time, market_type, + market_start_time, selection_id, selection_name, selection_handicap, @@ -238,8 +230,6 @@ impl BettingInstrument { size_increment, maker_fee, taker_fee, - margin_init, - margin_maint, max_quantity, min_quantity, max_notional, diff --git a/nautilus_core/model/src/python/instruments/betting.rs b/nautilus_core/model/src/python/instruments/betting.rs new file mode 100644 index 000000000000..76fee70a3326 --- /dev/null +++ b/nautilus_core/model/src/python/instruments/betting.rs @@ -0,0 +1,408 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use std::{ + collections::hash_map::DefaultHasher, + hash::{Hash, Hasher}, +}; + +use nautilus_core::python::{serialization::from_dict_pyo3, to_pyvalue_err}; +use pyo3::{basic::CompareOp, prelude::*, types::PyDict}; +use rust_decimal::Decimal; +use ustr::Ustr; + +use crate::{ + enums::{AssetClass, InstrumentClass}, + identifiers::{InstrumentId, Symbol}, + instruments::betting::BettingInstrument, + types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, +}; + +#[pymethods] +impl BettingInstrument { + #[allow(clippy::too_many_arguments)] + #[new] + fn py_new( + id: InstrumentId, + raw_symbol: Symbol, + event_type_id: u64, + event_type_name: String, + competition_id: String, + competition_name: String, + event_id: u64, + event_name: String, + event_country_code: String, + event_open_date: u64, + betting_type: String, + market_id: String, + market_name: String, + market_type: String, + market_start_time: u64, + selection_id: u64, + selection_name: String, + selection_handicap: f64, + currency: Currency, + price_precision: u8, + size_precision: u8, + price_increment: Price, + size_increment: Quantity, + maker_fee: Decimal, + taker_fee: Decimal, + ts_event: u64, + ts_init: u64, + max_quantity: Option, + min_quantity: Option, + max_notional: Option, + min_notional: Option, + max_price: Option, + min_price: Option, + ) -> PyResult { + Self::new_checked( + id, + raw_symbol, + event_type_id, + Ustr::from(&event_type_name), + Ustr::from(&competition_id), + Ustr::from(&competition_name), + event_id, + Ustr::from(&event_name), + Ustr::from(&event_country_code), + event_open_date.into(), + Ustr::from(&betting_type), + Ustr::from(&market_id), + Ustr::from(&market_name), + Ustr::from(&market_type), + market_start_time.into(), + selection_id, + Ustr::from(&selection_name), + selection_handicap, + currency, + price_precision, + size_precision, + price_increment, + size_increment, + maker_fee, + taker_fee, + max_quantity, + min_quantity, + max_notional, + min_notional, + max_price, + min_price, + ts_event.into(), + ts_init.into(), + ) + .map_err(to_pyvalue_err) + } + + fn __hash__(&self) -> isize { + let mut hasher = DefaultHasher::new(); + self.hash(&mut hasher); + hasher.finish() as isize + } + + fn __richcmp__(&self, other: &Self, op: CompareOp, py: Python<'_>) -> Py { + match op { + CompareOp::Eq => self.eq(other).into_py(py), + _ => panic!("Not implemented"), + } + } + + #[getter] + fn type_str(&self) -> &str { + stringify!(BettingInstrument) + } + + #[getter] + #[pyo3(name = "id")] + fn py_id(&self) -> InstrumentId { + self.id + } + + #[getter] + #[pyo3(name = "raw_symbol")] + fn py_raw_symbol(&self) -> Symbol { + self.raw_symbol + } + + #[getter] + #[pyo3(name = "asset_class")] + fn py_asset_class(&self) -> AssetClass { + AssetClass::Alternative + } + + #[getter] + #[pyo3(name = "instrument_class")] + fn py_instrument_class(&self) -> InstrumentClass { + InstrumentClass::SportsBetting + } + + #[getter] + #[pyo3(name = "event_type_id")] + fn py_event_type_id(&self) -> u64 { + self.event_type_id + } + + #[getter] + #[pyo3(name = "event_type_name")] + fn py_event_type_name(&self) -> &str { + self.event_type_name.as_str() + } + + #[getter] + #[pyo3(name = "competition_id")] + fn py_competition_id(&self) -> &str { + self.competition_id.as_str() + } + + #[getter] + #[pyo3(name = "competition_name")] + fn py_competition_name(&self) -> &str { + self.competition_name.as_str() + } + + #[getter] + #[pyo3(name = "event_id")] + fn py_event_id(&self) -> u64 { + self.event_id + } + + #[getter] + #[pyo3(name = "event_name")] + fn py_event_name(&self) -> &str { + self.event_name.as_str() + } + + #[getter] + #[pyo3(name = "event_country_code")] + fn py_event_country_code(&self) -> &str { + self.event_country_code.as_str() + } + + #[getter] + #[pyo3(name = "event_open_date")] + fn py_event_open_date(&self) -> u64 { + self.event_open_date.as_u64() + } + + #[getter] + #[pyo3(name = "betting_type")] + fn py_betting_type(&self) -> &str { + self.betting_type.as_str() + } + + #[getter] + #[pyo3(name = "market_id")] + fn py_market_id(&self) -> &str { + self.market_id.as_str() + } + + #[getter] + #[pyo3(name = "market_name")] + fn py_market_name(&self) -> &str { + self.market_name.as_str() + } + + #[getter] + #[pyo3(name = "market_type")] + fn py_market_type(&self) -> &str { + self.market_type.as_str() + } + + #[getter] + #[pyo3(name = "market_start_time")] + fn py_market_start_time(&self) -> u64 { + self.market_start_time.as_u64() + } + + #[getter] + #[pyo3(name = "selection_id")] + fn py_selection_id(&self) -> u64 { + self.selection_id + } + + #[getter] + #[pyo3(name = "selection_name")] + fn py_selection_name(&self) -> &str { + self.selection_name.as_str() + } + + #[getter] + #[pyo3(name = "selection_name")] + fn py_selection_handicap(&self) -> f64 { + self.selection_handicap + } + + #[getter] + #[pyo3(name = "currency")] + fn py_quote_currency(&self) -> Currency { + self.currency + } + + #[getter] + #[pyo3(name = "price_precision")] + fn py_price_precision(&self) -> u8 { + self.price_precision + } + + #[getter] + #[pyo3(name = "size_precision")] + fn py_size_precision(&self) -> u8 { + self.size_precision + } + + #[getter] + #[pyo3(name = "price_increment")] + fn py_price_increment(&self) -> Price { + self.price_increment + } + + #[getter] + #[pyo3(name = "size_increment")] + fn py_size_increment(&self) -> Quantity { + self.size_increment + } + + #[getter] + #[pyo3(name = "max_quantity")] + fn py_max_quantity(&self) -> Option { + self.max_quantity + } + + #[getter] + #[pyo3(name = "min_quantity")] + fn py_min_quantity(&self) -> Option { + self.min_quantity + } + + #[getter] + #[pyo3(name = "max_notional")] + fn py_max_notional(&self) -> Option { + self.max_notional + } + + #[getter] + #[pyo3(name = "min_notional")] + fn py_min_notional(&self) -> Option { + self.min_notional + } + + #[getter] + #[pyo3(name = "max_price")] + fn py_max_price(&self) -> Option { + self.max_price + } + + #[getter] + #[pyo3(name = "min_price")] + fn py_min_price(&self) -> Option { + self.min_price + } + + #[getter] + #[pyo3(name = "maker_fee")] + fn py_maker_fee(&self) -> Decimal { + self.maker_fee + } + + #[getter] + #[pyo3(name = "taker_fee")] + fn py_taker_fee(&self) -> Decimal { + self.taker_fee + } + + #[getter] + #[pyo3(name = "info")] + fn py_info(&self, py: Python<'_>) -> PyResult { + Ok(PyDict::new(py).into()) + } + + #[getter] + #[pyo3(name = "ts_event")] + fn py_ts_event(&self) -> u64 { + self.ts_event.as_u64() + } + + #[getter] + #[pyo3(name = "ts_init")] + fn py_ts_init(&self) -> u64 { + self.ts_init.as_u64() + } + + #[staticmethod] + #[pyo3(name = "from_dict")] + fn py_from_dict(py: Python<'_>, values: Py) -> PyResult { + from_dict_pyo3(py, values) + } + + #[pyo3(name = "to_dict")] + fn py_to_dict(&self, py: Python<'_>) -> PyResult { + let dict = PyDict::new(py); + dict.set_item("type", stringify!(BettingInstrument))?; + dict.set_item("id", self.id.to_string())?; + dict.set_item("raw_symbol", self.raw_symbol.to_string())?; + dict.set_item("event_type_id", self.event_type_id)?; + dict.set_item("event_type_name", self.event_type_name.to_string())?; + dict.set_item("competition_id", self.competition_id.to_string())?; + dict.set_item("competition_name", self.competition_name.to_string())?; + dict.set_item("event_id", self.event_id)?; + dict.set_item("event_name", self.event_name.to_string())?; + dict.set_item("event_country_code", self.event_country_code.to_string())?; + dict.set_item("event_open_date", self.event_open_date.as_u64())?; + dict.set_item("betting_type", self.betting_type.to_string())?; + dict.set_item("market_id", self.market_id.to_string())?; + dict.set_item("market_name", self.market_name.to_string())?; + dict.set_item("market_start_time", self.market_start_time.to_string())?; + dict.set_item("market_type", self.market_type.to_string())?; + dict.set_item("selection_id", self.selection_id)?; + dict.set_item("selection_name", self.selection_name.to_string())?; + dict.set_item("selection_handicap", self.selection_handicap)?; + dict.set_item("currency", self.currency.code.to_string())?; + dict.set_item("price_precision", self.price_precision)?; + dict.set_item("size_precision", self.size_precision)?; + dict.set_item("price_increment", self.price_increment.to_string())?; + dict.set_item("size_increment", self.size_increment.to_string())?; + dict.set_item("maker_fee", self.maker_fee.to_string())?; + dict.set_item("taker_fee", self.taker_fee.to_string())?; + dict.set_item("ts_event", self.ts_event.as_u64())?; + dict.set_item("ts_init", self.ts_init.as_u64())?; + dict.set_item("info", PyDict::new(py))?; + match self.max_quantity { + Some(value) => dict.set_item("max_quantity", value.to_string())?, + None => dict.set_item("max_quantity", py.None())?, + } + match self.min_quantity { + Some(value) => dict.set_item("min_quantity", value.to_string())?, + None => dict.set_item("min_quantity", py.None())?, + } + match self.max_notional { + Some(value) => dict.set_item("max_notional", value.to_string())?, + None => dict.set_item("max_notional", py.None())?, + } + match self.min_notional { + Some(value) => dict.set_item("min_notional", value.to_string())?, + None => dict.set_item("min_notional", py.None())?, + } + match self.max_price { + Some(value) => dict.set_item("max_price", value.to_string())?, + None => dict.set_item("max_price", py.None())?, + } + match self.min_price { + Some(value) => dict.set_item("min_price", value.to_string())?, + None => dict.set_item("min_price", py.None())?, + } + Ok(dict.into()) + } +} diff --git a/nautilus_core/model/src/python/instruments/mod.rs b/nautilus_core/model/src/python/instruments/mod.rs index 0ea933c31650..954d5215b377 100644 --- a/nautilus_core/model/src/python/instruments/mod.rs +++ b/nautilus_core/model/src/python/instruments/mod.rs @@ -25,6 +25,7 @@ use crate::instruments::{ options_contract::OptionsContract, options_spread::OptionsSpread, }; +pub mod betting; pub mod binary_option; pub mod crypto_future; pub mod crypto_perpetual; diff --git a/nautilus_core/model/src/python/mod.rs b/nautilus_core/model/src/python/mod.rs index 855384de32dc..141975d09a43 100644 --- a/nautilus_core/model/src/python/mod.rs +++ b/nautilus_core/model/src/python/mod.rs @@ -119,6 +119,7 @@ pub fn model(_: Python<'_>, m: &PyModule) -> PyResult<()> { m.add_class::()?; m.add_class::()?; // Instruments + m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index 084c73c804de..f5a11341223d 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -1731,6 +1731,64 @@ class AccountState: # Instruments +class BettingInstrument: + def __init__( + self, + id: InstrumentId, + raw_symbol: Symbol, + event_type_id: int, + event_type_name: str, + competition_id: str, + competition_name: str, + event_id: int, + event_name: str, + event_country_code: str, + event_open_date: int, + betting_type: str, + market_id: str, + market_type: str, + market_start_time: int, + selection_id: int, + selection_name: str, + selection_handicap: float, + currency: Currency, + price_precision: int, + size_precision: int, + price_increment: Price, + size_increment: Quantity, + maker_fee: Decimal, + taker_fee: Decimal, + ts_event: int, + ts_init: int, + outcome: str | None = None, + description: str | None = None, + max_quantity: Quantity | None = None, + min_quantity: Quantity | None = None, + max_notional: Money | None = None, + min_notional: Money | None = None, + max_price: Price | None = None, + min_price: Price | None = None, + ) -> None: ... + @classmethod + def from_dict(cls, values: dict[str, str]) -> BettingInstrument: ... + @property + def id(self) -> InstrumentId: ... + @property + def raw_symbol(self) -> Symbol: ... + @property + def asset_class(self) -> AssetClass: ... + @property + def currency(self) -> Currency: ... + @property + def price_precision(self) -> int: ... + @property + def size_precision(self) -> int: ... + @property + def price_increment(self) -> Price: ... + @property + def size_increment(self) -> Quantity: ... + def to_dict(self) -> dict[str, Any]: ... + class BinaryOption: def __init__( self, From fd5229309710e7e7884850221264a0a73a64be0c Mon Sep 17 00:00:00 2001 From: Filip Macek Date: Thu, 17 Oct 2024 10:14:03 +0200 Subject: [PATCH 156/224] Reorganize OrderMatchingEngine (#2009) --- nautilus_core/backtest/src/exchange.rs | 2 +- .../backtest/src/matching_engine/config.rs | 64 ++ .../mod.rs} | 928 +----------------- .../backtest/src/matching_engine/tests.rs | 868 ++++++++++++++++ 4 files changed, 937 insertions(+), 925 deletions(-) create mode 100644 nautilus_core/backtest/src/matching_engine/config.rs rename nautilus_core/backtest/src/{matching_engine.rs => matching_engine/mod.rs} (55%) create mode 100644 nautilus_core/backtest/src/matching_engine/tests.rs diff --git a/nautilus_core/backtest/src/exchange.rs b/nautilus_core/backtest/src/exchange.rs index a61f04912fcc..fdb1353fe2da 100644 --- a/nautilus_core/backtest/src/exchange.rs +++ b/nautilus_core/backtest/src/exchange.rs @@ -47,7 +47,7 @@ use nautilus_model::{ use rust_decimal::Decimal; use crate::{ - matching_engine::{OrderMatchingEngine, OrderMatchingEngineConfig}, + matching_engine::{config::OrderMatchingEngineConfig, OrderMatchingEngine}, models::{fee::FeeModelAny, fill::FillModel, latency::LatencyModel}, modules::SimulationModule, }; diff --git a/nautilus_core/backtest/src/matching_engine/config.rs b/nautilus_core/backtest/src/matching_engine/config.rs new file mode 100644 index 000000000000..22acb7b90748 --- /dev/null +++ b/nautilus_core/backtest/src/matching_engine/config.rs @@ -0,0 +1,64 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +/// Configuration for [`OrderMatchingEngine`] instances. +#[derive(Debug, Clone)] +pub struct OrderMatchingEngineConfig { + pub bar_execution: bool, + pub reject_stop_orders: bool, + pub support_gtd_orders: bool, + pub support_contingent_orders: bool, + pub use_position_ids: bool, + pub use_random_ids: bool, + pub use_reduce_only: bool, +} + +impl OrderMatchingEngineConfig { + #[must_use] + pub const fn new( + bar_execution: bool, + reject_stop_orders: bool, + support_gtd_orders: bool, + support_contingent_orders: bool, + use_position_ids: bool, + use_random_ids: bool, + use_reduce_only: bool, + ) -> Self { + Self { + bar_execution, + reject_stop_orders, + support_gtd_orders, + support_contingent_orders, + use_position_ids, + use_random_ids, + use_reduce_only, + } + } +} + +#[allow(clippy::derivable_impls)] +impl Default for OrderMatchingEngineConfig { + fn default() -> Self { + Self { + bar_execution: false, + reject_stop_orders: false, + support_gtd_orders: false, + support_contingent_orders: false, + use_position_ids: false, + use_random_ids: false, + use_reduce_only: false, + } + } +} diff --git a/nautilus_core/backtest/src/matching_engine.rs b/nautilus_core/backtest/src/matching_engine/mod.rs similarity index 55% rename from nautilus_core/backtest/src/matching_engine.rs rename to nautilus_core/backtest/src/matching_engine/mod.rs index 818cd4241320..3f2cc2b7dc9f 100644 --- a/nautilus_core/backtest/src/matching_engine.rs +++ b/nautilus_core/backtest/src/matching_engine/mod.rs @@ -13,8 +13,6 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- -//! An `OrderMatchingEngine` for use in research, backtesting and sandbox environments. - // Under development #![allow(dead_code)] #![allow(unused_variables)] @@ -58,57 +56,11 @@ use nautilus_model::{ use ustr::Ustr; use uuid::Uuid; -use crate::models::fill::FillModel; - -/// Configuration for [`OrderMatchingEngine`] instances. -#[derive(Debug, Clone)] -pub struct OrderMatchingEngineConfig { - pub bar_execution: bool, - pub reject_stop_orders: bool, - pub support_gtd_orders: bool, - pub support_contingent_orders: bool, - pub use_position_ids: bool, - pub use_random_ids: bool, - pub use_reduce_only: bool, -} - -impl OrderMatchingEngineConfig { - #[must_use] - pub const fn new( - bar_execution: bool, - reject_stop_orders: bool, - support_gtd_orders: bool, - support_contingent_orders: bool, - use_position_ids: bool, - use_random_ids: bool, - use_reduce_only: bool, - ) -> Self { - Self { - bar_execution, - reject_stop_orders, - support_gtd_orders, - support_contingent_orders, - use_position_ids, - use_random_ids, - use_reduce_only, - } - } -} +use crate::{matching_engine::config::OrderMatchingEngineConfig, models::fill::FillModel}; -#[allow(clippy::derivable_impls)] -impl Default for OrderMatchingEngineConfig { - fn default() -> Self { - Self { - bar_execution: false, - reject_stop_orders: false, - support_gtd_orders: false, - support_contingent_orders: false, - use_position_ids: false, - use_random_ids: false, - use_reduce_only: false, - } - } -} +pub mod config; +#[cfg(test)] +mod tests; /// An order matching engine for a single market. pub struct OrderMatchingEngine { @@ -1196,875 +1148,3 @@ impl OrderMatchingEngine { msgbus.send(&msgbus.switchboard.exec_engine_process, &event as &dyn Any); } } - -//////////////////////////////////////////////////////////////////////////////// -// Tests -//////////////////////////////////////////////////////////////////////////////// -#[cfg(test)] -mod tests { - use std::{cell::RefCell, rc::Rc, sync::LazyLock}; - - use chrono::{TimeZone, Utc}; - use nautilus_common::{ - cache::Cache, - msgbus::{ - handler::ShareableMessageHandler, - stubs::{get_message_saving_handler, get_saved_messages}, - MessageBus, - }, - }; - use nautilus_core::{nanos::UnixNanos, time::AtomicTime, uuid::UUID4}; - use nautilus_model::{ - data::{delta::OrderBookDelta, order::BookOrder}, - enums::{ - AccountType, BookAction, BookType, ContingencyType, LiquiditySide, OmsType, OrderSide, - OrderType, - }, - events::order::{ - rejected::OrderRejectedBuilder, OrderEventAny, OrderEventType, OrderFilled, - OrderRejected, - }, - identifiers::{AccountId, ClientOrderId, PositionId, TradeId, VenueOrderId}, - instruments::{ - any::InstrumentAny, - crypto_perpetual::CryptoPerpetual, - equity::Equity, - stubs::{futures_contract_es, *}, - }, - orders::{builder::OrderTestBuilder, stubs::TestOrderStubs}, - position::Position, - types::{price::Price, quantity::Quantity}, - }; - use rstest::{fixture, rstest}; - use ustr::Ustr; - - use crate::{ - matching_engine::{OrderMatchingEngine, OrderMatchingEngineConfig}, - models::fill::FillModel, - }; - - static ATOMIC_TIME: LazyLock = - LazyLock::new(|| AtomicTime::new(true, UnixNanos::default())); - - // -- FIXTURES -------------------------------------------------------------------------------- - - #[fixture] - fn msgbus() -> MessageBus { - MessageBus::default() - } - - #[fixture] - fn account_id() -> AccountId { - AccountId::from("SIM-001") - } - - #[fixture] - fn time() -> AtomicTime { - AtomicTime::new(true, UnixNanos::default()) - } - - #[fixture] - fn order_event_handler() -> ShareableMessageHandler { - get_message_saving_handler::(Some(Ustr::from("ExecEngine.process"))) - } - - // For valid ES futures contract currently active - #[fixture] - fn instrument_es() -> InstrumentAny { - let activation = UnixNanos::from( - Utc.with_ymd_and_hms(2022, 4, 8, 0, 0, 0) - .unwrap() - .timestamp_nanos_opt() - .unwrap() as u64, - ); - let expiration = UnixNanos::from( - Utc.with_ymd_and_hms(2100, 7, 8, 0, 0, 0) - .unwrap() - .timestamp_nanos_opt() - .unwrap() as u64, - ); - InstrumentAny::FuturesContract(futures_contract_es(Some(activation), Some(expiration))) - } - - #[fixture] - fn engine_config() -> OrderMatchingEngineConfig { - OrderMatchingEngineConfig { - bar_execution: false, - reject_stop_orders: false, - support_gtd_orders: false, - support_contingent_orders: true, - use_position_ids: false, - use_random_ids: false, - use_reduce_only: true, - } - } - // -- HELPERS --------------------------------------------------------------------------- - - fn get_order_matching_engine( - instrument: InstrumentAny, - msgbus: Rc>, - cache: Option>>, - account_type: Option, - config: Option, - ) -> OrderMatchingEngine { - let cache = cache.unwrap_or(Rc::new(RefCell::new(Cache::default()))); - let config = config.unwrap_or_default(); - OrderMatchingEngine::new( - instrument, - 1, - FillModel::default(), - BookType::L1_MBP, - OmsType::Netting, - account_type.unwrap_or(AccountType::Cash), - &ATOMIC_TIME, - msgbus, - cache, - config, - ) - } - - fn get_order_matching_engine_l2( - instrument: InstrumentAny, - msgbus: Rc>, - cache: Option>>, - account_type: Option, - config: Option, - ) -> OrderMatchingEngine { - let cache = cache.unwrap_or(Rc::new(RefCell::new(Cache::default()))); - let config = config.unwrap_or_default(); - OrderMatchingEngine::new( - instrument, - 1, - FillModel::default(), - BookType::L2_MBP, - OmsType::Netting, - account_type.unwrap_or(AccountType::Cash), - &ATOMIC_TIME, - msgbus, - cache, - config, - ) - } - - fn get_order_event_handler_messages( - event_handler: ShareableMessageHandler, - ) -> Vec { - get_saved_messages::(event_handler) - } - - // -- TESTS ----------------------------------------------------------------------------------- - - #[rstest] - fn test_process_order_when_instrument_already_expired( - mut msgbus: MessageBus, - order_event_handler: ShareableMessageHandler, - account_id: AccountId, - time: AtomicTime, - ) { - let instrument = InstrumentAny::FuturesContract(futures_contract_es(None, None)); - - // Register saving message handler to exec engine endpoint - msgbus.register( - msgbus.switchboard.exec_engine_process, - order_event_handler.clone(), - ); - - // Create engine and process order - let mut engine = get_order_matching_engine( - instrument.clone(), - Rc::new(RefCell::new(msgbus)), - None, - None, - None, - ); - let order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument.id()) - .side(OrderSide::Buy) - .quantity(Quantity::from("1")) - .build(); - - engine.process_order(&order, account_id); - - // Get messages and test - let saved_messages = get_order_event_handler_messages(order_event_handler); - assert_eq!(saved_messages.len(), 1); - let first_message = saved_messages.first().unwrap(); - assert_eq!(first_message.event_type(), OrderEventType::Rejected); - assert_eq!( - first_message.message().unwrap(), - Ustr::from("Contract ESZ1.GLBX has expired, expiration 1625702400000000000") - ); - } - - #[rstest] - fn test_process_order_when_instrument_not_active( - mut msgbus: MessageBus, - order_event_handler: ShareableMessageHandler, - account_id: AccountId, - time: AtomicTime, - ) { - let activation = UnixNanos::from( - Utc.with_ymd_and_hms(2222, 4, 8, 0, 0, 0) - .unwrap() - .timestamp_nanos_opt() - .unwrap() as u64, - ); - let expiration = UnixNanos::from( - Utc.with_ymd_and_hms(2223, 7, 8, 0, 0, 0) - .unwrap() - .timestamp_nanos_opt() - .unwrap() as u64, - ); - let instrument = - InstrumentAny::FuturesContract(futures_contract_es(Some(activation), Some(expiration))); - - // Register saving message handler to exec engine endpoint - msgbus.register( - msgbus.switchboard.exec_engine_process, - order_event_handler.clone(), - ); - - // Create engine and process order - let mut engine = get_order_matching_engine( - instrument.clone(), - Rc::new(RefCell::new(msgbus)), - None, - None, - None, - ); - let order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument.id()) - .side(OrderSide::Buy) - .quantity(Quantity::from("1")) - .build(); - - engine.process_order(&order, account_id); - - // Get messages and test - let saved_messages = get_order_event_handler_messages(order_event_handler); - assert_eq!(saved_messages.len(), 1); - let first_message = saved_messages.first().unwrap(); - assert_eq!(first_message.event_type(), OrderEventType::Rejected); - assert_eq!( - first_message.message().unwrap(), - Ustr::from("Contract ESZ1.GLBX is not yet active, activation 7960723200000000000") - ); - } - - #[rstest] - fn test_process_order_when_invalid_quantity_precision( - mut msgbus: MessageBus, - order_event_handler: ShareableMessageHandler, - account_id: AccountId, - time: AtomicTime, - instrument_es: InstrumentAny, - ) { - // Register saving message handler to exec engine endpoint - msgbus.register( - msgbus.switchboard.exec_engine_process, - order_event_handler.clone(), - ); - - // Create engine and process order - let mut engine = get_order_matching_engine( - instrument_es.clone(), - Rc::new(RefCell::new(msgbus)), - None, - None, - None, - ); - let order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument_es.id()) - .side(OrderSide::Buy) - .quantity(Quantity::from("1.122")) - .build(); - - engine.process_order(&order, account_id); - - // Get messages and test - let saved_messages = get_order_event_handler_messages(order_event_handler); - assert_eq!(saved_messages.len(), 1); - let first_message = saved_messages.first().unwrap(); - assert_eq!(first_message.event_type(), OrderEventType::Rejected); - assert_eq!( - first_message.message().unwrap(), - Ustr::from("Invalid order quantity precision for order O-19700101-000000-001-001-1, was 3 when ESZ1.GLBX size precision is 0") - ); - } - - #[rstest] - fn test_process_order_when_invalid_price_precision( - mut msgbus: MessageBus, - order_event_handler: ShareableMessageHandler, - account_id: AccountId, - time: AtomicTime, - instrument_es: InstrumentAny, - ) { - // Register saving message handler to exec engine endpoint - msgbus.register( - msgbus.switchboard.exec_engine_process, - order_event_handler.clone(), - ); - - // Create engine and process order - let mut engine = get_order_matching_engine( - instrument_es.clone(), - Rc::new(RefCell::new(msgbus)), - None, - None, - None, - ); - - let limit_order = OrderTestBuilder::new(OrderType::Limit) - .instrument_id(instrument_es.id()) - .side(OrderSide::Sell) - .price(Price::from("100.12333")) // <- wrong price precision for es futures contract (which is 2) - .quantity(Quantity::from("1")) - .build(); - - engine.process_order(&limit_order, account_id); - - // Get messages and test - let saved_messages = get_order_event_handler_messages(order_event_handler); - assert_eq!(saved_messages.len(), 1); - let first_message = saved_messages.first().unwrap(); - assert_eq!(first_message.event_type(), OrderEventType::Rejected); - assert_eq!( - first_message.message().unwrap(), - Ustr::from("Invalid order price precision for order O-19700101-000000-001-001-1, was 5 when ESZ1.GLBX price precision is 2") - ); - } - - #[rstest] - fn test_process_order_when_invalid_trigger_price_precision( - mut msgbus: MessageBus, - order_event_handler: ShareableMessageHandler, - account_id: AccountId, - time: AtomicTime, - instrument_es: InstrumentAny, - ) { - // Register saving message handler to exec engine endpoint - msgbus.register( - msgbus.switchboard.exec_engine_process, - order_event_handler.clone(), - ); - - // Create engine and process order - let mut engine = get_order_matching_engine( - instrument_es.clone(), - Rc::new(RefCell::new(msgbus)), - None, - None, - None, - ); - let stop_order = OrderTestBuilder::new(OrderType::StopMarket) - .instrument_id(instrument_es.id()) - .side(OrderSide::Sell) - .trigger_price(Price::from("100.12333")) // <- wrong trigger price precision for es futures contract (which is 2) - .quantity(Quantity::from("1")) - .build(); - - engine.process_order(&stop_order, account_id); - - // Get messages and test - let saved_messages = get_order_event_handler_messages(order_event_handler); - assert_eq!(saved_messages.len(), 1); - let first_message = saved_messages.first().unwrap(); - assert_eq!(first_message.event_type(), OrderEventType::Rejected); - assert_eq!( - first_message.message().unwrap(), - Ustr::from("Invalid order trigger price precision for order O-19700101-000000-001-001-1, was 5 when ESZ1.GLBX price precision is 2") - ); - } - - #[rstest] - fn test_process_order_when_shorting_equity_without_margin_account( - mut msgbus: MessageBus, - order_event_handler: ShareableMessageHandler, - account_id: AccountId, - time: AtomicTime, - equity_aapl: Equity, - ) { - let instrument = InstrumentAny::Equity(equity_aapl); - // Register saving message handler to exec engine endpoint - msgbus.register( - msgbus.switchboard.exec_engine_process, - order_event_handler.clone(), - ); - - // Create engine and process order - let mut engine = get_order_matching_engine( - instrument.clone(), - Rc::new(RefCell::new(msgbus)), - None, - None, - None, - ); - let order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument.id()) - .side(OrderSide::Sell) - .quantity(Quantity::from("1")) - .build(); - - engine.process_order(&order, account_id); - - // Get messages and test - let saved_messages = get_order_event_handler_messages(order_event_handler); - assert_eq!(saved_messages.len(), 1); - let first_message = saved_messages.first().unwrap(); - assert_eq!(first_message.event_type(), OrderEventType::Rejected); - assert_eq!( - first_message.message().unwrap(), - Ustr::from( - "Short selling not permitted on a CASH account with position None and order \ - MarketOrder(SELL 1 AAPL.XNAS @ MARKET GTC, status=INITIALIZED, client_order_id=O-19700101-000000-001-001-1, \ - venue_order_id=None, position_id=None, exec_algorithm_id=None, \ - exec_spawn_id=None, tags=None)") - ); - } - - #[rstest] - fn test_process_order_when_invalid_reduce_only( - mut msgbus: MessageBus, - order_event_handler: ShareableMessageHandler, - account_id: AccountId, - time: AtomicTime, - instrument_es: InstrumentAny, - engine_config: OrderMatchingEngineConfig, - ) { - // Register saving message handler to exec engine endpoint - msgbus.register( - msgbus.switchboard.exec_engine_process, - order_event_handler.clone(), - ); - - let mut engine = get_order_matching_engine( - instrument_es.clone(), - Rc::new(RefCell::new(msgbus)), - None, - None, - Some(engine_config), - ); - let market_order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument_es.id()) - .side(OrderSide::Buy) - .quantity(Quantity::from("1")) - .reduce_only(true) - .build(); - - engine.process_order(&market_order, account_id); - - // Get messages and test - let saved_messages = get_order_event_handler_messages(order_event_handler); - assert_eq!(saved_messages.len(), 1); - let first_message = saved_messages.first().unwrap(); - assert_eq!(first_message.event_type(), OrderEventType::Rejected); - assert_eq!( - first_message.message().unwrap(), - Ustr::from("Reduce-only order O-19700101-000000-001-001-1 (MARKET-BUY) would have increased position") - ); - } - - #[rstest] - fn test_process_order_when_invalid_contingent_orders( - mut msgbus: MessageBus, - order_event_handler: ShareableMessageHandler, - account_id: AccountId, - time: AtomicTime, - instrument_es: InstrumentAny, - engine_config: OrderMatchingEngineConfig, - ) { - // Register saving message handler to exec engine endpoint - msgbus.register( - msgbus.switchboard.exec_engine_process, - order_event_handler.clone(), - ); - - let cache = Rc::new(RefCell::new(Cache::default())); - let mut engine = get_order_matching_engine( - instrument_es.clone(), - Rc::new(RefCell::new(msgbus)), - Some(cache.clone()), - None, - Some(engine_config), - ); - - let entry_client_order_id = ClientOrderId::from("O-19700101-000000-001-001-1"); - let stop_loss_client_order_id = ClientOrderId::from("O-19700101-000000-001-001-2"); - - // Create entry market order - let mut entry_order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument_es.id()) - .side(OrderSide::Buy) - .quantity(Quantity::from(1)) - .contingency_type(ContingencyType::Oto) - .client_order_id(entry_client_order_id) - .build(); - // Set entry order status to Rejected with proper event - let rejected_event = OrderRejected::default(); - entry_order - .apply(OrderEventAny::Rejected(rejected_event)) - .unwrap(); - - // Create stop loss order - let stop_order = OrderTestBuilder::new(OrderType::StopMarket) - .instrument_id(instrument_es.id()) - .side(OrderSide::Sell) - .trigger_price(Price::from("0.95")) - .quantity(Quantity::from(1)) - .contingency_type(ContingencyType::Oto) - .client_order_id(stop_loss_client_order_id) - .parent_order_id(entry_client_order_id) - .build(); - // Make it Accepted - let accepted_stop_order = TestOrderStubs::make_accepted_order(&stop_order); - - // 1. Save entry order in the cache as it will be loaded by the matching engine - // 2. Send the stop loss order which has parent of entry order - cache - .as_ref() - .borrow_mut() - .add_order(entry_order.clone(), None, None, false) - .unwrap(); - engine.process_order(&accepted_stop_order, account_id); - - // Get messages and test - let saved_messages = get_order_event_handler_messages(order_event_handler); - assert_eq!(saved_messages.len(), 1); - let first_message = saved_messages.first().unwrap(); - assert_eq!(first_message.event_type(), OrderEventType::Rejected); - assert_eq!( - first_message.message().unwrap(), - Ustr::from(format!("Rejected OTO order from {entry_client_order_id}").as_str()) - ); - } - - #[rstest] - fn test_process_order_when_closed_linked_order( - mut msgbus: MessageBus, - order_event_handler: ShareableMessageHandler, - account_id: AccountId, - time: AtomicTime, - instrument_es: InstrumentAny, - engine_config: OrderMatchingEngineConfig, - ) { - // Register saving message handler to exec engine endpoint - msgbus.register( - msgbus.switchboard.exec_engine_process, - order_event_handler.clone(), - ); - - let cache = Rc::new(RefCell::new(Cache::default())); - let mut engine = get_order_matching_engine( - instrument_es.clone(), - Rc::new(RefCell::new(msgbus)), - Some(cache.clone()), - None, - Some(engine_config), - ); - - let stop_loss_client_order_id = ClientOrderId::from("O-19700101-000000-001-001-2"); - let take_profit_client_order_id = ClientOrderId::from("O-19700101-000000-001-001-3"); - // Create two linked orders: stop loss and take profit - let mut stop_loss_order = OrderTestBuilder::new(OrderType::StopMarket) - .instrument_id(instrument_es.id()) - .side(OrderSide::Sell) - .trigger_price(Price::from("0.95")) - .quantity(Quantity::from(1)) - .contingency_type(ContingencyType::Oco) - .client_order_id(stop_loss_client_order_id) - .linked_order_ids(vec![take_profit_client_order_id]) - .build(); - let take_profit_order = OrderTestBuilder::new(OrderType::MarketIfTouched) - .instrument_id(instrument_es.id()) - .side(OrderSide::Sell) - .trigger_price(Price::from("1.1")) - .quantity(Quantity::from(1)) - .contingency_type(ContingencyType::Oco) - .client_order_id(take_profit_client_order_id) - .linked_order_ids(vec![stop_loss_client_order_id]) - .build(); - // Set stop loss order status to Rejected with proper event - let rejected_event: OrderRejected = OrderRejectedBuilder::default() - .client_order_id(stop_loss_client_order_id) - .reason(Ustr::from("Rejected")) - .build() - .unwrap(); - stop_loss_order - .apply(OrderEventAny::Rejected(rejected_event)) - .unwrap(); - - // Make take profit order Accepted - let accepted_take_profit = TestOrderStubs::make_accepted_order(&take_profit_order); - - // 1. Save stop loss order in cache which is rejected and closed is set to true - // 2. Send the take profit order which has linked the stop loss order - cache - .as_ref() - .borrow_mut() - .add_order(stop_loss_order.clone(), None, None, false) - .unwrap(); - let stop_loss_closed_after = stop_loss_order.is_closed(); - engine.process_order(&accepted_take_profit, account_id); - - // Get messages and test - let saved_messages = get_order_event_handler_messages(order_event_handler); - assert_eq!(saved_messages.len(), 1); - let first_message = saved_messages.first().unwrap(); - assert_eq!(first_message.event_type(), OrderEventType::Rejected); - assert_eq!( - first_message.message().unwrap(), - Ustr::from( - format!("Contingent order {stop_loss_client_order_id} already closed").as_str() - ) - ); - } - - #[rstest] - fn test_process_market_order_no_market_rejected( - mut msgbus: MessageBus, - order_event_handler: ShareableMessageHandler, - account_id: AccountId, - time: AtomicTime, - instrument_es: InstrumentAny, - ) { - // Register saving message handler to exec engine endpoint - msgbus.register( - msgbus.switchboard.exec_engine_process, - order_event_handler.clone(), - ); - - // Create engine and process order - let mut engine = get_order_matching_engine( - instrument_es.clone(), - Rc::new(RefCell::new(msgbus)), - None, - None, - None, - ); - let market_order_buy = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument_es.id()) - .side(OrderSide::Buy) - .quantity(Quantity::from("1")) - .build(); - let market_order_sell = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument_es.id()) - .side(OrderSide::Sell) - .quantity(Quantity::from("1")) - .build(); - - engine.process_order(&market_order_buy, account_id); - engine.process_order(&market_order_sell, account_id); - - // Get messages and test - let saved_messages = get_order_event_handler_messages(order_event_handler); - assert_eq!(saved_messages.len(), 2); - let first = saved_messages.first().unwrap(); - let second = saved_messages.get(1).unwrap(); - assert_eq!(first.event_type(), OrderEventType::Rejected); - assert_eq!(second.event_type(), OrderEventType::Rejected); - assert_eq!( - first.message().unwrap(), - Ustr::from("No market for ESZ1.GLBX") - ); - assert_eq!( - second.message().unwrap(), - Ustr::from("No market for ESZ1.GLBX") - ); - } - - #[rstest] - fn test_matching_core_bid_ask_initialized( - msgbus: MessageBus, - order_event_handler: ShareableMessageHandler, - account_id: AccountId, - time: AtomicTime, - instrument_es: InstrumentAny, - ) { - let mut engine_l2 = get_order_matching_engine_l2( - instrument_es.clone(), - Rc::new(RefCell::new(msgbus)), - None, - None, - None, - ); - // Create bid and ask orderbook delta and check if - // bid and ask are initialized in order matching core - let orderbook_delta_buy = OrderBookDelta::new( - instrument_es.id(), - BookAction::Add, - BookOrder::new(OrderSide::Buy, Price::from("100"), Quantity::from("1"), 0), - 0, - 0, - UnixNanos::from(0), - UnixNanos::from(0), - ); - let orderbook_delta_sell = OrderBookDelta::new( - instrument_es.id(), - BookAction::Add, - BookOrder::new(OrderSide::Sell, Price::from("101"), Quantity::from("1"), 1), - 0, - 1, - UnixNanos::from(1), - UnixNanos::from(1), - ); - - engine_l2.process_order_book_delta(&orderbook_delta_buy); - assert_eq!(engine_l2.core.bid, Some(Price::from("100"))); - assert!(engine_l2.core.is_bid_initialized); - assert_eq!(engine_l2.core.ask, None); - assert!(!engine_l2.core.is_ask_initialized); - - engine_l2.process_order_book_delta(&orderbook_delta_sell); - assert_eq!(engine_l2.core.bid, Some(Price::from("100"))); - assert!(engine_l2.core.is_bid_initialized); - assert_eq!(engine_l2.core.ask, Some(Price::from("101"))); - assert!(engine_l2.core.is_ask_initialized); - } - - #[rstest] - fn test_generate_venue_position_id( - order_event_handler: ShareableMessageHandler, - account_id: AccountId, - time: AtomicTime, - crypto_perpetual_ethusdt: CryptoPerpetual, - ) { - let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); - // Create two order matching engines with different configs - // one with and other without position ids - let config_no_position_id = OrderMatchingEngineConfig { - use_position_ids: false, - ..OrderMatchingEngineConfig::default() - }; - let mut engine_no_position_id = get_order_matching_engine_l2( - instrument.clone(), - Rc::new(RefCell::new(MessageBus::default())), - None, - None, - Some(config_no_position_id), - ); - - let config_with_position_id = OrderMatchingEngineConfig { - use_position_ids: true, - ..OrderMatchingEngineConfig::default() - }; - let mut engine_with_position_id = get_order_matching_engine_l2( - instrument, - Rc::new(RefCell::new(MessageBus::default())), - None, - None, - Some(config_with_position_id), - ); - - // Engine which doesnt have position id should return None - assert_eq!(engine_no_position_id.generate_venue_position_id(), None); - - // Engine which has position id should return position id in incrementing order - let position_id_1 = engine_with_position_id.generate_venue_position_id(); - let position_id_2 = engine_with_position_id.generate_venue_position_id(); - assert_eq!(position_id_1, Some(PositionId::new("BINANCE-1-1"))); - assert_eq!(position_id_2, Some(PositionId::new("BINANCE-1-2"))); - } - - #[rstest] - fn test_get_position_id_hedging_with_existing_position( - order_event_handler: ShareableMessageHandler, - account_id: AccountId, - time: AtomicTime, - crypto_perpetual_ethusdt: CryptoPerpetual, - ) { - let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); - let cache = Rc::new(RefCell::new(Cache::default())); - - // Create oms type hedging engine - let mut engine = OrderMatchingEngine::new( - instrument.clone(), - 1, - FillModel::default(), - BookType::L1_MBP, - OmsType::Hedging, - AccountType::Cash, - &ATOMIC_TIME, - Rc::new(RefCell::new(MessageBus::default())), - cache, - OrderMatchingEngineConfig::default(), - ); - - // Create position, order and order filled event - let order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument.id().clone()) - .side(OrderSide::Buy) - .quantity(Quantity::from("1")) - .build(); - let order_filled = OrderFilled::new( - order.trader_id(), - order.strategy_id(), - order.instrument_id(), - order.client_order_id(), - VenueOrderId::new("BINANCE-1"), - account_id, - TradeId::new("1"), - order.order_side(), - order.order_type(), - Quantity::from("1"), - Price::from("1000"), - instrument.quote_currency(), - LiquiditySide::Taker, - UUID4::new(), - UnixNanos::default(), - UnixNanos::default(), - false, - Some(PositionId::new("P-1")), - None, - ); - let position = Position::new(&instrument, order_filled); - - // Add position to cache - engine - .cache - .borrow_mut() - .add_position(position.clone(), engine.oms_type) - .unwrap(); - - let position_id = engine.get_position_id(&order, None); - assert_eq!(position_id, Some(position.id)); - } - - #[rstest] - fn test_get_position_id_hedging_with_generated_position( - order_event_handler: ShareableMessageHandler, - account_id: AccountId, - time: AtomicTime, - crypto_perpetual_ethusdt: CryptoPerpetual, - ) { - let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); - let cache = Rc::new(RefCell::new(Cache::default())); - - // Use order matching config with position ids - let config_with_position_id = OrderMatchingEngineConfig { - use_position_ids: true, - ..OrderMatchingEngineConfig::default() - }; - // Create oms type hedging engine - let mut engine = OrderMatchingEngine::new( - instrument.clone(), - 1, - FillModel::default(), - BookType::L1_MBP, - OmsType::Hedging, - AccountType::Cash, - &ATOMIC_TIME, - Rc::new(RefCell::new(MessageBus::default())), - cache, - config_with_position_id, - ); - let order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument.id().clone()) - .side(OrderSide::Buy) - .quantity(Quantity::from("1")) - .build(); - - let position_id = engine.get_position_id(&order, None); - assert_eq!(position_id, Some(PositionId::new("BINANCE-1-1"))); - } -} diff --git a/nautilus_core/backtest/src/matching_engine/tests.rs b/nautilus_core/backtest/src/matching_engine/tests.rs new file mode 100644 index 000000000000..cb375967de2a --- /dev/null +++ b/nautilus_core/backtest/src/matching_engine/tests.rs @@ -0,0 +1,868 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use std::{cell::RefCell, rc::Rc, sync::LazyLock}; + +use chrono::{TimeZone, Utc}; +use nautilus_common::{ + cache::Cache, + msgbus::{ + handler::ShareableMessageHandler, + stubs::{get_message_saving_handler, get_saved_messages}, + MessageBus, + }, +}; +use nautilus_core::{nanos::UnixNanos, time::AtomicTime, uuid::UUID4}; +use nautilus_model::{ + data::{delta::OrderBookDelta, order::BookOrder}, + enums::{ + AccountType, BookAction, BookType, ContingencyType, LiquiditySide, OmsType, OrderSide, + OrderType, + }, + events::order::{ + rejected::OrderRejectedBuilder, OrderEventAny, OrderEventType, OrderFilled, OrderRejected, + }, + identifiers::{AccountId, ClientOrderId, PositionId, TradeId, VenueOrderId}, + instruments::{ + any::InstrumentAny, + crypto_perpetual::CryptoPerpetual, + equity::Equity, + stubs::{crypto_perpetual_ethusdt, equity_aapl, futures_contract_es}, + }, + orders::{builder::OrderTestBuilder, stubs::TestOrderStubs}, + position::Position, + types::{price::Price, quantity::Quantity}, +}; +use rstest::{fixture, rstest}; +use ustr::Ustr; + +use crate::{ + matching_engine::{config::OrderMatchingEngineConfig, OrderMatchingEngine}, + models::fill::FillModel, +}; + +static ATOMIC_TIME: LazyLock = + LazyLock::new(|| AtomicTime::new(true, UnixNanos::default())); + +#[fixture] +fn msgbus() -> MessageBus { + MessageBus::default() +} + +#[fixture] +fn account_id() -> AccountId { + AccountId::from("SIM-001") +} + +#[fixture] +fn time() -> AtomicTime { + AtomicTime::new(true, UnixNanos::default()) +} + +#[fixture] +fn order_event_handler() -> ShareableMessageHandler { + get_message_saving_handler::(Some(Ustr::from("ExecEngine.process"))) +} + +// For valid ES futures contract currently active +#[fixture] +fn instrument_es() -> InstrumentAny { + let activation = UnixNanos::from( + Utc.with_ymd_and_hms(2022, 4, 8, 0, 0, 0) + .unwrap() + .timestamp_nanos_opt() + .unwrap() as u64, + ); + let expiration = UnixNanos::from( + Utc.with_ymd_and_hms(2100, 7, 8, 0, 0, 0) + .unwrap() + .timestamp_nanos_opt() + .unwrap() as u64, + ); + InstrumentAny::FuturesContract(futures_contract_es(Some(activation), Some(expiration))) +} + +#[fixture] +fn engine_config() -> OrderMatchingEngineConfig { + OrderMatchingEngineConfig { + bar_execution: false, + reject_stop_orders: false, + support_gtd_orders: false, + support_contingent_orders: true, + use_position_ids: false, + use_random_ids: false, + use_reduce_only: true, + } +} +// -- HELPERS --------------------------------------------------------------------------- + +fn get_order_matching_engine( + instrument: InstrumentAny, + msgbus: Rc>, + cache: Option>>, + account_type: Option, + config: Option, +) -> OrderMatchingEngine { + let cache = cache.unwrap_or(Rc::new(RefCell::new(Cache::default()))); + let config = config.unwrap_or_default(); + OrderMatchingEngine::new( + instrument, + 1, + FillModel::default(), + BookType::L1_MBP, + OmsType::Netting, + account_type.unwrap_or(AccountType::Cash), + &ATOMIC_TIME, + msgbus, + cache, + config, + ) +} + +fn get_order_matching_engine_l2( + instrument: InstrumentAny, + msgbus: Rc>, + cache: Option>>, + account_type: Option, + config: Option, +) -> OrderMatchingEngine { + let cache = cache.unwrap_or(Rc::new(RefCell::new(Cache::default()))); + let config = config.unwrap_or_default(); + OrderMatchingEngine::new( + instrument, + 1, + FillModel::default(), + BookType::L2_MBP, + OmsType::Netting, + account_type.unwrap_or(AccountType::Cash), + &ATOMIC_TIME, + msgbus, + cache, + config, + ) +} + +fn get_order_event_handler_messages(event_handler: ShareableMessageHandler) -> Vec { + get_saved_messages::(event_handler) +} + +// -- TESTS ----------------------------------------------------------------------------------- + +#[rstest] +fn test_process_order_when_instrument_already_expired( + mut msgbus: MessageBus, + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, +) { + let instrument = InstrumentAny::FuturesContract(futures_contract_es(None, None)); + + // Register saving message handler to exec engine endpoint + msgbus.register( + msgbus.switchboard.exec_engine_process, + order_event_handler.clone(), + ); + + // Create engine and process order + let mut engine = get_order_matching_engine( + instrument.clone(), + Rc::new(RefCell::new(msgbus)), + None, + None, + None, + ); + let order = OrderTestBuilder::new(OrderType::Market) + .instrument_id(instrument.id()) + .side(OrderSide::Buy) + .quantity(Quantity::from("1")) + .build(); + + engine.process_order(&order, account_id); + + // Get messages and test + let saved_messages = get_order_event_handler_messages(order_event_handler); + assert_eq!(saved_messages.len(), 1); + let first_message = saved_messages.first().unwrap(); + assert_eq!(first_message.event_type(), OrderEventType::Rejected); + assert_eq!( + first_message.message().unwrap(), + Ustr::from("Contract ESZ1.GLBX has expired, expiration 1625702400000000000") + ); +} + +#[rstest] +fn test_process_order_when_instrument_not_active( + mut msgbus: MessageBus, + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, +) { + let activation = UnixNanos::from( + Utc.with_ymd_and_hms(2222, 4, 8, 0, 0, 0) + .unwrap() + .timestamp_nanos_opt() + .unwrap() as u64, + ); + let expiration = UnixNanos::from( + Utc.with_ymd_and_hms(2223, 7, 8, 0, 0, 0) + .unwrap() + .timestamp_nanos_opt() + .unwrap() as u64, + ); + let instrument = + InstrumentAny::FuturesContract(futures_contract_es(Some(activation), Some(expiration))); + + // Register saving message handler to exec engine endpoint + msgbus.register( + msgbus.switchboard.exec_engine_process, + order_event_handler.clone(), + ); + + // Create engine and process order + let mut engine = get_order_matching_engine( + instrument.clone(), + Rc::new(RefCell::new(msgbus)), + None, + None, + None, + ); + let order = OrderTestBuilder::new(OrderType::Market) + .instrument_id(instrument.id()) + .side(OrderSide::Buy) + .quantity(Quantity::from("1")) + .build(); + + engine.process_order(&order, account_id); + + // Get messages and test + let saved_messages = get_order_event_handler_messages(order_event_handler); + assert_eq!(saved_messages.len(), 1); + let first_message = saved_messages.first().unwrap(); + assert_eq!(first_message.event_type(), OrderEventType::Rejected); + assert_eq!( + first_message.message().unwrap(), + Ustr::from("Contract ESZ1.GLBX is not yet active, activation 7960723200000000000") + ); +} + +#[rstest] +fn test_process_order_when_invalid_quantity_precision( + mut msgbus: MessageBus, + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, + instrument_es: InstrumentAny, +) { + // Register saving message handler to exec engine endpoint + msgbus.register( + msgbus.switchboard.exec_engine_process, + order_event_handler.clone(), + ); + + // Create engine and process order + let mut engine = get_order_matching_engine( + instrument_es.clone(), + Rc::new(RefCell::new(msgbus)), + None, + None, + None, + ); + let order = OrderTestBuilder::new(OrderType::Market) + .instrument_id(instrument_es.id()) + .side(OrderSide::Buy) + .quantity(Quantity::from("1.122")) + .build(); + + engine.process_order(&order, account_id); + + // Get messages and test + let saved_messages = get_order_event_handler_messages(order_event_handler); + assert_eq!(saved_messages.len(), 1); + let first_message = saved_messages.first().unwrap(); + assert_eq!(first_message.event_type(), OrderEventType::Rejected); + assert_eq!( + first_message.message().unwrap(), + Ustr::from("Invalid order quantity precision for order O-19700101-000000-001-001-1, was 3 when ESZ1.GLBX size precision is 0") + ); +} + +#[rstest] +fn test_process_order_when_invalid_price_precision( + mut msgbus: MessageBus, + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, + instrument_es: InstrumentAny, +) { + // Register saving message handler to exec engine endpoint + msgbus.register( + msgbus.switchboard.exec_engine_process, + order_event_handler.clone(), + ); + + // Create engine and process order + let mut engine = get_order_matching_engine( + instrument_es.clone(), + Rc::new(RefCell::new(msgbus)), + None, + None, + None, + ); + + let limit_order = OrderTestBuilder::new(OrderType::Limit) + .instrument_id(instrument_es.id()) + .side(OrderSide::Sell) + .price(Price::from("100.12333")) // <- wrong price precision for es futures contract (which is 2) + .quantity(Quantity::from("1")) + .build(); + + engine.process_order(&limit_order, account_id); + + // Get messages and test + let saved_messages = get_order_event_handler_messages(order_event_handler); + assert_eq!(saved_messages.len(), 1); + let first_message = saved_messages.first().unwrap(); + assert_eq!(first_message.event_type(), OrderEventType::Rejected); + assert_eq!( + first_message.message().unwrap(), + Ustr::from("Invalid order price precision for order O-19700101-000000-001-001-1, was 5 when ESZ1.GLBX price precision is 2") + ); +} + +#[rstest] +fn test_process_order_when_invalid_trigger_price_precision( + mut msgbus: MessageBus, + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, + instrument_es: InstrumentAny, +) { + // Register saving message handler to exec engine endpoint + msgbus.register( + msgbus.switchboard.exec_engine_process, + order_event_handler.clone(), + ); + + // Create engine and process order + let mut engine = get_order_matching_engine( + instrument_es.clone(), + Rc::new(RefCell::new(msgbus)), + None, + None, + None, + ); + let stop_order = OrderTestBuilder::new(OrderType::StopMarket) + .instrument_id(instrument_es.id()) + .side(OrderSide::Sell) + .trigger_price(Price::from("100.12333")) // <- wrong trigger price precision for es futures contract (which is 2) + .quantity(Quantity::from("1")) + .build(); + + engine.process_order(&stop_order, account_id); + + // Get messages and test + let saved_messages = get_order_event_handler_messages(order_event_handler); + assert_eq!(saved_messages.len(), 1); + let first_message = saved_messages.first().unwrap(); + assert_eq!(first_message.event_type(), OrderEventType::Rejected); + assert_eq!( + first_message.message().unwrap(), + Ustr::from("Invalid order trigger price precision for order O-19700101-000000-001-001-1, was 5 when ESZ1.GLBX price precision is 2") + ); +} + +#[rstest] +fn test_process_order_when_shorting_equity_without_margin_account( + mut msgbus: MessageBus, + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, + equity_aapl: Equity, +) { + let instrument = InstrumentAny::Equity(equity_aapl); + // Register saving message handler to exec engine endpoint + msgbus.register( + msgbus.switchboard.exec_engine_process, + order_event_handler.clone(), + ); + + // Create engine and process order + let mut engine = get_order_matching_engine( + instrument.clone(), + Rc::new(RefCell::new(msgbus)), + None, + None, + None, + ); + let order = OrderTestBuilder::new(OrderType::Market) + .instrument_id(instrument.id()) + .side(OrderSide::Sell) + .quantity(Quantity::from("1")) + .build(); + + engine.process_order(&order, account_id); + + // Get messages and test + let saved_messages = get_order_event_handler_messages(order_event_handler); + assert_eq!(saved_messages.len(), 1); + let first_message = saved_messages.first().unwrap(); + assert_eq!(first_message.event_type(), OrderEventType::Rejected); + assert_eq!( + first_message.message().unwrap(), + Ustr::from( + "Short selling not permitted on a CASH account with position None and order \ + MarketOrder(SELL 1 AAPL.XNAS @ MARKET GTC, status=INITIALIZED, client_order_id=O-19700101-000000-001-001-1, \ + venue_order_id=None, position_id=None, exec_algorithm_id=None, \ + exec_spawn_id=None, tags=None)") + ); +} + +#[rstest] +fn test_process_order_when_invalid_reduce_only( + mut msgbus: MessageBus, + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, + instrument_es: InstrumentAny, + engine_config: OrderMatchingEngineConfig, +) { + // Register saving message handler to exec engine endpoint + msgbus.register( + msgbus.switchboard.exec_engine_process, + order_event_handler.clone(), + ); + + let mut engine = get_order_matching_engine( + instrument_es.clone(), + Rc::new(RefCell::new(msgbus)), + None, + None, + Some(engine_config), + ); + let market_order = OrderTestBuilder::new(OrderType::Market) + .instrument_id(instrument_es.id()) + .side(OrderSide::Buy) + .quantity(Quantity::from("1")) + .reduce_only(true) + .build(); + + engine.process_order(&market_order, account_id); + + // Get messages and test + let saved_messages = get_order_event_handler_messages(order_event_handler); + assert_eq!(saved_messages.len(), 1); + let first_message = saved_messages.first().unwrap(); + assert_eq!(first_message.event_type(), OrderEventType::Rejected); + assert_eq!( + first_message.message().unwrap(), + Ustr::from("Reduce-only order O-19700101-000000-001-001-1 (MARKET-BUY) would have increased position") + ); +} + +#[rstest] +fn test_process_order_when_invalid_contingent_orders( + mut msgbus: MessageBus, + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, + instrument_es: InstrumentAny, + engine_config: OrderMatchingEngineConfig, +) { + // Register saving message handler to exec engine endpoint + msgbus.register( + msgbus.switchboard.exec_engine_process, + order_event_handler.clone(), + ); + + let cache = Rc::new(RefCell::new(Cache::default())); + let mut engine = get_order_matching_engine( + instrument_es.clone(), + Rc::new(RefCell::new(msgbus)), + Some(cache.clone()), + None, + Some(engine_config), + ); + + let entry_client_order_id = ClientOrderId::from("O-19700101-000000-001-001-1"); + let stop_loss_client_order_id = ClientOrderId::from("O-19700101-000000-001-001-2"); + + // Create entry market order + let mut entry_order = OrderTestBuilder::new(OrderType::Market) + .instrument_id(instrument_es.id()) + .side(OrderSide::Buy) + .quantity(Quantity::from(1)) + .contingency_type(ContingencyType::Oto) + .client_order_id(entry_client_order_id) + .build(); + // Set entry order status to Rejected with proper event + let rejected_event = OrderRejected::default(); + entry_order + .apply(OrderEventAny::Rejected(rejected_event)) + .unwrap(); + + // Create stop loss order + let stop_order = OrderTestBuilder::new(OrderType::StopMarket) + .instrument_id(instrument_es.id()) + .side(OrderSide::Sell) + .trigger_price(Price::from("0.95")) + .quantity(Quantity::from(1)) + .contingency_type(ContingencyType::Oto) + .client_order_id(stop_loss_client_order_id) + .parent_order_id(entry_client_order_id) + .build(); + // Make it Accepted + let accepted_stop_order = TestOrderStubs::make_accepted_order(&stop_order); + + // 1. Save entry order in the cache as it will be loaded by the matching engine + // 2. Send the stop loss order which has parent of entry order + cache + .as_ref() + .borrow_mut() + .add_order(entry_order.clone(), None, None, false) + .unwrap(); + engine.process_order(&accepted_stop_order, account_id); + + // Get messages and test + let saved_messages = get_order_event_handler_messages(order_event_handler); + assert_eq!(saved_messages.len(), 1); + let first_message = saved_messages.first().unwrap(); + assert_eq!(first_message.event_type(), OrderEventType::Rejected); + assert_eq!( + first_message.message().unwrap(), + Ustr::from(format!("Rejected OTO order from {entry_client_order_id}").as_str()) + ); +} + +#[rstest] +fn test_process_order_when_closed_linked_order( + mut msgbus: MessageBus, + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, + instrument_es: InstrumentAny, + engine_config: OrderMatchingEngineConfig, +) { + // Register saving message handler to exec engine endpoint + msgbus.register( + msgbus.switchboard.exec_engine_process, + order_event_handler.clone(), + ); + + let cache = Rc::new(RefCell::new(Cache::default())); + let mut engine = get_order_matching_engine( + instrument_es.clone(), + Rc::new(RefCell::new(msgbus)), + Some(cache.clone()), + None, + Some(engine_config), + ); + + let stop_loss_client_order_id = ClientOrderId::from("O-19700101-000000-001-001-2"); + let take_profit_client_order_id = ClientOrderId::from("O-19700101-000000-001-001-3"); + // Create two linked orders: stop loss and take profit + let mut stop_loss_order = OrderTestBuilder::new(OrderType::StopMarket) + .instrument_id(instrument_es.id()) + .side(OrderSide::Sell) + .trigger_price(Price::from("0.95")) + .quantity(Quantity::from(1)) + .contingency_type(ContingencyType::Oco) + .client_order_id(stop_loss_client_order_id) + .linked_order_ids(vec![take_profit_client_order_id]) + .build(); + let take_profit_order = OrderTestBuilder::new(OrderType::MarketIfTouched) + .instrument_id(instrument_es.id()) + .side(OrderSide::Sell) + .trigger_price(Price::from("1.1")) + .quantity(Quantity::from(1)) + .contingency_type(ContingencyType::Oco) + .client_order_id(take_profit_client_order_id) + .linked_order_ids(vec![stop_loss_client_order_id]) + .build(); + // Set stop loss order status to Rejected with proper event + let rejected_event: OrderRejected = OrderRejectedBuilder::default() + .client_order_id(stop_loss_client_order_id) + .reason(Ustr::from("Rejected")) + .build() + .unwrap(); + stop_loss_order + .apply(OrderEventAny::Rejected(rejected_event)) + .unwrap(); + + // Make take profit order Accepted + let accepted_take_profit = TestOrderStubs::make_accepted_order(&take_profit_order); + + // 1. Save stop loss order in cache which is rejected and closed is set to true + // 2. Send the take profit order which has linked the stop loss order + cache + .as_ref() + .borrow_mut() + .add_order(stop_loss_order.clone(), None, None, false) + .unwrap(); + let stop_loss_closed_after = stop_loss_order.is_closed(); + engine.process_order(&accepted_take_profit, account_id); + + // Get messages and test + let saved_messages = get_order_event_handler_messages(order_event_handler); + assert_eq!(saved_messages.len(), 1); + let first_message = saved_messages.first().unwrap(); + assert_eq!(first_message.event_type(), OrderEventType::Rejected); + assert_eq!( + first_message.message().unwrap(), + Ustr::from(format!("Contingent order {stop_loss_client_order_id} already closed").as_str()) + ); +} + +#[rstest] +fn test_process_market_order_no_market_rejected( + mut msgbus: MessageBus, + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, + instrument_es: InstrumentAny, +) { + // Register saving message handler to exec engine endpoint + msgbus.register( + msgbus.switchboard.exec_engine_process, + order_event_handler.clone(), + ); + + // Create engine and process order + let mut engine = get_order_matching_engine( + instrument_es.clone(), + Rc::new(RefCell::new(msgbus)), + None, + None, + None, + ); + let market_order_buy = OrderTestBuilder::new(OrderType::Market) + .instrument_id(instrument_es.id()) + .side(OrderSide::Buy) + .quantity(Quantity::from("1")) + .build(); + let market_order_sell = OrderTestBuilder::new(OrderType::Market) + .instrument_id(instrument_es.id()) + .side(OrderSide::Sell) + .quantity(Quantity::from("1")) + .build(); + + engine.process_order(&market_order_buy, account_id); + engine.process_order(&market_order_sell, account_id); + + // Get messages and test + let saved_messages = get_order_event_handler_messages(order_event_handler); + assert_eq!(saved_messages.len(), 2); + let first = saved_messages.first().unwrap(); + let second = saved_messages.get(1).unwrap(); + assert_eq!(first.event_type(), OrderEventType::Rejected); + assert_eq!(second.event_type(), OrderEventType::Rejected); + assert_eq!( + first.message().unwrap(), + Ustr::from("No market for ESZ1.GLBX") + ); + assert_eq!( + second.message().unwrap(), + Ustr::from("No market for ESZ1.GLBX") + ); +} + +#[rstest] +fn test_matching_core_bid_ask_initialized( + msgbus: MessageBus, + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, + instrument_es: InstrumentAny, +) { + let mut engine_l2 = get_order_matching_engine_l2( + instrument_es.clone(), + Rc::new(RefCell::new(msgbus)), + None, + None, + None, + ); + // Create bid and ask orderbook delta and check if + // bid and ask are initialized in order matching core + let orderbook_delta_buy = OrderBookDelta::new( + instrument_es.id(), + BookAction::Add, + BookOrder::new(OrderSide::Buy, Price::from("100"), Quantity::from("1"), 0), + 0, + 0, + UnixNanos::from(0), + UnixNanos::from(0), + ); + let orderbook_delta_sell = OrderBookDelta::new( + instrument_es.id(), + BookAction::Add, + BookOrder::new(OrderSide::Sell, Price::from("101"), Quantity::from("1"), 1), + 0, + 1, + UnixNanos::from(1), + UnixNanos::from(1), + ); + + engine_l2.process_order_book_delta(&orderbook_delta_buy); + assert_eq!(engine_l2.core.bid, Some(Price::from("100"))); + assert!(engine_l2.core.is_bid_initialized); + assert_eq!(engine_l2.core.ask, None); + assert!(!engine_l2.core.is_ask_initialized); + + engine_l2.process_order_book_delta(&orderbook_delta_sell); + assert_eq!(engine_l2.core.bid, Some(Price::from("100"))); + assert!(engine_l2.core.is_bid_initialized); + assert_eq!(engine_l2.core.ask, Some(Price::from("101"))); + assert!(engine_l2.core.is_ask_initialized); +} + +#[rstest] +fn test_generate_venue_position_id( + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, + crypto_perpetual_ethusdt: CryptoPerpetual, +) { + let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); + // Create two order matching engines with different configs + // one with and other without position ids + let config_no_position_id = OrderMatchingEngineConfig { + use_position_ids: false, + ..OrderMatchingEngineConfig::default() + }; + let mut engine_no_position_id = get_order_matching_engine_l2( + instrument.clone(), + Rc::new(RefCell::new(MessageBus::default())), + None, + None, + Some(config_no_position_id), + ); + + let config_with_position_id = OrderMatchingEngineConfig { + use_position_ids: true, + ..OrderMatchingEngineConfig::default() + }; + let mut engine_with_position_id = get_order_matching_engine_l2( + instrument, + Rc::new(RefCell::new(MessageBus::default())), + None, + None, + Some(config_with_position_id), + ); + + // Engine which doesnt have position id should return None + assert_eq!(engine_no_position_id.generate_venue_position_id(), None); + + // Engine which has position id should return position id in incrementing order + let position_id_1 = engine_with_position_id.generate_venue_position_id(); + let position_id_2 = engine_with_position_id.generate_venue_position_id(); + assert_eq!(position_id_1, Some(PositionId::new("BINANCE-1-1"))); + assert_eq!(position_id_2, Some(PositionId::new("BINANCE-1-2"))); +} + +#[rstest] +fn test_get_position_id_hedging_with_existing_position( + order_event_handler: ShareableMessageHandler, + account_id: AccountId, + time: AtomicTime, + crypto_perpetual_ethusdt: CryptoPerpetual, +) { + let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); + let cache = Rc::new(RefCell::new(Cache::default())); + + // Create oms type hedging engine + let mut engine = OrderMatchingEngine::new( + instrument.clone(), + 1, + FillModel::default(), + BookType::L1_MBP, + OmsType::Hedging, + AccountType::Cash, + &ATOMIC_TIME, + Rc::new(RefCell::new(MessageBus::default())), + cache, + OrderMatchingEngineConfig::default(), + ); + + // Create position, order and order filled event + let order = OrderTestBuilder::new(OrderType::Market) + .instrument_id(instrument.id().clone()) + .side(OrderSide::Buy) + .quantity(Quantity::from("1")) + .build(); + let order_filled = OrderFilled::new( + order.trader_id(), + order.strategy_id(), + order.instrument_id(), + order.client_order_id(), + VenueOrderId::new("BINANCE-1"), + account_id, + TradeId::new("1"), + order.order_side(), + order.order_type(), + Quantity::from("1"), + Price::from("1000"), + instrument.quote_currency(), + LiquiditySide::Taker, + UUID4::new(), + UnixNanos::default(), + UnixNanos::default(), + false, + Some(PositionId::new("P-1")), + None, + ); + let position = Position::new(&instrument, order_filled); + + // Add position to cache + engine + .cache + .borrow_mut() + .add_position(position.clone(), engine.oms_type) + .unwrap(); + + let position_id = engine.get_position_id(&order, None); + assert_eq!(position_id, Some(position.id)); +} + +#[rstest] +fn test_get_position_id_hedging_with_generated_position(crypto_perpetual_ethusdt: CryptoPerpetual) { + let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); + let cache = Rc::new(RefCell::new(Cache::default())); + + // Use order matching config with position ids + let config_with_position_id = OrderMatchingEngineConfig { + use_position_ids: true, + ..OrderMatchingEngineConfig::default() + }; + // Create oms type hedging engine + let mut engine = OrderMatchingEngine::new( + instrument.clone(), + 1, + FillModel::default(), + BookType::L1_MBP, + OmsType::Hedging, + AccountType::Cash, + &ATOMIC_TIME, + Rc::new(RefCell::new(MessageBus::default())), + cache, + config_with_position_id, + ); + let order = OrderTestBuilder::new(OrderType::Market) + .instrument_id(instrument.id().clone()) + .side(OrderSide::Buy) + .quantity(Quantity::from("1")) + .build(); + + let position_id = engine.get_position_id(&order, None); + assert_eq!(position_id, Some(PositionId::new("BINANCE-1-1"))); +} From 08527488a04cbf9a6b69d47d274e093d56632022 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 17 Oct 2024 19:55:07 +1100 Subject: [PATCH 157/224] Simplify qualification of OrderMatchingEngine methods --- nautilus_core/backtest/src/exchange.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/nautilus_core/backtest/src/exchange.rs b/nautilus_core/backtest/src/exchange.rs index fdb1353fe2da..6ad0f9448de9 100644 --- a/nautilus_core/backtest/src/exchange.rs +++ b/nautilus_core/backtest/src/exchange.rs @@ -221,20 +221,20 @@ impl SimulatedExchange { pub fn best_bid_price(&self, instrument_id: InstrumentId) -> Option { self.matching_engines .get(&instrument_id) - .and_then(super::matching_engine::OrderMatchingEngine::best_bid_price) + .and_then(OrderMatchingEngine::best_bid_price) } #[must_use] pub fn best_ask_price(&self, instrument_id: InstrumentId) -> Option { self.matching_engines .get(&instrument_id) - .and_then(super::matching_engine::OrderMatchingEngine::best_ask_price) + .and_then(OrderMatchingEngine::best_ask_price) } pub fn get_book(&self, instrument_id: InstrumentId) -> Option<&OrderBook> { self.matching_engines .get(&instrument_id) - .map(super::matching_engine::OrderMatchingEngine::get_book) + .map(OrderMatchingEngine::get_book) } #[must_use] @@ -262,12 +262,12 @@ impl SimulatedExchange { .and_then(|id| { self.matching_engines .get(&id) - .map(super::matching_engine::OrderMatchingEngine::get_open_orders) + .map(OrderMatchingEngine::get_open_orders) }) .unwrap_or_else(|| { self.matching_engines .values() - .flat_map(super::matching_engine::OrderMatchingEngine::get_open_orders) + .flat_map(OrderMatchingEngine::get_open_orders) .collect() }) } From 6323f29ecf566540ea44c6500cbaa3df2fa25257 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 17 Oct 2024 20:00:18 +1100 Subject: [PATCH 158/224] Fix clippy lints --- nautilus_core/backtest/src/matching_engine/tests.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_core/backtest/src/matching_engine/tests.rs b/nautilus_core/backtest/src/matching_engine/tests.rs index cb375967de2a..60f04e7a8425 100644 --- a/nautilus_core/backtest/src/matching_engine/tests.rs +++ b/nautilus_core/backtest/src/matching_engine/tests.rs @@ -796,7 +796,7 @@ fn test_get_position_id_hedging_with_existing_position( // Create position, order and order filled event let order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument.id().clone()) + .instrument_id(instrument.id()) .side(OrderSide::Buy) .quantity(Quantity::from("1")) .build(); @@ -858,7 +858,7 @@ fn test_get_position_id_hedging_with_generated_position(crypto_perpetual_ethusdt config_with_position_id, ); let order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument.id().clone()) + .instrument_id(instrument.id()) .side(OrderSide::Buy) .quantity(Quantity::from("1")) .build(); From 4a5efdc940c418be8e91c2be551673252a3629fb Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 17 Oct 2024 22:22:51 +1100 Subject: [PATCH 159/224] Continue improving BettingInstrument and testing --- .../model/src/instruments/betting.rs | 6 +- .../model/src/python/instruments/betting.rs | 12 +-- .../cache/postgres/transformers.py | 11 ++- nautilus_trader/core/nautilus_pyo3.pyi | 3 +- nautilus_trader/model/instruments/betting.pyx | 2 +- nautilus_trader/test_kit/providers.py | 2 +- .../test_kit/rust/instruments_pyo3.py | 65 +++++++++++++++ nautilus_trader/test_kit/rust/types_pyo3.py | 4 + .../adapters/betfair/test_kit.py | 2 +- .../model/instruments/test_betting_pyo3.py | 83 +++++++++++++++++++ .../instruments/test_binary_option_pyo3.py | 74 +++++++++++++++++ 11 files changed, 249 insertions(+), 15 deletions(-) create mode 100644 tests/unit_tests/model/instruments/test_betting_pyo3.py create mode 100644 tests/unit_tests/model/instruments/test_binary_option_pyo3.py diff --git a/nautilus_core/model/src/instruments/betting.rs b/nautilus_core/model/src/instruments/betting.rs index 177108064711..f1e58cc00985 100644 --- a/nautilus_core/model/src/instruments/betting.rs +++ b/nautilus_core/model/src/instruments/betting.rs @@ -43,7 +43,7 @@ pub struct BettingInstrument { pub raw_symbol: Symbol, pub event_type_id: u64, pub event_type_name: Ustr, - pub competition_id: Ustr, + pub competition_id: u64, pub competition_name: Ustr, pub event_id: u64, pub event_name: Ustr, @@ -86,7 +86,7 @@ impl BettingInstrument { raw_symbol: Symbol, event_type_id: u64, event_type_name: Ustr, - competition_id: Ustr, + competition_id: u64, competition_name: Ustr, event_id: u64, event_name: Ustr, @@ -174,7 +174,7 @@ impl BettingInstrument { raw_symbol: Symbol, event_type_id: u64, event_type_name: Ustr, - competition_id: Ustr, + competition_id: u64, competition_name: Ustr, event_id: u64, event_name: Ustr, diff --git a/nautilus_core/model/src/python/instruments/betting.rs b/nautilus_core/model/src/python/instruments/betting.rs index 76fee70a3326..4432490d864e 100644 --- a/nautilus_core/model/src/python/instruments/betting.rs +++ b/nautilus_core/model/src/python/instruments/betting.rs @@ -39,7 +39,7 @@ impl BettingInstrument { raw_symbol: Symbol, event_type_id: u64, event_type_name: String, - competition_id: String, + competition_id: u64, competition_name: String, event_id: u64, event_name: String, @@ -74,7 +74,7 @@ impl BettingInstrument { raw_symbol, event_type_id, Ustr::from(&event_type_name), - Ustr::from(&competition_id), + competition_id, Ustr::from(&competition_name), event_id, Ustr::from(&event_name), @@ -163,8 +163,8 @@ impl BettingInstrument { #[getter] #[pyo3(name = "competition_id")] - fn py_competition_id(&self) -> &str { - self.competition_id.as_str() + fn py_competition_id(&self) -> u64 { + self.competition_id } #[getter] @@ -355,7 +355,7 @@ impl BettingInstrument { dict.set_item("raw_symbol", self.raw_symbol.to_string())?; dict.set_item("event_type_id", self.event_type_id)?; dict.set_item("event_type_name", self.event_type_name.to_string())?; - dict.set_item("competition_id", self.competition_id.to_string())?; + dict.set_item("competition_id", self.competition_id)?; dict.set_item("competition_name", self.competition_name.to_string())?; dict.set_item("event_id", self.event_id)?; dict.set_item("event_name", self.event_name.to_string())?; @@ -364,8 +364,8 @@ impl BettingInstrument { dict.set_item("betting_type", self.betting_type.to_string())?; dict.set_item("market_id", self.market_id.to_string())?; dict.set_item("market_name", self.market_name.to_string())?; - dict.set_item("market_start_time", self.market_start_time.to_string())?; dict.set_item("market_type", self.market_type.to_string())?; + dict.set_item("market_start_time", self.market_start_time.as_u64())?; dict.set_item("selection_id", self.selection_id)?; dict.set_item("selection_name", self.selection_name.to_string())?; dict.set_item("selection_handicap", self.selection_handicap)?; diff --git a/nautilus_trader/cache/postgres/transformers.py b/nautilus_trader/cache/postgres/transformers.py index 14649cae0954..64d462763bd4 100644 --- a/nautilus_trader/cache/postgres/transformers.py +++ b/nautilus_trader/cache/postgres/transformers.py @@ -42,6 +42,7 @@ from nautilus_trader.model.events import OrderTriggered from nautilus_trader.model.events import OrderUpdated from nautilus_trader.model.events.account import AccountState +from nautilus_trader.model.instruments import BettingInstrument from nautilus_trader.model.instruments import BinaryOption from nautilus_trader.model.instruments import CryptoFuture from nautilus_trader.model.instruments import CryptoPerpetual @@ -84,7 +85,11 @@ def transform_currency_to_pyo3(currency: Currency) -> nautilus_pyo3.Currency: # Instruments ################################################################################ def transform_instrument_to_pyo3(instrument: Instrument): - if isinstance(instrument, CryptoFuture): + if isinstance(instrument, BettingInstrument): + return nautilus_pyo3.BettingInstrument.from_dict(BettingInstrument.to_dict(instrument)) + elif isinstance(instrument, BinaryOption): + return nautilus_pyo3.BinaryOption.from_dict(BinaryOption.to_dict(instrument)) + elif isinstance(instrument, CryptoFuture): return nautilus_pyo3.CryptoFuture.from_dict(CryptoFuture.to_dict(instrument)) elif isinstance(instrument, CryptoPerpetual): return nautilus_pyo3.CryptoPerpetual.from_dict(CryptoPerpetual.to_dict(instrument)) @@ -104,7 +109,9 @@ def transform_instrument_to_pyo3(instrument: Instrument): def transform_instrument_from_pyo3(instrument_pyo3) -> Instrument | None: # noqa: C901 if instrument_pyo3 is None: return None - if isinstance(instrument_pyo3, nautilus_pyo3.BinaryOption): + if isinstance(instrument_pyo3, nautilus_pyo3.BettingInstrument): + return BettingInstrument.from_pyo3(instrument_pyo3) + elif isinstance(instrument_pyo3, nautilus_pyo3.BinaryOption): return BinaryOption.from_pyo3(instrument_pyo3) elif isinstance(instrument_pyo3, nautilus_pyo3.CryptoFuture): return CryptoFuture.from_pyo3(instrument_pyo3) diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index f5a11341223d..18ac74f08744 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -1738,7 +1738,7 @@ class BettingInstrument: raw_symbol: Symbol, event_type_id: int, event_type_name: str, - competition_id: str, + competition_id: int, competition_name: str, event_id: int, event_name: str, @@ -1746,6 +1746,7 @@ class BettingInstrument: event_open_date: int, betting_type: str, market_id: str, + market_name: str, market_type: str, market_start_time: int, selection_id: int, diff --git a/nautilus_trader/model/instruments/betting.pyx b/nautilus_trader/model/instruments/betting.pyx index 1d3b524c5dca..b0d794ef4495 100644 --- a/nautilus_trader/model/instruments/betting.pyx +++ b/nautilus_trader/model/instruments/betting.pyx @@ -158,8 +158,8 @@ cdef class BettingInstrument(Instrument): "betting_type": obj.betting_type, "market_id": obj.market_id, "market_name": obj.market_name, - "market_start_time": obj.market_start_time.isoformat(), "market_type": obj.market_type, + "market_start_time": obj.market_start_time.isoformat(), "selection_id": obj.selection_id, "selection_name": obj.selection_name, "selection_handicap": obj.selection_handicap, diff --git a/nautilus_trader/test_kit/providers.py b/nautilus_trader/test_kit/providers.py index 8770f155c076..9fbff7e82bde 100644 --- a/nautilus_trader/test_kit/providers.py +++ b/nautilus_trader/test_kit/providers.py @@ -690,7 +690,7 @@ def betting_instrument(venue: str | None = None) -> BettingInstrument: ) @staticmethod - def binary_option() -> CurrencyPair: + def binary_option() -> BinaryOption: raw_symbol = Symbol( "0x12a0cb60174abc437bf1178367c72d11f069e1a3add20b148fb0ab4279b772b2-92544998123698303655208967887569360731013655782348975589292031774495159624905", ) diff --git a/nautilus_trader/test_kit/rust/instruments_pyo3.py b/nautilus_trader/test_kit/rust/instruments_pyo3.py index 8b70af3d6df5..6772a90a16dd 100644 --- a/nautilus_trader/test_kit/rust/instruments_pyo3.py +++ b/nautilus_trader/test_kit/rust/instruments_pyo3.py @@ -19,6 +19,8 @@ import pytz from nautilus_trader.core.nautilus_pyo3 import AssetClass +from nautilus_trader.core.nautilus_pyo3 import BettingInstrument +from nautilus_trader.core.nautilus_pyo3 import BinaryOption from nautilus_trader.core.nautilus_pyo3 import CryptoFuture from nautilus_trader.core.nautilus_pyo3 import CryptoPerpetual from nautilus_trader.core.nautilus_pyo3 import Currency @@ -39,6 +41,7 @@ _USD = TestTypesProviderPyo3.currency_usd() +_USDC = TestTypesProviderPyo3.currency_usdc() _USDT = TestTypesProviderPyo3.currency_usdt() _BTC = TestTypesProviderPyo3.currency_btc() _ETH = TestTypesProviderPyo3.currency_eth() @@ -87,6 +90,68 @@ def default_fx_ccy( def audusd_sim(): return TestInstrumentProviderPyo3.default_fx_ccy("AUD/USD") + @staticmethod + def betting_instrument() -> BettingInstrument: + return BettingInstrument( + id=InstrumentId.from_str("1-123456789.BETFAIR"), + raw_symbol=Symbol.from_str("1-123456789"), + betting_type="ODDS", + competition_id=12282733, + competition_name="NFL", + event_country_code="GB", + event_id=29678534, + event_name="NFL", + event_open_date=pd.Timestamp("2022-02-07 23:30:00+00:00").value, + event_type_id=6423, + event_type_name="American Football", + market_id="1-123456789", + market_name="AFC Conference Winner", + market_type="SPECIAL", + market_start_time=pd.Timestamp("2022-02-07 23:30:00+00:00").value, + selection_handicap=0.0, + selection_id=50214, + selection_name="Kansas City Chiefs", + currency=Currency.from_str("GBP"), + price_precision=2, # BETFAIR_PRICE_PRECISION, + size_precision=2, # BETFAIR_QUANTITY_PRECISION, + price_increment=Price.from_str("0.01"), + size_increment=Quantity.from_str("0.01"), + maker_fee=Decimal(0), # TBD + taker_fee=Decimal(0), # TBD + ts_event=0, + ts_init=0, + ) + + @staticmethod + def binary_option() -> BinaryOption: + raw_symbol = Symbol( + "0x12a0cb60174abc437bf1178367c72d11f069e1a3add20b148fb0ab4279b772b2-92544998123698303655208967887569360731013655782348975589292031774495159624905", + ) + price_increment = Price.from_str("0.001") + size_increment = Quantity.from_str("0.01") + return BinaryOption( + id=InstrumentId(symbol=raw_symbol, venue=Venue("POLYMARKET")), + raw_symbol=raw_symbol, + outcome="Yes", + description="Will the outcome of this market be 'Yes'?", + asset_class=AssetClass.ALTERNATIVE, + currency=_USDC, + price_precision=price_increment.precision, + price_increment=price_increment, + size_precision=size_increment.precision, + size_increment=size_increment, + activation_ns=0, + expiration_ns=pd.Timestamp("2024-01-01", tz="UTC").value, + margin_init=Decimal(0), # TBD + margin_maint=Decimal(0), # TBD + max_quantity=None, + min_quantity=Quantity.from_int(5), + maker_fee=Decimal(0), # TBD + taker_fee=Decimal(0), # TBD + ts_event=0, + ts_init=0, + ) + @staticmethod def ethusdt_perp_binance() -> CryptoPerpetual: return CryptoPerpetual( diff --git a/nautilus_trader/test_kit/rust/types_pyo3.py b/nautilus_trader/test_kit/rust/types_pyo3.py index fed86abd52f3..381374c4f88a 100644 --- a/nautilus_trader/test_kit/rust/types_pyo3.py +++ b/nautilus_trader/test_kit/rust/types_pyo3.py @@ -34,6 +34,10 @@ def currency_usdt() -> Currency: def currency_usd() -> Currency: return Currency.from_str("USD") + @staticmethod + def currency_usdc() -> Currency: + return Currency.from_str("USDC") + @staticmethod def currency_aud() -> Currency: return Currency.from_str("AUD") diff --git a/tests/integration_tests/adapters/betfair/test_kit.py b/tests/integration_tests/adapters/betfair/test_kit.py index 948fe4937063..0838e02961a4 100644 --- a/tests/integration_tests/adapters/betfair/test_kit.py +++ b/tests/integration_tests/adapters/betfair/test_kit.py @@ -658,7 +658,7 @@ def betting_instrument( return BettingInstrument( venue_name=BETFAIR_VENUE.value, betting_type="ODDS", - competition_id="12282733", + competition_id=12282733, competition_name="NFL", event_country_code="GB", event_id="29678534", diff --git a/tests/unit_tests/model/instruments/test_betting_pyo3.py b/tests/unit_tests/model/instruments/test_betting_pyo3.py new file mode 100644 index 000000000000..9844539bed40 --- /dev/null +++ b/tests/unit_tests/model/instruments/test_betting_pyo3.py @@ -0,0 +1,83 @@ +# ------------------------------------------------------------------------------------------------- +# Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +# https://nautechsystems.io +# +# Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +# You may not use this file except in compliance with the License. +# You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ------------------------------------------------------------------------------------------------- + +from nautilus_trader.core import nautilus_pyo3 +from nautilus_trader.test_kit.rust.instruments_pyo3 import TestInstrumentProviderPyo3 + + +_BETTING_INSTRUMENT = TestInstrumentProviderPyo3.betting_instrument() + + +def test_equality(): + item_1 = TestInstrumentProviderPyo3.betting_instrument() + item_2 = TestInstrumentProviderPyo3.betting_instrument() + assert item_1 == item_2 + + +def test_hash(): + assert hash(_BETTING_INSTRUMENT) == hash(_BETTING_INSTRUMENT) + + +def test_to_dict(): + result = _BETTING_INSTRUMENT.to_dict() + assert nautilus_pyo3.BettingInstrument.from_dict(result) == _BETTING_INSTRUMENT + assert result == { + "type": "BettingInstrument", + "id": "1-123456789.BETFAIR", + "raw_symbol": "1-123456789", + "event_type_id": 6423, + "event_type_name": "American Football", + "competition_id": 12282733, + "competition_name": "NFL", + "event_id": 29678534, + "event_name": "NFL", + "event_country_code": "GB", + "event_open_date": 1644276600000000000, + "betting_type": "ODDS", + "market_id": "1-123456789", + "market_name": "AFC Conference Winner", + "market_start_time": 1644276600000000000, + "market_type": "SPECIAL", + "selection_id": 50214, + "selection_name": "Kansas City Chiefs", + "selection_handicap": 0.0, + "currency": "GBP", + "price_precision": 2, + "size_precision": 2, + "price_increment": "0.01", + "size_increment": "0.01", + "maker_fee": "0", + "taker_fee": "0", + "ts_event": 0, + "ts_init": 0, + "info": {}, + "max_quantity": None, + "min_quantity": None, + "max_notional": None, + "min_notional": None, + "max_price": None, + "min_price": None, + } + + +# TODO: Not implemented +# def test_pyo3_cython_conversion(): +# binary_option_pyo3 = TestInstrumentProviderPyo3.binary_option() +# binary_option_pyo3_dict = binary_option_pyo3.to_dict() +# binary_option_cython = BinaryOption.from_pyo3(binary_option_pyo3) +# binary_option_cython_dict = BinaryOption.to_dict(binary_option_cython) +# binary_option_pyo3_back = nautilus_pyo3.BinaryOption.from_dict(binary_option_cython_dict) +# assert binary_option_pyo3 == binary_option_pyo3_back +# assert binary_option_pyo3_dict == binary_option_cython_dict diff --git a/tests/unit_tests/model/instruments/test_binary_option_pyo3.py b/tests/unit_tests/model/instruments/test_binary_option_pyo3.py new file mode 100644 index 000000000000..bcc2cdfc1f44 --- /dev/null +++ b/tests/unit_tests/model/instruments/test_binary_option_pyo3.py @@ -0,0 +1,74 @@ +# ------------------------------------------------------------------------------------------------- +# Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +# https://nautechsystems.io +# +# Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +# You may not use this file except in compliance with the License. +# You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ------------------------------------------------------------------------------------------------- + +from nautilus_trader.core import nautilus_pyo3 +from nautilus_trader.test_kit.rust.instruments_pyo3 import TestInstrumentProviderPyo3 + + +_BINARY_OPTION = TestInstrumentProviderPyo3.binary_option() + + +def test_equality(): + item_1 = TestInstrumentProviderPyo3.binary_option() + item_2 = TestInstrumentProviderPyo3.binary_option() + assert item_1 == item_2 + + +def test_hash(): + assert hash(_BINARY_OPTION) == hash(_BINARY_OPTION) + + +def test_to_dict(): + result = _BINARY_OPTION.to_dict() + assert nautilus_pyo3.BinaryOption.from_dict(result) == _BINARY_OPTION + assert result == { + "type": "BinaryOption", + "id": "0x12a0cb60174abc437bf1178367c72d11f069e1a3add20b148fb0ab4279b772b2-92544998123698303655208967887569360731013655782348975589292031774495159624905.POLYMARKET", # noqa: E501 + "raw_symbol": "0x12a0cb60174abc437bf1178367c72d11f069e1a3add20b148fb0ab4279b772b2-92544998123698303655208967887569360731013655782348975589292031774495159624905", # noqa: E501 + "asset_class": "ALTERNATIVE", + "currency": "USDC", + "activation_ns": 0, + "expiration_ns": 1704067200000000000, + "price_precision": 3, + "size_precision": 2, + "price_increment": "0.001", + "size_increment": "0.01", + "margin_init": "0", + "margin_maint": "0", + "info": {}, + "maker_fee": "0", + "taker_fee": "0", + "ts_event": 0, + "ts_init": 0, + "outcome": "Yes", + "description": "Will the outcome of this market be 'Yes'?", + "max_quantity": None, + "min_quantity": "5", + "max_notional": None, + "min_notional": None, + "max_price": None, + "min_price": None, + } + + +# TODO: Not implemented +# def test_pyo3_cython_conversion(): +# binary_option_pyo3 = TestInstrumentProviderPyo3.binary_option() +# binary_option_pyo3_dict = binary_option_pyo3.to_dict() +# binary_option_cython = BinaryOption.from_pyo3(binary_option_pyo3) +# binary_option_cython_dict = BinaryOption.to_dict(binary_option_cython) +# binary_option_pyo3_back = nautilus_pyo3.BinaryOption.from_dict(binary_option_cython_dict) +# assert binary_option_pyo3 == binary_option_pyo3_back +# assert binary_option_pyo3_dict == binary_option_cython_dict From 5ce4bb28d030155b9a62d48f84b8758112d7a95c Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 17 Oct 2024 23:09:19 +1100 Subject: [PATCH 160/224] Fix BettingInstrument dict and arrow schema --- RELEASES.md | 1 + nautilus_trader/model/instruments/betting.pyx | 33 +++++++++-- .../arrow/implementations/instruments.py | 6 +- tests/unit_tests/model/test_instrument.py | 58 +++++++++++++++++++ 4 files changed, 90 insertions(+), 8 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index e2ad03c6a348..c38ad39b4003 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -30,6 +30,7 @@ Released on TBD (UTC). - Removed legacy `TardisQuoteDataLoader` (now redundant with new Rust implemented loader) - Removed legacy `TardisTradeDataLoader` (now redundant with new Rust implemented loader) - Custom signals are now passed to `on_signal(signal)` instead of `on_data(data)` +- Changed `BettingInstrument` Arrow schema fields `event_open_date` and `market_start_time` from `string` to `uint64` ### Fixes - Fixed `SocketClient` TLS implementation diff --git a/nautilus_trader/model/instruments/betting.pyx b/nautilus_trader/model/instruments/betting.pyx index b0d794ef4495..cce931962989 100644 --- a/nautilus_trader/model/instruments/betting.pyx +++ b/nautilus_trader/model/instruments/betting.pyx @@ -136,9 +136,20 @@ cdef class BettingInstrument(Instrument): cdef BettingInstrument from_dict_c(dict values): Condition.not_none(values, "values") data = values.copy() - data['event_open_date'] = pd.Timestamp(data['event_open_date']) - data['market_start_time'] = pd.Timestamp(data['market_start_time']) - return BettingInstrument(**{k: v for k, v in data.items() if k not in ('id', "type")}) + data["event_open_date"] = pd.Timestamp(data["event_open_date"], tz="UTC") + data["market_start_time"] = pd.Timestamp(data["market_start_time"], tz="UTC") + data.pop("raw_symbol", None) + data.pop("price_increment", None) + data.pop("size_increment", None) + data.pop("maker_fee", None) + data.pop("taker_fee", None) + data.pop("max_quantity", None) + data.pop("min_quantity", None) + data.pop("max_notional", None) + data.pop("min_notional", None) + data.pop("max_price", None) + data.pop("min_price", None) + return BettingInstrument(**{k: v for k, v in data.items() if k not in ("id", "type")}) @staticmethod cdef dict to_dict_c(BettingInstrument obj): @@ -146,6 +157,7 @@ cdef class BettingInstrument(Instrument): return { "type": "BettingInstrument", "id": obj.id.to_str(), + "raw_symbol": obj.id.symbol.value, "venue_name": obj.id.venue.value, "event_type_id": obj.event_type_id, "event_type_name": obj.event_type_name, @@ -154,20 +166,31 @@ cdef class BettingInstrument(Instrument): "event_id": obj.event_id, "event_name": obj.event_name, "event_country_code": obj.event_country_code, - "event_open_date": obj.event_open_date.isoformat(), + "event_open_date": obj.event_open_date.value, "betting_type": obj.betting_type, "market_id": obj.market_id, "market_name": obj.market_name, "market_type": obj.market_type, - "market_start_time": obj.market_start_time.isoformat(), + "market_start_time": obj.market_start_time.value, "selection_id": obj.selection_id, "selection_name": obj.selection_name, "selection_handicap": obj.selection_handicap, "price_precision": obj.price_precision, "size_precision": obj.size_precision, + "price_increment": str(obj.price_increment), + "size_increment": str(obj.size_increment), "currency": obj.quote_currency.code, + "maker_fee": str(obj.maker_fee), + "taker_fee": str(obj.taker_fee), + "max_quantity": str(obj.max_quantity) if obj.max_quantity is not None else None, + "min_quantity": str(obj.min_quantity) if obj.min_quantity is not None else None, + "max_notional": str(obj.max_notional) if obj.max_notional is not None else None, + "min_notional": str(obj.min_notional) if obj.min_notional is not None else None, + "max_price": str(obj.max_price) if obj.max_price is not None else None, + "min_price": str(obj.min_price) if obj.min_price is not None else None, "ts_event": obj.ts_event, "ts_init": obj.ts_init, + "info": obj.info, } @staticmethod diff --git a/nautilus_trader/serialization/arrow/implementations/instruments.py b/nautilus_trader/serialization/arrow/implementations/instruments.py index 4cb6ea00f7d8..5c38d7bb08d9 100644 --- a/nautilus_trader/serialization/arrow/implementations/instruments.py +++ b/nautilus_trader/serialization/arrow/implementations/instruments.py @@ -35,9 +35,9 @@ SCHEMAS = { BettingInstrument: pa.schema( { + "id": pa.string(), "venue_name": pa.string(), "currency": pa.string(), - "id": pa.string(), "event_type_id": pa.int64(), "event_type_name": pa.string(), "competition_id": pa.int64(), @@ -45,12 +45,12 @@ "event_id": pa.int64(), "event_name": pa.string(), "event_country_code": pa.string(), - "event_open_date": pa.string(), + "event_open_date": pa.uint64(), "betting_type": pa.string(), "market_id": pa.string(), "market_name": pa.string(), - "market_start_time": pa.string(), "market_type": pa.string(), + "market_start_time": pa.uint64(), "selection_id": pa.int64(), "selection_name": pa.string(), "selection_handicap": pa.float64(), diff --git a/tests/unit_tests/model/test_instrument.py b/tests/unit_tests/model/test_instrument.py index 0b060add1aaf..089ba26a3aa7 100644 --- a/tests/unit_tests/model/test_instrument.py +++ b/tests/unit_tests/model/test_instrument.py @@ -24,6 +24,7 @@ from nautilus_trader.model.currencies import USDT from nautilus_trader.model.enums import option_kind_from_str from nautilus_trader.model.identifiers import InstrumentId +from nautilus_trader.model.instruments import BettingInstrument from nautilus_trader.model.instruments import BinaryOption from nautilus_trader.model.instruments import CryptoFuture from nautilus_trader.model.instruments import CryptoPerpetual @@ -50,6 +51,7 @@ AAPL_EQUITY = TestInstrumentProvider.equity(symbol="AAPL", venue="XNAS") ES_FUTURE = TestInstrumentProvider.es_future(expiry_year=2023, expiry_month=12) AAPL_OPTION = TestInstrumentProvider.aapl_option() +BETTING_INSTRUMENT = TestInstrumentProvider.betting_instrument() class TestInstrument: @@ -155,6 +157,51 @@ def test_base_from_dict_returns_expected_instrument(self): # Assert assert result == BTCUSDT_BINANCE + def test_betting_instrument_to_dict(self): + # Arrange, Act + result = BettingInstrument.to_dict(BETTING_INSTRUMENT) + + # Assert + assert BettingInstrument.from_dict(result) == BETTING_INSTRUMENT + assert result == { + "type": "BettingInstrument", + "id": "1-123456789-50214-None.BETFAIR", + "raw_symbol": "1-123456789-50214-None", + "venue_name": "BETFAIR", + "event_type_id": 6423, + "event_type_name": "American Football", + "competition_id": 12282733, + "competition_name": "NFL", + "event_id": 29678534, + "event_name": "NFL", + "event_country_code": "GB", + "event_open_date": 1644276600000000000, + "betting_type": "ODDS", + "market_id": "1-123456789", + "market_name": "AFC Conference Winner", + "market_type": "SPECIAL", + "market_start_time": 1644276600000000000, + "selection_id": 50214, + "selection_name": "Kansas City Chiefs", + "selection_handicap": -9999999.0, + "price_precision": 2, + "size_precision": 2, + "price_increment": "0.01", + "size_increment": "0.01", + "currency": "GBP", + "maker_fee": "0", + "taker_fee": "0", + "max_quantity": None, + "min_quantity": None, + "max_notional": None, + "min_notional": "1.00 GBP", + "max_price": None, + "min_price": None, + "ts_event": 0, + "ts_init": 0, + "info": {}, + } + def test_crypto_perpetual_instrument_to_dict(self): # Arrange, Act result = CryptoPerpetual.to_dict(XBTUSD_BITMEX) @@ -572,3 +619,14 @@ def test_binary_option_dict_round_trip() -> None: # Assert assert instrument == from_dict + + +def test_betting_instrument_dict_round_trip() -> None: + # Arrange + instrument = TestInstrumentProvider.betting_instrument() + + # Act + from_dict = BettingInstrument.from_dict(BettingInstrument.to_dict(instrument)) + + # Assert + assert instrument == from_dict From 1949ff8518c5bce461a2b3e9092c050d3bbf50b7 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Thu, 17 Oct 2024 23:35:25 +1100 Subject: [PATCH 161/224] Refine BinaryOption instrument --- .../model/src/instruments/binary_option.rs | 20 ++++++++-------- nautilus_core/model/src/instruments/stubs.rs | 4 ++-- .../src/python/instruments/binary_option.rs | 22 ++++++++++------- .../test_cache_database_postgres.py | 24 +++++++++++++++++++ 4 files changed, 50 insertions(+), 20 deletions(-) diff --git a/nautilus_core/model/src/instruments/binary_option.rs b/nautilus_core/model/src/instruments/binary_option.rs index 7ca2a023f08b..578a70ba865c 100644 --- a/nautilus_core/model/src/instruments/binary_option.rs +++ b/nautilus_core/model/src/instruments/binary_option.rs @@ -51,10 +51,10 @@ pub struct BinaryOption { pub size_increment: Quantity, pub maker_fee: Decimal, pub taker_fee: Decimal, - pub margin_init: Decimal, - pub margin_maint: Decimal, pub outcome: Option, pub description: Option, + pub margin_init: Option, + pub margin_maint: Option, pub max_quantity: Option, pub min_quantity: Option, pub max_notional: Option, @@ -85,10 +85,10 @@ impl BinaryOption { size_increment: Quantity, maker_fee: Decimal, taker_fee: Decimal, - margin_init: Decimal, - margin_maint: Decimal, outcome: Option, description: Option, + margin_init: Option, + margin_maint: Option, max_quantity: Option, min_quantity: Option, max_notional: Option, @@ -126,10 +126,10 @@ impl BinaryOption { size_increment, maker_fee, taker_fee, - margin_init, - margin_maint, outcome, description, + margin_init, + margin_maint, max_quantity, min_quantity, max_notional, @@ -155,10 +155,10 @@ impl BinaryOption { size_increment: Quantity, maker_fee: Decimal, taker_fee: Decimal, - margin_init: Decimal, - margin_maint: Decimal, outcome: Option, description: Option, + margin_init: Option, + margin_maint: Option, max_quantity: Option, min_quantity: Option, max_notional: Option, @@ -181,10 +181,10 @@ impl BinaryOption { size_increment, maker_fee, taker_fee, - margin_init, - margin_maint, outcome, description, + margin_init, + margin_maint, max_quantity, min_quantity, max_notional, diff --git a/nautilus_core/model/src/instruments/stubs.rs b/nautilus_core/model/src/instruments/stubs.rs index 107dc6edc45c..7ab23eed2119 100644 --- a/nautilus_core/model/src/instruments/stubs.rs +++ b/nautilus_core/model/src/instruments/stubs.rs @@ -487,8 +487,8 @@ pub fn binary_option() -> BinaryOption { size_increment, Decimal::from(0), // TBD Decimal::from(0), // TBD - Decimal::from(0), // TBD - Decimal::from(0), // TBD + None, + None, None, None, None, diff --git a/nautilus_core/model/src/python/instruments/binary_option.rs b/nautilus_core/model/src/python/instruments/binary_option.rs index 9a178ae51a5f..941330843980 100644 --- a/nautilus_core/model/src/python/instruments/binary_option.rs +++ b/nautilus_core/model/src/python/instruments/binary_option.rs @@ -47,12 +47,12 @@ impl BinaryOption { size_increment: Quantity, maker_fee: Decimal, taker_fee: Decimal, - margin_init: Decimal, - margin_maint: Decimal, ts_event: u64, ts_init: u64, outcome: Option, description: Option, + margin_init: Option, + margin_maint: Option, max_quantity: Option, min_quantity: Option, max_notional: Option, @@ -73,10 +73,10 @@ impl BinaryOption { size_increment, maker_fee, taker_fee, - margin_init, - margin_maint, outcome.map(|x| Ustr::from(&x)), description.map(|x| Ustr::from(&x)), + margin_init, + margin_maint, max_quantity, min_quantity, max_notional, @@ -223,13 +223,13 @@ impl BinaryOption { #[getter] #[pyo3(name = "margin_init")] - fn py_margin_init(&self) -> Decimal { + fn py_margin_init(&self) -> Option { self.margin_init } #[getter] #[pyo3(name = "margin_maint")] - fn py_margin_maint(&self) -> Decimal { + fn py_margin_maint(&self) -> Option { self.margin_maint } @@ -283,8 +283,6 @@ impl BinaryOption { dict.set_item("size_precision", self.size_precision)?; dict.set_item("price_increment", self.price_increment.to_string())?; dict.set_item("size_increment", self.size_increment.to_string())?; - dict.set_item("margin_init", self.margin_init.to_string())?; - dict.set_item("margin_maint", self.margin_maint.to_string())?; dict.set_item("info", PyDict::new(py))?; dict.set_item("maker_fee", self.maker_fee.to_string())?; dict.set_item("taker_fee", self.taker_fee.to_string())?; @@ -298,6 +296,14 @@ impl BinaryOption { Some(value) => dict.set_item("description", value.to_string())?, None => dict.set_item("description", py.None())?, } + match self.margin_init { + Some(value) => dict.set_item("margin_init", value.to_string())?, + None => dict.set_item("margin_init", py.None())?, + } + match self.margin_maint { + Some(value) => dict.set_item("margin_maint", value.to_string())?, + None => dict.set_item("margin_maint", py.None())?, + } match self.max_quantity { Some(value) => dict.set_item("max_quantity", value.to_string())?, None => dict.set_item("max_quantity", py.None())?, diff --git a/tests/integration_tests/infrastructure/test_cache_database_postgres.py b/tests/integration_tests/infrastructure/test_cache_database_postgres.py index 5c1ec2a0b7e9..76db07849cfa 100644 --- a/tests/integration_tests/infrastructure/test_cache_database_postgres.py +++ b/tests/integration_tests/infrastructure/test_cache_database_postgres.py @@ -162,6 +162,30 @@ async def test_add_currency(self): currencies = self.database.load_currencies() assert list(currencies.keys()) == ["BTC"] + ################################################################################ + # Instrument - Binary Option + ################################################################################ + @pytest.mark.skip(reason="WIP") + @pytest.mark.asyncio + async def test_add_instrument_binary_option(self): + binary_option = TestInstrumentProvider.binary_option() + self.database.add_currency(binary_option.quote_currency) + + # Check that we have added target currencies, because of foreign key constraints + await eventually(lambda: self.database.load_currencies()) + + currencies = self.database.load_currencies() + assert list(currencies.keys()) == ["USDC"] + + # add instrument + self.database.add_instrument(binary_option) + + # Allow MPSC thread to insert + await eventually(lambda: self.database.load_instrument(binary_option.id)) + + # Assert + assert binary_option == self.database.load_instrument(binary_option.id) + ################################################################################ # Instrument - Crypto Future ################################################################################ From da43caa72c57e6e6cd7bf98781ddb6a33c1ea67b Mon Sep 17 00:00:00 2001 From: Filip Macek Date: Thu, 17 Oct 2024 22:15:50 +0200 Subject: [PATCH 162/224] Improve Postgres config (#2010) --- nautilus_core/cli/src/database/postgres.rs | 14 +++- nautilus_core/infrastructure/src/sql/cache.rs | 7 +- nautilus_core/infrastructure/src/sql/pg.rs | 77 +++++++++++-------- 3 files changed, 55 insertions(+), 43 deletions(-) diff --git a/nautilus_core/cli/src/database/postgres.rs b/nautilus_core/cli/src/database/postgres.rs index 39f374881df0..dae755f0068d 100644 --- a/nautilus_core/cli/src/database/postgres.rs +++ b/nautilus_core/cli/src/database/postgres.rs @@ -30,9 +30,12 @@ pub async fn run_database_command(opt: DatabaseOpt) -> anyhow::Result<()> { config.username, config.password, config.database, - ) - .unwrap(); + ); let pg = connect_pg(pg_connect_options.clone().into()).await?; + log::info!( + "Connected with Postgres on url: {}", + pg_connect_options.connection_string() + ); init_postgres( &pg, pg_connect_options.database, @@ -48,9 +51,12 @@ pub async fn run_database_command(opt: DatabaseOpt) -> anyhow::Result<()> { config.username, config.password, config.database, - ) - .unwrap(); + ); let pg = connect_pg(pg_connect_options.clone().into()).await?; + log::info!( + "Connected with Postgres on url: {}", + pg_connect_options.connection_string() + ); drop_postgres(&pg, pg_connect_options.database).await?; } } diff --git a/nautilus_core/infrastructure/src/sql/cache.rs b/nautilus_core/infrastructure/src/sql/cache.rs index 5c8c24507054..b66768bf4e14 100644 --- a/nautilus_core/infrastructure/src/sql/cache.rs +++ b/nautilus_core/infrastructure/src/sql/cache.rs @@ -266,7 +266,7 @@ impl PostgresCacheDatabase { database: Option, ) -> Result { let pg_connect_options = - get_postgres_connect_options(host, port, username, password, database).unwrap(); + get_postgres_connect_options(host, port, username, password, database); let pool = connect_pg(pg_connect_options.clone().into()).await.unwrap(); let (tx, rx) = unbounded_channel::(); @@ -326,10 +326,7 @@ pub async fn reset_pg_database(pg_options: Option) -> an pub async fn get_pg_cache_database() -> anyhow::Result { reset_pg_database(None).await?; - // run tests as nautilus user - let connect_options = PostgresConnectOptionsBuilder::default() - .username(String::from("nautilus")) - .build()?; + let connect_options = get_postgres_connect_options(None, None, None, None, None); Ok(PostgresCacheDatabase::connect( Some(connect_options.host), Some(connect_options.port), diff --git a/nautilus_core/infrastructure/src/sql/pg.rs b/nautilus_core/infrastructure/src/sql/pg.rs index 4b0236bcec2f..30dda14974c9 100644 --- a/nautilus_core/infrastructure/src/sql/pg.rs +++ b/nautilus_core/infrastructure/src/sql/pg.rs @@ -43,6 +43,26 @@ impl PostgresConnectOptions { database, } } + pub fn connection_string(&self) -> String { + format!( + "postgres://{username}:{password}@{host}:{port}/{database}", + username = self.username, + password = self.password, + host = self.host, + port = self.port, + database = self.database + ) + } + + pub fn default_administrator() -> Self { + PostgresConnectOptions::new( + String::from("localhost"), + 5432, + String::from("postgres"), + String::from("pass"), + String::from("nautilus"), + ) + } } impl Default for PostgresConnectOptions { @@ -69,46 +89,35 @@ impl From for PgConnectOptions { } } +// Gets the postgres connect options from provided arguments, environment variables or defaults pub fn get_postgres_connect_options( host: Option, port: Option, username: Option, password: Option, database: Option, -) -> anyhow::Result { - let host = match host.or_else(|| std::env::var("POSTGRES_HOST").ok()) { - Some(host) => host, - None => anyhow::bail!("No host provided from argument or POSTGRES_HOST env variable"), - }; - let port = match port.or_else(|| { - std::env::var("POSTGRES_PORT") - .map(|port| port.parse::().unwrap()) - .ok() - }) { - Some(port) => port, - None => anyhow::bail!("No port provided from argument or POSTGRES_PORT env variable"), - }; - let username = match username.or_else(|| std::env::var("POSTGRES_USERNAME").ok()) { - Some(username) => username, - None => { - anyhow::bail!("No username provided from argument or POSTGRES_USERNAME env variable") - } - }; - let database = match database.or_else(|| std::env::var("POSTGRES_DATABASE").ok()) { - Some(database) => database, - None => { - anyhow::bail!("No database provided from argument or POSTGRES_DATABASE env variable") - } - }; - let password = match password.or_else(|| std::env::var("POSTGRES_PASSWORD").ok()) { - Some(password) => password, - None => { - anyhow::bail!("No password provided from argument or POSTGRES_PASSWORD env variable") - } - }; - Ok(PostgresConnectOptions::new( - host, port, username, password, database, - )) +) -> PostgresConnectOptions { + let defaults = PostgresConnectOptions::default_administrator(); + let host = host + .or_else(|| std::env::var("POSTGRES_HOST").ok()) + .unwrap_or(defaults.host); + let port = port + .or_else(|| { + std::env::var("POSTGRES_PORT") + .map(|port| port.parse::().unwrap()) + .ok() + }) + .unwrap_or(defaults.port); + let username = username + .or_else(|| std::env::var("POSTGRES_USERNAME").ok()) + .unwrap_or(defaults.username); + let database = database + .or_else(|| std::env::var("POSTGRES_DATABASE").ok()) + .unwrap_or(defaults.database); + let password = password + .or_else(|| std::env::var("POSTGRES_PASSWORD").ok()) + .unwrap_or(defaults.password); + PostgresConnectOptions::new(host, port, username, password, database) } pub async fn connect_pg(options: PgConnectOptions) -> anyhow::Result { From 41141cfd256ea3bdea90d98f3dc6a36e097892d9 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 18 Oct 2024 07:16:37 +1100 Subject: [PATCH 163/224] Update release notes --- RELEASES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASES.md b/RELEASES.md index c38ad39b4003..ab034ca292d7 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -12,6 +12,7 @@ Released on TBD (UTC). - Added in the money probability field to GreeksData (#1995), thanks @faysou - Added `on_signal(signal)` handler for custom signal data - Improved usability of `OrderBookDepth10` by filling partial levels with null orders and zero counts +- Improve Postgres config (#2010), thanks @filipmacek - Refined `DatabentoInstrumentProvider` handling of large bulks of instrument definitions (improved parent symbol support) - Standardized Betfair symbology to use hyphens instead of periods (prevents Betfair symbols being treated as composite) - Integration guide docs fixes (#1991), thanks @FarukhS52 From 70f757e3644a0db16c22f7022f2de1c395f11982 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 18 Oct 2024 07:25:42 +1100 Subject: [PATCH 164/224] Upgrade Rust --- README.md | 8 ++++---- nautilus_core/Cargo.lock | 24 ++++++++++++------------ nautilus_core/Cargo.toml | 4 ++-- nautilus_core/network/Cargo.toml | 2 +- rust-toolchain.toml | 2 +- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 843b38e968fc..0c8f7f3456d9 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,9 @@ | Platform | Rust | Python | | :----------------- | :------ | :----- | -| `Linux (x86_64)` | 1.81.0+ | 3.11+ | -| `macOS (arm64)` | 1.81.0+ | 3.11+ | -| `Windows (x86_64)` | 1.81.0+ | 3.11+ | +| `Linux (x86_64)` | 1.82.0+ | 3.11+ | +| `macOS (arm64)` | 1.82.0+ | 3.11+ | +| `Windows (x86_64)` | 1.82.0+ | 3.11+ | [![](https://dcbadge.limes.pink/api/server/AUWVs3XaCS)](https://discord.gg/AUWVs3XaCS) @@ -38,7 +38,7 @@ NautilusTraders design, architecture and implementation philosophy holds softwar highest level, with the aim of supporting Python native, mission-critical, trading system backtesting and live deployment workloads. -The platform is also universal and asset class agnostic - with any REST, WebSocket or FIX API able to be integrated via modular +The platform is also univ2rsal and asset class agnostic - with any REST, WebSocket or FIX API able to be integrated via modular adapters. Thus, it can handle high-frequency trading operations for any asset classes including FX, Equities, Futures, Options, CFDs, Crypto and Betting - across multiple venues simultaneously. diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 713a833a8ece..b4498d991c70 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -383,9 +383,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.15" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e26a9844c659a2a293d239c7910b752f8487fe122c6c8bd1659bf85a6507c302" +checksum = "103db485efc3e41214fe4fda9f3dbeae2eb9082f48fd236e6095627a9422066e" dependencies = [ "bzip2", "flate2", @@ -2498,9 +2498,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.159" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libloading" @@ -3257,9 +3257,9 @@ checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" [[package]] name = "openssl" -version = "0.10.67" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b8cefcf97f41316955f9294cd61f639bdcfa9f2f230faac6cb896aa8ab64704" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -3641,9 +3641,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.87" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" +checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" dependencies = [ "unicode-ident", ] @@ -4230,9 +4230,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.14" +version = "0.23.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" +checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" dependencies = [ "aws-lc-rs", "log", @@ -4408,9 +4408,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "6dbcf9b78a125ee667ae19388837dd12294b858d101fdd393cb9d5501ef09eb2" dependencies = [ "itoa", "memchr", diff --git a/nautilus_core/Cargo.toml b/nautilus_core/Cargo.toml index 2c3211e8b2e9..13deac7ae6da 100644 --- a/nautilus_core/Cargo.toml +++ b/nautilus_core/Cargo.toml @@ -19,7 +19,7 @@ members = [ ] [workspace.package] -rust-version = "1.81.0" +rust-version = "1.82.0" version = "0.34.0" edition = "2021" authors = ["Nautech Systems "] @@ -50,7 +50,7 @@ rust_decimal = "1.36.0" rust_decimal_macros = "1.36.0" semver = "1.0.23" serde = { version = "1.0.210", features = ["derive"] } -serde_json = "1.0.128" +serde_json = "1.0.129" strum = { version = "0.26.3", features = ["derive"] } thiserror = "1.0.64" thousands = "0.2.0" diff --git a/nautilus_core/network/Cargo.toml b/nautilus_core/network/Cargo.toml index e52ecbe0c0f1..9e3758317442 100644 --- a/nautilus_core/network/Cargo.toml +++ b/nautilus_core/network/Cargo.toml @@ -27,7 +27,7 @@ dashmap = "6.1.0" http = "1.1.0" hyper = "1.5.0" nonzero_ext = "0.3.0" -rustls = { version = "0.23.14", features = ["ring"] } +rustls = { version = "0.23.15", features = ["ring"] } rustls-native-certs = "0.8.0" tokio-rustls = "0.26.0" diff --git a/rust-toolchain.toml b/rust-toolchain.toml index feb980b55eac..3958e3484ca7 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -version = "1.81.0" +version = "1.82.0" channel = "stable" From a1e8ef4892c78d1147f8200b90b69ac6201aee60 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 18 Oct 2024 15:43:49 +1100 Subject: [PATCH 165/224] Update dependencies --- poetry.lock | 219 ++++++++++++++++++++++++++-------------------------- 1 file changed, 110 insertions(+), 109 deletions(-) diff --git a/poetry.lock b/poetry.lock index 679f36f760da..15217e89c98e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2630,32 +2630,33 @@ files = [ [[package]] name = "psutil" -version = "6.0.0" +version = "6.1.0" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, - {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, - {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, - {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, - {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, - {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, - {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, - {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, - {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, - {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, - {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, - {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, - {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, - {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, - {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, - {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, - {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, + {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, + {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, + {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, + {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, + {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, + {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, + {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, + {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, + {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, + {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, + {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, + {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, ] [package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] +dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] +test = ["pytest", "pytest-xdist", "setuptools"] [[package]] name = "py-clob-client" @@ -3469,13 +3470,13 @@ files = [ [[package]] name = "setuptools" -version = "75.1.0" +version = "75.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, - {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, + {file = "setuptools-75.2.0-py3-none-any.whl", hash = "sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8"}, + {file = "setuptools-75.2.0.tar.gz", hash = "sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec"}, ] [package.extras] @@ -3881,13 +3882,13 @@ protobuf = ">=4.23" [[package]] name = "virtualenv" -version = "20.26.6" +version = "20.27.0" description = "Virtual Python Environment builder" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"}, - {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"}, + {file = "virtualenv-20.27.0-py3-none-any.whl", hash = "sha256:44a72c29cceb0ee08f300b314848c86e57bf8d1f13107a5e671fb9274138d655"}, + {file = "virtualenv-20.27.0.tar.gz", hash = "sha256:2ca56a68ed615b8fe4326d11a0dca5dfbe8fd68510fb6c6349163bed3c15f2b2"}, ] [package.dependencies] @@ -3901,93 +3902,93 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "yarl" -version = "1.15.3" +version = "1.15.4" description = "Yet another URL library" optional = false python-versions = ">=3.9" files = [ - {file = "yarl-1.15.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:14d6f07b7b4b3b8fba521904db58442281730b44318d6abb9908de79e2a4e4f4"}, - {file = "yarl-1.15.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eacd9de9b5b8262818a2e1f88efbd8d523abc8453de238c5d2f6a91fa85032dd"}, - {file = "yarl-1.15.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a63ed17af784da3de39b82adfd4f8404ad5ee2ec8f616b063f37da3e64e0521"}, - {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b55cc82ba92c07af6ba619dcf70cc89f7b9626adefb87d251f80f2e77419f1da"}, - {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63ba82841ce315e4b5dc8b9345062638c74b1864d38172d0a0403e5a083b0950"}, - {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59dce412b2515de05ab2eb6aef19ad7f70857ad436cd65fc4276df007106fb42"}, - {file = "yarl-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e337737b8c9d837e5b4d9e906cc57ed7a639e16e515c8094509b17f556fdb642"}, - {file = "yarl-1.15.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2128315cdc517a45ceb72ec17b256a7940eeb4843c66834c203e7d6580c83405"}, - {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69c2d111e67a818e702ba957da8c8e62de916f5c1b3da043f744084c63f12d46"}, - {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d2a70e8bec768be7423d8d465858a3646b34257a20cc02fd92612f1b14931f50"}, - {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:efe758958a7bffce68d91ade238df72667e1f18966ed7b1d3d390eead51a8903"}, - {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b765f19e23c29b68e4f8bbadd36f1da2333ba983d8da2d6518e5f0a7eb2579c2"}, - {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:df494e5a79f2ef8f81f966f787e515760e639c6319a321c16198b379c256a157"}, - {file = "yarl-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:68b27a7d9fb0f145de608da2e45e37fd2397b00266f10487e557f769afa2842d"}, - {file = "yarl-1.15.3-cp310-cp310-win32.whl", hash = "sha256:6d1aba1f644d6e5e16edada31938c11b6c9c97e3bf065742a2c7740d38af0c19"}, - {file = "yarl-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:925e72fc7a4222a5bf6d288876d5afacc8f833b49c4cca85f65089131ba25afa"}, - {file = "yarl-1.15.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dbd4808a209b175b5ebbac24c4798dd7511c5ee522a16f2f0eac78c717dfcdfc"}, - {file = "yarl-1.15.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:20f8bdaf667386cea1a8f49cb69a85f90346656d750d3c1278be1dbc76601065"}, - {file = "yarl-1.15.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:adeac55335669a189189373c93d131ebfc2de3ec04f0d3aa7dff6661f83b89b6"}, - {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:690d8f702945506b58c9c5834d586e8fd819b845fe6239ab16ebc64a92a6fd3d"}, - {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df7784a29b9689341c17d06d826e3b52ee59d6b6916177e4db0477be7aad5f72"}, - {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12c80ec2af97ff3e433699bcabc787ef34e7c08ec038a6e6a25fb81d7bb83607"}, - {file = "yarl-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39533b927c665bcff7da80bf299218e4af12f3e2be27e9c456e29547bcefd631"}, - {file = "yarl-1.15.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db32a5c2912db45e73f80107d178e30f5c48cf596762b3c60ddfebdd655385f0"}, - {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bde319602111e9acca3c4f87f4205b38ba6166004bf108de47553633f9a580fc"}, - {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:493760c4ced954582db83c4760166992c016e1777ebc0f3ef1bb5eb60b2b5924"}, - {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d9cd73f7bff5079d87c2622aa418a75d5d3cdc944d3edb905c5dfc3235466eb0"}, - {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e924040582499f7514ec64691031504e6224b5ae7224216208fc2c94f8b13c89"}, - {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1c3e9ae98719fe180751b093d02dbcc33b78a37e861d0f2c9571720bd31555db"}, - {file = "yarl-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f2911cae6dd012adaaf51494dad4cafb4284ad1f3b588df6ea3e3017e053750"}, - {file = "yarl-1.15.3-cp311-cp311-win32.whl", hash = "sha256:acdfe626607a245aedca35b211f9305a9e7a33349da525bf4ef3caaec8ef51cd"}, - {file = "yarl-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:0ace3927502a9f90a868d62c66623703cf5096dcb586187266e9b964d8dd6c81"}, - {file = "yarl-1.15.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:decf9d76191bfe34835f1abd3fa8ebe8a9cd7e16300a5c7e82b18c0812bb22a2"}, - {file = "yarl-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ce65ed7ad7b6cbca06b0c011b170bd2b0bc56b0a740540e2713e5ac12d7b9b2e"}, - {file = "yarl-1.15.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3cf2b50352df8775591869aaa22c52b64d60376ba99c0802b42778fedc90b775"}, - {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32e8ebf0080ddd38ec05f8be940a3719e5fe1ab8bb6d2b3f6f8b89c9e34149aa"}, - {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05183fd49244517cb11c208d0ae128f2e8a85ddb7caf22ad8b0ffcdf5481fcb6"}, - {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:46653b5fd29e63ffe63335da343829a2b00bb43b0bd9bb21240d3b42629629e2"}, - {file = "yarl-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6316af233610b9868eda92cf68c016750cbf50085ac6c51faa17905ddd25605"}, - {file = "yarl-1.15.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5685ebc333c95b75be3a0a83a81b82b6411beee9585eaeb9e2e588ae8df23848"}, - {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6da6f6c6ee5595658f21bb9d1ecd702f7a7f22f224ac063dfb595624aec4a2e0"}, - {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:45c05b87a8494d9820ea1ac82118fd2f1d795d868e94766fe8ff670377bf6280"}, - {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:04f930fcc940f96b8b29110c56882bcff8703f87a7b9354d3acf60ffded5a23d"}, - {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8df77742b403e71c5d62d22d150e6e35efd6096a15f2c7419815911c62225100"}, - {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f785d83ece0998e4ce4fadda22fa6c1ecc40e10f41617013a8726d2e9af0d98f"}, - {file = "yarl-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7794aade99be0d48b69bd5942acddfeff0de3d09c724d9abe4f19736708ef18f"}, - {file = "yarl-1.15.3-cp312-cp312-win32.whl", hash = "sha256:a3a98d70c667c957c7cd0b153d4cb5e45d43f5e2e23de73be6f7b5c883c01f72"}, - {file = "yarl-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:90257bc627897a2c1d562efcd6a6b18887e9dacae795cad2367e8e16df47d966"}, - {file = "yarl-1.15.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f94d8adfdec402ff97cecc243b310c01d571362ca87bcf8def8e15cb3aaac3ee"}, - {file = "yarl-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0328f798052a33803a77d0868c7f802e952127092c1738fc9e7bfcaac7207c5"}, - {file = "yarl-1.15.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f5f0a0691e39c2e7b5c0f23e6765fa6cb162dce99d9ab1897fdd0f7a4a38b6fb"}, - {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370f646d3654e196ddbf772a2d737fe4e1dd738267015b73ff6267ca592fd9d6"}, - {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3487c57bc8f17f2586ae7fd0e77f65cd298d45b64d15f604bbb29f4cce0e7961"}, - {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef67989d480358482830dc3bc232709804f46a61e7e9841d3f0b1c13a4735b3b"}, - {file = "yarl-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5ab6c64921802176f56c36aa67c5e6a8baf9557ec1662cb41ecdb5580b67eb9"}, - {file = "yarl-1.15.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb474a06023d01ead9c072b2580c22b2691aa1cabdcc19c3171ab1fa6d8496e3"}, - {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92f9a45230d3aa8568c1d692ab27bf505a32dfe3b404721458fc374f411e8bd2"}, - {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:24cad94cf2f46cc8e4b9cd44e4e8a84483536a6c54554960b02b10b5724ab122"}, - {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:380f30073cbd9b740891bb56f44ee31f870e8721269b618ccc9913400936d9f6"}, - {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:353306ba6f0218af1aefe4b9c8b3a0b81b209bc75d79357dac6aca70a7b09d6a"}, - {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fe03cea925d884b8f1157a7037df2f5b6a6478a64b78ee600832d8a9f044c83e"}, - {file = "yarl-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5c4cc1a438ac52562427330e33891f50a78ffd38d335abc64f93f201c83bdc82"}, - {file = "yarl-1.15.3-cp313-cp313-win32.whl", hash = "sha256:956975a3a1ce1f4537be22278d6a283b8bc74d77671f7f6469ab1e800f4e9b02"}, - {file = "yarl-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:2e61b72cf15922a7a665299a6b6825bd9901d67ec3b9d3cf9b256dc1667c9bb1"}, - {file = "yarl-1.15.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:270fef2b335e60c91ee835c524445e2248af841c8b72f48769ed6c02fbff5873"}, - {file = "yarl-1.15.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:59b77f0682e1917be197fc8229530f0c6fb3ef8e242d8256ba091a3a1c0ef7e6"}, - {file = "yarl-1.15.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cc4b999718287073dccd3acb0ef1593961bd7923af08991cb3c94080db503935"}, - {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9b251d3f90e125ff0d1f76257329a9190fa1bfd2157344c875580bff6dedc62"}, - {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ccb4667e0c0a25815efbfe251d24b56624449a319d4bb497074dd49444fb306"}, - {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac26e43b56dbafb30256906bc763cc1f22e05825ae1ced4c6afbd0e6584f18de"}, - {file = "yarl-1.15.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2207491555af5dbbee4c3179a76766f7bc1ecff858f420ea96f2e105ca42c4dd"}, - {file = "yarl-1.15.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14effa29db6113be065a594e13a0f45afb9c1e374fd22b4bc3a4eff0725184b2"}, - {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:19077525cd36c797cae19262e15f2881da33c602fb35d075ff0e4263b51b8b88"}, - {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:d80c019083506886df098b7bb0d844e19db7e226736829ef49f892ed0a070fa5"}, - {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c24debeec87908a864a2b4cb700f863db9441cabacdb22dc448c5d38b55c6f62"}, - {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:1c49fe426c45520b4b8a48544d3a9a58194f39c1b57d92451883f847c299a137"}, - {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:66ddcd7ee3264bc937860f4780290d60f6472ca0484c214fe805116a831121e8"}, - {file = "yarl-1.15.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2a5cbbb06559757f091f9e71d3f76c27d4dfe0652cc3f17ccce398b8377bfda4"}, - {file = "yarl-1.15.3-cp39-cp39-win32.whl", hash = "sha256:d798de0b50efb66583fc096bcdaa852ed6ea3485a4eb610d6a634f8010d932f4"}, - {file = "yarl-1.15.3-cp39-cp39-win_amd64.whl", hash = "sha256:8f0b33fd088e93ba5f7f6dd55226630e7b78212752479c8fcc6abbd143b9c1ce"}, - {file = "yarl-1.15.3-py3-none-any.whl", hash = "sha256:a1d49ed6f4b812dde88e937d4c2bd3f13d72c23ef7de1e17a63b7cacef4b5691"}, - {file = "yarl-1.15.3.tar.gz", hash = "sha256:fbcff47f8ba82467f203037f7a30decf5c724211b224682f7236edb0dcbb5b95"}, + {file = "yarl-1.15.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:551205388d1da18a9975302c9a274ba24788f53bb9bb86187496ebf9e938916e"}, + {file = "yarl-1.15.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eee724176b5bc50ee64905f559345448119b860a30b9489bd7a073f61baf925f"}, + {file = "yarl-1.15.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db818e33599f7b2e4c6507f2b2c24f45ff539a1b6e4e09163bb6f3cfb4616ca7"}, + {file = "yarl-1.15.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07019a9de859c5a29916defd1e8c7557de6491a10bf50c49ff5284e6aedf5313"}, + {file = "yarl-1.15.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db64a20e78969fc66665d2e5fc96cb4f4dc80f2137d8fed4b5a650ad569bb60f"}, + {file = "yarl-1.15.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4076bfd8f1621449b19b9826848ed51bf0f2d1d38e82647c312c0730d8778903"}, + {file = "yarl-1.15.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c23a442973dba3646811c284fce3dddd7fe5c2bd674ac73a122198e8218d6115"}, + {file = "yarl-1.15.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2bdb038b3f5c284e3919218c580dedc95f592c417a358361450b9519b22f7a8"}, + {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:59db8e6888d5302b8dbca0c1026ddabe99d81d67cdc101941519e13ffc9050fe"}, + {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f3294ce265011547630a59c20085fcb6af8cc5fa1fa44a203251f7d86cd5d913"}, + {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4851618679ca70b863ba2e7109be5f09f8fd7715ec505bd42e5a947dcfde3a45"}, + {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:dce1c56beef74d9c799a6ed94001693232a1402138292353a8ce302b64f457d9"}, + {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1e7468f31de61a82817f918743e5229fce774f73fad58487cdf88eef4f06d864"}, + {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:527c68f48a91d953691291d3bce0209293aa5ad13ff05286ddb506791c331818"}, + {file = "yarl-1.15.4-cp310-cp310-win32.whl", hash = "sha256:c30115cecaf25fdcb67cc71c669d08425207f62d7a2f6d5416057c1460529216"}, + {file = "yarl-1.15.4-cp310-cp310-win_amd64.whl", hash = "sha256:df09c80f4bc2bc2efde309af383c3fe8fd8c51fe0519edb350b9c9e0af43ffa4"}, + {file = "yarl-1.15.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:76259901cf1ac3db65e7e6dff04775b626d0715f9b51d92b447351144c756a82"}, + {file = "yarl-1.15.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:98d8dc1e8133f86d916125deca9780d791b22645f0d62bafe1452d1cd5eac631"}, + {file = "yarl-1.15.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d0f16c87c62b7a94b389ddf6a8c9d081265d788875c39f3a80108c4856eea7b"}, + {file = "yarl-1.15.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8de5328d91859b461899497980d4cc8269e84e2d18640f6ac643886fda9000bf"}, + {file = "yarl-1.15.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84937d00e2ea03616c40977de20189fa13a9213e5744a3c6afa0e7dd9141d69c"}, + {file = "yarl-1.15.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:691a3b498fdebef63308e8967bb598cfd326c56d628da82b799dd181bace4503"}, + {file = "yarl-1.15.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a706db0c3b7e4578ff34ed2b1d2507b08fd491346ffc64468786fdf1151d938"}, + {file = "yarl-1.15.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:adb6b5d07d17c32f9d34c9dd4a693637a72323cfcb1f8a52d57033ab2dd21e99"}, + {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e100c6c7d9e9d469009fd55cc4d7ad168d67d40758865c50da713f7ada491e5"}, + {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:df6b254e55c8ac2362afaa651e3e53453aa19a095570792346245773b434176e"}, + {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8721f8bedaa722c3c483cc06a1399cbfdb280eadf443aa5d324b0203cef2a75f"}, + {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1005921b30f4f39bf893946df6173567ff650307babb5ec04bbf64342a1f62c1"}, + {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ab79cc13307065a0b3ef087f09f0509996fc605d35d6642bb28e5d85b2648e1e"}, + {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f337486742c700b102d640830aab3faf2848bed966b479a39e6783edd4ab1c6c"}, + {file = "yarl-1.15.4-cp311-cp311-win32.whl", hash = "sha256:20acf84bd1ce530065f8e957e4a5878fda4bc5f18cb02659828210e1519de54e"}, + {file = "yarl-1.15.4-cp311-cp311-win_amd64.whl", hash = "sha256:ab9ccf26cb3fa32747ba2a637a189d2d42386a2fc4afc10dbc7f85922dd23b0f"}, + {file = "yarl-1.15.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f923e94e93a37fd990e8336e0b9bedea533e7cbed14e0c572bf9357ef2a70681"}, + {file = "yarl-1.15.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3198da7d7c34e29fc8c823e0c3ce6c7274aac35760de557c2017489c7d98fc5a"}, + {file = "yarl-1.15.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d886de2ea81f513ba2d6820451d33b767a97c37867ba688d42e164b2dbca1362"}, + {file = "yarl-1.15.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ac85e760543129a1912a82438fc8075223e35eaa2d457d61cd83c27d00d17be"}, + {file = "yarl-1.15.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e58c5d07b1f78dd4cb180c5b3b82465cd281aaeee8aafea0e5d72a4b97922cb1"}, + {file = "yarl-1.15.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9060589d0acad1fca048861fa9ee3e8ed060f67894fa885969648ab6e9e99a54"}, + {file = "yarl-1.15.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccd6774aa7bebdf9ca608bb0839318757a71b8e0d2cf7b10c002bc8790bd343e"}, + {file = "yarl-1.15.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7694f109867ee428c21b85ae19fd31d164c691eb45cc95c561cfdeba237a12e3"}, + {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:83e7154aa0d17f5c93d27ac01088fd9ab6673e7bab1acbd07cd7a865b980c045"}, + {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f16d1940c0cbc342f1d29d6212a006d172be616d2942c5c41966e8a3ce4c3be1"}, + {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7d5226c70af3ad9569ccc4ccc04ab65be79eeb22c87d7ae789c89e62ef76bbd6"}, + {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f25906e4a72d9833e81717c39a39dee7297ff5cb44957d06d177a2ab8ef2ef7f"}, + {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e07e4b17b648c880e8e42bf1ac0a730bde114961646ae1c2ec4433f0c11ca94"}, + {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f8136bde8dfa4477c6a85c79a366581b4a505b51a52b669318fb631d3f4f638"}, + {file = "yarl-1.15.4-cp312-cp312-win32.whl", hash = "sha256:ccbeaf5b18b173b9d78e332e017b30ba8bedcf03cdce1d13490b82a3f421bc98"}, + {file = "yarl-1.15.4-cp312-cp312-win_amd64.whl", hash = "sha256:f74f6ffdc633aefecbc80282242a5395058db9d1247fa7dd2f070ef84dc82583"}, + {file = "yarl-1.15.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4f66a0eda48844508736e47ed476d8fdd7cdbf16a4053b5d439509a25f708504"}, + {file = "yarl-1.15.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fd2bb86f40962d53a91def15a2f7684c62e081a7b96ec74ed0259c34b15973b9"}, + {file = "yarl-1.15.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f864b412557e69a6b953d62c01a0ed0ee342666298aa7f2a29af526bfa80f6e9"}, + {file = "yarl-1.15.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a79c0a8bbb046add85663af85e9993b691bf20c2a109518bd35e0ce77edfe42"}, + {file = "yarl-1.15.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de479e30abd2dfd49fdad3bd6953f2d930a45380be5143c0c9f7a1215cffc8cc"}, + {file = "yarl-1.15.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21fabe58042f3e567b4edc75b2cf44cea02f228e41ac09d73de126bf685fe883"}, + {file = "yarl-1.15.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77390496f2f32437a721c854897f889abefae0f3009daf90a2f703508d96c920"}, + {file = "yarl-1.15.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3896bf15284dd23acab1f2e7fceb350d8da6f6f2436b922f7ec6b3de685d34ca"}, + {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:590e2d733a82ecf004c5c531cbef0d6be328e93adec960024eb213f10cb9503e"}, + {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:1ceb677fb583971351627eac70eec6763fbc889761828da7a276681b5e39742d"}, + {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:69f628d2da1489b27959f4d63fdb326781fe484944dce94abbf919e416c54abe"}, + {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:35a6b69cc44bda002705d6138346bf0a0234cbb7c26c3bf192513eb946aee6f9"}, + {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:49f886e8dcf591275c6e20915b516fd81647857566b0c0158c52df1e468849c9"}, + {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:49190eb2ece70313742b0ea51520340288a059674da1f39eefb589d598d9453e"}, + {file = "yarl-1.15.4-cp313-cp313-win32.whl", hash = "sha256:48334a6c8afee93097eb17c0a094234dac2d88da076c8cf372e09e2a5dcc4b66"}, + {file = "yarl-1.15.4-cp313-cp313-win_amd64.whl", hash = "sha256:f68025d6ba1816428b7de615c80f61cb03d5b7061158d4ced7696657a64aa59c"}, + {file = "yarl-1.15.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8b569f4f511b59518ba6719feb5b8bf0a5d4115e6ac903c89e10a8a9ac656017"}, + {file = "yarl-1.15.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fe17744d60fc404ac61f824118e1e15ce3c2e92eced9b8e22f3c7847acafbf2"}, + {file = "yarl-1.15.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:115346433fad2084ee3a1a925ccc0659990aa42e208ca54c278830a150a3caf3"}, + {file = "yarl-1.15.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60165b8bc260f453321004b193770a66cc1b1a5c57c07d4b8dcc96839e7ad578"}, + {file = "yarl-1.15.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65a0168691373e08d869d48b62c8bed0af0cdaef19c76e11ad73b43901bbdb5a"}, + {file = "yarl-1.15.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:787532f00543a21b8f4ec3050b4e01b8fe437797903c0156a0b03dfca5e1ba6c"}, + {file = "yarl-1.15.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f51c9d173e5fa4b12d06ddca09a41cabbdeb660471dbe55432423eec095709ab"}, + {file = "yarl-1.15.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c96eaa30030e1cfafe533f3da8983812281235b7c50ef2a6c78ceca7aea1a0b"}, + {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4feab2dcb725eb5b4835207ecf3d370ff7ce930b253cba5e681646cb80d64c2c"}, + {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:de38b0b5b86e57efb129d179854e78b65cb8e294a8c75560877869c43aa2415a"}, + {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:65e0467f90f2acf3bc83bbfeedece8f1fd84df8add1a54e9600ed7b7b5debdb0"}, + {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:40c18f96696549e73b92dc12619f07019cbf5faefc1612608f967c144816e493"}, + {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:46491b3e058de7b484e1c9fb20aa8441f06d6c9a18395d711c1c2a9ad6707d6a"}, + {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:faa3dd7f4620ab5e5da7a0789d0aac78a9ad0376f102409d442ec5a4179e200a"}, + {file = "yarl-1.15.4-cp39-cp39-win32.whl", hash = "sha256:c33ea7c55a73be343f02361795caf52a187357ea07708fb1cae6661ee1d689c8"}, + {file = "yarl-1.15.4-cp39-cp39-win_amd64.whl", hash = "sha256:11b207061f28b4b6d980239b22ab0ecfadc47846b5a3b8e79f27fcc019d02cf9"}, + {file = "yarl-1.15.4-py3-none-any.whl", hash = "sha256:e5cc288111c450c0a54a74475591b206d3b1cb47dc71bb6200f6be8b1337184c"}, + {file = "yarl-1.15.4.tar.gz", hash = "sha256:a0c5e271058d148d730219ca4f33c5d841c6bd46e05b0da60fea7b516906ccd3"}, ] [package.dependencies] From d3b0c7477d605f01699e3624b2e161200eaa6b7f Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 18 Oct 2024 15:45:08 +1100 Subject: [PATCH 166/224] Fix signal handling log --- nautilus_trader/live/node.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_trader/live/node.py b/nautilus_trader/live/node.py index e9e5a8724212..542eed8ab7fa 100644 --- a/nautilus_trader/live/node.py +++ b/nautilus_trader/live/node.py @@ -465,5 +465,5 @@ def dispose(self) -> None: self.kernel.logger.info("DISPOSED") def _loop_sig_handler(self, sig: signal.Signals) -> None: - self.kernel.logger.warning(f"Received {sig!r}, shutting down") + self.kernel.logger.warning(f"Received {sig.name}, shutting down") self.stop() From b7258193719e6201e4081d814f0405c0a175a89f Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 18 Oct 2024 16:20:40 +1100 Subject: [PATCH 167/224] Skip processing monthly bars in OrderMatchingEngine --- nautilus_trader/backtest/matching_engine.pyx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/nautilus_trader/backtest/matching_engine.pyx b/nautilus_trader/backtest/matching_engine.pyx index c95ecdac4e41..b589fe20235d 100644 --- a/nautilus_trader/backtest/matching_engine.pyx +++ b/nautilus_trader/backtest/matching_engine.pyx @@ -35,6 +35,7 @@ from nautilus_trader.core.rust.model cimport AggregationSource from nautilus_trader.core.rust.model cimport AggressorSide from nautilus_trader.core.rust.model cimport BookType from nautilus_trader.core.rust.model cimport ContingencyType +from nautilus_trader.core.rust.model cimport InstrumentCloseType from nautilus_trader.core.rust.model cimport LiquiditySide from nautilus_trader.core.rust.model cimport MarketStatus from nautilus_trader.core.rust.model cimport MarketStatusAction @@ -60,12 +61,12 @@ from nautilus_trader.execution.messages cimport CancelOrder from nautilus_trader.execution.messages cimport ModifyOrder from nautilus_trader.execution.trailing cimport TrailingStopCalculator from nautilus_trader.model.book cimport OrderBook +from nautilus_trader.model.data cimport BarAggregation from nautilus_trader.model.data cimport BarType from nautilus_trader.model.data cimport BookOrder from nautilus_trader.model.data cimport InstrumentClose from nautilus_trader.model.data cimport QuoteTick from nautilus_trader.model.data cimport TradeTick -from nautilus_trader.model.enums import InstrumentCloseType from nautilus_trader.model.events.order cimport OrderAccepted from nautilus_trader.model.events.order cimport OrderCanceled from nautilus_trader.model.events.order cimport OrderCancelRejected @@ -485,6 +486,9 @@ cdef class OrderMatchingEngine: if bar_type.aggregation_source == AggregationSource.INTERNAL: return # Do not process internally aggregated bars + if bar_type.spec.aggregation == BarAggregation.MONTH: + return # Do not process monthly bars (there is no available `timedelta`) + cdef InstrumentId instrument_id = bar_type.instrument_id cdef BarType execution_bar_type = self._execution_bar_types.get(instrument_id) From c8017723797eea74677b13dee35d98c2e9509d66 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 18 Oct 2024 16:23:34 +1100 Subject: [PATCH 168/224] Skip processing monthly bars in OrderMatchingEngine --- nautilus_core/backtest/src/matching_engine/mod.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/nautilus_core/backtest/src/matching_engine/mod.rs b/nautilus_core/backtest/src/matching_engine/mod.rs index 3f2cc2b7dc9f..1c603eb7c93d 100644 --- a/nautilus_core/backtest/src/matching_engine/mod.rs +++ b/nautilus_core/backtest/src/matching_engine/mod.rs @@ -32,8 +32,9 @@ use nautilus_model::{ trade::TradeTick, }, enums::{ - AccountType, AggregationSource, AggressorSide, BookType, ContingencyType, LiquiditySide, - MarketStatus, MarketStatusAction, OmsType, OrderSide, OrderStatus, OrderType, PriceType, + AccountType, AggregationSource, AggressorSide, BarAggregation, BookType, ContingencyType, + LiquiditySide, MarketStatus, MarketStatusAction, OmsType, OrderSide, OrderStatus, + OrderType, PriceType, }, events::order::{ OrderAccepted, OrderCancelRejected, OrderCanceled, OrderEventAny, OrderExpired, @@ -257,6 +258,11 @@ impl OrderMatchingEngine { return; } + // Do not process monthly bars (no `timedelta` available) + if bar_type.spec().aggregation == BarAggregation::Month { + return; + } + let execution_bar_type = if let Some(execution_bar_type) = self.execution_bar_types.get(&bar.instrument_id()) { execution_bar_type.to_owned() From 952f9c888e68fc965295da72b0eb66ec36aef044 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 18 Oct 2024 16:27:48 +1100 Subject: [PATCH 169/224] Update release notes --- RELEASES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASES.md b/RELEASES.md index ab034ca292d7..cee58be7ba7e 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -41,6 +41,7 @@ Released on TBD (UTC). - Fixed check for `OmsType` in `OrderMatchingEngine` position ID processing (#2003), thanks @filipmacek - Fixed `TardisCSVDataLoader` snapshot5 and snapshot25 parsing (#2005), thanks @Pushkarm029 - Fixed Binance clients venue assignment, we should use the `client_id` params (which match the custom client `name`) to communicate with the clients, and use the same `'BINANCE'` venue identifiers +- Fixed `OrderMatchingEngine` incorrectly attempting to process monthly bars for execution (which will fail, as no reasonable `timedelta` is available) --- From 23cabd62606a8689ece5a02de63b0c89174c4af6 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 18 Oct 2024 17:21:34 +1100 Subject: [PATCH 170/224] Implement additional instruments for postgres --- .../src/sql/models/instruments.rs | 260 +++++++++++++++++- .../tests/test_cache_database_postgres.rs | 43 ++- nautilus_core/model/src/enums.rs | 15 + nautilus_core/model/src/instruments/stubs.rs | 89 +++++- .../test_cache_database_postgres.py | 3 - 5 files changed, 398 insertions(+), 12 deletions(-) diff --git a/nautilus_core/infrastructure/src/sql/models/instruments.rs b/nautilus_core/infrastructure/src/sql/models/instruments.rs index 8f03e13e3623..868ef21fb1f2 100644 --- a/nautilus_core/infrastructure/src/sql/models/instruments.rs +++ b/nautilus_core/infrastructure/src/sql/models/instruments.rs @@ -24,7 +24,8 @@ use nautilus_model::{ enums::OptionKind, identifiers::{InstrumentId, Symbol}, instruments::{ - any::InstrumentAny, crypto_future::CryptoFuture, crypto_perpetual::CryptoPerpetual, + any::InstrumentAny, betting::BettingInstrument, binary_option::BinaryOption, + crypto_future::CryptoFuture, crypto_perpetual::CryptoPerpetual, currency_pair::CurrencyPair, equity::Equity, futures_contract::FuturesContract, futures_spread::FuturesSpread, options_contract::OptionsContract, options_spread::OptionsSpread, @@ -38,6 +39,8 @@ use ustr::Ustr; use crate::sql::models::enums::AssetClassModel; pub struct InstrumentAnyModel(pub InstrumentAny); +pub struct BettingInstrumentModel(pub BettingInstrument); +pub struct BinaryOptionModel(pub BinaryOption); pub struct CryptoFutureModel(pub CryptoFuture); pub struct CryptoPerpetualModel(pub CryptoPerpetual); pub struct CurrencyPairModel(pub CurrencyPair); @@ -51,7 +54,15 @@ pub struct OptionsSpreadModel(pub OptionsSpread); impl<'r> FromRow<'r, PgRow> for InstrumentAnyModel { fn from_row(row: &'r PgRow) -> Result { let kind = row.get::("kind"); - if kind == "CRYPTO_FUTURE" { + if kind == "BETTING" { + Ok(InstrumentAnyModel(InstrumentAny::Betting( + BettingInstrumentModel::from_row(row).unwrap().0, + ))) + } else if kind == "BINARY_OPTION" { + Ok(InstrumentAnyModel(InstrumentAny::BinaryOption( + BinaryOptionModel::from_row(row).unwrap().0, + ))) + } else if kind == "CRYPTO_FUTURE" { Ok(InstrumentAnyModel(InstrumentAny::CryptoFuture( CryptoFutureModel::from_row(row).unwrap().0, ))) @@ -89,6 +100,251 @@ impl<'r> FromRow<'r, PgRow> for InstrumentAnyModel { } } +// TODO: New/updated schema required to support betting instrument loading +impl<'r> FromRow<'r, PgRow> for BettingInstrumentModel { + fn from_row(row: &'r PgRow) -> Result { + let id = row + .try_get::("id") + .map(|res| InstrumentId::from(res.as_str()))?; + let raw_symbol = row + .try_get::("raw_symbol") + .map(|res| Symbol::from(res.as_str()))?; + let event_type_id = row.try_get::("event_type_id")? as u64; + let event_type_name = row + .try_get::("event_type_name") + .map(|res| Ustr::from(res.as_str()))?; + let competition_id = row.try_get::("competition_id")? as u64; + let competition_name = row + .try_get::("competition_name") + .map(|res| Ustr::from(res.as_str()))?; + let event_id = row.try_get::("event_id")? as u64; + let event_name = row + .try_get::("event_name") + .map(|res| Ustr::from(res.as_str()))?; + let event_country_code = row + .try_get::("event_country_code") + .map(|res| Ustr::from(res.as_str()))?; + let event_open_date = row + .try_get::("event_open_date") + .map(|res| UnixNanos::from(res.as_str()))?; + let betting_type = row + .try_get::("betting_type") + .map(|res| Ustr::from(res.as_str()))?; + let market_id = row + .try_get::("market_id") + .map(|res| Ustr::from(res.as_str()))?; + let market_name = row + .try_get::("market_name") + .map(|res| Ustr::from(res.as_str()))?; + let market_type = row + .try_get::("market_type") + .map(|res| Ustr::from(res.as_str()))?; + let market_start_time = row + .try_get::("market_start_time") + .map(|res| UnixNanos::from(res.as_str()))?; + let selection_id = row.try_get::("selection_id")? as u64; + let selection_name = row + .try_get::("selection_name") + .map(|res| Ustr::from(res.as_str()))?; + let selection_handicap = row.try_get::("selection_handicap")?; + let currency = row + .try_get::("quote_currency") + .map(|res| Currency::from(res.as_str()))?; + let price_precision = row.try_get::("price_precision")? as u8; + let size_precision = row.try_get::("size_precision")? as u8; + let price_increment = row + .try_get::("price_increment") + .map(|res| Price::from_str(res.as_str()).unwrap())?; + let size_increment = row + .try_get::("size_increment") + .map(|res| Quantity::from_str(res.as_str()).unwrap())?; + let maker_fee = row + .try_get::("maker_fee") + .map(|res| Decimal::from_str(res.as_str()).unwrap())?; + let taker_fee = row + .try_get::("taker_fee") + .map(|res| Decimal::from_str(res.as_str()).unwrap())?; + let max_quantity = row + .try_get::, _>("max_quantity") + .ok() + .and_then(|res| res.map(|value| Quantity::from(value.as_str()))); + let min_quantity = row + .try_get::, _>("min_quantity") + .ok() + .and_then(|res| res.map(|value| Quantity::from(value.as_str()))); + let max_notional = row + .try_get::, _>("max_notional") + .ok() + .and_then(|res| res.map(|value| Money::from(value.as_str()))); + let min_notional = row + .try_get::, _>("min_notional") + .ok() + .and_then(|res| res.map(|value| Money::from(value.as_str()))); + let max_price = row + .try_get::, _>("max_price") + .ok() + .and_then(|res| res.map(|value| Price::from(value.as_str()))); + let min_price = row + .try_get::, _>("min_price") + .ok() + .and_then(|res| res.map(|value| Price::from(value.as_str()))); + let ts_event = row + .try_get::("ts_event") + .map(|res| UnixNanos::from(res.as_str()))?; + let ts_init = row + .try_get::("ts_init") + .map(|res| UnixNanos::from(res.as_str()))?; + + let inst = BettingInstrument::new( + id, + raw_symbol, + event_type_id, + event_type_name, + competition_id, + competition_name, + event_id, + event_name, + event_country_code, + event_open_date, + betting_type, + market_id, + market_name, + market_type, + market_start_time, + selection_id, + selection_name, + selection_handicap, + currency, + price_precision, + size_precision, + price_increment, + size_increment, + maker_fee, + taker_fee, + max_quantity, + min_quantity, + max_notional, + min_notional, + max_price, + min_price, + ts_event, + ts_init, + ); + Ok(BettingInstrumentModel(inst)) + } +} + +impl<'r> FromRow<'r, PgRow> for BinaryOptionModel { + fn from_row(row: &'r PgRow) -> Result { + let id = row + .try_get::("id") + .map(|res| InstrumentId::from(res.as_str()))?; + let raw_symbol = row + .try_get::("raw_symbol") + .map(|res| Symbol::from(res.as_str()))?; + let asset_class = row + .try_get::("asset_class") + .map(|res| res.0)?; + let currency = row + .try_get::("quote_currency") + .map(|res| Currency::from(res.as_str()))?; + let activation_ns = row + .try_get::("activation_ns") + .map(|res| UnixNanos::from(res.as_str()))?; + let expiration_ns = row + .try_get::("expiration_ns") + .map(|res| UnixNanos::from(res.as_str()))?; + let price_precision = row.try_get::("price_precision")? as u8; + let size_precision = row.try_get::("size_precision")? as u8; + let price_increment = row + .try_get::("price_increment") + .map(|res| Price::from_str(res.as_str()).unwrap())?; + let size_increment = row + .try_get::("size_increment") + .map(|res| Quantity::from_str(res.as_str()).unwrap())?; + let maker_fee = row + .try_get::("maker_fee") + .map(|res| Decimal::from_str(res.as_str()).unwrap())?; + let taker_fee = row + .try_get::("taker_fee") + .map(|res| Decimal::from_str(res.as_str()).unwrap())?; + // let outcome = row + // .try_get::, _>("outcome") + // .ok() + // .and_then(|res| res.map(|value| Ustr::from(value.as_str()))); + // let description = row + // .try_get::, _>("description") + // .ok() + // .and_then(|res| res.map(|value| Ustr::from(value.as_str()))); + let margin_init = row + .try_get::, _>("margin_init") + .ok() + .and_then(|res| res.map(|value| Decimal::from_str(value.as_str()).unwrap())); + let margin_maint = row + .try_get::, _>("margin_maint") + .ok() + .and_then(|res| res.map(|value| Decimal::from_str(value.as_str()).unwrap())); + let max_quantity = row + .try_get::, _>("max_quantity") + .ok() + .and_then(|res| res.map(|value| Quantity::from(value.as_str()))); + let min_quantity = row + .try_get::, _>("min_quantity") + .ok() + .and_then(|res| res.map(|value| Quantity::from(value.as_str()))); + let max_notional = row + .try_get::, _>("max_notional") + .ok() + .and_then(|res| res.map(|value| Money::from(value.as_str()))); + let min_notional = row + .try_get::, _>("min_notional") + .ok() + .and_then(|res| res.map(|value| Money::from(value.as_str()))); + let max_price = row + .try_get::, _>("max_price") + .ok() + .and_then(|res| res.map(|value| Price::from(value.as_str()))); + let min_price = row + .try_get::, _>("min_price") + .ok() + .and_then(|res| res.map(|value| Price::from(value.as_str()))); + let ts_event = row + .try_get::("ts_event") + .map(|res| UnixNanos::from(res.as_str()))?; + let ts_init = row + .try_get::("ts_init") + .map(|res| UnixNanos::from(res.as_str()))?; + + let inst = BinaryOption::new( + id, + raw_symbol, + asset_class, + currency, + activation_ns, + expiration_ns, + price_precision, + size_precision, + price_increment, + size_increment, + maker_fee, + taker_fee, + None, // TODO: Add to schema + None, // TODO: Add to schema + margin_init, + margin_maint, + max_quantity, + min_quantity, + max_notional, + min_notional, + max_price, + min_price, + ts_event, + ts_init, + ); + Ok(BinaryOptionModel(inst)) + } +} + impl<'r> FromRow<'r, PgRow> for CryptoFutureModel { fn from_row(row: &'r PgRow) -> Result { let id = row diff --git a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs index fd471f9fe5fb..25de7a846410 100644 --- a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs +++ b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs @@ -41,8 +41,8 @@ mod serial_tests { instruments::{ any::InstrumentAny, stubs::{ - audusd_sim, crypto_future_btcusdt, crypto_perpetual_ethusdt, currency_pair_ethusdt, - equity_aapl, futures_contract_es, options_contract_appl, + audusd_sim, binary_option, crypto_future_btcusdt, crypto_perpetual_ethusdt, + currency_pair_ethusdt, equity_aapl, futures_contract_es, options_contract_appl, }, Instrument, }, @@ -89,14 +89,19 @@ mod serial_tests { // Define currencies let btc = Currency::new("BTC", 8, 0, "BTC", CurrencyType::Crypto); let eth = Currency::new("ETH", 2, 0, "ETH", CurrencyType::Crypto); + let gbp = Currency::new("GBP", 2, 0, "GBP", CurrencyType::Fiat); let usd = Currency::new("USD", 2, 0, "USD", CurrencyType::Fiat); + let usdc = Currency::new("USDC", 8, 0, "USDC", CurrencyType::Crypto); let usdt = Currency::new("USDT", 2, 0, "USDT", CurrencyType::Crypto); // Insert all the currencies pg_cache.add_currency(&btc).unwrap(); pg_cache.add_currency(ð).unwrap(); + pg_cache.add_currency(&gbp).unwrap(); pg_cache.add_currency(&usd).unwrap(); + pg_cache.add_currency(&usdc).unwrap(); pg_cache.add_currency(&usdt).unwrap(); // Define all the instruments + let binary_option = binary_option(); let crypto_future = crypto_future_btcusdt(2, 6, Price::from("0.01"), Quantity::from("0.000001")); let crypto_perpetual = crypto_perpetual_ethusdt(); @@ -105,6 +110,9 @@ mod serial_tests { let futures_contract = futures_contract_es(None, None); let options_contract = options_contract_appl(); // Insert all the instruments + pg_cache + .add_instrument(&InstrumentAny::BinaryOption(binary_option)) + .unwrap(); pg_cache .add_instrument(&InstrumentAny::CryptoFuture(crypto_future)) .unwrap(); @@ -128,13 +136,13 @@ mod serial_tests { || { let currencies = pg_cache.load_currencies().unwrap(); let instruments = pg_cache.load_instruments().unwrap(); - currencies.len() >= 4 && instruments.len() >= 6 + currencies.len() >= 6 && instruments.len() >= 7 }, Duration::from_secs(2), ); // Check that currency list is correct let currencies = pg_cache.load_currencies().unwrap(); - assert_eq!(currencies.len(), 4); + assert_eq!(currencies.len(), 6); assert_eq!( currencies .into_values() @@ -143,7 +151,9 @@ mod serial_tests { vec![ String::from("BTC"), String::from("ETH"), + String::from("GBP"), String::from("USD"), + String::from("USDC"), String::from("USDT") ] .into_iter() @@ -158,6 +168,21 @@ mod serial_tests { pg_cache.load_currency(&Ustr::from("ETH")).unwrap().unwrap(), eth ); + assert_eq!( + pg_cache.load_currency(&Ustr::from("GBP")).unwrap().unwrap(), + gbp + ); + assert_eq!( + pg_cache.load_currency(&Ustr::from("USD")).unwrap().unwrap(), + usd + ); + assert_eq!( + pg_cache + .load_currency(&Ustr::from("USDC")) + .unwrap() + .unwrap(), + usdc + ); assert_eq!( pg_cache .load_currency(&Ustr::from("USDT")) @@ -166,6 +191,13 @@ mod serial_tests { usdt ); // Check individual instruments + assert_eq!( + pg_cache + .load_instrument(&binary_option.id()) + .unwrap() + .unwrap(), + InstrumentAny::BinaryOption(binary_option) + ); assert_eq!( pg_cache .load_instrument(&crypto_future.id()) @@ -207,10 +239,11 @@ mod serial_tests { ); // Check that instrument list is correct let instruments = pg_cache.load_instruments().unwrap(); - assert_eq!(instruments.len(), 6); + assert_eq!(instruments.len(), 7); assert_eq!( instruments.into_keys().collect::>(), vec![ + binary_option.id(), crypto_future.id(), crypto_perpetual.id(), currency_pair.id(), diff --git a/nautilus_core/model/src/enums.rs b/nautilus_core/model/src/enums.rs index 3dc03dcfeaac..3cc0504a9893 100644 --- a/nautilus_core/model/src/enums.rs +++ b/nautilus_core/model/src/enums.rs @@ -182,6 +182,21 @@ pub enum AssetClass { Alternative = 7, } +impl FromU8 for AssetClass { + fn from_u8(value: u8) -> Option { + match value { + 1 => Some(Self::FX), + 2 => Some(Self::Equity), + 3 => Some(Self::Commodity), + 4 => Some(Self::Debt), + 5 => Some(Self::Index), + 6 => Some(Self::Cryptocurrency), + 7 => Some(Self::Alternative), + _ => None, + } + } +} + /// The instrument class. #[repr(C)] #[derive( diff --git a/nautilus_core/model/src/instruments/stubs.rs b/nautilus_core/model/src/instruments/stubs.rs index 7ab23eed2119..596ccd90cec0 100644 --- a/nautilus_core/model/src/instruments/stubs.rs +++ b/nautilus_core/model/src/instruments/stubs.rs @@ -21,8 +21,8 @@ use rust_decimal_macros::dec; use ustr::Ustr; use super::{ - binary_option::BinaryOption, futures_spread::FuturesSpread, options_spread::OptionsSpread, - synthetic::SyntheticInstrument, + betting::BettingInstrument, binary_option::BinaryOption, futures_spread::FuturesSpread, + options_spread::OptionsSpread, synthetic::SyntheticInstrument, }; use crate::{ enums::{AssetClass, OptionKind}, @@ -461,6 +461,91 @@ pub fn options_spread() -> OptionsSpread { ) } +//////////////////////////////////////////////////////////////////////////////// +// BettingInstrument +//////////////////////////////////////////////////////////////////////////////// + +#[fixture] +pub fn betting() -> BettingInstrument { + let raw_symbol = Symbol::new("1-123456789"); + let id = InstrumentId::from(format!("{raw_symbol}.BETFAIR").as_str()); + let event_type_id = 6423; + let event_type_name = Ustr::from("American Football"); + let competition_id = 12282733; + let competition_name = Ustr::from("NFL"); + let event_id = 29678534; + let event_name = Ustr::from("NFL"); + let event_country_code = Ustr::from("GB"); + let event_open_date = UnixNanos::from( + Utc.with_ymd_and_hms(2022, 2, 7, 23, 30, 0) + .unwrap() + .timestamp_nanos_opt() + .unwrap() as u64, + ); + let betting_type = Ustr::from("ODDS"); + let market_id = Ustr::from("1-123456789"); + let market_name = Ustr::from("AFC Conference Winner"); + let market_type = Ustr::from("SPECIAL"); + let market_start_time = UnixNanos::from( + Utc.with_ymd_and_hms(2022, 2, 7, 23, 30, 0) + .unwrap() + .timestamp_nanos_opt() + .unwrap() as u64, + ); + let selection_id = 50214; + let selection_name = Ustr::from("Kansas City Chiefs"); + let selection_handicap = 0.0; // As per betting convention, no handicap + let currency = Currency::GBP(); + let price_increment = Price::from("0.01"); + let size_increment = Quantity::from("0.01"); + let maker_fee = Decimal::from(0); + let taker_fee = Decimal::from(0); + let max_quantity = Some(Quantity::from("1000")); + let min_quantity = Some(Quantity::from("1")); + let max_notional = Some(Money::from("10000 GBP")); + let min_notional = Some(Money::from("10 GBP")); + let max_price = Some(Price::from("100.00")); + let min_price = Some(Price::from("1.00")); + let ts_event = UnixNanos::default(); // For testing purposes + let ts_init = UnixNanos::default(); // For testing purposes + + BettingInstrument::new( + id, + raw_symbol, + event_type_id, + event_type_name, + competition_id, + competition_name, + event_id, + event_name, + event_country_code, + event_open_date, + betting_type, + market_id, + market_name, + market_type, + market_start_time, + selection_id, + selection_name, + selection_handicap, + currency, + price_increment.precision, + size_increment.precision, + price_increment, + size_increment, + maker_fee, + taker_fee, + max_quantity, + min_quantity, + max_notional, + min_notional, + max_price, + min_price, + ts_event, + ts_init, + ) +} + //////////////////////////////////////////////////////////////////////////////// // BinaryOption //////////////////////////////////////////////////////////////////////////////// diff --git a/tests/integration_tests/infrastructure/test_cache_database_postgres.py b/tests/integration_tests/infrastructure/test_cache_database_postgres.py index 76db07849cfa..011e52982eee 100644 --- a/tests/integration_tests/infrastructure/test_cache_database_postgres.py +++ b/tests/integration_tests/infrastructure/test_cache_database_postgres.py @@ -112,7 +112,6 @@ def teardown(self): ################################################################################ # General ################################################################################ - @pytest.mark.asyncio async def test_load_general_objects_when_nothing_in_cache_returns_empty_dict(self): # Arrange, Act @@ -242,7 +241,6 @@ async def test_add_instrument_crypto_perpetual(self): ################################################################################ # Instrument - Currency Pair ################################################################################ - @pytest.mark.asyncio async def test_add_instrument_currency_pair(self): self.database.add_currency(_AUDUSD_SIM.base_currency) @@ -306,7 +304,6 @@ async def test_add_instrument_currency_pair(self): ################################################################################ # Instrument - Equity ################################################################################ - @pytest.mark.asyncio async def test_add_instrument_equity(self): appl_equity = TestInstrumentProvider.equity() From e35481c81aa47fa3979d7b9170502f4613d5641e Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 18 Oct 2024 19:18:57 +1100 Subject: [PATCH 171/224] Refine PostgresCacheDatabase flush and close methods --- nautilus_core/infrastructure/Cargo.toml | 2 +- .../infrastructure/src/python/sql/cache.rs | 6 ++-- nautilus_core/infrastructure/src/sql/cache.rs | 34 +++++++++++++------ nautilus_trader/cache/postgres/adapter.py | 3 ++ .../test_cache_database_postgres.py | 1 + 5 files changed, 30 insertions(+), 16 deletions(-) diff --git a/nautilus_core/infrastructure/Cargo.toml b/nautilus_core/infrastructure/Cargo.toml index 437ce1df9ccc..da7849dbb711 100644 --- a/nautilus_core/infrastructure/Cargo.toml +++ b/nautilus_core/infrastructure/Cargo.toml @@ -41,7 +41,7 @@ redis = { version = "0.27.4", features = [ "tls-rustls", "tls-rustls-webpki-roots", ], optional = true } -sqlx = { version = "0.8.1", features = [ +sqlx = { version = "0.8.2", features = [ "postgres", "runtime-tokio", "json" diff --git a/nautilus_core/infrastructure/src/python/sql/cache.rs b/nautilus_core/infrastructure/src/python/sql/cache.rs index b6c7ac37ccfa..1b20c05f4de0 100644 --- a/nautilus_core/infrastructure/src/python/sql/cache.rs +++ b/nautilus_core/infrastructure/src/python/sql/cache.rs @@ -58,10 +58,8 @@ impl PostgresCacheDatabase { } #[pyo3(name = "flush_db")] - fn py_flush_db(slf: PyRef<'_, Self>) -> PyResult<()> { - get_runtime() - .block_on(async { DatabaseQueries::truncate(&slf.pool).await }) - .map_err(to_pyruntime_err) + fn py_flush_db(&mut self) -> PyResult<()> { + self.flush().map_err(to_pyruntime_err) } #[pyo3(name = "load")] diff --git a/nautilus_core/infrastructure/src/sql/cache.rs b/nautilus_core/infrastructure/src/sql/cache.rs index b66768bf4e14..b2389569fbbd 100644 --- a/nautilus_core/infrastructure/src/sql/cache.rs +++ b/nautilus_core/infrastructure/src/sql/cache.rs @@ -343,15 +343,21 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { fn close(&mut self) -> anyhow::Result<()> { let pool = self.pool.clone(); let (tx, rx) = std::sync::mpsc::channel(); - tokio::spawn(async move { - let result = pool.close().await; - if let Err(e) = tx.send(()) { - log::error!("Failed to send close result: {e:?}"); - } + + log::debug!("Closing connection pool"); + tokio::task::block_in_place(|| { + get_runtime().block_on(async { + pool.close().await; + if let Err(e) = tx.send(()) { + log::error!("Error closing pool: {e:?}"); + } + }); }); // Cancel message handling task - self.tx.send(DatabaseQuery::Close); + if let Err(e) = self.tx.send(DatabaseQuery::Close) { + log::error!("Error sending close: {e:?}"); + } log::debug!("Awaiting task 'cache-write'"); // Naming tasks will soon be stablized tokio::task::block_in_place(|| { @@ -368,12 +374,18 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { fn flush(&mut self) -> anyhow::Result<()> { let pool = self.pool.clone(); let (tx, rx) = std::sync::mpsc::channel(); - tokio::spawn(async move { - let result = DatabaseQueries::truncate(&pool).await; - if let Err(e) = tx.send(()) { - log::error!("Failed to send flush result: {e:?}"); - } + + tokio::task::block_in_place(|| { + get_runtime().block_on(async { + if let Err(e) = DatabaseQueries::truncate(&pool).await { + log::error!("Error flushing pool: {e:?}"); + } + if let Err(e) = tx.send(()) { + log::error!("Error sending flush result: {e:?}"); + } + }); }); + Ok(rx.recv()?) } diff --git a/nautilus_trader/cache/postgres/adapter.py b/nautilus_trader/cache/postgres/adapter.py index 241566cdd36a..1d462d29bd4c 100644 --- a/nautilus_trader/cache/postgres/adapter.py +++ b/nautilus_trader/cache/postgres/adapter.py @@ -61,6 +61,9 @@ def __init__( super().__init__(config) self._backing: PostgresCacheDatabase = PostgresCacheDatabase.connect() + def dispose(self): + self._backing.close() + def flush(self): self._backing.flush_db() diff --git a/tests/integration_tests/infrastructure/test_cache_database_postgres.py b/tests/integration_tests/infrastructure/test_cache_database_postgres.py index 011e52982eee..bd96261e2931 100644 --- a/tests/integration_tests/infrastructure/test_cache_database_postgres.py +++ b/tests/integration_tests/infrastructure/test_cache_database_postgres.py @@ -108,6 +108,7 @@ def setup(self): def teardown(self): self.database.flush() + self.database.dispose() ################################################################################ # General From 903217faf531f7461ccb2fd6da13552598412142 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 18 Oct 2024 19:26:30 +1100 Subject: [PATCH 172/224] Move async-stream dependency to workspace level --- nautilus_core/Cargo.toml | 1 + nautilus_core/adapters/Cargo.toml | 2 +- nautilus_core/infrastructure/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/nautilus_core/Cargo.toml b/nautilus_core/Cargo.toml index 13deac7ae6da..1b13a56ea1e0 100644 --- a/nautilus_core/Cargo.toml +++ b/nautilus_core/Cargo.toml @@ -28,6 +28,7 @@ documentation = "https://nautilustrader.io/docs" [workspace.dependencies] anyhow = "1.0.89" +async-stream = "0.3.6" base64 = "0.22.1" bytes = { version = "1.7.2", features = ["serde"] } chrono = { version = "0.4.38", features = ["serde"] } diff --git a/nautilus_core/adapters/Cargo.toml b/nautilus_core/adapters/Cargo.toml index 7d874d4f408d..1be46f043613 100644 --- a/nautilus_core/adapters/Cargo.toml +++ b/nautilus_core/adapters/Cargo.toml @@ -23,6 +23,7 @@ nautilus-common = { path = "../common" } nautilus-core = { path = "../core" } nautilus-model = { path = "../model", features = ["stubs"] } anyhow = { workspace = true } +async-stream = { workspace = true } base64 = { workspace = true } chrono = { workspace = true } futures-util = { workspace = true } @@ -44,7 +45,6 @@ tracing = { workspace = true } tracing-subscriber = { workspace = true } thiserror = { workspace = true } ustr = { workspace = true } -async-stream = "0.3.6" csv = "1.3.0" databento = { version = "0.14.1", optional = true } fallible-streaming-iterator = "0.1.9" diff --git a/nautilus_core/infrastructure/Cargo.toml b/nautilus_core/infrastructure/Cargo.toml index da7849dbb711..c6040f908a67 100644 --- a/nautilus_core/infrastructure/Cargo.toml +++ b/nautilus_core/infrastructure/Cargo.toml @@ -15,6 +15,7 @@ nautilus-common = { path = "../common", features = ["python"] } nautilus-core = { path = "../core" , features = ["python"] } nautilus-model = { path = "../model" , features = ["python", "stubs"] } anyhow = { workspace = true } +async-stream = { workspace = true } bytes = { workspace = true } chrono = { workspace = true } derive_builder = { workspace = true } @@ -46,7 +47,6 @@ sqlx = { version = "0.8.2", features = [ "runtime-tokio", "json" ], optional = true } -async-stream = "0.3.5" [dev-dependencies] rstest = { workspace = true } From 0acae9b74ce5784b89c99a64846d893e76098767 Mon Sep 17 00:00:00 2001 From: Filip Macek Date: Fri, 18 Oct 2024 11:28:01 +0200 Subject: [PATCH 173/224] Implement position getter for netting Oms in OrderMatchingEngine (#2014) --- .../backtest/src/matching_engine/mod.rs | 10 +- .../backtest/src/matching_engine/tests.rs | 234 +++++++++++------- 2 files changed, 147 insertions(+), 97 deletions(-) diff --git a/nautilus_core/backtest/src/matching_engine/mod.rs b/nautilus_core/backtest/src/matching_engine/mod.rs index 1c603eb7c93d..2c3d346ea2a3 100644 --- a/nautilus_core/backtest/src/matching_engine/mod.rs +++ b/nautilus_core/backtest/src/matching_engine/mod.rs @@ -880,7 +880,15 @@ impl OrderMatchingEngine { panic!("Position id should be generated. Hedging Oms type order matching engine doesnt exists in cache.") } } else { - todo!("Netting OMS position getter") + // Netting OMS (position id will be derived from instrument and strategy) + let cache = self.cache.as_ref().borrow(); + let positions_open = + cache.positions_open(None, Some(&order.instrument_id()), None, None); + if !positions_open.is_empty() { + Some(positions_open[0].id.to_owned()) + } else { + None + } } } diff --git a/nautilus_core/backtest/src/matching_engine/tests.rs b/nautilus_core/backtest/src/matching_engine/tests.rs index 60f04e7a8425..0ded519ba247 100644 --- a/nautilus_core/backtest/src/matching_engine/tests.rs +++ b/nautilus_core/backtest/src/matching_engine/tests.rs @@ -41,7 +41,7 @@ use nautilus_model::{ equity::Equity, stubs::{crypto_perpetual_ethusdt, equity_aapl, futures_contract_es}, }, - orders::{builder::OrderTestBuilder, stubs::TestOrderStubs}, + orders::{any::OrderAny, builder::OrderTestBuilder, stubs::TestOrderStubs}, position::Position, types::{price::Price, quantity::Quantity}, }; @@ -76,6 +76,60 @@ fn order_event_handler() -> ShareableMessageHandler { get_message_saving_handler::(Some(Ustr::from("ExecEngine.process"))) } +#[fixture] +fn instrument_eth_usdt(crypto_perpetual_ethusdt: CryptoPerpetual) -> InstrumentAny { + InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt) +} + +// Market buy order with corresponding fill +#[fixture] +fn market_order_buy(instrument_eth_usdt: InstrumentAny) -> OrderAny { + OrderTestBuilder::new(OrderType::Market) + .instrument_id(instrument_eth_usdt.id()) + .side(OrderSide::Buy) + .quantity(Quantity::from("1")) + .build() +} + +#[fixture] +fn market_order_fill( + instrument_eth_usdt: InstrumentAny, + account_id: AccountId, + market_order_buy: OrderAny, +) -> OrderFilled { + OrderFilled::new( + market_order_buy.trader_id(), + market_order_buy.strategy_id(), + market_order_buy.instrument_id(), + market_order_buy.client_order_id(), + VenueOrderId::new("BINANCE-1"), + account_id, + TradeId::new("1"), + market_order_buy.order_side(), + market_order_buy.order_type(), + Quantity::from("1"), + Price::from("1000.000"), + instrument_eth_usdt.quote_currency(), + LiquiditySide::Taker, + UUID4::new(), + UnixNanos::default(), + UnixNanos::default(), + false, + Some(PositionId::new("P-1")), + None, + ) +} + +// Market sell order +#[fixture] +fn market_order_sell(instrument_eth_usdt: InstrumentAny) -> OrderAny { + OrderTestBuilder::new(OrderType::Market) + .instrument_id(instrument_eth_usdt.id()) + .side(OrderSide::Sell) + .quantity(Quantity::from("1")) + .build() +} + // For valid ES futures contract currently active #[fixture] fn instrument_es() -> InstrumentAny { @@ -166,6 +220,7 @@ fn test_process_order_when_instrument_already_expired( order_event_handler: ShareableMessageHandler, account_id: AccountId, time: AtomicTime, + market_order_buy: OrderAny, ) { let instrument = InstrumentAny::FuturesContract(futures_contract_es(None, None)); @@ -183,13 +238,8 @@ fn test_process_order_when_instrument_already_expired( None, None, ); - let order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument.id()) - .side(OrderSide::Buy) - .quantity(Quantity::from("1")) - .build(); - engine.process_order(&order, account_id); + engine.process_order(&market_order_buy, account_id); // Get messages and test let saved_messages = get_order_event_handler_messages(order_event_handler); @@ -208,6 +258,7 @@ fn test_process_order_when_instrument_not_active( order_event_handler: ShareableMessageHandler, account_id: AccountId, time: AtomicTime, + market_order_buy: OrderAny, ) { let activation = UnixNanos::from( Utc.with_ymd_and_hms(2222, 4, 8, 0, 0, 0) @@ -238,13 +289,8 @@ fn test_process_order_when_instrument_not_active( None, None, ); - let order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument.id()) - .side(OrderSide::Buy) - .quantity(Quantity::from("1")) - .build(); - engine.process_order(&order, account_id); + engine.process_order(&market_order_buy, account_id); // Get messages and test let saved_messages = get_order_event_handler_messages(order_event_handler); @@ -263,7 +309,8 @@ fn test_process_order_when_invalid_quantity_precision( order_event_handler: ShareableMessageHandler, account_id: AccountId, time: AtomicTime, - instrument_es: InstrumentAny, + instrument_eth_usdt: InstrumentAny, + market_order_buy: OrderAny, ) { // Register saving message handler to exec engine endpoint msgbus.register( @@ -273,19 +320,14 @@ fn test_process_order_when_invalid_quantity_precision( // Create engine and process order let mut engine = get_order_matching_engine( - instrument_es.clone(), + instrument_eth_usdt, Rc::new(RefCell::new(msgbus)), None, None, None, ); - let order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument_es.id()) - .side(OrderSide::Buy) - .quantity(Quantity::from("1.122")) - .build(); - engine.process_order(&order, account_id); + engine.process_order(&market_order_buy, account_id); // Get messages and test let saved_messages = get_order_event_handler_messages(order_event_handler); @@ -294,7 +336,7 @@ fn test_process_order_when_invalid_quantity_precision( assert_eq!(first_message.event_type(), OrderEventType::Rejected); assert_eq!( first_message.message().unwrap(), - Ustr::from("Invalid order quantity precision for order O-19700101-000000-001-001-1, was 3 when ESZ1.GLBX size precision is 0") + Ustr::from("Invalid order quantity precision for order O-19700101-000000-001-001-1, was 0 when ETHUSDT-PERP.BINANCE size precision is 3") ); } @@ -390,6 +432,7 @@ fn test_process_order_when_shorting_equity_without_margin_account( account_id: AccountId, time: AtomicTime, equity_aapl: Equity, + market_order_sell: OrderAny, ) { let instrument = InstrumentAny::Equity(equity_aapl); // Register saving message handler to exec engine endpoint @@ -406,13 +449,8 @@ fn test_process_order_when_shorting_equity_without_margin_account( None, None, ); - let order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument.id()) - .side(OrderSide::Sell) - .quantity(Quantity::from("1")) - .build(); - engine.process_order(&order, account_id); + engine.process_order(&market_order_sell, account_id); // Get messages and test let saved_messages = get_order_event_handler_messages(order_event_handler); @@ -422,10 +460,11 @@ fn test_process_order_when_shorting_equity_without_margin_account( assert_eq!( first_message.message().unwrap(), Ustr::from( - "Short selling not permitted on a CASH account with position None and order \ - MarketOrder(SELL 1 AAPL.XNAS @ MARKET GTC, status=INITIALIZED, client_order_id=O-19700101-000000-001-001-1, \ - venue_order_id=None, position_id=None, exec_algorithm_id=None, \ - exec_spawn_id=None, tags=None)") + "Short selling not permitted on a CASH account with position None and \ + order MarketOrder(SELL 1 ETHUSDT-PERP.BINANCE @ MARKET GTC, status=INITIALIZED, \ + client_order_id=O-19700101-000000-001-001-1, venue_order_id=None, position_id=None, \ + exec_algorithm_id=None, exec_spawn_id=None, tags=None)" + ) ); } @@ -435,7 +474,7 @@ fn test_process_order_when_invalid_reduce_only( order_event_handler: ShareableMessageHandler, account_id: AccountId, time: AtomicTime, - instrument_es: InstrumentAny, + instrument_eth_usdt: InstrumentAny, engine_config: OrderMatchingEngineConfig, ) { // Register saving message handler to exec engine endpoint @@ -445,20 +484,20 @@ fn test_process_order_when_invalid_reduce_only( ); let mut engine = get_order_matching_engine( - instrument_es.clone(), + instrument_eth_usdt.clone(), Rc::new(RefCell::new(msgbus)), None, None, Some(engine_config), ); - let market_order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument_es.id()) + let market_order_reduce = OrderTestBuilder::new(OrderType::Market) + .instrument_id(instrument_eth_usdt.id()) .side(OrderSide::Buy) - .quantity(Quantity::from("1")) + .quantity(Quantity::from("1.000")) .reduce_only(true) .build(); - engine.process_order(&market_order, account_id); + engine.process_order(&market_order_reduce, account_id); // Get messages and test let saved_messages = get_order_event_handler_messages(order_event_handler); @@ -631,6 +670,8 @@ fn test_process_market_order_no_market_rejected( account_id: AccountId, time: AtomicTime, instrument_es: InstrumentAny, + market_order_buy: OrderAny, + market_order_sell: OrderAny, ) { // Register saving message handler to exec engine endpoint msgbus.register( @@ -646,16 +687,6 @@ fn test_process_market_order_no_market_rejected( None, None, ); - let market_order_buy = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument_es.id()) - .side(OrderSide::Buy) - .quantity(Quantity::from("1")) - .build(); - let market_order_sell = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument_es.id()) - .side(OrderSide::Sell) - .quantity(Quantity::from("1")) - .build(); engine.process_order(&market_order_buy, account_id); engine.process_order(&market_order_sell, account_id); @@ -669,11 +700,11 @@ fn test_process_market_order_no_market_rejected( assert_eq!(second.event_type(), OrderEventType::Rejected); assert_eq!( first.message().unwrap(), - Ustr::from("No market for ESZ1.GLBX") + Ustr::from("No market for ETHUSDT-PERP.BINANCE") ); assert_eq!( second.message().unwrap(), - Ustr::from("No market for ESZ1.GLBX") + Ustr::from("No market for ETHUSDT-PERP.BINANCE") ); } @@ -731,9 +762,8 @@ fn test_generate_venue_position_id( order_event_handler: ShareableMessageHandler, account_id: AccountId, time: AtomicTime, - crypto_perpetual_ethusdt: CryptoPerpetual, + instrument_eth_usdt: InstrumentAny, ) { - let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); // Create two order matching engines with different configs // one with and other without position ids let config_no_position_id = OrderMatchingEngineConfig { @@ -741,7 +771,7 @@ fn test_generate_venue_position_id( ..OrderMatchingEngineConfig::default() }; let mut engine_no_position_id = get_order_matching_engine_l2( - instrument.clone(), + instrument_eth_usdt.clone(), Rc::new(RefCell::new(MessageBus::default())), None, None, @@ -753,7 +783,7 @@ fn test_generate_venue_position_id( ..OrderMatchingEngineConfig::default() }; let mut engine_with_position_id = get_order_matching_engine_l2( - instrument, + instrument_eth_usdt, Rc::new(RefCell::new(MessageBus::default())), None, None, @@ -772,17 +802,17 @@ fn test_generate_venue_position_id( #[rstest] fn test_get_position_id_hedging_with_existing_position( - order_event_handler: ShareableMessageHandler, account_id: AccountId, time: AtomicTime, - crypto_perpetual_ethusdt: CryptoPerpetual, + instrument_eth_usdt: InstrumentAny, + market_order_buy: OrderAny, + market_order_fill: OrderFilled, ) { - let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); let cache = Rc::new(RefCell::new(Cache::default())); // Create oms type hedging engine let mut engine = OrderMatchingEngine::new( - instrument.clone(), + instrument_eth_usdt.clone(), 1, FillModel::default(), BookType::L1_MBP, @@ -794,34 +824,7 @@ fn test_get_position_id_hedging_with_existing_position( OrderMatchingEngineConfig::default(), ); - // Create position, order and order filled event - let order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument.id()) - .side(OrderSide::Buy) - .quantity(Quantity::from("1")) - .build(); - let order_filled = OrderFilled::new( - order.trader_id(), - order.strategy_id(), - order.instrument_id(), - order.client_order_id(), - VenueOrderId::new("BINANCE-1"), - account_id, - TradeId::new("1"), - order.order_side(), - order.order_type(), - Quantity::from("1"), - Price::from("1000"), - instrument.quote_currency(), - LiquiditySide::Taker, - UUID4::new(), - UnixNanos::default(), - UnixNanos::default(), - false, - Some(PositionId::new("P-1")), - None, - ); - let position = Position::new(&instrument, order_filled); + let position = Position::new(&instrument_eth_usdt, market_order_fill); // Add position to cache engine @@ -830,13 +833,16 @@ fn test_get_position_id_hedging_with_existing_position( .add_position(position.clone(), engine.oms_type) .unwrap(); - let position_id = engine.get_position_id(&order, None); + let position_id = engine.get_position_id(&market_order_buy, None); assert_eq!(position_id, Some(position.id)); } #[rstest] -fn test_get_position_id_hedging_with_generated_position(crypto_perpetual_ethusdt: CryptoPerpetual) { - let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt); +fn test_get_position_id_hedging_with_generated_position( + instrument_eth_usdt: InstrumentAny, + account_id: AccountId, + market_order_buy: OrderAny, +) { let cache = Rc::new(RefCell::new(Cache::default())); // Use order matching config with position ids @@ -846,7 +852,7 @@ fn test_get_position_id_hedging_with_generated_position(crypto_perpetual_ethusdt }; // Create oms type hedging engine let mut engine = OrderMatchingEngine::new( - instrument.clone(), + instrument_eth_usdt.clone(), 1, FillModel::default(), BookType::L1_MBP, @@ -857,12 +863,48 @@ fn test_get_position_id_hedging_with_generated_position(crypto_perpetual_ethusdt cache, config_with_position_id, ); - let order = OrderTestBuilder::new(OrderType::Market) - .instrument_id(instrument.id()) - .side(OrderSide::Buy) - .quantity(Quantity::from("1")) - .build(); - let position_id = engine.get_position_id(&order, None); + let position_id = engine.get_position_id(&market_order_buy, None); assert_eq!(position_id, Some(PositionId::new("BINANCE-1-1"))); } + +#[rstest] +fn test_get_position_id_netting( + instrument_eth_usdt: InstrumentAny, + account_id: AccountId, + market_order_buy: OrderAny, + market_order_fill: OrderFilled, +) { + let cache = Rc::new(RefCell::new(Cache::default())); + + // create engine with Netting OMS type + let mut engine = OrderMatchingEngine::new( + instrument_eth_usdt.clone(), + 1, + FillModel::default(), + BookType::L1_MBP, + OmsType::Netting, + AccountType::Cash, + &ATOMIC_TIME, + Rc::new(RefCell::new(MessageBus::default())), + cache, + OrderMatchingEngineConfig::default(), + ); + + // position id should be none in non-initialized position id for this instrument + let position_id = engine.get_position_id(&market_order_buy, None); + assert_eq!(position_id, None); + + // create and add position in cache + let position = Position::new(&instrument_eth_usdt, market_order_fill); + engine + .cache + .as_ref() + .borrow_mut() + .add_position(position.clone(), engine.oms_type) + .unwrap(); + + // position id should be returned for the existing position + let position_id = engine.get_position_id(&market_order_buy, None); + assert_eq!(position_id, Some(position.id)); +} From fa6ee9752e32f70b7c1ced41aa1fde9545ca5722 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Fri, 18 Oct 2024 21:06:34 +1100 Subject: [PATCH 174/224] Update release notes --- RELEASES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASES.md b/RELEASES.md index cee58be7ba7e..6b958e3fc773 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -25,7 +25,7 @@ Released on TBD (UTC). - Use Rust rate limiter for dYdX websockets (#1996, #1999), thanks @davidsblom - Improved error logs for dYdX websocket subscriptions (#1993), thanks @davidsblom - Standardized log and error message syntax in Rust -- Continue porting `SimulatedExchange` to Rust (#1997, #1998, #2001, #2003, #2004, #2006, #2007, #2009), thanks @filipmacek +- Continue porting `SimulatedExchange` and `OrderMatchingEngine` to Rust (#1997, #1998, #2001, #2003, #2004, #2006, #2007, #2009, #2014), thanks @filipmacek ### Breaking Changes - Removed legacy `TardisQuoteDataLoader` (now redundant with new Rust implemented loader) From 27f461dfa1964bc434253479a9d335dfe35a7a3c Mon Sep 17 00:00:00 2001 From: Filip Macek Date: Fri, 18 Oct 2024 22:40:54 +0200 Subject: [PATCH 175/224] Remove mutable reference in cache database trait in Rust (#2015) --- nautilus_core/common/src/cache/database.rs | 86 +++++++++--------- .../infrastructure/src/python/sql/cache.rs | 32 +++---- .../infrastructure/src/redis/cache.rs | 88 +++++++++---------- nautilus_core/infrastructure/src/sql/cache.rs | 88 +++++++++---------- .../tests/test_cache_database_postgres.rs | 18 ++-- 5 files changed, 144 insertions(+), 168 deletions(-) diff --git a/nautilus_core/common/src/cache/database.rs b/nautilus_core/common/src/cache/database.rs index 7dc96a60ea6c..021b319164c1 100644 --- a/nautilus_core/common/src/cache/database.rs +++ b/nautilus_core/common/src/cache/database.rs @@ -46,7 +46,7 @@ pub trait CacheDatabaseAdapter { fn flush(&mut self) -> anyhow::Result<()>; - fn load(&mut self) -> anyhow::Result>; + fn load(&self) -> anyhow::Result>; fn load_currencies(&mut self) -> anyhow::Result>; @@ -60,98 +60,94 @@ pub trait CacheDatabaseAdapter { fn load_positions(&mut self) -> anyhow::Result>; - fn load_index_order_position(&mut self) -> anyhow::Result>; + fn load_index_order_position(&self) -> anyhow::Result>; - fn load_index_order_client(&mut self) -> anyhow::Result>; + fn load_index_order_client(&self) -> anyhow::Result>; - fn load_currency(&mut self, code: &Ustr) -> anyhow::Result>; + fn load_currency(&self, code: &Ustr) -> anyhow::Result>; fn load_instrument( - &mut self, + &self, instrument_id: &InstrumentId, ) -> anyhow::Result>; - fn load_synthetic( - &mut self, - instrument_id: &InstrumentId, - ) -> anyhow::Result; + fn load_synthetic(&self, instrument_id: &InstrumentId) -> anyhow::Result; - fn load_account(&mut self, account_id: &AccountId) -> anyhow::Result>; + fn load_account(&self, account_id: &AccountId) -> anyhow::Result>; - fn load_order(&mut self, client_order_id: &ClientOrderId) -> anyhow::Result>; + fn load_order(&self, client_order_id: &ClientOrderId) -> anyhow::Result>; - fn load_position(&mut self, position_id: &PositionId) -> anyhow::Result; + fn load_position(&self, position_id: &PositionId) -> anyhow::Result; - fn load_actor(&mut self, component_id: &ComponentId) -> anyhow::Result>; + fn load_actor(&self, component_id: &ComponentId) -> anyhow::Result>; - fn delete_actor(&mut self, component_id: &ComponentId) -> anyhow::Result<()>; + fn delete_actor(&self, component_id: &ComponentId) -> anyhow::Result<()>; - fn load_strategy(&mut self, strategy_id: &StrategyId) - -> anyhow::Result>; + fn load_strategy(&self, strategy_id: &StrategyId) -> anyhow::Result>; - fn delete_strategy(&mut self, component_id: &StrategyId) -> anyhow::Result<()>; + fn delete_strategy(&self, component_id: &StrategyId) -> anyhow::Result<()>; - fn add(&mut self, key: String, value: Bytes) -> anyhow::Result<()>; + fn add(&self, key: String, value: Bytes) -> anyhow::Result<()>; - fn add_currency(&mut self, currency: &Currency) -> anyhow::Result<()>; + fn add_currency(&self, currency: &Currency) -> anyhow::Result<()>; - fn add_instrument(&mut self, instrument: &InstrumentAny) -> anyhow::Result<()>; + fn add_instrument(&self, instrument: &InstrumentAny) -> anyhow::Result<()>; - fn add_synthetic(&mut self, synthetic: &SyntheticInstrument) -> anyhow::Result<()>; + fn add_synthetic(&self, synthetic: &SyntheticInstrument) -> anyhow::Result<()>; - fn add_account(&mut self, account: &AccountAny) -> anyhow::Result<()>; + fn add_account(&self, account: &AccountAny) -> anyhow::Result<()>; - fn add_order(&mut self, order: &OrderAny, client_id: Option) -> anyhow::Result<()>; + fn add_order(&self, order: &OrderAny, client_id: Option) -> anyhow::Result<()>; - fn add_position(&mut self, position: &Position) -> anyhow::Result<()>; + fn add_position(&self, position: &Position) -> anyhow::Result<()>; - fn add_order_book(&mut self, order_book: &OrderBook) -> anyhow::Result<()>; + fn add_order_book(&self, order_book: &OrderBook) -> anyhow::Result<()>; - fn add_quote(&mut self, quote: &QuoteTick) -> anyhow::Result<()>; + fn add_quote(&self, quote: &QuoteTick) -> anyhow::Result<()>; - fn load_quotes(&mut self, instrument_id: &InstrumentId) -> anyhow::Result>; + fn load_quotes(&self, instrument_id: &InstrumentId) -> anyhow::Result>; - fn add_trade(&mut self, trade: &TradeTick) -> anyhow::Result<()>; + fn add_trade(&self, trade: &TradeTick) -> anyhow::Result<()>; - fn load_trades(&mut self, instrument_id: &InstrumentId) -> anyhow::Result>; + fn load_trades(&self, instrument_id: &InstrumentId) -> anyhow::Result>; - fn add_bar(&mut self, bar: &Bar) -> anyhow::Result<()>; + fn add_bar(&self, bar: &Bar) -> anyhow::Result<()>; - fn load_bars(&mut self, instrument_id: &InstrumentId) -> anyhow::Result>; + fn load_bars(&self, instrument_id: &InstrumentId) -> anyhow::Result>; - fn add_signal(&mut self, signal: &Signal) -> anyhow::Result<()>; + fn add_signal(&self, signal: &Signal) -> anyhow::Result<()>; - fn load_signals(&mut self, name: &str) -> anyhow::Result>; + fn load_signals(&self, name: &str) -> anyhow::Result>; - fn add_custom_data(&mut self, data: &CustomData) -> anyhow::Result<()>; + fn add_custom_data(&self, data: &CustomData) -> anyhow::Result<()>; - fn load_custom_data(&mut self, data_type: &DataType) -> anyhow::Result>; + fn load_custom_data(&self, data_type: &DataType) -> anyhow::Result>; fn index_venue_order_id( - &mut self, + &self, client_order_id: ClientOrderId, venue_order_id: VenueOrderId, ) -> anyhow::Result<()>; fn index_order_position( - &mut self, + &self, client_order_id: ClientOrderId, position_id: PositionId, ) -> anyhow::Result<()>; - fn update_actor(&mut self) -> anyhow::Result<()>; + fn update_actor(&self) -> anyhow::Result<()>; - fn update_strategy(&mut self) -> anyhow::Result<()>; + fn update_strategy(&self) -> anyhow::Result<()>; - fn update_account(&mut self, account: &AccountAny) -> anyhow::Result<()>; + fn update_account(&self, account: &AccountAny) -> anyhow::Result<()>; - fn update_order(&mut self, order_event: &OrderEventAny) -> anyhow::Result<()>; + fn update_order(&self, order_event: &OrderEventAny) -> anyhow::Result<()>; - fn update_position(&mut self, position: &Position) -> anyhow::Result<()>; + fn update_position(&self, position: &Position) -> anyhow::Result<()>; - fn snapshot_order_state(&mut self, order: &OrderAny) -> anyhow::Result<()>; + fn snapshot_order_state(&self, order: &OrderAny) -> anyhow::Result<()>; - fn snapshot_position_state(&mut self, position: &Position) -> anyhow::Result<()>; + fn snapshot_position_state(&self, position: &Position) -> anyhow::Result<()>; - fn heartbeat(&mut self, timestamp: UnixNanos) -> anyhow::Result<()>; + fn heartbeat(&self, timestamp: UnixNanos) -> anyhow::Result<()>; } diff --git a/nautilus_core/infrastructure/src/python/sql/cache.rs b/nautilus_core/infrastructure/src/python/sql/cache.rs index 1b20c05f4de0..74cb485db724 100644 --- a/nautilus_core/infrastructure/src/python/sql/cache.rs +++ b/nautilus_core/infrastructure/src/python/sql/cache.rs @@ -232,18 +232,18 @@ impl PostgresCacheDatabase { } #[pyo3(name = "add")] - fn py_add(mut slf: PyRefMut<'_, Self>, key: String, value: Vec) -> PyResult<()> { + fn py_add(slf: PyRefMut<'_, Self>, key: String, value: Vec) -> PyResult<()> { slf.add(key, Bytes::from(value)).map_err(to_pyruntime_err) } #[pyo3(name = "add_currency")] - fn py_add_currency(mut slf: PyRefMut<'_, Self>, currency: Currency) -> PyResult<()> { + fn py_add_currency(slf: PyRefMut<'_, Self>, currency: Currency) -> PyResult<()> { slf.add_currency(¤cy).map_err(to_pyruntime_err) } #[pyo3(name = "add_instrument")] fn py_add_instrument( - mut slf: PyRefMut<'_, Self>, + slf: PyRefMut<'_, Self>, instrument: PyObject, py: Python<'_>, ) -> PyResult<()> { @@ -254,7 +254,7 @@ impl PostgresCacheDatabase { #[pyo3(name = "add_order")] fn py_add_order( - mut slf: PyRefMut<'_, Self>, + slf: PyRefMut<'_, Self>, order: PyObject, client_id: Option, py: Python<'_>, @@ -265,46 +265,42 @@ impl PostgresCacheDatabase { } #[pyo3(name = "add_account")] - fn py_add_account( - mut slf: PyRefMut<'_, Self>, - account: PyObject, - py: Python<'_>, - ) -> PyResult<()> { + fn py_add_account(slf: PyRefMut<'_, Self>, account: PyObject, py: Python<'_>) -> PyResult<()> { let account_any = convert_pyobject_to_account_any(py, account)?; slf.add_account(&account_any).map_err(to_pyruntime_err) } #[pyo3(name = "add_quote")] - fn py_add_quote(mut slf: PyRefMut<'_, Self>, quote: PyObject, py: Python<'_>) -> PyResult<()> { + fn py_add_quote(slf: PyRefMut<'_, Self>, quote: PyObject, py: Python<'_>) -> PyResult<()> { let quote = quote.extract::(py)?; slf.add_quote("e).map_err(to_pyruntime_err) } #[pyo3(name = "add_trade")] - fn py_add_trade(mut slf: PyRefMut<'_, Self>, trade: PyObject, py: Python<'_>) -> PyResult<()> { + fn py_add_trade(slf: PyRefMut<'_, Self>, trade: PyObject, py: Python<'_>) -> PyResult<()> { let trade = trade.extract::(py)?; slf.add_trade(&trade).map_err(to_pyruntime_err) } #[pyo3(name = "add_bar")] - fn py_add_bar(mut slf: PyRefMut<'_, Self>, bar: PyObject, py: Python<'_>) -> PyResult<()> { + fn py_add_bar(slf: PyRefMut<'_, Self>, bar: PyObject, py: Python<'_>) -> PyResult<()> { let bar = bar.extract::(py)?; slf.add_bar(&bar).map_err(to_pyruntime_err) } #[pyo3(name = "add_signal")] - fn py_add_signal(mut slf: PyRefMut<'_, Self>, signal: Signal) -> PyResult<()> { + fn py_add_signal(slf: PyRefMut<'_, Self>, signal: Signal) -> PyResult<()> { slf.add_signal(&signal).map_err(to_pyruntime_err) } #[pyo3(name = "add_custom_data")] - fn py_add_custom_data(mut slf: PyRefMut<'_, Self>, data: CustomData) -> PyResult<()> { + fn py_add_custom_data(slf: PyRefMut<'_, Self>, data: CustomData) -> PyResult<()> { slf.add_custom_data(&data).map_err(to_pyruntime_err) } #[pyo3(name = "update_order")] fn py_update_order( - mut slf: PyRefMut<'_, Self>, + slf: PyRefMut<'_, Self>, order_event: PyObject, py: Python<'_>, ) -> PyResult<()> { @@ -313,11 +309,7 @@ impl PostgresCacheDatabase { } #[pyo3(name = "update_account")] - fn py_update_account( - mut slf: PyRefMut<'_, Self>, - order: PyObject, - py: Python<'_>, - ) -> PyResult<()> { + fn py_update_account(slf: PyRefMut<'_, Self>, order: PyObject, py: Python<'_>) -> PyResult<()> { let order_any = convert_pyobject_to_account_any(py, order)?; slf.update_account(&order_any).map_err(to_pyruntime_err) } diff --git a/nautilus_core/infrastructure/src/redis/cache.rs b/nautilus_core/infrastructure/src/redis/cache.rs index 80037f333a9c..de42d6eea698 100644 --- a/nautilus_core/infrastructure/src/redis/cache.rs +++ b/nautilus_core/infrastructure/src/redis/cache.rs @@ -677,7 +677,7 @@ impl CacheDatabaseAdapter for RedisCacheDatabaseAdapter { Ok(()) } - fn load(&mut self) -> anyhow::Result> { + fn load(&self) -> anyhow::Result> { // self.database.load() Ok(HashMap::new()) // TODO } @@ -786,137 +786,131 @@ impl CacheDatabaseAdapter for RedisCacheDatabaseAdapter { Ok(positions) } - fn load_index_order_position(&mut self) -> anyhow::Result> { + fn load_index_order_position(&self) -> anyhow::Result> { todo!() } - fn load_index_order_client(&mut self) -> anyhow::Result> { + fn load_index_order_client(&self) -> anyhow::Result> { todo!() } - fn load_currency(&mut self, code: &Ustr) -> anyhow::Result> { + fn load_currency(&self, code: &Ustr) -> anyhow::Result> { todo!() } fn load_instrument( - &mut self, + &self, instrument_id: &InstrumentId, ) -> anyhow::Result> { todo!() } - fn load_synthetic( - &mut self, - instrument_id: &InstrumentId, - ) -> anyhow::Result { + fn load_synthetic(&self, instrument_id: &InstrumentId) -> anyhow::Result { todo!() } - fn load_account(&mut self, account_id: &AccountId) -> anyhow::Result> { + fn load_account(&self, account_id: &AccountId) -> anyhow::Result> { todo!() } - fn load_order(&mut self, client_order_id: &ClientOrderId) -> anyhow::Result> { + fn load_order(&self, client_order_id: &ClientOrderId) -> anyhow::Result> { todo!() } - fn load_position(&mut self, position_id: &PositionId) -> anyhow::Result { + fn load_position(&self, position_id: &PositionId) -> anyhow::Result { todo!() } - fn load_actor(&mut self, component_id: &ComponentId) -> anyhow::Result> { + fn load_actor(&self, component_id: &ComponentId) -> anyhow::Result> { todo!() } - fn delete_actor(&mut self, component_id: &ComponentId) -> anyhow::Result<()> { + fn delete_actor(&self, component_id: &ComponentId) -> anyhow::Result<()> { todo!() } - fn load_strategy( - &mut self, - strategy_id: &StrategyId, - ) -> anyhow::Result> { + fn load_strategy(&self, strategy_id: &StrategyId) -> anyhow::Result> { todo!() } - fn delete_strategy(&mut self, component_id: &StrategyId) -> anyhow::Result<()> { + fn delete_strategy(&self, component_id: &StrategyId) -> anyhow::Result<()> { todo!() } - fn add(&mut self, key: String, value: Bytes) -> anyhow::Result<()> { + fn add(&self, key: String, value: Bytes) -> anyhow::Result<()> { todo!() } - fn add_currency(&mut self, currency: &Currency) -> anyhow::Result<()> { + fn add_currency(&self, currency: &Currency) -> anyhow::Result<()> { todo!() } - fn add_instrument(&mut self, instrument: &InstrumentAny) -> anyhow::Result<()> { + fn add_instrument(&self, instrument: &InstrumentAny) -> anyhow::Result<()> { todo!() } - fn add_synthetic(&mut self, synthetic: &SyntheticInstrument) -> anyhow::Result<()> { + fn add_synthetic(&self, synthetic: &SyntheticInstrument) -> anyhow::Result<()> { todo!() } - fn add_account(&mut self, account: &AccountAny) -> anyhow::Result<()> { + fn add_account(&self, account: &AccountAny) -> anyhow::Result<()> { todo!() } - fn add_order(&mut self, order: &OrderAny, client_id: Option) -> anyhow::Result<()> { + fn add_order(&self, order: &OrderAny, client_id: Option) -> anyhow::Result<()> { todo!() } - fn add_position(&mut self, position: &Position) -> anyhow::Result<()> { + fn add_position(&self, position: &Position) -> anyhow::Result<()> { todo!() } - fn add_order_book(&mut self, order_book: &OrderBook) -> anyhow::Result<()> { + fn add_order_book(&self, order_book: &OrderBook) -> anyhow::Result<()> { anyhow::bail!("Saving market data for Redis cache adapter not supported") } - fn add_quote(&mut self, quote: &QuoteTick) -> anyhow::Result<()> { + fn add_quote(&self, quote: &QuoteTick) -> anyhow::Result<()> { anyhow::bail!("Saving market data for Redis cache adapter not supported") } - fn load_quotes(&mut self, instrument_id: &InstrumentId) -> anyhow::Result> { + fn load_quotes(&self, instrument_id: &InstrumentId) -> anyhow::Result> { anyhow::bail!("Loading quote data for Redis cache adapter not supported") } - fn add_trade(&mut self, trade: &TradeTick) -> anyhow::Result<()> { + fn add_trade(&self, trade: &TradeTick) -> anyhow::Result<()> { anyhow::bail!("Saving market data for Redis cache adapter not supported") } - fn load_trades(&mut self, instrument_id: &InstrumentId) -> anyhow::Result> { + fn load_trades(&self, instrument_id: &InstrumentId) -> anyhow::Result> { anyhow::bail!("Loading market data for Redis cache adapter not supported") } - fn add_bar(&mut self, bar: &Bar) -> anyhow::Result<()> { + fn add_bar(&self, bar: &Bar) -> anyhow::Result<()> { anyhow::bail!("Saving market data for Redis cache adapter not supported") } - fn load_bars(&mut self, instrument_id: &InstrumentId) -> anyhow::Result> { + fn load_bars(&self, instrument_id: &InstrumentId) -> anyhow::Result> { anyhow::bail!("Loading market data for Redis cache adapter not supported") } - fn add_signal(&mut self, signal: &Signal) -> anyhow::Result<()> { + fn add_signal(&self, signal: &Signal) -> anyhow::Result<()> { anyhow::bail!("Saving signals for Redis cache adapter not supported") } - fn load_signals(&mut self, name: &str) -> anyhow::Result> { + fn load_signals(&self, name: &str) -> anyhow::Result> { anyhow::bail!("Loading signals from Redis cache adapter not supported") } - fn add_custom_data(&mut self, data: &CustomData) -> anyhow::Result<()> { + fn add_custom_data(&self, data: &CustomData) -> anyhow::Result<()> { anyhow::bail!("Saving custom data for Redis cache adapter not supported") } - fn load_custom_data(&mut self, data_type: &DataType) -> anyhow::Result> { + fn load_custom_data(&self, data_type: &DataType) -> anyhow::Result> { anyhow::bail!("Loading custom data from Redis cache adapter not supported") } fn index_venue_order_id( - &mut self, + &self, client_order_id: ClientOrderId, venue_order_id: VenueOrderId, ) -> anyhow::Result<()> { @@ -924,42 +918,42 @@ impl CacheDatabaseAdapter for RedisCacheDatabaseAdapter { } fn index_order_position( - &mut self, + &self, client_order_id: ClientOrderId, position_id: PositionId, ) -> anyhow::Result<()> { todo!() } - fn update_actor(&mut self) -> anyhow::Result<()> { + fn update_actor(&self) -> anyhow::Result<()> { todo!() } - fn update_strategy(&mut self) -> anyhow::Result<()> { + fn update_strategy(&self) -> anyhow::Result<()> { todo!() } - fn update_account(&mut self, account: &AccountAny) -> anyhow::Result<()> { + fn update_account(&self, account: &AccountAny) -> anyhow::Result<()> { todo!() } - fn update_order(&mut self, order_event: &OrderEventAny) -> anyhow::Result<()> { + fn update_order(&self, order_event: &OrderEventAny) -> anyhow::Result<()> { todo!() } - fn update_position(&mut self, position: &Position) -> anyhow::Result<()> { + fn update_position(&self, position: &Position) -> anyhow::Result<()> { todo!() } - fn snapshot_order_state(&mut self, order: &OrderAny) -> anyhow::Result<()> { + fn snapshot_order_state(&self, order: &OrderAny) -> anyhow::Result<()> { todo!() } - fn snapshot_position_state(&mut self, position: &Position) -> anyhow::Result<()> { + fn snapshot_position_state(&self, position: &Position) -> anyhow::Result<()> { todo!() } - fn heartbeat(&mut self, timestamp: UnixNanos) -> anyhow::Result<()> { + fn heartbeat(&self, timestamp: UnixNanos) -> anyhow::Result<()> { todo!() } } diff --git a/nautilus_core/infrastructure/src/sql/cache.rs b/nautilus_core/infrastructure/src/sql/cache.rs index b2389569fbbd..4d0dde131a08 100644 --- a/nautilus_core/infrastructure/src/sql/cache.rs +++ b/nautilus_core/infrastructure/src/sql/cache.rs @@ -389,7 +389,7 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { Ok(rx.recv()?) } - fn load(&mut self) -> anyhow::Result> { + fn load(&self) -> anyhow::Result> { let pool = self.pool.clone(); let (tx, rx) = std::sync::mpsc::channel(); tokio::spawn(async move { @@ -527,11 +527,11 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { todo!() } - fn load_index_order_position(&mut self) -> anyhow::Result> { + fn load_index_order_position(&self) -> anyhow::Result> { todo!() } - fn load_index_order_client(&mut self) -> anyhow::Result> { + fn load_index_order_client(&self) -> anyhow::Result> { let pool = self.pool.clone(); let (tx, rx) = std::sync::mpsc::channel(); tokio::spawn(async move { @@ -553,7 +553,7 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { Ok(rx.recv()?) } - fn load_currency(&mut self, code: &Ustr) -> anyhow::Result> { + fn load_currency(&self, code: &Ustr) -> anyhow::Result> { let pool = self.pool.clone(); let code = code.to_owned(); // Clone the code let (tx, rx) = std::sync::mpsc::channel(); @@ -577,7 +577,7 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { } fn load_instrument( - &mut self, + &self, instrument_id: &InstrumentId, ) -> anyhow::Result> { let pool = self.pool.clone(); @@ -602,14 +602,11 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { Ok(rx.recv()?) } - fn load_synthetic( - &mut self, - instrument_id: &InstrumentId, - ) -> anyhow::Result { + fn load_synthetic(&self, instrument_id: &InstrumentId) -> anyhow::Result { todo!() } - fn load_account(&mut self, account_id: &AccountId) -> anyhow::Result> { + fn load_account(&self, account_id: &AccountId) -> anyhow::Result> { let pool = self.pool.clone(); let account_id = account_id.to_owned(); let (tx, rx) = std::sync::mpsc::channel(); @@ -632,7 +629,7 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { Ok(rx.recv()?) } - fn load_order(&mut self, client_order_id: &ClientOrderId) -> anyhow::Result> { + fn load_order(&self, client_order_id: &ClientOrderId) -> anyhow::Result> { let pool = self.pool.clone(); let client_order_id = client_order_id.to_owned(); let (tx, rx) = std::sync::mpsc::channel(); @@ -653,84 +650,81 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { Ok(rx.recv()?) } - fn load_position(&mut self, position_id: &PositionId) -> anyhow::Result { + fn load_position(&self, position_id: &PositionId) -> anyhow::Result { todo!() } - fn load_actor(&mut self, component_id: &ComponentId) -> anyhow::Result> { + fn load_actor(&self, component_id: &ComponentId) -> anyhow::Result> { todo!() } - fn delete_actor(&mut self, component_id: &ComponentId) -> anyhow::Result<()> { + fn delete_actor(&self, component_id: &ComponentId) -> anyhow::Result<()> { todo!() } - fn load_strategy( - &mut self, - strategy_id: &StrategyId, - ) -> anyhow::Result> { + fn load_strategy(&self, strategy_id: &StrategyId) -> anyhow::Result> { todo!() } - fn delete_strategy(&mut self, component_id: &StrategyId) -> anyhow::Result<()> { + fn delete_strategy(&self, component_id: &StrategyId) -> anyhow::Result<()> { todo!() } - fn add(&mut self, key: String, value: Bytes) -> anyhow::Result<()> { + fn add(&self, key: String, value: Bytes) -> anyhow::Result<()> { let query = DatabaseQuery::Add(key, value.into()); self.tx .send(query) .map_err(|e| anyhow::anyhow!("Failed to send query to database message handler: {e}")) } - fn add_currency(&mut self, currency: &Currency) -> anyhow::Result<()> { + fn add_currency(&self, currency: &Currency) -> anyhow::Result<()> { let query = DatabaseQuery::AddCurrency(*currency); self.tx.send(query).map_err(|e| { anyhow::anyhow!("Failed to query add_currency to database message handler: {e}") }) } - fn add_instrument(&mut self, instrument: &InstrumentAny) -> anyhow::Result<()> { + fn add_instrument(&self, instrument: &InstrumentAny) -> anyhow::Result<()> { let query = DatabaseQuery::AddInstrument(instrument.clone()); self.tx.send(query).map_err(|e| { anyhow::anyhow!("Failed to send query add_instrument to database message handler: {e}") }) } - fn add_synthetic(&mut self, synthetic: &SyntheticInstrument) -> anyhow::Result<()> { + fn add_synthetic(&self, synthetic: &SyntheticInstrument) -> anyhow::Result<()> { todo!() } - fn add_account(&mut self, account: &AccountAny) -> anyhow::Result<()> { + fn add_account(&self, account: &AccountAny) -> anyhow::Result<()> { let query = DatabaseQuery::AddAccount(account.clone(), false); self.tx.send(query).map_err(|e| { anyhow::anyhow!("Failed to send query add_account to database message handler: {e}") }) } - fn add_order(&mut self, order: &OrderAny, client_id: Option) -> anyhow::Result<()> { + fn add_order(&self, order: &OrderAny, client_id: Option) -> anyhow::Result<()> { let query = DatabaseQuery::AddOrder(order.clone(), client_id, false); self.tx.send(query).map_err(|e| { anyhow::anyhow!("Failed to send query add_order to database message handler: {e}") }) } - fn add_position(&mut self, position: &Position) -> anyhow::Result<()> { + fn add_position(&self, position: &Position) -> anyhow::Result<()> { todo!() } - fn add_order_book(&mut self, order_book: &OrderBook) -> anyhow::Result<()> { + fn add_order_book(&self, order_book: &OrderBook) -> anyhow::Result<()> { todo!() } - fn add_quote(&mut self, quote: &QuoteTick) -> anyhow::Result<()> { + fn add_quote(&self, quote: &QuoteTick) -> anyhow::Result<()> { let query = DatabaseQuery::AddQuote(quote.to_owned()); self.tx.send(query).map_err(|e| { anyhow::anyhow!("Failed to send query add_quote to database message handler: {e}") }) } - fn load_quotes(&mut self, instrument_id: &InstrumentId) -> anyhow::Result> { + fn load_quotes(&self, instrument_id: &InstrumentId) -> anyhow::Result> { let pool = self.pool.clone(); let instrument_id = instrument_id.to_owned(); let (tx, rx) = std::sync::mpsc::channel(); @@ -755,14 +749,14 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { Ok(rx.recv()?) } - fn add_trade(&mut self, trade: &TradeTick) -> anyhow::Result<()> { + fn add_trade(&self, trade: &TradeTick) -> anyhow::Result<()> { let query = DatabaseQuery::AddTrade(trade.to_owned()); self.tx.send(query).map_err(|e| { anyhow::anyhow!("Failed to send query add_trade to database message handler: {e}") }) } - fn load_trades(&mut self, instrument_id: &InstrumentId) -> anyhow::Result> { + fn load_trades(&self, instrument_id: &InstrumentId) -> anyhow::Result> { let pool = self.pool.clone(); let instrument_id = instrument_id.to_owned(); let (tx, rx) = std::sync::mpsc::channel(); @@ -787,14 +781,14 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { Ok(rx.recv()?) } - fn add_bar(&mut self, bar: &Bar) -> anyhow::Result<()> { + fn add_bar(&self, bar: &Bar) -> anyhow::Result<()> { let query = DatabaseQuery::AddBar(bar.to_owned()); self.tx.send(query).map_err(|e| { anyhow::anyhow!("Failed to send query add_bar to database message handler: {e}") }) } - fn load_bars(&mut self, instrument_id: &InstrumentId) -> anyhow::Result> { + fn load_bars(&self, instrument_id: &InstrumentId) -> anyhow::Result> { let pool = self.pool.clone(); let instrument_id = instrument_id.to_owned(); let (tx, rx) = std::sync::mpsc::channel(); @@ -819,14 +813,14 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { Ok(rx.recv()?) } - fn add_signal(&mut self, signal: &Signal) -> anyhow::Result<()> { + fn add_signal(&self, signal: &Signal) -> anyhow::Result<()> { let query = DatabaseQuery::AddSignal(signal.to_owned()); self.tx.send(query).map_err(|e| { anyhow::anyhow!("Failed to send query add_signal to database message handler: {e}") }) } - fn load_signals(&mut self, name: &str) -> anyhow::Result> { + fn load_signals(&self, name: &str) -> anyhow::Result> { let pool = self.pool.clone(); let name = name.to_owned(); let (tx, rx) = std::sync::mpsc::channel(); @@ -849,14 +843,14 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { Ok(rx.recv()?) } - fn add_custom_data(&mut self, data: &CustomData) -> anyhow::Result<()> { + fn add_custom_data(&self, data: &CustomData) -> anyhow::Result<()> { let query = DatabaseQuery::AddCustom(data.to_owned()); self.tx.send(query).map_err(|e| { anyhow::anyhow!("Failed to send query add_signal to database message handler: {e}") }) } - fn load_custom_data(&mut self, data_type: &DataType) -> anyhow::Result> { + fn load_custom_data(&self, data_type: &DataType) -> anyhow::Result> { let pool = self.pool.clone(); let data_type = data_type.to_owned(); let (tx, rx) = std::sync::mpsc::channel(); @@ -880,7 +874,7 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { } fn index_venue_order_id( - &mut self, + &self, client_order_id: ClientOrderId, venue_order_id: VenueOrderId, ) -> anyhow::Result<()> { @@ -888,48 +882,48 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { } fn index_order_position( - &mut self, + &self, client_order_id: ClientOrderId, position_id: PositionId, ) -> anyhow::Result<()> { todo!() } - fn update_actor(&mut self) -> anyhow::Result<()> { + fn update_actor(&self) -> anyhow::Result<()> { todo!() } - fn update_strategy(&mut self) -> anyhow::Result<()> { + fn update_strategy(&self) -> anyhow::Result<()> { todo!() } - fn update_account(&mut self, account: &AccountAny) -> anyhow::Result<()> { + fn update_account(&self, account: &AccountAny) -> anyhow::Result<()> { let query = DatabaseQuery::AddAccount(account.clone(), true); self.tx.send(query).map_err(|e| { anyhow::anyhow!("Failed to send query add_account to database message handler: {e}") }) } - fn update_order(&mut self, event: &OrderEventAny) -> anyhow::Result<()> { + fn update_order(&self, event: &OrderEventAny) -> anyhow::Result<()> { let query = DatabaseQuery::UpdateOrder(event.clone()); self.tx.send(query).map_err(|e| { anyhow::anyhow!("Failed to send query update_order to database message handler: {e}") }) } - fn update_position(&mut self, position: &Position) -> anyhow::Result<()> { + fn update_position(&self, position: &Position) -> anyhow::Result<()> { todo!() } - fn snapshot_order_state(&mut self, order: &OrderAny) -> anyhow::Result<()> { + fn snapshot_order_state(&self, order: &OrderAny) -> anyhow::Result<()> { todo!() } - fn snapshot_position_state(&mut self, position: &Position) -> anyhow::Result<()> { + fn snapshot_position_state(&self, position: &Position) -> anyhow::Result<()> { todo!() } - fn heartbeat(&mut self, timestamp: UnixNanos) -> anyhow::Result<()> { + fn heartbeat(&self, timestamp: UnixNanos) -> anyhow::Result<()> { todo!() } } diff --git a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs index 25de7a846410..5aba2048c5f8 100644 --- a/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs +++ b/nautilus_core/infrastructure/tests/test_cache_database_postgres.rs @@ -61,7 +61,7 @@ mod serial_tests { #[tokio::test(flavor = "multi_thread")] async fn test_add_general_object_adds_to_cache() { - let mut pg_cache = get_pg_cache_database().await.unwrap(); + let pg_cache = get_pg_cache_database().await.unwrap(); let test_id_value = Bytes::from("test_value"); pg_cache .add(String::from("test_id"), test_id_value.clone()) @@ -261,7 +261,7 @@ mod serial_tests { let client_order_id_1 = ClientOrderId::new("O-19700101-000000-001-001-1"); let client_order_id_2 = ClientOrderId::new("O-19700101-000000-001-001-2"); let instrument = currency_pair_ethusdt(); - let mut pg_cache = get_pg_cache_database().await.unwrap(); + let pg_cache = get_pg_cache_database().await.unwrap(); let market_order = OrderTestBuilder::new(OrderType::Market) .instrument_id(instrument.id()) @@ -335,7 +335,7 @@ mod serial_tests { let client_order_id_1 = ClientOrderId::new("O-19700101-000000-001-002-1"); let instrument = InstrumentAny::CurrencyPair(currency_pair_ethusdt()); let account = account_id(); - let mut pg_cache = get_pg_cache_database().await.unwrap(); + let pg_cache = get_pg_cache_database().await.unwrap(); // add foreign key dependencies: instrument and currencies pg_cache .add_currency(&instrument.base_currency().unwrap()) @@ -391,7 +391,7 @@ mod serial_tests { #[tokio::test(flavor = "multi_thread")] async fn test_add_and_update_account() { - let mut pg_cache = get_pg_cache_database().await.unwrap(); + let pg_cache = get_pg_cache_database().await.unwrap(); let mut account = AccountAny::Cash(CashAccount::new( cash_account_state_million_usd("1000000 USD", "0 USD", "1000000 USD"), false, @@ -427,7 +427,7 @@ mod serial_tests { #[tokio::test(flavor = "multi_thread")] async fn test_postgres_cache_database_add_trade_tick() { - let mut pg_cache = get_pg_cache_database().await.unwrap(); + let pg_cache = get_pg_cache_database().await.unwrap(); // add target instrument and currencies let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt()); pg_cache @@ -455,7 +455,7 @@ mod serial_tests { #[tokio::test(flavor = "multi_thread")] async fn test_postgres_cache_database_add_quote_tick() { - let mut pg_cache = get_pg_cache_database().await.unwrap(); + let pg_cache = get_pg_cache_database().await.unwrap(); // add target instrument and currencies let instrument = InstrumentAny::CryptoPerpetual(crypto_perpetual_ethusdt()); pg_cache @@ -483,7 +483,7 @@ mod serial_tests { #[tokio::test(flavor = "multi_thread")] async fn test_postgres_cache_database_add_bar() { - let mut pg_cache = get_pg_cache_database().await.unwrap(); + let pg_cache = get_pg_cache_database().await.unwrap(); // add target instrument and currencies let instrument = InstrumentAny::CurrencyPair(audusd_sim()); pg_cache @@ -539,7 +539,7 @@ mod serial_tests { #[tokio::test(flavor = "multi_thread")] async fn test_postgres_cache_database_add_signal() { - let mut pg_cache = get_pg_cache_database().await.unwrap(); + let pg_cache = get_pg_cache_database().await.unwrap(); // Add signal let name = Ustr::from("SignalExample"); let value = "0.0".to_string(); @@ -558,7 +558,7 @@ mod serial_tests { #[tokio::test(flavor = "multi_thread")] async fn test_postgres_cache_database_add_custom_data() { - let mut pg_cache = get_pg_cache_database().await.unwrap(); + let pg_cache = get_pg_cache_database().await.unwrap(); // Add custom data let metadata = indexmap! {"a".to_string() => "1".to_string(), "b".to_string() => "2".to_string()}; From 83b96100008368cd9a9a1dc94c638b395d2478e2 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 19 Oct 2024 07:49:11 +1100 Subject: [PATCH 176/224] Update dependencies --- .pre-commit-config.yaml | 2 +- RELEASES.md | 1 + nautilus_core/Cargo.lock | 12 +- nautilus_core/Cargo.toml | 4 +- nautilus_core/infrastructure/Cargo.toml | 2 +- poetry.lock | 290 ++++++++++++------------ 6 files changed, 156 insertions(+), 155 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3eb99cf412a7..0ae5b0e9fc61 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -83,7 +83,7 @@ repos: exclude: "docs/_pygments/monokai.py" - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.9 + rev: v0.7.0 hooks: - id: ruff args: ["--fix"] diff --git a/RELEASES.md b/RELEASES.md index 6b958e3fc773..1a3d94f9de8d 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -22,6 +22,7 @@ Released on TBD (UTC). - Ported `BettingInstrument` to Rust - Refined `RateLimiter` for `WebSocketClient` and add tests (#2000), thanks @Pushkarm029 - Refined `WebSocketClient` to close existing tasks on reconnect (#1986), thanks @davidsblom +- Remove mutable references in `CacheDatabaseAdapter` trait in Rust (#2015), thanks @filipmacek - Use Rust rate limiter for dYdX websockets (#1996, #1999), thanks @davidsblom - Improved error logs for dYdX websocket subscriptions (#1993), thanks @davidsblom - Standardized log and error message syntax in Rust diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index b4498d991c70..292bdf878fb9 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -144,9 +144,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.89" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95" [[package]] name = "arc-swap" @@ -3908,9 +3908,9 @@ dependencies = [ [[package]] name = "redis" -version = "0.27.4" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6baebe319ef5e4b470f248335620098d1c2e9261e995be05f56f719ca4bdb2" +checksum = "81cccf17a692ce51b86564334614d72dcae1def0fd5ecebc9f02956da74352b5" dependencies = [ "arc-swap", "async-trait", @@ -4408,9 +4408,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.129" +version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbcf9b78a125ee667ae19388837dd12294b858d101fdd393cb9d5501ef09eb2" +checksum = "610f75ff4a8e3cb29b85da56eabdd1bff5b06739059a4b8e2967fef32e5d9944" dependencies = [ "itoa", "memchr", diff --git a/nautilus_core/Cargo.toml b/nautilus_core/Cargo.toml index 1b13a56ea1e0..3c8cf4bed89d 100644 --- a/nautilus_core/Cargo.toml +++ b/nautilus_core/Cargo.toml @@ -27,7 +27,7 @@ description = "A high-performance algorithmic trading platform and event-driven documentation = "https://nautilustrader.io/docs" [workspace.dependencies] -anyhow = "1.0.89" +anyhow = "1.0.90" async-stream = "0.3.6" base64 = "0.22.1" bytes = { version = "1.7.2", features = ["serde"] } @@ -51,7 +51,7 @@ rust_decimal = "1.36.0" rust_decimal_macros = "1.36.0" semver = "1.0.23" serde = { version = "1.0.210", features = ["derive"] } -serde_json = "1.0.129" +serde_json = "1.0.130" strum = { version = "0.26.3", features = ["derive"] } thiserror = "1.0.64" thousands = "0.2.0" diff --git a/nautilus_core/infrastructure/Cargo.toml b/nautilus_core/infrastructure/Cargo.toml index c6040f908a67..66ef32334309 100644 --- a/nautilus_core/infrastructure/Cargo.toml +++ b/nautilus_core/infrastructure/Cargo.toml @@ -32,7 +32,7 @@ serde_json = { workspace = true } tokio = { workspace = true } tracing = {workspace = true } ustr = { workspace = true } -redis = { version = "0.27.4", features = [ +redis = { version = "0.27.5", features = [ "connection-manager", "keep-alive", "sentinel", diff --git a/poetry.lock b/poetry.lock index 15217e89c98e..86aecbfc2f8e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1857,72 +1857,72 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "3.0.1" +version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" files = [ - {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:db842712984e91707437461930e6011e60b39136c7331e971952bb30465bc1a1"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ffb4a8e7d46ed96ae48805746755fadd0909fea2306f93d5d8233ba23dda12a"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67c519635a4f64e495c50e3107d9b4075aec33634272b5db1cde839e07367589"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48488d999ed50ba8d38c581d67e496f955821dc183883550a6fbc7f1aefdc170"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f31ae06f1328595d762c9a2bf29dafd8621c7d3adc130cbb46278079758779ca"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80fcbf3add8790caddfab6764bde258b5d09aefbe9169c183f88a7410f0f6dea"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3341c043c37d78cc5ae6e3e305e988532b072329639007fd408a476642a89fd6"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cb53e2a99df28eee3b5f4fea166020d3ef9116fdc5764bc5117486e6d1211b25"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-win32.whl", hash = "sha256:db15ce28e1e127a0013dfb8ac243a8e392db8c61eae113337536edb28bdc1f97"}, - {file = "MarkupSafe-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:4ffaaac913c3f7345579db4f33b0020db693f302ca5137f106060316761beea9"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b954093679d5750495725ea6f88409946d69cfb25ea7b4c846eef5044194f583"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d98e66a24497637dd31ccab090b34392dddb1f2f811c4b4cd80c230205c074a3"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad91738f14eb8da0ff82f2acd0098b6257621410dcbd4df20aaa5b4233d75a50"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7044312a928a66a4c2a22644147bc61a199c1709712069a344a3fb5cfcf16915"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a4792d3b3a6dfafefdf8e937f14906a51bd27025a36f4b188728a73382231d91"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-win32.whl", hash = "sha256:fa7d686ed9883f3d664d39d5a8e74d3c5f63e603c2e3ff0abcba23eac6542635"}, - {file = "MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8ae369e84466aa70f3154ee23c1451fda10a8ee1b63923ce76667e3077f2b0c4"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40f1e10d51c92859765522cbd79c5c8989f40f0419614bcdc5015e7b6bf97fc5"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a4cb365cb49b750bdb60b846b0c0bc49ed62e59a76635095a179d440540c346"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee3941769bd2522fe39222206f6dd97ae83c442a94c90f2b7a25d847d40f4729"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62fada2c942702ef8952754abfc1a9f7658a4d5460fabe95ac7ec2cbe0d02abc"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c2d64fdba74ad16138300815cfdc6ab2f4647e23ced81f59e940d7d4a1469d9"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fb532dd9900381d2e8f48172ddc5a59db4c445a11b9fab40b3b786da40d3b56b"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0f84af7e813784feb4d5e4ff7db633aba6c8ca64a833f61d8e4eade234ef0c38"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-win32.whl", hash = "sha256:cbf445eb5628981a80f54087f9acdbf84f9b7d862756110d172993b9a5ae81aa"}, - {file = "MarkupSafe-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:a10860e00ded1dd0a65b83e717af28845bb7bd16d8ace40fe5531491de76b79f"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e81c52638315ff4ac1b533d427f50bc0afc746deb949210bc85f05d4f15fd772"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:312387403cd40699ab91d50735ea7a507b788091c416dd007eac54434aee51da"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ae99f31f47d849758a687102afdd05bd3d3ff7dbab0a8f1587981b58a76152a"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97ff7fedf56d86bae92fa0a646ce1a0ec7509a7578e1ed238731ba13aabcd1c"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7420ceda262dbb4b8d839a4ec63d61c261e4e77677ed7c66c99f4e7cb5030dd"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45d42d132cff577c92bfba536aefcfea7e26efb975bd455db4e6602f5c9f45e7"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c8817557d0de9349109acb38b9dd570b03cc5014e8aabf1cbddc6e81005becd"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a54c43d3ec4cf2a39f4387ad044221c66a376e58c0d0e971d47c475ba79c6b5"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-win32.whl", hash = "sha256:c91b394f7601438ff79a4b93d16be92f216adb57d813a78be4446fe0f6bc2d8c"}, - {file = "MarkupSafe-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:fe32482b37b4b00c7a52a07211b479653b7fe4f22b2e481b9a9b099d8a430f2f"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:17b2aea42a7280db02ac644db1d634ad47dcc96faf38ab304fe26ba2680d359a"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:852dc840f6d7c985603e60b5deaae1d89c56cb038b577f6b5b8c808c97580f1d"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0778de17cff1acaeccc3ff30cd99a3fd5c50fc58ad3d6c0e0c4c58092b859396"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:800100d45176652ded796134277ecb13640c1a537cad3b8b53da45aa96330453"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d06b24c686a34c86c8c1fba923181eae6b10565e4d80bdd7bc1c8e2f11247aa4"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:33d1c36b90e570ba7785dacd1faaf091203d9942bc036118fab8110a401eb1a8"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:beeebf760a9c1f4c07ef6a53465e8cfa776ea6a2021eda0d0417ec41043fe984"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bbde71a705f8e9e4c3e9e33db69341d040c827c7afa6789b14c6e16776074f5a"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-win32.whl", hash = "sha256:82b5dba6eb1bcc29cc305a18a3c5365d2af06ee71b123216416f7e20d2a84e5b"}, - {file = "MarkupSafe-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:730d86af59e0e43ce277bb83970530dd223bf7f2a838e086b50affa6ec5f9295"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4935dd7883f1d50e2ffecca0aa33dc1946a94c8f3fdafb8df5c330e48f71b132"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e9393357f19954248b00bed7c56f29a25c930593a77630c719653d51e7669c2a"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40621d60d0e58aa573b68ac5e2d6b20d44392878e0bfc159012a5787c4e35bc8"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f94190df587738280d544971500b9cafc9b950d32efcb1fba9ac10d84e6aa4e6"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6a387d61fe41cdf7ea95b38e9af11cfb1a63499af2759444b99185c4ab33f5b"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8ad4ad1429cd4f315f32ef263c1342166695fad76c100c5d979c45d5570ed58b"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e24bfe89c6ac4c31792793ad9f861b8f6dc4546ac6dc8f1c9083c7c4f2b335cd"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2a4b34a8d14649315c4bc26bbfa352663eb51d146e35eef231dd739d54a5430a"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-win32.whl", hash = "sha256:242d6860f1fd9191aef5fae22b51c5c19767f93fb9ead4d21924e0bcb17619d8"}, - {file = "MarkupSafe-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:93e8248d650e7e9d49e8251f883eed60ecbc0e8ffd6349e18550925e31bd029b"}, - {file = "markupsafe-3.0.1.tar.gz", hash = "sha256:3e683ee4f5d0fa2dde4db77ed8dd8a876686e3fc417655c2ece9a90576905344"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] [[package]] @@ -3902,93 +3902,93 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "yarl" -version = "1.15.4" +version = "1.15.5" description = "Yet another URL library" optional = false python-versions = ">=3.9" files = [ - {file = "yarl-1.15.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:551205388d1da18a9975302c9a274ba24788f53bb9bb86187496ebf9e938916e"}, - {file = "yarl-1.15.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eee724176b5bc50ee64905f559345448119b860a30b9489bd7a073f61baf925f"}, - {file = "yarl-1.15.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db818e33599f7b2e4c6507f2b2c24f45ff539a1b6e4e09163bb6f3cfb4616ca7"}, - {file = "yarl-1.15.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07019a9de859c5a29916defd1e8c7557de6491a10bf50c49ff5284e6aedf5313"}, - {file = "yarl-1.15.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db64a20e78969fc66665d2e5fc96cb4f4dc80f2137d8fed4b5a650ad569bb60f"}, - {file = "yarl-1.15.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4076bfd8f1621449b19b9826848ed51bf0f2d1d38e82647c312c0730d8778903"}, - {file = "yarl-1.15.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c23a442973dba3646811c284fce3dddd7fe5c2bd674ac73a122198e8218d6115"}, - {file = "yarl-1.15.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2bdb038b3f5c284e3919218c580dedc95f592c417a358361450b9519b22f7a8"}, - {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:59db8e6888d5302b8dbca0c1026ddabe99d81d67cdc101941519e13ffc9050fe"}, - {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f3294ce265011547630a59c20085fcb6af8cc5fa1fa44a203251f7d86cd5d913"}, - {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4851618679ca70b863ba2e7109be5f09f8fd7715ec505bd42e5a947dcfde3a45"}, - {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:dce1c56beef74d9c799a6ed94001693232a1402138292353a8ce302b64f457d9"}, - {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1e7468f31de61a82817f918743e5229fce774f73fad58487cdf88eef4f06d864"}, - {file = "yarl-1.15.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:527c68f48a91d953691291d3bce0209293aa5ad13ff05286ddb506791c331818"}, - {file = "yarl-1.15.4-cp310-cp310-win32.whl", hash = "sha256:c30115cecaf25fdcb67cc71c669d08425207f62d7a2f6d5416057c1460529216"}, - {file = "yarl-1.15.4-cp310-cp310-win_amd64.whl", hash = "sha256:df09c80f4bc2bc2efde309af383c3fe8fd8c51fe0519edb350b9c9e0af43ffa4"}, - {file = "yarl-1.15.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:76259901cf1ac3db65e7e6dff04775b626d0715f9b51d92b447351144c756a82"}, - {file = "yarl-1.15.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:98d8dc1e8133f86d916125deca9780d791b22645f0d62bafe1452d1cd5eac631"}, - {file = "yarl-1.15.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d0f16c87c62b7a94b389ddf6a8c9d081265d788875c39f3a80108c4856eea7b"}, - {file = "yarl-1.15.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8de5328d91859b461899497980d4cc8269e84e2d18640f6ac643886fda9000bf"}, - {file = "yarl-1.15.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84937d00e2ea03616c40977de20189fa13a9213e5744a3c6afa0e7dd9141d69c"}, - {file = "yarl-1.15.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:691a3b498fdebef63308e8967bb598cfd326c56d628da82b799dd181bace4503"}, - {file = "yarl-1.15.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a706db0c3b7e4578ff34ed2b1d2507b08fd491346ffc64468786fdf1151d938"}, - {file = "yarl-1.15.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:adb6b5d07d17c32f9d34c9dd4a693637a72323cfcb1f8a52d57033ab2dd21e99"}, - {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e100c6c7d9e9d469009fd55cc4d7ad168d67d40758865c50da713f7ada491e5"}, - {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:df6b254e55c8ac2362afaa651e3e53453aa19a095570792346245773b434176e"}, - {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8721f8bedaa722c3c483cc06a1399cbfdb280eadf443aa5d324b0203cef2a75f"}, - {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1005921b30f4f39bf893946df6173567ff650307babb5ec04bbf64342a1f62c1"}, - {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ab79cc13307065a0b3ef087f09f0509996fc605d35d6642bb28e5d85b2648e1e"}, - {file = "yarl-1.15.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f337486742c700b102d640830aab3faf2848bed966b479a39e6783edd4ab1c6c"}, - {file = "yarl-1.15.4-cp311-cp311-win32.whl", hash = "sha256:20acf84bd1ce530065f8e957e4a5878fda4bc5f18cb02659828210e1519de54e"}, - {file = "yarl-1.15.4-cp311-cp311-win_amd64.whl", hash = "sha256:ab9ccf26cb3fa32747ba2a637a189d2d42386a2fc4afc10dbc7f85922dd23b0f"}, - {file = "yarl-1.15.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f923e94e93a37fd990e8336e0b9bedea533e7cbed14e0c572bf9357ef2a70681"}, - {file = "yarl-1.15.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3198da7d7c34e29fc8c823e0c3ce6c7274aac35760de557c2017489c7d98fc5a"}, - {file = "yarl-1.15.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d886de2ea81f513ba2d6820451d33b767a97c37867ba688d42e164b2dbca1362"}, - {file = "yarl-1.15.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ac85e760543129a1912a82438fc8075223e35eaa2d457d61cd83c27d00d17be"}, - {file = "yarl-1.15.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e58c5d07b1f78dd4cb180c5b3b82465cd281aaeee8aafea0e5d72a4b97922cb1"}, - {file = "yarl-1.15.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9060589d0acad1fca048861fa9ee3e8ed060f67894fa885969648ab6e9e99a54"}, - {file = "yarl-1.15.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccd6774aa7bebdf9ca608bb0839318757a71b8e0d2cf7b10c002bc8790bd343e"}, - {file = "yarl-1.15.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7694f109867ee428c21b85ae19fd31d164c691eb45cc95c561cfdeba237a12e3"}, - {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:83e7154aa0d17f5c93d27ac01088fd9ab6673e7bab1acbd07cd7a865b980c045"}, - {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f16d1940c0cbc342f1d29d6212a006d172be616d2942c5c41966e8a3ce4c3be1"}, - {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7d5226c70af3ad9569ccc4ccc04ab65be79eeb22c87d7ae789c89e62ef76bbd6"}, - {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f25906e4a72d9833e81717c39a39dee7297ff5cb44957d06d177a2ab8ef2ef7f"}, - {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e07e4b17b648c880e8e42bf1ac0a730bde114961646ae1c2ec4433f0c11ca94"}, - {file = "yarl-1.15.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f8136bde8dfa4477c6a85c79a366581b4a505b51a52b669318fb631d3f4f638"}, - {file = "yarl-1.15.4-cp312-cp312-win32.whl", hash = "sha256:ccbeaf5b18b173b9d78e332e017b30ba8bedcf03cdce1d13490b82a3f421bc98"}, - {file = "yarl-1.15.4-cp312-cp312-win_amd64.whl", hash = "sha256:f74f6ffdc633aefecbc80282242a5395058db9d1247fa7dd2f070ef84dc82583"}, - {file = "yarl-1.15.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4f66a0eda48844508736e47ed476d8fdd7cdbf16a4053b5d439509a25f708504"}, - {file = "yarl-1.15.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fd2bb86f40962d53a91def15a2f7684c62e081a7b96ec74ed0259c34b15973b9"}, - {file = "yarl-1.15.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f864b412557e69a6b953d62c01a0ed0ee342666298aa7f2a29af526bfa80f6e9"}, - {file = "yarl-1.15.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a79c0a8bbb046add85663af85e9993b691bf20c2a109518bd35e0ce77edfe42"}, - {file = "yarl-1.15.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de479e30abd2dfd49fdad3bd6953f2d930a45380be5143c0c9f7a1215cffc8cc"}, - {file = "yarl-1.15.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:21fabe58042f3e567b4edc75b2cf44cea02f228e41ac09d73de126bf685fe883"}, - {file = "yarl-1.15.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77390496f2f32437a721c854897f889abefae0f3009daf90a2f703508d96c920"}, - {file = "yarl-1.15.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3896bf15284dd23acab1f2e7fceb350d8da6f6f2436b922f7ec6b3de685d34ca"}, - {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:590e2d733a82ecf004c5c531cbef0d6be328e93adec960024eb213f10cb9503e"}, - {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:1ceb677fb583971351627eac70eec6763fbc889761828da7a276681b5e39742d"}, - {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:69f628d2da1489b27959f4d63fdb326781fe484944dce94abbf919e416c54abe"}, - {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:35a6b69cc44bda002705d6138346bf0a0234cbb7c26c3bf192513eb946aee6f9"}, - {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:49f886e8dcf591275c6e20915b516fd81647857566b0c0158c52df1e468849c9"}, - {file = "yarl-1.15.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:49190eb2ece70313742b0ea51520340288a059674da1f39eefb589d598d9453e"}, - {file = "yarl-1.15.4-cp313-cp313-win32.whl", hash = "sha256:48334a6c8afee93097eb17c0a094234dac2d88da076c8cf372e09e2a5dcc4b66"}, - {file = "yarl-1.15.4-cp313-cp313-win_amd64.whl", hash = "sha256:f68025d6ba1816428b7de615c80f61cb03d5b7061158d4ced7696657a64aa59c"}, - {file = "yarl-1.15.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8b569f4f511b59518ba6719feb5b8bf0a5d4115e6ac903c89e10a8a9ac656017"}, - {file = "yarl-1.15.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fe17744d60fc404ac61f824118e1e15ce3c2e92eced9b8e22f3c7847acafbf2"}, - {file = "yarl-1.15.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:115346433fad2084ee3a1a925ccc0659990aa42e208ca54c278830a150a3caf3"}, - {file = "yarl-1.15.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60165b8bc260f453321004b193770a66cc1b1a5c57c07d4b8dcc96839e7ad578"}, - {file = "yarl-1.15.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65a0168691373e08d869d48b62c8bed0af0cdaef19c76e11ad73b43901bbdb5a"}, - {file = "yarl-1.15.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:787532f00543a21b8f4ec3050b4e01b8fe437797903c0156a0b03dfca5e1ba6c"}, - {file = "yarl-1.15.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f51c9d173e5fa4b12d06ddca09a41cabbdeb660471dbe55432423eec095709ab"}, - {file = "yarl-1.15.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c96eaa30030e1cfafe533f3da8983812281235b7c50ef2a6c78ceca7aea1a0b"}, - {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4feab2dcb725eb5b4835207ecf3d370ff7ce930b253cba5e681646cb80d64c2c"}, - {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:de38b0b5b86e57efb129d179854e78b65cb8e294a8c75560877869c43aa2415a"}, - {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:65e0467f90f2acf3bc83bbfeedece8f1fd84df8add1a54e9600ed7b7b5debdb0"}, - {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:40c18f96696549e73b92dc12619f07019cbf5faefc1612608f967c144816e493"}, - {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:46491b3e058de7b484e1c9fb20aa8441f06d6c9a18395d711c1c2a9ad6707d6a"}, - {file = "yarl-1.15.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:faa3dd7f4620ab5e5da7a0789d0aac78a9ad0376f102409d442ec5a4179e200a"}, - {file = "yarl-1.15.4-cp39-cp39-win32.whl", hash = "sha256:c33ea7c55a73be343f02361795caf52a187357ea07708fb1cae6661ee1d689c8"}, - {file = "yarl-1.15.4-cp39-cp39-win_amd64.whl", hash = "sha256:11b207061f28b4b6d980239b22ab0ecfadc47846b5a3b8e79f27fcc019d02cf9"}, - {file = "yarl-1.15.4-py3-none-any.whl", hash = "sha256:e5cc288111c450c0a54a74475591b206d3b1cb47dc71bb6200f6be8b1337184c"}, - {file = "yarl-1.15.4.tar.gz", hash = "sha256:a0c5e271058d148d730219ca4f33c5d841c6bd46e05b0da60fea7b516906ccd3"}, + {file = "yarl-1.15.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b6c57972a406ea0f61e3f28f2b3a780fb71fbe1d82d267afe5a2f889a83ee7e7"}, + {file = "yarl-1.15.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c3ac5bdcc1375c8ee52784adf94edbce37c471dd2100a117cfef56fe8dbc2b4"}, + {file = "yarl-1.15.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:68d21d0563d82aaf46163eac529adac301b20be3181b8a2811f7bd5615466055"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7d317fb80bc17ed4b34a9aad8b80cef34bea0993654f3e8566daf323def7ef9"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed9c72d5361cfd5af5ccadffa8f8077f4929640e1f938aa0f4b92c5a24996ac5"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bb707859218e8335447b210f41a755e7b1367c33e87add884128bba144694a7f"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6563394492c96cb57f4dff0c69c63d2b28b5469c59c66f35a1e6451583cd0ab4"}, + {file = "yarl-1.15.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c2d1109c8d92059314cc34dd8f0a31f74b720dc140744923ed7ca228bf9b491"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8fc727f0fb388debc771eaa7091c092bd2e8b6b4741b73354b8efadcf96d6031"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:94189746c5ad62e1014a16298130e696fe593d031d442ef135fb7787b7a1f820"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b06d8b05d0fafef204d635a4711283ddbf19c7c0facdc61b4b775f6e47e2d4be"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:de6917946dc6bc237d4b354e38aa13a232e0c7948fdbdb160edee3862e9d735f"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:34816f1d833433a16c4832562a050b0a60eac53dcb71b2032e6ebff82d74b6a7"}, + {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:19e2a4b2935f95fad0949f420514c5d862f5f18058fbbfd8854f496a97d9fd87"}, + {file = "yarl-1.15.5-cp310-cp310-win32.whl", hash = "sha256:30ca64521f1a96b72886dd9e8652f16eab11891b4572dcfcfc1ad6d6ccb27abd"}, + {file = "yarl-1.15.5-cp310-cp310-win_amd64.whl", hash = "sha256:86648c53b10c53db8b967a75fb41e0c89dbec7398f6525e34af2b6c456bb0ac0"}, + {file = "yarl-1.15.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e652aa9f8dfa808bc5b2da4d1f4e286cf1d640570fdfa72ffc0c1d16ba114651"}, + {file = "yarl-1.15.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21050b6cd569980fe20ceeab4baeb900d3f7247270475e42bafe117416a5496c"}, + {file = "yarl-1.15.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:18940191ec9a83bbfe63eea61c3e9d12474bb910d5613bce8fa46e84a80b75b2"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a082dc948045606f62dca0228ab24f13737180b253378d6443f5b2b9ef8beefe"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a843e692f9d5402b3455653f4607dc521de2385f01c5cad7ba4a87c46e2ea8d"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5093a453176a4fad4f9c3006f507cf300546190bb3e27944275a37cfd6323a65"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2597a589859b94d0a5e2f5d30fee95081867926e57cb751f8b44a7dd92da4e79"}, + {file = "yarl-1.15.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f5a1ca6eaabfe62718b87eac06d9a47b30cf92ffa065fee9196d3ecd24a3cf1"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4ac83b307cc4b8907345b52994055c6c3c2601ceb6fcb94c5ed6a93c6b4e8257"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:325e2beb2cd8654b276e7686a3cd203628dd3fe32d5c616e632bc35a2901fb16"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:75d04ba8ed335042328086e643e01165e0c24598216f72da709b375930ae3bdb"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7abd7d15aedb3961a967cc65f8144dbbca42e3626a21c5f4f29919cf43eeafb9"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:294c742a273f44511f14b03a9e06b66094dcdf4bbb75a5e23fead548fd5310ae"}, + {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:63d46606b20f80a6476f1044bab78e1a69c2e0747f174583e2f12fc70bad2170"}, + {file = "yarl-1.15.5-cp311-cp311-win32.whl", hash = "sha256:b1217102a455e3ac9ac293081093f21f0183e978c7692171ff669fee5296fa28"}, + {file = "yarl-1.15.5-cp311-cp311-win_amd64.whl", hash = "sha256:5848500b6a01497560969e8c3a7eb1b2570853c74a0ca6f67ebaf6064106c49b"}, + {file = "yarl-1.15.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d3309ee667f2d9c7ac9ecf44620d6b274bfdd8065b8c5019ff6795dd887b8fed"}, + {file = "yarl-1.15.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:96ce879799fee124d241ea3b84448378f638e290c49493d00b706f3fd57ec22b"}, + {file = "yarl-1.15.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c884dfa56b050f718ea3cbbfd972e29a6f07f63a7449b10d9a20d64f7eec92e2"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0327081978fe186c3390dd4f73f95f825d0bb9c74967e22c2a1a87735974d8f5"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:524b3bb7dff320e305bc979c65eddc0342548c56ea9241502f907853fe53c408"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd56de8b645421ff09c993fdb0ee9c5a3b50d290a8f55793b500d99b34d0c1ce"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c166ad987265bb343be58cdf4fbc4478cc1d81f2246d2be9a15f94393b269faa"}, + {file = "yarl-1.15.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d56980374a10c74255fcea6ebcfb0aeca7166d212ee9fd7e823ddef35fb62ad0"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cbf36099a9b407e1456dbf55844743a98603fcba32d2a46fb3a698d926facf1b"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d7fa4b033e2f267e37aabcc36949fa89f9f1716a723395912147f9cf3fb437c7"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bb129f77ddaea2d8e6e00417b8d907448de3407af4eddacca0a515574ad71493"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:68e837b3edfcd037f9706157e7cb8efda832de6248c7d9e893e2638356dfae5d"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5b8af4165e097ff84d9bbb97bb4f4d7f71b9c1c9565a2d0e27d93e5f92dae220"}, + {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:70d074d5a96e0954fe6db81ff356f4361397da1cda3f7c127fc0902f671a087e"}, + {file = "yarl-1.15.5-cp312-cp312-win32.whl", hash = "sha256:362da97ad4360e4ef1dd24ccdd3bceb18332da7f40026a42f49b7edd686e31c3"}, + {file = "yarl-1.15.5-cp312-cp312-win_amd64.whl", hash = "sha256:9aa054d97033beac9cb9b19b7c0b8784b85b12cd17879087ca6bffba57884e02"}, + {file = "yarl-1.15.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5fadcf532fd9f6cbad71485ef8c2462dd9a91d3efc72ca01eb0970792c92552a"}, + {file = "yarl-1.15.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8b7dd6983c81523f9de0ae6334c3b7a3cb33283936e0525f80c4f713f54a9bb6"}, + {file = "yarl-1.15.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fcfd663dc88465ebe41c7c938bdc91c4b01cda96a0d64bf38fd66c1877323771"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd529e637cd23204bd82072f6637cff7af2516ad2c132e8f3342cbc84871f7d1"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b30f13fac56598474071a4f1ecd66c78fdaf2f8619042d7ca135f72dbb348cf"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44088ec0be82fba118ed29b6b429f80bf295297727adae4c257ac297e01e8bcd"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607683991bab8607e5158cd290dd8fdaa613442aeab802fe1c237d3a3eee7358"}, + {file = "yarl-1.15.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da48cdff56b01ea4282a6d04b83b07a2088351a4a3ff7aacc1e7e9b6b04b90b9"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9162ea117ce8bad8ebc95b7376b4135988acd888d2cf4702f8281e3c11f8b81f"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:e8aa19c39cb20bfb16f0266df175a6004943122cf20707fbf0cacc21f6468a25"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5d6be369488d503c8edc14e2f63d71ab2a607041ad216a8ad444fa18e8dea792"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6e2c674cfe4c03ad7a4d536b1f808221f0d11a360486b4b032d2557c0bd633ad"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:041bafaa82b77fd4ec2826d42a55461ec86d999adf7ed9644eef7e8a9febb366"}, + {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2eeb9ba53c055740cd282ae9d34eb7970d65e73a46f15adec4b0c1b0f2e55cc2"}, + {file = "yarl-1.15.5-cp313-cp313-win32.whl", hash = "sha256:73143dd279e641543da52c55652ad7b4c7c5f79e797f124f58f04cc060f14271"}, + {file = "yarl-1.15.5-cp313-cp313-win_amd64.whl", hash = "sha256:94ab1185900f43760d5487c8e49f5f1a66f864e36092f282f1813597479b9dfa"}, + {file = "yarl-1.15.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6b3d2767bd64c62909ea33525b954ba05c8f9726bfdf2141d175da4e344f19ae"}, + {file = "yarl-1.15.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:44359c52af9c383e5107f3b6301446fc8269599721fa42fafb2afb5f31a42dcb"}, + {file = "yarl-1.15.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6493da9ba5c551978c679ab04856c2cf8f79c316e8ec8c503460a135705edc3b"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a6b6e95bc621c11cf9ff21012173337e789f2461ebc3b4e5bf65c74ef69adb8"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7983290ede3aaa2c9620879530849532529b4dcbf5b12a0b6a91163a773eadb9"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07a4b53abe85813c538b9cdbb02909ebe3734e3af466a587df516e960d500cc8"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5882faa2a6e684f65ee44f18c701768749a950cbd5e72db452fc07805f6bdec0"}, + {file = "yarl-1.15.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e27861251d9c094f641d39a8a78dd2371fb9a252ea2f689d1ad353a31d46a0bc"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8669a110f655c9eb22f16fb68a7d4942020aeaa09f1def584a80183e3e89953c"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:10bfe0bef4cf5ea0383886beda004071faadedf2647048b9f876664284c5b60d"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f7de0d4b6b4d8a77e422eb54d765255c0ec6883ee03b8fd537101633948619d7"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:00bb3a559d7bd006a5302ecd7e409916939106a8cdbe31f4eb5e5b9ffcca57ea"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:06ec070a2d71415f90dbe9d70af3158e7da97a128519dba2d1581156ee27fb92"}, + {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b997a806846c00d1f41d6a251803732837771b2091bead7566f68820e317bfe7"}, + {file = "yarl-1.15.5-cp39-cp39-win32.whl", hash = "sha256:7825506fbee4055265528ec3532a8197ff26fc53d4978917a4c8ddbb4c1667d7"}, + {file = "yarl-1.15.5-cp39-cp39-win_amd64.whl", hash = "sha256:71730658be0b5de7c570a9795d7404c577b2313c1db370407092c66f70e04ccb"}, + {file = "yarl-1.15.5-py3-none-any.whl", hash = "sha256:625f31d6650829fba4030b4e7bdb2d69e41510dddfa29a1da27076c199521757"}, + {file = "yarl-1.15.5.tar.gz", hash = "sha256:8249147ee81c1cf4d1dc6f26ba28a1b9d92751529f83c308ad02164bb93abd0d"}, ] [package.dependencies] From b944f0b6a8f7a0014be17098c32dffe2695385a5 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 19 Oct 2024 08:34:02 +1100 Subject: [PATCH 177/224] Fix BettingInstrument for postgres --- .../model/src/instruments/betting.rs | 17 ++++++------ .../model/src/instruments/binary_option.rs | 2 +- .../model/src/python/instruments/betting.rs | 22 ++++++++++++++++ .../model/src/python/instruments/mod.rs | 11 +++++--- .../test_cache_database_postgres.py | 26 ++++++++++++++++++- 5 files changed, 64 insertions(+), 14 deletions(-) diff --git a/nautilus_core/model/src/instruments/betting.rs b/nautilus_core/model/src/instruments/betting.rs index f1e58cc00985..65019686644f 100644 --- a/nautilus_core/model/src/instruments/betting.rs +++ b/nautilus_core/model/src/instruments/betting.rs @@ -384,12 +384,13 @@ impl Instrument for BettingInstrument { //////////////////////////////////////////////////////////////////////////////// #[cfg(test)] mod tests { - // TODO: WIP - // use crate::instruments::{betting::BettingInstrument, stubs::*}; - // - // #[rstest] - // fn test_betting_instrument(betting: BettingInstrument) { - // let betting = betting.clone(); - // assert_eq!(betting, cloned); - // } + use rstest::rstest; + + use crate::instruments::{betting::BettingInstrument, stubs::*}; + + #[rstest] + fn test_equality(betting: BettingInstrument) { + let cloned = betting.clone(); + assert_eq!(betting, cloned); + } } diff --git a/nautilus_core/model/src/instruments/binary_option.rs b/nautilus_core/model/src/instruments/binary_option.rs index 578a70ba865c..62cf540355d0 100644 --- a/nautilus_core/model/src/instruments/binary_option.rs +++ b/nautilus_core/model/src/instruments/binary_option.rs @@ -344,7 +344,7 @@ mod tests { use crate::instruments::{binary_option::BinaryOption, stubs::*}; #[rstest] - fn test_binary_option(binary_option: BinaryOption) { + fn test_equality(binary_option: BinaryOption) { let cloned = binary_option.clone(); assert_eq!(binary_option, cloned); } diff --git a/nautilus_core/model/src/python/instruments/betting.rs b/nautilus_core/model/src/python/instruments/betting.rs index 4432490d864e..b6d616720c69 100644 --- a/nautilus_core/model/src/python/instruments/betting.rs +++ b/nautilus_core/model/src/python/instruments/betting.rs @@ -406,3 +406,25 @@ impl BettingInstrument { Ok(dict.into()) } } + +//////////////////////////////////////////////////////////////////////////////// +// Tests +//////////////////////////////////////////////////////////////////////////////// +#[cfg(test)] +mod tests { + use pyo3::{prelude::*, prepare_freethreaded_python, types::PyDict}; + use rstest::rstest; + + use crate::instruments::{betting::BettingInstrument, stubs::*}; + + #[rstest] + fn test_betting_instrument_dict_round_trip(betting: BettingInstrument) { + prepare_freethreaded_python(); + Python::with_gil(|py| { + let values = betting.py_to_dict(py).unwrap(); + let values: Py = values.extract(py).unwrap(); + let new_betting = BettingInstrument::py_from_dict(py, values).unwrap(); + assert_eq!(betting, new_betting); + }) + } +} diff --git a/nautilus_core/model/src/python/instruments/mod.rs b/nautilus_core/model/src/python/instruments/mod.rs index 954d5215b377..7021b8844caf 100644 --- a/nautilus_core/model/src/python/instruments/mod.rs +++ b/nautilus_core/model/src/python/instruments/mod.rs @@ -19,9 +19,9 @@ use nautilus_core::python::to_pyvalue_err; use pyo3::{IntoPy, PyObject, PyResult, Python}; use crate::instruments::{ - any::InstrumentAny, binary_option::BinaryOption, crypto_future::CryptoFuture, - crypto_perpetual::CryptoPerpetual, currency_pair::CurrencyPair, equity::Equity, - futures_contract::FuturesContract, futures_spread::FuturesSpread, + any::InstrumentAny, betting::BettingInstrument, binary_option::BinaryOption, + crypto_future::CryptoFuture, crypto_perpetual::CryptoPerpetual, currency_pair::CurrencyPair, + equity::Equity, futures_contract::FuturesContract, futures_spread::FuturesSpread, options_contract::OptionsContract, options_spread::OptionsSpread, }; @@ -38,6 +38,7 @@ pub mod options_spread; pub fn instrument_any_to_pyobject(py: Python, instrument: InstrumentAny) -> PyResult { match instrument { + InstrumentAny::Betting(inst) => Ok(inst.into_py(py)), InstrumentAny::BinaryOption(inst) => Ok(inst.into_py(py)), InstrumentAny::CryptoFuture(inst) => Ok(inst.into_py(py)), InstrumentAny::CryptoPerpetual(inst) => Ok(inst.into_py(py)), @@ -47,12 +48,14 @@ pub fn instrument_any_to_pyobject(py: Python, instrument: InstrumentAny) -> PyRe InstrumentAny::FuturesSpread(inst) => Ok(inst.into_py(py)), InstrumentAny::OptionsContract(inst) => Ok(inst.into_py(py)), InstrumentAny::OptionsSpread(inst) => Ok(inst.into_py(py)), - _ => Err(to_pyvalue_err("Unsupported instrument type")), } } pub fn pyobject_to_instrument_any(py: Python, instrument: PyObject) -> PyResult { match instrument.getattr(py, "type_str")?.extract::<&str>(py)? { + stringify!(BettingInstrument) => Ok(InstrumentAny::Betting( + instrument.extract::(py)?, + )), stringify!(BinaryOption) => Ok(InstrumentAny::BinaryOption( instrument.extract::(py)?, )), diff --git a/tests/integration_tests/infrastructure/test_cache_database_postgres.py b/tests/integration_tests/infrastructure/test_cache_database_postgres.py index bd96261e2931..70a735e32f40 100644 --- a/tests/integration_tests/infrastructure/test_cache_database_postgres.py +++ b/tests/integration_tests/infrastructure/test_cache_database_postgres.py @@ -162,10 +162,34 @@ async def test_add_currency(self): currencies = self.database.load_currencies() assert list(currencies.keys()) == ["BTC"] + ################################################################################ + # Instrument - Betting + ################################################################################ + @pytest.mark.skip(reason="from_pyo3 must be implemented") + @pytest.mark.asyncio + async def test_add_instrument_betting(self): + betting = TestInstrumentProvider.betting_instrument() + self.database.add_currency(betting.quote_currency) + + # Check that we have added target currencies, because of foreign key constraints + await eventually(lambda: self.database.load_currencies()) + + currencies = self.database.load_currencies() + assert list(currencies.keys()) == ["GBP"] + + # add instrument + self.database.add_instrument(betting) + + # Allow MPSC thread to insert + await eventually(lambda: self.database.load_instrument(betting.id)) + + # Assert + assert betting == self.database.load_instrument(betting.id) + ################################################################################ # Instrument - Binary Option ################################################################################ - @pytest.mark.skip(reason="WIP") + @pytest.mark.skip(reason="from_pyo3 must be implemented") @pytest.mark.asyncio async def test_add_instrument_binary_option(self): binary_option = TestInstrumentProvider.binary_option() From 18b07a3edf0ee9211f456e487e54dc2766e371c5 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 19 Oct 2024 08:39:31 +1100 Subject: [PATCH 178/224] Improve pyo3 instrument conversion testing --- .../model/src/python/instruments/betting.rs | 2 +- .../src/python/instruments/binary_option.rs | 22 ++++++++++++++++++ .../src/python/instruments/crypto_future.rs | 23 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/nautilus_core/model/src/python/instruments/betting.rs b/nautilus_core/model/src/python/instruments/betting.rs index b6d616720c69..b4cb3f06084d 100644 --- a/nautilus_core/model/src/python/instruments/betting.rs +++ b/nautilus_core/model/src/python/instruments/betting.rs @@ -418,7 +418,7 @@ mod tests { use crate::instruments::{betting::BettingInstrument, stubs::*}; #[rstest] - fn test_betting_instrument_dict_round_trip(betting: BettingInstrument) { + fn test_dict_round_trip(betting: BettingInstrument) { prepare_freethreaded_python(); Python::with_gil(|py| { let values = betting.py_to_dict(py).unwrap(); diff --git a/nautilus_core/model/src/python/instruments/binary_option.rs b/nautilus_core/model/src/python/instruments/binary_option.rs index 941330843980..791319a2095d 100644 --- a/nautilus_core/model/src/python/instruments/binary_option.rs +++ b/nautilus_core/model/src/python/instruments/binary_option.rs @@ -331,3 +331,25 @@ impl BinaryOption { Ok(dict.into()) } } + +//////////////////////////////////////////////////////////////////////////////// +// Tests +//////////////////////////////////////////////////////////////////////////////// +#[cfg(test)] +mod tests { + use pyo3::{prelude::*, prepare_freethreaded_python, types::PyDict}; + use rstest::rstest; + + use crate::instruments::{binary_option::BinaryOption, stubs::*}; + + #[rstest] + fn test_dict_round_trip(binary_option: BinaryOption) { + prepare_freethreaded_python(); + Python::with_gil(|py| { + let values = binary_option.py_to_dict(py).unwrap(); + let values: Py = values.extract(py).unwrap(); + let new_binary_option = BinaryOption::py_from_dict(py, values).unwrap(); + assert_eq!(binary_option, new_binary_option); + }) + } +} diff --git a/nautilus_core/model/src/python/instruments/crypto_future.rs b/nautilus_core/model/src/python/instruments/crypto_future.rs index 65d6e24cc56d..74bae0adc6f1 100644 --- a/nautilus_core/model/src/python/instruments/crypto_future.rs +++ b/nautilus_core/model/src/python/instruments/crypto_future.rs @@ -332,3 +332,26 @@ impl CryptoFuture { Ok(dict.into()) } } + +//////////////////////////////////////////////////////////////////////////////// +// Tests +//////////////////////////////////////////////////////////////////////////////// +#[cfg(test)] +mod tests { + use pyo3::{prelude::*, prepare_freethreaded_python, types::PyDict}; + use rstest::rstest; + + use crate::instruments::{crypto_future::CryptoFuture, stubs::*}; + + #[rstest] + fn test_dict_round_trip(crypto_future_btcusdt: CryptoFuture) { + prepare_freethreaded_python(); + Python::with_gil(|py| { + let crypto_future = crypto_future_btcusdt; + let values = crypto_future.py_to_dict(py).unwrap(); + let values: Py = values.extract(py).unwrap(); + let new_crypto_future = CryptoFuture::py_from_dict(py, values).unwrap(); + assert_eq!(crypto_future, new_crypto_future); + }) + } +} From 5e03aa32044768e370acbf92278889b75dfe9bee Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 19 Oct 2024 09:20:19 +1100 Subject: [PATCH 179/224] Improve PostgresCacheDatabase error logging --- nautilus_core/infrastructure/src/sql/cache.rs | 333 ++++++++---------- 1 file changed, 155 insertions(+), 178 deletions(-) diff --git a/nautilus_core/infrastructure/src/sql/cache.rs b/nautilus_core/infrastructure/src/sql/cache.rs index 4d0dde131a08..dfcee712b10d 100644 --- a/nautilus_core/infrastructure/src/sql/cache.rs +++ b/nautilus_core/infrastructure/src/sql/cache.rs @@ -80,183 +80,6 @@ pub enum DatabaseQuery { UpdateOrder(OrderEventAny), } -fn get_buffer_interval() -> Duration { - Duration::from_millis(0) -} - -async fn drain_buffer(pool: &PgPool, buffer: &mut VecDeque) { - for cmd in buffer.drain(..) { - match cmd { - DatabaseQuery::Close => {} - DatabaseQuery::Add(key, value) => { - DatabaseQueries::add(pool, key, value).await.unwrap(); - } - DatabaseQuery::AddCurrency(currency) => { - DatabaseQueries::add_currency(pool, currency).await.unwrap(); - } - DatabaseQuery::AddInstrument(instrument_any) => match instrument_any { - InstrumentAny::Betting(instrument) => { - DatabaseQueries::add_instrument(pool, "BETTING", Box::new(instrument)) - .await - .unwrap() - } - InstrumentAny::BinaryOption(instrument) => { - DatabaseQueries::add_instrument(pool, "BINARY_OPTION", Box::new(instrument)) - .await - .unwrap() - } - InstrumentAny::CryptoFuture(instrument) => { - DatabaseQueries::add_instrument(pool, "CRYPTO_FUTURE", Box::new(instrument)) - .await - .unwrap() - } - InstrumentAny::CryptoPerpetual(instrument) => { - DatabaseQueries::add_instrument(pool, "CRYPTO_PERPETUAL", Box::new(instrument)) - .await - .unwrap() - } - InstrumentAny::CurrencyPair(instrument) => { - DatabaseQueries::add_instrument(pool, "CURRENCY_PAIR", Box::new(instrument)) - .await - .unwrap() - } - InstrumentAny::Equity(equity) => { - DatabaseQueries::add_instrument(pool, "EQUITY", Box::new(equity)) - .await - .unwrap() - } - InstrumentAny::FuturesContract(instrument) => { - DatabaseQueries::add_instrument(pool, "FUTURES_CONTRACT", Box::new(instrument)) - .await - .unwrap() - } - InstrumentAny::FuturesSpread(instrument) => { - DatabaseQueries::add_instrument(pool, "FUTURES_SPREAD", Box::new(instrument)) - .await - .unwrap() - } - InstrumentAny::OptionsContract(instrument) => { - DatabaseQueries::add_instrument(pool, "OPTIONS_CONTRACT", Box::new(instrument)) - .await - .unwrap() - } - InstrumentAny::OptionsSpread(instrument) => { - DatabaseQueries::add_instrument(pool, "OPTIONS_SPREAD", Box::new(instrument)) - .await - .unwrap() - } - }, - DatabaseQuery::AddOrder(order_any, client_id, updated) => match order_any { - OrderAny::Limit(order) => { - DatabaseQueries::add_order(pool, "LIMIT", updated, Box::new(order), client_id) - .await - .unwrap() - } - OrderAny::LimitIfTouched(order) => DatabaseQueries::add_order( - pool, - "LIMIT_IF_TOUCHED", - updated, - Box::new(order), - client_id, - ) - .await - .unwrap(), - OrderAny::Market(order) => { - DatabaseQueries::add_order(pool, "MARKET", updated, Box::new(order), client_id) - .await - .unwrap() - } - OrderAny::MarketIfTouched(order) => DatabaseQueries::add_order( - pool, - "MARKET_IF_TOUCHED", - updated, - Box::new(order), - client_id, - ) - .await - .unwrap(), - OrderAny::MarketToLimit(order) => DatabaseQueries::add_order( - pool, - "MARKET_TO_LIMIT", - updated, - Box::new(order), - client_id, - ) - .await - .unwrap(), - OrderAny::StopLimit(order) => DatabaseQueries::add_order( - pool, - "STOP_LIMIT", - updated, - Box::new(order), - client_id, - ) - .await - .unwrap(), - OrderAny::StopMarket(order) => DatabaseQueries::add_order( - pool, - "STOP_MARKET", - updated, - Box::new(order), - client_id, - ) - .await - .unwrap(), - OrderAny::TrailingStopLimit(order) => DatabaseQueries::add_order( - pool, - "TRAILING_STOP_LIMIT", - updated, - Box::new(order), - client_id, - ) - .await - .unwrap(), - OrderAny::TrailingStopMarket(order) => DatabaseQueries::add_order( - pool, - "TRAILING_STOP_MARKET", - updated, - Box::new(order), - client_id, - ) - .await - .unwrap(), - }, - DatabaseQuery::AddAccount(account_any, updated) => match account_any { - AccountAny::Cash(account) => { - DatabaseQueries::add_account(pool, "CASH", updated, Box::new(account)) - .await - .unwrap() - } - AccountAny::Margin(account) => { - DatabaseQueries::add_account(pool, "MARGIN", updated, Box::new(account)) - .await - .unwrap() - } - }, - DatabaseQuery::AddSignal(signal) => { - DatabaseQueries::add_signal(pool, &signal).await.unwrap(); - } - DatabaseQuery::AddCustom(data) => { - DatabaseQueries::add_custom_data(pool, &data).await.unwrap(); - } - DatabaseQuery::AddQuote(quote) => { - DatabaseQueries::add_quote(pool, "e).await.unwrap(); - } - DatabaseQuery::AddTrade(trade) => { - DatabaseQueries::add_trade(pool, &trade).await.unwrap(); - } - DatabaseQuery::AddBar(bar) => { - DatabaseQueries::add_bar(pool, &bar).await.unwrap(); - } - DatabaseQuery::UpdateOrder(event) => { - DatabaseQueries::add_order_event(pool, event.into_boxed(), None) - .await - .unwrap(); - } - } - } -} - impl PostgresCacheDatabase { pub async fn connect( host: Option, @@ -285,7 +108,7 @@ impl PostgresCacheDatabase { // Buffering let mut buffer: VecDeque = VecDeque::new(); let mut last_drain = Instant::now(); - let buffer_interval = get_buffer_interval(); + let buffer_interval = Duration::from_millis(100); // TODO: Add to config let recv_interval = Duration::from_millis(1); loop { @@ -927,3 +750,157 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { todo!() } } + +async fn drain_buffer(pool: &PgPool, buffer: &mut VecDeque) { + for cmd in buffer.drain(..) { + let result: anyhow::Result<()> = match cmd { + DatabaseQuery::Close => Ok(()), + DatabaseQuery::Add(key, value) => DatabaseQueries::add(pool, key, value) + .await + .map_err(anyhow::Error::from), + DatabaseQuery::AddCurrency(currency) => DatabaseQueries::add_currency(pool, currency) + .await + .map_err(anyhow::Error::from), + DatabaseQuery::AddInstrument(instrument_any) => match instrument_any { + InstrumentAny::Betting(instrument) => { + DatabaseQueries::add_instrument(pool, "BETTING", Box::new(instrument)).await + } + InstrumentAny::BinaryOption(instrument) => { + DatabaseQueries::add_instrument(pool, "BINARY_OPTION", Box::new(instrument)) + .await + } + InstrumentAny::CryptoFuture(instrument) => { + DatabaseQueries::add_instrument(pool, "CRYPTO_FUTURE", Box::new(instrument)) + .await + } + InstrumentAny::CryptoPerpetual(instrument) => { + DatabaseQueries::add_instrument(pool, "CRYPTO_PERPETUAL", Box::new(instrument)) + .await + } + InstrumentAny::CurrencyPair(instrument) => { + DatabaseQueries::add_instrument(pool, "CURRENCY_PAIR", Box::new(instrument)) + .await + } + InstrumentAny::Equity(equity) => { + DatabaseQueries::add_instrument(pool, "EQUITY", Box::new(equity)).await + } + InstrumentAny::FuturesContract(instrument) => { + DatabaseQueries::add_instrument(pool, "FUTURES_CONTRACT", Box::new(instrument)) + .await + } + InstrumentAny::FuturesSpread(instrument) => { + DatabaseQueries::add_instrument(pool, "FUTURES_SPREAD", Box::new(instrument)) + .await + } + InstrumentAny::OptionsContract(instrument) => { + DatabaseQueries::add_instrument(pool, "OPTIONS_CONTRACT", Box::new(instrument)) + .await + } + InstrumentAny::OptionsSpread(instrument) => { + DatabaseQueries::add_instrument(pool, "OPTIONS_SPREAD", Box::new(instrument)) + .await + } + }, + DatabaseQuery::AddOrder(order_any, client_id, updated) => match order_any { + OrderAny::Limit(order) => { + DatabaseQueries::add_order(pool, "LIMIT", updated, Box::new(order), client_id) + .await + } + OrderAny::LimitIfTouched(order) => { + DatabaseQueries::add_order( + pool, + "LIMIT_IF_TOUCHED", + updated, + Box::new(order), + client_id, + ) + .await + } + OrderAny::Market(order) => { + DatabaseQueries::add_order(pool, "MARKET", updated, Box::new(order), client_id) + .await + } + OrderAny::MarketIfTouched(order) => { + DatabaseQueries::add_order( + pool, + "MARKET_IF_TOUCHED", + updated, + Box::new(order), + client_id, + ) + .await + } + OrderAny::MarketToLimit(order) => { + DatabaseQueries::add_order( + pool, + "MARKET_TO_LIMIT", + updated, + Box::new(order), + client_id, + ) + .await + } + OrderAny::StopLimit(order) => { + DatabaseQueries::add_order( + pool, + "STOP_LIMIT", + updated, + Box::new(order), + client_id, + ) + .await + } + OrderAny::StopMarket(order) => { + DatabaseQueries::add_order( + pool, + "STOP_MARKET", + updated, + Box::new(order), + client_id, + ) + .await + } + OrderAny::TrailingStopLimit(order) => { + DatabaseQueries::add_order( + pool, + "TRAILING_STOP_LIMIT", + updated, + Box::new(order), + client_id, + ) + .await + } + OrderAny::TrailingStopMarket(order) => { + DatabaseQueries::add_order( + pool, + "TRAILING_STOP_MARKET", + updated, + Box::new(order), + client_id, + ) + .await + } + }, + DatabaseQuery::AddAccount(account_any, updated) => match account_any { + AccountAny::Cash(account) => { + DatabaseQueries::add_account(pool, "CASH", updated, Box::new(account)).await + } + AccountAny::Margin(account) => { + DatabaseQueries::add_account(pool, "MARGIN", updated, Box::new(account)).await + } + }, + DatabaseQuery::AddSignal(signal) => DatabaseQueries::add_signal(pool, &signal).await, + DatabaseQuery::AddCustom(data) => DatabaseQueries::add_custom_data(pool, &data).await, + DatabaseQuery::AddQuote(quote) => DatabaseQueries::add_quote(pool, "e).await, + DatabaseQuery::AddTrade(trade) => DatabaseQueries::add_trade(pool, &trade).await, + DatabaseQuery::AddBar(bar) => DatabaseQueries::add_bar(pool, &bar).await, + DatabaseQuery::UpdateOrder(event) => { + DatabaseQueries::add_order_event(pool, event.into_boxed(), None).await + } + }; + + if let Err(e) = result { + log::error!("Error processing database query: {e:?}"); + } + } +} From 9d26719b3c96b965cfebfff786044117a6f9d81d Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 19 Oct 2024 09:42:24 +1100 Subject: [PATCH 180/224] Improve comment placement --- nautilus_core/infrastructure/src/redis/cache.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nautilus_core/infrastructure/src/redis/cache.rs b/nautilus_core/infrastructure/src/redis/cache.rs index de42d6eea698..6a198ea54f26 100644 --- a/nautilus_core/infrastructure/src/redis/cache.rs +++ b/nautilus_core/infrastructure/src/redis/cache.rs @@ -262,12 +262,12 @@ async fn process_commands( let mut last_drain = Instant::now(); let buffer_interval = Duration::from_millis(config.buffer_interval_ms.unwrap_or(0) as u64); + // Continue to receive and handle messages until channel is hung up loop { if last_drain.elapsed() >= buffer_interval && !buffer.is_empty() { drain_buffer(&mut con, &trader_key, &mut buffer); last_drain = Instant::now(); } else { - // Continue to receive and handle messages until channel is hung up match rx.recv().await { Some(msg) => { if let DatabaseOperation::Close = msg.op_type { From e834705ce04e63e21119ecf2075e1c1e1decb3f2 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 19 Oct 2024 09:45:25 +1100 Subject: [PATCH 181/224] Refine cache database command processing --- nautilus_core/infrastructure/src/sql/cache.rs | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/nautilus_core/infrastructure/src/sql/cache.rs b/nautilus_core/infrastructure/src/sql/cache.rs index dfcee712b10d..6deb12448f52 100644 --- a/nautilus_core/infrastructure/src/sql/cache.rs +++ b/nautilus_core/infrastructure/src/sql/cache.rs @@ -38,10 +38,6 @@ use nautilus_model::{ types::currency::Currency, }; use sqlx::{postgres::PgConnectOptions, PgPool}; -use tokio::{ - sync::mpsc::{error::TryRecvError, unbounded_channel, UnboundedReceiver, UnboundedSender}, - time::sleep, -}; use ustr::Ustr; use crate::sql::{ @@ -59,7 +55,7 @@ use crate::sql::{ )] pub struct PostgresCacheDatabase { pub pool: PgPool, - tx: UnboundedSender, + tx: tokio::sync::mpsc::UnboundedSender, handle: tokio::task::JoinHandle<()>, } @@ -91,40 +87,42 @@ impl PostgresCacheDatabase { let pg_connect_options = get_postgres_connect_options(host, port, username, password, database); let pool = connect_pg(pg_connect_options.clone().into()).await.unwrap(); - let (tx, rx) = unbounded_channel::(); + let (tx, rx) = tokio::sync::mpsc::unbounded_channel::(); // Spawn a task to handle messages let handle = tokio::spawn(async move { - PostgresCacheDatabase::handle_message(rx, pg_connect_options.clone().into()).await; + PostgresCacheDatabase::process_commands(rx, pg_connect_options.clone().into()).await; }); Ok(PostgresCacheDatabase { pool, tx, handle }) } - async fn handle_message( - mut rx: UnboundedReceiver, + async fn process_commands( + mut rx: tokio::sync::mpsc::UnboundedReceiver, pg_connect_options: PgConnectOptions, ) { + tracing::debug!("Starting cache processing"); + let pool = connect_pg(pg_connect_options).await.unwrap(); + // Buffering let mut buffer: VecDeque = VecDeque::new(); let mut last_drain = Instant::now(); - let buffer_interval = Duration::from_millis(100); // TODO: Add to config - let recv_interval = Duration::from_millis(1); + // TODO: Add `buffer_interval_ms` to config, setting this above 0 currently fails tests + let buffer_interval = Duration::from_millis(0); + + // Continue to receive and handle messages until channel is hung up loop { if last_drain.elapsed() >= buffer_interval && !buffer.is_empty() { - // Drain buffer drain_buffer(&pool, &mut buffer).await; last_drain = Instant::now(); } else { - // Continue to receive and handle messages until channel is hung up - match rx.try_recv() { - Ok(msg) => match msg { + match rx.recv().await { + Some(msg) => match msg { DatabaseQuery::Close => break, _ => buffer.push_back(msg), }, - Err(TryRecvError::Empty) => sleep(recv_interval).await, - Err(TryRecvError::Disconnected) => break, + None => break, // Channel hung up } } } @@ -133,6 +131,8 @@ impl PostgresCacheDatabase { if !buffer.is_empty() { drain_buffer(&pool, &mut buffer).await; } + + tracing::debug!("Stopped cache processing"); } } From 8fed69f6f7959ffc1e2ef3cde7c49bb211d25847 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 19 Oct 2024 10:10:29 +1100 Subject: [PATCH 182/224] Fix handling MONTH aggregation for cache.bar_types --- RELEASES.md | 1 + nautilus_trader/cache/cache.pyx | 9 +++++++-- nautilus_trader/test_kit/stubs/data.py | 21 +++++++++++++++++++++ tests/unit_tests/cache/test_data.py | 1 + 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index 1a3d94f9de8d..7b6cd6c59a10 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -43,6 +43,7 @@ Released on TBD (UTC). - Fixed `TardisCSVDataLoader` snapshot5 and snapshot25 parsing (#2005), thanks @Pushkarm029 - Fixed Binance clients venue assignment, we should use the `client_id` params (which match the custom client `name`) to communicate with the clients, and use the same `'BINANCE'` venue identifiers - Fixed `OrderMatchingEngine` incorrectly attempting to process monthly bars for execution (which will fail, as no reasonable `timedelta` is available) +- Fixed handling `MONTH` aggregation for `cache.bar_types()` (sorting required an internal call for the bar intervals `timedelta`) --- diff --git a/nautilus_trader/cache/cache.pyx b/nautilus_trader/cache/cache.pyx index 28dd818a2a45..4064ab18eada 100644 --- a/nautilus_trader/cache/cache.pyx +++ b/nautilus_trader/cache/cache.pyx @@ -43,6 +43,8 @@ from nautilus_trader.core.rust.model cimport PriceType from nautilus_trader.core.rust.model cimport TriggerType from nautilus_trader.execution.messages cimport SubmitOrder from nautilus_trader.model.data cimport Bar +from nautilus_trader.model.data cimport BarAggregation +from nautilus_trader.model.data cimport BarSpecification from nautilus_trader.model.data cimport BarType from nautilus_trader.model.data cimport QuoteTick from nautilus_trader.model.data cimport TradeTick @@ -2503,8 +2505,11 @@ cdef class Cache(CacheFacade): ] cdef timedelta _get_timedelta(self, BarType bar_type): - """ Helper method to get the timedelta from a BarType. """ - return bar_type.spec.timedelta + # Helper method to get the timedelta from a BarType + cdef BarSpecification bar_spec = bar_type.spec + if bar_spec.aggregation == BarAggregation.MONTH: + return timedelta(days=bar_spec.step * 30) # Reasonable value to fix sorting + return bar_spec.timedelta cpdef list bar_types( self, diff --git a/nautilus_trader/test_kit/stubs/data.py b/nautilus_trader/test_kit/stubs/data.py index 7e36b7fc48f1..93548c7bca88 100644 --- a/nautilus_trader/test_kit/stubs/data.py +++ b/nautilus_trader/test_kit/stubs/data.py @@ -143,6 +143,10 @@ def bar_spec_1sec_mid() -> BarSpecification: def bar_spec_100tick_last() -> BarSpecification: return BarSpecification(100, BarAggregation.TICK, PriceType.LAST) + @staticmethod + def bar_spec_month_mid() -> BarSpecification: + return BarSpecification(1, BarAggregation.MONTH, PriceType.MID) + @staticmethod def bartype_audusd_1min_bid() -> BarType: return BarType(TestIdStubs.audusd_id(), TestDataStubs.bar_spec_1min_bid()) @@ -151,6 +155,10 @@ def bartype_audusd_1min_bid() -> BarType: def bartype_audusd_5min_bid() -> BarType: return BarType(TestIdStubs.audusd_id(), TestDataStubs.bar_spec_5min_bid()) + @staticmethod + def bartype_audusd_month_mid() -> BarType: + return BarType(TestIdStubs.audusd_id(), TestDataStubs.bar_spec_month_mid()) + @staticmethod def bartype_audusd_1min_ask() -> BarType: return BarType(TestIdStubs.audusd_id(), TestDataStubs.bar_spec_1min_ask()) @@ -209,6 +217,19 @@ def bar_5decimal_5min_bid() -> Bar: ts_init=0, ) + @staticmethod + def bar_month_mid() -> Bar: + return Bar( + bar_type=TestDataStubs.bartype_audusd_month_mid(), + open=Price.from_str("1.00000"), + high=Price.from_str("1.10000"), + low=Price.from_str("1.00000"), + close=Price.from_str("1.05000"), + volume=Quantity.from_int(1_000_000_000), + ts_event=0, + ts_init=0, + ) + @staticmethod def bar_3decimal() -> Bar: return Bar( diff --git a/tests/unit_tests/cache/test_data.py b/tests/unit_tests/cache/test_data.py index 4588fa019eb8..463a8e70ee09 100644 --- a/tests/unit_tests/cache/test_data.py +++ b/tests/unit_tests/cache/test_data.py @@ -443,6 +443,7 @@ def test_retrieved_bar_types_match_expected( self.cache.add_bar(TestDataStubs.bar_5decimal()) self.cache.add_bar(TestDataStubs.bar_5decimal_5min_bid()) self.cache.add_bar(TestDataStubs.bar_3decimal()) + self.cache.add_bar(TestDataStubs.bar_month_mid()) # Act result = self.cache.bar_types( From ac9dffa216d7cb823c9664de2883340c2df84c21 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 19 Oct 2024 10:32:38 +1100 Subject: [PATCH 183/224] Add Binance TRADE_LITE message parsing --- .../adapters/binance/futures/execution.py | 11 +++++++ .../adapters/binance/futures/schemas/user.py | 30 +++++++++++++++++++ .../ws_messages/ws_futures_trade_lite.json | 15 ++++++++++ .../adapters/binance/test_parsing_ws.py | 17 +++++++++++ 4 files changed, 73 insertions(+) create mode 100644 tests/integration_tests/adapters/binance/resources/ws_messages/ws_futures_trade_lite.json diff --git a/nautilus_trader/adapters/binance/futures/execution.py b/nautilus_trader/adapters/binance/futures/execution.py index b7c7ab3c3e10..09ab04992513 100644 --- a/nautilus_trader/adapters/binance/futures/execution.py +++ b/nautilus_trader/adapters/binance/futures/execution.py @@ -34,6 +34,7 @@ from nautilus_trader.adapters.binance.futures.schemas.account import BinanceFuturesPositionRisk from nautilus_trader.adapters.binance.futures.schemas.user import BinanceFuturesAccountUpdateWrapper from nautilus_trader.adapters.binance.futures.schemas.user import BinanceFuturesOrderUpdateWrapper +from nautilus_trader.adapters.binance.futures.schemas.user import BinanceFuturesTradeLiteWrapper from nautilus_trader.adapters.binance.futures.schemas.user import BinanceFuturesUserMsgWrapper from nautilus_trader.adapters.binance.http.client import BinanceHttpClient from nautilus_trader.adapters.binance.http.error import BinanceError @@ -133,6 +134,7 @@ def __init__( BinanceFuturesEventType.MARGIN_CALL: self._handle_margin_call, BinanceFuturesEventType.ACCOUNT_CONFIG_UPDATE: self._handle_account_config_update, BinanceFuturesEventType.LISTEN_KEY_EXPIRED: self._handle_listen_key_expired, + BinanceFuturesEventType.TRADE_LITE: self._handle_trade_lite, } # WebSocket futures schema decoders @@ -143,6 +145,9 @@ def __init__( self._decoder_futures_account_update_wrapper = msgspec.json.Decoder( BinanceFuturesAccountUpdateWrapper, ) + self._decoder_futures_trade_lite_wrapper = msgspec.json.Decoder( + BinanceFuturesTradeLiteWrapper, + ) async def _update_account_state(self) -> None: account_info: BinanceFuturesAccountInfo = ( @@ -294,3 +299,9 @@ def _handle_account_config_update(self, raw: bytes) -> None: def _handle_listen_key_expired(self, raw: bytes) -> None: self._log.warning("Listen key expired") # Implement + + def _handle_trade_lite(self, raw: bytes) -> None: + trade_lite = self._decoder_futures_trade_lite_wrapper.decode(raw) + self._log.warning( + f"Received {trade_lite} which is not entirely implemented (needs to be parsed into a fill report)", + ) diff --git a/nautilus_trader/adapters/binance/futures/schemas/user.py b/nautilus_trader/adapters/binance/futures/schemas/user.py index c32f4e5408c7..cb5751be5937 100644 --- a/nautilus_trader/adapters/binance/futures/schemas/user.py +++ b/nautilus_trader/adapters/binance/futures/schemas/user.py @@ -421,3 +421,33 @@ class BinanceFuturesOrderUpdateWrapper(msgspec.Struct, frozen=True): stream: str data: BinanceFuturesOrderUpdateMsg + + +class BinanceFuturesTradeLiteMsg(msgspec.Struct, frozen=True): + """ + WebSocket message for Binance Futures Trade Lite events. + """ + + e: str # Event Type + E: int # Event Time + T: int # Transaction Time + + s: str # Symbol + c: str # Client Order ID + S: BinanceOrderSide + q: str # Original Quantity + p: str # Original Price + i: int # Order ID + l: str # Order Last Filled Quantity + L: str # Last Filled Price + t: int # Trade ID + m: bool # Is trade the maker side + + +class BinanceFuturesTradeLiteWrapper(msgspec.Struct, frozen=True): + """ + WebSocket message wrapper for Binance Futures Trade Lite events. + """ + + stream: str + data: BinanceFuturesTradeLiteMsg diff --git a/tests/integration_tests/adapters/binance/resources/ws_messages/ws_futures_trade_lite.json b/tests/integration_tests/adapters/binance/resources/ws_messages/ws_futures_trade_lite.json new file mode 100644 index 000000000000..4e7633ce43fc --- /dev/null +++ b/tests/integration_tests/adapters/binance/resources/ws_messages/ws_futures_trade_lite.json @@ -0,0 +1,15 @@ +{ + "e": "TRADE_LITE", + "E": 1727683915920, + "T": 1727683915920, + "s": "ETHUSDT", + "q": "0.037", + "p": "2631.90", + "m": false, + "c": "O-20240930-081155-001-000-29", + "S": "BUY", + "L": "2631.90", + "l": "0.037", + "t": 4467432841, + "i": 8389765739703625592 +} diff --git a/tests/integration_tests/adapters/binance/test_parsing_ws.py b/tests/integration_tests/adapters/binance/test_parsing_ws.py index e5270de513b7..d105e03a0e65 100644 --- a/tests/integration_tests/adapters/binance/test_parsing_ws.py +++ b/tests/integration_tests/adapters/binance/test_parsing_ws.py @@ -18,6 +18,7 @@ import msgspec from nautilus_trader.adapters.binance.common.schemas.market import BinanceTickerData +from nautilus_trader.adapters.binance.futures.schemas.user import BinanceFuturesTradeLiteMsg from nautilus_trader.test_kit.providers import TestInstrumentProvider @@ -31,6 +32,7 @@ def test_parse_ticker(self): package="tests.integration_tests.adapters.binance.resources.ws_messages", resource="ws_spot_ticker_24hr.json", ) + assert raw # Check not None # Act decoder = msgspec.json.Decoder(BinanceTickerData) @@ -42,3 +44,18 @@ def test_parse_ticker(self): # Assert assert result.instrument_id == ETHUSDT.id + + def test_parse_trade_lite(self): + # Arrange + raw = pkgutil.get_data( + package="tests.integration_tests.adapters.binance.resources.ws_messages", + resource="ws_futures_trade_lite.json", + ) + assert raw # Check not None + + # Act + decoder = msgspec.json.Decoder(BinanceFuturesTradeLiteMsg) + data = decoder.decode(raw) + + # Assert + assert data.s == "ETHUSDT" From 678b3f73fe6ae35aa3b040d4e5bae9ab1c72ad6e Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 19 Oct 2024 14:55:44 +1100 Subject: [PATCH 184/224] Remove redundant heartbeat method in Python --- nautilus_trader/live/node.py | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/nautilus_trader/live/node.py b/nautilus_trader/live/node.py index 542eed8ab7fa..68d167f02b36 100644 --- a/nautilus_trader/live/node.py +++ b/nautilus_trader/live/node.py @@ -335,34 +335,6 @@ async def run_async(self) -> None: except asyncio.CancelledError as e: self.kernel.logger.error(str(e)) - async def maintain_heartbeat(self, interval: float) -> None: - """ - Maintain heartbeats at the given `interval` while the node is running. - - Parameters - ---------- - interval : float - The interval (seconds) between heartbeats. - - """ - self.kernel.logger.info( - f"Starting task: heartbeats at {interval}s intervals", - LogColor.BLUE, - ) - try: - while True: - await asyncio.sleep(interval) - msg = self.kernel.clock.utc_now() - if self._has_cache_backing: - self.cache.heartbeat(msg) - if self._has_msgbus_backing: - self.kernel.msgbus.publish(topic="health:heartbeat", msg=str(msg)) - except asyncio.CancelledError: - pass - except Exception as e: - # Catch-all exceptions for development purposes (unexpected errors) - self.kernel.logger.error(str(e)) - def stop(self) -> None: """ Stop the trading node gracefully. From 55debd550129846a82ce377cda7e59171966f211 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 19 Oct 2024 15:19:49 +1100 Subject: [PATCH 185/224] Cleanup TradingNode constructor --- nautilus_trader/live/node.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/nautilus_trader/live/node.py b/nautilus_trader/live/node.py index 68d167f02b36..d02bb5587b02 100644 --- a/nautilus_trader/live/node.py +++ b/nautilus_trader/live/node.py @@ -80,18 +80,18 @@ def __init__( logger=self.kernel.logger, ) - # Operation flags - self._is_built = False - self._is_running = False - self._has_cache_backing = config.cache and config.cache.database - self._has_msgbus_backing = config.message_bus and config.message_bus.database - - self.kernel.logger.info(f"{self._has_cache_backing=}", LogColor.BLUE) - self.kernel.logger.info(f"{self._has_msgbus_backing=}", LogColor.BLUE) + has_cache_backing = bool(config.cache and config.cache.database) + has_msgbus_backing = bool(config.message_bus and config.message_bus.database) + self.kernel.logger.info(f"{has_cache_backing=}", LogColor.BLUE) + self.kernel.logger.info(f"{has_msgbus_backing=}", LogColor.BLUE) # Async tasks self._task_streaming: asyncio.Future | None = None + # Operation flags + self._is_built = False + self._is_running = False + @property def trader_id(self) -> TraderId: """ From d713541ed9ad28db4d4439515a94c0a28e4b7bce Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 19 Oct 2024 15:20:23 +1100 Subject: [PATCH 186/224] Refine release notes --- RELEASES.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index 7b6cd6c59a10..d69d85480015 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -12,7 +12,7 @@ Released on TBD (UTC). - Added in the money probability field to GreeksData (#1995), thanks @faysou - Added `on_signal(signal)` handler for custom signal data - Improved usability of `OrderBookDepth10` by filling partial levels with null orders and zero counts -- Improve Postgres config (#2010), thanks @filipmacek +- Improved Postgres config (#2010), thanks @filipmacek - Refined `DatabentoInstrumentProvider` handling of large bulks of instrument definitions (improved parent symbol support) - Standardized Betfair symbology to use hyphens instead of periods (prevents Betfair symbols being treated as composite) - Integration guide docs fixes (#1991), thanks @FarukhS52 @@ -42,8 +42,8 @@ Released on TBD (UTC). - Fixed check for `OmsType` in `OrderMatchingEngine` position ID processing (#2003), thanks @filipmacek - Fixed `TardisCSVDataLoader` snapshot5 and snapshot25 parsing (#2005), thanks @Pushkarm029 - Fixed Binance clients venue assignment, we should use the `client_id` params (which match the custom client `name`) to communicate with the clients, and use the same `'BINANCE'` venue identifiers -- Fixed `OrderMatchingEngine` incorrectly attempting to process monthly bars for execution (which will fail, as no reasonable `timedelta` is available) -- Fixed handling `MONTH` aggregation for `cache.bar_types()` (sorting required an internal call for the bar intervals `timedelta`) +- Fixed `OrderMatchingEngine` incorrectly attempting to process monthly bars for execution (which will fail, as no reasonable `timedelta` is available), thanks for reporting @frostRed +- Fixed handling `MONTH` aggregation for `cache.bar_types()` (sorting required an internal call for the bar intervals `timedelta`), thanks for reporting @frostRed --- @@ -343,7 +343,7 @@ Released on 5th July 2024 (UTC). - Fixed `DatabentoDataLoader` multiplier and round lot size decoding, thanks for reporting @faysou - Fixed Binance order report generation `active_symbols` type miss matching (#1729), thanks @DevRoss - Fixed Binance trade data websocket schemas (Binance no longer publish `b` buyer and `a` seller order IDs) -- Fixed `BinanceFuturesInstrumentProvider` parsing of min notional, thanks for the report @AnthonyVince +- Fixed `BinanceFuturesInstrumentProvider` parsing of min notional, thanks for reporting @AnthonyVince - Fixed `BinanceSpotInstrumentProvider` parsing of min and max notional - Fixed Bybit order book deltas subscriptions for `INVERSE` product type - Fixed `Cache` documentation for `get` (was the same as `add`), thanks for reporting @faysou @@ -496,7 +496,7 @@ Released on 20th April 2024 (UTC). ### Fixes - Fixed `MessageBus` pattern resolving (fixes a performance regression where topics published with no subscribers would always re-resolve) -- Fixed `BacktestNode` streaming data management (was not clearing between chunks), thanks for the report @dpmabo +- Fixed `BacktestNode` streaming data management (was not clearing between chunks), thanks for reporting @dpmabo - Fixed `RiskEngine` cumulative notional calculations for margin accounts (was incorrectly using base currency when selling) - Fixed selling `Equity` instruments with `CASH` account and `NETTING` OMS incorrectly rejecting (should be able to reduce position) - Fixed Databento bars decoding (was incorrectly applying display factor) @@ -588,7 +588,7 @@ Released on 25th February 2024 (UTC). ### Fixes - Fixed `TradeId` memory leak due assigning unique values to the `Ustr` global string cache (which are never freed for the lifetime of the program) - Fixed `TradeTick` size precision for pyo3 conversion (size precision was incorrectly price precision) -- Fixed `RiskEngine` cash value check when selling (would previously divide quantity by price which is too much), thanks for reporting@AnthonyVince +- Fixed `RiskEngine` cash value check when selling (would previously divide quantity by price which is too much), thanks for reporting @AnthonyVince - Fixed FOK time in force behavior (allows fills beyond the top level, will cancel if cannot fill full size) - Fixed IOC time in force behavior (allows fills beyond the top level, will cancel any remaining after all fills are applied) - Fixed `LiveClock` timer behavior for small intervals causing next time to be less than now (timer then would not run) From 872a79f167a8bcdaecabde31efd61900b1cfeff8 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 19 Oct 2024 17:23:56 +1100 Subject: [PATCH 187/224] Add order and position snapshot structs in Rust --- nautilus_core/model/src/events/order/mod.rs | 1 + .../model/src/events/order/snapshot.rs | 85 ++++++++++++++++++ .../model/src/events/position/mod.rs | 3 +- .../model/src/events/position/snapshot.rs | 89 +++++++++++++++++++ .../model/src/events/position/state.rs | 49 ---------- 5 files changed, 176 insertions(+), 51 deletions(-) create mode 100644 nautilus_core/model/src/events/order/snapshot.rs create mode 100644 nautilus_core/model/src/events/position/snapshot.rs delete mode 100644 nautilus_core/model/src/events/position/state.rs diff --git a/nautilus_core/model/src/events/order/mod.rs b/nautilus_core/model/src/events/order/mod.rs index 5d1ea762405f..89c8aafb8bd5 100644 --- a/nautilus_core/model/src/events/order/mod.rs +++ b/nautilus_core/model/src/events/order/mod.rs @@ -42,6 +42,7 @@ pub mod pending_cancel; pub mod pending_update; pub mod rejected; pub mod released; +pub mod snapshot; pub mod submitted; pub mod triggered; pub mod updated; diff --git a/nautilus_core/model/src/events/order/snapshot.rs b/nautilus_core/model/src/events/order/snapshot.rs new file mode 100644 index 000000000000..b0bea36c2856 --- /dev/null +++ b/nautilus_core/model/src/events/order/snapshot.rs @@ -0,0 +1,85 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use indexmap::IndexMap; +use nautilus_core::{nanos::UnixNanos, uuid::UUID4}; +use rust_decimal::Decimal; +use serde::{Deserialize, Serialize}; +use ustr::Ustr; + +use crate::{ + enums::{ + ContingencyType, LiquiditySide, OrderSide, OrderStatus, OrderType, TimeInForce, TriggerType, + }, + identifiers::{ + AccountId, ClientOrderId, ExecAlgorithmId, InstrumentId, OrderListId, PositionId, + StrategyId, TradeId, TraderId, VenueOrderId, + }, + types::{money::Money, price::Price, quantity::Quantity}, +}; + +/// Represents an order state snapshot as a certain instant. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(tag = "type")] +#[cfg_attr( + feature = "python", + pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.model") +)] +pub struct OrderSnapshot { + pub trader_id: TraderId, + pub strategy_id: StrategyId, + pub instrument_id: InstrumentId, + pub client_order_id: ClientOrderId, + pub venue_order_id: VenueOrderId, + pub position_id: Option, + pub account_id: AccountId, + pub last_trade_id: Option, + pub order_type: OrderType, + pub order_side: OrderSide, + pub quantity: Quantity, + pub price: Option, + pub trigger_price: Option, + pub trigger_type: TriggerType, + pub limit_offset: Option, + pub trailing_offset: Option, + pub trailing_offset_type: Option, + pub time_in_force: TimeInForce, + pub expire_time_ns: Option, + pub filled_qty: Quantity, + // pub last_qty: Quantity, // TODO: Implement + // pub last_px: Price, // TODO: Implement + pub liquidity_side: LiquiditySide, + pub avg_px: Option, + pub slippage: Option, + pub commissions: Vec, + pub status: OrderStatus, + pub is_post_only: bool, + pub is_reduce_only: bool, + pub is_quote_quantity: bool, + pub display_qty: Option, + pub emulation_trigger: TriggerType, + pub trigger_instrument_id: Option, + pub contingency_type: ContingencyType, + pub order_list_id: Option, + pub linked_order_ids: Option>, + pub parent_order_id: Option, + pub exec_algorithm_id: Option, + pub exec_algorithm_params: Option>, + pub exec_spawn_id: Option, + pub tags: Option>, + pub init_id: UUID4, + pub ts_init: UnixNanos, + pub ts_last: UnixNanos, +} diff --git a/nautilus_core/model/src/events/position/mod.rs b/nautilus_core/model/src/events/position/mod.rs index 41b70f5ea746..5338a1d16293 100644 --- a/nautilus_core/model/src/events/position/mod.rs +++ b/nautilus_core/model/src/events/position/mod.rs @@ -20,8 +20,7 @@ use crate::events::position::{ pub mod changed; pub mod closed; pub mod opened; - -pub mod state; +pub mod snapshot; pub enum PositionEvent { PositionOpened(PositionOpened), diff --git a/nautilus_core/model/src/events/position/snapshot.rs b/nautilus_core/model/src/events/position/snapshot.rs new file mode 100644 index 000000000000..f34ede7f62a4 --- /dev/null +++ b/nautilus_core/model/src/events/position/snapshot.rs @@ -0,0 +1,89 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use nautilus_core::nanos::UnixNanos; +use serde::{Deserialize, Serialize}; + +use crate::{ + enums::{OrderSide, PositionSide}, + identifiers::{AccountId, ClientOrderId, InstrumentId, PositionId, StrategyId, TraderId}, + types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, +}; + +/// Represents a position state snapshot as a certain instant. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(tag = "type")] +#[cfg_attr( + feature = "python", + pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.model") +)] +pub struct PositionSnapshot { + /// The trader ID associated with the snapshot. + pub trader_id: TraderId, + /// The strategy ID associated with the snapshot. + pub strategy_id: StrategyId, + /// The instrument ID associated with the snapshot. + pub instrument_id: InstrumentId, + /// The position ID associated with the snapshot. + pub position_id: PositionId, + /// The account ID associated with the position. + pub account_id: AccountId, + /// The client order ID for the order which opened the position. + pub opening_order_id: ClientOrderId, + /// The client order ID for the order which closed the position. + pub closing_order_id: Option, + /// The entry direction from open. + pub entry: OrderSide, + /// The position side. + pub side: PositionSide, + /// The position signed quantity (positive for LONG, negative for SHOT). + pub signed_qty: f64, + /// The position open quantity. + pub quantity: Quantity, + /// The peak directional quantity reached by the position. + pub peak_qty: Quantity, + /// The last fill quantity for the position. + pub last_qty: Quantity, + /// The last fill price for the position. + pub last_px: Price, + /// The position quote currency. + pub quote_currency: Currency, + /// The position base currency. + pub base_currency: Currency, + /// The position settlement currency. + pub settlement_currency: Currency, + /// The average open price. + pub avg_px_open: f64, + /// The average closing price. + pub avg_px_closed: Option, + /// The realized return for the position. + pub realized_return: Option, + /// The realized PnL for the position (including commissions). + pub realized_pnl: Money, + /// The unrealized PnL for the position (including commissions). + pub unrealized_pnl: Money, + /// The commissions for the position. + pub commissions: Vec, + /// The open duration for the position (nanoseconds). + pub duration_ns: Option, + /// UNIX timestamp (nanoseconds) when the position opened. + pub ts_opened: UnixNanos, + /// UNIX timestamp (nanoseconds) when the position closed. + pub ts_closed: Option, + /// UNIX timestamp (nanoseconds) when the last position event occurred. + pub ts_last: UnixNanos, + /// UNIX timestamp (nanoseconds) when the snapshot was initialized. + pub ts_init: UnixNanos, +} diff --git a/nautilus_core/model/src/events/position/state.rs b/nautilus_core/model/src/events/position/state.rs deleted file mode 100644 index dea49cc218e5..000000000000 --- a/nautilus_core/model/src/events/position/state.rs +++ /dev/null @@ -1,49 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. -// https://nautechsystems.io -// -// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); -// You may not use this file except in compliance with the License. -// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// ------------------------------------------------------------------------------------------------- - -use nautilus_core::nanos::UnixNanos; - -use crate::{ - enums::{OrderSide, PositionSide}, - identifiers::{AccountId, ClientOrderId, InstrumentId, PositionId, StrategyId, TraderId}, - types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, -}; - -#[repr(C)] -#[derive(Clone, PartialEq, Debug)] -pub struct PositionState { - pub trader_id: TraderId, - pub strategy_id: StrategyId, - pub instrument_id: InstrumentId, - pub position_id: PositionId, - pub account_id: AccountId, - pub opening_order_id: ClientOrderId, - pub entry: OrderSide, - pub side: PositionSide, - pub signed_qty: f64, - pub quantity: Quantity, - pub peak_quantity: Quantity, - pub last_qty: Quantity, - pub last_px: Price, - pub currency: Currency, - pub avg_px_open: f64, - pub avg_px_closed: f64, - pub realized_return: f64, - pub realized_pnl: Money, - pub unrealized_pnl: Money, - pub ts_opened: UnixNanos, - pub ts_event: UnixNanos, - pub ts_init: UnixNanos, -} From 059b5df69713044177145822d95dc7e51f655b78 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 19 Oct 2024 17:46:35 +1100 Subject: [PATCH 188/224] Refine position schema for postgres --- .../model/src/events/position/changed.rs | 2 +- .../model/src/events/position/closed.rs | 2 +- .../model/src/events/position/snapshot.rs | 12 +++---- schema/tables.sql | 32 +++++++++++++++++++ 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/nautilus_core/model/src/events/position/changed.rs b/nautilus_core/model/src/events/position/changed.rs index 08d19915b46a..f60c204046ca 100644 --- a/nautilus_core/model/src/events/position/changed.rs +++ b/nautilus_core/model/src/events/position/changed.rs @@ -39,7 +39,7 @@ pub struct PositionChanged { pub last_px: Price, pub currency: Currency, pub avg_px_open: f64, - pub avg_px_closed: f64, + pub avg_px_close: f64, pub realized_return: f64, pub realized_pnl: Money, pub unrealized_pnl: Money, diff --git a/nautilus_core/model/src/events/position/closed.rs b/nautilus_core/model/src/events/position/closed.rs index 85a1a52d238d..8bcabd4efa04 100644 --- a/nautilus_core/model/src/events/position/closed.rs +++ b/nautilus_core/model/src/events/position/closed.rs @@ -39,7 +39,7 @@ pub struct PositionClosed { pub last_px: Price, pub currency: Currency, pub avg_px_open: f64, - pub avg_px_closed: f64, + pub avg_px_close: f64, pub realized_return: f64, pub realized_pnl: Money, pub unrealized_pnl: Money, diff --git a/nautilus_core/model/src/events/position/snapshot.rs b/nautilus_core/model/src/events/position/snapshot.rs index f34ede7f62a4..0a46e88e1d93 100644 --- a/nautilus_core/model/src/events/position/snapshot.rs +++ b/nautilus_core/model/src/events/position/snapshot.rs @@ -19,7 +19,7 @@ use serde::{Deserialize, Serialize}; use crate::{ enums::{OrderSide, PositionSide}, identifiers::{AccountId, ClientOrderId, InstrumentId, PositionId, StrategyId, TraderId}, - types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, + types::{currency::Currency, money::Money, quantity::Quantity}, }; /// Represents a position state snapshot as a certain instant. @@ -55,9 +55,9 @@ pub struct PositionSnapshot { /// The peak directional quantity reached by the position. pub peak_qty: Quantity, /// The last fill quantity for the position. - pub last_qty: Quantity, - /// The last fill price for the position. - pub last_px: Price, + // pub last_qty: Quantity, TODO: Implement + // /// The last fill price for the position. + // pub last_px: Price, TODO: Implement /// The position quote currency. pub quote_currency: Currency, /// The position base currency. @@ -67,13 +67,13 @@ pub struct PositionSnapshot { /// The average open price. pub avg_px_open: f64, /// The average closing price. - pub avg_px_closed: Option, + pub avg_px_close: Option, /// The realized return for the position. pub realized_return: Option, /// The realized PnL for the position (including commissions). pub realized_pnl: Money, /// The unrealized PnL for the position (including commissions). - pub unrealized_pnl: Money, + pub unrealized_pnl: Option, /// The commissions for the position. pub commissions: Vec, /// The open duration for the position (nanoseconds). diff --git a/schema/tables.sql b/schema/tables.sql index 14ba88eb9ed0..e6842e3e1d35 100644 --- a/schema/tables.sql +++ b/schema/tables.sql @@ -150,6 +150,38 @@ CREATE TABLE IF NOT EXISTS "order_event" ( updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP ); +CREATE TABLE IF NOT EXISTS "position"( + id TEXT PRIMARY KEY NOT NULL, + trader_id TEXT REFERENCES trader(id) ON DELETE CASCADE, + strategy_id TEXT NOT NULL, + instrument_id TEXT REFERENCES instrument(id) ON DELETE CASCADE, + position_id TEXT NOT NULL, -- REFERENCES TBD + account_id TEXT NOT NULL, + opening_order_id TEXT NOT NULL, + closing_order_id TEXT, -- REFERENCES TBD + entry TEXT NOT NULL, + side TEXT NOT NULL, + signed_qty TEXT NOT NULL, + quantity TEXT NOT NULL, + peak_qty TEXT NOT NULL, + -- last_qty TEXT, + -- last_px TEXT, + quote_currency TEXT NOT NULL, + base_currency TEXT NOT NULL, + settlement_currency TEXT NOT NULL, + avg_px_open DOUBLE PRECISION, -- Consider NUMERIC + avg_px_close DOUBLE PRECISION, -- Consider NUMERIC + realized_return DOUBLE PRECISION, -- Consider NUMERIC + realized_pnl TEXT NOT NULL, + unrealized_pnl TEXT, + commissions TEXT NOT NULL, + duration_ns BIGINT, + ts_opened BIGINT NOT NULL, + ts_closed BIGINT, + ts_last BIGINT NOT NULL, + ts_init BIGINT NOT NULL +); + CREATE TABLE IF NOT EXISTS "account_event"( id TEXT PRIMARY KEY NOT NULL, kind TEXT NOT NULL, From 5faeb9876baf781ef2f3d8076ccf4d13616e35fd Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sat, 19 Oct 2024 18:38:13 +1100 Subject: [PATCH 189/224] Implement add PositionSnapshot for postgres --- nautilus_core/common/src/cache/database.rs | 4 +- .../infrastructure/src/redis/cache.rs | 6 +- nautilus_core/infrastructure/src/sql/cache.rs | 15 +- .../infrastructure/src/sql/models/mod.rs | 1 + .../infrastructure/src/sql/models/orders.rs | 14 +- .../src/sql/models/positions.rs | 146 ++++++++++++++++++ .../infrastructure/src/sql/queries.rs | 79 ++++++++++ schema/tables.sql | 11 +- 8 files changed, 262 insertions(+), 14 deletions(-) create mode 100644 nautilus_core/infrastructure/src/sql/models/positions.rs diff --git a/nautilus_core/common/src/cache/database.rs b/nautilus_core/common/src/cache/database.rs index 021b319164c1..489d569cdbb6 100644 --- a/nautilus_core/common/src/cache/database.rs +++ b/nautilus_core/common/src/cache/database.rs @@ -26,7 +26,7 @@ use nautilus_core::nanos::UnixNanos; use nautilus_model::{ accounts::any::AccountAny, data::{bar::Bar, quote::QuoteTick, trade::TradeTick, DataType}, - events::order::OrderEventAny, + events::{order::OrderEventAny, position::snapshot::PositionSnapshot}, identifiers::{ AccountId, ClientId, ClientOrderId, ComponentId, InstrumentId, PositionId, StrategyId, VenueOrderId, @@ -101,6 +101,8 @@ pub trait CacheDatabaseAdapter { fn add_position(&self, position: &Position) -> anyhow::Result<()>; + fn add_position_snapshot(&self, snapshot: &PositionSnapshot) -> anyhow::Result<()>; + fn add_order_book(&self, order_book: &OrderBook) -> anyhow::Result<()>; fn add_quote(&self, quote: &QuoteTick) -> anyhow::Result<()>; diff --git a/nautilus_core/infrastructure/src/redis/cache.rs b/nautilus_core/infrastructure/src/redis/cache.rs index 6a198ea54f26..64c0fcbfb3a5 100644 --- a/nautilus_core/infrastructure/src/redis/cache.rs +++ b/nautilus_core/infrastructure/src/redis/cache.rs @@ -31,7 +31,7 @@ use nautilus_core::{correctness::check_slice_not_empty, nanos::UnixNanos, uuid:: use nautilus_model::{ accounts::any::AccountAny, data::{bar::Bar, quote::QuoteTick, trade::TradeTick, DataType}, - events::order::OrderEventAny, + events::{order::OrderEventAny, position::snapshot::PositionSnapshot}, identifiers::{ AccountId, ClientId, ClientOrderId, ComponentId, InstrumentId, PositionId, StrategyId, TraderId, VenueOrderId, @@ -865,6 +865,10 @@ impl CacheDatabaseAdapter for RedisCacheDatabaseAdapter { todo!() } + fn add_position_snapshot(&self, snapshot: &PositionSnapshot) -> anyhow::Result<()> { + todo!() + } + fn add_order_book(&self, order_book: &OrderBook) -> anyhow::Result<()> { anyhow::bail!("Saving market data for Redis cache adapter not supported") } diff --git a/nautilus_core/infrastructure/src/sql/cache.rs b/nautilus_core/infrastructure/src/sql/cache.rs index 6deb12448f52..a17bf26e3451 100644 --- a/nautilus_core/infrastructure/src/sql/cache.rs +++ b/nautilus_core/infrastructure/src/sql/cache.rs @@ -26,7 +26,7 @@ use nautilus_core::nanos::UnixNanos; use nautilus_model::{ accounts::any::AccountAny, data::{bar::Bar, quote::QuoteTick, trade::TradeTick, DataType}, - events::order::OrderEventAny, + events::{order::OrderEventAny, position::snapshot::PositionSnapshot}, identifiers::{ AccountId, ClientId, ClientOrderId, ComponentId, InstrumentId, PositionId, StrategyId, VenueOrderId, @@ -67,6 +67,7 @@ pub enum DatabaseQuery { AddCurrency(Currency), AddInstrument(InstrumentAny), AddOrder(OrderAny, Option, bool), + AddPositionSnapshot(PositionSnapshot), AddAccount(AccountAny, bool), AddSignal(Signal), AddCustom(CustomData), @@ -536,6 +537,15 @@ impl CacheDatabaseAdapter for PostgresCacheDatabase { todo!() } + fn add_position_snapshot(&self, snapshot: &PositionSnapshot) -> anyhow::Result<()> { + let query = DatabaseQuery::AddPositionSnapshot(snapshot.to_owned()); + self.tx.send(query).map_err(|e| { + anyhow::anyhow!( + "Failed to send query add_position_snapshot to database message handler: {e}" + ) + }) + } + fn add_order_book(&self, order_book: &OrderBook) -> anyhow::Result<()> { todo!() } @@ -881,6 +891,9 @@ async fn drain_buffer(pool: &PgPool, buffer: &mut VecDeque) { .await } }, + DatabaseQuery::AddPositionSnapshot(snapshot) => { + DatabaseQueries::add_position_snapshot(pool, snapshot).await + } DatabaseQuery::AddAccount(account_any, updated) => match account_any { AccountAny::Cash(account) => { DatabaseQueries::add_account(pool, "CASH", updated, Box::new(account)).await diff --git a/nautilus_core/infrastructure/src/sql/models/mod.rs b/nautilus_core/infrastructure/src/sql/models/mod.rs index efba53dea643..cd34b871bd3f 100644 --- a/nautilus_core/infrastructure/src/sql/models/mod.rs +++ b/nautilus_core/infrastructure/src/sql/models/mod.rs @@ -19,4 +19,5 @@ pub mod enums; pub mod general; pub mod instruments; pub mod orders; +pub mod positions; pub mod types; diff --git a/nautilus_core/infrastructure/src/sql/models/orders.rs b/nautilus_core/infrastructure/src/sql/models/orders.rs index d983872ceb6a..55c1433aa108 100644 --- a/nautilus_core/infrastructure/src/sql/models/orders.rs +++ b/nautilus_core/infrastructure/src/sql/models/orders.rs @@ -18,11 +18,14 @@ use std::{collections::HashMap, str::FromStr}; use nautilus_core::{nanos::UnixNanos, uuid::UUID4}; use nautilus_model::{ enums::{ContingencyType, LiquiditySide, OrderSide, OrderType, TimeInForce, TriggerType}, - events::order::{ - OrderAccepted, OrderCancelRejected, OrderCanceled, OrderDenied, OrderEmulated, - OrderEventAny, OrderExpired, OrderFilled, OrderInitialized, OrderModifyRejected, - OrderPendingCancel, OrderPendingUpdate, OrderRejected, OrderReleased, OrderSubmitted, - OrderTriggered, OrderUpdated, + events::{ + order::{ + OrderAccepted, OrderCancelRejected, OrderCanceled, OrderDenied, OrderEmulated, + OrderEventAny, OrderExpired, OrderFilled, OrderInitialized, OrderModifyRejected, + OrderPendingCancel, OrderPendingUpdate, OrderRejected, OrderReleased, OrderSubmitted, + OrderTriggered, OrderUpdated, + }, + position::snapshot::PositionSnapshot, }, identifiers::{ AccountId, ClientOrderId, ExecAlgorithmId, InstrumentId, OrderListId, PositionId, @@ -52,6 +55,7 @@ pub struct OrderReleasedModel(pub OrderReleased); pub struct OrderSubmittedModel(pub OrderSubmitted); pub struct OrderTriggeredModel(pub OrderTriggered); pub struct OrderUpdatedModel(pub OrderUpdated); +pub struct PositionSnapshotModel(pub PositionSnapshot); impl<'r> FromRow<'r, PgRow> for OrderEventAnyModel { fn from_row(row: &'r PgRow) -> Result { diff --git a/nautilus_core/infrastructure/src/sql/models/positions.rs b/nautilus_core/infrastructure/src/sql/models/positions.rs new file mode 100644 index 000000000000..8f2ce341fdeb --- /dev/null +++ b/nautilus_core/infrastructure/src/sql/models/positions.rs @@ -0,0 +1,146 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use std::str::FromStr; + +use nautilus_core::nanos::UnixNanos; +use nautilus_model::{ + enums::{OrderSide, PositionSide}, + events::position::snapshot::PositionSnapshot, + identifiers::{AccountId, ClientOrderId, InstrumentId, PositionId, StrategyId, TraderId}, + types::{currency::Currency, money::Money, quantity::Quantity}, +}; +use sqlx::{postgres::PgRow, FromRow, Row}; + +pub struct PositionSnapshotModel(pub PositionSnapshot); + +impl<'r> FromRow<'r, PgRow> for PositionSnapshotModel { + fn from_row(row: &'r PgRow) -> Result { + let id = row.try_get::<&str, _>("id").map(PositionId::from)?; + let trader_id = row.try_get::<&str, _>("trader_id").map(TraderId::from)?; + let strategy_id = row + .try_get::<&str, _>("strategy_id") + .map(StrategyId::from)?; + let instrument_id = row + .try_get::<&str, _>("instrument_id") + .map(InstrumentId::from)?; + let account_id = row.try_get::<&str, _>("account_id").map(AccountId::from)?; + let opening_order_id = row + .try_get::<&str, _>("opening_order_id") + .map(ClientOrderId::from)?; + let closing_order_id = row + .try_get::, _>("closing_order_id") + .ok() + .and_then(|x| x.map(ClientOrderId::from)); + let entry = row + .try_get::<&str, _>("entry") + .map(OrderSide::from_str)? + .unwrap(); + let side = row + .try_get::<&str, _>("side") + .map(PositionSide::from_str)? + .unwrap(); + let signed_qty = row.try_get::("signed_qty")?; + let quantity = row.try_get::<&str, _>("quantity").map(Quantity::from)?; + let peak_qty = row.try_get::<&str, _>("peak_qty").map(Quantity::from)?; + + let quote_currency = row + .try_get::<&str, _>("quote_currency") + .map(Currency::from)?; + let base_currency = row + .try_get::<&str, _>("base_currency") + .map(Currency::from)?; + let settlement_currency = row + .try_get::<&str, _>("settlement_currency") + .map(Currency::from)?; + + let avg_px_open = row.try_get::("avg_px_open")?; + let avg_px_close = row.try_get::, _>("avg_px_close")?; + let realized_return = row.try_get::, _>("realized_return")?; + let realized_pnl = row.try_get::<&str, _>("realized_pnl").map(Money::from)?; + let unrealized_pnl = row + .try_get::, _>("unrealized_pnl") + .ok() + .and_then(|x| x.map(Money::from)); + let commissions: Vec = row + .try_get::<&str, _>("commissions")? + .parse::() + .unwrap() + .as_array() + .ok_or(sqlx::Error::Decode( + "Expected a JSON array for commissions".into(), + ))? + .iter() + .map(|x| { + x.as_str() + .ok_or(sqlx::Error::Decode( + "Expected string values in the commissions array".into(), + )) + .and_then(|s| { + Money::from_str(s).map_err(|e| { + sqlx::Error::Decode(format!("Money parsing error: {}", e).into()) + }) + }) + }) + .collect::, sqlx::Error>>()?; + let duration_ns: Option = row + .try_get::, _>("duration_ns")? + .map(|value| value as u64); + + let ts_opened = row + .try_get::("ts_opened") + .map(|res| UnixNanos::from(res.as_str()))?; + let ts_closed: Option = row + .try_get::, _>("ts_closed")? + .map(|res| UnixNanos::from(res.as_str())); + let ts_last = row + .try_get::("ts_last") + .map(|res| UnixNanos::from(res.as_str()))?; + let ts_init = row + .try_get::("ts_init") + .map(|res| UnixNanos::from(res.as_str()))?; + + let snapshot = PositionSnapshot { + trader_id, + strategy_id, + instrument_id, + position_id: id, + account_id, + opening_order_id, + closing_order_id, + entry, + side, + signed_qty, + quantity, + peak_qty, + quote_currency, + base_currency, + settlement_currency, + avg_px_open, + avg_px_close, + realized_return, + realized_pnl, + unrealized_pnl, + commissions, + duration_ns, + ts_opened, + ts_closed, + ts_last, + ts_init, + }; + + Ok(PositionSnapshotModel(snapshot)) + } +} diff --git a/nautilus_core/infrastructure/src/sql/queries.rs b/nautilus_core/infrastructure/src/sql/queries.rs index 090abe8d13b2..f1c14e9225f1 100644 --- a/nautilus_core/infrastructure/src/sql/queries.rs +++ b/nautilus_core/infrastructure/src/sql/queries.rs @@ -22,6 +22,7 @@ use nautilus_model::{ events::{ account::state::AccountState, order::{OrderEvent, OrderEventAny}, + position::snapshot::PositionSnapshot, }, identifiers::{AccountId, ClientId, ClientOrderId, InstrumentId}, instruments::{any::InstrumentAny, Instrument}, @@ -269,6 +270,84 @@ impl DatabaseQueries { } } + pub async fn add_position_snapshot( + pool: &PgPool, + snapshot: PositionSnapshot, + ) -> anyhow::Result<()> { + let mut transaction = pool.begin().await?; + + // Insert trader if it does not exist + // TODO remove this when node and trader initialization is implemented + sqlx::query( + r#" + INSERT INTO "trader" (id) VALUES ($1) ON CONFLICT (id) DO NOTHING + "#, + ) + .bind(snapshot.trader_id.to_string()) + .execute(&mut *transaction) + .await + .map(|_| ()) + .map_err(|e| anyhow::anyhow!("Failed to insert into trader table: {e}"))?; + + sqlx::query(r#" + INSERT INTO "position" ( + id, trader_id, strategy_id, instrument_id, account_id, opening_order_id, closing_order_id, entry, side, signed_qty, quantity, peak_qty, + quote_currency, base_currency, settlement_currency, avg_px_open, avg_px_close, realized_return, realized_pnl, unrealized_pnl, commissions, + duration_ns, ts_opened, ts_closed, ts_last, ts_init + ) VALUES ( + $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, + $21, $22, $23, $24, $25, $26, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP + ) + ON CONFLICT (id) + DO UPDATE + SET + trader_id = $2, strategy_id = $3, instrument_id = $4, account_id = $5, opening_order_id = $6, closing_order_id = $7, entry = $8, side = $9, signed_qty = $10, quantity = $11, + peak_qty = $12, quote_currency = $13, base_currency = $14, settlement_currency = $15, avg_px_open = $16, avg_px_close = $17, realized_return = $18, realized_pnl = $19, unrealized_pnl = $20, + commissions = $21, duration_ns = $22, ts_opened = $23, ts_closed = $24, ts_last = $25, ts_init = $26, updated_at = CURRENT_TIMESTAMP + "#) + .bind(snapshot.position_id.to_string()) + .bind(snapshot.trader_id.to_string()) + .bind(snapshot.strategy_id.to_string()) + .bind(snapshot.instrument_id.to_string()) + .bind(snapshot.account_id.to_string()) + .bind(snapshot.opening_order_id.to_string()) + .bind(snapshot.closing_order_id.map(|x| x.to_string())) + .bind(snapshot.entry.to_string()) + .bind(snapshot.side.to_string()) + .bind(snapshot.signed_qty.to_string()) + .bind(snapshot.quantity.to_string()) + .bind(snapshot.peak_qty.to_string()) + .bind(snapshot.quote_currency.to_string()) + .bind(snapshot.base_currency.to_string()) + .bind(snapshot.settlement_currency.to_string()) + .bind(snapshot.avg_px_open.to_string()) + .bind(snapshot.avg_px_close.map(|x| x.to_string())) + .bind(snapshot.realized_return.map(|x| x.to_string())) + .bind(snapshot.realized_pnl.to_string()) + .bind(snapshot.unrealized_pnl.map(|x| x.to_string())) + .bind( + serde_json::to_string( + &snapshot.commissions + .iter() + .map(|x| x.to_string()) + .collect::>() + ).unwrap() + ) + .bind(snapshot.duration_ns.map(|x| x.to_string())) + .bind(snapshot.ts_opened.to_string()) + .bind(snapshot.ts_closed.map(|x| x.to_string())) + .bind(snapshot.ts_last.to_string()) + .bind(snapshot.ts_init.to_string()) + .execute(&mut *transaction) + .await + .map(|_| ()) + .map_err(|e| anyhow::anyhow!("Failed to insert into position table: {e}"))?; + transaction + .commit() + .await + .map_err(|e| anyhow::anyhow!("Failed to commit transaction: {e}")) + } + pub async fn check_if_order_initialized_exists( pool: &PgPool, client_order_id: ClientOrderId, diff --git a/schema/tables.sql b/schema/tables.sql index e6842e3e1d35..2f4691607394 100644 --- a/schema/tables.sql +++ b/schema/tables.sql @@ -155,7 +155,6 @@ CREATE TABLE IF NOT EXISTS "position"( trader_id TEXT REFERENCES trader(id) ON DELETE CASCADE, strategy_id TEXT NOT NULL, instrument_id TEXT REFERENCES instrument(id) ON DELETE CASCADE, - position_id TEXT NOT NULL, -- REFERENCES TBD account_id TEXT NOT NULL, opening_order_id TEXT NOT NULL, closing_order_id TEXT, -- REFERENCES TBD @@ -175,11 +174,11 @@ CREATE TABLE IF NOT EXISTS "position"( realized_pnl TEXT NOT NULL, unrealized_pnl TEXT, commissions TEXT NOT NULL, - duration_ns BIGINT, - ts_opened BIGINT NOT NULL, - ts_closed BIGINT, - ts_last BIGINT NOT NULL, - ts_init BIGINT NOT NULL + duration_ns TEXT, + ts_opened TEXT NOT NULL, + ts_closed TEXT, + ts_last TEXT NOT NULL, + ts_init TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS "account_event"( From 8fcf1a06dfdab61cd890b6915b8f4f0226a3557b Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 07:44:24 +1100 Subject: [PATCH 190/224] Update core dependencies --- nautilus_core/Cargo.lock | 90 ++++++++++++++++++++-------------------- nautilus_core/Cargo.toml | 2 +- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 292bdf878fb9..60be3724564c 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -418,7 +418,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -429,7 +429,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -590,7 +590,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.79", + "syn 2.0.80", "which", ] @@ -665,7 +665,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", "syn_derive", ] @@ -780,16 +780,16 @@ dependencies = [ "quote", "serde", "serde_json", - "syn 2.0.79", + "syn 2.0.80", "tempfile", "toml", ] [[package]] name = "cc" -version = "1.1.30" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ "jobserver", "libc", @@ -923,7 +923,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -1200,7 +1200,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -1211,7 +1211,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -1593,7 +1593,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -1635,7 +1635,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -1645,7 +1645,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -1811,9 +1811,9 @@ dependencies = [ [[package]] name = "flume" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "futures-core", "futures-sink", @@ -1929,7 +1929,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -3201,7 +3201,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -3278,7 +3278,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -3495,7 +3495,7 @@ checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -3598,12 +3598,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" +checksum = "904afd36257cdb6ce0bee88b7981847bd7b955e5e216bb32f466b302923ad446" dependencies = [ "proc-macro2", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -3788,7 +3788,7 @@ dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -3801,7 +3801,7 @@ dependencies = [ "proc-macro2", "pyo3-build-config", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -4164,7 +4164,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.79", + "syn 2.0.80", "unicode-ident", ] @@ -4403,14 +4403,14 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] name = "serde_json" -version = "1.0.130" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "610f75ff4a8e3cb29b85da56eabdd1bff5b06739059a4b8e2967fef32e5d9944" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -4638,7 +4638,7 @@ checksum = "01b2e185515564f15375f593fb966b5718bc624ba77fe49fa4616ad619690554" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -4703,7 +4703,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -4726,7 +4726,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.79", + "syn 2.0.80", "tempfile", "tokio", "url", @@ -4877,7 +4877,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -4899,9 +4899,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "e6e185e337f816bc8da115b8afcb3324006ccc82eeaddf35113888d3bd8e44ac" dependencies = [ "proc-macro2", "quote", @@ -4917,7 +4917,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -5035,7 +5035,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -5158,7 +5158,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -5315,7 +5315,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -5375,7 +5375,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" dependencies = [ "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -5431,7 +5431,7 @@ checksum = "560b82d656506509d43abe30e0ba64c56b1953ab3d4fe7ba5902747a7a3cedd5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -5640,7 +5640,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", "wasm-bindgen-shared", ] @@ -5674,7 +5674,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5809,7 +5809,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -5820,7 +5820,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -6061,7 +6061,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] diff --git a/nautilus_core/Cargo.toml b/nautilus_core/Cargo.toml index 3c8cf4bed89d..330187427fe7 100644 --- a/nautilus_core/Cargo.toml +++ b/nautilus_core/Cargo.toml @@ -51,7 +51,7 @@ rust_decimal = "1.36.0" rust_decimal_macros = "1.36.0" semver = "1.0.23" serde = { version = "1.0.210", features = ["derive"] } -serde_json = "1.0.130" +serde_json = "1.0.132" strum = { version = "0.26.3", features = ["derive"] } thiserror = "1.0.64" thousands = "0.2.0" From 8698405453d58fbbd042c3f0bcd4b7f47ba68101 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 08:49:33 +1100 Subject: [PATCH 191/224] Standardize Python interface functions for postgres --- .../infrastructure/src/python/sql/cache.rs | 131 +++++++----------- 1 file changed, 52 insertions(+), 79 deletions(-) diff --git a/nautilus_core/infrastructure/src/python/sql/cache.rs b/nautilus_core/infrastructure/src/python/sql/cache.rs index 74cb485db724..3782e5f6ac73 100644 --- a/nautilus_core/infrastructure/src/python/sql/cache.rs +++ b/nautilus_core/infrastructure/src/python/sql/cache.rs @@ -63,34 +63,34 @@ impl PostgresCacheDatabase { } #[pyo3(name = "load")] - fn py_load(slf: PyRef<'_, Self>) -> PyResult>> { + fn py_load(&self) -> PyResult>> { get_runtime() - .block_on(async { DatabaseQueries::load(&slf.pool).await }) + .block_on(async { DatabaseQueries::load(&self.pool).await }) .map_err(to_pyruntime_err) } #[pyo3(name = "load_currency")] - fn py_load_currency(slf: PyRef<'_, Self>, code: &str) -> PyResult> { - let result = - get_runtime().block_on(async { DatabaseQueries::load_currency(&slf.pool, code).await }); + fn py_load_currency(&self, code: &str) -> PyResult> { + let result = get_runtime() + .block_on(async { DatabaseQueries::load_currency(&self.pool, code).await }); result.map_err(to_pyruntime_err) } #[pyo3(name = "load_currencies")] - fn py_load_currencies(slf: PyRef<'_, Self>) -> PyResult> { + fn py_load_currencies(&self) -> PyResult> { let result = - get_runtime().block_on(async { DatabaseQueries::load_currencies(&slf.pool).await }); + get_runtime().block_on(async { DatabaseQueries::load_currencies(&self.pool).await }); result.map_err(to_pyruntime_err) } #[pyo3(name = "load_instrument")] fn py_load_instrument( - slf: PyRef<'_, Self>, + &self, + py: Python, instrument_id: InstrumentId, - py: Python<'_>, ) -> PyResult> { get_runtime().block_on(async { - let result = DatabaseQueries::load_instrument(&slf.pool, &instrument_id) + let result = DatabaseQueries::load_instrument(&self.pool, &instrument_id) .await .unwrap(); match result { @@ -104,9 +104,9 @@ impl PostgresCacheDatabase { } #[pyo3(name = "load_instruments")] - fn py_load_instruments(slf: PyRef<'_, Self>, py: Python<'_>) -> PyResult> { + fn py_load_instruments(&self, py: Python) -> PyResult> { get_runtime().block_on(async { - let result = DatabaseQueries::load_instruments(&slf.pool).await.unwrap(); + let result = DatabaseQueries::load_instruments(&self.pool).await.unwrap(); let mut instruments = Vec::new(); for instrument in result { let py_object = instrument_any_to_pyobject(py, instrument)?; @@ -118,12 +118,12 @@ impl PostgresCacheDatabase { #[pyo3(name = "load_order")] fn py_load_order( - slf: PyRef<'_, Self>, + &self, + py: Python, client_order_id: ClientOrderId, - py: Python<'_>, ) -> PyResult> { get_runtime().block_on(async { - let result = DatabaseQueries::load_order(&slf.pool, &client_order_id) + let result = DatabaseQueries::load_order(&self.pool, &client_order_id) .await .unwrap(); match result { @@ -137,13 +137,9 @@ impl PostgresCacheDatabase { } #[pyo3(name = "load_account")] - fn py_load_account( - slf: PyRef<'_, Self>, - account_id: AccountId, - py: Python<'_>, - ) -> PyResult> { + fn py_load_account(&self, py: Python, account_id: AccountId) -> PyResult> { get_runtime().block_on(async { - let result = DatabaseQueries::load_account(&slf.pool, &account_id) + let result = DatabaseQueries::load_account(&self.pool, &account_id) .await .unwrap(); match result { @@ -157,13 +153,9 @@ impl PostgresCacheDatabase { } #[pyo3(name = "load_quotes")] - fn py_load_quotes( - slf: PyRef<'_, Self>, - instrument_id: InstrumentId, - py: Python<'_>, - ) -> PyResult> { + fn py_load_quotes(&self, py: Python, instrument_id: InstrumentId) -> PyResult> { get_runtime().block_on(async { - let result = DatabaseQueries::load_quotes(&slf.pool, &instrument_id) + let result = DatabaseQueries::load_quotes(&self.pool, &instrument_id) .await .unwrap(); let mut quotes = Vec::new(); @@ -176,13 +168,9 @@ impl PostgresCacheDatabase { } #[pyo3(name = "load_trades")] - fn py_load_trades( - slf: PyRef<'_, Self>, - instrument_id: InstrumentId, - py: Python<'_>, - ) -> PyResult> { + fn py_load_trades(&self, py: Python, instrument_id: InstrumentId) -> PyResult> { get_runtime().block_on(async { - let result = DatabaseQueries::load_trades(&slf.pool, &instrument_id) + let result = DatabaseQueries::load_trades(&self.pool, &instrument_id) .await .unwrap(); let mut trades = Vec::new(); @@ -195,13 +183,9 @@ impl PostgresCacheDatabase { } #[pyo3(name = "load_bars")] - fn py_load_bars( - slf: PyRef<'_, Self>, - instrument_id: InstrumentId, - py: Python<'_>, - ) -> PyResult> { + fn py_load_bars(&self, py: Python, instrument_id: InstrumentId) -> PyResult> { get_runtime().block_on(async { - let result = DatabaseQueries::load_bars(&slf.pool, &instrument_id) + let result = DatabaseQueries::load_bars(&self.pool, &instrument_id) .await .unwrap(); let mut bars = Vec::new(); @@ -214,103 +198,92 @@ impl PostgresCacheDatabase { } #[pyo3(name = "load_signals")] - fn py_load_signals(slf: PyRef<'_, Self>, name: &str) -> PyResult> { + fn py_load_signals(&self, name: &str) -> PyResult> { get_runtime().block_on(async { - DatabaseQueries::load_signals(&slf.pool, name) + DatabaseQueries::load_signals(&self.pool, name) .await .map_err(to_pyruntime_err) }) } #[pyo3(name = "load_custom_data")] - fn py_load_custom_data(slf: PyRef<'_, Self>, data_type: DataType) -> PyResult> { + fn py_load_custom_data(&self, data_type: DataType) -> PyResult> { get_runtime().block_on(async { - DatabaseQueries::load_custom_data(&slf.pool, &data_type) + DatabaseQueries::load_custom_data(&self.pool, &data_type) .await .map_err(to_pyruntime_err) }) } #[pyo3(name = "add")] - fn py_add(slf: PyRefMut<'_, Self>, key: String, value: Vec) -> PyResult<()> { - slf.add(key, Bytes::from(value)).map_err(to_pyruntime_err) + fn py_add(&self, key: String, value: Vec) -> PyResult<()> { + self.add(key, Bytes::from(value)).map_err(to_pyruntime_err) } #[pyo3(name = "add_currency")] - fn py_add_currency(slf: PyRefMut<'_, Self>, currency: Currency) -> PyResult<()> { - slf.add_currency(¤cy).map_err(to_pyruntime_err) + fn py_add_currency(&self, currency: Currency) -> PyResult<()> { + self.add_currency(¤cy).map_err(to_pyruntime_err) } #[pyo3(name = "add_instrument")] - fn py_add_instrument( - slf: PyRefMut<'_, Self>, - instrument: PyObject, - py: Python<'_>, - ) -> PyResult<()> { + fn py_add_instrument(&self, py: Python, instrument: PyObject) -> PyResult<()> { let instrument_any = pyobject_to_instrument_any(py, instrument)?; - slf.add_instrument(&instrument_any) + self.add_instrument(&instrument_any) .map_err(to_pyruntime_err) } #[pyo3(name = "add_order")] fn py_add_order( - slf: PyRefMut<'_, Self>, + &self, + py: Python, order: PyObject, client_id: Option, - py: Python<'_>, ) -> PyResult<()> { let order_any = convert_pyobject_to_order_any(py, order)?; - slf.add_order(&order_any, client_id) + self.add_order(&order_any, client_id) .map_err(to_pyruntime_err) } #[pyo3(name = "add_account")] - fn py_add_account(slf: PyRefMut<'_, Self>, account: PyObject, py: Python<'_>) -> PyResult<()> { + fn py_add_account(&self, py: Python, account: PyObject) -> PyResult<()> { let account_any = convert_pyobject_to_account_any(py, account)?; - slf.add_account(&account_any).map_err(to_pyruntime_err) + self.add_account(&account_any).map_err(to_pyruntime_err) } #[pyo3(name = "add_quote")] - fn py_add_quote(slf: PyRefMut<'_, Self>, quote: PyObject, py: Python<'_>) -> PyResult<()> { - let quote = quote.extract::(py)?; - slf.add_quote("e).map_err(to_pyruntime_err) + fn py_add_quote(&self, quote: QuoteTick) -> PyResult<()> { + self.add_quote("e).map_err(to_pyruntime_err) } #[pyo3(name = "add_trade")] - fn py_add_trade(slf: PyRefMut<'_, Self>, trade: PyObject, py: Python<'_>) -> PyResult<()> { - let trade = trade.extract::(py)?; - slf.add_trade(&trade).map_err(to_pyruntime_err) + fn py_add_trade(&self, trade: TradeTick) -> PyResult<()> { + self.add_trade(&trade).map_err(to_pyruntime_err) } #[pyo3(name = "add_bar")] - fn py_add_bar(slf: PyRefMut<'_, Self>, bar: PyObject, py: Python<'_>) -> PyResult<()> { - let bar = bar.extract::(py)?; - slf.add_bar(&bar).map_err(to_pyruntime_err) + fn py_add_bar(&self, bar: Bar) -> PyResult<()> { + self.add_bar(&bar).map_err(to_pyruntime_err) } #[pyo3(name = "add_signal")] - fn py_add_signal(slf: PyRefMut<'_, Self>, signal: Signal) -> PyResult<()> { - slf.add_signal(&signal).map_err(to_pyruntime_err) + fn py_add_signal(&self, signal: Signal) -> PyResult<()> { + self.add_signal(&signal).map_err(to_pyruntime_err) } #[pyo3(name = "add_custom_data")] - fn py_add_custom_data(slf: PyRefMut<'_, Self>, data: CustomData) -> PyResult<()> { - slf.add_custom_data(&data).map_err(to_pyruntime_err) + fn py_add_custom_data(&self, data: CustomData) -> PyResult<()> { + self.add_custom_data(&data).map_err(to_pyruntime_err) } #[pyo3(name = "update_order")] - fn py_update_order( - slf: PyRefMut<'_, Self>, - order_event: PyObject, - py: Python<'_>, - ) -> PyResult<()> { + fn py_update_order(&self, py: Python, order_event: PyObject) -> PyResult<()> { let event = pyobject_to_order_event(py, order_event)?; - slf.update_order(&event).map_err(to_pyruntime_err) + self.update_order(&event).map_err(to_pyruntime_err) } #[pyo3(name = "update_account")] - fn py_update_account(slf: PyRefMut<'_, Self>, order: PyObject, py: Python<'_>) -> PyResult<()> { + fn py_update_account(&self, py: Python, order: PyObject) -> PyResult<()> { let order_any = convert_pyobject_to_account_any(py, order)?; - slf.update_account(&order_any).map_err(to_pyruntime_err) + self.update_account(&order_any).map_err(to_pyruntime_err) } } From 00ef5fe0e9517342b5a9ae4ef9d537fabd1eb78c Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 09:05:18 +1100 Subject: [PATCH 192/224] Standardize CacheDatabaseAdapter trait method ordering --- nautilus_core/common/src/cache/database.rs | 30 +++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/nautilus_core/common/src/cache/database.rs b/nautilus_core/common/src/cache/database.rs index 489d569cdbb6..7f706e0f691d 100644 --- a/nautilus_core/common/src/cache/database.rs +++ b/nautilus_core/common/src/cache/database.rs @@ -81,11 +81,17 @@ pub trait CacheDatabaseAdapter { fn load_actor(&self, component_id: &ComponentId) -> anyhow::Result>; - fn delete_actor(&self, component_id: &ComponentId) -> anyhow::Result<()>; - fn load_strategy(&self, strategy_id: &StrategyId) -> anyhow::Result>; - fn delete_strategy(&self, component_id: &StrategyId) -> anyhow::Result<()>; + fn load_signals(&self, name: &str) -> anyhow::Result>; + + fn load_custom_data(&self, data_type: &DataType) -> anyhow::Result>; + + fn load_quotes(&self, instrument_id: &InstrumentId) -> anyhow::Result>; + + fn load_trades(&self, instrument_id: &InstrumentId) -> anyhow::Result>; + + fn load_bars(&self, instrument_id: &InstrumentId) -> anyhow::Result>; fn add(&self, key: String, value: Bytes) -> anyhow::Result<()>; @@ -105,25 +111,19 @@ pub trait CacheDatabaseAdapter { fn add_order_book(&self, order_book: &OrderBook) -> anyhow::Result<()>; - fn add_quote(&self, quote: &QuoteTick) -> anyhow::Result<()>; + fn add_signal(&self, signal: &Signal) -> anyhow::Result<()>; - fn load_quotes(&self, instrument_id: &InstrumentId) -> anyhow::Result>; + fn add_custom_data(&self, data: &CustomData) -> anyhow::Result<()>; - fn add_trade(&self, trade: &TradeTick) -> anyhow::Result<()>; + fn add_quote(&self, quote: &QuoteTick) -> anyhow::Result<()>; - fn load_trades(&self, instrument_id: &InstrumentId) -> anyhow::Result>; + fn add_trade(&self, trade: &TradeTick) -> anyhow::Result<()>; fn add_bar(&self, bar: &Bar) -> anyhow::Result<()>; - fn load_bars(&self, instrument_id: &InstrumentId) -> anyhow::Result>; - - fn add_signal(&self, signal: &Signal) -> anyhow::Result<()>; - - fn load_signals(&self, name: &str) -> anyhow::Result>; - - fn add_custom_data(&self, data: &CustomData) -> anyhow::Result<()>; + fn delete_actor(&self, component_id: &ComponentId) -> anyhow::Result<()>; - fn load_custom_data(&self, data_type: &DataType) -> anyhow::Result>; + fn delete_strategy(&self, component_id: &StrategyId) -> anyhow::Result<()>; fn index_venue_order_id( &self, From 6c783966add9560f3c03abe9da6038d71e4c8e6b Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 09:19:27 +1100 Subject: [PATCH 193/224] Refine pyo3 exports --- nautilus_core/model/src/events/order/mod.rs | 4 ++-- nautilus_core/model/src/python/mod.rs | 25 ++++++++++++--------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/nautilus_core/model/src/events/order/mod.rs b/nautilus_core/model/src/events/order/mod.rs index 89c8aafb8bd5..f92f058c1824 100644 --- a/nautilus_core/model/src/events/order/mod.rs +++ b/nautilus_core/model/src/events/order/mod.rs @@ -56,8 +56,8 @@ pub use crate::events::order::{ canceled::OrderCanceled, denied::OrderDenied, emulated::OrderEmulated, expired::OrderExpired, filled::OrderFilled, initialized::OrderInitialized, modify_rejected::OrderModifyRejected, pending_cancel::OrderPendingCancel, pending_update::OrderPendingUpdate, - rejected::OrderRejected, released::OrderReleased, submitted::OrderSubmitted, - triggered::OrderTriggered, updated::OrderUpdated, + rejected::OrderRejected, released::OrderReleased, snapshot::OrderSnapshot, + submitted::OrderSubmitted, triggered::OrderTriggered, updated::OrderUpdated, }; /// Represents a type of [`OrderEvent`]. diff --git a/nautilus_core/model/src/python/mod.rs b/nautilus_core/model/src/python/mod.rs index 141975d09a43..2ffcba40d241 100644 --- a/nautilus_core/model/src/python/mod.rs +++ b/nautilus_core/model/src/python/mod.rs @@ -35,6 +35,13 @@ pub mod types; /// Loaded as nautilus_pyo3.model #[pymodule] pub fn model(_: Python<'_>, m: &PyModule) -> PyResult<()> { + // Types + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; // Data m.add_function(wrap_pyfunction!(data::drop_cvec_pycapsule, m)?)?; m.add_class::()?; @@ -112,12 +119,8 @@ pub fn model(_: Python<'_>, m: &PyModule) -> PyResult<()> { m.add_class::()?; m.add_class::()?; m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; + // Position + m.add_class::()?; // Instruments m.add_class::()?; m.add_class::()?; @@ -141,7 +144,8 @@ pub fn model(_: Python<'_>, m: &PyModule) -> PyResult<()> { crate::python::orderbook::book::py_update_book_with_trade_tick, m )?)?; - // Events - order + // Events + m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; @@ -158,10 +162,9 @@ pub fn model(_: Python<'_>, m: &PyModule) -> PyResult<()> { m.add_class::()?; m.add_class::()?; m.add_class::()?; - // Events - account - m.add_class::()?; - m.add_class::()?; - // Account + m.add_class::()?; + m.add_class::()?; + // Accounts m.add_class::()?; m.add_class::()?; m.add_function(wrap_pyfunction!( From 81346db03a131826852dc0860692291326c33657 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 09:29:46 +1100 Subject: [PATCH 194/224] Reduce effective deltas log level --- nautilus_trader/adapters/polymarket/data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nautilus_trader/adapters/polymarket/data.py b/nautilus_trader/adapters/polymarket/data.py index 69aa4a583baa..5d5c49266eed 100644 --- a/nautilus_trader/adapters/polymarket/data.py +++ b/nautilus_trader/adapters/polymarket/data.py @@ -417,8 +417,8 @@ def _handle_deltas(self, instrument: BinaryOption, deltas: OrderBookDeltas) -> N self._local_books[instrument.id] = book_new deltas = compute_effective_deltas(book_old, book_new, instrument) - interval = (self._clock.timestamp_ns() - t0) / 1_000_000 - self._log.info(f"Computed effective deltas in {interval:.3f}ms", LogColor.BLUE) + interval_ms = (self._clock.timestamp_ns() - t0) / 1_000_000 + self._log.debug(f"Computed effective deltas in {interval_ms:.3f}ms") # self._log.warning(book_new.pprint()) # Uncomment for development # Check if any effective deltas remain From b7d8b122d19a9c398e1bc36b2a790ca6d527aa00 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 09:43:47 +1100 Subject: [PATCH 195/224] Remove redundant comment --- tests/integration_tests/adapters/binance/test_parsing_ws.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/integration_tests/adapters/binance/test_parsing_ws.py b/tests/integration_tests/adapters/binance/test_parsing_ws.py index d105e03a0e65..82d480c8b1e4 100644 --- a/tests/integration_tests/adapters/binance/test_parsing_ws.py +++ b/tests/integration_tests/adapters/binance/test_parsing_ws.py @@ -32,7 +32,7 @@ def test_parse_ticker(self): package="tests.integration_tests.adapters.binance.resources.ws_messages", resource="ws_spot_ticker_24hr.json", ) - assert raw # Check not None + assert raw # Act decoder = msgspec.json.Decoder(BinanceTickerData) @@ -51,7 +51,7 @@ def test_parse_trade_lite(self): package="tests.integration_tests.adapters.binance.resources.ws_messages", resource="ws_futures_trade_lite.json", ) - assert raw # Check not None + assert raw # Act decoder = msgspec.json.Decoder(BinanceFuturesTradeLiteMsg) From 6c300d17c471c50c2f9e9cf3a29581befb7b325e Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 09:57:37 +1100 Subject: [PATCH 196/224] Fix Polymarket OrderFilled serialization --- .../adapters/polymarket/execution.py | 2 +- .../adapters/polymarket/schemas/user.py | 5 + .../adapters/polymarket/test_parsing.py | 101 ++++++++++++++++++ 3 files changed, 107 insertions(+), 1 deletion(-) diff --git a/nautilus_trader/adapters/polymarket/execution.py b/nautilus_trader/adapters/polymarket/execution.py index e9ff03d5debb..d634348147ed 100644 --- a/nautilus_trader/adapters/polymarket/execution.py +++ b/nautilus_trader/adapters/polymarket/execution.py @@ -940,5 +940,5 @@ def _handle_ws_trade_msg(self, msg: PolymarketUserTrade, wait_for_ack: bool): commission=Money(commission, USDC_POS), liquidity_side=msg.liqudity_side(), ts_event=millis_to_nanos(int(msg.match_time)), - info=msgspec.structs.asdict(msg), + info=msg.to_dict(), ) diff --git a/nautilus_trader/adapters/polymarket/schemas/user.py b/nautilus_trader/adapters/polymarket/schemas/user.py index b38882ca520b..e80e820d92bf 100644 --- a/nautilus_trader/adapters/polymarket/schemas/user.py +++ b/nautilus_trader/adapters/polymarket/schemas/user.py @@ -13,6 +13,8 @@ # limitations under the License. # ------------------------------------------------------------------------------------------------- +from typing import Any + import msgspec from nautilus_trader.adapters.polymarket.common.enums import PolymarketEventType @@ -155,6 +157,9 @@ class PolymarketUserTrade(msgspec.Struct, tag="trade", tag_field="event_type", f trader_side: PolymarketLiquiditySide type: PolymarketEventType # TRADE + def to_dict(self) -> dict[str, Any]: + return msgspec.json.decode(msgspec.json.encode(self)) + def liqudity_side(self) -> LiquiditySide: if self.trader_side == PolymarketLiquiditySide.MAKER: return LiquiditySide.MAKER diff --git a/tests/integration_tests/adapters/polymarket/test_parsing.py b/tests/integration_tests/adapters/polymarket/test_parsing.py index f93f5f71acb1..9c3e4b50bea4 100644 --- a/tests/integration_tests/adapters/polymarket/test_parsing.py +++ b/tests/integration_tests/adapters/polymarket/test_parsing.py @@ -221,3 +221,104 @@ def test_parse_user_trade(data_file: str) -> None: # Assert assert isinstance(msg, PolymarketUserTrade) + + +def test_parse_user_trade_to_dict() -> None: + # Arrange + data = pkgutil.get_data( + "tests.integration_tests.adapters.polymarket.resources.ws_messages", + "user_trade1.json", + ) + assert data + + decoder = msgspec.json.Decoder(PolymarketUserTrade) + msg = decoder.decode(data) + + # Act + values = msg.to_dict() + + # Assert + assert values == { + "event_type": "trade", + "asset_id": "21742633143463906290569050155826241533067272736897614950488156847949938836455", + "bucket_index": "0", + "fee_rate_bps": "0", + "id": "83b5c849-620e-4c23-b63b-2e779c04a6e7", + "last_update": "1725868885", + "maker_address": "0x64B7a036c378f9CF8163A5480437CD12Ae14b6A1", + "maker_orders": [ + { + "asset_id": "48331043336612883890938759509493159234755048973500640148014422747788308965732", + "fee_rate_bps": "0", + "maker_address": "0xFfd192468b7a05b38c37C82d09fA941289FaEB23", + "matched_amount": "10", + "order_id": "0x3b67d584e1e7ad29b06bda373449638898aa87f0c9fd52a34bdbfb1325a6c184", + "outcome": "No", + "owner": "78132bc3-22af-6aa2-79ae-11929f821cae", + "price": "0.482", + }, + { + "asset_id": "21742633143463906290569050155826241533067272736897614950488156847949938836455", + "fee_rate_bps": "0", + "maker_address": "0xA15DfDEE79Fe241A99D4f42a8D41510b670fFb40", + "matched_amount": "247.68", + "order_id": "0x67620d882faa37cd1a6668de1271c4b1b6f58fb4ebabc2c095692dfd9c15735b", + "outcome": "Yes", + "owner": "86f776cc-e18b-c94e-80b4-a7364e0ecec5", + "price": "0.518", + }, + { + "asset_id": "21742633143463906290569050155826241533067272736897614950488156847949938836455", + "fee_rate_bps": "0", + "maker_address": "0x4a5Ef3c64056362ce10fCd2C1B9BBd9BEC4CB3EF", + "matched_amount": "227.92", + "order_id": "0x8d2f8f0d2bd92bc734c3f324d6e88b2fa0e96a91efb124aa6d73bfb4639e7287", + "outcome": "Yes", + "owner": "58c3ba99-0006-1c64-a59b-290c59abd1ce", + "price": "0.518", + }, + { + "asset_id": "21742633143463906290569050155826241533067272736897614950488156847949938836455", + "fee_rate_bps": "0", + "maker_address": "0xa3D82Ed56F4c68d2328Fb8c29e568Ba2cAF7d7c8", + "matched_amount": "5", + "order_id": "0xab679e56242324e15e59cfd488cd0f12e4fd71b153b9bfb57518898b9983145e", + "outcome": "Yes", + "owner": "3e2c94ca-8124-c4c1-c7ea-be1ea21b71fe", + "price": "0.518", + }, + { + "asset_id": "21742633143463906290569050155826241533067272736897614950488156847949938836455", + "fee_rate_bps": "0", + "maker_address": "0xac2ce2bA3Bde4959921D35d6480eF77Fb7CE53d9", + "matched_amount": "394.46", + "order_id": "0xb222c67c2d1e6c01eace5ca2b830cf3a0e6f5ef079270781e5ebd42a86722578", + "outcome": "Yes", + "owner": "2411624a-9df5-6457-cba9-abf680875588", + "price": "0.518", + }, + { + "asset_id": "21742633143463906290569050155826241533067272736897614950488156847949938836455", + "fee_rate_bps": "0", + "maker_address": "0x5c744e01Ac62d025E56F1398605dE581dE607C65", + "matched_amount": "211.81", + "order_id": "0xed3e5b80ca742bbd5048cdd42cf6fe8782a0e202658e070b4c8ebc4911059652", + "outcome": "Yes", + "owner": "99d32b22-5e10-8caa-a981-d21ad20989e2", + "price": "0.518", + }, + ], + "market": "0xdd22472e552920b8438158ea7238bfadfa4f736aa4cee91a6b86c39ead110917", + "match_time": "1725868859", + "outcome": "Yes", + "owner": "092dab0c-74fa-5ba7-4b67-572daeace198", + "price": "0.518", + "side": "BUY", + "size": "1096.87", + "status": "MINED", + "taker_order_id": "0x3ad09f225ebe141dfbdb3824f31cb457e8e0301ca4e0a06311e543f5328b9dea", + "timestamp": "1725868885871", + "trade_owner": "092dab0c-74fa-5ba7-4b67-572daeace198", + "trader_side": "MAKER", + "type": "TRADE", + } From ac1c90555f4b61bf27716ff10c19f5a6f2fc1894 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 11:06:00 +1100 Subject: [PATCH 197/224] Align Position.to_dict for pyo3 and cython --- RELEASES.md | 1 + .../infrastructure/src/python/sql/cache.rs | 7 +++ .../src/sql/models/positions.rs | 6 +-- .../model/src/events/position/snapshot.rs | 6 +-- nautilus_core/model/src/python/events/mod.rs | 1 + .../model/src/python/events/position/mod.rs | 16 ++++++ .../src/python/events/position/snapshot.rs | 51 +++++++++++++++++++ nautilus_core/model/src/python/position.rs | 8 +-- nautilus_trader/cache/postgres/adapter.py | 6 +++ .../cache/postgres/transformers.py | 6 +++ nautilus_trader/core/nautilus_pyo3.pyi | 7 +++ nautilus_trader/model/position.pyx | 3 +- .../test_cache_database_postgres.py | 30 +++++++++++ tests/unit_tests/model/test_position.py | 9 ++-- tests/unit_tests/model/test_position_pyo3.py | 34 +++++++++++-- 15 files changed, 174 insertions(+), 17 deletions(-) create mode 100644 nautilus_core/model/src/python/events/position/mod.rs create mode 100644 nautilus_core/model/src/python/events/position/snapshot.rs diff --git a/RELEASES.md b/RELEASES.md index d69d85480015..9529dbc810ab 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -32,6 +32,7 @@ Released on TBD (UTC). - Removed legacy `TardisQuoteDataLoader` (now redundant with new Rust implemented loader) - Removed legacy `TardisTradeDataLoader` (now redundant with new Rust implemented loader) - Custom signals are now passed to `on_signal(signal)` instead of `on_data(data)` +- Changed `Position.to_dict()` `commissions` value to a list of strings (rather than the string of a list of strings) - Changed `BettingInstrument` Arrow schema fields `event_open_date` and `market_start_time` from `string` to `uint64` ### Fixes diff --git a/nautilus_core/infrastructure/src/python/sql/cache.rs b/nautilus_core/infrastructure/src/python/sql/cache.rs index 3782e5f6ac73..4e413379ccb3 100644 --- a/nautilus_core/infrastructure/src/python/sql/cache.rs +++ b/nautilus_core/infrastructure/src/python/sql/cache.rs @@ -22,6 +22,7 @@ use nautilus_common::{ use nautilus_core::python::to_pyruntime_err; use nautilus_model::{ data::{bar::Bar, quote::QuoteTick, trade::TradeTick, DataType}, + events::position::snapshot::PositionSnapshot, identifiers::{AccountId, ClientId, ClientOrderId, InstrumentId}, python::{ account::{convert_account_any_to_pyobject, convert_pyobject_to_account_any}, @@ -244,6 +245,12 @@ impl PostgresCacheDatabase { .map_err(to_pyruntime_err) } + #[pyo3(name = "add_position_snapshot")] + fn py_add_position_snapshot(&self, snapshot: PositionSnapshot) -> PyResult<()> { + self.add_position_snapshot(&snapshot) + .map_err(to_pyruntime_err) + } + #[pyo3(name = "add_account")] fn py_add_account(&self, py: Python, account: PyObject) -> PyResult<()> { let account_any = convert_pyobject_to_account_any(py, account)?; diff --git a/nautilus_core/infrastructure/src/sql/models/positions.rs b/nautilus_core/infrastructure/src/sql/models/positions.rs index 8f2ce341fdeb..9af4cc2569de 100644 --- a/nautilus_core/infrastructure/src/sql/models/positions.rs +++ b/nautilus_core/infrastructure/src/sql/models/positions.rs @@ -66,9 +66,9 @@ impl<'r> FromRow<'r, PgRow> for PositionSnapshotModel { .try_get::<&str, _>("settlement_currency") .map(Currency::from)?; - let avg_px_open = row.try_get::("avg_px_open")?; - let avg_px_close = row.try_get::, _>("avg_px_close")?; - let realized_return = row.try_get::, _>("realized_return")?; + let avg_px_open = row.try_get::("avg_px_open")?; + let avg_px_close = row.try_get::, _>("avg_px_close")?; + let realized_return = row.try_get::, _>("realized_return")?; let realized_pnl = row.try_get::<&str, _>("realized_pnl").map(Money::from)?; let unrealized_pnl = row .try_get::, _>("unrealized_pnl") diff --git a/nautilus_core/model/src/events/position/snapshot.rs b/nautilus_core/model/src/events/position/snapshot.rs index 0a46e88e1d93..81eae09731cd 100644 --- a/nautilus_core/model/src/events/position/snapshot.rs +++ b/nautilus_core/model/src/events/position/snapshot.rs @@ -65,11 +65,11 @@ pub struct PositionSnapshot { /// The position settlement currency. pub settlement_currency: Currency, /// The average open price. - pub avg_px_open: f64, + pub avg_px_open: String, /// The average closing price. - pub avg_px_close: Option, + pub avg_px_close: Option, /// The realized return for the position. - pub realized_return: Option, + pub realized_return: Option, /// The realized PnL for the position (including commissions). pub realized_pnl: Money, /// The unrealized PnL for the position (including commissions). diff --git a/nautilus_core/model/src/python/events/mod.rs b/nautilus_core/model/src/python/events/mod.rs index 1e86eda35b56..8ebb3e74093f 100644 --- a/nautilus_core/model/src/python/events/mod.rs +++ b/nautilus_core/model/src/python/events/mod.rs @@ -17,3 +17,4 @@ pub mod account; pub mod order; +pub mod position; diff --git a/nautilus_core/model/src/python/events/position/mod.rs b/nautilus_core/model/src/python/events/position/mod.rs new file mode 100644 index 000000000000..d9d24ca310d9 --- /dev/null +++ b/nautilus_core/model/src/python/events/position/mod.rs @@ -0,0 +1,16 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +pub mod snapshot; diff --git a/nautilus_core/model/src/python/events/position/snapshot.rs b/nautilus_core/model/src/python/events/position/snapshot.rs new file mode 100644 index 000000000000..b72ed6505989 --- /dev/null +++ b/nautilus_core/model/src/python/events/position/snapshot.rs @@ -0,0 +1,51 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use nautilus_core::{ + python::{serialization::from_dict_pyo3, to_pyvalue_err}, + uuid::UUID4, +}; +use pyo3::{basic::CompareOp, prelude::*, types::PyDict}; + +use crate::{ + enums::{LiquiditySide, OrderSide, OrderType}, + events::{order::OrderFilled, position::snapshot::PositionSnapshot}, + identifiers::{ + AccountId, ClientOrderId, InstrumentId, PositionId, StrategyId, TradeId, TraderId, + VenueOrderId, + }, + types::{currency::Currency, money::Money, price::Price, quantity::Quantity}, +}; + +#[pymethods] +impl PositionSnapshot { + fn __richcmp__(&self, other: &Self, op: CompareOp, py: Python<'_>) -> Py { + match op { + CompareOp::Eq => self.eq(other).into_py(py), + CompareOp::Ne => self.ne(other).into_py(py), + _ => py.NotImplemented(), + } + } + + fn __repr__(&self) -> String { + format!("{:?}", self) + } + + #[staticmethod] + #[pyo3(name = "from_dict")] + fn py_from_dict(py: Python<'_>, values: Py) -> PyResult { + from_dict_pyo3(py, values) + } +} diff --git a/nautilus_core/model/src/python/position.rs b/nautilus_core/model/src/python/position.rs index 55cd7d30669a..5c7a8a08f955 100644 --- a/nautilus_core/model/src/python/position.rs +++ b/nautilus_core/model/src/python/position.rs @@ -343,7 +343,7 @@ impl Position { dict.set_item("trader_id", self.trader_id.to_string())?; dict.set_item("strategy_id", self.strategy_id.to_string())?; dict.set_item("instrument_id", self.instrument_id.to_string())?; - dict.set_item("id", self.id.to_string())?; + dict.set_item("position_id", self.id.to_string())?; dict.set_item("account_id", self.account_id.to_string())?; dict.set_item("opening_order_id", self.opening_order_id.to_string())?; match self.closing_order_id { @@ -380,12 +380,12 @@ impl Position { None => dict.set_item("ts_closed", py.None())?, } dict.set_item("duration_ns", self.duration_ns.to_u64())?; - dict.set_item("avg_px_open", self.avg_px_open.to_f64())?; + dict.set_item("avg_px_open", self.avg_px_open.to_string())?; match self.avg_px_close { - Some(avg_px_close) => dict.set_item("avg_px_close", avg_px_close.to_u64())?, + Some(avg_px_close) => dict.set_item("avg_px_close", avg_px_close.to_string())?, None => dict.set_item("avg_px_close", py.None())?, } - dict.set_item("realized_return", self.realized_return.to_f64())?; + dict.set_item("realized_return", self.realized_return.to_string())?; match self.realized_pnl { Some(realized_pnl) => dict.set_item("realized_pnl", realized_pnl.to_string())?, None => dict.set_item("realized_pnl", py.None())?, diff --git a/nautilus_trader/cache/postgres/adapter.py b/nautilus_trader/cache/postgres/adapter.py index 1d462d29bd4c..83313d4535b2 100644 --- a/nautilus_trader/cache/postgres/adapter.py +++ b/nautilus_trader/cache/postgres/adapter.py @@ -29,6 +29,7 @@ from nautilus_trader.cache.postgres.transformers import transform_order_event_to_pyo3 from nautilus_trader.cache.postgres.transformers import transform_order_from_pyo3 from nautilus_trader.cache.postgres.transformers import transform_order_to_pyo3 +from nautilus_trader.cache.postgres.transformers import transform_position_to_snapshot_pyo3 from nautilus_trader.cache.postgres.transformers import transform_quote_tick_to_pyo3 from nautilus_trader.cache.postgres.transformers import transform_signal_from_pyo3 from nautilus_trader.cache.postgres.transformers import transform_signal_to_pyo3 @@ -48,6 +49,7 @@ from nautilus_trader.model.instruments import Instrument from nautilus_trader.model.objects import Currency from nautilus_trader.model.orders import Order +from nautilus_trader.model.position import Position class CachePostgresAdapter(CacheDatabaseFacade): @@ -143,6 +145,10 @@ def add_order(self, order: Order): order_pyo3 = transform_order_to_pyo3(order) self._backing.add_order(order_pyo3) + def add_position_snapshot(self, position: Position) -> None: + snapshot_pyo3 = transform_position_to_snapshot_pyo3(position) + self._backing.add_position_snapshot(snapshot_pyo3) + def add_account(self, account: Account): account_pyo3 = transform_account_to_pyo3(account) self._backing.add_account(account_pyo3) diff --git a/nautilus_trader/cache/postgres/transformers.py b/nautilus_trader/cache/postgres/transformers.py index 64d462763bd4..fa3712e31eca 100644 --- a/nautilus_trader/cache/postgres/transformers.py +++ b/nautilus_trader/cache/postgres/transformers.py @@ -56,6 +56,7 @@ from nautilus_trader.model.objects import Currency from nautilus_trader.model.orders import Order from nautilus_trader.model.orders.unpacker import OrderUnpacker +from nautilus_trader.model.position import Position ################################################################################ @@ -260,6 +261,11 @@ def transform_order_from_pyo3(order_pyo3): return order_cython +def transform_position_to_snapshot_pyo3(position: Position): + values = position.to_dict() + return nautilus_pyo3.PositionSnapshot.from_dict(values) + + ################################################################################ # Account ################################################################################ diff --git a/nautilus_trader/core/nautilus_pyo3.pyi b/nautilus_trader/core/nautilus_pyo3.pyi index 18ac74f08744..25415635623a 100644 --- a/nautilus_trader/core/nautilus_pyo3.pyi +++ b/nautilus_trader/core/nautilus_pyo3.pyi @@ -2562,6 +2562,12 @@ class OrderExpired: def from_dict(cls, values: dict[str, str]) -> OrderExpired: ... def to_dict(self) -> dict[str, str]: ... +class PositionSnapshot: + @classmethod + def from_dict(cls, values: dict[str, Any]) -> PositionSnapshot: ... + +# OrderBook + class Level: @property def price(self) -> Price: ... @@ -2676,6 +2682,7 @@ class PostgresCacheDatabase: def add_currency(self, currency: Currency) -> None: ... def add_instrument(self, instrument: object) -> None: ... def add_order(self, order: object) -> None: ... + def add_position_snapshot(self, snapshot: PositionSnapshot) -> None: ... def add_account(self, account: object) -> None: ... def add_trade(self, trade: TradeTick) -> None: ... def add_quote(self, quote: QuoteTick) -> None: ... diff --git a/nautilus_trader/model/position.pyx b/nautilus_trader/model/position.pyx index 529106bcbd27..15a8c300a0c1 100644 --- a/nautilus_trader/model/position.pyx +++ b/nautilus_trader/model/position.pyx @@ -144,6 +144,7 @@ cdef class Position: "signed_qty": self.signed_qty, "quantity": str(self.quantity), "peak_qty": str(self.peak_qty), + "ts_init": self.ts_init, "ts_opened": self.ts_opened, "ts_last": self.ts_last, "ts_closed": self.ts_closed if self.ts_closed > 0 else None, @@ -153,7 +154,7 @@ cdef class Position: "quote_currency": self.quote_currency.code, "base_currency": self.base_currency.code if self.base_currency is not None else None, "settlement_currency": self.settlement_currency.code, - "commissions": str(sorted([str(c) for c in self.commissions()])) if self._commissions else None, + "commissions": sorted([str(c) for c in self.commissions()]) if self._commissions else None, "realized_return": str(round(self.realized_return, 5)), "realized_pnl": str(self.realized_pnl), } diff --git a/tests/integration_tests/infrastructure/test_cache_database_postgres.py b/tests/integration_tests/infrastructure/test_cache_database_postgres.py index 70a735e32f40..9025b259089a 100644 --- a/tests/integration_tests/infrastructure/test_cache_database_postgres.py +++ b/tests/integration_tests/infrastructure/test_cache_database_postgres.py @@ -37,6 +37,8 @@ from nautilus_trader.model.enums import OrderSide from nautilus_trader.model.enums import PriceType from nautilus_trader.model.events import AccountState +from nautilus_trader.model.identifiers import PositionId +from nautilus_trader.model.identifiers import StrategyId from nautilus_trader.model.identifiers import TradeId from nautilus_trader.model.instruments import CurrencyPair from nautilus_trader.model.objects import AccountBalance @@ -44,6 +46,7 @@ from nautilus_trader.model.objects import Money from nautilus_trader.model.objects import Price from nautilus_trader.model.objects import Quantity +from nautilus_trader.model.position import Position from nautilus_trader.portfolio.portfolio import Portfolio from nautilus_trader.test_kit.functions import eventually from nautilus_trader.test_kit.providers import TestInstrumentProvider @@ -471,6 +474,7 @@ async def test_update_order_for_open_order(self): Quantity.from_int(100_000), Price.from_str("1.00000"), ) + # Add foreign key dependencies: instrument and currencies self.database.add_currency(_AUDUSD_SIM.base_currency) self.database.add_currency(_AUDUSD_SIM.quote_currency) @@ -494,6 +498,32 @@ async def test_update_order_for_open_order(self): assert result == order assert order.to_dict() == result.to_dict() + @pytest.mark.asyncio + async def test_add_position_snapshot(self): + self.database.add_currency(_AUDUSD_SIM.quote_currency) + order = self.strategy.order_factory.stop_market( + _AUDUSD_SIM.id, + OrderSide.BUY, + Quantity.from_int(100_000), + Price.from_str("1.00000"), + ) + # Add foreign key dependencies: instrument and currencies + self.database.add_currency(_AUDUSD_SIM.base_currency) + self.database.add_currency(_AUDUSD_SIM.quote_currency) + self.database.add_instrument(_AUDUSD_SIM) + + fill = TestEventStubs.order_filled( + order=order, + instrument=_AUDUSD_SIM, + position_id=PositionId("P-123456"), + strategy_id=StrategyId("S-001"), + last_px=Price.from_str("1.00001"), + ) + + position = Position(instrument=_AUDUSD_SIM, fill=fill) + + self.database.add_position_snapshot(position) + ################################################################################ # Accounts ################################################################################ diff --git a/tests/unit_tests/model/test_position.py b/tests/unit_tests/model/test_position.py index 2953cfe8a868..e40ce4ef48f6 100644 --- a/tests/unit_tests/model/test_position.py +++ b/tests/unit_tests/model/test_position.py @@ -147,6 +147,7 @@ def test_position_to_dict(self) -> None: "signed_qty": 100000.0, "quantity": "100000", "peak_qty": "100000", + "ts_init": 0, "ts_opened": 0, "ts_last": 0, "ts_closed": None, @@ -158,7 +159,7 @@ def test_position_to_dict(self) -> None: "settlement_currency": "USD", "realized_return": "0.0", "realized_pnl": "-2.00 USD", - "commissions": "['2.00 USD']", + "commissions": ["2.00 USD"], } def test_long_position_to_dict_equity(self) -> None: @@ -196,6 +197,7 @@ def test_long_position_to_dict_equity(self) -> None: "signed_qty": 100000.0, "quantity": "100000", "peak_qty": "100000", + "ts_init": 0, "ts_opened": 0, "ts_last": 0, "ts_closed": None, @@ -207,7 +209,7 @@ def test_long_position_to_dict_equity(self) -> None: "settlement_currency": "USD", "realized_return": "0.0", "realized_pnl": "0.00 USD", - "commissions": "['0.00 USD']", + "commissions": ["0.00 USD"], } def test_short_position_to_dict_equity(self) -> None: @@ -245,6 +247,7 @@ def test_short_position_to_dict_equity(self) -> None: "signed_qty": -100000.0, "quantity": "100000", "peak_qty": "100000", + "ts_init": 0, "ts_opened": 0, "ts_last": 0, "ts_closed": None, @@ -256,7 +259,7 @@ def test_short_position_to_dict_equity(self) -> None: "settlement_currency": "USD", "realized_return": "0.0", "realized_pnl": "0.00 USD", - "commissions": "['0.00 USD']", + "commissions": ["0.00 USD"], } @pytest.mark.parametrize( diff --git a/tests/unit_tests/model/test_position_pyo3.py b/tests/unit_tests/model/test_position_pyo3.py index da04befbac23..722eb297b9ea 100644 --- a/tests/unit_tests/model/test_position_pyo3.py +++ b/tests/unit_tests/model/test_position_pyo3.py @@ -25,6 +25,7 @@ from nautilus_trader.core.nautilus_pyo3 import Position from nautilus_trader.core.nautilus_pyo3 import PositionId from nautilus_trader.core.nautilus_pyo3 import PositionSide +from nautilus_trader.core.nautilus_pyo3 import PositionSnapshot from nautilus_trader.core.nautilus_pyo3 import Price from nautilus_trader.core.nautilus_pyo3 import Quantity from nautilus_trader.core.nautilus_pyo3 import StrategyId @@ -67,6 +68,33 @@ def test_position_hash_str_repr(): assert repr(position) == "Position(LONG 100_000 AUD/USD.SIM, id=P-123456)" +def test_position_snapshot(): + # Arrange + order = TestOrderProviderPyo3.market_order( + instrument_id=AUDUSD_SIM.id, + order_side=OrderSide.BUY, + quantity=Quantity.from_int(100_000), + ) + + fill = TestEventsProviderPyo3.order_filled( + order=order, + instrument=AUDUSD_SIM, + position_id=PositionId("P-123456"), + strategy_id=StrategyId("S-001"), + last_px=Price.from_str("1.00001"), + ) + + position = Position(instrument=AUDUSD_SIM, fill=fill) + + # Act + values = position.to_dict() + snapshot = PositionSnapshot.from_dict(values) + + # Assert + # TODO: Assert all attributes + assert snapshot + + def test_position_to_from_dict(): long_position = TestAccountingProviderPyo3.long_position() result_dict = long_position.to_dict() @@ -76,7 +104,7 @@ def test_position_to_from_dict(): "type": "Position", "account_id": "SIM-000", "avg_px_close": None, - "avg_px_open": 1.00001, + "avg_px_open": "1.00001", "base_currency": "AUD", "buy_qty": "100000", "closing_order_id": None, @@ -108,7 +136,7 @@ def test_position_to_from_dict(): "venue_order_id": "1", }, ], - "id": "P-123456", + "position_id": "P-123456", "instrument_id": "AUD/USD.SIM", "is_inverse": False, "multiplier": "1", @@ -118,7 +146,7 @@ def test_position_to_from_dict(): "quantity": "100000", "quote_currency": "USD", "realized_pnl": "-2.00 USD", - "realized_return": 0.0, + "realized_return": "0", "sell_qty": "0", "settlement_currency": "USD", "side": "LONG", From cbc399c98bddb73b39fec993b0ae7f0a8a06f844 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 14:25:35 +1100 Subject: [PATCH 198/224] Standardize PositionSnapshot schema --- RELEASES.md | 5 ++++- .../infrastructure/src/sql/models/positions.rs | 6 +++--- nautilus_core/model/src/events/position/snapshot.rs | 6 +++--- nautilus_core/model/src/python/position.rs | 6 +++--- nautilus_trader/model/position.pyx | 8 ++++---- tests/unit_tests/analysis/test_reports.py | 6 +++--- tests/unit_tests/model/test_position.py | 12 ++++++------ tests/unit_tests/model/test_position_pyo3.py | 4 ++-- 8 files changed, 28 insertions(+), 25 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index 9529dbc810ab..b421351b83c0 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -32,7 +32,10 @@ Released on TBD (UTC). - Removed legacy `TardisQuoteDataLoader` (now redundant with new Rust implemented loader) - Removed legacy `TardisTradeDataLoader` (now redundant with new Rust implemented loader) - Custom signals are now passed to `on_signal(signal)` instead of `on_data(data)` -- Changed `Position.to_dict()` `commissions` value to a list of strings (rather than the string of a list of strings) +- Changed `Position.to_dict()` `commissions` value type to `list[str]` (rather than an optional `str` of a list of strings) +- Changed `Position.to_dict()` `avg_px_open` value type to `float` +- Changed `Position.to_dict()` `avg_px_close` value type to `float | None` +- Changed `Position.to_dict()` `realized_return` value type to `float | None` - Changed `BettingInstrument` Arrow schema fields `event_open_date` and `market_start_time` from `string` to `uint64` ### Fixes diff --git a/nautilus_core/infrastructure/src/sql/models/positions.rs b/nautilus_core/infrastructure/src/sql/models/positions.rs index 9af4cc2569de..8f2ce341fdeb 100644 --- a/nautilus_core/infrastructure/src/sql/models/positions.rs +++ b/nautilus_core/infrastructure/src/sql/models/positions.rs @@ -66,9 +66,9 @@ impl<'r> FromRow<'r, PgRow> for PositionSnapshotModel { .try_get::<&str, _>("settlement_currency") .map(Currency::from)?; - let avg_px_open = row.try_get::("avg_px_open")?; - let avg_px_close = row.try_get::, _>("avg_px_close")?; - let realized_return = row.try_get::, _>("realized_return")?; + let avg_px_open = row.try_get::("avg_px_open")?; + let avg_px_close = row.try_get::, _>("avg_px_close")?; + let realized_return = row.try_get::, _>("realized_return")?; let realized_pnl = row.try_get::<&str, _>("realized_pnl").map(Money::from)?; let unrealized_pnl = row .try_get::, _>("unrealized_pnl") diff --git a/nautilus_core/model/src/events/position/snapshot.rs b/nautilus_core/model/src/events/position/snapshot.rs index 81eae09731cd..0a46e88e1d93 100644 --- a/nautilus_core/model/src/events/position/snapshot.rs +++ b/nautilus_core/model/src/events/position/snapshot.rs @@ -65,11 +65,11 @@ pub struct PositionSnapshot { /// The position settlement currency. pub settlement_currency: Currency, /// The average open price. - pub avg_px_open: String, + pub avg_px_open: f64, /// The average closing price. - pub avg_px_close: Option, + pub avg_px_close: Option, /// The realized return for the position. - pub realized_return: Option, + pub realized_return: Option, /// The realized PnL for the position (including commissions). pub realized_pnl: Money, /// The unrealized PnL for the position (including commissions). diff --git a/nautilus_core/model/src/python/position.rs b/nautilus_core/model/src/python/position.rs index 5c7a8a08f955..0cb4b96cc306 100644 --- a/nautilus_core/model/src/python/position.rs +++ b/nautilus_core/model/src/python/position.rs @@ -380,12 +380,12 @@ impl Position { None => dict.set_item("ts_closed", py.None())?, } dict.set_item("duration_ns", self.duration_ns.to_u64())?; - dict.set_item("avg_px_open", self.avg_px_open.to_string())?; + dict.set_item("avg_px_open", self.avg_px_open)?; match self.avg_px_close { - Some(avg_px_close) => dict.set_item("avg_px_close", avg_px_close.to_string())?, + Some(avg_px_close) => dict.set_item("avg_px_close", avg_px_close)?, None => dict.set_item("avg_px_close", py.None())?, } - dict.set_item("realized_return", self.realized_return.to_string())?; + dict.set_item("realized_return", self.realized_return)?; match self.realized_pnl { Some(realized_pnl) => dict.set_item("realized_pnl", realized_pnl.to_string())?, None => dict.set_item("realized_pnl", py.None())?, diff --git a/nautilus_trader/model/position.pyx b/nautilus_trader/model/position.pyx index 15a8c300a0c1..fb09ef205af5 100644 --- a/nautilus_trader/model/position.pyx +++ b/nautilus_trader/model/position.pyx @@ -149,13 +149,13 @@ cdef class Position: "ts_last": self.ts_last, "ts_closed": self.ts_closed if self.ts_closed > 0 else None, "duration_ns": self.duration_ns if self.duration_ns > 0 else None, - "avg_px_open": str(self.avg_px_open), - "avg_px_close": str(self.avg_px_close) if self.avg_px_close > 0 else None, + "avg_px_open": self.avg_px_open, + "avg_px_close": self.avg_px_close if self.avg_px_close > 0 else None, "quote_currency": self.quote_currency.code, "base_currency": self.base_currency.code if self.base_currency is not None else None, "settlement_currency": self.settlement_currency.code, - "commissions": sorted([str(c) for c in self.commissions()]) if self._commissions else None, - "realized_return": str(round(self.realized_return, 5)), + "commissions": sorted([str(c) for c in self.commissions()]), + "realized_return": round(self.realized_return, 5), "realized_pnl": str(self.realized_pnl), } diff --git a/tests/unit_tests/analysis/test_reports.py b/tests/unit_tests/analysis/test_reports.py index 346d646dbffb..ceeed3ac3bc7 100644 --- a/tests/unit_tests/analysis/test_reports.py +++ b/tests/unit_tests/analysis/test_reports.py @@ -342,8 +342,8 @@ def test_generate_positions_report(self): assert report.iloc[0]["entry"] == "BUY" assert report.iloc[0]["side"] == "FLAT" assert report.iloc[0]["peak_qty"] == "100000" - assert report.iloc[0]["avg_px_open"] == "1.0001" - assert report.iloc[0]["avg_px_close"] == "1.0001" + assert report.iloc[0]["avg_px_open"] == 1.0001 + assert report.iloc[0]["avg_px_close"] == 1.0001 assert report.iloc[0]["ts_opened"] == UNIX_EPOCH assert pd.isna(report.iloc[0]["ts_closed"]) - assert report.iloc[0]["realized_return"] == "0.0" + assert report.iloc[0]["realized_return"] == 0.0 diff --git a/tests/unit_tests/model/test_position.py b/tests/unit_tests/model/test_position.py index e40ce4ef48f6..47a79498ecb0 100644 --- a/tests/unit_tests/model/test_position.py +++ b/tests/unit_tests/model/test_position.py @@ -152,12 +152,12 @@ def test_position_to_dict(self) -> None: "ts_last": 0, "ts_closed": None, "duration_ns": None, - "avg_px_open": "1.00001", + "avg_px_open": 1.00001, "avg_px_close": None, "quote_currency": "USD", "base_currency": "AUD", "settlement_currency": "USD", - "realized_return": "0.0", + "realized_return": 0.0, "realized_pnl": "-2.00 USD", "commissions": ["2.00 USD"], } @@ -202,12 +202,12 @@ def test_long_position_to_dict_equity(self) -> None: "ts_last": 0, "ts_closed": None, "duration_ns": None, - "avg_px_open": "1.00001", + "avg_px_open": 1.00001, "avg_px_close": None, "quote_currency": "USD", "base_currency": None, "settlement_currency": "USD", - "realized_return": "0.0", + "realized_return": 0.0, "realized_pnl": "0.00 USD", "commissions": ["0.00 USD"], } @@ -252,12 +252,12 @@ def test_short_position_to_dict_equity(self) -> None: "ts_last": 0, "ts_closed": None, "duration_ns": None, - "avg_px_open": "1.00001", + "avg_px_open": 1.00001, "avg_px_close": None, "quote_currency": "USD", "base_currency": None, "settlement_currency": "USD", - "realized_return": "0.0", + "realized_return": 0.0, "realized_pnl": "0.00 USD", "commissions": ["0.00 USD"], } diff --git a/tests/unit_tests/model/test_position_pyo3.py b/tests/unit_tests/model/test_position_pyo3.py index 722eb297b9ea..164fa25d9202 100644 --- a/tests/unit_tests/model/test_position_pyo3.py +++ b/tests/unit_tests/model/test_position_pyo3.py @@ -104,7 +104,7 @@ def test_position_to_from_dict(): "type": "Position", "account_id": "SIM-000", "avg_px_close": None, - "avg_px_open": "1.00001", + "avg_px_open": 1.00001, "base_currency": "AUD", "buy_qty": "100000", "closing_order_id": None, @@ -146,7 +146,7 @@ def test_position_to_from_dict(): "quantity": "100000", "quote_currency": "USD", "realized_pnl": "-2.00 USD", - "realized_return": "0", + "realized_return": 0.0, "sell_qty": "0", "settlement_currency": "USD", "side": "LONG", From 6105af2fe2e9337804b241b80ad80a0029d18e4f Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 14:51:40 +1100 Subject: [PATCH 199/224] Fix PositionSnapshot base_currency handling --- nautilus_core/infrastructure/src/sql/models/positions.rs | 5 +++-- nautilus_core/infrastructure/src/sql/queries.rs | 2 +- nautilus_core/model/src/events/position/snapshot.rs | 2 +- schema/tables.sql | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/nautilus_core/infrastructure/src/sql/models/positions.rs b/nautilus_core/infrastructure/src/sql/models/positions.rs index 8f2ce341fdeb..a8fae71e0803 100644 --- a/nautilus_core/infrastructure/src/sql/models/positions.rs +++ b/nautilus_core/infrastructure/src/sql/models/positions.rs @@ -60,8 +60,9 @@ impl<'r> FromRow<'r, PgRow> for PositionSnapshotModel { .try_get::<&str, _>("quote_currency") .map(Currency::from)?; let base_currency = row - .try_get::<&str, _>("base_currency") - .map(Currency::from)?; + .try_get::, _>("base_currency") + .ok() + .and_then(|x| x.map(Currency::from)); let settlement_currency = row .try_get::<&str, _>("settlement_currency") .map(Currency::from)?; diff --git a/nautilus_core/infrastructure/src/sql/queries.rs b/nautilus_core/infrastructure/src/sql/queries.rs index f1c14e9225f1..bacd737ca3b5 100644 --- a/nautilus_core/infrastructure/src/sql/queries.rs +++ b/nautilus_core/infrastructure/src/sql/queries.rs @@ -318,7 +318,7 @@ impl DatabaseQueries { .bind(snapshot.quantity.to_string()) .bind(snapshot.peak_qty.to_string()) .bind(snapshot.quote_currency.to_string()) - .bind(snapshot.base_currency.to_string()) + .bind(snapshot.base_currency.map(|x| x.to_string())) .bind(snapshot.settlement_currency.to_string()) .bind(snapshot.avg_px_open.to_string()) .bind(snapshot.avg_px_close.map(|x| x.to_string())) diff --git a/nautilus_core/model/src/events/position/snapshot.rs b/nautilus_core/model/src/events/position/snapshot.rs index 0a46e88e1d93..09eabd5662b5 100644 --- a/nautilus_core/model/src/events/position/snapshot.rs +++ b/nautilus_core/model/src/events/position/snapshot.rs @@ -61,7 +61,7 @@ pub struct PositionSnapshot { /// The position quote currency. pub quote_currency: Currency, /// The position base currency. - pub base_currency: Currency, + pub base_currency: Option, /// The position settlement currency. pub settlement_currency: Currency, /// The average open price. diff --git a/schema/tables.sql b/schema/tables.sql index 2f4691607394..a9a5609a38af 100644 --- a/schema/tables.sql +++ b/schema/tables.sql @@ -166,9 +166,9 @@ CREATE TABLE IF NOT EXISTS "position"( -- last_qty TEXT, -- last_px TEXT, quote_currency TEXT NOT NULL, - base_currency TEXT NOT NULL, + base_currency TEXT, settlement_currency TEXT NOT NULL, - avg_px_open DOUBLE PRECISION, -- Consider NUMERIC + avg_px_open DOUBLE PRECISION NOT NULL, -- Consider NUMERIC avg_px_close DOUBLE PRECISION, -- Consider NUMERIC realized_return DOUBLE PRECISION, -- Consider NUMERIC realized_pnl TEXT NOT NULL, From 259d063f8eda00beac037ca1ea8ef5e5766fc85b Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 15:33:20 +1100 Subject: [PATCH 200/224] Add common.events module with re-exports --- RELEASES.md | 1 + nautilus_trader/common/events.py | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 nautilus_trader/common/events.py diff --git a/RELEASES.md b/RELEASES.md index b421351b83c0..969cd7a36e55 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -11,6 +11,7 @@ Released on TBD (UTC). - Added rate limiter for `WebSocketClient` (#1994), thanks @Pushkarm029 - Added in the money probability field to GreeksData (#1995), thanks @faysou - Added `on_signal(signal)` handler for custom signal data +- Added `nautilus_trader.common.events` module with re-exports for `TimeEvent` and other system events - Improved usability of `OrderBookDepth10` by filling partial levels with null orders and zero counts - Improved Postgres config (#2010), thanks @filipmacek - Refined `DatabentoInstrumentProvider` handling of large bulks of instrument definitions (improved parent symbol support) diff --git a/nautilus_trader/common/events.py b/nautilus_trader/common/events.py new file mode 100644 index 000000000000..2751e049c9cc --- /dev/null +++ b/nautilus_trader/common/events.py @@ -0,0 +1,27 @@ +# ------------------------------------------------------------------------------------------------- +# Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +# https://nautechsystems.io +# +# Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +# You may not use this file except in compliance with the License. +# You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ------------------------------------------------------------------------------------------------- + +from nautilus_trader.common.component import TimeEvent +from nautilus_trader.common.messages import ComponentStateChanged +from nautilus_trader.common.messages import RiskEvent +from nautilus_trader.common.messages import TradingStateChanged + + +__all__ = [ + "TimeEvent", + "ComponentStateChanged", + "RiskEvent", + "TradingStateChanged", +] From 9741876531891a178f2d9f346d6a6ce1c0bb2d98 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 15:36:18 +1100 Subject: [PATCH 201/224] Update dev dependencies --- poetry.lock | 106 ++++++++++++++++++++++++------------------------- pyproject.toml | 4 +- 2 files changed, 55 insertions(+), 55 deletions(-) diff --git a/poetry.lock b/poetry.lock index 86aecbfc2f8e..47f735f43783 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2110,43 +2110,43 @@ files = [ [[package]] name = "mypy" -version = "1.12.0" +version = "1.12.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4397081e620dc4dc18e2f124d5e1d2c288194c2c08df6bdb1db31c38cd1fe1ed"}, - {file = "mypy-1.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:684a9c508a283f324804fea3f0effeb7858eb03f85c4402a967d187f64562469"}, - {file = "mypy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cabe4cda2fa5eca7ac94854c6c37039324baaa428ecbf4de4567279e9810f9e"}, - {file = "mypy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:060a07b10e999ac9e7fa249ce2bdcfa9183ca2b70756f3bce9df7a92f78a3c0a"}, - {file = "mypy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:0eff042d7257f39ba4ca06641d110ca7d2ad98c9c1fb52200fe6b1c865d360ff"}, - {file = "mypy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b86de37a0da945f6d48cf110d5206c5ed514b1ca2614d7ad652d4bf099c7de7"}, - {file = "mypy-1.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20c7c5ce0c1be0b0aea628374e6cf68b420bcc772d85c3c974f675b88e3e6e57"}, - {file = "mypy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a64ee25f05fc2d3d8474985c58042b6759100a475f8237da1f4faf7fcd7e6309"}, - {file = "mypy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:faca7ab947c9f457a08dcb8d9a8664fd438080e002b0fa3e41b0535335edcf7f"}, - {file = "mypy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:5bc81701d52cc8767005fdd2a08c19980de9ec61a25dbd2a937dfb1338a826f9"}, - {file = "mypy-1.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8462655b6694feb1c99e433ea905d46c478041a8b8f0c33f1dab00ae881b2164"}, - {file = "mypy-1.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:923ea66d282d8af9e0f9c21ffc6653643abb95b658c3a8a32dca1eff09c06475"}, - {file = "mypy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ebf9e796521f99d61864ed89d1fb2926d9ab6a5fab421e457cd9c7e4dd65aa9"}, - {file = "mypy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e478601cc3e3fa9d6734d255a59c7a2e5c2934da4378f3dd1e3411ea8a248642"}, - {file = "mypy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:c72861b7139a4f738344faa0e150834467521a3fba42dc98264e5aa9507dd601"}, - {file = "mypy-1.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52b9e1492e47e1790360a43755fa04101a7ac72287b1a53ce817f35899ba0521"}, - {file = "mypy-1.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:48d3e37dd7d9403e38fa86c46191de72705166d40b8c9f91a3de77350daa0893"}, - {file = "mypy-1.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f106db5ccb60681b622ac768455743ee0e6a857724d648c9629a9bd2ac3f721"}, - {file = "mypy-1.12.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:233e11b3f73ee1f10efada2e6da0f555b2f3a5316e9d8a4a1224acc10e7181d3"}, - {file = "mypy-1.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:4ae8959c21abcf9d73aa6c74a313c45c0b5a188752bf37dace564e29f06e9c1b"}, - {file = "mypy-1.12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eafc1b7319b40ddabdc3db8d7d48e76cfc65bbeeafaa525a4e0fa6b76175467f"}, - {file = "mypy-1.12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9b9ce1ad8daeb049c0b55fdb753d7414260bad8952645367e70ac91aec90e07e"}, - {file = "mypy-1.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfe012b50e1491d439172c43ccb50db66d23fab714d500b57ed52526a1020bb7"}, - {file = "mypy-1.12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c40658d4fa1ab27cb53d9e2f1066345596af2f8fe4827defc398a09c7c9519b"}, - {file = "mypy-1.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:dee78a8b9746c30c1e617ccb1307b351ded57f0de0d287ca6276378d770006c0"}, - {file = "mypy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b5df6c8a8224f6b86746bda716bbe4dbe0ce89fd67b1fa4661e11bfe38e8ec8"}, - {file = "mypy-1.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5feee5c74eb9749e91b77f60b30771563327329e29218d95bedbe1257e2fe4b0"}, - {file = "mypy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:77278e8c6ffe2abfba6db4125de55f1024de9a323be13d20e4f73b8ed3402bd1"}, - {file = "mypy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dcfb754dea911039ac12434d1950d69a2f05acd4d56f7935ed402be09fad145e"}, - {file = "mypy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:06de0498798527451ffb60f68db0d368bd2bae2bbfb5237eae616d4330cc87aa"}, - {file = "mypy-1.12.0-py3-none-any.whl", hash = "sha256:fd313226af375d52e1e36c383f39bf3836e1f192801116b31b090dfcd3ec5266"}, - {file = "mypy-1.12.0.tar.gz", hash = "sha256:65a22d87e757ccd95cbbf6f7e181e6caa87128255eb2b6be901bb71b26d8a99d"}, + {file = "mypy-1.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3d7d4371829184e22fda4015278fbfdef0327a4b955a483012bd2d423a788801"}, + {file = "mypy-1.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f59f1dfbf497d473201356966e353ef09d4daec48caeacc0254db8ef633a28a5"}, + {file = "mypy-1.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b947097fae68004b8328c55161ac9db7d3566abfef72d9d41b47a021c2fba6b1"}, + {file = "mypy-1.12.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:96af62050971c5241afb4701c15189ea9507db89ad07794a4ee7b4e092dc0627"}, + {file = "mypy-1.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:d90da248f4c2dba6c44ddcfea94bb361e491962f05f41990ff24dbd09969ce20"}, + {file = "mypy-1.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1230048fec1380faf240be6385e709c8570604d2d27ec6ca7e573e3bc09c3735"}, + {file = "mypy-1.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:02dcfe270c6ea13338210908f8cadc8d31af0f04cee8ca996438fe6a97b4ec66"}, + {file = "mypy-1.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5a437c9102a6a252d9e3a63edc191a3aed5f2fcb786d614722ee3f4472e33f6"}, + {file = "mypy-1.12.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:186e0c8346efc027ee1f9acf5ca734425fc4f7dc2b60144f0fbe27cc19dc7931"}, + {file = "mypy-1.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:673ba1140a478b50e6d265c03391702fa11a5c5aff3f54d69a62a48da32cb811"}, + {file = "mypy-1.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9fb83a7be97c498176fb7486cafbb81decccaef1ac339d837c377b0ce3743a7f"}, + {file = "mypy-1.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:389e307e333879c571029d5b93932cf838b811d3f5395ed1ad05086b52148fb0"}, + {file = "mypy-1.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94b2048a95a21f7a9ebc9fbd075a4fcd310410d078aa0228dbbad7f71335e042"}, + {file = "mypy-1.12.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ee5932370ccf7ebf83f79d1c157a5929d7ea36313027b0d70a488493dc1b179"}, + {file = "mypy-1.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:19bf51f87a295e7ab2894f1d8167622b063492d754e69c3c2fed6563268cb42a"}, + {file = "mypy-1.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d34167d43613ffb1d6c6cdc0cc043bb106cac0aa5d6a4171f77ab92a3c758bcc"}, + {file = "mypy-1.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:427878aa54f2e2c5d8db31fa9010c599ed9f994b3b49e64ae9cd9990c40bd635"}, + {file = "mypy-1.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5fcde63ea2c9f69d6be859a1e6dd35955e87fa81de95bc240143cf00de1f7f81"}, + {file = "mypy-1.12.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d54d840f6c052929f4a3d2aab2066af0f45a020b085fe0e40d4583db52aab4e4"}, + {file = "mypy-1.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:20db6eb1ca3d1de8ece00033b12f793f1ea9da767334b7e8c626a4872090cf02"}, + {file = "mypy-1.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b16fe09f9c741d85a2e3b14a5257a27a4f4886c171d562bc5a5e90d8591906b8"}, + {file = "mypy-1.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0dcc1e843d58f444fce19da4cce5bd35c282d4bde232acdeca8279523087088a"}, + {file = "mypy-1.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e10ba7de5c616e44ad21005fa13450cd0de7caaa303a626147d45307492e4f2d"}, + {file = "mypy-1.12.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0e6fe449223fa59fbee351db32283838a8fee8059e0028e9e6494a03802b4004"}, + {file = "mypy-1.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:dc6e2a2195a290a7fd5bac3e60b586d77fc88e986eba7feced8b778c373f9afe"}, + {file = "mypy-1.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:de5b2a8988b4e1269a98beaf0e7cc71b510d050dce80c343b53b4955fff45f19"}, + {file = "mypy-1.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:843826966f1d65925e8b50d2b483065c51fc16dc5d72647e0236aae51dc8d77e"}, + {file = "mypy-1.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9fe20f89da41a95e14c34b1ddb09c80262edcc295ad891f22cc4b60013e8f78d"}, + {file = "mypy-1.12.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8135ffec02121a75f75dc97c81af7c14aa4ae0dda277132cfcd6abcd21551bfd"}, + {file = "mypy-1.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:a7b76fa83260824300cc4834a3ab93180db19876bce59af921467fd03e692810"}, + {file = "mypy-1.12.1-py3-none-any.whl", hash = "sha256:ce561a09e3bb9863ab77edf29ae3a50e65685ad74bba1431278185b7e5d5486e"}, + {file = "mypy-1.12.1.tar.gz", hash = "sha256:f5b3936f7a6d0e8280c9bdef94c7ce4847f5cdfc258fbb2c29a8c1711e8bb96d"}, ] [package.dependencies] @@ -3443,29 +3443,29 @@ test = ["hypothesis (==5.19.0)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "ruff" -version = "0.6.9" +version = "0.7.0" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.6.9-py3-none-linux_armv6l.whl", hash = "sha256:064df58d84ccc0ac0fcd63bc3090b251d90e2a372558c0f057c3f75ed73e1ccd"}, - {file = "ruff-0.6.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:140d4b5c9f5fc7a7b074908a78ab8d384dd7f6510402267bc76c37195c02a7ec"}, - {file = "ruff-0.6.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53fd8ca5e82bdee8da7f506d7b03a261f24cd43d090ea9db9a1dc59d9313914c"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645d7d8761f915e48a00d4ecc3686969761df69fb561dd914a773c1a8266e14e"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eae02b700763e3847595b9d2891488989cac00214da7f845f4bcf2989007d577"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d5ccc9e58112441de8ad4b29dcb7a86dc25c5f770e3c06a9d57e0e5eba48829"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:417b81aa1c9b60b2f8edc463c58363075412866ae4e2b9ab0f690dc1e87ac1b5"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c866b631f5fbce896a74a6e4383407ba7507b815ccc52bcedabb6810fdb3ef7"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b118afbb3202f5911486ad52da86d1d52305b59e7ef2031cea3425142b97d6f"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67267654edc23c97335586774790cde402fb6bbdb3c2314f1fc087dee320bfa"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3ef0cc774b00fec123f635ce5c547dac263f6ee9fb9cc83437c5904183b55ceb"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:12edd2af0c60fa61ff31cefb90aef4288ac4d372b4962c2864aeea3a1a2460c0"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:55bb01caeaf3a60b2b2bba07308a02fca6ab56233302406ed5245180a05c5625"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:925d26471fa24b0ce5a6cdfab1bb526fb4159952385f386bdcc643813d472039"}, - {file = "ruff-0.6.9-py3-none-win32.whl", hash = "sha256:eb61ec9bdb2506cffd492e05ac40e5bc6284873aceb605503d8494180d6fc84d"}, - {file = "ruff-0.6.9-py3-none-win_amd64.whl", hash = "sha256:785d31851c1ae91f45b3d8fe23b8ae4b5170089021fbb42402d811135f0b7117"}, - {file = "ruff-0.6.9-py3-none-win_arm64.whl", hash = "sha256:a9641e31476d601f83cd602608739a0840e348bda93fec9f1ee816f8b6798b93"}, - {file = "ruff-0.6.9.tar.gz", hash = "sha256:b076ef717a8e5bc819514ee1d602bbdca5b4420ae13a9cf61a0c0a4f53a2baa2"}, + {file = "ruff-0.7.0-py3-none-linux_armv6l.whl", hash = "sha256:0cdf20c2b6ff98e37df47b2b0bd3a34aaa155f59a11182c1303cce79be715628"}, + {file = "ruff-0.7.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:496494d350c7fdeb36ca4ef1c9f21d80d182423718782222c29b3e72b3512737"}, + {file = "ruff-0.7.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:214b88498684e20b6b2b8852c01d50f0651f3cc6118dfa113b4def9f14faaf06"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630fce3fefe9844e91ea5bbf7ceadab4f9981f42b704fae011bb8efcaf5d84be"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:211d877674e9373d4bb0f1c80f97a0201c61bcd1e9d045b6e9726adc42c156aa"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:194d6c46c98c73949a106425ed40a576f52291c12bc21399eb8f13a0f7073495"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:82c2579b82b9973a110fab281860403b397c08c403de92de19568f32f7178598"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9af971fe85dcd5eaed8f585ddbc6bdbe8c217fb8fcf510ea6bca5bdfff56040e"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b641c7f16939b7d24b7bfc0be4102c56562a18281f84f635604e8a6989948914"}, + {file = "ruff-0.7.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d71672336e46b34e0c90a790afeac8a31954fd42872c1f6adaea1dff76fd44f9"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ab7d98c7eed355166f367597e513a6c82408df4181a937628dbec79abb2a1fe4"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1eb54986f770f49edb14f71d33312d79e00e629a57387382200b1ef12d6a4ef9"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:dc452ba6f2bb9cf8726a84aa877061a2462afe9ae0ea1d411c53d226661c601d"}, + {file = "ruff-0.7.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4b406c2dce5be9bad59f2de26139a86017a517e6bcd2688da515481c05a2cb11"}, + {file = "ruff-0.7.0-py3-none-win32.whl", hash = "sha256:f6c968509f767776f524a8430426539587d5ec5c662f6addb6aa25bc2e8195ec"}, + {file = "ruff-0.7.0-py3-none-win_amd64.whl", hash = "sha256:ff4aabfbaaba880e85d394603b9e75d32b0693152e16fa659a3064a85df7fce2"}, + {file = "ruff-0.7.0-py3-none-win_arm64.whl", hash = "sha256:10842f69c245e78d6adec7e1db0a7d9ddc2fff0621d730e61657b64fa36f207e"}, + {file = "ruff-0.7.0.tar.gz", hash = "sha256:47a86360cf62d9cd53ebfb0b5eb0e882193fc191c6d717e8bef4462bc3b9ea2b"}, ] [[package]] @@ -4006,4 +4006,4 @@ polymarket = ["py-clob-client"] [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.13" -content-hash = "9697b3111271da15a1ee1673c1dde78cb0a22288dc32cd83b676e456668ede39" +content-hash = "e3b22acfadf5897b37f3759fdd7aa3308d87ecebb76d8c278907426b1423e393" diff --git a/pyproject.toml b/pyproject.toml index 01936e75d50f..b1a906a6b785 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -89,10 +89,10 @@ optional = true [tool.poetry.group.dev.dependencies] black = "^24.10.0" docformatter = "^1.7.5" -mypy = "^1.12.0" +mypy = "^1.12.1" pandas-stubs = "^2.2.2" pre-commit = "^4.0.1" -ruff = "^0.6.9" +ruff = "^0.7.0" types-pytz = "^2024.1" types-requests = "^2.32" types-toml = "^0.10.2" From 04f176d44a81d0235357fcd38cf362c390e8aad8 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 15:40:47 +1100 Subject: [PATCH 202/224] Upgrade codecov action --- .github/workflows/coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index b7deec2db5aa..a201da2d8800 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -129,7 +129,7 @@ jobs: run: make pytest-coverage - name: Upload coverage report - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} files: ./coverage.xml From 602d65a1cb879234996f8d2e200b534632279ec7 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 15:45:31 +1100 Subject: [PATCH 203/224] Fix README typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0c8f7f3456d9..7e2dcba6b748 100644 --- a/README.md +++ b/README.md @@ -230,7 +230,7 @@ We strive to document these changes in the release notes on a best-effort basis. We strive to maintain a stable, passing build across all branches. -- `master`: Reflects the source code for the latest released version . +- `master`: Reflects the source code for the latest released version. - `nightly`: Contains experimental features, merged from the `develop` branch daily or as needed. - `develop`: Very active with frequent commits and may include experimental features. From 7005fba6b226fde7125018803cf789d7f1883d01 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 15:48:34 +1100 Subject: [PATCH 204/224] Add tardis-machine sandbox script --- .../adapters/tardis/sandbox/run_machine.py | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 tests/integration_tests/adapters/tardis/sandbox/run_machine.py diff --git a/tests/integration_tests/adapters/tardis/sandbox/run_machine.py b/tests/integration_tests/adapters/tardis/sandbox/run_machine.py new file mode 100644 index 000000000000..5bba0e640b0c --- /dev/null +++ b/tests/integration_tests/adapters/tardis/sandbox/run_machine.py @@ -0,0 +1,37 @@ +import asyncio +import json + +import aiohttp + + +# Example taken from https://docs.tardis.dev/api/tardis-machine +# Run the following to start the tardis-machine server: +# docker run -p 8000:8000 -p 8001:8001 -e "TM_API_KEY=YOUR_API_KEY" -d tardisdev/tardis-machine + + +async def run(): + WS_REPLAY_URL = "ws://localhost:8001/ws-replay" + URL = f"{WS_REPLAY_URL}?exchange=bitmex&from=2019-10-01&to=2019-10-02" + + async with aiohttp.ClientSession() as session: + async with session.ws_connect(URL) as websocket: + + await websocket.send_str( + json.dumps( + { + "op": "subscribe", + "args": [ + "trade:XBTUSD", + "trade:ETHUSD", + "orderBookL2:XBTUSD", + "orderBookL2:ETHUSD", + ], + }, + ), + ) + + async for msg in websocket: + print(msg.data) + + +asyncio.run(run()) From 370e049aa869f986b0962816f64f1851c6b3ef59 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 16:02:01 +1100 Subject: [PATCH 205/224] Refine adapter crate dependencies --- nautilus_core/adapters/Cargo.toml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/nautilus_core/adapters/Cargo.toml b/nautilus_core/adapters/Cargo.toml index 1be46f043613..a7a3af0da466 100644 --- a/nautilus_core/adapters/Cargo.toml +++ b/nautilus_core/adapters/Cargo.toml @@ -45,12 +45,12 @@ tracing = { workspace = true } tracing-subscriber = { workspace = true } thiserror = { workspace = true } ustr = { workspace = true } -csv = "1.3.0" +csv = { version = "1.3.0", optional = true } databento = { version = "0.14.1", optional = true } -fallible-streaming-iterator = "0.1.9" -flate2 = "1.0.34" +fallible-streaming-iterator = { version = "0.1.9", optional = true } +flate2 = { version = "1.0.34", optional = true } pem = "3.0.4" -time = "0.3.36" +time = { version = "0.3.36", optional = true } urlencoding = { version = "2.1.3", optional = true } [dev-dependencies] @@ -67,7 +67,7 @@ extension-module = [ "nautilus-core/extension-module", "nautilus-model/extension-module", ] -databento = ["dep:databento", "python"] +databento = ["dep:databento", "fallible-streaming-iterator", "python", "time"] ffi = [ "nautilus-common/ffi", "nautilus-core/ffi", @@ -80,4 +80,4 @@ python = [ "nautilus-core/python", "nautilus-model/python", ] -tardis = ["python", "tokio-tungstenite", "urlencoding"] +tardis = ["python", "csv", "flate2", "tokio-tungstenite", "urlencoding"] From 35f54ca1f5a2cf5c4e9311a80156269b92be073f Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 16:06:12 +1100 Subject: [PATCH 206/224] Fix tardis-machine sandbox script --- tests/integration_tests/adapters/tardis/sandbox/run_machine.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/integration_tests/adapters/tardis/sandbox/run_machine.py b/tests/integration_tests/adapters/tardis/sandbox/run_machine.py index 5bba0e640b0c..bb49133d62db 100644 --- a/tests/integration_tests/adapters/tardis/sandbox/run_machine.py +++ b/tests/integration_tests/adapters/tardis/sandbox/run_machine.py @@ -34,4 +34,5 @@ async def run(): print(msg.data) -asyncio.run(run()) +if __name__ == "__main__": + asyncio.run(run()) From b0dada0919f62bca931bcf9a95bd219e433edc70 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 16:14:56 +1100 Subject: [PATCH 207/224] Refine TardisCSVDataLoader record reading --- nautilus_core/adapters/src/tardis/csv.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/csv.rs b/nautilus_core/adapters/src/tardis/csv.rs index 558c221e073b..ab39de8e3cce 100644 --- a/nautilus_core/adapters/src/tardis/csv.rs +++ b/nautilus_core/adapters/src/tardis/csv.rs @@ -72,8 +72,9 @@ pub fn load_deltas>( let mut deltas: Vec = Vec::new(); let mut last_ts_event = UnixNanos::default(); - for result in csv_reader.deserialize() { - let record: TardisBookUpdateRecord = result?; + let mut raw_record = StringRecord::new(); + while csv_reader.read_record(&mut raw_record)? { + let record: TardisBookUpdateRecord = raw_record.deserialize(None)?; let instrument_id = match &instrument_id { Some(id) => *id, @@ -391,8 +392,9 @@ pub fn load_quote_ticks>( let mut csv_reader = create_csv_reader(filepath)?; let mut quotes = Vec::new(); - for result in csv_reader.deserialize() { - let record: TardisQuoteRecord = result?; + let mut raw_record = StringRecord::new(); + while csv_reader.read_record(&mut raw_record)? { + let record: TardisQuoteRecord = raw_record.deserialize(None)?; let instrument_id = match &instrument_id { Some(id) => *id, @@ -438,8 +440,9 @@ pub fn load_trade_ticks>( let mut csv_reader = create_csv_reader(filepath)?; let mut trades = Vec::new(); - for result in csv_reader.deserialize() { - let record: TardisTradeRecord = result?; + let mut raw_record = StringRecord::new(); + while csv_reader.read_record(&mut raw_record)? { + let record: TardisTradeRecord = raw_record.deserialize(None)?; let instrument_id = match &instrument_id { Some(id) => *id, From 85f1e978b058659ba8905b9b4bcab799dc7e4350 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 16:18:32 +1100 Subject: [PATCH 208/224] Refine Tardis Exchange enum --- nautilus_core/adapters/src/tardis/enums.rs | 76 +++++++++++----------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/enums.rs b/nautilus_core/adapters/src/tardis/enums.rs index b15a4453c73f..b386218ecb20 100644 --- a/nautilus_core/adapters/src/tardis/enums.rs +++ b/nautilus_core/adapters/src/tardis/enums.rs @@ -74,55 +74,55 @@ pub enum BarKind { /// Represents a crypto exchange. /// See for all supported exchanges. pub enum Exchange { - Bitmex, - Deribit, - BinanceFutures, + Ascendex, + Binance, BinanceDelivery, + BinanceDex, + BinanceFutures, + BinanceJersey, BinanceOptions, - Binance, - Ftx, - OkexFutures, - OkexOptions, - OkexSwap, - Okex, - HuobiDm, - HuobiDmSwap, - HuobiDmLinearSwap, - Huobi, - BitfinexDerivatives, + BinanceUs, Bitfinex, - Coinbase, - Cryptofacilities, - Kraken, + BitfinexDerivatives, + Bitflyer, + Bitmex, + Bitnomial, Bitstamp, - Gemini, - Poloniex, + BlockchainCom, Bybit, - BybitSpot, BybitOptions, - Phemex, + BybitSpot, + Coinbase, + Coinflex, + CryptoCom, + CryptoComDerivatives, + Cryptofacilities, Delta, + Deribit, + Dydx, + Ftx, FtxUs, - BinanceUs, - GateIoFutures, GateIo, - Okcoin, - Bitflyer, + GateIoFutures, + Gemini, Hitbtc, - Coinflex, - BinanceJersey, - BinanceDex, - Upbit, - Ascendex, - Dydx, - Serum, + Huobi, + HuobiDm, + HuobiDmLinearSwap, + HuobiDmOptions, + HuobiDmSwap, + Kraken, + Kucoin, Mango, - HuobiDmPptions, + Okcoin, + Okex, + OkexFutures, + OkexOptions, + OkexSwap, + Phemex, + Poloniex, + Serum, StarAtlas, - CryptoCom, - CryptoComDerivatives, - Kucoin, - Bitnomial, + Upbit, WooX, - BlockchainCom, } From 96ec0f9f6cb19dc0b83980915fb0c2901510ff28 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Sun, 20 Oct 2024 17:02:26 +1100 Subject: [PATCH 209/224] Refine message bus command processing --- nautilus_core/infrastructure/src/redis/cache.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/nautilus_core/infrastructure/src/redis/cache.rs b/nautilus_core/infrastructure/src/redis/cache.rs index 64c0fcbfb3a5..ea541fa6b97e 100644 --- a/nautilus_core/infrastructure/src/redis/cache.rs +++ b/nautilus_core/infrastructure/src/redis/cache.rs @@ -271,8 +271,6 @@ async fn process_commands( match rx.recv().await { Some(msg) => { if let DatabaseOperation::Close = msg.op_type { - // Close receiver end of the channel - drop(rx); break; } buffer.push_back(msg) From bc45f49a16d9979d6305d19f3703f0f78453f4a2 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 21 Oct 2024 10:47:41 +1100 Subject: [PATCH 210/224] Continue Tardis Machine client --- .../adapters/src/tardis/bin/example.rs | 70 +++-- nautilus_core/adapters/src/tardis/enums.rs | 26 +- nautilus_core/adapters/src/tardis/machine.rs | 155 ---------- .../adapters/src/tardis/machine/client.rs | 72 +++++ .../adapters/src/tardis/machine/mod.rs | 273 ++++++++++++++++++ .../adapters/src/tardis/python/machine.rs | 31 ++ .../adapters/src/tardis/python/mod.rs | 2 + 7 files changed, 432 insertions(+), 197 deletions(-) delete mode 100644 nautilus_core/adapters/src/tardis/machine.rs create mode 100644 nautilus_core/adapters/src/tardis/machine/client.rs create mode 100644 nautilus_core/adapters/src/tardis/machine/mod.rs create mode 100644 nautilus_core/adapters/src/tardis/python/machine.rs diff --git a/nautilus_core/adapters/src/tardis/bin/example.rs b/nautilus_core/adapters/src/tardis/bin/example.rs index d3422d5def3e..fce118601d16 100644 --- a/nautilus_core/adapters/src/tardis/bin/example.rs +++ b/nautilus_core/adapters/src/tardis/bin/example.rs @@ -13,36 +13,48 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- -// use chrono::NaiveDate; -// use futures_util::{pin_mut, StreamExt}; -// use nautilus_adapters::tardis::{ -// enums::Exchange, -// machine::{ReplayNormalizedRequestOptions, TardisClient}, -// }; +use std::sync::{ + atomic::{AtomicBool, Ordering}, + Arc, +}; + +use chrono::NaiveDate; +use futures_util::{pin_mut, StreamExt}; +use nautilus_adapters::tardis::{ + enums::Exchange, + machine::{replay_normalized, ReplayNormalizedRequestOptions}, +}; #[tokio::main] async fn main() { - // tracing_subscriber::fmt() - // .with_max_level(tracing::Level::TRACE) - // .init(); - // - // let client = TardisClient::new(std::env::var("TARDIS_MACHINE_WS_URL").unwrap()); - // - // let stream = client - // .replay_normalized(vec![ReplayNormalizedRequestOptions { - // exchange: Exchange::Bitmex, - // symbols: Some(vec!["XBTUSD".to_string()]), - // from: NaiveDate::from_ymd_opt(2019, 10, 1).unwrap(), - // to: NaiveDate::from_ymd_opt(2019, 10, 2).unwrap(), - // data_types: vec!["book_change".to_string()], - // with_disconnect_messages: Some(true), - // }]) - // .await - // .unwrap(); - // - // pin_mut!(stream); - // - // while let Some(msg) = stream.next().await { - // println!("Received trade bar: {:?}", msg); - // } + tracing_subscriber::fmt() + .with_max_level(tracing::Level::TRACE) + .init(); + + let base_url = std::env::var("TARDIS_MACHINE_WS_URL").unwrap(); + let options = vec![ReplayNormalizedRequestOptions { + exchange: Exchange::Bitmex, + symbols: Some(vec!["XBTUSD".to_string(), "ETHUSD".to_string()]), + from: NaiveDate::from_ymd_opt(2019, 10, 1).unwrap(), + to: NaiveDate::from_ymd_opt(2019, 10, 2).unwrap(), + data_types: vec!["trade".to_string(), "book_change".to_string()], + with_disconnect_messages: Some(true), + }]; + + let signal = Arc::new(AtomicBool::new(false)); + let stream = replay_normalized(&base_url, options, signal.clone()) + .await + .unwrap(); + + pin_mut!(stream); + + let stop_count = 100; + let mut counter = 1; + while let Some(msg) = stream.next().await { + println!("Received message: {msg:?}"); + counter += 1; + if counter >= stop_count { + signal.store(true, Ordering::Relaxed); + } + } } diff --git a/nautilus_core/adapters/src/tardis/enums.rs b/nautilus_core/adapters/src/tardis/enums.rs index b386218ecb20..3ee443e14950 100644 --- a/nautilus_core/adapters/src/tardis/enums.rs +++ b/nautilus_core/adapters/src/tardis/enums.rs @@ -19,19 +19,6 @@ use super::message::{ BarMsg, BookChangeMsg, BookSnapshotMsg, DerivativeTickerMsg, DisconnectMsg, TradeMsg, }; -/// A Tardis Machine Server message type. -#[allow(missing_docs)] -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "snake_case", tag = "type")] -pub enum WsMessage { - Trade(TradeMsg), - BookChange(BookChangeMsg), - BookSnapshot(BookSnapshotMsg), - DerivativeTicker(DerivativeTickerMsg), - Bar(BarMsg), - Disconnect(DisconnectMsg), -} - #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] /// The type of the symbol eg. Spot, Perpetual, Future, Option. @@ -126,3 +113,16 @@ pub enum Exchange { Upbit, WooX, } + +/// A Tardis Machine Server message type. +#[allow(missing_docs)] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "snake_case", tag = "type")] +pub enum WsMessage { + Trade(TradeMsg), + BookChange(BookChangeMsg), + BookSnapshot(BookSnapshotMsg), + DerivativeTicker(DerivativeTickerMsg), + Bar(BarMsg), + Disconnect(DisconnectMsg), +} diff --git a/nautilus_core/adapters/src/tardis/machine.rs b/nautilus_core/adapters/src/tardis/machine.rs deleted file mode 100644 index 0b45de9a5084..000000000000 --- a/nautilus_core/adapters/src/tardis/machine.rs +++ /dev/null @@ -1,155 +0,0 @@ -// ------------------------------------------------------------------------------------------------- -// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. -// https://nautechsystems.io -// -// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); -// You may not use this file except in compliance with the License. -// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// ------------------------------------------------------------------------------------------------- - -#![allow(dead_code)] // Use for initial development - -use chrono::NaiveDate; -use serde::{Deserialize, Serialize}; -use tokio_tungstenite::tungstenite::{self}; - -use super::enums::Exchange; - -/// The options that can be specified for calling Tardis Machine Server's replay-normalized. -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct ReplayNormalizedRequestOptions { - /// Requested [`Exchange`]. - pub exchange: Exchange, - /// Optional symbols of requested historical data feed. - /// Use /exchanges/:exchange HTTP API to get allowed symbols for requested exchange. - #[serde(skip_serializing_if = "Option::is_none")] - #[serde(default)] - pub symbols: Option>, - /// Replay period start date (UTC) in a ISO 8601 format, e.g., 2019-04-01. - pub from: NaiveDate, - /// Replay period start date (UTC) in a ISO 8601 format, e.g., 2019-04-02. - pub to: NaiveDate, - /// Array of normalized [data types](https://docs.tardis.dev/api/tardis-machine#normalized-data-types) - /// for which real-time data will be provided. - pub data_types: Vec, - /// When set to true, sends also disconnect messages that mark events when real-time WebSocket - /// connection that was used to collect the historical data got disconnected. - #[serde(skip_serializing_if = "Option::is_none")] - #[serde(default)] - pub with_disconnect_messages: Option, -} - -/// The options that can be specified for calling Tardis Machine Server's stream-normalized. -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct StreamNormalizedRequestOptions { - /// Requested [`Exchange`]. - pub exchange: Exchange, - /// Optional symbols of requested real-time data feed. - #[serde(skip_serializing_if = "Option::is_none")] - #[serde(default)] - pub symbols: Option>, - /// Array of normalized [data types](https://docs.tardis.dev/api/tardis-machine#normalized-data-types) - /// for which real-time data will be provided. - pub data_types: Vec, - /// When set to true, sends disconnect messages anytime underlying exchange real-time WebSocket - /// connection(s) gets disconnected. - #[serde(skip_serializing_if = "Option::is_none")] - #[serde(default)] - pub with_disconnect_messages: Option, - /// Specifies time in milliseconds after which connection to real-time exchanges' WebSocket API - /// is restarted if no message has been received. - #[serde(skip_serializing_if = "Option::is_none")] - #[serde(default, rename = "timeoutIntervalMS")] - pub timeout_interval_ms: Option, -} - -pub type Result = std::result::Result; - -/// The error that could happen while interacting with Tardis Machine Server. -#[derive(Debug, thiserror::Error)] -pub enum Error { - /// An error that could happen when an empty options array was given. - #[error("Options cannot be empty")] - EmptyOptions, - /// An error when failed to connect to Tardis' websocket connection. - #[error("Failed to connect: {0}")] - ConnectFailed(#[from] tungstenite::Error), - /// An error when WS connection to the machine server was rejected. - #[error("Connection rejected: {reason}")] - ConnectRejected { - /// The status code for the initial WS connection. - status: tungstenite::http::StatusCode, - /// The reason why the connection was rejected. - reason: String, - }, - /// An error where the websocket connection was closed unexpectedly by Tardis. - #[error("Connection closed: {reason}")] - ConnectionClosed { - /// The reason why the connection was closed. - reason: String, - }, - /// An error when deserializing the response from Tardis. - #[error("Failed to deserialize message: {0}")] - Deserialization(#[from] serde_json::Error), -} - -/// Provides a client for connecting to a [Tardis Machine Server](https://docs.tardis.dev/api/tardis-machine). -pub struct TardisClient { - url: String, -} - -impl TardisClient { - /// Creates a new [`Client`] instance. - pub fn new(url: impl ToString) -> Self { - Self { - url: url.to_string(), - } - } - - // pub async fn replay_normalized( - // &self, - // options: Vec, - // ) -> Result>> { - // if options.len() == 0 { - // return Err(Error::EmptyOptions); - // } - // - // let options = serde_json::to_string(&options)?; - // let url = format!( - // "{}/ws-replay-normalized?options={}", - // &self.url, - // urlencoding::encode(&options) - // ); - // - // // let url = "ws://localhost:8001/ws-replay" - // let url = "ws://localhost:8001/ws-replay?exchange=bitmex&from=2019-10-01&to=2019-10-02"; - // - // tracing::info!("[replay_normalized] url to tardis {url}"); - // } - // - // pub async fn stream_normalized( - // &self, - // options: Vec, - // ) -> Result>> { - // if options.len() == 0 { - // return Err(Error::EmptyOptions); - // } - // - // let options = serde_json::to_string(&options)?; - // let url = format!( - // "{}/ws-stream-normalized?options={}", - // &self.url, - // urlencoding::encode(&options) - // ); - // - // tracing::info!("[stream_normalized] url to tardis {url}"); - // } -} diff --git a/nautilus_core/adapters/src/tardis/machine/client.rs b/nautilus_core/adapters/src/tardis/machine/client.rs new file mode 100644 index 000000000000..133480e5b084 --- /dev/null +++ b/nautilus_core/adapters/src/tardis/machine/client.rs @@ -0,0 +1,72 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use std::{ + collections::HashMap, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, +}; + +use futures_util::Stream; + +use super::{replay_normalized, Error, ReplayNormalizedRequestOptions}; +use crate::tardis::enums::{Exchange, WsMessage}; + +pub type Result = std::result::Result; + +pub struct TardisInstrument { + pub symbol: String, + pub exchange: Exchange, +} + +/// Provides a client for connecting to a [Tardis Machine Server](https://docs.tardis.dev/api/tardis-machine). +#[cfg_attr( + feature = "python", + pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.adapters") +)] +pub struct TardisClient { + base_url: String, + replay_signal: Arc, + stream_signals: HashMap>, +} + +impl TardisClient { + /// Creates a new [`TardisClient`] instance. + pub fn new(base_url: impl ToString) -> Self { + Self { + base_url: base_url.to_string(), + replay_signal: Arc::new(AtomicBool::new(false)), + stream_signals: HashMap::new(), + } + } + + pub fn close(&mut self) { + self.replay_signal.store(true, Ordering::Relaxed); + + for signal in self.stream_signals.values() { + signal.store(true, Ordering::Relaxed); + } + tracing::info!("All signals set to true, shutting down."); + } + + pub async fn start_replay( + &self, + options: Vec, + ) -> Result>> { + replay_normalized(&self.base_url, options, self.replay_signal.clone()).await + } +} diff --git a/nautilus_core/adapters/src/tardis/machine/mod.rs b/nautilus_core/adapters/src/tardis/machine/mod.rs new file mode 100644 index 000000000000..0dbb439603dc --- /dev/null +++ b/nautilus_core/adapters/src/tardis/machine/mod.rs @@ -0,0 +1,273 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use std::{ + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, + time::Duration, +}; + +use async_stream::stream; +use chrono::NaiveDate; +use futures_util::{stream::SplitSink, SinkExt, Stream, StreamExt}; +use serde::{Deserialize, Serialize}; +use tokio::net::TcpStream; +use tokio_tungstenite::{ + connect_async, + tungstenite::{self, protocol::frame::coding::CloseCode}, + MaybeTlsStream, WebSocketStream, +}; + +use super::enums::{Exchange, WsMessage}; + +pub mod client; + +pub use crate::tardis::machine::client::TardisClient; + +/// The options that can be specified for calling Tardis Machine Server's replay-normalized. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ReplayNormalizedRequestOptions { + /// Requested [`Exchange`]. + pub exchange: Exchange, + /// Optional symbols of requested historical data feed. + /// Use /exchanges/:exchange HTTP API to get allowed symbols for requested exchange. + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(default)] + pub symbols: Option>, + /// Replay period start date (UTC) in a ISO 8601 format, e.g., 2019-10-01. + pub from: NaiveDate, + /// Replay period start date (UTC) in a ISO 8601 format, e.g., 2019-10-02. + pub to: NaiveDate, + /// Array of normalized [data types](https://docs.tardis.dev/api/tardis-machine#normalized-data-types) + /// for which real-time data will be provided. + pub data_types: Vec, + /// When set to true, sends also disconnect messages that mark events when real-time WebSocket + /// connection that was used to collect the historical data got disconnected. + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(default)] + pub with_disconnect_messages: Option, +} + +/// The options that can be specified for calling Tardis Machine Server's stream-normalized. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StreamNormalizedRequestOptions { + /// Requested [`Exchange`]. + pub exchange: Exchange, + /// Optional symbols of requested real-time data feed. + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(default)] + pub symbols: Option>, + /// Array of normalized [data types](https://docs.tardis.dev/api/tardis-machine#normalized-data-types) + /// for which real-time data will be provided. + pub data_types: Vec, + /// When set to true, sends disconnect messages anytime underlying exchange real-time WebSocket + /// connection(s) gets disconnected. + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(default)] + pub with_disconnect_messages: Option, + /// Specifies time in milliseconds after which connection to real-time exchanges' WebSocket API + /// is restarted if no message has been received. + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(default, rename = "timeoutIntervalMS")] + pub timeout_interval_ms: Option, +} + +pub type Result = std::result::Result; + +/// The error that could happen while interacting with Tardis Machine Server. +#[derive(Debug, thiserror::Error)] +pub enum Error { + /// An error that could happen when an empty options array was given. + #[error("Options cannot be empty")] + EmptyOptions, + /// An error when failed to connect to Tardis' websocket connection. + #[error("Failed to connect: {0}")] + ConnectFailed(#[from] tungstenite::Error), + /// An error when WS connection to the machine server was rejected. + #[error("Connection rejected: {reason}")] + ConnectRejected { + /// The status code for the initial WS connection. + status: tungstenite::http::StatusCode, + /// The reason why the connection was rejected. + reason: String, + }, + /// An error where the websocket connection was closed unexpectedly by Tardis. + #[error("Connection closed: {reason}")] + ConnectionClosed { + /// The reason why the connection was closed. + reason: String, + }, + /// An error when deserializing the response from Tardis. + #[error("Failed to deserialize message: {0}")] + Deserialization(#[from] serde_json::Error), +} + +pub async fn replay_normalized( + base_url: &str, + options: Vec, + signal: Arc, +) -> Result>> { + if options.is_empty() { + return Err(Error::EmptyOptions); + } + + let path = format!("{}/ws-replay-normalized?options=", base_url); + let options = serde_json::to_string(&options)?; + + let plain_url = format!("{path}{options}"); + tracing::debug!("Connecting to {plain_url}"); + + let url = format!("{path}{}", urlencoding::encode(&options)); + stream_from_websocket(base_url, &url, signal).await +} + +pub async fn stream_normalized( + base_url: &str, + options: Vec, + signal: Arc, +) -> Result>> { + if options.is_empty() { + return Err(Error::EmptyOptions); + } + + let path = format!("{}/ws-stream-normalized?options=", base_url); + let options = serde_json::to_string(&options)?; + + let plain_url = format!("{path}{options}"); + tracing::debug!("Connecting to {plain_url}"); + + let url = format!("{path}{}", urlencoding::encode(&options)); + stream_from_websocket(base_url, &url, signal).await +} + +async fn stream_from_websocket( + base_url: &str, + url: &str, + signal: Arc, +) -> Result>> { + let (ws_stream, ws_resp) = connect_async(url).await?; + + handle_connection_response(ws_resp)?; + tracing::info!("Connected to {base_url}"); + + Ok(stream! { + let (writer, mut reader) = ws_stream.split(); + tokio::spawn(heartbeat(writer)); + + loop { + if signal.load(Ordering::Relaxed) { + tracing::info!("Shutdown signal received"); + break; + } + + match reader.next().await { + Some(Ok(msg)) => match msg { + tungstenite::Message::Frame(_) + | tungstenite::Message::Binary(_) + | tungstenite::Message::Pong(_) + | tungstenite::Message::Ping(_) => { + tracing::trace!("Received {msg:?}"); + continue; // Skip and continue to the next message + } + tungstenite::Message::Close(Some(frame)) => { + let reason = frame.reason.to_string(); + if frame.code != CloseCode::Normal { + tracing::error!( + "Connection closed abnormally with code: {:?}, reason: {reason}", + frame.code + ); + yield Err(Error::ConnectionClosed { reason }); + } else { + tracing::debug!("Connection closed normally: {reason}"); + yield Err(Error::ConnectionClosed { reason }); + } + break; + } + tungstenite::Message::Close(None) => { + tracing::error!("Connection closed without a frame"); + yield Err(Error::ConnectionClosed { + reason: "No close frame provided".to_string() + }); + break; + } + tungstenite::Message::Text(msg) => { + match serde_json::from_str::(&msg) { + Ok(parsed_msg) => yield Ok(parsed_msg), + Err(e) => { + tracing::error!("Failed to deserialize message: {msg}. Error: {e}"); + yield Err(Error::Deserialization(e)); + } + } + } + }, + Some(Err(e)) => { + tracing::error!("WebSocket error: {e}"); + yield Err(Error::ConnectFailed(e)); + break; + } + None => { + tracing::error!("Connection closed unexpectedly"); + yield Err(Error::ConnectionClosed { + reason: "Unexpected connection close".to_string(), + }); + break; + } + } + } + }) +} + +fn handle_connection_response(ws_resp: tungstenite::http::Response>>) -> Result<()> { + if ws_resp.status() != tungstenite::http::StatusCode::SWITCHING_PROTOCOLS { + return match ws_resp.body() { + Some(resp) => Err(Error::ConnectRejected { + status: ws_resp.status(), + reason: String::from_utf8_lossy(resp).to_string(), + }), + None => Err(Error::ConnectRejected { + status: ws_resp.status(), + reason: "Unknown reason".to_string(), + }), + }; + } + Ok(()) +} + +async fn heartbeat( + mut sender: SplitSink>, tungstenite::Message>, +) { + let mut heartbeat_interval = tokio::time::interval(Duration::from_secs(10)); + let retry_interval = Duration::from_secs(1); + + loop { + heartbeat_interval.tick().await; + tracing::trace!("Sending PING"); + + let mut count = 3; + let mut retry_interval = tokio::time::interval(retry_interval); + + while count > 0 { + retry_interval.tick().await; + if let Err(e) = sender.send(tungstenite::Message::Ping(vec![])).await { + tracing::error!("Failed to send PING message: {e}"); + } + count -= 1; + } + } +} diff --git a/nautilus_core/adapters/src/tardis/python/machine.rs b/nautilus_core/adapters/src/tardis/python/machine.rs new file mode 100644 index 000000000000..b2d2e671059d --- /dev/null +++ b/nautilus_core/adapters/src/tardis/python/machine.rs @@ -0,0 +1,31 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use pyo3::prelude::*; + +use crate::tardis::machine::client::TardisClient; + +#[pymethods] +impl TardisClient { + #[new] + fn py_new(base_url: &str) -> PyResult { + Ok(Self::new(base_url)) + } + + #[pyo3(name = "close")] + fn py_close(&mut self) { + self.close() + } +} diff --git a/nautilus_core/adapters/src/tardis/python/mod.rs b/nautilus_core/adapters/src/tardis/python/mod.rs index 67e3da816e8e..b8919dabbb75 100644 --- a/nautilus_core/adapters/src/tardis/python/mod.rs +++ b/nautilus_core/adapters/src/tardis/python/mod.rs @@ -18,12 +18,14 @@ #![allow(warnings)] // non-local `impl` definition, temporary allow until pyo3 upgrade pub mod csv; +pub mod machine; use pyo3::prelude::*; /// Loaded as nautilus_pyo3.tardis #[pymodule] pub fn tardis(_: Python<'_>, m: &PyModule) -> PyResult<()> { + m.add_class::()?; m.add_function(wrap_pyfunction!(csv::py_load_tardis_deltas, m)?)?; m.add_function(wrap_pyfunction!( csv::py_load_tardis_deltas_as_pycapsule, From 570ac210bf43bd1f9ef37725feaf5dcd452a0f36 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 21 Oct 2024 10:57:21 +1100 Subject: [PATCH 211/224] Reorganize tardis library --- nautilus_core/adapters/src/tardis/bin/example.rs | 5 ++--- .../adapters/src/tardis/{csv.rs => csv/mod.rs} | 10 ++++++---- nautilus_core/adapters/src/tardis/{ => csv}/record.rs | 0 nautilus_core/adapters/src/tardis/machine/client.rs | 2 +- .../adapters/src/tardis/{ => machine}/enums.rs | 2 +- .../adapters/src/tardis/{ => machine}/message.rs | 0 nautilus_core/adapters/src/tardis/machine/mod.rs | 4 +++- nautilus_core/adapters/src/tardis/mod.rs | 3 --- 8 files changed, 13 insertions(+), 13 deletions(-) rename nautilus_core/adapters/src/tardis/{csv.rs => csv/mod.rs} (99%) rename nautilus_core/adapters/src/tardis/{ => csv}/record.rs (100%) rename nautilus_core/adapters/src/tardis/{ => machine}/enums.rs (98%) rename nautilus_core/adapters/src/tardis/{ => machine}/message.rs (100%) diff --git a/nautilus_core/adapters/src/tardis/bin/example.rs b/nautilus_core/adapters/src/tardis/bin/example.rs index fce118601d16..c9548e73f3cf 100644 --- a/nautilus_core/adapters/src/tardis/bin/example.rs +++ b/nautilus_core/adapters/src/tardis/bin/example.rs @@ -20,9 +20,8 @@ use std::sync::{ use chrono::NaiveDate; use futures_util::{pin_mut, StreamExt}; -use nautilus_adapters::tardis::{ - enums::Exchange, - machine::{replay_normalized, ReplayNormalizedRequestOptions}, +use nautilus_adapters::tardis::machine::{ + enums::Exchange, replay_normalized, ReplayNormalizedRequestOptions, }; #[tokio::main] diff --git a/nautilus_core/adapters/src/tardis/csv.rs b/nautilus_core/adapters/src/tardis/csv/mod.rs similarity index 99% rename from nautilus_core/adapters/src/tardis/csv.rs rename to nautilus_core/adapters/src/tardis/csv/mod.rs index ab39de8e3cce..dbcfe0049086 100644 --- a/nautilus_core/adapters/src/tardis/csv.rs +++ b/nautilus_core/adapters/src/tardis/csv/mod.rs @@ -31,15 +31,17 @@ use nautilus_model::{ types::{price::Price, quantity::Quantity}, }; +mod record; + use super::{ + csv::record::{ + TardisBookUpdateRecord, TardisOrderBookSnapshot25Record, TardisOrderBookSnapshot5Record, + TardisQuoteRecord, TardisTradeRecord, + }, parse::{ parse_aggressor_side, parse_book_action, parse_instrument_id, parse_order_side, parse_timestamp, }, - record::{ - TardisBookUpdateRecord, TardisOrderBookSnapshot25Record, TardisOrderBookSnapshot5Record, - TardisQuoteRecord, TardisTradeRecord, - }, }; /// Creates a new CSV reader which can handle gzip compression. diff --git a/nautilus_core/adapters/src/tardis/record.rs b/nautilus_core/adapters/src/tardis/csv/record.rs similarity index 100% rename from nautilus_core/adapters/src/tardis/record.rs rename to nautilus_core/adapters/src/tardis/csv/record.rs diff --git a/nautilus_core/adapters/src/tardis/machine/client.rs b/nautilus_core/adapters/src/tardis/machine/client.rs index 133480e5b084..8de7df68c7bb 100644 --- a/nautilus_core/adapters/src/tardis/machine/client.rs +++ b/nautilus_core/adapters/src/tardis/machine/client.rs @@ -24,7 +24,7 @@ use std::{ use futures_util::Stream; use super::{replay_normalized, Error, ReplayNormalizedRequestOptions}; -use crate::tardis::enums::{Exchange, WsMessage}; +use crate::tardis::machine::enums::{Exchange, WsMessage}; pub type Result = std::result::Result; diff --git a/nautilus_core/adapters/src/tardis/enums.rs b/nautilus_core/adapters/src/tardis/machine/enums.rs similarity index 98% rename from nautilus_core/adapters/src/tardis/enums.rs rename to nautilus_core/adapters/src/tardis/machine/enums.rs index 3ee443e14950..daac6897745f 100644 --- a/nautilus_core/adapters/src/tardis/enums.rs +++ b/nautilus_core/adapters/src/tardis/machine/enums.rs @@ -15,7 +15,7 @@ use serde::{Deserialize, Serialize}; -use super::message::{ +use crate::tardis::machine::message::{ BarMsg, BookChangeMsg, BookSnapshotMsg, DerivativeTickerMsg, DisconnectMsg, TradeMsg, }; diff --git a/nautilus_core/adapters/src/tardis/message.rs b/nautilus_core/adapters/src/tardis/machine/message.rs similarity index 100% rename from nautilus_core/adapters/src/tardis/message.rs rename to nautilus_core/adapters/src/tardis/machine/message.rs diff --git a/nautilus_core/adapters/src/tardis/machine/mod.rs b/nautilus_core/adapters/src/tardis/machine/mod.rs index 0dbb439603dc..3a43ada7652b 100644 --- a/nautilus_core/adapters/src/tardis/machine/mod.rs +++ b/nautilus_core/adapters/src/tardis/machine/mod.rs @@ -32,9 +32,11 @@ use tokio_tungstenite::{ MaybeTlsStream, WebSocketStream, }; -use super::enums::{Exchange, WsMessage}; +use super::machine::enums::{Exchange, WsMessage}; pub mod client; +pub mod enums; +pub mod message; pub use crate::tardis::machine::client::TardisClient; diff --git a/nautilus_core/adapters/src/tardis/mod.rs b/nautilus_core/adapters/src/tardis/mod.rs index ff9969f74527..d646f8431a37 100644 --- a/nautilus_core/adapters/src/tardis/mod.rs +++ b/nautilus_core/adapters/src/tardis/mod.rs @@ -16,11 +16,8 @@ //! The [Tardis](https://tardis.dev) integration adapter. pub mod csv; -pub mod enums; pub mod machine; -pub mod message; pub mod parse; -pub mod record; #[cfg(feature = "python")] pub mod python; From a23a48ff7b54b2832388156ee92866ad9d6036fa Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 21 Oct 2024 13:23:05 +1100 Subject: [PATCH 212/224] Continue Tardis Machine client --- nautilus_core/Cargo.lock | 1 + nautilus_core/adapters/Cargo.toml | 3 +- .../adapters/src/tardis/machine/enums.rs | 4 +- .../adapters/src/tardis/machine/message.rs | 132 +----- .../adapters/src/tardis/machine/mod.rs | 1 + .../adapters/src/tardis/machine/parse.rs | 399 ++++++++++++++++++ nautilus_core/adapters/src/tardis/mod.rs | 3 + nautilus_core/adapters/src/tardis/parse.rs | 29 +- .../adapters/src/tardis/tests/data/bar.json | 21 + .../src/tardis/tests/data/book_change.json | 15 + .../src/tardis/tests/data/book_snapshot.json | 30 ++ .../tardis/tests/data/derivative_ticker.json | 12 + .../src/tardis/tests/data/disconnect.json | 5 + .../adapters/src/tardis/tests/data/trade.json | 11 + .../adapters/src/tardis/tests/mod.rs | 28 ++ 15 files changed, 571 insertions(+), 123 deletions(-) create mode 100644 nautilus_core/adapters/src/tardis/machine/parse.rs create mode 100644 nautilus_core/adapters/src/tardis/tests/data/bar.json create mode 100644 nautilus_core/adapters/src/tardis/tests/data/book_change.json create mode 100644 nautilus_core/adapters/src/tardis/tests/data/book_snapshot.json create mode 100644 nautilus_core/adapters/src/tardis/tests/data/derivative_ticker.json create mode 100644 nautilus_core/adapters/src/tardis/tests/data/disconnect.json create mode 100644 nautilus_core/adapters/src/tardis/tests/data/trade.json create mode 100644 nautilus_core/adapters/src/tardis/tests/mod.rs diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 60be3724564c..52df78298552 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -2712,6 +2712,7 @@ dependencies = [ "tracing-test", "urlencoding", "ustr", + "uuid", ] [[package]] diff --git a/nautilus_core/adapters/Cargo.toml b/nautilus_core/adapters/Cargo.toml index a7a3af0da466..6e9c606b97fb 100644 --- a/nautilus_core/adapters/Cargo.toml +++ b/nautilus_core/adapters/Cargo.toml @@ -45,6 +45,7 @@ tracing = { workspace = true } tracing-subscriber = { workspace = true } thiserror = { workspace = true } ustr = { workspace = true } +uuid = { workspace = true, optional = true } csv = { version = "1.3.0", optional = true } databento = { version = "0.14.1", optional = true } fallible-streaming-iterator = { version = "0.1.9", optional = true } @@ -80,4 +81,4 @@ python = [ "nautilus-core/python", "nautilus-model/python", ] -tardis = ["python", "csv", "flate2", "tokio-tungstenite", "urlencoding"] +tardis = ["python", "csv", "flate2", "tokio-tungstenite", "urlencoding", "uuid"] diff --git a/nautilus_core/adapters/src/tardis/machine/enums.rs b/nautilus_core/adapters/src/tardis/machine/enums.rs index daac6897745f..bab0b84f9fde 100644 --- a/nautilus_core/adapters/src/tardis/machine/enums.rs +++ b/nautilus_core/adapters/src/tardis/machine/enums.rs @@ -119,10 +119,10 @@ pub enum Exchange { #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "snake_case", tag = "type")] pub enum WsMessage { - Trade(TradeMsg), BookChange(BookChangeMsg), BookSnapshot(BookSnapshotMsg), - DerivativeTicker(DerivativeTickerMsg), + Trade(TradeMsg), Bar(BarMsg), + DerivativeTicker(DerivativeTickerMsg), Disconnect(DisconnectMsg), } diff --git a/nautilus_core/adapters/src/tardis/machine/message.rs b/nautilus_core/adapters/src/tardis/machine/message.rs index 5f409e6b9e2d..887de810e4a1 100644 --- a/nautilus_core/adapters/src/tardis/machine/message.rs +++ b/nautilus_core/adapters/src/tardis/machine/message.rs @@ -179,28 +179,12 @@ mod tests { use rstest::rstest; use super::*; + use crate::tardis::tests::load_test_json; #[rstest] fn test_parse_book_change_message() { - let json_data = r#" - { - "type": "book_change", - "symbol": "XBTUSD", - "exchange": "bitmex", - "isSnapshot": false, - "bids": [], - "asks": [ - { - "price": 7985, - "amount": 283318 - } - ], - "timestamp": "2019-10-23T11:29:53.469Z", - "localTimestamp": "2019-10-23T11:29:53.469Z" - } - "#; - - let message: BookChangeMsg = serde_json::from_str(json_data).expect("Failed to parse JSON"); + let json_data = load_test_json("book_change.json"); + let message: BookChangeMsg = serde_json::from_str(&json_data).unwrap(); assert_eq!(message.symbol, "XBTUSD"); assert_eq!(message.exchange, Exchange::Bitmex); @@ -221,41 +205,8 @@ mod tests { #[rstest] fn test_parse_book_snapshot_message() { - let json_data = r#" - { - "type": "book_snapshot", - "symbol": "XBTUSD", - "exchange": "bitmex", - "name": "book_snapshot_2_50ms", - "depth": 2, - "interval": 50, - "bids": [ - { - "price": 7633.5, - "amount": 1906067 - }, - { - "price": 7633, - "amount": 65319 - } - ], - "asks": [ - { - "price": 7634, - "amount": 1467849 - }, - { - "price": 7634.5, - "amount": 67939 - } - ], - "timestamp": "2019-10-25T13:39:46.950Z", - "localTimestamp": "2019-10-25T13:39:46.961Z" - } - "#; - - let message: BookSnapshotMsg = - serde_json::from_str(json_data).expect("Failed to parse JSON"); + let json_data = load_test_json("book_snapshot.json"); + let message: BookSnapshotMsg = serde_json::from_str(&json_data).unwrap(); assert_eq!(message.symbol, "XBTUSD"); assert_eq!(message.exchange, Exchange::Bitmex); @@ -280,21 +231,8 @@ mod tests { #[rstest] fn test_parse_trade_message() { - let json_data = r#" - { - "type": "trade", - "symbol": "XBTUSD", - "exchange": "bitmex", - "id": "282a0445-0e3a-abeb-f403-11003204ea1b", - "price": 7996, - "amount": 50, - "side": "sell", - "timestamp": "2019-10-23T10:32:49.669Z", - "localTimestamp": "2019-10-23T10:32:49.740Z" - } - "#; - - let message: TradeMsg = serde_json::from_str(json_data).expect("Failed to parse JSON"); + let json_data = load_test_json("trade.json"); + let message: TradeMsg = serde_json::from_str(&json_data).unwrap(); assert_eq!(message.symbol, "XBTUSD"); assert_eq!(message.exchange, Exchange::Bitmex); @@ -317,23 +255,8 @@ mod tests { #[rstest] fn test_parse_derivative_ticker_message() { - let json_data = r#" - { - "type": "derivative_ticker", - "symbol": "BTC-PERPETUAL", - "exchange": "deribit", - "lastPrice": 7987.5, - "openInterest": 84129491, - "fundingRate": -0.00001568, - "indexPrice": 7989.28, - "markPrice": 7987.56, - "timestamp": "2019-10-23T11:34:29.302Z", - "localTimestamp": "2019-10-23T11:34:29.416Z" - } - "#; - - let message: DerivativeTickerMsg = - serde_json::from_str(json_data).expect("Failed to parse JSON"); + let json_data = load_test_json("derivative_ticker.json"); + let message: DerivativeTickerMsg = serde_json::from_str(&json_data).unwrap(); assert_eq!(message.symbol, "BTC-PERPETUAL"); assert_eq!(message.exchange, Exchange::Deribit); @@ -354,30 +277,8 @@ mod tests { #[rstest] fn test_parse_bar_message() { - let json_data = r#" - { - "type": "trade_bar", - "symbol": "XBTUSD", - "exchange": "bitmex", - "name": "trade_bar_10000ms", - "interval": 10000, - "open": 7623.5, - "high": 7623.5, - "low": 7623, - "close": 7623.5, - "volume": 37034, - "buyVolume": 24244, - "sellVolume": 12790, - "trades": 9, - "vwap": 7623.327320840309, - "openTimestamp": "2019-10-25T13:11:31.574Z", - "closeTimestamp": "2019-10-25T13:11:39.212Z", - "localTimestamp": "2019-10-25T13:11:40.369Z", - "timestamp": "2019-10-25T13:11:40.000Z" - } - "#; - - let message: BarMsg = serde_json::from_str(json_data).expect("Failed to parse JSON"); + let json_data = load_test_json("bar.json"); + let message: BarMsg = serde_json::from_str(&json_data).unwrap(); assert_eq!(message.symbol, "XBTUSD"); assert_eq!(message.exchange, Exchange::Bitmex); @@ -412,15 +313,8 @@ mod tests { #[rstest] fn test_parse_disconnect_message() { - let json_data = r#" - { - "type": "disconnect", - "exchange": "deribit", - "localTimestamp": "2019-10-23T11:34:29.416Z" - } - "#; - - let message: DisconnectMsg = serde_json::from_str(json_data).expect("Failed to parse JSON"); + let json_data = load_test_json("disconnect.json"); + let message: DisconnectMsg = serde_json::from_str(&json_data).unwrap(); assert_eq!(message.exchange, Exchange::Deribit); assert_eq!( diff --git a/nautilus_core/adapters/src/tardis/machine/mod.rs b/nautilus_core/adapters/src/tardis/machine/mod.rs index 3a43ada7652b..8f3cc1853872 100644 --- a/nautilus_core/adapters/src/tardis/machine/mod.rs +++ b/nautilus_core/adapters/src/tardis/machine/mod.rs @@ -37,6 +37,7 @@ use super::machine::enums::{Exchange, WsMessage}; pub mod client; pub mod enums; pub mod message; +pub mod parse; pub use crate::tardis::machine::client::TardisClient; diff --git a/nautilus_core/adapters/src/tardis/machine/parse.rs b/nautilus_core/adapters/src/tardis/machine/parse.rs new file mode 100644 index 000000000000..098bd9c66fe4 --- /dev/null +++ b/nautilus_core/adapters/src/tardis/machine/parse.rs @@ -0,0 +1,399 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +use chrono::{DateTime, Utc}; +use nautilus_core::nanos::UnixNanos; +use nautilus_model::{ + data::{ + bar::{Bar, BarType}, + delta::OrderBookDelta, + deltas::{OrderBookDeltas, OrderBookDeltas_API}, + order::BookOrder, + trade::TradeTick, + Data, + }, + enums::{AggregationSource, OrderSide, RecordFlag}, + identifiers::{InstrumentId, TradeId}, + types::{price::Price, quantity::Quantity}, +}; +use uuid::Uuid; + +use super::{ + enums::WsMessage, + message::{BarMsg, BookChangeMsg, BookLevel, BookSnapshotMsg, TradeMsg}, +}; +use crate::tardis::parse::{ + parse_aggressor_side, parse_bar_spec, parse_book_action, parse_instrument_id, +}; + +pub fn parse_tardis_ws_message( + msg: WsMessage, + price_precision: u8, + size_precision: u8, +) -> Option { + match msg { + WsMessage::BookChange(msg) => Some(Data::Deltas(parse_book_change_msg( + msg, + price_precision, + size_precision, + None, // Instrument ID handling TBD + ))), + WsMessage::BookSnapshot(msg) => Some(Data::Deltas(parse_book_snapshot_msg( + msg, + price_precision, + size_precision, + None, // Instrument ID handling TBD + ))), + WsMessage::Trade(msg) => Some(Data::Trade(parse_trade_msg( + msg, + price_precision, + size_precision, + None, // Instrument ID handling TBD + ))), + WsMessage::Bar(msg) => Some(Data::Bar(parse_bar_msg( + msg, + price_precision, + size_precision, + None, // Instrument ID handling TBD + ))), + WsMessage::DerivativeTicker(_) => None, + WsMessage::Disconnect(_) => None, + } +} + +pub fn parse_book_change_msg( + msg: BookChangeMsg, + price_precision: u8, + size_precision: u8, + instrument_id: Option, +) -> OrderBookDeltas_API { + let temp_exchange_str = serde_json::to_string(&msg.exchange) + .unwrap() + .trim_matches('"') + .to_string(); + + let instrument_id = match &instrument_id { + Some(id) => *id, + None => parse_instrument_id(&temp_exchange_str, &msg.symbol), + }; + + parse_book_msg( + msg.bids, + msg.asks, + msg.is_snapshot, + price_precision, + size_precision, + instrument_id, + msg.timestamp, + msg.local_timestamp, + ) +} + +pub fn parse_book_snapshot_msg( + msg: BookSnapshotMsg, + price_precision: u8, + size_precision: u8, + instrument_id: Option, +) -> OrderBookDeltas_API { + let temp_exchange_str = serde_json::to_string(&msg.exchange) + .unwrap() + .trim_matches('"') + .to_string(); + + let instrument_id = match &instrument_id { + Some(id) => *id, + None => parse_instrument_id(&temp_exchange_str, &msg.symbol), + }; + + parse_book_msg( + msg.bids, + msg.asks, + true, + price_precision, + size_precision, + instrument_id, + msg.timestamp, + msg.local_timestamp, + ) +} + +#[allow(clippy::too_many_arguments)] +pub fn parse_book_msg( + bids: Vec, + asks: Vec, + is_snapshot: bool, + price_precision: u8, + size_precision: u8, + instrument_id: InstrumentId, + timestamp: DateTime, + local_timestamp: DateTime, +) -> OrderBookDeltas_API { + let ts_event = UnixNanos::from(timestamp.timestamp_nanos_opt().unwrap() as u64); + let ts_init = UnixNanos::from(local_timestamp.timestamp_nanos_opt().unwrap() as u64); + + let mut deltas: Vec = Vec::with_capacity(bids.len() + asks.len()); + + for level in bids { + deltas.push(parse_book_level( + instrument_id, + price_precision, + size_precision, + OrderSide::Buy, + level, + is_snapshot, + ts_event, + ts_init, + )); + } + + for level in asks { + deltas.push(parse_book_level( + instrument_id, + price_precision, + size_precision, + OrderSide::Sell, + level, + is_snapshot, + ts_event, + ts_init, + )); + } + + if let Some(last_delta) = deltas.last_mut() { + last_delta.flags += RecordFlag::F_LAST.value(); + } + + // TODO: Opaque pointer wrapper necessary for Cython (remove once Cython gone) + OrderBookDeltas_API::new(OrderBookDeltas::new(instrument_id, deltas)) +} + +#[allow(clippy::too_many_arguments)] +pub fn parse_book_level( + instrument_id: InstrumentId, + price_precision: u8, + size_precision: u8, + side: OrderSide, + level: BookLevel, + is_snapshot: bool, + ts_event: UnixNanos, + ts_init: UnixNanos, +) -> OrderBookDelta { + let action = parse_book_action(is_snapshot, level.amount); + let price = Price::new(level.price, price_precision); + let size = Quantity::new(level.amount, size_precision); + let order_id = 0; // Not applicable for L2 data + let order = BookOrder::new(side, price, size, order_id); + let flags = if is_snapshot { + RecordFlag::F_SNAPSHOT.value() + } else { + 0 + }; + let sequence = 0; // Not available + + OrderBookDelta::new( + instrument_id, + action, + order, + flags, + sequence, + ts_event, + ts_init, + ) +} + +pub fn parse_trade_msg( + msg: TradeMsg, + price_precision: u8, + size_precision: u8, + instrument_id: Option, +) -> TradeTick { + let temp_exchange_str = serde_json::to_string(&msg.exchange) + .unwrap() + .trim_matches('"') + .to_string(); + + let instrument_id = match &instrument_id { + Some(id) => *id, + None => parse_instrument_id(&temp_exchange_str, &msg.symbol), + }; + + let price = Price::new(msg.price, price_precision); + let size = Quantity::new(msg.amount, size_precision); + let aggressor_side = parse_aggressor_side(&msg.side); + let trade_id = TradeId::new(&msg.id.unwrap_or_else(|| Uuid::new_v4().to_string())); + let ts_event = UnixNanos::from(msg.timestamp.timestamp_nanos_opt().unwrap() as u64); + let ts_init = UnixNanos::from(msg.local_timestamp.timestamp_nanos_opt().unwrap() as u64); + + TradeTick::new( + instrument_id, + price, + size, + aggressor_side, + trade_id, + ts_event, + ts_init, + ) +} + +pub fn parse_bar_msg( + msg: BarMsg, + price_precision: u8, + size_precision: u8, + instrument_id: Option, +) -> Bar { + let temp_exchange_str = serde_json::to_string(&msg.exchange) + .unwrap() + .trim_matches('"') + .to_string(); + + let instrument_id = match &instrument_id { + Some(id) => *id, + None => parse_instrument_id(&temp_exchange_str, &msg.symbol), + }; + let spec = parse_bar_spec(&msg.name); + let bar_type = BarType::new(instrument_id, spec, AggregationSource::External); + + let open = Price::new(msg.open, price_precision); + let high = Price::new(msg.high, price_precision); + let low = Price::new(msg.low, price_precision); + let close = Price::new(msg.close, price_precision); + let volume = Quantity::new(msg.volume, size_precision); + let ts_event = UnixNanos::from(msg.timestamp.timestamp_nanos_opt().unwrap() as u64); + let ts_init = UnixNanos::from(msg.local_timestamp.timestamp_nanos_opt().unwrap() as u64); + + Bar::new(bar_type, open, high, low, close, volume, ts_event, ts_init).unwrap() +} + +//////////////////////////////////////////////////////////////////////////////// +// Tests +//////////////////////////////////////////////////////////////////////////////// +#[cfg(test)] +mod tests { + use nautilus_model::enums::{AggressorSide, BookAction}; + use rstest::rstest; + + use super::*; + use crate::tardis::tests::load_test_json; + + #[rstest] + fn test_parse_book_change_message() { + let json_data = load_test_json("book_change.json"); + let msg: BookChangeMsg = serde_json::from_str(&json_data).unwrap(); + + let price_precision = 0; + let size_precision = 0; + let instrument_id = None; + let deltas = parse_book_change_msg(msg, price_precision, size_precision, instrument_id); + + assert_eq!(deltas.deltas.len(), 1); + assert_eq!(deltas.instrument_id, InstrumentId::from("XBTUSD.BITMEX")); + assert_eq!(deltas.flags, RecordFlag::F_LAST.value()); + assert_eq!(deltas.sequence, 0); + assert_eq!(deltas.ts_event, UnixNanos::from(1571830193469000000)); + assert_eq!(deltas.ts_init, UnixNanos::from(1571830193469000000)); + assert_eq!( + deltas.deltas[0].instrument_id, + InstrumentId::from("XBTUSD.BITMEX") + ); + assert_eq!(deltas.deltas[0].action, BookAction::Update); + assert_eq!(deltas.deltas[0].order.price, Price::from("7985")); + assert_eq!(deltas.deltas[0].order.size, Quantity::from(283318)); + assert_eq!(deltas.deltas[0].order.order_id, 0); + assert_eq!(deltas.deltas[0].flags, RecordFlag::F_LAST.value()); + assert_eq!(deltas.deltas[0].sequence, 0); + assert_eq!( + deltas.deltas[0].ts_event, + UnixNanos::from(1571830193469000000) + ); + assert_eq!( + deltas.deltas[0].ts_init, + UnixNanos::from(1571830193469000000) + ); + } + + #[rstest] + fn test_parse_book_snapshot_message() { + let json_data = load_test_json("book_snapshot.json"); + let msg: BookSnapshotMsg = serde_json::from_str(&json_data).unwrap(); + + let price_precision = 1; + let size_precision = 0; + let instrument_id = None; + let deltas = parse_book_snapshot_msg(msg, price_precision, size_precision, instrument_id); + let delta_0 = deltas.deltas[0]; + let _delta_2 = deltas.deltas[2]; + + assert_eq!(deltas.deltas.len(), 4); + assert_eq!(deltas.instrument_id, InstrumentId::from("XBTUSD.BITMEX")); + assert_eq!( + deltas.flags, + RecordFlag::F_LAST.value() + RecordFlag::F_SNAPSHOT.value() + ); + assert_eq!(deltas.sequence, 0); + assert_eq!(deltas.ts_event, UnixNanos::from(1572010786950000000)); + assert_eq!(deltas.ts_init, UnixNanos::from(1572010786961000000)); + assert_eq!(delta_0.instrument_id, InstrumentId::from("XBTUSD.BITMEX")); + assert_eq!(delta_0.action, BookAction::Add); + assert_eq!(delta_0.order.price, Price::from("7633.5")); + assert_eq!(delta_0.order.size, Quantity::from(1906067)); + assert_eq!(delta_0.order.order_id, 0); + assert_eq!(delta_0.flags, RecordFlag::F_SNAPSHOT.value()); + assert_eq!(delta_0.sequence, 0); + assert_eq!(delta_0.ts_event, UnixNanos::from(1572010786950000000)); + assert_eq!(delta_0.ts_init, UnixNanos::from(1572010786961000000)); + // TODO: Assert fields for delta_2 (top ask) + } + + #[rstest] + fn test_parse_trade_message() { + let json_data = load_test_json("trade.json"); + let msg: TradeMsg = serde_json::from_str(&json_data).unwrap(); + + let price_precision = 0; + let size_precision = 0; + let instrument_id = None; + let trade = parse_trade_msg(msg, price_precision, size_precision, instrument_id); + + assert_eq!(trade.instrument_id, InstrumentId::from("XBTUSD.BITMEX")); + assert_eq!(trade.price, Price::from("7996")); + assert_eq!(trade.size, Quantity::from(50)); + assert_eq!(trade.aggressor_side, AggressorSide::Seller); + assert_eq!(trade.ts_event, UnixNanos::from(1571826769669000000)); + assert_eq!(trade.ts_init, UnixNanos::from(1571826769740000000)); + } + + #[rstest] + fn test_parse_bar_message() { + let json_data = load_test_json("bar.json"); + let msg: BarMsg = serde_json::from_str(&json_data).unwrap(); + + let price_precision = 1; + let size_precision = 0; + let instrument_id = None; + let bar = parse_bar_msg(msg, price_precision, size_precision, instrument_id); + + assert_eq!( + bar.bar_type, + BarType::from("XBTUSD.BITMEX-10000-MILLISECOND-LAST-EXTERNAL") + ); + assert_eq!(bar.open, Price::from("7623.5")); + assert_eq!(bar.high, Price::from("7623.5")); + assert_eq!(bar.low, Price::from("7623")); + assert_eq!(bar.close, Price::from("7623.5")); + assert_eq!(bar.volume, Quantity::from(37034)); + assert_eq!(bar.ts_event, UnixNanos::from(1572009100000000000)); + assert_eq!(bar.ts_init, UnixNanos::from(1572009100369000000)); + } +} diff --git a/nautilus_core/adapters/src/tardis/mod.rs b/nautilus_core/adapters/src/tardis/mod.rs index d646f8431a37..27eedb594437 100644 --- a/nautilus_core/adapters/src/tardis/mod.rs +++ b/nautilus_core/adapters/src/tardis/mod.rs @@ -21,3 +21,6 @@ pub mod parse; #[cfg(feature = "python")] pub mod python; + +#[cfg(test)] +pub mod tests; diff --git a/nautilus_core/adapters/src/tardis/parse.rs b/nautilus_core/adapters/src/tardis/parse.rs index 51fc16c6fc81..c0b000ae0678 100644 --- a/nautilus_core/adapters/src/tardis/parse.rs +++ b/nautilus_core/adapters/src/tardis/parse.rs @@ -17,7 +17,8 @@ use std::str::FromStr; use nautilus_core::{datetime::NANOSECONDS_IN_MICROSECOND, nanos::UnixNanos}; use nautilus_model::{ - enums::{AggressorSide, BookAction, OrderSide}, + data::bar::BarSpecification, + enums::{AggressorSide, BarAggregation, BookAction, OrderSide, PriceType}, identifiers::InstrumentId, }; @@ -67,6 +68,32 @@ pub fn parse_book_action(is_snapshot: bool, amount: f64) -> BookAction { } } +#[must_use] +pub fn parse_bar_spec(value: &str) -> BarSpecification { + // The last part contains both the step and the suffix (e.g., "10000ms") + let parts: Vec<&str> = value.split('_').collect(); + let last_part = parts.last().expect("Invalid bar spec"); + + // Extract the number and suffix + let (step_str, suffix) = last_part.split_at(last_part.len() - 2); + let step: usize = step_str.parse().expect("Invalid step"); + + let aggregation = match suffix { + "ms" => BarAggregation::Millisecond, + "s" => BarAggregation::Second, + "m" => BarAggregation::Minute, + "ticks" => BarAggregation::Tick, + "vol" => BarAggregation::Volume, + _ => panic!("Unsupported bar aggregation type"), + }; + + BarSpecification { + step, + aggregation, + price_type: PriceType::Last, // Always last trade price for Tardis bars + } +} + //////////////////////////////////////////////////////////////////////////////// // Tests //////////////////////////////////////////////////////////////////////////////// diff --git a/nautilus_core/adapters/src/tardis/tests/data/bar.json b/nautilus_core/adapters/src/tardis/tests/data/bar.json new file mode 100644 index 000000000000..df9f2ff28c11 --- /dev/null +++ b/nautilus_core/adapters/src/tardis/tests/data/bar.json @@ -0,0 +1,21 @@ +{ + "type": "trade_bar", + "symbol": "XBTUSD", + "exchange": "bitmex", + "name": "trade_bar_10000ms", + "interval": 10000, + "kind": "time", + "open": 7623.5, + "high": 7623.5, + "low": 7623, + "close": 7623.5, + "volume": 37034, + "buyVolume": 24244, + "sellVolume": 12790, + "trades": 9, + "vwap": 7623.327320840309, + "openTimestamp": "2019-10-25T13:11:31.574Z", + "closeTimestamp": "2019-10-25T13:11:39.212Z", + "localTimestamp": "2019-10-25T13:11:40.369Z", + "timestamp": "2019-10-25T13:11:40.000Z" +} diff --git a/nautilus_core/adapters/src/tardis/tests/data/book_change.json b/nautilus_core/adapters/src/tardis/tests/data/book_change.json new file mode 100644 index 000000000000..4d69ce8c32a1 --- /dev/null +++ b/nautilus_core/adapters/src/tardis/tests/data/book_change.json @@ -0,0 +1,15 @@ +{ + "type": "book_change", + "symbol": "XBTUSD", + "exchange": "bitmex", + "isSnapshot": false, + "bids": [], + "asks": [ + { + "price": 7985, + "amount": 283318 + } + ], + "timestamp": "2019-10-23T11:29:53.469Z", + "localTimestamp": "2019-10-23T11:29:53.469Z" +} diff --git a/nautilus_core/adapters/src/tardis/tests/data/book_snapshot.json b/nautilus_core/adapters/src/tardis/tests/data/book_snapshot.json new file mode 100644 index 000000000000..5b24a0789d4d --- /dev/null +++ b/nautilus_core/adapters/src/tardis/tests/data/book_snapshot.json @@ -0,0 +1,30 @@ +{ + "type": "book_snapshot", + "symbol": "XBTUSD", + "exchange": "bitmex", + "name": "book_snapshot_2_50ms", + "depth": 2, + "interval": 50, + "bids": [ + { + "price": 7633.5, + "amount": 1906067 + }, + { + "price": 7633, + "amount": 65319 + } + ], + "asks": [ + { + "price": 7634, + "amount": 1467849 + }, + { + "price": 7634.5, + "amount": 67939 + } + ], + "timestamp": "2019-10-25T13:39:46.950Z", + "localTimestamp": "2019-10-25T13:39:46.961Z" +} diff --git a/nautilus_core/adapters/src/tardis/tests/data/derivative_ticker.json b/nautilus_core/adapters/src/tardis/tests/data/derivative_ticker.json new file mode 100644 index 000000000000..5b5ed453e4f3 --- /dev/null +++ b/nautilus_core/adapters/src/tardis/tests/data/derivative_ticker.json @@ -0,0 +1,12 @@ +{ + "type": "derivative_ticker", + "symbol": "BTC-PERPETUAL", + "exchange": "deribit", + "lastPrice": 7987.5, + "openInterest": 84129491, + "fundingRate": -0.00001568, + "indexPrice": 7989.28, + "markPrice": 7987.56, + "timestamp": "2019-10-23T11:34:29.302Z", + "localTimestamp": "2019-10-23T11:34:29.416Z" +} diff --git a/nautilus_core/adapters/src/tardis/tests/data/disconnect.json b/nautilus_core/adapters/src/tardis/tests/data/disconnect.json new file mode 100644 index 000000000000..c3f988cded52 --- /dev/null +++ b/nautilus_core/adapters/src/tardis/tests/data/disconnect.json @@ -0,0 +1,5 @@ +{ + "type": "disconnect", + "exchange": "deribit", + "localTimestamp": "2019-10-23T11:34:29.416Z" +} diff --git a/nautilus_core/adapters/src/tardis/tests/data/trade.json b/nautilus_core/adapters/src/tardis/tests/data/trade.json new file mode 100644 index 000000000000..6f194c92d47c --- /dev/null +++ b/nautilus_core/adapters/src/tardis/tests/data/trade.json @@ -0,0 +1,11 @@ +{ + "type": "trade", + "symbol": "XBTUSD", + "exchange": "bitmex", + "id": "282a0445-0e3a-abeb-f403-11003204ea1b", + "price": 7996, + "amount": 50, + "side": "sell", + "timestamp": "2019-10-23T10:32:49.669Z", + "localTimestamp": "2019-10-23T10:32:49.740Z" +} diff --git a/nautilus_core/adapters/src/tardis/tests/mod.rs b/nautilus_core/adapters/src/tardis/tests/mod.rs new file mode 100644 index 000000000000..b614ad34cb10 --- /dev/null +++ b/nautilus_core/adapters/src/tardis/tests/mod.rs @@ -0,0 +1,28 @@ +// ------------------------------------------------------------------------------------------------- +// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved. +// https://nautechsystems.io +// +// Licensed under the GNU Lesser General Public License Version 3.0 (the "License"); +// You may not use this file except in compliance with the License. +// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------------------------------- + +#[cfg(test)] +pub fn load_test_json(file_name: &str) -> String { + use std::{fs, path::PathBuf}; + + let path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("src") + .join("tardis") + .join("tests") + .join("data") + .join(file_name); + + fs::read_to_string(path).expect("Failed to read test JSON file") +} From 71537c5aaed6613dfdf31fcfffab9e61d6f29e89 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 21 Oct 2024 13:28:14 +1100 Subject: [PATCH 213/224] Fix clippy lints --- .../adapters/src/tardis/machine/mod.rs | 4 +-- .../adapters/src/tardis/machine/parse.rs | 7 +++++ .../adapters/src/tardis/tests/mod.rs | 1 + .../backtest/src/matching_engine/mod.rs | 2 +- .../backtest/src/matching_engine/tests.rs | 31 +++++-------------- 5 files changed, 19 insertions(+), 26 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/machine/mod.rs b/nautilus_core/adapters/src/tardis/machine/mod.rs index 8f3cc1853872..d55ba90574e4 100644 --- a/nautilus_core/adapters/src/tardis/machine/mod.rs +++ b/nautilus_core/adapters/src/tardis/machine/mod.rs @@ -130,7 +130,7 @@ pub async fn replay_normalized( return Err(Error::EmptyOptions); } - let path = format!("{}/ws-replay-normalized?options=", base_url); + let path = format!("{base_url}/ws-replay-normalized?options="); let options = serde_json::to_string(&options)?; let plain_url = format!("{path}{options}"); @@ -149,7 +149,7 @@ pub async fn stream_normalized( return Err(Error::EmptyOptions); } - let path = format!("{}/ws-stream-normalized?options=", base_url); + let path = format!("{base_url}/ws-stream-normalized?options="); let options = serde_json::to_string(&options)?; let plain_url = format!("{path}{options}"); diff --git a/nautilus_core/adapters/src/tardis/machine/parse.rs b/nautilus_core/adapters/src/tardis/machine/parse.rs index 098bd9c66fe4..cbedad35961a 100644 --- a/nautilus_core/adapters/src/tardis/machine/parse.rs +++ b/nautilus_core/adapters/src/tardis/machine/parse.rs @@ -38,6 +38,7 @@ use crate::tardis::parse::{ parse_aggressor_side, parse_bar_spec, parse_book_action, parse_instrument_id, }; +#[must_use] pub fn parse_tardis_ws_message( msg: WsMessage, price_precision: u8, @@ -73,6 +74,7 @@ pub fn parse_tardis_ws_message( } } +#[must_use] pub fn parse_book_change_msg( msg: BookChangeMsg, price_precision: u8, @@ -101,6 +103,7 @@ pub fn parse_book_change_msg( ) } +#[must_use] pub fn parse_book_snapshot_msg( msg: BookSnapshotMsg, price_precision: u8, @@ -130,6 +133,7 @@ pub fn parse_book_snapshot_msg( } #[allow(clippy::too_many_arguments)] +#[must_use] pub fn parse_book_msg( bids: Vec, asks: Vec, @@ -180,6 +184,7 @@ pub fn parse_book_msg( } #[allow(clippy::too_many_arguments)] +#[must_use] pub fn parse_book_level( instrument_id: InstrumentId, price_precision: u8, @@ -213,6 +218,7 @@ pub fn parse_book_level( ) } +#[must_use] pub fn parse_trade_msg( msg: TradeMsg, price_precision: u8, @@ -247,6 +253,7 @@ pub fn parse_trade_msg( ) } +#[must_use] pub fn parse_bar_msg( msg: BarMsg, price_precision: u8, diff --git a/nautilus_core/adapters/src/tardis/tests/mod.rs b/nautilus_core/adapters/src/tardis/tests/mod.rs index b614ad34cb10..3a8cc5b37ce5 100644 --- a/nautilus_core/adapters/src/tardis/tests/mod.rs +++ b/nautilus_core/adapters/src/tardis/tests/mod.rs @@ -14,6 +14,7 @@ // ------------------------------------------------------------------------------------------------- #[cfg(test)] +#[must_use] pub fn load_test_json(file_name: &str) -> String { use std::{fs, path::PathBuf}; diff --git a/nautilus_core/backtest/src/matching_engine/mod.rs b/nautilus_core/backtest/src/matching_engine/mod.rs index 2c3d346ea2a3..b304d6fb669c 100644 --- a/nautilus_core/backtest/src/matching_engine/mod.rs +++ b/nautilus_core/backtest/src/matching_engine/mod.rs @@ -885,7 +885,7 @@ impl OrderMatchingEngine { let positions_open = cache.positions_open(None, Some(&order.instrument_id()), None, None); if !positions_open.is_empty() { - Some(positions_open[0].id.to_owned()) + Some(positions_open[0].id) } else { None } diff --git a/nautilus_core/backtest/src/matching_engine/tests.rs b/nautilus_core/backtest/src/matching_engine/tests.rs index 0ded519ba247..bcdb1f3e857a 100644 --- a/nautilus_core/backtest/src/matching_engine/tests.rs +++ b/nautilus_core/backtest/src/matching_engine/tests.rs @@ -231,13 +231,8 @@ fn test_process_order_when_instrument_already_expired( ); // Create engine and process order - let mut engine = get_order_matching_engine( - instrument.clone(), - Rc::new(RefCell::new(msgbus)), - None, - None, - None, - ); + let mut engine = + get_order_matching_engine(instrument, Rc::new(RefCell::new(msgbus)), None, None, None); engine.process_order(&market_order_buy, account_id); @@ -282,13 +277,8 @@ fn test_process_order_when_instrument_not_active( ); // Create engine and process order - let mut engine = get_order_matching_engine( - instrument.clone(), - Rc::new(RefCell::new(msgbus)), - None, - None, - None, - ); + let mut engine = + get_order_matching_engine(instrument, Rc::new(RefCell::new(msgbus)), None, None, None); engine.process_order(&market_order_buy, account_id); @@ -442,13 +432,8 @@ fn test_process_order_when_shorting_equity_without_margin_account( ); // Create engine and process order - let mut engine = get_order_matching_engine( - instrument.clone(), - Rc::new(RefCell::new(msgbus)), - None, - None, - None, - ); + let mut engine = + get_order_matching_engine(instrument, Rc::new(RefCell::new(msgbus)), None, None, None); engine.process_order(&market_order_sell, account_id); @@ -681,7 +666,7 @@ fn test_process_market_order_no_market_rejected( // Create engine and process order let mut engine = get_order_matching_engine( - instrument_es.clone(), + instrument_es, Rc::new(RefCell::new(msgbus)), None, None, @@ -852,7 +837,7 @@ fn test_get_position_id_hedging_with_generated_position( }; // Create oms type hedging engine let mut engine = OrderMatchingEngine::new( - instrument_eth_usdt.clone(), + instrument_eth_usdt, 1, FillModel::default(), BookType::L1_MBP, From c5d41279d785f4efbc213d61f214ef5c5e0a0b88 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 21 Oct 2024 17:48:40 +1100 Subject: [PATCH 214/224] Implement Tardis Machine streams --- .../adapters/src/tardis/machine/client.rs | 69 +++++++++++++--- .../adapters/src/tardis/machine/mod.rs | 8 ++ .../adapters/src/tardis/python/machine.rs | 82 ++++++++++++++++++- 3 files changed, 147 insertions(+), 12 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/machine/client.rs b/nautilus_core/adapters/src/tardis/machine/client.rs index 8de7df68c7bb..2d0ebdc40376 100644 --- a/nautilus_core/adapters/src/tardis/machine/client.rs +++ b/nautilus_core/adapters/src/tardis/machine/client.rs @@ -21,12 +21,16 @@ use std::{ }, }; -use futures_util::Stream; +use futures_util::{pin_mut, Stream, StreamExt}; +use nautilus_model::data::Data; -use super::{replay_normalized, Error, ReplayNormalizedRequestOptions}; -use crate::tardis::machine::enums::{Exchange, WsMessage}; +use super::{ + enums::WsMessage, replay_normalized, stream_normalized, Error, ReplayNormalizedRequestOptions, + StreamNormalizedRequestOptions, +}; +use crate::tardis::machine::{enums::Exchange, parse::parse_tardis_ws_message}; -pub type Result = std::result::Result; +// pub type Result = std::result::Result; pub struct TardisInstrument { pub symbol: String, @@ -39,9 +43,9 @@ pub struct TardisInstrument { pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.adapters") )] pub struct TardisClient { - base_url: String, - replay_signal: Arc, - stream_signals: HashMap>, + pub base_url: String, + pub replay_signal: Arc, + pub stream_signals: HashMap>, } impl TardisClient { @@ -60,13 +64,56 @@ impl TardisClient { for signal in self.stream_signals.values() { signal.store(true, Ordering::Relaxed); } - tracing::info!("All signals set to true, shutting down."); + tracing::info!("All signals set to true, shutting down"); } - pub async fn start_replay( + pub async fn replay( &self, options: Vec, - ) -> Result>> { - replay_normalized(&self.base_url, options, self.replay_signal.clone()).await + ) -> impl Stream { + let stream = replay_normalized(&self.base_url, options, self.replay_signal.clone()) + .await + .expect("Failed to connect to WebSocket"); + + // We use Box::pin to heap-allocate the stream and ensure it implements + // Unpin for safe async handling across lifetimes. + handle_ws_stream(Box::pin(stream)) + } + + pub async fn stream( + &self, + options: Vec, + ) -> impl Stream { + let stream = stream_normalized(&self.base_url, options, self.replay_signal.clone()) + .await + .expect("Failed to connect to WebSocket"); + + // We use Box::pin to heap-allocate the stream and ensure it implements + // Unpin for safe async handling across lifetimes. + handle_ws_stream(Box::pin(stream)) + } +} + +fn handle_ws_stream(stream: S) -> impl Stream +where + S: Stream> + Unpin, +{ + async_stream::stream! { + pin_mut!(stream); + while let Some(result) = stream.next().await { + match result { + Ok(msg) => { + if let Some(data) = parse_tardis_ws_message(msg, 0, 0) { + yield data; + } else { + continue; + } + } + Err(e) => { + tracing::error!("Error in WebSocket stream: {e:?}"); + break; + } + } + } } } diff --git a/nautilus_core/adapters/src/tardis/machine/mod.rs b/nautilus_core/adapters/src/tardis/machine/mod.rs index d55ba90574e4..1aa2f06c6791 100644 --- a/nautilus_core/adapters/src/tardis/machine/mod.rs +++ b/nautilus_core/adapters/src/tardis/machine/mod.rs @@ -44,6 +44,10 @@ pub use crate::tardis::machine::client::TardisClient; /// The options that can be specified for calling Tardis Machine Server's replay-normalized. #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] +#[cfg_attr( + feature = "python", + pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.adapters") +)] pub struct ReplayNormalizedRequestOptions { /// Requested [`Exchange`]. pub exchange: Exchange, @@ -69,6 +73,10 @@ pub struct ReplayNormalizedRequestOptions { /// The options that can be specified for calling Tardis Machine Server's stream-normalized. #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] +#[cfg_attr( + feature = "python", + pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.adapters") +)] pub struct StreamNormalizedRequestOptions { /// Requested [`Exchange`]. pub exchange: Exchange, diff --git a/nautilus_core/adapters/src/tardis/python/machine.rs b/nautilus_core/adapters/src/tardis/python/machine.rs index b2d2e671059d..983baeb73616 100644 --- a/nautilus_core/adapters/src/tardis/python/machine.rs +++ b/nautilus_core/adapters/src/tardis/python/machine.rs @@ -13,9 +13,15 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- +use futures_util::{pin_mut, Stream, StreamExt}; +use nautilus_core::python::{to_pyruntime_err, to_pyvalue_err}; +use nautilus_model::python::data::data_to_pycapsule; use pyo3::prelude::*; -use crate::tardis::machine::client::TardisClient; +use crate::tardis::machine::{ + client::TardisClient, enums::WsMessage, parse::parse_tardis_ws_message, replay_normalized, + stream_normalized, Error, ReplayNormalizedRequestOptions, StreamNormalizedRequestOptions, +}; #[pymethods] impl TardisClient { @@ -28,4 +34,78 @@ impl TardisClient { fn py_close(&mut self) { self.close() } + + #[pyo3(name = "replay")] + fn py_replay<'py>( + &self, + options: Vec, + callback: PyObject, + py: Python<'py>, + ) -> PyResult> { + let base_url = self.base_url.clone(); + let replay_signal = self.replay_signal.clone(); + + pyo3_asyncio_0_21::tokio::future_into_py(py, async move { + let stream = replay_normalized(&base_url, options, replay_signal) + .await + .expect("Failed to connect to WebSocket"); + + handle_python_stream(Box::pin(stream), callback).await; + Ok(()) + }) + } + + #[pyo3(name = "stream")] + fn py_stream<'py>( + &self, + options: Vec, + callback: PyObject, + py: Python<'py>, + ) -> PyResult> { + let base_url = self.base_url.clone(); + let replay_signal = self.replay_signal.clone(); + + pyo3_asyncio_0_21::tokio::future_into_py(py, async move { + let stream = stream_normalized(&base_url, options, replay_signal) + .await + .expect("Failed to connect to WebSocket"); + + handle_python_stream(Box::pin(stream), callback).await; + Ok(()) + }) + } +} + +async fn handle_python_stream(mut stream: S, callback: PyObject) +where + S: Stream> + Unpin, +{ + pin_mut!(stream); + + while let Some(result) = stream.next().await { + match result { + Ok(msg) => { + if let Some(data) = parse_tardis_ws_message(msg, 0, 0) { + Python::with_gil(|py| { + let py_obj = data_to_pycapsule(py, data); + call_python(py, &callback, py_obj); + }); + } else { + continue; + } + } + Err(e) => { + tracing::error!("Error in WebSocket stream: {e:?}"); + break; + } + } + } +} + +pub fn call_python(py: Python, callback: &PyObject, py_obj: PyObject) -> PyResult<()> { + callback.call1(py, (py_obj,)).map_err(|e| { + tracing::error!("Error calling Python: {e}"); + e + })?; + Ok(()) } From 4033e812f335990132de48591b64c6de6d8951a0 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 21 Oct 2024 17:59:06 +1100 Subject: [PATCH 215/224] Refine Tardis replay example --- .../adapters/src/tardis/bin/example.rs | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/bin/example.rs b/nautilus_core/adapters/src/tardis/bin/example.rs index c9548e73f3cf..a7e189e3dba6 100644 --- a/nautilus_core/adapters/src/tardis/bin/example.rs +++ b/nautilus_core/adapters/src/tardis/bin/example.rs @@ -13,15 +13,10 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- -use std::sync::{ - atomic::{AtomicBool, Ordering}, - Arc, -}; - use chrono::NaiveDate; use futures_util::{pin_mut, StreamExt}; use nautilus_adapters::tardis::machine::{ - enums::Exchange, replay_normalized, ReplayNormalizedRequestOptions, + enums::Exchange, ReplayNormalizedRequestOptions, TardisClient, }; #[tokio::main] @@ -40,20 +35,24 @@ async fn main() { with_disconnect_messages: Some(true), }]; - let signal = Arc::new(AtomicBool::new(false)); - let stream = replay_normalized(&base_url, options, signal.clone()) - .await - .unwrap(); + let mut client = TardisClient::new(base_url.clone()); + + // Signal to stop after a number of messages + let stop_count = 100; + let mut counter = 0; + // Start the replay and receive the stream of messages + let stream = client.replay(options).await; pin_mut!(stream); - let stop_count = 100; - let mut counter = 1; while let Some(msg) = stream.next().await { - println!("Received message: {msg:?}"); + println!("Received message: {:?}", msg); + counter += 1; if counter >= stop_count { - signal.store(true, Ordering::Relaxed); + client.close(); } } + + tracing::info!("Stopped after receiving {stop_count} messages."); } From 3861dd2ffce66a8057f1b25cb7ee6b67d83e0c12 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 21 Oct 2024 18:12:43 +1100 Subject: [PATCH 216/224] Cleanups --- nautilus_core/adapters/src/tardis/bin/example.rs | 4 ++-- nautilus_core/adapters/src/tardis/machine/client.rs | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/bin/example.rs b/nautilus_core/adapters/src/tardis/bin/example.rs index a7e189e3dba6..7e6477ab41c2 100644 --- a/nautilus_core/adapters/src/tardis/bin/example.rs +++ b/nautilus_core/adapters/src/tardis/bin/example.rs @@ -22,7 +22,7 @@ use nautilus_adapters::tardis::machine::{ #[tokio::main] async fn main() { tracing_subscriber::fmt() - .with_max_level(tracing::Level::TRACE) + .with_max_level(tracing::Level::DEBUG) .init(); let base_url = std::env::var("TARDIS_MACHINE_WS_URL").unwrap(); @@ -46,7 +46,7 @@ async fn main() { pin_mut!(stream); while let Some(msg) = stream.next().await { - println!("Received message: {:?}", msg); + println!("Received message: {msg:?}"); counter += 1; if counter >= stop_count { diff --git a/nautilus_core/adapters/src/tardis/machine/client.rs b/nautilus_core/adapters/src/tardis/machine/client.rs index 2d0ebdc40376..9f03bc0cd830 100644 --- a/nautilus_core/adapters/src/tardis/machine/client.rs +++ b/nautilus_core/adapters/src/tardis/machine/client.rs @@ -30,8 +30,6 @@ use super::{ }; use crate::tardis::machine::{enums::Exchange, parse::parse_tardis_ws_message}; -// pub type Result = std::result::Result; - pub struct TardisInstrument { pub symbol: String, pub exchange: Exchange, From 90c28c17c544340ce4bdd8b1acc20636e61e6925 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 21 Oct 2024 18:13:22 +1100 Subject: [PATCH 217/224] Add Box::pin comments --- nautilus_core/adapters/src/tardis/python/machine.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nautilus_core/adapters/src/tardis/python/machine.rs b/nautilus_core/adapters/src/tardis/python/machine.rs index 983baeb73616..009595bc29da 100644 --- a/nautilus_core/adapters/src/tardis/python/machine.rs +++ b/nautilus_core/adapters/src/tardis/python/machine.rs @@ -50,6 +50,8 @@ impl TardisClient { .await .expect("Failed to connect to WebSocket"); + // We use Box::pin to heap-allocate the stream and ensure it implements + // Unpin for safe async handling across lifetimes. handle_python_stream(Box::pin(stream), callback).await; Ok(()) }) @@ -70,6 +72,8 @@ impl TardisClient { .await .expect("Failed to connect to WebSocket"); + // We use Box::pin to heap-allocate the stream and ensure it implements + // Unpin for safe async handling across lifetimes. handle_python_stream(Box::pin(stream), callback).await; Ok(()) }) From a8bd8183488bd46b886431e1511b8358a8f5abd0 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Mon, 21 Oct 2024 19:43:33 +1100 Subject: [PATCH 218/224] Refine Tardis streams processing --- .../adapters/src/tardis/bin/example.rs | 25 ++++- .../adapters/src/tardis/machine/client.rs | 98 +++++++++++++++---- .../adapters/src/tardis/machine/mod.rs | 13 +++ .../adapters/src/tardis/machine/parse.rs | 98 +++++-------------- .../adapters/src/tardis/python/machine.rs | 55 ++++++++--- 5 files changed, 184 insertions(+), 105 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/bin/example.rs b/nautilus_core/adapters/src/tardis/bin/example.rs index 7e6477ab41c2..1508005b36fe 100644 --- a/nautilus_core/adapters/src/tardis/bin/example.rs +++ b/nautilus_core/adapters/src/tardis/bin/example.rs @@ -16,8 +16,9 @@ use chrono::NaiveDate; use futures_util::{pin_mut, StreamExt}; use nautilus_adapters::tardis::machine::{ - enums::Exchange, ReplayNormalizedRequestOptions, TardisClient, + enums::Exchange, ReplayNormalizedRequestOptions, TardisClient, TardisInstrumentInfo, }; +use nautilus_model::identifiers::InstrumentId; #[tokio::main] async fn main() { @@ -26,17 +27,33 @@ async fn main() { .init(); let base_url = std::env::var("TARDIS_MACHINE_WS_URL").unwrap(); + let mut client = TardisClient::new(base_url.clone()); + // TODO: Add instrument info constructor + let instrument_info1 = TardisInstrumentInfo { + instrument_id: InstrumentId::from("XBTUSD.BITMEX"), + price_precision: 1, + size_precision: 0, + }; + let instrument_info2 = TardisInstrumentInfo { + instrument_id: InstrumentId::from("ETHUSD.BITMEX"), + price_precision: 1, + size_precision: 0, + }; + client.add_instrument_info(instrument_info1.clone()); + client.add_instrument_info(instrument_info2.clone()); + let options = vec![ReplayNormalizedRequestOptions { exchange: Exchange::Bitmex, - symbols: Some(vec!["XBTUSD".to_string(), "ETHUSD".to_string()]), + symbols: Some(vec![ + instrument_info1.instrument_id.symbol.to_string(), + instrument_info2.instrument_id.symbol.to_string(), + ]), from: NaiveDate::from_ymd_opt(2019, 10, 1).unwrap(), to: NaiveDate::from_ymd_opt(2019, 10, 2).unwrap(), data_types: vec!["trade".to_string(), "book_change".to_string()], with_disconnect_messages: Some(true), }]; - let mut client = TardisClient::new(base_url.clone()); - // Signal to stop after a number of messages let stop_count = 100; let mut counter = 0; diff --git a/nautilus_core/adapters/src/tardis/machine/client.rs b/nautilus_core/adapters/src/tardis/machine/client.rs index 9f03bc0cd830..30c13730f2ec 100644 --- a/nautilus_core/adapters/src/tardis/machine/client.rs +++ b/nautilus_core/adapters/src/tardis/machine/client.rs @@ -15,6 +15,7 @@ use std::{ collections::HashMap, + str::FromStr, sync::{ atomic::{AtomicBool, Ordering}, Arc, @@ -22,18 +23,14 @@ use std::{ }; use futures_util::{pin_mut, Stream, StreamExt}; -use nautilus_model::data::Data; +use nautilus_model::{data::Data, identifiers::InstrumentId}; use super::{ - enums::WsMessage, replay_normalized, stream_normalized, Error, ReplayNormalizedRequestOptions, - StreamNormalizedRequestOptions, + enums::{Exchange, WsMessage}, + replay_normalized, stream_normalized, Error, ReplayNormalizedRequestOptions, + StreamNormalizedRequestOptions, TardisInstrumentInfo, }; -use crate::tardis::machine::{enums::Exchange, parse::parse_tardis_ws_message}; - -pub struct TardisInstrument { - pub symbol: String, - pub exchange: Exchange, -} +use crate::tardis::machine::parse::parse_tardis_ws_message; /// Provides a client for connecting to a [Tardis Machine Server](https://docs.tardis.dev/api/tardis-machine). #[cfg_attr( @@ -43,7 +40,8 @@ pub struct TardisInstrument { pub struct TardisClient { pub base_url: String, pub replay_signal: Arc, - pub stream_signals: HashMap>, + pub stream_signals: HashMap>, + pub instruments: HashMap, } impl TardisClient { @@ -53,16 +51,29 @@ impl TardisClient { base_url: base_url.to_string(), replay_signal: Arc::new(AtomicBool::new(false)), stream_signals: HashMap::new(), + instruments: HashMap::new(), } } + pub fn add_instrument_info(&mut self, info: TardisInstrumentInfo) { + self.instruments.insert(info.instrument_id, info); + } + + #[must_use] + pub fn is_closed(&self) -> bool { + self.replay_signal.load(Ordering::Relaxed) + } + pub fn close(&mut self) { + tracing::debug!("Closing"); + self.replay_signal.store(true, Ordering::Relaxed); for signal in self.stream_signals.values() { signal.store(true, Ordering::Relaxed); } - tracing::info!("All signals set to true, shutting down"); + + tracing::debug!("Closed"); } pub async fn replay( @@ -75,11 +86,12 @@ impl TardisClient { // We use Box::pin to heap-allocate the stream and ensure it implements // Unpin for safe async handling across lifetimes. - handle_ws_stream(Box::pin(stream)) + handle_ws_stream(Box::pin(stream), None, Some(self.instruments.clone())) } pub async fn stream( &self, + instrument: TardisInstrumentInfo, options: Vec, ) -> impl Stream { let stream = stream_normalized(&self.base_url, options, self.replay_signal.clone()) @@ -88,23 +100,43 @@ impl TardisClient { // We use Box::pin to heap-allocate the stream and ensure it implements // Unpin for safe async handling across lifetimes. - handle_ws_stream(Box::pin(stream)) + handle_ws_stream(Box::pin(stream), Some(instrument), None) } } -fn handle_ws_stream(stream: S) -> impl Stream +fn handle_ws_stream( + stream: S, + instrument: Option, + instrument_map: Option>, +) -> impl Stream where S: Stream> + Unpin, { + assert!( + instrument.is_some() || instrument_map.is_some(), + "Either `instrument` or `instrument_map` must be provided" + ); + async_stream::stream! { pin_mut!(stream); while let Some(result) = stream.next().await { match result { Ok(msg) => { - if let Some(data) = parse_tardis_ws_message(msg, 0, 0) { - yield data; + // TODO: This sequence needs optimizing + let info = if let Some(ref instrument) = instrument { + Some(instrument.clone()) } else { - continue; + instrument_map.as_ref().and_then(|map| determine_instrument_info(&msg, map)) + }; + + if let Some(info) = info { + if let Some(data) = parse_tardis_ws_message(msg, info) { + yield data; + } else { + continue; // Non-data message + } + } else { + continue; // No instrument info } } Err(e) => { @@ -115,3 +147,35 @@ where } } } + +pub fn determine_instrument_info( + msg: &WsMessage, + instrument_map: &HashMap, +) -> Option { + let instrument_id = match msg { + WsMessage::BookChange(msg) => parse_instrument_id_with_enum(&msg.exchange, &msg.symbol), + WsMessage::BookSnapshot(msg) => parse_instrument_id_with_enum(&msg.exchange, &msg.symbol), + WsMessage::Trade(msg) => parse_instrument_id_with_enum(&msg.exchange, &msg.symbol), + WsMessage::Bar(msg) => parse_instrument_id_with_enum(&msg.exchange, &msg.symbol), + WsMessage::DerivativeTicker(_) => return None, + WsMessage::Disconnect(_) => return None, + }; + match instrument_map.get(&instrument_id) { + Some(instr) => Some(instr.clone().clone()), + None => { + tracing::error!("Instrument definition info not available for {instrument_id}"); + None + } + } +} + +#[must_use] +fn parse_instrument_id_with_enum(exchange: &Exchange, symbol: &str) -> InstrumentId { + // TODO: Optimize this + let exchange_str = serde_json::to_string(&exchange) + .unwrap() + .trim_matches('"') + .to_string(); + let venue = exchange_str.split('-').next().unwrap_or(&exchange_str); + InstrumentId::from_str(&format!("{symbol}.{venue}").to_uppercase()).expect("Failed to parse") +} diff --git a/nautilus_core/adapters/src/tardis/machine/mod.rs b/nautilus_core/adapters/src/tardis/machine/mod.rs index 1aa2f06c6791..06de6a91801e 100644 --- a/nautilus_core/adapters/src/tardis/machine/mod.rs +++ b/nautilus_core/adapters/src/tardis/machine/mod.rs @@ -24,6 +24,7 @@ use std::{ use async_stream::stream; use chrono::NaiveDate; use futures_util::{stream::SplitSink, SinkExt, Stream, StreamExt}; +use nautilus_model::identifiers::InstrumentId; use serde::{Deserialize, Serialize}; use tokio::net::TcpStream; use tokio_tungstenite::{ @@ -41,6 +42,18 @@ pub mod parse; pub use crate::tardis::machine::client::TardisClient; +/// Instrument definition information necessary for stream parsing. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[cfg_attr( + feature = "python", + pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.adapters") +)] +pub struct TardisInstrumentInfo { + pub instrument_id: InstrumentId, + pub price_precision: u8, + pub size_precision: u8, +} + /// The options that can be specified for calling Tardis Machine Server's replay-normalized. #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] diff --git a/nautilus_core/adapters/src/tardis/machine/parse.rs b/nautilus_core/adapters/src/tardis/machine/parse.rs index cbedad35961a..b5b7afa98137 100644 --- a/nautilus_core/adapters/src/tardis/machine/parse.rs +++ b/nautilus_core/adapters/src/tardis/machine/parse.rs @@ -33,41 +33,36 @@ use uuid::Uuid; use super::{ enums::WsMessage, message::{BarMsg, BookChangeMsg, BookLevel, BookSnapshotMsg, TradeMsg}, + TardisInstrumentInfo, }; -use crate::tardis::parse::{ - parse_aggressor_side, parse_bar_spec, parse_book_action, parse_instrument_id, -}; +use crate::tardis::parse::{parse_aggressor_side, parse_bar_spec, parse_book_action}; #[must_use] -pub fn parse_tardis_ws_message( - msg: WsMessage, - price_precision: u8, - size_precision: u8, -) -> Option { +pub fn parse_tardis_ws_message(msg: WsMessage, info: TardisInstrumentInfo) -> Option { match msg { WsMessage::BookChange(msg) => Some(Data::Deltas(parse_book_change_msg( msg, - price_precision, - size_precision, - None, // Instrument ID handling TBD + info.price_precision, + info.size_precision, + info.instrument_id, ))), WsMessage::BookSnapshot(msg) => Some(Data::Deltas(parse_book_snapshot_msg( msg, - price_precision, - size_precision, - None, // Instrument ID handling TBD + info.price_precision, + info.size_precision, + info.instrument_id, ))), WsMessage::Trade(msg) => Some(Data::Trade(parse_trade_msg( msg, - price_precision, - size_precision, - None, // Instrument ID handling TBD + info.price_precision, + info.size_precision, + info.instrument_id, ))), WsMessage::Bar(msg) => Some(Data::Bar(parse_bar_msg( msg, - price_precision, - size_precision, - None, // Instrument ID handling TBD + info.price_precision, + info.size_precision, + info.instrument_id, ))), WsMessage::DerivativeTicker(_) => None, WsMessage::Disconnect(_) => None, @@ -79,18 +74,8 @@ pub fn parse_book_change_msg( msg: BookChangeMsg, price_precision: u8, size_precision: u8, - instrument_id: Option, + instrument_id: InstrumentId, ) -> OrderBookDeltas_API { - let temp_exchange_str = serde_json::to_string(&msg.exchange) - .unwrap() - .trim_matches('"') - .to_string(); - - let instrument_id = match &instrument_id { - Some(id) => *id, - None => parse_instrument_id(&temp_exchange_str, &msg.symbol), - }; - parse_book_msg( msg.bids, msg.asks, @@ -108,18 +93,8 @@ pub fn parse_book_snapshot_msg( msg: BookSnapshotMsg, price_precision: u8, size_precision: u8, - instrument_id: Option, + instrument_id: InstrumentId, ) -> OrderBookDeltas_API { - let temp_exchange_str = serde_json::to_string(&msg.exchange) - .unwrap() - .trim_matches('"') - .to_string(); - - let instrument_id = match &instrument_id { - Some(id) => *id, - None => parse_instrument_id(&temp_exchange_str, &msg.symbol), - }; - parse_book_msg( msg.bids, msg.asks, @@ -223,18 +198,8 @@ pub fn parse_trade_msg( msg: TradeMsg, price_precision: u8, size_precision: u8, - instrument_id: Option, + instrument_id: InstrumentId, ) -> TradeTick { - let temp_exchange_str = serde_json::to_string(&msg.exchange) - .unwrap() - .trim_matches('"') - .to_string(); - - let instrument_id = match &instrument_id { - Some(id) => *id, - None => parse_instrument_id(&temp_exchange_str, &msg.symbol), - }; - let price = Price::new(msg.price, price_precision); let size = Quantity::new(msg.amount, size_precision); let aggressor_side = parse_aggressor_side(&msg.side); @@ -258,17 +223,8 @@ pub fn parse_bar_msg( msg: BarMsg, price_precision: u8, size_precision: u8, - instrument_id: Option, + instrument_id: InstrumentId, ) -> Bar { - let temp_exchange_str = serde_json::to_string(&msg.exchange) - .unwrap() - .trim_matches('"') - .to_string(); - - let instrument_id = match &instrument_id { - Some(id) => *id, - None => parse_instrument_id(&temp_exchange_str, &msg.symbol), - }; let spec = parse_bar_spec(&msg.name); let bar_type = BarType::new(instrument_id, spec, AggregationSource::External); @@ -301,11 +257,11 @@ mod tests { let price_precision = 0; let size_precision = 0; - let instrument_id = None; + let instrument_id = InstrumentId::from("XBTUSD.BITMEX"); let deltas = parse_book_change_msg(msg, price_precision, size_precision, instrument_id); assert_eq!(deltas.deltas.len(), 1); - assert_eq!(deltas.instrument_id, InstrumentId::from("XBTUSD.BITMEX")); + assert_eq!(deltas.instrument_id, instrument_id); assert_eq!(deltas.flags, RecordFlag::F_LAST.value()); assert_eq!(deltas.sequence, 0); assert_eq!(deltas.ts_event, UnixNanos::from(1571830193469000000)); @@ -337,13 +293,13 @@ mod tests { let price_precision = 1; let size_precision = 0; - let instrument_id = None; + let instrument_id = InstrumentId::from("XBTUSD.BITMEX"); let deltas = parse_book_snapshot_msg(msg, price_precision, size_precision, instrument_id); let delta_0 = deltas.deltas[0]; let _delta_2 = deltas.deltas[2]; assert_eq!(deltas.deltas.len(), 4); - assert_eq!(deltas.instrument_id, InstrumentId::from("XBTUSD.BITMEX")); + assert_eq!(deltas.instrument_id, instrument_id); assert_eq!( deltas.flags, RecordFlag::F_LAST.value() + RecordFlag::F_SNAPSHOT.value() @@ -351,7 +307,7 @@ mod tests { assert_eq!(deltas.sequence, 0); assert_eq!(deltas.ts_event, UnixNanos::from(1572010786950000000)); assert_eq!(deltas.ts_init, UnixNanos::from(1572010786961000000)); - assert_eq!(delta_0.instrument_id, InstrumentId::from("XBTUSD.BITMEX")); + assert_eq!(delta_0.instrument_id, instrument_id); assert_eq!(delta_0.action, BookAction::Add); assert_eq!(delta_0.order.price, Price::from("7633.5")); assert_eq!(delta_0.order.size, Quantity::from(1906067)); @@ -370,10 +326,10 @@ mod tests { let price_precision = 0; let size_precision = 0; - let instrument_id = None; + let instrument_id = InstrumentId::from("XBTUSD.BITMEX"); let trade = parse_trade_msg(msg, price_precision, size_precision, instrument_id); - assert_eq!(trade.instrument_id, InstrumentId::from("XBTUSD.BITMEX")); + assert_eq!(trade.instrument_id, instrument_id); assert_eq!(trade.price, Price::from("7996")); assert_eq!(trade.size, Quantity::from(50)); assert_eq!(trade.aggressor_side, AggressorSide::Seller); @@ -388,7 +344,7 @@ mod tests { let price_precision = 1; let size_precision = 0; - let instrument_id = None; + let instrument_id = InstrumentId::from("XBTUSD.BITMEX"); let bar = parse_bar_msg(msg, price_precision, size_precision, instrument_id); assert_eq!( diff --git a/nautilus_core/adapters/src/tardis/python/machine.rs b/nautilus_core/adapters/src/tardis/python/machine.rs index 009595bc29da..096592c267ce 100644 --- a/nautilus_core/adapters/src/tardis/python/machine.rs +++ b/nautilus_core/adapters/src/tardis/python/machine.rs @@ -13,14 +13,19 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- +use std::collections::HashMap; + use futures_util::{pin_mut, Stream, StreamExt}; use nautilus_core::python::{to_pyruntime_err, to_pyvalue_err}; -use nautilus_model::python::data::data_to_pycapsule; +use nautilus_model::{identifiers::InstrumentId, python::data::data_to_pycapsule}; use pyo3::prelude::*; use crate::tardis::machine::{ - client::TardisClient, enums::WsMessage, parse::parse_tardis_ws_message, replay_normalized, - stream_normalized, Error, ReplayNormalizedRequestOptions, StreamNormalizedRequestOptions, + client::{determine_instrument_info, TardisClient}, + enums::WsMessage, + parse::parse_tardis_ws_message, + replay_normalized, stream_normalized, Error, ReplayNormalizedRequestOptions, + StreamNormalizedRequestOptions, TardisInstrumentInfo, }; #[pymethods] @@ -30,6 +35,11 @@ impl TardisClient { Ok(Self::new(base_url)) } + #[pyo3(name = "is_closed")] + pub fn py_is_closed(&self) -> bool { + self.is_closed() + } + #[pyo3(name = "close")] fn py_close(&mut self) { self.close() @@ -44,6 +54,7 @@ impl TardisClient { ) -> PyResult> { let base_url = self.base_url.clone(); let replay_signal = self.replay_signal.clone(); + let map = self.instruments.clone(); pyo3_asyncio_0_21::tokio::future_into_py(py, async move { let stream = replay_normalized(&base_url, options, replay_signal) @@ -52,7 +63,7 @@ impl TardisClient { // We use Box::pin to heap-allocate the stream and ensure it implements // Unpin for safe async handling across lifetimes. - handle_python_stream(Box::pin(stream), callback).await; + handle_python_stream(Box::pin(stream), callback, None, Some(map)).await; Ok(()) }) } @@ -60,6 +71,7 @@ impl TardisClient { #[pyo3(name = "stream")] fn py_stream<'py>( &self, + instrument: TardisInstrumentInfo, options: Vec, callback: PyObject, py: Python<'py>, @@ -74,14 +86,18 @@ impl TardisClient { // We use Box::pin to heap-allocate the stream and ensure it implements // Unpin for safe async handling across lifetimes. - handle_python_stream(Box::pin(stream), callback).await; + handle_python_stream(Box::pin(stream), callback, Some(instrument), None).await; Ok(()) }) } } -async fn handle_python_stream(mut stream: S, callback: PyObject) -where +async fn handle_python_stream( + mut stream: S, + callback: PyObject, + instrument: Option, + instrument_map: Option>, +) where S: Stream> + Unpin, { pin_mut!(stream); @@ -89,13 +105,26 @@ where while let Some(result) = stream.next().await { match result { Ok(msg) => { - if let Some(data) = parse_tardis_ws_message(msg, 0, 0) { - Python::with_gil(|py| { - let py_obj = data_to_pycapsule(py, data); - call_python(py, &callback, py_obj); - }); + // TODO: This sequence needs optimizing + let info = if let Some(ref instrument) = instrument { + Some(instrument.clone()) + } else { + instrument_map + .as_ref() + .and_then(|map| determine_instrument_info(&msg, map)) + }; + + if let Some(info) = info { + if let Some(data) = parse_tardis_ws_message(msg, info) { + Python::with_gil(|py| { + let py_obj = data_to_pycapsule(py, data); + call_python(py, &callback, py_obj); + }); + } else { + continue; // Non-data message + } } else { - continue; + continue; // No instrument info } } Err(e) => { From c4635c03fcd6aa4157f0af4f644835568634e2f1 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 22 Oct 2024 06:37:47 +1100 Subject: [PATCH 219/224] Update dependencies --- nautilus_core/Cargo.lock | 82 +++++++++++------------ poetry.lock | 141 +++++++++++++++++++-------------------- pyproject.toml | 2 +- 3 files changed, 112 insertions(+), 113 deletions(-) diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 52df78298552..06d1ce8ff47d 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -383,9 +383,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "103db485efc3e41214fe4fda9f3dbeae2eb9082f48fd236e6095627a9422066e" +checksum = "0cb8f1d480b0ea3783ab015936d2a55c87e219676f0c0b7dec61494043f21857" dependencies = [ "bzip2", "flate2", @@ -418,7 +418,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -429,7 +429,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -590,7 +590,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.80", + "syn 2.0.82", "which", ] @@ -665,7 +665,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", "syn_derive", ] @@ -780,7 +780,7 @@ dependencies = [ "quote", "serde", "serde_json", - "syn 2.0.80", + "syn 2.0.82", "tempfile", "toml", ] @@ -923,7 +923,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -1200,7 +1200,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -1211,7 +1211,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -1593,7 +1593,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -1635,7 +1635,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -1645,7 +1645,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -1929,7 +1929,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -3202,7 +3202,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -3279,7 +3279,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -3496,7 +3496,7 @@ checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -3599,12 +3599,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904afd36257cdb6ce0bee88b7981847bd7b955e5e216bb32f466b302923ad446" +checksum = "910d41a655dac3b764f1ade94821093d3610248694320cd072303a8eedcf221d" dependencies = [ "proc-macro2", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -3789,7 +3789,7 @@ dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -3802,7 +3802,7 @@ dependencies = [ "proc-macro2", "pyo3-build-config", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -4165,7 +4165,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.80", + "syn 2.0.82", "unicode-ident", ] @@ -4404,7 +4404,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -4639,7 +4639,7 @@ checksum = "01b2e185515564f15375f593fb966b5718bc624ba77fe49fa4616ad619690554" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -4704,7 +4704,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -4727,7 +4727,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.80", + "syn 2.0.82", "tempfile", "tokio", "url", @@ -4878,7 +4878,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -4900,9 +4900,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.80" +version = "2.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e185e337f816bc8da115b8afcb3324006ccc82eeaddf35113888d3bd8e44ac" +checksum = "83540f837a8afc019423a8edb95b52a8effe46957ee402287f4292fae35be021" dependencies = [ "proc-macro2", "quote", @@ -4918,7 +4918,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -5036,7 +5036,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -5159,7 +5159,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -5316,7 +5316,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -5376,7 +5376,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" dependencies = [ "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -5432,7 +5432,7 @@ checksum = "560b82d656506509d43abe30e0ba64c56b1953ab3d4fe7ba5902747a7a3cedd5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -5641,7 +5641,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", "wasm-bindgen-shared", ] @@ -5675,7 +5675,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5810,7 +5810,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -5821,7 +5821,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] @@ -6062,7 +6062,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.82", ] [[package]] diff --git a/poetry.lock b/poetry.lock index 47f735f43783..fd8fa82fee14 100644 --- a/poetry.lock +++ b/poetry.lock @@ -927,73 +927,73 @@ files = [ [[package]] name = "coverage" -version = "7.6.3" +version = "7.6.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" files = [ - {file = "coverage-7.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6da42bbcec130b188169107ecb6ee7bd7b4c849d24c9370a0c884cf728d8e976"}, - {file = "coverage-7.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c222958f59b0ae091f4535851cbb24eb57fc0baea07ba675af718fb5302dddb2"}, - {file = "coverage-7.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab84a8b698ad5a6c365b08061920138e7a7dd9a04b6feb09ba1bfae68346ce6d"}, - {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70a6756ce66cd6fe8486c775b30889f0dc4cb20c157aa8c35b45fd7868255c5c"}, - {file = "coverage-7.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c2e6fa98032fec8282f6b27e3f3986c6e05702828380618776ad794e938f53a"}, - {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:921fbe13492caf6a69528f09d5d7c7d518c8d0e7b9f6701b7719715f29a71e6e"}, - {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6d99198203f0b9cb0b5d1c0393859555bc26b548223a769baf7e321a627ed4fc"}, - {file = "coverage-7.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:87cd2e29067ea397a47e352efb13f976eb1b03e18c999270bb50589323294c6e"}, - {file = "coverage-7.6.3-cp310-cp310-win32.whl", hash = "sha256:a3328c3e64ea4ab12b85999eb0779e6139295bbf5485f69d42cf794309e3d007"}, - {file = "coverage-7.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:bca4c8abc50d38f9773c1ec80d43f3768df2e8576807d1656016b9d3eeaa96fd"}, - {file = "coverage-7.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c51ef82302386d686feea1c44dbeef744585da16fcf97deea2a8d6c1556f519b"}, - {file = "coverage-7.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0ca37993206402c6c35dc717f90d4c8f53568a8b80f0bf1a1b2b334f4d488fba"}, - {file = "coverage-7.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c77326300b839c44c3e5a8fe26c15b7e87b2f32dfd2fc9fee1d13604347c9b38"}, - {file = "coverage-7.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e484e479860e00da1f005cd19d1c5d4a813324e5951319ac3f3eefb497cc549"}, - {file = "coverage-7.6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c6c0f4d53ef603397fc894a895b960ecd7d44c727df42a8d500031716d4e8d2"}, - {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:37be7b5ea3ff5b7c4a9db16074dc94523b5f10dd1f3b362a827af66a55198175"}, - {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:43b32a06c47539fe275106b376658638b418c7cfdfff0e0259fbf877e845f14b"}, - {file = "coverage-7.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee77c7bef0724165e795b6b7bf9c4c22a9b8468a6bdb9c6b4281293c6b22a90f"}, - {file = "coverage-7.6.3-cp311-cp311-win32.whl", hash = "sha256:43517e1f6b19f610a93d8227e47790722c8bf7422e46b365e0469fc3d3563d97"}, - {file = "coverage-7.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:04f2189716e85ec9192df307f7c255f90e78b6e9863a03223c3b998d24a3c6c6"}, - {file = "coverage-7.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27bd5f18d8f2879e45724b0ce74f61811639a846ff0e5c0395b7818fae87aec6"}, - {file = "coverage-7.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d546cfa78844b8b9c1c0533de1851569a13f87449897bbc95d698d1d3cb2a30f"}, - {file = "coverage-7.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9975442f2e7a5cfcf87299c26b5a45266ab0696348420049b9b94b2ad3d40234"}, - {file = "coverage-7.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:583049c63106c0555e3ae3931edab5669668bbef84c15861421b94e121878d3f"}, - {file = "coverage-7.6.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2341a78ae3a5ed454d524206a3fcb3cec408c2a0c7c2752cd78b606a2ff15af4"}, - {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a4fb91d5f72b7e06a14ff4ae5be625a81cd7e5f869d7a54578fc271d08d58ae3"}, - {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e279f3db904e3b55f520f11f983cc8dc8a4ce9b65f11692d4718ed021ec58b83"}, - {file = "coverage-7.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa23ce39661a3e90eea5f99ec59b763b7d655c2cada10729ed920a38bfc2b167"}, - {file = "coverage-7.6.3-cp312-cp312-win32.whl", hash = "sha256:52ac29cc72ee7e25ace7807249638f94c9b6a862c56b1df015d2b2e388e51dbd"}, - {file = "coverage-7.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:40e8b1983080439d4802d80b951f4a93d991ef3261f69e81095a66f86cf3c3c6"}, - {file = "coverage-7.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9134032f5aa445ae591c2ba6991d10136a1f533b1d2fa8f8c21126468c5025c6"}, - {file = "coverage-7.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:99670790f21a96665a35849990b1df447993880bb6463a0a1d757897f30da929"}, - {file = "coverage-7.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc7d6b380ca76f5e817ac9eef0c3686e7834c8346bef30b041a4ad286449990"}, - {file = "coverage-7.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7b26757b22faf88fcf232f5f0e62f6e0fd9e22a8a5d0d5016888cdfe1f6c1c4"}, - {file = "coverage-7.6.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c59d6a4a4633fad297f943c03d0d2569867bd5372eb5684befdff8df8522e39"}, - {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f263b18692f8ed52c8de7f40a0751e79015983dbd77b16906e5b310a39d3ca21"}, - {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:79644f68a6ff23b251cae1c82b01a0b51bc40c8468ca9585c6c4b1aeee570e0b"}, - {file = "coverage-7.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71967c35828c9ff94e8c7d405469a1fb68257f686bca7c1ed85ed34e7c2529c4"}, - {file = "coverage-7.6.3-cp313-cp313-win32.whl", hash = "sha256:e266af4da2c1a4cbc6135a570c64577fd3e6eb204607eaff99d8e9b710003c6f"}, - {file = "coverage-7.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:ea52bd218d4ba260399a8ae4bb6b577d82adfc4518b93566ce1fddd4a49d1dce"}, - {file = "coverage-7.6.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8d4c6ea0f498c7c79111033a290d060c517853a7bcb2f46516f591dab628ddd3"}, - {file = "coverage-7.6.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:331b200ad03dbaa44151d74daeb7da2cf382db424ab923574f6ecca7d3b30de3"}, - {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54356a76b67cf8a3085818026bb556545ebb8353951923b88292556dfa9f812d"}, - {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebec65f5068e7df2d49466aab9128510c4867e532e07cb6960075b27658dca38"}, - {file = "coverage-7.6.3-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d33a785ea8354c480515e781554d3be582a86297e41ccbea627a5c632647f2cd"}, - {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f7ddb920106bbbbcaf2a274d56f46956bf56ecbde210d88061824a95bdd94e92"}, - {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:70d24936ca6c15a3bbc91ee9c7fc661132c6f4c9d42a23b31b6686c05073bde5"}, - {file = "coverage-7.6.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c30e42ea11badb147f0d2e387115b15e2bd8205a5ad70d6ad79cf37f6ac08c91"}, - {file = "coverage-7.6.3-cp313-cp313t-win32.whl", hash = "sha256:365defc257c687ce3e7d275f39738dcd230777424117a6c76043459db131dd43"}, - {file = "coverage-7.6.3-cp313-cp313t-win_amd64.whl", hash = "sha256:23bb63ae3f4c645d2d82fa22697364b0046fbafb6261b258a58587441c5f7bd0"}, - {file = "coverage-7.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:da29ceabe3025a1e5a5aeeb331c5b1af686daab4ff0fb4f83df18b1180ea83e2"}, - {file = "coverage-7.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:df8c05a0f574d480947cba11b947dc41b1265d721c3777881da2fb8d3a1ddfba"}, - {file = "coverage-7.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec1e3b40b82236d100d259854840555469fad4db64f669ab817279eb95cd535c"}, - {file = "coverage-7.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4adeb878a374126f1e5cf03b87f66279f479e01af0e9a654cf6d1509af46c40"}, - {file = "coverage-7.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43d6a66e33b1455b98fc7312b124296dad97a2e191c80320587234a77b1b736e"}, - {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1990b1f4e2c402beb317840030bb9f1b6a363f86e14e21b4212e618acdfce7f6"}, - {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:12f9515d875859faedb4144fd38694a761cd2a61ef9603bf887b13956d0bbfbb"}, - {file = "coverage-7.6.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:99ded130555c021d99729fabd4ddb91a6f4cc0707df4b1daf912c7850c373b13"}, - {file = "coverage-7.6.3-cp39-cp39-win32.whl", hash = "sha256:c3a79f56dee9136084cf84a6c7c4341427ef36e05ae6415bf7d787c96ff5eaa3"}, - {file = "coverage-7.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:aac7501ae73d4a02f4b7ac8fcb9dc55342ca98ffb9ed9f2dfb8a25d53eda0e4d"}, - {file = "coverage-7.6.3-pp39.pp310-none-any.whl", hash = "sha256:b9853509b4bf57ba7b1f99b9d866c422c9c5248799ab20e652bbb8a184a38181"}, - {file = "coverage-7.6.3.tar.gz", hash = "sha256:bb7d5fe92bd0dc235f63ebe9f8c6e0884f7360f88f3411bfed1350c872ef2054"}, + {file = "coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07"}, + {file = "coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51"}, + {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea"}, + {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a"}, + {file = "coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa"}, + {file = "coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b"}, + {file = "coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b"}, + {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db"}, + {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522"}, + {file = "coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf"}, + {file = "coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2"}, + {file = "coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27"}, + {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1"}, + {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5"}, + {file = "coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17"}, + {file = "coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9"}, + {file = "coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06"}, + {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21"}, + {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a"}, + {file = "coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e"}, + {file = "coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f"}, + {file = "coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3"}, + {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70"}, + {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef"}, + {file = "coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e"}, + {file = "coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3"}, + {file = "coverage-7.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376"}, + {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111"}, + {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901"}, + {file = "coverage-7.6.4-cp39-cp39-win32.whl", hash = "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09"}, + {file = "coverage-7.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f"}, + {file = "coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e"}, + {file = "coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73"}, ] [package.extras] @@ -1377,13 +1377,13 @@ test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-keys" -version = "0.5.1" +version = "0.6.0" description = "eth-keys: Common API for Ethereum key operations" optional = true python-versions = "<4,>=3.8" files = [ - {file = "eth_keys-0.5.1-py3-none-any.whl", hash = "sha256:ad13d920a2217a49bed3a1a7f54fb0980f53caf86d3bbab2139fd3330a17b97e"}, - {file = "eth_keys-0.5.1.tar.gz", hash = "sha256:2b587e4bbb9ac2195215a7ab0c0fb16042b17d4ec50240ed670bbb8f53da7a48"}, + {file = "eth_keys-0.6.0-py3-none-any.whl", hash = "sha256:b396fdfe048a5bba3ef3990739aec64901eb99901c03921caa774be668b1db6e"}, + {file = "eth_keys-0.6.0.tar.gz", hash = "sha256:ba33230f851d02c894e83989185b21d76152c49b37e35b61b1d8a6d9f1d20430"}, ] [package.dependencies] @@ -1438,20 +1438,19 @@ test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] [[package]] name = "eth-utils" -version = "5.0.0" +version = "5.1.0" description = "eth-utils: Common utility functions for python code that interacts with Ethereum" optional = true python-versions = "<4,>=3.8" files = [ - {file = "eth_utils-5.0.0-py3-none-any.whl", hash = "sha256:99c44eca11db74dbb881a1d70b24cd80436fc62fe527d2f5c3e3cf7932aba7b2"}, - {file = "eth_utils-5.0.0.tar.gz", hash = "sha256:a5eb9555f43f4579eb83cb84f9dda9f3d6663bbd4a5a6b693f8d35045f305a1f"}, + {file = "eth_utils-5.1.0-py3-none-any.whl", hash = "sha256:a99f1f01b51206620904c5af47fac65abc143aebd0a76bdec860381c5a3230f8"}, + {file = "eth_utils-5.1.0.tar.gz", hash = "sha256:84c6314b9cf1fcd526107464bbf487e3f87097a2e753360d5ed319f7d42e3f20"}, ] [package.dependencies] cytoolz = {version = ">=0.10.1", markers = "implementation_name == \"cpython\""} eth-hash = ">=0.3.1" eth-typing = ">=5.0.0" -hexbytes = ">=1.0.0" toolz = {version = ">0.8.2", markers = "implementation_name == \"pypy\""} [package.extras] @@ -4006,4 +4005,4 @@ polymarket = ["py-clob-client"] [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.13" -content-hash = "e3b22acfadf5897b37f3759fdd7aa3308d87ecebb76d8c278907426b1423e393" +content-hash = "bb0955a7faad6cfd25e2167e9dc16f1c4325faae0a400e4effc56aba001c188a" diff --git a/pyproject.toml b/pyproject.toml index b1a906a6b785..0d15b8e066ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,7 +101,7 @@ types-toml = "^0.10.2" optional = true [tool.poetry.group.test.dependencies] -coverage = "^7.6.3" +coverage = "^7.6.4" pytest = "^7.4.4" pytest-aiohttp = "^1.0.5" pytest-asyncio = "==0.21.1" # Pinned due Cython: cannot set '__pytest_asyncio_scoped_event_loop' attribute of immutable type From d136ae3800b04d0226578be663789a458818469d Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 22 Oct 2024 07:13:02 +1100 Subject: [PATCH 220/224] Refine Tardis Machine client --- .../adapters/src/tardis/machine/client.rs | 43 +++++------ .../adapters/src/tardis/machine/enums.rs | 71 +++++++++++++++---- .../adapters/src/tardis/machine/message.rs | 13 ++++ .../adapters/src/tardis/machine/mod.rs | 3 +- .../adapters/src/tardis/machine/parse.rs | 7 +- .../adapters/src/tardis/python/machine.rs | 11 +-- 6 files changed, 100 insertions(+), 48 deletions(-) diff --git a/nautilus_core/adapters/src/tardis/machine/client.rs b/nautilus_core/adapters/src/tardis/machine/client.rs index 30c13730f2ec..003f39798713 100644 --- a/nautilus_core/adapters/src/tardis/machine/client.rs +++ b/nautilus_core/adapters/src/tardis/machine/client.rs @@ -15,7 +15,6 @@ use std::{ collections::HashMap, - str::FromStr, sync::{ atomic::{AtomicBool, Ordering}, Arc, @@ -23,12 +22,14 @@ use std::{ }; use futures_util::{pin_mut, Stream, StreamExt}; -use nautilus_model::{data::Data, identifiers::InstrumentId}; +use nautilus_model::{ + data::Data, + identifiers::{InstrumentId, Symbol, Venue}, +}; use super::{ - enums::{Exchange, WsMessage}, - replay_normalized, stream_normalized, Error, ReplayNormalizedRequestOptions, - StreamNormalizedRequestOptions, TardisInstrumentInfo, + enums::Exchange, message::WsMessage, replay_normalized, stream_normalized, Error, + ReplayNormalizedRequestOptions, StreamNormalizedRequestOptions, TardisInstrumentInfo, }; use crate::tardis::machine::parse::parse_tardis_ws_message; @@ -41,7 +42,7 @@ pub struct TardisClient { pub base_url: String, pub replay_signal: Arc, pub stream_signals: HashMap>, - pub instruments: HashMap, + pub instruments: HashMap>, } impl TardisClient { @@ -56,7 +57,7 @@ impl TardisClient { } pub fn add_instrument_info(&mut self, info: TardisInstrumentInfo) { - self.instruments.insert(info.instrument_id, info); + self.instruments.insert(info.instrument_id, Arc::new(info)); } #[must_use] @@ -100,14 +101,14 @@ impl TardisClient { // We use Box::pin to heap-allocate the stream and ensure it implements // Unpin for safe async handling across lifetimes. - handle_ws_stream(Box::pin(stream), Some(instrument), None) + handle_ws_stream(Box::pin(stream), Some(Arc::new(instrument)), None) } } fn handle_ws_stream( stream: S, - instrument: Option, - instrument_map: Option>, + instrument: Option>, + instrument_map: Option>>, ) -> impl Stream where S: Stream> + Unpin, @@ -150,13 +151,13 @@ where pub fn determine_instrument_info( msg: &WsMessage, - instrument_map: &HashMap, -) -> Option { + instrument_map: &HashMap>, +) -> Option> { let instrument_id = match msg { - WsMessage::BookChange(msg) => parse_instrument_id_with_enum(&msg.exchange, &msg.symbol), - WsMessage::BookSnapshot(msg) => parse_instrument_id_with_enum(&msg.exchange, &msg.symbol), - WsMessage::Trade(msg) => parse_instrument_id_with_enum(&msg.exchange, &msg.symbol), - WsMessage::Bar(msg) => parse_instrument_id_with_enum(&msg.exchange, &msg.symbol), + WsMessage::BookChange(msg) => parse_instrument_id_with_enum(&msg.symbol, &msg.exchange), + WsMessage::BookSnapshot(msg) => parse_instrument_id_with_enum(&msg.symbol, &msg.exchange), + WsMessage::Trade(msg) => parse_instrument_id_with_enum(&msg.symbol, &msg.exchange), + WsMessage::Bar(msg) => parse_instrument_id_with_enum(&msg.symbol, &msg.exchange), WsMessage::DerivativeTicker(_) => return None, WsMessage::Disconnect(_) => return None, }; @@ -170,12 +171,6 @@ pub fn determine_instrument_info( } #[must_use] -fn parse_instrument_id_with_enum(exchange: &Exchange, symbol: &str) -> InstrumentId { - // TODO: Optimize this - let exchange_str = serde_json::to_string(&exchange) - .unwrap() - .trim_matches('"') - .to_string(); - let venue = exchange_str.split('-').next().unwrap_or(&exchange_str); - InstrumentId::from_str(&format!("{symbol}.{venue}").to_uppercase()).expect("Failed to parse") +fn parse_instrument_id_with_enum(symbol: &str, exchange: &Exchange) -> InstrumentId { + InstrumentId::new(Symbol::from(symbol), Venue::from(exchange.as_venue_str())) } diff --git a/nautilus_core/adapters/src/tardis/machine/enums.rs b/nautilus_core/adapters/src/tardis/machine/enums.rs index bab0b84f9fde..47280bf3c7c8 100644 --- a/nautilus_core/adapters/src/tardis/machine/enums.rs +++ b/nautilus_core/adapters/src/tardis/machine/enums.rs @@ -15,10 +15,6 @@ use serde::{Deserialize, Serialize}; -use crate::tardis::machine::message::{ - BarMsg, BookChangeMsg, BookSnapshotMsg, DerivativeTickerMsg, DisconnectMsg, TradeMsg, -}; - #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] /// The type of the symbol eg. Spot, Perpetual, Future, Option. @@ -114,15 +110,60 @@ pub enum Exchange { WooX, } -/// A Tardis Machine Server message type. -#[allow(missing_docs)] -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "snake_case", tag = "type")] -pub enum WsMessage { - BookChange(BookChangeMsg), - BookSnapshot(BookSnapshotMsg), - Trade(TradeMsg), - Bar(BarMsg), - DerivativeTicker(DerivativeTickerMsg), - Disconnect(DisconnectMsg), +impl Exchange { + pub fn as_venue_str(&self) -> &str { + match self { + Self::Ascendex => "ASCENDEX", + Self::Binance => "BINANCE", + Self::BinanceDelivery => "BINANCE", + Self::BinanceDex => "BINANCE", + Self::BinanceFutures => "BINANCE", + Self::BinanceJersey => "BINANCE", + Self::BinanceOptions => "BINANCE", + Self::BinanceUs => "BINANCE", + Self::Bitfinex => "BITFINEX", + Self::BitfinexDerivatives => "BITFINEX", + Self::Bitflyer => "BITFLYER", + Self::Bitmex => "BITMEX", + Self::Bitnomial => "BITNOMIAL", + Self::Bitstamp => "BITSTAMP", + Self::BlockchainCom => "BLOCKCHAIN_COM", + Self::Bybit => "BYBIT", + Self::BybitOptions => "BYBIT", + Self::BybitSpot => "BYBIT", + Self::Coinbase => "COINBASE", + Self::Coinflex => "COINFLEX", + Self::CryptoCom => "CRYPTO_COM", + Self::CryptoComDerivatives => "CRYPTO_COM", + Self::Cryptofacilities => "CRYPTOFACILITIES", + Self::Delta => "DELTA", + Self::Deribit => "DERIBIT", + Self::Dydx => "DYDX", + Self::Ftx => "FTX", + Self::FtxUs => "FTX", + Self::GateIo => "GATEIO", + Self::GateIoFutures => "GATEIO", + Self::Gemini => "GEMINI", + Self::Hitbtc => "HITBTC", + Self::Huobi => "HUOBI", + Self::HuobiDm => "HUOBI", + Self::HuobiDmLinearSwap => "HUOBI", + Self::HuobiDmOptions => "HUOBI", + Self::HuobiDmSwap => "HUOBI", + Self::Kraken => "KRAKEN", + Self::Kucoin => "KUCOIN", + Self::Mango => "MANGO", + Self::Okcoin => "OKCOIN", + Self::Okex => "OKEX", + Self::OkexFutures => "OKEX", + Self::OkexOptions => "OKEX", + Self::OkexSwap => "OKEX", + Self::Phemex => "PHEMEX", + Self::Poloniex => "POLONIEX", + Self::Serum => "SERUM", + Self::StarAtlas => "STARATLAS", + Self::Upbit => "UPBIT", + Self::WooX => "WOOX", + } + } } diff --git a/nautilus_core/adapters/src/tardis/machine/message.rs b/nautilus_core/adapters/src/tardis/machine/message.rs index 887de810e4a1..38484d7e0e35 100644 --- a/nautilus_core/adapters/src/tardis/machine/message.rs +++ b/nautilus_core/adapters/src/tardis/machine/message.rs @@ -171,6 +171,19 @@ pub struct DisconnectMsg { pub local_timestamp: DateTime, } +/// A Tardis Machine Server message type. +#[allow(missing_docs)] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "snake_case", tag = "type")] +pub enum WsMessage { + BookChange(BookChangeMsg), + BookSnapshot(BookSnapshotMsg), + Trade(TradeMsg), + Bar(BarMsg), + DerivativeTicker(DerivativeTickerMsg), + Disconnect(DisconnectMsg), +} + //////////////////////////////////////////////////////////////////////////////// // Tests //////////////////////////////////////////////////////////////////////////////// diff --git a/nautilus_core/adapters/src/tardis/machine/mod.rs b/nautilus_core/adapters/src/tardis/machine/mod.rs index 06de6a91801e..46f6ab370ff2 100644 --- a/nautilus_core/adapters/src/tardis/machine/mod.rs +++ b/nautilus_core/adapters/src/tardis/machine/mod.rs @@ -24,6 +24,7 @@ use std::{ use async_stream::stream; use chrono::NaiveDate; use futures_util::{stream::SplitSink, SinkExt, Stream, StreamExt}; +use message::WsMessage; use nautilus_model::identifiers::InstrumentId; use serde::{Deserialize, Serialize}; use tokio::net::TcpStream; @@ -33,7 +34,7 @@ use tokio_tungstenite::{ MaybeTlsStream, WebSocketStream, }; -use super::machine::enums::{Exchange, WsMessage}; +use super::machine::enums::Exchange; pub mod client; pub mod enums; diff --git a/nautilus_core/adapters/src/tardis/machine/parse.rs b/nautilus_core/adapters/src/tardis/machine/parse.rs index b5b7afa98137..94f52b351646 100644 --- a/nautilus_core/adapters/src/tardis/machine/parse.rs +++ b/nautilus_core/adapters/src/tardis/machine/parse.rs @@ -13,6 +13,8 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- +use std::sync::Arc; + use chrono::{DateTime, Utc}; use nautilus_core::nanos::UnixNanos; use nautilus_model::{ @@ -31,14 +33,13 @@ use nautilus_model::{ use uuid::Uuid; use super::{ - enums::WsMessage, - message::{BarMsg, BookChangeMsg, BookLevel, BookSnapshotMsg, TradeMsg}, + message::{BarMsg, BookChangeMsg, BookLevel, BookSnapshotMsg, TradeMsg, WsMessage}, TardisInstrumentInfo, }; use crate::tardis::parse::{parse_aggressor_side, parse_bar_spec, parse_book_action}; #[must_use] -pub fn parse_tardis_ws_message(msg: WsMessage, info: TardisInstrumentInfo) -> Option { +pub fn parse_tardis_ws_message(msg: WsMessage, info: Arc) -> Option { match msg { WsMessage::BookChange(msg) => Some(Data::Deltas(parse_book_change_msg( msg, diff --git a/nautilus_core/adapters/src/tardis/python/machine.rs b/nautilus_core/adapters/src/tardis/python/machine.rs index 096592c267ce..14bda8748c60 100644 --- a/nautilus_core/adapters/src/tardis/python/machine.rs +++ b/nautilus_core/adapters/src/tardis/python/machine.rs @@ -13,7 +13,7 @@ // limitations under the License. // ------------------------------------------------------------------------------------------------- -use std::collections::HashMap; +use std::{collections::HashMap, sync::Arc}; use futures_util::{pin_mut, Stream, StreamExt}; use nautilus_core::python::{to_pyruntime_err, to_pyvalue_err}; @@ -22,7 +22,7 @@ use pyo3::prelude::*; use crate::tardis::machine::{ client::{determine_instrument_info, TardisClient}, - enums::WsMessage, + message::WsMessage, parse::parse_tardis_ws_message, replay_normalized, stream_normalized, Error, ReplayNormalizedRequestOptions, StreamNormalizedRequestOptions, TardisInstrumentInfo, @@ -86,7 +86,8 @@ impl TardisClient { // We use Box::pin to heap-allocate the stream and ensure it implements // Unpin for safe async handling across lifetimes. - handle_python_stream(Box::pin(stream), callback, Some(instrument), None).await; + handle_python_stream(Box::pin(stream), callback, Some(Arc::new(instrument)), None) + .await; Ok(()) }) } @@ -95,8 +96,8 @@ impl TardisClient { async fn handle_python_stream( mut stream: S, callback: PyObject, - instrument: Option, - instrument_map: Option>, + instrument: Option>, + instrument_map: Option>>, ) where S: Stream> + Unpin, { From 9f712da3276f4e16a4df61be4590a70c73394fc5 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 22 Oct 2024 13:55:22 +1100 Subject: [PATCH 221/224] Upgrade Poetry --- .docker/nautilus_trader.dockerfile | 2 +- poetry-version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.docker/nautilus_trader.dockerfile b/.docker/nautilus_trader.dockerfile index 3a65096d8274..311682ca380f 100644 --- a/.docker/nautilus_trader.dockerfile +++ b/.docker/nautilus_trader.dockerfile @@ -5,7 +5,7 @@ ENV PYTHONUNBUFFERED=1 \ PIP_DISABLE_PIP_VERSION_CHECK=on \ PIP_DEFAULT_TIMEOUT=100 \ PYO3_PYTHON="/usr/local/bin/python3" \ - POETRY_VERSION=1.8.3 \ + POETRY_VERSION=1.8.4 \ POETRY_HOME="/opt/poetry" \ POETRY_VIRTUALENVS_CREATE=false \ POETRY_NO_INTERACTION=1 \ diff --git a/poetry-version b/poetry-version index a7ee35a3ea70..bfa363e76ed7 100644 --- a/poetry-version +++ b/poetry-version @@ -1 +1 @@ -1.8.3 +1.8.4 From 94fab8ea7dde3fc7bbedb7fa385b8e851fde1969 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 22 Oct 2024 14:14:08 +1100 Subject: [PATCH 222/224] Update dependencies --- .pre-commit-config.yaml | 2 +- nautilus_core/Cargo.lock | 4 +- nautilus_core/Cargo.toml | 2 +- poetry.lock | 262 +++++++++++++++++++++------------------ pyproject.toml | 4 +- 5 files changed, 147 insertions(+), 127 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0ae5b0e9fc61..09b4d565c5b3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -112,7 +112,7 @@ repos: ] - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.12.0 + rev: v1.12.1 hooks: - id: mypy args: [ diff --git a/nautilus_core/Cargo.lock b/nautilus_core/Cargo.lock index 06d1ce8ff47d..1f980e76f7ef 100644 --- a/nautilus_core/Cargo.lock +++ b/nautilus_core/Cargo.lock @@ -732,9 +732,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" dependencies = [ "serde", ] diff --git a/nautilus_core/Cargo.toml b/nautilus_core/Cargo.toml index 330187427fe7..2f30505cf545 100644 --- a/nautilus_core/Cargo.toml +++ b/nautilus_core/Cargo.toml @@ -30,7 +30,7 @@ documentation = "https://nautilustrader.io/docs" anyhow = "1.0.90" async-stream = "0.3.6" base64 = "0.22.1" -bytes = { version = "1.7.2", features = ["serde"] } +bytes = { version = "1.8.0", features = ["serde"] } chrono = { version = "0.4.38", features = ["serde"] } derive_builder = "0.20.2" futures = "0.3.31" diff --git a/poetry.lock b/poetry.lock index fd8fa82fee14..8fd9c6ef345c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -2814,6 +2814,19 @@ files = [ {file = "pyarrow-17.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:392bc9feabc647338e6c89267635e111d71edad5fcffba204425a7c8d13610d7"}, {file = "pyarrow-17.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:af5ff82a04b2171415f1410cff7ebb79861afc5dae50be73ce06d6e870615204"}, {file = "pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:edca18eaca89cd6382dfbcff3dd2d87633433043650c07375d095cd3517561d8"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c7916bff914ac5d4a8fe25b7a25e432ff921e72f6f2b7547d1e325c1ad9d155"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f553ca691b9e94b202ff741bdd40f6ccb70cdd5fbf65c187af132f1317de6145"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0cdb0e627c86c373205a2f94a510ac4376fdc523f8bb36beab2e7f204416163c"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:d7d192305d9d8bc9082d10f361fc70a73590a4c65cf31c3e6926cd72b76bc35c"}, + {file = "pyarrow-17.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:02dae06ce212d8b3244dd3e7d12d9c4d3046945a5933d28026598e9dbbda1fca"}, + {file = "pyarrow-17.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:13d7a460b412f31e4c0efa1148e1d29bdf18ad1411eb6757d38f8fbdcc8645fb"}, + {file = "pyarrow-17.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b564a51fbccfab5a04a80453e5ac6c9954a9c5ef2890d1bcf63741909c3f8df"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32503827abbc5aadedfa235f5ece8c4f8f8b0a3cf01066bc8d29de7539532687"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a155acc7f154b9ffcc85497509bcd0d43efb80d6f733b0dc3bb14e281f131c8b"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:dec8d129254d0188a49f8a1fc99e0560dc1b85f60af729f47de4046015f9b0a5"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a48ddf5c3c6a6c505904545c25a4ae13646ae1f8ba703c4df4a1bfe4f4006bda"}, + {file = "pyarrow-17.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:42bf93249a083aca230ba7e2786c5f673507fa97bbd9725a1e2754715151a204"}, + {file = "pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28"}, ] [package.dependencies] @@ -3821,47 +3834,54 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvloop" -version = "0.20.0" +version = "0.21.0" description = "Fast implementation of asyncio event loop on top of libuv" optional = false python-versions = ">=3.8.0" files = [ - {file = "uvloop-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9ebafa0b96c62881d5cafa02d9da2e44c23f9f0cd829f3a32a6aff771449c996"}, - {file = "uvloop-0.20.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:35968fc697b0527a06e134999eef859b4034b37aebca537daeb598b9d45a137b"}, - {file = "uvloop-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b16696f10e59d7580979b420eedf6650010a4a9c3bd8113f24a103dfdb770b10"}, - {file = "uvloop-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b04d96188d365151d1af41fa2d23257b674e7ead68cfd61c725a422764062ae"}, - {file = "uvloop-0.20.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94707205efbe809dfa3a0d09c08bef1352f5d3d6612a506f10a319933757c006"}, - {file = "uvloop-0.20.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89e8d33bb88d7263f74dc57d69f0063e06b5a5ce50bb9a6b32f5fcbe655f9e73"}, - {file = "uvloop-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e50289c101495e0d1bb0bfcb4a60adde56e32f4449a67216a1ab2750aa84f037"}, - {file = "uvloop-0.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e237f9c1e8a00e7d9ddaa288e535dc337a39bcbf679f290aee9d26df9e72bce9"}, - {file = "uvloop-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:746242cd703dc2b37f9d8b9f173749c15e9a918ddb021575a0205ec29a38d31e"}, - {file = "uvloop-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82edbfd3df39fb3d108fc079ebc461330f7c2e33dbd002d146bf7c445ba6e756"}, - {file = "uvloop-0.20.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:80dc1b139516be2077b3e57ce1cb65bfed09149e1d175e0478e7a987863b68f0"}, - {file = "uvloop-0.20.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f44af67bf39af25db4c1ac27e82e9665717f9c26af2369c404be865c8818dcf"}, - {file = "uvloop-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4b75f2950ddb6feed85336412b9a0c310a2edbcf4cf931aa5cfe29034829676d"}, - {file = "uvloop-0.20.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:77fbc69c287596880ecec2d4c7a62346bef08b6209749bf6ce8c22bbaca0239e"}, - {file = "uvloop-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6462c95f48e2d8d4c993a2950cd3d31ab061864d1c226bbf0ee2f1a8f36674b9"}, - {file = "uvloop-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649c33034979273fa71aa25d0fe120ad1777c551d8c4cd2c0c9851d88fcb13ab"}, - {file = "uvloop-0.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a609780e942d43a275a617c0839d85f95c334bad29c4c0918252085113285b5"}, - {file = "uvloop-0.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aea15c78e0d9ad6555ed201344ae36db5c63d428818b4b2a42842b3870127c00"}, - {file = "uvloop-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0e94b221295b5e69de57a1bd4aeb0b3a29f61be6e1b478bb8a69a73377db7ba"}, - {file = "uvloop-0.20.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fee6044b64c965c425b65a4e17719953b96e065c5b7e09b599ff332bb2744bdf"}, - {file = "uvloop-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:265a99a2ff41a0fd56c19c3838b29bf54d1d177964c300dad388b27e84fd7847"}, - {file = "uvloop-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10c2956efcecb981bf9cfb8184d27d5d64b9033f917115a960b83f11bfa0d6b"}, - {file = "uvloop-0.20.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e7d61fe8e8d9335fac1bf8d5d82820b4808dd7a43020c149b63a1ada953d48a6"}, - {file = "uvloop-0.20.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2beee18efd33fa6fdb0976e18475a4042cd31c7433c866e8a09ab604c7c22ff2"}, - {file = "uvloop-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d8c36fdf3e02cec92aed2d44f63565ad1522a499c654f07935c8f9d04db69e95"}, - {file = "uvloop-0.20.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0fac7be202596c7126146660725157d4813aa29a4cc990fe51346f75ff8fde7"}, - {file = "uvloop-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d0fba61846f294bce41eb44d60d58136090ea2b5b99efd21cbdf4e21927c56a"}, - {file = "uvloop-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95720bae002ac357202e0d866128eb1ac82545bcf0b549b9abe91b5178d9b541"}, - {file = "uvloop-0.20.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:36c530d8fa03bfa7085af54a48f2ca16ab74df3ec7108a46ba82fd8b411a2315"}, - {file = "uvloop-0.20.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e97152983442b499d7a71e44f29baa75b3b02e65d9c44ba53b10338e98dedb66"}, - {file = "uvloop-0.20.0.tar.gz", hash = "sha256:4603ca714a754fc8d9b197e325db25b2ea045385e8a3ad05d3463de725fdf469"}, -] - -[package.extras] + {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ec7e6b09a6fdded42403182ab6b832b71f4edaf7f37a9a0e371a01db5f0cb45f"}, + {file = "uvloop-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:196274f2adb9689a289ad7d65700d37df0c0930fd8e4e743fa4834e850d7719d"}, + {file = "uvloop-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f38b2e090258d051d68a5b14d1da7203a3c3677321cf32a95a6f4db4dd8b6f26"}, + {file = "uvloop-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c43e0f13022b998eb9b973b5e97200c8b90823454d4bc06ab33829e09fb9bb"}, + {file = "uvloop-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10d66943def5fcb6e7b37310eb6b5639fd2ccbc38df1177262b0640c3ca68c1f"}, + {file = "uvloop-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:67dd654b8ca23aed0a8e99010b4c34aca62f4b7fce88f39d452ed7622c94845c"}, + {file = "uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8"}, + {file = "uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0"}, + {file = "uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e"}, + {file = "uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb"}, + {file = "uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6"}, + {file = "uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d"}, + {file = "uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c"}, + {file = "uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2"}, + {file = "uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d"}, + {file = "uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc"}, + {file = "uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb"}, + {file = "uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f"}, + {file = "uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281"}, + {file = "uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af"}, + {file = "uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6"}, + {file = "uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816"}, + {file = "uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc"}, + {file = "uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553"}, + {file = "uvloop-0.21.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:17df489689befc72c39a08359efac29bbee8eee5209650d4b9f34df73d22e414"}, + {file = "uvloop-0.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc09f0ff191e61c2d592a752423c767b4ebb2986daa9ed62908e2b1b9a9ae206"}, + {file = "uvloop-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0ce1b49560b1d2d8a2977e3ba4afb2414fb46b86a1b64056bc4ab929efdafbe"}, + {file = "uvloop-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e678ad6fe52af2c58d2ae3c73dc85524ba8abe637f134bf3564ed07f555c5e79"}, + {file = "uvloop-0.21.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:460def4412e473896ef179a1671b40c039c7012184b627898eea5072ef6f017a"}, + {file = "uvloop-0.21.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:10da8046cc4a8f12c91a1c39d1dd1585c41162a15caaef165c2174db9ef18bdc"}, + {file = "uvloop-0.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c097078b8031190c934ed0ebfee8cc5f9ba9642e6eb88322b9958b649750f72b"}, + {file = "uvloop-0.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:46923b0b5ee7fc0020bef24afe7836cb068f5050ca04caf6b487c513dc1a20b2"}, + {file = "uvloop-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53e420a3afe22cdcf2a0f4846e377d16e718bc70103d7088a4f7623567ba5fb0"}, + {file = "uvloop-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88cb67cdbc0e483da00af0b2c3cdad4b7c61ceb1ee0f33fe00e09c81e3a6cb75"}, + {file = "uvloop-0.21.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:221f4f2a1f46032b403bf3be628011caf75428ee3cc204a22addf96f586b19fd"}, + {file = "uvloop-0.21.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2d1f581393673ce119355d56da84fe1dd9d2bb8b3d13ce792524e1607139feff"}, + {file = "uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3"}, +] + +[package.extras] +dev = ["Cython (>=3.0,<4.0)", "setuptools (>=60)"] docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] +test = ["aiohttp (>=3.10.5)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] [[package]] name = "v4-proto" @@ -3901,93 +3921,93 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "yarl" -version = "1.15.5" +version = "1.16.0" description = "Yet another URL library" optional = false python-versions = ">=3.9" files = [ - {file = "yarl-1.15.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b6c57972a406ea0f61e3f28f2b3a780fb71fbe1d82d267afe5a2f889a83ee7e7"}, - {file = "yarl-1.15.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c3ac5bdcc1375c8ee52784adf94edbce37c471dd2100a117cfef56fe8dbc2b4"}, - {file = "yarl-1.15.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:68d21d0563d82aaf46163eac529adac301b20be3181b8a2811f7bd5615466055"}, - {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7d317fb80bc17ed4b34a9aad8b80cef34bea0993654f3e8566daf323def7ef9"}, - {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed9c72d5361cfd5af5ccadffa8f8077f4929640e1f938aa0f4b92c5a24996ac5"}, - {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bb707859218e8335447b210f41a755e7b1367c33e87add884128bba144694a7f"}, - {file = "yarl-1.15.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6563394492c96cb57f4dff0c69c63d2b28b5469c59c66f35a1e6451583cd0ab4"}, - {file = "yarl-1.15.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c2d1109c8d92059314cc34dd8f0a31f74b720dc140744923ed7ca228bf9b491"}, - {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8fc727f0fb388debc771eaa7091c092bd2e8b6b4741b73354b8efadcf96d6031"}, - {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:94189746c5ad62e1014a16298130e696fe593d031d442ef135fb7787b7a1f820"}, - {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b06d8b05d0fafef204d635a4711283ddbf19c7c0facdc61b4b775f6e47e2d4be"}, - {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:de6917946dc6bc237d4b354e38aa13a232e0c7948fdbdb160edee3862e9d735f"}, - {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:34816f1d833433a16c4832562a050b0a60eac53dcb71b2032e6ebff82d74b6a7"}, - {file = "yarl-1.15.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:19e2a4b2935f95fad0949f420514c5d862f5f18058fbbfd8854f496a97d9fd87"}, - {file = "yarl-1.15.5-cp310-cp310-win32.whl", hash = "sha256:30ca64521f1a96b72886dd9e8652f16eab11891b4572dcfcfc1ad6d6ccb27abd"}, - {file = "yarl-1.15.5-cp310-cp310-win_amd64.whl", hash = "sha256:86648c53b10c53db8b967a75fb41e0c89dbec7398f6525e34af2b6c456bb0ac0"}, - {file = "yarl-1.15.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e652aa9f8dfa808bc5b2da4d1f4e286cf1d640570fdfa72ffc0c1d16ba114651"}, - {file = "yarl-1.15.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21050b6cd569980fe20ceeab4baeb900d3f7247270475e42bafe117416a5496c"}, - {file = "yarl-1.15.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:18940191ec9a83bbfe63eea61c3e9d12474bb910d5613bce8fa46e84a80b75b2"}, - {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a082dc948045606f62dca0228ab24f13737180b253378d6443f5b2b9ef8beefe"}, - {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a843e692f9d5402b3455653f4607dc521de2385f01c5cad7ba4a87c46e2ea8d"}, - {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5093a453176a4fad4f9c3006f507cf300546190bb3e27944275a37cfd6323a65"}, - {file = "yarl-1.15.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2597a589859b94d0a5e2f5d30fee95081867926e57cb751f8b44a7dd92da4e79"}, - {file = "yarl-1.15.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f5a1ca6eaabfe62718b87eac06d9a47b30cf92ffa065fee9196d3ecd24a3cf1"}, - {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4ac83b307cc4b8907345b52994055c6c3c2601ceb6fcb94c5ed6a93c6b4e8257"}, - {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:325e2beb2cd8654b276e7686a3cd203628dd3fe32d5c616e632bc35a2901fb16"}, - {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:75d04ba8ed335042328086e643e01165e0c24598216f72da709b375930ae3bdb"}, - {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7abd7d15aedb3961a967cc65f8144dbbca42e3626a21c5f4f29919cf43eeafb9"}, - {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:294c742a273f44511f14b03a9e06b66094dcdf4bbb75a5e23fead548fd5310ae"}, - {file = "yarl-1.15.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:63d46606b20f80a6476f1044bab78e1a69c2e0747f174583e2f12fc70bad2170"}, - {file = "yarl-1.15.5-cp311-cp311-win32.whl", hash = "sha256:b1217102a455e3ac9ac293081093f21f0183e978c7692171ff669fee5296fa28"}, - {file = "yarl-1.15.5-cp311-cp311-win_amd64.whl", hash = "sha256:5848500b6a01497560969e8c3a7eb1b2570853c74a0ca6f67ebaf6064106c49b"}, - {file = "yarl-1.15.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d3309ee667f2d9c7ac9ecf44620d6b274bfdd8065b8c5019ff6795dd887b8fed"}, - {file = "yarl-1.15.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:96ce879799fee124d241ea3b84448378f638e290c49493d00b706f3fd57ec22b"}, - {file = "yarl-1.15.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c884dfa56b050f718ea3cbbfd972e29a6f07f63a7449b10d9a20d64f7eec92e2"}, - {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0327081978fe186c3390dd4f73f95f825d0bb9c74967e22c2a1a87735974d8f5"}, - {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:524b3bb7dff320e305bc979c65eddc0342548c56ea9241502f907853fe53c408"}, - {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd56de8b645421ff09c993fdb0ee9c5a3b50d290a8f55793b500d99b34d0c1ce"}, - {file = "yarl-1.15.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c166ad987265bb343be58cdf4fbc4478cc1d81f2246d2be9a15f94393b269faa"}, - {file = "yarl-1.15.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d56980374a10c74255fcea6ebcfb0aeca7166d212ee9fd7e823ddef35fb62ad0"}, - {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cbf36099a9b407e1456dbf55844743a98603fcba32d2a46fb3a698d926facf1b"}, - {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d7fa4b033e2f267e37aabcc36949fa89f9f1716a723395912147f9cf3fb437c7"}, - {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bb129f77ddaea2d8e6e00417b8d907448de3407af4eddacca0a515574ad71493"}, - {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:68e837b3edfcd037f9706157e7cb8efda832de6248c7d9e893e2638356dfae5d"}, - {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5b8af4165e097ff84d9bbb97bb4f4d7f71b9c1c9565a2d0e27d93e5f92dae220"}, - {file = "yarl-1.15.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:70d074d5a96e0954fe6db81ff356f4361397da1cda3f7c127fc0902f671a087e"}, - {file = "yarl-1.15.5-cp312-cp312-win32.whl", hash = "sha256:362da97ad4360e4ef1dd24ccdd3bceb18332da7f40026a42f49b7edd686e31c3"}, - {file = "yarl-1.15.5-cp312-cp312-win_amd64.whl", hash = "sha256:9aa054d97033beac9cb9b19b7c0b8784b85b12cd17879087ca6bffba57884e02"}, - {file = "yarl-1.15.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5fadcf532fd9f6cbad71485ef8c2462dd9a91d3efc72ca01eb0970792c92552a"}, - {file = "yarl-1.15.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8b7dd6983c81523f9de0ae6334c3b7a3cb33283936e0525f80c4f713f54a9bb6"}, - {file = "yarl-1.15.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fcfd663dc88465ebe41c7c938bdc91c4b01cda96a0d64bf38fd66c1877323771"}, - {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd529e637cd23204bd82072f6637cff7af2516ad2c132e8f3342cbc84871f7d1"}, - {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b30f13fac56598474071a4f1ecd66c78fdaf2f8619042d7ca135f72dbb348cf"}, - {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44088ec0be82fba118ed29b6b429f80bf295297727adae4c257ac297e01e8bcd"}, - {file = "yarl-1.15.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607683991bab8607e5158cd290dd8fdaa613442aeab802fe1c237d3a3eee7358"}, - {file = "yarl-1.15.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da48cdff56b01ea4282a6d04b83b07a2088351a4a3ff7aacc1e7e9b6b04b90b9"}, - {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9162ea117ce8bad8ebc95b7376b4135988acd888d2cf4702f8281e3c11f8b81f"}, - {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:e8aa19c39cb20bfb16f0266df175a6004943122cf20707fbf0cacc21f6468a25"}, - {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5d6be369488d503c8edc14e2f63d71ab2a607041ad216a8ad444fa18e8dea792"}, - {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6e2c674cfe4c03ad7a4d536b1f808221f0d11a360486b4b032d2557c0bd633ad"}, - {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:041bafaa82b77fd4ec2826d42a55461ec86d999adf7ed9644eef7e8a9febb366"}, - {file = "yarl-1.15.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2eeb9ba53c055740cd282ae9d34eb7970d65e73a46f15adec4b0c1b0f2e55cc2"}, - {file = "yarl-1.15.5-cp313-cp313-win32.whl", hash = "sha256:73143dd279e641543da52c55652ad7b4c7c5f79e797f124f58f04cc060f14271"}, - {file = "yarl-1.15.5-cp313-cp313-win_amd64.whl", hash = "sha256:94ab1185900f43760d5487c8e49f5f1a66f864e36092f282f1813597479b9dfa"}, - {file = "yarl-1.15.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6b3d2767bd64c62909ea33525b954ba05c8f9726bfdf2141d175da4e344f19ae"}, - {file = "yarl-1.15.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:44359c52af9c383e5107f3b6301446fc8269599721fa42fafb2afb5f31a42dcb"}, - {file = "yarl-1.15.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6493da9ba5c551978c679ab04856c2cf8f79c316e8ec8c503460a135705edc3b"}, - {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a6b6e95bc621c11cf9ff21012173337e789f2461ebc3b4e5bf65c74ef69adb8"}, - {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7983290ede3aaa2c9620879530849532529b4dcbf5b12a0b6a91163a773eadb9"}, - {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07a4b53abe85813c538b9cdbb02909ebe3734e3af466a587df516e960d500cc8"}, - {file = "yarl-1.15.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5882faa2a6e684f65ee44f18c701768749a950cbd5e72db452fc07805f6bdec0"}, - {file = "yarl-1.15.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e27861251d9c094f641d39a8a78dd2371fb9a252ea2f689d1ad353a31d46a0bc"}, - {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8669a110f655c9eb22f16fb68a7d4942020aeaa09f1def584a80183e3e89953c"}, - {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:10bfe0bef4cf5ea0383886beda004071faadedf2647048b9f876664284c5b60d"}, - {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f7de0d4b6b4d8a77e422eb54d765255c0ec6883ee03b8fd537101633948619d7"}, - {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:00bb3a559d7bd006a5302ecd7e409916939106a8cdbe31f4eb5e5b9ffcca57ea"}, - {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:06ec070a2d71415f90dbe9d70af3158e7da97a128519dba2d1581156ee27fb92"}, - {file = "yarl-1.15.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b997a806846c00d1f41d6a251803732837771b2091bead7566f68820e317bfe7"}, - {file = "yarl-1.15.5-cp39-cp39-win32.whl", hash = "sha256:7825506fbee4055265528ec3532a8197ff26fc53d4978917a4c8ddbb4c1667d7"}, - {file = "yarl-1.15.5-cp39-cp39-win_amd64.whl", hash = "sha256:71730658be0b5de7c570a9795d7404c577b2313c1db370407092c66f70e04ccb"}, - {file = "yarl-1.15.5-py3-none-any.whl", hash = "sha256:625f31d6650829fba4030b4e7bdb2d69e41510dddfa29a1da27076c199521757"}, - {file = "yarl-1.15.5.tar.gz", hash = "sha256:8249147ee81c1cf4d1dc6f26ba28a1b9d92751529f83c308ad02164bb93abd0d"}, + {file = "yarl-1.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32468f41242d72b87ab793a86d92f885355bcf35b3355aa650bfa846a5c60058"}, + {file = "yarl-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:234f3a3032b505b90e65b5bc6652c2329ea7ea8855d8de61e1642b74b4ee65d2"}, + {file = "yarl-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a0296040e5cddf074c7f5af4a60f3fc42c0237440df7bcf5183be5f6c802ed5"}, + {file = "yarl-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de6c14dd7c7c0badba48157474ea1f03ebee991530ba742d381b28d4f314d6f3"}, + {file = "yarl-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b140e532fe0266003c936d017c1ac301e72ee4a3fd51784574c05f53718a55d8"}, + {file = "yarl-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:019f5d58093402aa8f6661e60fd82a28746ad6d156f6c5336a70a39bd7b162b9"}, + {file = "yarl-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c42998fd1cbeb53cd985bff0e4bc25fbe55fd6eb3a545a724c1012d69d5ec84"}, + {file = "yarl-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c7c30fb38c300fe8140df30a046a01769105e4cf4282567a29b5cdb635b66c4"}, + {file = "yarl-1.16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e49e0fd86c295e743fd5be69b8b0712f70a686bc79a16e5268386c2defacaade"}, + {file = "yarl-1.16.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:b9ca7b9147eb1365c8bab03c003baa1300599575effad765e0b07dd3501ea9af"}, + {file = "yarl-1.16.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:27e11db3f1e6a51081a981509f75617b09810529de508a181319193d320bc5c7"}, + {file = "yarl-1.16.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8994c42f4ca25df5380ddf59f315c518c81df6a68fed5bb0c159c6cb6b92f120"}, + {file = "yarl-1.16.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:542fa8e09a581bcdcbb30607c7224beff3fdfb598c798ccd28a8184ffc18b7eb"}, + {file = "yarl-1.16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2bd6a51010c7284d191b79d3b56e51a87d8e1c03b0902362945f15c3d50ed46b"}, + {file = "yarl-1.16.0-cp310-cp310-win32.whl", hash = "sha256:178ccb856e265174a79f59721031060f885aca428983e75c06f78aa24b91d929"}, + {file = "yarl-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe8bba2545427418efc1929c5c42852bdb4143eb8d0a46b09de88d1fe99258e7"}, + {file = "yarl-1.16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d8643975a0080f361639787415a038bfc32d29208a4bf6b783ab3075a20b1ef3"}, + {file = "yarl-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:676d96bafc8c2d0039cea0cd3fd44cee7aa88b8185551a2bb93354668e8315c2"}, + {file = "yarl-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d9525f03269e64310416dbe6c68d3b23e5d34aaa8f47193a1c45ac568cecbc49"}, + {file = "yarl-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b37d5ec034e668b22cf0ce1074d6c21fd2a08b90d11b1b73139b750a8b0dd97"}, + {file = "yarl-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f32c4cb7386b41936894685f6e093c8dfaf0960124d91fe0ec29fe439e201d0"}, + {file = "yarl-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b8e265a0545637492a7e12fd7038370d66c9375a61d88c5567d0e044ded9202"}, + {file = "yarl-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:789a3423f28a5fff46fbd04e339863c169ece97c827b44de16e1a7a42bc915d2"}, + {file = "yarl-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1d1f45e3e8d37c804dca99ab3cf4ab3ed2e7a62cd82542924b14c0a4f46d243"}, + {file = "yarl-1.16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:621280719c4c5dad4c1391160a9b88925bb8b0ff6a7d5af3224643024871675f"}, + {file = "yarl-1.16.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ed097b26f18a1f5ff05f661dc36528c5f6735ba4ce8c9645e83b064665131349"}, + {file = "yarl-1.16.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2f1fe2b2e3ee418862f5ebc0c0083c97f6f6625781382f828f6d4e9b614eba9b"}, + {file = "yarl-1.16.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:87dd10bc0618991c66cee0cc65fa74a45f4ecb13bceec3c62d78ad2e42b27a16"}, + {file = "yarl-1.16.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4199db024b58a8abb2cfcedac7b1292c3ad421684571aeb622a02f242280e8d6"}, + {file = "yarl-1.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:99a9dcd4b71dd5f5f949737ab3f356cfc058c709b4f49833aeffedc2652dac56"}, + {file = "yarl-1.16.0-cp311-cp311-win32.whl", hash = "sha256:a9394c65ae0ed95679717d391c862dece9afacd8fa311683fc8b4362ce8a410c"}, + {file = "yarl-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:5b9101f528ae0f8f65ac9d64dda2bb0627de8a50344b2f582779f32fda747c1d"}, + {file = "yarl-1.16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4ffb7c129707dd76ced0a4a4128ff452cecf0b0e929f2668ea05a371d9e5c104"}, + {file = "yarl-1.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1a5e9d8ce1185723419c487758d81ac2bde693711947032cce600ca7c9cda7d6"}, + {file = "yarl-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d743e3118b2640cef7768ea955378c3536482d95550222f908f392167fe62059"}, + {file = "yarl-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26768342f256e6e3c37533bf9433f5f15f3e59e3c14b2409098291b3efaceacb"}, + {file = "yarl-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1b0796168b953bca6600c5f97f5ed407479889a36ad7d17183366260f29a6b9"}, + {file = "yarl-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:858728086914f3a407aa7979cab743bbda1fe2bdf39ffcd991469a370dd7414d"}, + {file = "yarl-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5570e6d47bcb03215baf4c9ad7bf7c013e56285d9d35013541f9ac2b372593e7"}, + {file = "yarl-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66ea8311422a7ba1fc79b4c42c2baa10566469fe5a78500d4e7754d6e6db8724"}, + {file = "yarl-1.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:649bddcedee692ee8a9b7b6e38582cb4062dc4253de9711568e5620d8707c2a3"}, + {file = "yarl-1.16.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3a91654adb7643cb21b46f04244c5a315a440dcad63213033826549fa2435f71"}, + {file = "yarl-1.16.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b439cae82034ade094526a8f692b9a2b5ee936452de5e4c5f0f6c48df23f8604"}, + {file = "yarl-1.16.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:571f781ae8ac463ce30bacebfaef2c6581543776d5970b2372fbe31d7bf31a07"}, + {file = "yarl-1.16.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:aa7943f04f36d6cafc0cf53ea89824ac2c37acbdb4b316a654176ab8ffd0f968"}, + {file = "yarl-1.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1a5cf32539373ff39d97723e39a9283a7277cbf1224f7aef0c56c9598b6486c3"}, + {file = "yarl-1.16.0-cp312-cp312-win32.whl", hash = "sha256:a5b6c09b9b4253d6a208b0f4a2f9206e511ec68dce9198e0fbec4f160137aa67"}, + {file = "yarl-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:1208ca14eed2fda324042adf8d6c0adf4a31522fa95e0929027cd487875f0240"}, + {file = "yarl-1.16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5ace0177520bd4caa99295a9b6fb831d0e9a57d8e0501a22ffaa61b4c024283"}, + {file = "yarl-1.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7118bdb5e3ed81acaa2095cba7ec02a0fe74b52a16ab9f9ac8e28e53ee299732"}, + {file = "yarl-1.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38fec8a2a94c58bd47c9a50a45d321ab2285ad133adefbbadf3012c054b7e656"}, + {file = "yarl-1.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8791d66d81ee45866a7bb15a517b01a2bcf583a18ebf5d72a84e6064c417e64b"}, + {file = "yarl-1.16.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cf936ba67bc6c734f3aa1c01391da74ab7fc046a9f8bbfa230b8393b90cf472"}, + {file = "yarl-1.16.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1aab176dd55b59f77a63b27cffaca67d29987d91a5b615cbead41331e6b7428"}, + {file = "yarl-1.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:995d0759004c08abd5d1b81300a91d18c8577c6389300bed1c7c11675105a44d"}, + {file = "yarl-1.16.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1bc22e00edeb068f71967ab99081e9406cd56dbed864fc3a8259442999d71552"}, + {file = "yarl-1.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:35b4f7842154176523e0a63c9b871168c69b98065d05a4f637fce342a6a2693a"}, + {file = "yarl-1.16.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:7ace71c4b7a0c41f317ae24be62bb61e9d80838d38acb20e70697c625e71f120"}, + {file = "yarl-1.16.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8f639e3f5795a6568aa4f7d2ac6057c757dcd187593679f035adbf12b892bb00"}, + {file = "yarl-1.16.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e8be3aff14f0120ad049121322b107f8a759be76a6a62138322d4c8a337a9e2c"}, + {file = "yarl-1.16.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:122d8e7986043d0549e9eb23c7fd23be078be4b70c9eb42a20052b3d3149c6f2"}, + {file = "yarl-1.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0fd9c227990f609c165f56b46107d0bc34553fe0387818c42c02f77974402c36"}, + {file = "yarl-1.16.0-cp313-cp313-win32.whl", hash = "sha256:595ca5e943baed31d56b33b34736461a371c6ea0038d3baec399949dd628560b"}, + {file = "yarl-1.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:921b81b8d78f0e60242fb3db615ea3f368827a76af095d5a69f1c3366db3f596"}, + {file = "yarl-1.16.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab2b2ac232110a1fdb0d3ffcd087783edd3d4a6ced432a1bf75caf7b7be70916"}, + {file = "yarl-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7f8713717a09acbfee7c47bfc5777e685539fefdd34fa72faf504c8be2f3df4e"}, + {file = "yarl-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cdcffe1dbcb4477d2b4202f63cd972d5baa155ff5a3d9e35801c46a415b7f71a"}, + {file = "yarl-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a91217208306d82357c67daeef5162a41a28c8352dab7e16daa82e3718852a7"}, + {file = "yarl-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ab3ed42c78275477ea8e917491365e9a9b69bb615cb46169020bd0aa5e2d6d3"}, + {file = "yarl-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:707ae579ccb3262dfaef093e202b4c3fb23c3810e8df544b1111bd2401fd7b09"}, + {file = "yarl-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad7a852d1cd0b8d8b37fc9d7f8581152add917a98cfe2ea6e241878795f917ae"}, + {file = "yarl-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3f1cc3d3d4dc574bebc9b387f6875e228ace5748a7c24f49d8f01ac1bc6c31b"}, + {file = "yarl-1.16.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5ff96da263740779b0893d02b718293cc03400c3a208fc8d8cd79d9b0993e532"}, + {file = "yarl-1.16.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:3d375a19ba2bfe320b6d873f3fb165313b002cef8b7cc0a368ad8b8a57453837"}, + {file = "yarl-1.16.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:62c7da0ad93a07da048b500514ca47b759459ec41924143e2ddb5d7e20fd3db5"}, + {file = "yarl-1.16.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:147b0fcd0ee33b4b5f6edfea80452d80e419e51b9a3f7a96ce98eaee145c1581"}, + {file = "yarl-1.16.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:504e1fe1cc4f170195320eb033d2b0ccf5c6114ce5bf2f617535c01699479bca"}, + {file = "yarl-1.16.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:bdcf667a5dec12a48f669e485d70c54189f0639c2157b538a4cffd24a853624f"}, + {file = "yarl-1.16.0-cp39-cp39-win32.whl", hash = "sha256:e9951afe6557c75a71045148890052cb942689ee4c9ec29f5436240e1fcc73b7"}, + {file = "yarl-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:7d7aaa8ff95d0840e289423e7dc35696c2b058d635f945bf05b5cd633146b027"}, + {file = "yarl-1.16.0-py3-none-any.whl", hash = "sha256:e6980a558d8461230c457218bd6c92dfc1d10205548215c2c21d79dc8d0a96f3"}, + {file = "yarl-1.16.0.tar.gz", hash = "sha256:b6f687ced5510a9a2474bbae96a4352e5ace5fa34dc44a217b0537fec1db00b4"}, ] [package.dependencies] @@ -4005,4 +4025,4 @@ polymarket = ["py-clob-client"] [metadata] lock-version = "2.0" python-versions = ">=3.11,<3.13" -content-hash = "bb0955a7faad6cfd25e2167e9dc16f1c4325faae0a400e4effc56aba001c188a" +content-hash = "f963ca27e82ba7a4ac6c200f38604b7563eff1567152ac1dfe9137ad4a918842" diff --git a/pyproject.toml b/pyproject.toml index 0d15b8e066ce..c577c50b016a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,7 @@ include = [ [build-system] requires = [ "setuptools", - "poetry-core>=1.9.0", + "poetry-core>=1.9.1", "numpy>=1.26.4", "Cython==3.0.11", ] @@ -60,7 +60,7 @@ pandas = "^2.2.3" pyarrow = ">=17.0.0" pytz = ">=2024.2.0" tqdm = "^4.66.5" -uvloop = {version = "^0.20.0", markers = "sys_platform != 'win32'"} +uvloop = {version = "^0.21.0", markers = "sys_platform != 'win32'"} async-timeout = {version = "^4.0.3", optional = true} betfair_parser = {version = "==0.13.0", optional = true} # Pinned for stability From 70f1b92f14a64be6e7eb30f6e5c396c199e2776b Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 22 Oct 2024 14:18:37 +1100 Subject: [PATCH 223/224] Update release notes --- RELEASES.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index 969cd7a36e55..d4a5f751f50e 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,9 +1,9 @@ # NautilusTrader 1.204.0 Beta -Released on TBD (UTC). +Released on 22nd October 2024 (UTC). ### Enhancements -- Added `TardisCSVDataLoader` for loading data from Tardis format CSV files as either legacy Cython or pyo3 objects +- Added `TardisCSVDataLoader` for loading data from Tardis format CSV files as either legacy Cython or PyO3 objects - Added `Clock.timestamp_us()` method for UNIX timestamps in microseconds (μs) - Added support for `bbo-1s` and `bbo-1m` quote schemas for Databento adapter (#1990), thanks @faysou - Added validation for venue `book_type` configuration vs data (prevents an issue where top-of-book data is used when order book data is expected) @@ -547,7 +547,7 @@ Released on 15th March 2024 (UTC). ### Enhancements - Implemented Binance order book snapshot rebuilds on websocket reconnect (see integration guide) - Added additional validations for `OrderMatchingEngine` (will now raise a `RuntimeError` when a price or size precision for `OrderFilled` does not match the instruments precisions) -- Added `LoggingConfig.use_pyo3` config option for pyo3 based logging initialization (worse performance but allows visibility into logs originating from Rust) +- Added `LoggingConfig.use_pyo3` config option for PyO3 based logging initialization (worse performance but allows visibility into logs originating from Rust) - Added `exchange` field to `FuturesContract`, `FuturesSpread`, `OptionsContract` and `OptionsSpread` (optional) ### Breaking Changes @@ -592,7 +592,7 @@ Released on 25th February 2024 (UTC). ### Fixes - Fixed `TradeId` memory leak due assigning unique values to the `Ustr` global string cache (which are never freed for the lifetime of the program) -- Fixed `TradeTick` size precision for pyo3 conversion (size precision was incorrectly price precision) +- Fixed `TradeTick` size precision for PyO3 conversion (size precision was incorrectly price precision) - Fixed `RiskEngine` cash value check when selling (would previously divide quantity by price which is too much), thanks for reporting @AnthonyVince - Fixed FOK time in force behavior (allows fills beyond the top level, will cancel if cannot fill full size) - Fixed IOC time in force behavior (allows fills beyond the top level, will cancel any remaining after all fills are applied) @@ -1286,7 +1286,7 @@ Released on 28th January 2023 (UTC). - Renamed `BookOrder.id` to `order_id` ### Enhancements -- Introduced Rust pyo3 based `ParquetReader` and `ParquetWriter`, thanks @twitu +- Introduced Rust PyO3 based `ParquetReader` and `ParquetWriter`, thanks @twitu - Added `msgbus.is_subscribed` (to check if topic and handler already subscribed) - Simplified message type model and introduce CQRS-ish live messaging architecture From 54c02bf66a4ffc86c47127c99454536a2a11d505 Mon Sep 17 00:00:00 2001 From: Chris Sellers Date: Tue, 22 Oct 2024 17:27:48 +1100 Subject: [PATCH 224/224] Cleanup order events --- nautilus_core/model/src/events/order/cancel_rejected.rs | 2 +- nautilus_core/model/src/events/order/canceled.rs | 2 +- nautilus_core/model/src/events/order/released.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nautilus_core/model/src/events/order/cancel_rejected.rs b/nautilus_core/model/src/events/order/cancel_rejected.rs index 7f4b33604dfd..ebd150c7e0b9 100644 --- a/nautilus_core/model/src/events/order/cancel_rejected.rs +++ b/nautilus_core/model/src/events/order/cancel_rejected.rs @@ -282,7 +282,7 @@ impl OrderEvent for OrderCancelRejected { } fn commission(&self) -> Option { - todo!() + None } fn ts_event(&self) -> UnixNanos { diff --git a/nautilus_core/model/src/events/order/canceled.rs b/nautilus_core/model/src/events/order/canceled.rs index fc0d737009c2..abb77536a292 100644 --- a/nautilus_core/model/src/events/order/canceled.rs +++ b/nautilus_core/model/src/events/order/canceled.rs @@ -152,7 +152,7 @@ impl OrderEvent for OrderCanceled { } fn currency(&self) -> Option { - todo!() + None } fn client_order_id(&self) -> ClientOrderId { diff --git a/nautilus_core/model/src/events/order/released.rs b/nautilus_core/model/src/events/order/released.rs index 64b9a5c40e3f..b2f62f92b6ec 100644 --- a/nautilus_core/model/src/events/order/released.rs +++ b/nautilus_core/model/src/events/order/released.rs @@ -161,7 +161,7 @@ impl OrderEvent for OrderReleased { } fn liquidity_side(&self) -> Option { - todo!() + None } fn post_only(&self) -> Option {